aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2017-02-24 11:57:27 +0100
committerFelix Fietkau <nbd@nbd.name>2017-02-24 12:22:29 +0100
commit703515f889124248480f39d65f8704548cbf1c09 (patch)
treecd06f11ec2cc4e6ddb75c8982ecaab9882d3a9ed /package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch
parentd27dd6298b0f9a66199758b32ce19c0932ef2ee0 (diff)
downloadupstream-703515f889124248480f39d65f8704548cbf1c09.tar.gz
upstream-703515f889124248480f39d65f8704548cbf1c09.tar.bz2
upstream-703515f889124248480f39d65f8704548cbf1c09.zip
mac80211: sync with master branch as of 9edff13abd97
Includes the following changes: 9edff13abd mac80211: disable potentially harmful PS software retry for A-MPDU sessions 75216a76b0 mac80211: backport upstream fix for CSA in IBSS mode 368cc8ef47 mac80211: update brcmfmac backporting brcmf_err cleanups 66a63d25c4 mac80211: fix build on linux 3.18 9eacb9d7fc rt2x00: mt7620: lots of improvements fd94fa61a7 mac80211: brcmfmac: update Raspberry Pi patches for linux 4.9 649e766a64 mac80211: update to wireless-testing 2017-01-31 47540afa5d ath9k: add a warning to the tx99 config option b367eef21d mac80211: rt2x00: add support for external LNA on MT7620 9200e168f2 mac80211: move (& update) upstream accepted brcmfmac patches Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch')
-rw-r--r--package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch175
1 files changed, 175 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch b/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch
new file mode 100644
index 0000000000..5465df3ccf
--- /dev/null
+++ b/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch
@@ -0,0 +1,175 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Wed, 25 Jan 2017 12:57:05 +0100
+Subject: [PATCH] ath9k: rename tx_complete_work to hw_check_work
+
+Also include common MAC alive check. This should make the hang checks
+more reliable for modes where beacons are not sent and is used as a
+starting point for further hang check improvements
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/ath9k.h
++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+@@ -108,7 +108,7 @@ int ath_descdma_setup(struct ath_softc *
+ #define ATH_AGGR_MIN_QDEPTH 2
+ /* minimum h/w qdepth for non-aggregated traffic */
+ #define ATH_NON_AGGR_MIN_QDEPTH 8
+-#define ATH_TX_COMPLETE_POLL_INT 1000
++#define ATH_HW_CHECK_POLL_INT 1000
+ #define ATH_TXFIFO_DEPTH 8
+ #define ATH_TX_ERROR 0x01
+
+@@ -745,7 +745,7 @@ void ath9k_csa_update(struct ath_softc *
+ #define ATH_PAPRD_TIMEOUT 100 /* msecs */
+ #define ATH_PLL_WORK_INTERVAL 100
+
+-void ath_tx_complete_poll_work(struct work_struct *work);
++void ath_hw_check_work(struct work_struct *work);
+ void ath_reset_work(struct work_struct *work);
+ bool ath_hw_check(struct ath_softc *sc);
+ void ath_hw_pll_work(struct work_struct *work);
+@@ -1053,7 +1053,7 @@ struct ath_softc {
+ #ifdef CPTCFG_ATH9K_DEBUGFS
+ struct ath9k_debug debug;
+ #endif
+- struct delayed_work tx_complete_work;
++ struct delayed_work hw_check_work;
+ struct delayed_work hw_pll_work;
+ struct timer_list sleep_timer;
+
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -681,6 +681,7 @@ static int ath9k_init_softc(u16 devid, s
+ INIT_WORK(&sc->hw_reset_work, ath_reset_work);
+ INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
+ INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
++ INIT_DELAYED_WORK(&sc->hw_check_work, ath_hw_check_work);
+
+ ath9k_init_channel_context(sc);
+
+--- a/drivers/net/wireless/ath/ath9k/link.c
++++ b/drivers/net/wireless/ath/ath9k/link.c
+@@ -20,20 +20,13 @@
+ * TX polling - checks if the TX engine is stuck somewhere
+ * and issues a chip reset if so.
+ */
+-void ath_tx_complete_poll_work(struct work_struct *work)
++static bool ath_tx_complete_check(struct ath_softc *sc)
+ {
+- struct ath_softc *sc = container_of(work, struct ath_softc,
+- tx_complete_work.work);
+ struct ath_txq *txq;
+ int i;
+- bool needreset = false;
+-
+
+- if (sc->tx99_state) {
+- ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
+- "skip tx hung detection on tx99\n");
+- return;
+- }
++ if (sc->tx99_state)
++ return true;
+
+ for (i = 0; i < IEEE80211_NUM_ACS; i++) {
+ txq = sc->tx.txq_map[i];
+@@ -41,25 +34,36 @@ void ath_tx_complete_poll_work(struct wo
+ ath_txq_lock(sc, txq);
+ if (txq->axq_depth) {
+ if (txq->axq_tx_inprogress) {
+- needreset = true;
+ ath_txq_unlock(sc, txq);
+- break;
+- } else {
+- txq->axq_tx_inprogress = true;
++ goto reset;
+ }
++
++ txq->axq_tx_inprogress = true;
+ }
+ ath_txq_unlock(sc, txq);
+ }
+
+- if (needreset) {
+- ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
+- "tx hung, resetting the chip\n");
+- ath9k_queue_reset(sc, RESET_TYPE_TX_HANG);
++ return true;
++
++reset:
++ ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
++ "tx hung, resetting the chip\n");
++ ath9k_queue_reset(sc, RESET_TYPE_TX_HANG);
++ return false;
++
++}
++
++void ath_hw_check_work(struct work_struct *work)
++{
++ struct ath_softc *sc = container_of(work, struct ath_softc,
++ hw_check_work.work);
++
++ if (!ath_hw_check(sc) ||
++ !ath_tx_complete_check(sc))
+ return;
+- }
+
+- ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work,
+- msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT));
++ ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work,
++ msecs_to_jiffies(ATH_HW_CHECK_POLL_INT));
+ }
+
+ /*
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -181,7 +181,7 @@ void ath9k_ps_restore(struct ath_softc *
+ static void __ath_cancel_work(struct ath_softc *sc)
+ {
+ cancel_work_sync(&sc->paprd_work);
+- cancel_delayed_work_sync(&sc->tx_complete_work);
++ cancel_delayed_work_sync(&sc->hw_check_work);
+ cancel_delayed_work_sync(&sc->hw_pll_work);
+
+ #ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT
+@@ -198,7 +198,8 @@ void ath_cancel_work(struct ath_softc *s
+
+ void ath_restart_work(struct ath_softc *sc)
+ {
+- ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
++ ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work,
++ ATH_HW_CHECK_POLL_INT);
+
+ if (AR_SREV_9340(sc->sc_ah) || AR_SREV_9330(sc->sc_ah))
+ ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work,
+@@ -2091,7 +2092,7 @@ void __ath9k_flush(struct ieee80211_hw *
+ int timeout;
+ bool drain_txq;
+
+- cancel_delayed_work_sync(&sc->tx_complete_work);
++ cancel_delayed_work_sync(&sc->hw_check_work);
+
+ if (ah->ah_flags & AH_UNPLUGGED) {
+ ath_dbg(common, ANY, "Device has been unplugged!\n");
+@@ -2129,7 +2130,8 @@ void __ath9k_flush(struct ieee80211_hw *
+ ath9k_ps_restore(sc);
+ }
+
+- ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0);
++ ieee80211_queue_delayed_work(hw, &sc->hw_check_work,
++ ATH_HW_CHECK_POLL_INT);
+ }
+
+ static bool ath9k_tx_frames_pending(struct ieee80211_hw *hw)
+--- a/drivers/net/wireless/ath/ath9k/xmit.c
++++ b/drivers/net/wireless/ath/ath9k/xmit.c
+@@ -2916,8 +2916,6 @@ int ath_tx_init(struct ath_softc *sc, in
+ return error;
+ }
+
+- INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work);
+-
+ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
+ error = ath_tx_edma_init(sc);
+