From 7ed6b61a06e919cb19c92220b5f339dc2716eb39 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 25 Feb 2013 19:53:31 +0000 Subject: [PATCH] ath9k: issue a cold reset after failures or after bringing the chip out of full sleep - fixes many kinds of DMA issues git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35785 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/mac80211/patches/300-pending_work.patch | 13 +++++++++++++ .../patches/510-ath9k_intr_mitigation_tweak.patch | 2 +- .../524-ath9k_use_configured_antenna_gain.patch | 2 +- .../mac80211/patches/553-ath9k_debugfs_diag.patch | 4 ++-- ...k-allow-to-disable-bands-via-platform-data.patch | 2 +- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index 11c9a5af4d..51da3cf84d 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -499,3 +499,16 @@ ret = 0; } 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; diff --git a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch index 6e2af403ef..ff6ff27a1f 100644 --- a/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch +++ b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch @@ -1,6 +1,6 @@ --- a/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); if (ah->config.rx_intr_mitigation) { diff --git a/package/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch b/package/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch index 775bdac641..fe05212159 100644 --- a/package/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch +++ b/package/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch @@ -10,7 +10,7 @@ --- a/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; chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER); new_pwr = min_t(int, chan_pwr, reg->power_limit); diff --git a/package/mac80211/patches/553-ath9k_debugfs_diag.patch b/package/mac80211/patches/553-ath9k_debugfs_diag.patch index fcc7dab591..915f30f789 100644 --- a/package/mac80211/patches/553-ath9k_debugfs_diag.patch +++ b/package/mac80211/patches/553-ath9k_debugfs_diag.patch @@ -94,7 +94,7 @@ void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause); --- a/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; } @@ -115,7 +115,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, 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); diff --git a/package/mac80211/patches/555-ath9k-allow-to-disable-bands-via-platform-data.patch b/package/mac80211/patches/555-ath9k-allow-to-disable-bands-via-platform-data.patch index bdb4ba0ff0..515bb8f839 100644 --- a/package/mac80211/patches/555-ath9k-allow-to-disable-bands-via-platform-data.patch +++ b/package/mac80211/patches/555-ath9k-allow-to-disable-bands-via-platform-data.patch @@ -12,7 +12,7 @@ --- a/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);