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: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
028118a5f0
commit
98a3b2fe43
@@ -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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user