| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- --- a/drivers/net/wireless/ath/ath9k/hw.c
- +++ b/drivers/net/wireless/ath/ath9k/hw.c
- @@ -1125,6 +1125,34 @@ static bool ath9k_hw_channel_change(stru
- return true;
- }
-
- +bool ath9k_hw_check_alive(struct ath_hw *ah)
- +{
- + int count = 50;
- + u32 reg;
- +
- + if (AR_SREV_9285_10_OR_LATER(ah))
- + return true;
- +
- + do {
- + reg = REG_READ(ah, AR_OBS_BUS_1);
- +
- + if ((reg & 0x7E7FFFEF) != 0x00702400)
- + return true;
- +
- + switch (reg & 0x7E000B00) {
- + case 0x1E000000:
- + case 0x52000B00:
- + case 0x18000B00:
- + continue;
- + default:
- + return true;
- + }
- + } while (count-- > 0);
- +
- + return false;
- +}
- +EXPORT_SYMBOL(ath9k_hw_check_alive);
- +
- int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
- bool bChannelChange)
- {
- --- a/drivers/net/wireless/ath/ath9k/hw.h
- +++ b/drivers/net/wireless/ath/ath9k/hw.h
- @@ -847,6 +847,7 @@ void ath9k_hw_set11nmac2040(struct ath_h
- void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period);
- void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
- const struct ath9k_beacon_state *bs);
- +bool ath9k_hw_check_alive(struct ath_hw *ah);
-
- bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
-
- --- a/drivers/net/wireless/ath/ath9k/main.c
- +++ b/drivers/net/wireless/ath/ath9k/main.c
- @@ -406,7 +406,8 @@ void ath9k_tasklet(unsigned long data)
-
- ath9k_ps_wakeup(sc);
-
- - if (status & ATH9K_INT_FATAL) {
- + if ((status & ATH9K_INT_FATAL) ||
- + !ath9k_hw_check_alive(ah)) {
- ath_reset(sc, false);
- ath9k_ps_restore(sc);
- return;
|