--- drivers/net/wireless/bcm43xx/bcm43xx_main.c.orig 2006-09-17 15:17:16.000000000 +0900 +++ drivers/net/wireless/bcm43xx/bcm43xx_main.c 2006-10-17 21:19:18.000000000 +0900 @@ -2280,23 +2280,29 @@ bcm43xx_power_saving_ctl_bits(bcm, -1, -1); } +int mac_suspend_failed_flag = 0; + /* http://bcm-specs.sipsolutions.net/SuspendMAC */ void bcm43xx_mac_suspend(struct bcm43xx_private *bcm) { int i; + int j = mac_suspend_failed_flag; u32 tmp; + mac_suspend_failed_flag = 0; bcm43xx_power_saving_ctl_bits(bcm, -1, 1); bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD) & ~BCM43xx_SBF_MAC_ENABLED); bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */ - for (i = 100000; i; i--) { + for (i = j ? 10 : 100000; i; i--) { tmp = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); if (tmp & BCM43xx_IRQ_READY) return; udelay(10); } + mac_suspend_failed_flag = 1; + if (j) printkl(KERN_ERR PFX "MAC suspend failed (short wait)\n"); else printkl(KERN_ERR PFX "MAC suspend failed\n"); } @@ -3078,6 +3084,10 @@ struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); + if (mac_suspend_failed_flag) { + bcm43xx_mac_suspend(bcm); + bcm43xx_mac_enable(bcm); + } if (phy->type == BCM43xx_PHYTYPE_G) { //TODO: update_aci_moving_average if (radio->aci_enable && radio->aci_wlan_automatic) {