|
@@ -84,11 +84,13 @@ static u32 ath9k_hw_mac_to_clks(struct ath_hw *ah, u32 usecs)
|
|
return ath9k_hw_mac_clks(ah, usecs);
|
|
return ath9k_hw_mac_clks(ah, usecs);
|
|
}
|
|
}
|
|
|
|
|
|
-bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val)
|
|
|
|
|
|
+bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < (AH_TIMEOUT / AH_TIME_QUANTUM); i++) {
|
|
|
|
|
|
+ BUG_ON(timeout < AH_TIME_QUANTUM);
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < (timeout / AH_TIME_QUANTUM); i++) {
|
|
if ((REG_READ(ah, reg) & mask) == val)
|
|
if ((REG_READ(ah, reg) & mask) == val)
|
|
return true;
|
|
return true;
|
|
|
|
|
|
@@ -96,8 +98,8 @@ bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val)
|
|
}
|
|
}
|
|
|
|
|
|
DPRINTF(ah->ah_sc, ATH_DBG_REG_IO,
|
|
DPRINTF(ah->ah_sc, ATH_DBG_REG_IO,
|
|
- "timeout on reg 0x%x: 0x%08x & 0x%08x != 0x%08x\n",
|
|
|
|
- reg, REG_READ(ah, reg), mask, val);
|
|
|
|
|
|
+ "timeout (%d us) on reg 0x%x: 0x%08x & 0x%08x != 0x%08x\n",
|
|
|
|
+ timeout, reg, REG_READ(ah, reg), mask, val);
|
|
|
|
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
@@ -1516,7 +1518,7 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
|
|
udelay(50);
|
|
udelay(50);
|
|
|
|
|
|
REG_WRITE(ah, AR_RTC_RC, 0);
|
|
REG_WRITE(ah, AR_RTC_RC, 0);
|
|
- if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0)) {
|
|
|
|
|
|
+ if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0, AH_WAIT_TIMEOUT)) {
|
|
DPRINTF(ah->ah_sc, ATH_DBG_RESET,
|
|
DPRINTF(ah->ah_sc, ATH_DBG_RESET,
|
|
"RTC stuck in MAC reset\n");
|
|
"RTC stuck in MAC reset\n");
|
|
return false;
|
|
return false;
|
|
@@ -1545,7 +1547,8 @@ static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)
|
|
if (!ath9k_hw_wait(ah,
|
|
if (!ath9k_hw_wait(ah,
|
|
AR_RTC_STATUS,
|
|
AR_RTC_STATUS,
|
|
AR_RTC_STATUS_M,
|
|
AR_RTC_STATUS_M,
|
|
- AR_RTC_STATUS_ON)) {
|
|
|
|
|
|
+ AR_RTC_STATUS_ON,
|
|
|
|
+ AH_WAIT_TIMEOUT)) {
|
|
DPRINTF(ah->ah_sc, ATH_DBG_RESET, "RTC not waking up\n");
|
|
DPRINTF(ah->ah_sc, ATH_DBG_RESET, "RTC not waking up\n");
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
@@ -1640,7 +1643,7 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,
|
|
|
|
|
|
REG_WRITE(ah, AR_PHY_RFBUS_REQ, AR_PHY_RFBUS_REQ_EN);
|
|
REG_WRITE(ah, AR_PHY_RFBUS_REQ, AR_PHY_RFBUS_REQ_EN);
|
|
if (!ath9k_hw_wait(ah, AR_PHY_RFBUS_GRANT, AR_PHY_RFBUS_GRANT_EN,
|
|
if (!ath9k_hw_wait(ah, AR_PHY_RFBUS_GRANT, AR_PHY_RFBUS_GRANT_EN,
|
|
- AR_PHY_RFBUS_GRANT_EN)) {
|
|
|
|
|
|
+ AR_PHY_RFBUS_GRANT_EN, AH_WAIT_TIMEOUT)) {
|
|
DPRINTF(ah->ah_sc, ATH_DBG_REG_IO,
|
|
DPRINTF(ah->ah_sc, ATH_DBG_REG_IO,
|
|
"Could not kill baseband RX\n");
|
|
"Could not kill baseband RX\n");
|
|
return false;
|
|
return false;
|