[PATCH] bcm43xx: Drain TX status before starting IRQs

Drain the Microcode TX-status-FIFO before we enable IRQs.
This is required, because the FIFO may still have entries left
from a previous run. Those would immediately fire after enabling
IRQs and would lead to an oops in the DMA TXstatus handling code.

Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by Michael Buesch and committed by John W. Linville ecac598b edd106fc

+18
+18
drivers/net/wireless/bcm43xx/bcm43xx_main.c
··· 1463 } 1464 } 1465 1466 static void bcm43xx_generate_noise_sample(struct bcm43xx_private *bcm) 1467 { 1468 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x408, 0x7F7F); ··· 3549 bcm43xx_macfilter_clear(bcm, BCM43xx_MACFILTER_ASSOC); 3550 bcm43xx_macfilter_set(bcm, BCM43xx_MACFILTER_SELF, (u8 *)(bcm->net_dev->dev_addr)); 3551 bcm43xx_security_init(bcm); 3552 ieee80211softmac_start(bcm->net_dev); 3553 3554 /* Let's go! Be careful after enabling the IRQs.
··· 1463 } 1464 } 1465 1466 + static void drain_txstatus_queue(struct bcm43xx_private *bcm) 1467 + { 1468 + u32 dummy; 1469 + 1470 + if (bcm->current_core->rev < 5) 1471 + return; 1472 + /* Read all entries from the microcode TXstatus FIFO 1473 + * and throw them away. 1474 + */ 1475 + while (1) { 1476 + dummy = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_0); 1477 + if (!dummy) 1478 + break; 1479 + dummy = bcm43xx_read32(bcm, BCM43xx_MMIO_XMITSTAT_1); 1480 + } 1481 + } 1482 + 1483 static void bcm43xx_generate_noise_sample(struct bcm43xx_private *bcm) 1484 { 1485 bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x408, 0x7F7F); ··· 3532 bcm43xx_macfilter_clear(bcm, BCM43xx_MACFILTER_ASSOC); 3533 bcm43xx_macfilter_set(bcm, BCM43xx_MACFILTER_SELF, (u8 *)(bcm->net_dev->dev_addr)); 3534 bcm43xx_security_init(bcm); 3535 + drain_txstatus_queue(bcm); 3536 ieee80211softmac_start(bcm->net_dev); 3537 3538 /* Let's go! Be careful after enabling the IRQs.