Commit 98a3b2fe authored by Michael Buesch's avatar Michael Buesch Committed by John W. Linville

b43: Fix noise calculation WARN_ON

This removes a WARN_ON that is responsible for the following koops:
http://www.kerneloops.org/searchweek.php?search=b43_generate_noise_sample

The comment in the patch describes why it's safe to simply remove
the check.
Signed-off-by: default avatarMichael Buesch <mb@bu3sch.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 028118a5
...@@ -630,7 +630,6 @@ struct b43_pio { ...@@ -630,7 +630,6 @@ struct b43_pio {
/* Context information for a noise calculation (Link Quality). */ /* Context information for a noise calculation (Link Quality). */
struct b43_noise_calculation { struct b43_noise_calculation {
u8 channel_at_start;
bool calculation_running; bool calculation_running;
u8 nr_samples; u8 nr_samples;
s8 samples[8][4]; s8 samples[8][4];
......
...@@ -1145,7 +1145,6 @@ static void b43_generate_noise_sample(struct b43_wldev *dev) ...@@ -1145,7 +1145,6 @@ static void b43_generate_noise_sample(struct b43_wldev *dev)
b43_jssi_write(dev, 0x7F7F7F7F); b43_jssi_write(dev, 0x7F7F7F7F);
b43_write32(dev, B43_MMIO_MACCMD, b43_write32(dev, B43_MMIO_MACCMD,
b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE);
B43_WARN_ON(dev->noisecalc.channel_at_start != dev->phy.channel);
} }
static void b43_calculate_link_quality(struct b43_wldev *dev) static void b43_calculate_link_quality(struct b43_wldev *dev)
...@@ -1154,7 +1153,6 @@ static void b43_calculate_link_quality(struct b43_wldev *dev) ...@@ -1154,7 +1153,6 @@ static void b43_calculate_link_quality(struct b43_wldev *dev)
if (dev->noisecalc.calculation_running) if (dev->noisecalc.calculation_running)
return; return;
dev->noisecalc.channel_at_start = dev->phy.channel;
dev->noisecalc.calculation_running = 1; dev->noisecalc.calculation_running = 1;
dev->noisecalc.nr_samples = 0; dev->noisecalc.nr_samples = 0;
...@@ -1171,9 +1169,16 @@ static void handle_irq_noise(struct b43_wldev *dev) ...@@ -1171,9 +1169,16 @@ static void handle_irq_noise(struct b43_wldev *dev)
/* Bottom half of Link Quality calculation. */ /* Bottom half of Link Quality calculation. */
/* Possible race condition: It might be possible that the user
* changed to a different channel in the meantime since we
* started the calculation. We ignore that fact, since it's
* not really that much of a problem. The background noise is
* an estimation only anyway. Slightly wrong results will get damped
* by the averaging of the 8 sample rounds. Additionally the
* value is shortlived. So it will be replaced by the next noise
* calculation round soon. */
B43_WARN_ON(!dev->noisecalc.calculation_running); B43_WARN_ON(!dev->noisecalc.calculation_running);
if (dev->noisecalc.channel_at_start != phy->channel)
goto drop_calculation;
*((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev));
if (noise[0] == 0x7F || noise[1] == 0x7F || if (noise[0] == 0x7F || noise[1] == 0x7F ||
noise[2] == 0x7F || noise[3] == 0x7F) noise[2] == 0x7F || noise[3] == 0x7F)
...@@ -1214,11 +1219,10 @@ static void handle_irq_noise(struct b43_wldev *dev) ...@@ -1214,11 +1219,10 @@ static void handle_irq_noise(struct b43_wldev *dev)
average -= 48; average -= 48;
dev->stats.link_noise = average; dev->stats.link_noise = average;
drop_calculation:
dev->noisecalc.calculation_running = 0; dev->noisecalc.calculation_running = 0;
return; return;
} }
generate_new: generate_new:
b43_generate_noise_sample(dev); b43_generate_noise_sample(dev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment