ath9k: issue a cold reset after failures or after bringing the chip out of full sleep - fixes many kinds of DMA issues
SVN-Revision: 35785
This commit is contained in:
parent
0f2fc0adfd
commit
f1bde82f00
5 changed files with 18 additions and 5 deletions
|
@ -499,3 +499,16 @@
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
|
@@ -1463,7 +1463,9 @@ static bool ath9k_hw_chip_reset(struct a
|
||||||
|
reset_type = ATH9K_RESET_POWER_ON;
|
||||||
|
else
|
||||||
|
reset_type = ATH9K_RESET_COLD;
|
||||||
|
- }
|
||||||
|
+ } else if (ah->chip_fullsleep || REG_READ(ah, AR_Q_TXE) ||
|
||||||
|
+ (REG_READ(ah, AR_CR) & AR_CR_RXE))
|
||||||
|
+ reset_type = ATH9K_RESET_COLD;
|
||||||
|
|
||||||
|
if (!ath9k_hw_set_reset_reg(ah, reset_type))
|
||||||
|
return false;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
@@ -1945,8 +1945,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
@@ -1947,8 +1947,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||||
REG_WRITE(ah, AR_OBS, 8);
|
REG_WRITE(ah, AR_OBS, 8);
|
||||||
|
|
||||||
if (ah->config.rx_intr_mitigation) {
|
if (ah->config.rx_intr_mitigation) {
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
@@ -2816,7 +2816,7 @@ void ath9k_hw_apply_txpower(struct ath_h
|
@@ -2818,7 +2818,7 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||||
channel = chan->chan;
|
channel = chan->chan;
|
||||||
chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
|
chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
|
||||||
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||||||
|
|
|
@ -94,7 +94,7 @@
|
||||||
void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause);
|
void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause);
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
@@ -1745,6 +1745,20 @@ fail:
|
@@ -1747,6 +1747,20 @@ fail:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@
|
||||||
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||||
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
||||||
{
|
{
|
||||||
@@ -2022,6 +2036,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
@@ -2024,6 +2038,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||||
}
|
}
|
||||||
|
|
||||||
ath9k_hw_apply_gpio_override(ah);
|
ath9k_hw_apply_gpio_override(ah);
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||||
@@ -2412,17 +2412,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
|
@@ -2414,17 +2414,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
|
||||||
}
|
}
|
||||||
|
|
||||||
eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
|
eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
|
||||||
|
|
Loading…
Reference in a new issue