b43: Do radio lock assertion in software
authorMichael Buesch <mb@bu3sch.de>
Tue, 31 Mar 2009 10:27:32 +0000 (12:27 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 16 Apr 2009 14:39:14 +0000 (10:39 -0400)
The assertion of the lock-bit in the hardware register is unreliable,
because there are devices with quirks that will randomly set the bit.

Do the assertion in software, only.

Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/b43/main.c
drivers/net/wireless/b43/phy_common.c
drivers/net/wireless/b43/phy_common.h

index 4896e083111458b17b66601f85c4b6cd3f1afea0..79b685e300c7bff2a2221d882a260066d9fdd34e 100644 (file)
@@ -3974,6 +3974,11 @@ static void setup_struct_phy_for_init(struct b43_wldev *dev,
        phy->next_txpwr_check_time = jiffies;
        /* PHY TX errors counter. */
        atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT);
+
+#if B43_DEBUG
+       phy->phy_locked = 0;
+       phy->radio_locked = 0;
+#endif
 }
 
 static void setup_struct_wldev_for_init(struct b43_wldev *dev)
index 026b61c03fb9fb4432492bc8ddad32a617d72b6a..e176b6e0d9cf08f26dae49baa5b0d729ad13db1d 100644 (file)
@@ -131,12 +131,16 @@ void b43_radio_lock(struct b43_wldev *dev)
 {
        u32 macctl;
 
+#if B43_DEBUG
+       B43_WARN_ON(dev->phy.radio_locked);
+       dev->phy.radio_locked = 1;
+#endif
+
        macctl = b43_read32(dev, B43_MMIO_MACCTL);
-       B43_WARN_ON(macctl & B43_MACCTL_RADIOLOCK);
        macctl |= B43_MACCTL_RADIOLOCK;
        b43_write32(dev, B43_MMIO_MACCTL, macctl);
-       /* Commit the write and wait for the device
-        * to exit any radio register access. */
+       /* Commit the write and wait for the firmware
+        * to finish any radio register access. */
        b43_read32(dev, B43_MMIO_MACCTL);
        udelay(10);
 }
@@ -145,11 +149,15 @@ void b43_radio_unlock(struct b43_wldev *dev)
 {
        u32 macctl;
 
+#if B43_DEBUG
+       B43_WARN_ON(!dev->phy.radio_locked);
+       dev->phy.radio_locked = 0;
+#endif
+
        /* Commit any write */
        b43_read16(dev, B43_MMIO_PHY_VER);
        /* unlock */
        macctl = b43_read32(dev, B43_MMIO_MACCTL);
-       B43_WARN_ON(!(macctl & B43_MACCTL_RADIOLOCK));
        macctl &= ~B43_MACCTL_RADIOLOCK;
        b43_write32(dev, B43_MMIO_MACCTL, macctl);
 }
index c9f5430d1d7d2aa620252aebba09392ae0876d40..b2d99101947be7062d31ecaffbbea4a3b7af9b5a 100644 (file)
@@ -245,8 +245,10 @@ struct b43_phy {
        atomic_t txerr_cnt;
 
 #ifdef CONFIG_B43_DEBUG
-       /* PHY registers locked by b43_phy_lock()? */
+       /* PHY registers locked (w.r.t. firmware) */
        bool phy_locked;
+       /* Radio registers locked (w.r.t. firmware) */
+       bool radio_locked;
 #endif /* B43_DEBUG */
 };