diff options
Diffstat (limited to 'package/kernel/mac80211/patches/330-ath9k-restart-hardware-after-noise-floor-calibration.patch')
-rw-r--r-- | package/kernel/mac80211/patches/330-ath9k-restart-hardware-after-noise-floor-calibration.patch | 185 |
1 files changed, 0 insertions, 185 deletions
diff --git a/package/kernel/mac80211/patches/330-ath9k-restart-hardware-after-noise-floor-calibration.patch b/package/kernel/mac80211/patches/330-ath9k-restart-hardware-after-noise-floor-calibration.patch deleted file mode 100644 index 6a27be76bd..0000000000 --- a/package/kernel/mac80211/patches/330-ath9k-restart-hardware-after-noise-floor-calibration.patch +++ /dev/null @@ -1,185 +0,0 @@ -From: Felix Fietkau <nbd@openwrt.org> -Date: Sat, 18 Oct 2014 13:37:32 +0200 -Subject: [PATCH] ath9k: restart hardware after noise floor calibration - failure - -When NF calibration fails, the radio often becomes deaf. The usual -hardware hang checks do not detect this, so it's better to issue a reset -when that happens. - -Signed-off-by: Felix Fietkau <nbd@openwrt.org> ---- - ---- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c -+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c -@@ -657,14 +657,13 @@ static void ar9002_hw_olc_temp_compensat - ar9280_hw_olc_temp_compensation(ah); - } - --static bool ar9002_hw_calibrate(struct ath_hw *ah, -- struct ath9k_channel *chan, -- u8 rxchainmask, -- bool longcal) -+static int ar9002_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan, -+ u8 rxchainmask, bool longcal) - { - bool iscaldone = true; - struct ath9k_cal_list *currCal = ah->cal_list_curr; - bool nfcal, nfcal_pending = false; -+ int ret; - - nfcal = !!(REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF); - if (ah->caldata) -@@ -698,7 +697,9 @@ static bool ar9002_hw_calibrate(struct a - * NF is slow time-variant, so it is OK to use a - * historical value. - */ -- ath9k_hw_loadnf(ah, ah->curchan); -+ ret = ath9k_hw_loadnf(ah, ah->curchan); -+ if (ret < 0) -+ return ret; - } - - if (longcal) { ---- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c -+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c -@@ -121,13 +121,12 @@ static bool ar9003_hw_per_calibration(st - return iscaldone; - } - --static bool ar9003_hw_calibrate(struct ath_hw *ah, -- struct ath9k_channel *chan, -- u8 rxchainmask, -- bool longcal) -+static int ar9003_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan, -+ u8 rxchainmask, bool longcal) - { - bool iscaldone = true; - struct ath9k_cal_list *currCal = ah->cal_list_curr; -+ int ret; - - /* - * For given calibration: -@@ -163,7 +162,9 @@ static bool ar9003_hw_calibrate(struct a - * NF is slow time-variant, so it is OK to use a historical - * value. - */ -- ath9k_hw_loadnf(ah, ah->curchan); -+ ret = ath9k_hw_loadnf(ah, ah->curchan); -+ if (ret < 0) -+ return ret; - - /* start NF calibration, without updating BB NF register */ - ath9k_hw_start_nfcal(ah, false); ---- a/drivers/net/wireless/ath/ath9k/calib.c -+++ b/drivers/net/wireless/ath/ath9k/calib.c -@@ -234,7 +234,7 @@ void ath9k_hw_start_nfcal(struct ath_hw - REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); - } - --void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) -+int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) - { - struct ath9k_nfcal_hist *h = NULL; - unsigned i, j; -@@ -301,7 +301,7 @@ void ath9k_hw_loadnf(struct ath_hw *ah, - ath_dbg(common, ANY, - "Timeout while waiting for nf to load: AR_PHY_AGC_CONTROL=0x%x\n", - REG_READ(ah, AR_PHY_AGC_CONTROL)); -- return; -+ return -ETIMEDOUT; - } - - /* -@@ -322,6 +322,8 @@ void ath9k_hw_loadnf(struct ath_hw *ah, - } - } - REGWRITE_BUFFER_FLUSH(ah); -+ -+ return 0; - } - - ---- a/drivers/net/wireless/ath/ath9k/calib.h -+++ b/drivers/net/wireless/ath/ath9k/calib.h -@@ -109,7 +109,7 @@ struct ath9k_pacal_info{ - - bool ath9k_hw_reset_calvalid(struct ath_hw *ah); - void ath9k_hw_start_nfcal(struct ath_hw *ah, bool update); --void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan); -+int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan); - bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan); - void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah, - struct ath9k_channel *chan); ---- a/drivers/net/wireless/ath/ath9k/debug.c -+++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -863,6 +863,7 @@ static ssize_t read_file_reset(struct fi - [RESET_TYPE_MAC_HANG] = "MAC Hang", - [RESET_TYPE_BEACON_STUCK] = "Stuck Beacon", - [RESET_TYPE_MCI] = "MCI Reset", -+ [RESET_TYPE_CALIBRATION] = "Calibration error", - }; - char buf[512]; - unsigned int len = 0; ---- a/drivers/net/wireless/ath/ath9k/debug.h -+++ b/drivers/net/wireless/ath/ath9k/debug.h -@@ -49,6 +49,7 @@ enum ath_reset_type { - RESET_TYPE_MAC_HANG, - RESET_TYPE_BEACON_STUCK, - RESET_TYPE_MCI, -+ RESET_TYPE_CALIBRATION, - __RESET_TYPE_MAX - }; - ---- a/drivers/net/wireless/ath/ath9k/hw-ops.h -+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h -@@ -41,10 +41,9 @@ static inline void ath9k_hw_set_desc_lin - ath9k_hw_ops(ah)->set_desc_link(ds, link); - } - --static inline bool ath9k_hw_calibrate(struct ath_hw *ah, -- struct ath9k_channel *chan, -- u8 rxchainmask, -- bool longcal) -+static inline int ath9k_hw_calibrate(struct ath_hw *ah, -+ struct ath9k_channel *chan, -+ u8 rxchainmask, bool longcal) - { - return ath9k_hw_ops(ah)->calibrate(ah, chan, rxchainmask, longcal); - } ---- a/drivers/net/wireless/ath/ath9k/hw.h -+++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -688,10 +688,8 @@ struct ath_hw_ops { - bool power_off); - void (*rx_enable)(struct ath_hw *ah); - void (*set_desc_link)(void *ds, u32 link); -- bool (*calibrate)(struct ath_hw *ah, -- struct ath9k_channel *chan, -- u8 rxchainmask, -- bool longcal); -+ int (*calibrate)(struct ath_hw *ah, struct ath9k_channel *chan, -+ u8 rxchainmask, bool longcal); - bool (*get_isr)(struct ath_hw *ah, enum ath9k_int *masked, - u32 *sync_cause_p); - void (*set_txdesc)(struct ath_hw *ah, void *ds, ---- a/drivers/net/wireless/ath/ath9k/link.c -+++ b/drivers/net/wireless/ath/ath9k/link.c -@@ -371,9 +371,15 @@ void ath_ani_calibrate(unsigned long dat - - /* Perform calibration if necessary */ - if (longcal || shortcal) { -- common->ani.caldone = -- ath9k_hw_calibrate(ah, ah->curchan, -- ah->rxchainmask, longcal); -+ int ret = ath9k_hw_calibrate(ah, ah->curchan, ah->rxchainmask, -+ longcal); -+ if (ret < 0) { -+ common->ani.caldone = 0; -+ ath9k_queue_reset(sc, RESET_TYPE_CALIBRATION); -+ return; -+ } -+ -+ common->ani.caldone = ret; - } - - ath_dbg(common, ANI, |