b43: Do radio lock assertion in software
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>
This commit is contained in:
Родитель
6aabd4c444
Коммит
591f3dc200
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче