diff options
Diffstat (limited to 'package/mac80211')
28 files changed, 396 insertions, 1210 deletions
diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index c78a6cb0a..46293696c 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 -PKG_VERSION:=2011-02-25 +PKG_VERSION:=2011-03-11 PKG_RELEASE:=1 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources -PKG_MD5SUM:=c0242cc152a157902ff60fe05d1773b2 +PKG_MD5SUM:=123b9220fa2b016979b7b3874f349643 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) diff --git a/package/mac80211/patches/030-backport_93c86_eeprom.patch b/package/mac80211/patches/030-backport_93c86_eeprom.patch index 0415e5f1f..30ff85ed0 100644 --- a/package/mac80211/patches/030-backport_93c86_eeprom.patch +++ b/package/mac80211/patches/030-backport_93c86_eeprom.patch @@ -1,8 +1,8 @@ --- a/include/linux/compat-2.6.36.h +++ b/include/linux/compat-2.6.36.h -@@ -102,6 +102,8 @@ int no_printk(const char *s, ...) { retu - #define alloc_workqueue(name, flags, max_active) __create_workqueue(name, flags, max_active, 0) - #endif +@@ -104,6 +104,8 @@ int no_printk(const char *s, ...) { retu + + #define PCI_EEPROM_WIDTH_93C86 8 +#define PCI_EEPROM_WIDTH_93C86 8 + diff --git a/package/mac80211/patches/050-fix_missing_include.patch b/package/mac80211/patches/050-fix_missing_include.patch deleted file mode 100644 index 458ff4d86..000000000 --- a/package/mac80211/patches/050-fix_missing_include.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/compat/compat-2.6.39.c -+++ b/compat/compat-2.6.39.c -@@ -10,6 +10,7 @@ - - #include <linux/compat.h> - #include <linux/tty.h> -+#include <linux/sched.h> - - /* - * Termios Helper Methods diff --git a/package/mac80211/patches/300-ath9k_gpio_settings.patch b/package/mac80211/patches/300-ath9k_gpio_settings.patch index e38b572e5..af2057759 100644 --- a/package/mac80211/patches/300-ath9k_gpio_settings.patch +++ b/package/mac80211/patches/300-ath9k_gpio_settings.patch @@ -1,7 +1,7 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1091,6 +1091,12 @@ int ath9k_init_debug(struct ath_hw *ah) - sc->debug.debugfs_phy, &ah->config.cwm_ignore_extcca)) +@@ -1145,6 +1145,12 @@ int ath9k_init_debug(struct ath_hw *ah) + sc, &fops_regdump)) goto err; + debugfs_create_u32("gpio_mask", S_IRUSR | S_IWUSR, diff --git a/package/mac80211/patches/310-pending_work.patch b/package/mac80211/patches/310-pending_work.patch new file mode 100644 index 000000000..57dcecaf1 --- /dev/null +++ b/package/mac80211/patches/310-pending_work.patch @@ -0,0 +1,366 @@ +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -189,7 +189,6 @@ struct ath_txq { + u32 axq_ampdu_depth; + bool stopped; + bool axq_tx_inprogress; +- bool txq_flush_inprogress; + struct list_head axq_acq; + struct list_head txq_fifo[ATH_TXFIFO_DEPTH]; + struct list_head txq_fifo_pending; +--- a/drivers/net/wireless/ath/ath9k/beacon.c ++++ b/drivers/net/wireless/ath/ath9k/beacon.c +@@ -373,6 +373,7 @@ void ath_beacon_tasklet(unsigned long da + ath_dbg(common, ATH_DBG_BSTUCK, + "missed %u consecutive beacons\n", + sc->beacon.bmisscnt); ++ ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq); + ath9k_hw_bstuck_nfcal(ah); + } else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) { + ath_dbg(common, ATH_DBG_BSTUCK, +@@ -450,16 +451,6 @@ void ath_beacon_tasklet(unsigned long da + sc->beacon.updateslot = OK; + } + if (bfaddr != 0) { +- /* +- * Stop any current dma and put the new frame(s) on the queue. +- * This should never fail since we check above that no frames +- * are still pending on the queue. +- */ +- if (!ath9k_hw_stoptxdma(ah, sc->beacon.beaconq)) { +- ath_err(common, "beacon queue %u did not stop?\n", +- sc->beacon.beaconq); +- } +- + /* NB: cabq traffic should already be queued and primed */ + ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bfaddr); + ath9k_hw_txstart(ah, sc->beacon.beaconq); +@@ -780,7 +771,7 @@ void ath9k_set_beaconing_status(struct a + ah->imask &= ~ATH9K_INT_SWBA; + ath9k_hw_set_interrupts(ah, ah->imask); + tasklet_kill(&sc->bcon_tasklet); +- ath9k_hw_stoptxdma(ah, sc->beacon.beaconq); ++ ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq); + } + ath9k_ps_restore(sc); + } +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -95,9 +95,9 @@ + #define REG_READ_FIELD(_a, _r, _f) \ + (((REG_READ(_a, _r) & _f) >> _f##_S)) + #define REG_SET_BIT(_a, _r, _f) \ +- REG_WRITE(_a, _r, REG_READ(_a, _r) | _f) ++ REG_WRITE(_a, _r, REG_READ(_a, _r) | (_f)) + #define REG_CLR_BIT(_a, _r, _f) \ +- REG_WRITE(_a, _r, REG_READ(_a, _r) & ~_f) ++ REG_WRITE(_a, _r, REG_READ(_a, _r) & ~(_f)) + + #define DO_DELAY(x) do { \ + if ((++(x) % 64) == 0) \ +--- a/drivers/net/wireless/ath/ath9k/mac.c ++++ b/drivers/net/wireless/ath/ath9k/mac.c +@@ -143,84 +143,59 @@ bool ath9k_hw_updatetxtriglevel(struct a + } + EXPORT_SYMBOL(ath9k_hw_updatetxtriglevel); + +-bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q) ++void ath9k_hw_abort_tx_dma(struct ath_hw *ah) + { +-#define ATH9K_TX_STOP_DMA_TIMEOUT 4000 /* usec */ +-#define ATH9K_TIME_QUANTUM 100 /* usec */ +- struct ath_common *common = ath9k_hw_common(ah); +- struct ath9k_hw_capabilities *pCap = &ah->caps; +- struct ath9k_tx_queue_info *qi; +- u32 tsfLow, j, wait; +- u32 wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM; ++ int i, q; + +- if (q >= pCap->total_queues) { +- ath_dbg(common, ATH_DBG_QUEUE, +- "Stopping TX DMA, invalid queue: %u\n", q); +- return false; +- } ++ REG_WRITE(ah, AR_Q_TXD, AR_Q_TXD_M); + +- qi = &ah->txq[q]; +- if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) { +- ath_dbg(common, ATH_DBG_QUEUE, +- "Stopping TX DMA, inactive queue: %u\n", q); +- return false; +- } ++ REG_SET_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); ++ REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); ++ REG_SET_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); + +- REG_WRITE(ah, AR_Q_TXD, 1 << q); ++ for (q = 0; q < AR_NUM_QCU; q++) { ++ for (i = 0; i < 1000; i++) { ++ if (i) ++ udelay(5); + +- for (wait = wait_time; wait != 0; wait--) { +- if (ath9k_hw_numtxpending(ah, q) == 0) +- break; +- udelay(ATH9K_TIME_QUANTUM); ++ if (!ath9k_hw_numtxpending(ah, q)) ++ break; ++ } + } + +- if (ath9k_hw_numtxpending(ah, q)) { +- ath_dbg(common, ATH_DBG_QUEUE, +- "%s: Num of pending TX Frames %d on Q %d\n", +- __func__, ath9k_hw_numtxpending(ah, q), q); +- +- for (j = 0; j < 2; j++) { +- tsfLow = REG_READ(ah, AR_TSF_L32); +- REG_WRITE(ah, AR_QUIET2, +- SM(10, AR_QUIET2_QUIET_DUR)); +- REG_WRITE(ah, AR_QUIET_PERIOD, 100); +- REG_WRITE(ah, AR_NEXT_QUIET_TIMER, tsfLow >> 10); +- REG_SET_BIT(ah, AR_TIMER_MODE, +- AR_QUIET_TIMER_EN); +- +- if ((REG_READ(ah, AR_TSF_L32) >> 10) == (tsfLow >> 10)) +- break; ++ REG_CLR_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); ++ REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); ++ REG_CLR_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); + +- ath_dbg(common, ATH_DBG_QUEUE, +- "TSF has moved while trying to set quiet time TSF: 0x%08x\n", +- tsfLow); +- } ++ REG_WRITE(ah, AR_Q_TXD, 0); ++} ++EXPORT_SYMBOL(ath9k_hw_abort_tx_dma); + +- REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); ++bool ath9k_hw_stop_dma_queue(struct ath_hw *ah, u32 q) ++{ ++#define ATH9K_TX_STOP_DMA_TIMEOUT 1000 /* usec */ ++#define ATH9K_TIME_QUANTUM 100 /* usec */ ++ int wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM; ++ int wait; + +- udelay(200); +- REG_CLR_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); ++ REG_WRITE(ah, AR_Q_TXD, 1 << q); + +- wait = wait_time; +- while (ath9k_hw_numtxpending(ah, q)) { +- if ((--wait) == 0) { +- ath_err(common, +- "Failed to stop TX DMA in 100 msec after killing last frame\n"); +- break; +- } ++ for (wait = wait_time; wait != 0; wait--) { ++ if (wait != wait_time) + udelay(ATH9K_TIME_QUANTUM); +- } + +- REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); ++ if (ath9k_hw_numtxpending(ah, q) == 0) ++ break; + } + + REG_WRITE(ah, AR_Q_TXD, 0); ++ + return wait != 0; + + #undef ATH9K_TX_STOP_DMA_TIMEOUT + #undef ATH9K_TIME_QUANTUM + } +-EXPORT_SYMBOL(ath9k_hw_stoptxdma); ++EXPORT_SYMBOL(ath9k_hw_stop_dma_queue); + + void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs) + { +--- a/drivers/net/wireless/ath/ath9k/mac.h ++++ b/drivers/net/wireless/ath/ath9k/mac.h +@@ -676,7 +676,8 @@ void ath9k_hw_txstart(struct ath_hw *ah, + void ath9k_hw_cleartxdesc(struct ath_hw *ah, void *ds); + u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q); + bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel); +-bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q); ++bool ath9k_hw_stop_dma_queue(struct ath_hw *ah, u32 q); ++void ath9k_hw_abort_tx_dma(struct ath_hw *ah); + void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs); + bool ath9k_hw_set_txq_props(struct ath_hw *ah, int q, + const struct ath9k_tx_queue_info *qinfo); +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -2128,56 +2128,42 @@ static void ath9k_set_coverage_class(str + + static void ath9k_flush(struct ieee80211_hw *hw, bool drop) + { +-#define ATH_FLUSH_TIMEOUT 60 /* ms */ + struct ath_softc *sc = hw->priv; +- struct ath_txq *txq = NULL; +- struct ath_hw *ah = sc->sc_ah; +- struct ath_common *common = ath9k_hw_common(ah); +- int i, j, npend = 0; ++ int timeout = 200; /* ms */ ++ int i, j; + ++ ath9k_ps_wakeup(sc); + mutex_lock(&sc->mutex); + + cancel_delayed_work_sync(&sc->tx_complete_work); + +- for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { +- if (!ATH_TXQ_SETUP(sc, i)) +- continue; +- txq = &sc->tx.txq[i]; +- +- if (!drop) { +- for (j = 0; j < ATH_FLUSH_TIMEOUT; j++) { +- if (!ath9k_has_pending_frames(sc, txq)) +- break; +- usleep_range(1000, 2000); +- } +- } ++ if (drop) ++ timeout = 1; ++ ++ for (j = 0; j < timeout; j++) { ++ int npend = 0; ++ ++ if (j) ++ usleep_range(1000, 2000); + +- if (drop || ath9k_has_pending_frames(sc, txq)) { +- ath_dbg(common, ATH_DBG_QUEUE, "Drop frames from hw queue:%d\n", +- txq->axq_qnum); +- spin_lock_bh(&txq->axq_lock); +- txq->txq_flush_inprogress = true; +- spin_unlock_bh(&txq->axq_lock); +- +- ath9k_ps_wakeup(sc); +- ath9k_hw_stoptxdma(ah, txq->axq_qnum); +- npend = ath9k_hw_numtxpending(ah, txq->axq_qnum); +- ath9k_ps_restore(sc); +- if (npend) +- break; ++ for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { ++ if (!ATH_TXQ_SETUP(sc, i)) ++ continue; + +- ath_draintxq(sc, txq, false); +- txq->txq_flush_inprogress = false; ++ npend += ath9k_has_pending_frames(sc, &sc->tx.txq[i]); + } ++ ++ if (!npend) ++ goto out; + } + +- if (npend) { ++ if (!ath_drain_all_txq(sc, false)) + ath_reset(sc, false); +- txq->txq_flush_inprogress = false; +- } + ++out: + ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); + mutex_unlock(&sc->mutex); ++ ath9k_ps_restore(sc); + } + + struct ieee80211_ops ath9k_ops = { +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -166,7 +166,7 @@ static void ath_tx_flush_tid(struct ath_ + fi = get_frame_info(bf->bf_mpdu); + if (fi->retries) { + ath_tx_update_baw(sc, tid, fi->seqno); +- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0); ++ ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 1); + } else { + ath_tx_send_normal(sc, txq, NULL, &bf_head); + } +@@ -1194,16 +1194,14 @@ bool ath_drain_all_txq(struct ath_softc + if (sc->sc_flags & SC_OP_INVALID) + return true; + +- /* Stop beacon queue */ +- ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); ++ ath9k_hw_abort_tx_dma(ah); + +- /* Stop data queues */ ++ /* Check if any queue remains active */ + for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { +- if (ATH_TXQ_SETUP(sc, i)) { +- txq = &sc->tx.txq[i]; +- ath9k_hw_stoptxdma(ah, txq->axq_qnum); +- npend += ath9k_hw_numtxpending(ah, txq->axq_qnum); +- } ++ if (!ATH_TXQ_SETUP(sc, i)) ++ continue; ++ ++ npend += ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum); + } + + if (npend) +@@ -2014,8 +2012,7 @@ static void ath_tx_processq(struct ath_s + spin_lock_bh(&txq->axq_lock); + if (list_empty(&txq->axq_q)) { + txq->axq_link = NULL; +- if (sc->sc_flags & SC_OP_TXAGGR && +- !txq->txq_flush_inprogress) ++ if (sc->sc_flags & SC_OP_TXAGGR) + ath_txq_schedule(sc, txq); + spin_unlock_bh(&txq->axq_lock); + break; +@@ -2096,7 +2093,7 @@ static void ath_tx_processq(struct ath_s + + spin_lock_bh(&txq->axq_lock); + +- if (sc->sc_flags & SC_OP_TXAGGR && !txq->txq_flush_inprogress) ++ if (sc->sc_flags & SC_OP_TXAGGR) + ath_txq_schedule(sc, txq); + spin_unlock_bh(&txq->axq_lock); + } +@@ -2267,18 +2264,17 @@ void ath_tx_edma_tasklet(struct ath_soft + + spin_lock_bh(&txq->axq_lock); + +- if (!txq->txq_flush_inprogress) { +- if (!list_empty(&txq->txq_fifo_pending)) { +- INIT_LIST_HEAD(&bf_head); +- bf = list_first_entry(&txq->txq_fifo_pending, +- struct ath_buf, list); +- list_cut_position(&bf_head, +- &txq->txq_fifo_pending, +- &bf->bf_lastbf->list); +- ath_tx_txqaddbuf(sc, txq, &bf_head); +- } else if (sc->sc_flags & SC_OP_TXAGGR) +- ath_txq_schedule(sc, txq); +- } ++ if (!list_empty(&txq->txq_fifo_pending)) { ++ INIT_LIST_HEAD(&bf_head); ++ bf = list_first_entry(&txq->txq_fifo_pending, ++ struct ath_buf, list); ++ list_cut_position(&bf_head, ++ &txq->txq_fifo_pending, ++ &bf->bf_lastbf->list); ++ ath_tx_txqaddbuf(sc, txq, &bf_head); ++ } else if (sc->sc_flags & SC_OP_TXAGGR) ++ ath_txq_schedule(sc, txq); ++ + spin_unlock_bh(&txq->axq_lock); + } + } +--- a/net/mac80211/chan.c ++++ b/net/mac80211/chan.c +@@ -77,6 +77,9 @@ bool ieee80211_set_channel_type(struct i + switch (tmp->vif.bss_conf.channel_type) { + case NL80211_CHAN_NO_HT: + case NL80211_CHAN_HT20: ++ if (superchan > tmp->vif.bss_conf.channel_type) ++ break; ++ + superchan = tmp->vif.bss_conf.channel_type; + break; + case NL80211_CHAN_HT40PLUS: diff --git a/package/mac80211/patches/401-ath9k-dont-register-leds-on-ar9100.patch b/package/mac80211/patches/401-ath9k-dont-register-leds-on-ar9100.patch index 166c133a6..22299020a 100644 --- a/package/mac80211/patches/401-ath9k-dont-register-leds-on-ar9100.patch +++ b/package/mac80211/patches/401-ath9k-dont-register-leds-on-ar9100.patch @@ -1,17 +1,7 @@ --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c -@@ -120,6 +120,9 @@ static void ath_unregister_led(struct at - - void ath_deinit_leds(struct ath_softc *sc) +@@ -41,6 +41,9 @@ void ath_init_leds(struct ath_softc *sc) { -+ if (AR_SREV_9100(sc->sc_ah)) -+ return; -+ - ath_unregister_led(&sc->assoc_led); - sc->sc_flags &= ~SC_OP_LED_ASSOCIATED; - ath_unregister_led(&sc->tx_led); -@@ -133,6 +136,9 @@ void ath_init_leds(struct ath_softc *sc) - char *trigger; int ret; + if (AR_SREV_9100(sc->sc_ah)) @@ -19,4 +9,4 @@ + if (AR_SREV_9287(sc->sc_ah)) sc->sc_ah->led_pin = ATH_LED_PIN_9287; - else + else if (AR_SREV_9485(sc->sc_ah)) diff --git a/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch b/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch index c92245641..6326649fc 100644 --- a/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch +++ b/package/mac80211/patches/407-ath9k-override-mac-address-from-platform-data.patch @@ -18,7 +18,7 @@ #include "ath9k.h" -@@ -522,6 +523,7 @@ static void ath9k_init_misc(struct ath_s +@@ -537,6 +538,7 @@ static void ath9k_init_misc(struct ath_s static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid, const struct ath_bus_ops *bus_ops) { @@ -26,7 +26,7 @@ struct ath_hw *ah = NULL; struct ath_common *common; int ret = 0, i; -@@ -536,7 +538,7 @@ static int ath9k_init_softc(u16 devid, s +@@ -551,7 +553,7 @@ static int ath9k_init_softc(u16 devid, s ah->hw_version.subsysid = subsysid; sc->sc_ah = ah; @@ -35,7 +35,7 @@ ah->ah_flags |= AH_USE_EEPROM; common = ath9k_hw_common(ah); -@@ -572,6 +574,9 @@ static int ath9k_init_softc(u16 devid, s +@@ -587,6 +589,9 @@ static int ath9k_init_softc(u16 devid, s if (ret) goto err_hw; diff --git a/package/mac80211/patches/409-ath9k_platform_settings.patch b/package/mac80211/patches/409-ath9k_platform_settings.patch index 23a5887a1..6ce43b600 100644 --- a/package/mac80211/patches/409-ath9k_platform_settings.patch +++ b/package/mac80211/patches/409-ath9k_platform_settings.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -538,8 +538,14 @@ static int ath9k_init_softc(u16 devid, s +@@ -553,8 +553,14 @@ static int ath9k_init_softc(u16 devid, s ah->hw_version.subsysid = subsysid; sc->sc_ah = ah; @@ -29,17 +29,21 @@ --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c -@@ -139,10 +139,12 @@ void ath_init_leds(struct ath_softc *sc) +@@ -44,12 +44,14 @@ void ath_init_leds(struct ath_softc *sc) if (AR_SREV_9100(sc->sc_ah)) return; - if (AR_SREV_9287(sc->sc_ah)) - sc->sc_ah->led_pin = ATH_LED_PIN_9287; +- else if (AR_SREV_9485(sc->sc_ah)) +- sc->sc_ah->led_pin = ATH_LED_PIN_9485; - else - sc->sc_ah->led_pin = ATH_LED_PIN_DEF; + if (sc->sc_ah->led_pin < 0) { + if (AR_SREV_9287(sc->sc_ah)) + sc->sc_ah->led_pin = ATH_LED_PIN_9287; ++ else if (AR_SREV_9485(sc->sc_ah)) ++ sc->sc_ah->led_pin = ATH_LED_PIN_9485; + else + sc->sc_ah->led_pin = ATH_LED_PIN_DEF; + } diff --git a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch index 700cf7011..0bb7082ef 100644 --- a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch +++ b/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch @@ -1,7 +1,7 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1027,6 +1027,53 @@ static const struct file_operations fops - .llseek = default_llseek, +@@ -1077,6 +1077,53 @@ static const struct file_operations fops + .llseek = default_llseek,/* read accesses f_pos */ }; +static ssize_t read_file_eeprom(struct file *file, char __user *user_buf, @@ -54,7 +54,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1097,6 +1144,10 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1151,6 +1198,10 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, &sc->sc_ah->gpio_val); diff --git a/package/mac80211/patches/520-ath9k_intr_mitigation_tweak.patch b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch index 301af3c22..301af3c22 100644 --- a/package/mac80211/patches/520-ath9k_intr_mitigation_tweak.patch +++ b/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch diff --git a/package/mac80211/patches/510-ath9k_led_cleanup.patch b/package/mac80211/patches/510-ath9k_led_cleanup.patch deleted file mode 100644 index 352bee15f..000000000 --- a/package/mac80211/patches/510-ath9k_led_cleanup.patch +++ /dev/null @@ -1,303 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/ath9k.h -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -449,26 +449,20 @@ void ath9k_btcoex_timer_pause(struct ath - - #define ATH_LED_PIN_DEF 1 - #define ATH_LED_PIN_9287 8 --#define ATH_LED_ON_DURATION_IDLE 350 /* in msecs */ --#define ATH_LED_OFF_DURATION_IDLE 250 /* in msecs */ -- --enum ath_led_type { -- ATH_LED_RADIO, -- ATH_LED_ASSOC, -- ATH_LED_TX, -- ATH_LED_RX --}; -- --struct ath_led { -- struct ath_softc *sc; -- struct led_classdev led_cdev; -- enum ath_led_type led_type; -- char name[32]; -- bool registered; --}; - -+#ifdef CONFIG_MAC80211_LEDS - void ath_init_leds(struct ath_softc *sc); - void ath_deinit_leds(struct ath_softc *sc); -+#else -+static inline void ath_init_leds(struct ath_softc *sc) -+{ -+} -+ -+static inline void ath_deinit_leds(struct ath_softc *sc) -+{ -+} -+#endif -+ - - /* Antenna diversity/combining */ - #define ATH_ANT_RX_CURRENT_SHIFT 4 -@@ -620,15 +614,11 @@ struct ath_softc { - struct ath_beacon beacon; - struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; - -- struct ath_led radio_led; -- struct ath_led assoc_led; -- struct ath_led tx_led; -- struct ath_led rx_led; -- struct delayed_work ath_led_blink_work; -- int led_on_duration; -- int led_off_duration; -- int led_on_cnt; -- int led_off_cnt; -+#ifdef CONFIG_MAC80211_LEDS -+ bool led_registered; -+ char led_name[32]; -+ struct led_classdev led_cdev; -+#endif - - struct ath9k_hw_cal_data caldata; - int last_rssi; ---- a/drivers/net/wireless/ath/ath9k/gpio.c -+++ b/drivers/net/wireless/ath/ath9k/gpio.c -@@ -20,120 +20,25 @@ - /* LED functions */ - /********************************/ - --static void ath_led_blink_work(struct work_struct *work) --{ -- struct ath_softc *sc = container_of(work, struct ath_softc, -- ath_led_blink_work.work); -- -- if (!(sc->sc_flags & SC_OP_LED_ASSOCIATED)) -- return; -- -- if ((sc->led_on_duration == ATH_LED_ON_DURATION_IDLE) || -- (sc->led_off_duration == ATH_LED_OFF_DURATION_IDLE)) -- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0); -- else -- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, -- (sc->sc_flags & SC_OP_LED_ON) ? 1 : 0); -- -- ieee80211_queue_delayed_work(sc->hw, -- &sc->ath_led_blink_work, -- (sc->sc_flags & SC_OP_LED_ON) ? -- msecs_to_jiffies(sc->led_off_duration) : -- msecs_to_jiffies(sc->led_on_duration)); -- -- sc->led_on_duration = sc->led_on_cnt ? -- max((ATH_LED_ON_DURATION_IDLE - sc->led_on_cnt), 25) : -- ATH_LED_ON_DURATION_IDLE; -- sc->led_off_duration = sc->led_off_cnt ? -- max((ATH_LED_OFF_DURATION_IDLE - sc->led_off_cnt), 10) : -- ATH_LED_OFF_DURATION_IDLE; -- sc->led_on_cnt = sc->led_off_cnt = 0; -- if (sc->sc_flags & SC_OP_LED_ON) -- sc->sc_flags &= ~SC_OP_LED_ON; -- else -- sc->sc_flags |= SC_OP_LED_ON; --} -- -+#ifdef CONFIG_MAC80211_LEDS - static void ath_led_brightness(struct led_classdev *led_cdev, - enum led_brightness brightness) - { -- struct ath_led *led = container_of(led_cdev, struct ath_led, led_cdev); -- struct ath_softc *sc = led->sc; -- -- switch (brightness) { -- case LED_OFF: -- if (led->led_type == ATH_LED_ASSOC || -- led->led_type == ATH_LED_RADIO) { -- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, -- (led->led_type == ATH_LED_RADIO)); -- sc->sc_flags &= ~SC_OP_LED_ASSOCIATED; -- if (led->led_type == ATH_LED_RADIO) -- sc->sc_flags &= ~SC_OP_LED_ON; -- } else { -- sc->led_off_cnt++; -- } -- break; -- case LED_FULL: -- if (led->led_type == ATH_LED_ASSOC) { -- sc->sc_flags |= SC_OP_LED_ASSOCIATED; -- if (led_blink) -- ieee80211_queue_delayed_work(sc->hw, -- &sc->ath_led_blink_work, 0); -- } else if (led->led_type == ATH_LED_RADIO) { -- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0); -- sc->sc_flags |= SC_OP_LED_ON; -- } else { -- sc->led_on_cnt++; -- } -- break; -- default: -- break; -- } --} -- --static int ath_register_led(struct ath_softc *sc, struct ath_led *led, -- char *trigger) --{ -- int ret; -- -- led->sc = sc; -- led->led_cdev.name = led->name; -- led->led_cdev.default_trigger = trigger; -- led->led_cdev.brightness_set = ath_led_brightness; -- -- ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->led_cdev); -- if (ret) -- ath_err(ath9k_hw_common(sc->sc_ah), -- "Failed to register led:%s", led->name); -- else -- led->registered = 1; -- return ret; --} -- --static void ath_unregister_led(struct ath_led *led) --{ -- if (led->registered) { -- led_classdev_unregister(&led->led_cdev); -- led->registered = 0; -- } -+ struct ath_softc *sc = container_of(led_cdev, struct ath_softc, led_cdev); -+ ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, (brightness == LED_OFF)); - } - - void ath_deinit_leds(struct ath_softc *sc) - { -- if (AR_SREV_9100(sc->sc_ah)) -+ if (!sc->led_registered) - return; - -- ath_unregister_led(&sc->assoc_led); -- sc->sc_flags &= ~SC_OP_LED_ASSOCIATED; -- ath_unregister_led(&sc->tx_led); -- ath_unregister_led(&sc->rx_led); -- ath_unregister_led(&sc->radio_led); -- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); -+ ath_led_brightness(&sc->led_cdev, LED_OFF); -+ led_classdev_unregister(&sc->led_cdev); - } - - void ath_init_leds(struct ath_softc *sc) - { -- char *trigger; - int ret; - - if (AR_SREV_9100(sc->sc_ah)) -@@ -152,48 +57,22 @@ void ath_init_leds(struct ath_softc *sc) - /* LED off, active low */ - ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); - -- if (led_blink) -- INIT_DELAYED_WORK(&sc->ath_led_blink_work, ath_led_blink_work); -+ if (!led_blink) -+ sc->led_cdev.default_trigger = -+ ieee80211_get_radio_led_name(sc->hw); -+ -+ snprintf(sc->led_name, sizeof(sc->led_name), -+ "ath9k-%s", wiphy_name(sc->hw->wiphy)); -+ sc->led_cdev.name = sc->led_name; -+ sc->led_cdev.brightness_set = ath_led_brightness; -+ -+ ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &sc->led_cdev); -+ if (ret < 0) -+ return; - -- trigger = ieee80211_get_radio_led_name(sc->hw); -- snprintf(sc->radio_led.name, sizeof(sc->radio_led.name), -- "ath9k-%s::radio", wiphy_name(sc->hw->wiphy)); -- ret = ath_register_led(sc, &sc->radio_led, trigger); -- sc->radio_led.led_type = ATH_LED_RADIO; -- if (ret) -- goto fail; -- -- trigger = ieee80211_get_assoc_led_name(sc->hw); -- snprintf(sc->assoc_led.name, sizeof(sc->assoc_led.name), -- "ath9k-%s::assoc", wiphy_name(sc->hw->wiphy)); -- ret = ath_register_led(sc, &sc->assoc_led, trigger); -- sc->assoc_led.led_type = ATH_LED_ASSOC; -- if (ret) -- goto fail; -- -- trigger = ieee80211_get_tx_led_name(sc->hw); -- snprintf(sc->tx_led.name, sizeof(sc->tx_led.name), -- "ath9k-%s::tx", wiphy_name(sc->hw->wiphy)); -- ret = ath_register_led(sc, &sc->tx_led, trigger); -- sc->tx_led.led_type = ATH_LED_TX; -- if (ret) -- goto fail; -- -- trigger = ieee80211_get_rx_led_name(sc->hw); -- snprintf(sc->rx_led.name, sizeof(sc->rx_led.name), -- "ath9k-%s::rx", wiphy_name(sc->hw->wiphy)); -- ret = ath_register_led(sc, &sc->rx_led, trigger); -- sc->rx_led.led_type = ATH_LED_RX; -- if (ret) -- goto fail; -- -- return; -- --fail: -- if (led_blink) -- cancel_delayed_work_sync(&sc->ath_led_blink_work); -- ath_deinit_leds(sc); -+ sc->led_registered = true; - } -+#endif - - /*******************/ - /* Rfkill */ ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1216,9 +1216,6 @@ static void ath9k_stop(struct ieee80211_ - - mutex_lock(&sc->mutex); - -- if (led_blink) -- cancel_delayed_work_sync(&sc->ath_led_blink_work); -- - cancel_delayed_work_sync(&sc->tx_complete_work); - cancel_delayed_work_sync(&sc->hw_pll_work); - cancel_work_sync(&sc->paprd_work); ---- a/drivers/net/wireless/ath/ath9k/init.c -+++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -141,6 +141,21 @@ static struct ieee80211_rate ath9k_legac - RATE(540, 0x0c, 0), - }; - -+#ifdef CONFIG_MAC80211_LEDS -+static const struct ieee80211_tpt_blink ath9k_tpt_blink[] = { -+ { .throughput = 0 * 1024, .blink_time = 334 }, -+ { .throughput = 1 * 1024, .blink_time = 260 }, -+ { .throughput = 5 * 1024, .blink_time = 220 }, -+ { .throughput = 10 * 1024, .blink_time = 190 }, -+ { .throughput = 20 * 1024, .blink_time = 170 }, -+ { .throughput = 50 * 1024, .blink_time = 150 }, -+ { .throughput = 70 * 1024, .blink_time = 130 }, -+ { .throughput = 100 * 1024, .blink_time = 110 }, -+ { .throughput = 200 * 1024, .blink_time = 80 }, -+ { .throughput = 300 * 1024, .blink_time = 50 }, -+}; -+#endif -+ - static void ath9k_deinit_softc(struct ath_softc *sc); - - /* -@@ -742,6 +757,13 @@ int ath9k_init_device(u16 devid, struct - - ath9k_init_txpower_limits(sc); - -+#ifdef CONFIG_MAC80211_LEDS -+ /* must be initialized before ieee80211_register_hw */ -+ sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw, -+ IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_tpt_blink, -+ ARRAY_SIZE(ath9k_tpt_blink)); -+#endif -+ - /* Register with mac80211 */ - error = ieee80211_register_hw(hw); - if (error) diff --git a/package/mac80211/patches/530-mac80211_drv_tim_override.patch b/package/mac80211/patches/520-mac80211_drv_tim_override.patch index 198f658a6..535e35927 100644 --- a/package/mac80211/patches/530-mac80211_drv_tim_override.patch +++ b/package/mac80211/patches/520-mac80211_drv_tim_override.patch @@ -1,6 +1,6 @@ --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -2209,6 +2209,18 @@ static inline int ieee80211_sta_ps_trans +@@ -2216,6 +2216,18 @@ static inline int ieee80211_sta_ps_trans #define IEEE80211_TX_STATUS_HEADROOM 13 /** diff --git a/package/mac80211/patches/531-ath9k_fix_ap_ps_buffering.patch b/package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch index ff58c26d7..87cc2654b 100644 --- a/package/mac80211/patches/531-ath9k_fix_ap_ps_buffering.patch +++ b/package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -203,6 +203,7 @@ struct ath_atx_ac { +@@ -202,6 +202,7 @@ struct ath_atx_ac { int sched; struct list_head list; struct list_head tid_q; @@ -8,7 +8,7 @@ }; struct ath_frame_info { -@@ -260,6 +261,8 @@ struct ath_node { +@@ -259,6 +260,8 @@ struct ath_node { struct ath_atx_ac ac[WME_NUM_AC]; u16 maxampdu; u8 mpdudensity; @@ -17,7 +17,7 @@ }; #define AGGR_CLEANUP BIT(1) -@@ -341,6 +344,9 @@ int ath_tx_aggr_start(struct ath_softc * +@@ -340,6 +343,9 @@ int ath_tx_aggr_start(struct ath_softc * void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); @@ -57,7 +57,7 @@ static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue, const struct ieee80211_tx_queue_params *params) { -@@ -2191,6 +2212,7 @@ struct ieee80211_ops ath9k_ops = { +@@ -2177,6 +2198,7 @@ struct ieee80211_ops ath9k_ops = { .configure_filter = ath9k_configure_filter, .sta_add = ath9k_sta_add, .sta_remove = ath9k_sta_remove, @@ -189,7 +189,7 @@ void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid) { struct ath_atx_tid *txtid; -@@ -1493,7 +1570,6 @@ static int setup_tx_flags(struct sk_buff +@@ -1491,7 +1568,6 @@ static int setup_tx_flags(struct sk_buff struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); int flags = 0; @@ -197,7 +197,7 @@ flags |= ATH9K_TXDESC_INTREQ; if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) -@@ -1756,6 +1832,9 @@ static void ath_tx_start_dma(struct ath_ +@@ -1754,6 +1830,9 @@ static void ath_tx_start_dma(struct ath_ if (txctl->paprd) bf->bf_state.bfs_paprd_timestamp = jiffies; diff --git a/package/mac80211/patches/532-ath9k_remove_pending_frames_workaround.patch b/package/mac80211/patches/522-ath9k_remove_pending_frames_workaround.patch index f7341e2a1..e368bce64 100644 --- a/package/mac80211/patches/532-ath9k_remove_pending_frames_workaround.patch +++ b/package/mac80211/patches/522-ath9k_remove_pending_frames_workaround.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -2226,33 +2226,6 @@ static void ath_tx_complete_poll_work(st +@@ -2223,33 +2223,6 @@ static void ath_tx_complete_poll_work(st } else { txq->axq_tx_inprogress = true; } diff --git a/package/mac80211/patches/580-mac80211_redirect_vlan_eap_frames.patch b/package/mac80211/patches/530-mac80211_redirect_vlan_eap_frames.patch index 03a4fe5d3..03a4fe5d3 100644 --- a/package/mac80211/patches/580-mac80211_redirect_vlan_eap_frames.patch +++ b/package/mac80211/patches/530-mac80211_redirect_vlan_eap_frames.patch diff --git a/package/mac80211/patches/540-mac80211_add_rx_rate.patch b/package/mac80211/patches/540-mac80211_add_rx_rate.patch deleted file mode 100644 index d365f3524..000000000 --- a/package/mac80211/patches/540-mac80211_add_rx_rate.patch +++ /dev/null @@ -1,232 +0,0 @@ ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -414,7 +414,7 @@ struct station_parameters { - * @STATION_INFO_PLID: @plid filled - * @STATION_INFO_PLINK_STATE: @plink_state filled - * @STATION_INFO_SIGNAL: @signal filled -- * @STATION_INFO_TX_BITRATE: @tx_bitrate fields are filled -+ * @STATION_INFO_TX_BITRATE: @txrate fields are filled - * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) - * @STATION_INFO_RX_PACKETS: @rx_packets filled - * @STATION_INFO_TX_PACKETS: @tx_packets filled -@@ -422,6 +422,7 @@ struct station_parameters { - * @STATION_INFO_TX_FAILED: @tx_failed filled - * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled - * @STATION_INFO_SIGNAL_AVG: @signal_avg filled -+ * @STATION_INFO_RX_BITRATE: @rxrate fields are filled - */ - enum station_info_flags { - STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -438,6 +439,7 @@ enum station_info_flags { - STATION_INFO_TX_FAILED = 1<<11, - STATION_INFO_RX_DROP_MISC = 1<<12, - STATION_INFO_SIGNAL_AVG = 1<<13, -+ STATION_INFO_RX_BITRATE = 1<<14, - }; - - /** -@@ -507,6 +509,7 @@ struct station_info { - s8 signal; - s8 signal_avg; - struct rate_info txrate; -+ struct rate_info rxrate; - u32 rx_packets; - u32 tx_packets; - u32 tx_retries; ---- a/include/linux/nl80211.h -+++ b/include/linux/nl80211.h -@@ -1243,6 +1243,8 @@ enum nl80211_rate_info { - * @NL80211_STA_INFO_LLID: the station's mesh LLID - * @NL80211_STA_INFO_PLID: the station's mesh PLID - * @NL80211_STA_INFO_PLINK_STATE: peer link state for the station -+ * @NL80211_STA_INFO_RX_BITRATE: last unicast rx rate, nested attribute -+ * containing info as possible, see &enum nl80211_sta_info_txrate. - * @__NL80211_STA_INFO_AFTER_LAST: internal - * @NL80211_STA_INFO_MAX: highest possible station info attribute - */ -@@ -1261,6 +1263,7 @@ enum nl80211_sta_info { - NL80211_STA_INFO_TX_RETRIES, - NL80211_STA_INFO_TX_FAILED, - NL80211_STA_INFO_SIGNAL_AVG, -+ NL80211_STA_INFO_RX_BITRATE, - - /* keep last */ - __NL80211_STA_INFO_AFTER_LAST, ---- a/net/wireless/nl80211.c -+++ b/net/wireless/nl80211.c -@@ -1968,13 +1968,41 @@ static int parse_station_flags(struct ge - return 0; - } - -+static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, -+ int attr) -+{ -+ struct nlattr *rate; -+ u16 bitrate; -+ -+ rate = nla_nest_start(msg, attr); -+ if (!rate) -+ goto nla_put_failure; -+ -+ /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ -+ bitrate = cfg80211_calculate_bitrate(info); -+ if (bitrate > 0) -+ NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate); -+ -+ if (info->flags & RATE_INFO_FLAGS_MCS) -+ NLA_PUT_U8(msg, NL80211_RATE_INFO_MCS, info->mcs); -+ if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) -+ NLA_PUT_FLAG(msg, NL80211_RATE_INFO_40_MHZ_WIDTH); -+ if (info->flags & RATE_INFO_FLAGS_SHORT_GI) -+ NLA_PUT_FLAG(msg, NL80211_RATE_INFO_SHORT_GI); -+ -+ nla_nest_end(msg, rate); -+ return true; -+ -+nla_put_failure: -+ return false; -+} -+ - static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq, - int flags, struct net_device *dev, - const u8 *mac_addr, struct station_info *sinfo) - { - void *hdr; -- struct nlattr *sinfoattr, *txrate; -- u16 bitrate; -+ struct nlattr *sinfoattr; - - hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION); - if (!hdr) -@@ -2013,24 +2041,14 @@ static int nl80211_send_station(struct s - NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG, - sinfo->signal_avg); - if (sinfo->filled & STATION_INFO_TX_BITRATE) { -- txrate = nla_nest_start(msg, NL80211_STA_INFO_TX_BITRATE); -- if (!txrate) -+ if (!nl80211_put_sta_rate(msg, &sinfo->txrate, -+ NL80211_STA_INFO_TX_BITRATE)) -+ goto nla_put_failure; -+ } -+ if (sinfo->filled & STATION_INFO_RX_BITRATE) { -+ if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, -+ NL80211_STA_INFO_RX_BITRATE)) - goto nla_put_failure; -- -- /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ -- bitrate = cfg80211_calculate_bitrate(&sinfo->txrate); -- if (bitrate > 0) -- NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate); -- -- if (sinfo->txrate.flags & RATE_INFO_FLAGS_MCS) -- NLA_PUT_U8(msg, NL80211_RATE_INFO_MCS, -- sinfo->txrate.mcs); -- if (sinfo->txrate.flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) -- NLA_PUT_FLAG(msg, NL80211_RATE_INFO_40_MHZ_WIDTH); -- if (sinfo->txrate.flags & RATE_INFO_FLAGS_SHORT_GI) -- NLA_PUT_FLAG(msg, NL80211_RATE_INFO_SHORT_GI); -- -- nla_nest_end(msg, txrate); - } - if (sinfo->filled & STATION_INFO_RX_PACKETS) - NLA_PUT_U32(msg, NL80211_STA_INFO_RX_PACKETS, ---- a/net/mac80211/sta_info.h -+++ b/net/mac80211/sta_info.h -@@ -212,6 +212,8 @@ enum plink_state { - * @rate_ctrl_priv: rate control private per-STA pointer - * @last_tx_rate: rate used for last transmit, to report to userspace as - * "the" transmit rate -+ * @last_rx_rate_idx: rx status rate index of the last data packet -+ * @last_rx_rate_flag: rx status flag of the last data packet - * @lock: used for locking all fields that require locking, see comments - * in the header file. - * @flaglock: spinlock for flags accesses -@@ -314,6 +316,8 @@ struct sta_info { - unsigned long tx_bytes; - unsigned long tx_fragments; - struct ieee80211_tx_rate last_tx_rate; -+ int last_rx_rate_idx; -+ int last_rx_rate_flag; - u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1]; - - /* ---- a/net/mac80211/rx.c -+++ b/net/mac80211/rx.c -@@ -1156,14 +1156,23 @@ ieee80211_rx_h_sta_process(struct ieee80 - if (rx->sdata->vif.type == NL80211_IFTYPE_ADHOC) { - u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len, - NL80211_IFTYPE_ADHOC); -- if (compare_ether_addr(bssid, rx->sdata->u.ibss.bssid) == 0) -+ if (compare_ether_addr(bssid, rx->sdata->u.ibss.bssid) == 0) { - sta->last_rx = jiffies; -+ if (ieee80211_is_data(hdr->frame_control)) { -+ sta->last_rx_rate_idx = status->rate_idx; -+ sta->last_rx_rate_flag = status->flag; -+ } -+ } - } else if (!is_multicast_ether_addr(hdr->addr1)) { - /* - * Mesh beacons will update last_rx when if they are found to - * match the current local configuration when processed. - */ - sta->last_rx = jiffies; -+ if (ieee80211_is_data(hdr->frame_control)) { -+ sta->last_rx_rate_idx = status->rate_idx; -+ sta->last_rx_rate_flag = status->flag; -+ } - } - - if (!(status->rx_flags & IEEE80211_RX_RA_MATCH)) ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -316,6 +316,17 @@ static int ieee80211_config_default_mgmt - return 0; - } - -+static void rate_idx_to_bitrate(struct rate_info *rate, struct sta_info *sta, int idx) -+{ -+ if (!(rate->flags & RATE_INFO_FLAGS_MCS)) { -+ struct ieee80211_supported_band *sband; -+ sband = sta->local->hw.wiphy->bands[ -+ sta->local->hw.conf.channel->band]; -+ rate->legacy = sband->bitrates[idx].bitrate; -+ } else -+ rate->mcs = idx; -+} -+ - static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) - { - struct ieee80211_sub_if_data *sdata = sta->sdata; -@@ -330,6 +341,7 @@ static void sta_set_sinfo(struct sta_inf - STATION_INFO_TX_RETRIES | - STATION_INFO_TX_FAILED | - STATION_INFO_TX_BITRATE | -+ STATION_INFO_RX_BITRATE | - STATION_INFO_RX_DROP_MISC; - - sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx); -@@ -355,15 +367,16 @@ static void sta_set_sinfo(struct sta_inf - sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; - if (sta->last_tx_rate.flags & IEEE80211_TX_RC_SHORT_GI) - sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; -+ rate_idx_to_bitrate(&sinfo->txrate, sta, sta->last_tx_rate.idx); - -- if (!(sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS)) { -- struct ieee80211_supported_band *sband; -- sband = sta->local->hw.wiphy->bands[ -- sta->local->hw.conf.channel->band]; -- sinfo->txrate.legacy = -- sband->bitrates[sta->last_tx_rate.idx].bitrate; -- } else -- sinfo->txrate.mcs = sta->last_tx_rate.idx; -+ sinfo->rxrate.flags = 0; -+ if (sta->last_rx_rate_flag & RX_FLAG_HT) -+ sinfo->rxrate.flags |= RATE_INFO_FLAGS_MCS; -+ if (sta->last_rx_rate_flag & RX_FLAG_40MHZ) -+ sinfo->rxrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; -+ if (sta->last_rx_rate_flag & RX_FLAG_SHORT_GI) -+ sinfo->rxrate.flags |= RATE_INFO_FLAGS_SHORT_GI; -+ rate_idx_to_bitrate(&sinfo->rxrate, sta, sta->last_rx_rate_idx); - - if (ieee80211_vif_is_mesh(&sdata->vif)) { - #ifdef CONFIG_MAC80211_MESH diff --git a/package/mac80211/patches/550-ath9k_no_vif_promisc_handling.patch b/package/mac80211/patches/550-ath9k_no_vif_promisc_handling.patch deleted file mode 100644 index c3a966326..000000000 --- a/package/mac80211/patches/550-ath9k_no_vif_promisc_handling.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/recv.c -+++ b/drivers/net/wireless/ath/ath9k/recv.c -@@ -413,9 +413,7 @@ u32 ath_calcrxfilter(struct ath_softc *s - * mode interface or when in monitor mode. AP mode does not need this - * since it receives all in-BSS frames anyway. - */ -- if (((sc->sc_ah->opmode != NL80211_IFTYPE_AP) && -- (sc->rx.rxfilter & FIF_PROMISC_IN_BSS)) || -- (sc->sc_ah->is_monitoring)) -+ if (sc->sc_ah->is_monitoring) - rfilt |= ATH9K_RX_FILTER_PROM; - - if (sc->rx.rxfilter & FIF_CONTROL) diff --git a/package/mac80211/patches/560-mac80211_minstrel_ht_sampling_fix.patch b/package/mac80211/patches/560-mac80211_minstrel_ht_sampling_fix.patch deleted file mode 100644 index 011f87ad3..000000000 --- a/package/mac80211/patches/560-mac80211_minstrel_ht_sampling_fix.patch +++ /dev/null @@ -1,50 +0,0 @@ ---- a/net/mac80211/rc80211_minstrel_ht.c -+++ b/net/mac80211/rc80211_minstrel_ht.c -@@ -415,10 +415,8 @@ minstrel_ht_tx_status(void *priv, struct - mi->sample_count--; - } - -- if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) { -+ if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) - mi->sample_packets += info->status.ampdu_len; -- minstrel_next_sample_idx(mi); -- } - - for (i = 0; !last; i++) { - last = (i == IEEE80211_TX_MAX_RATES - 1) || -@@ -553,13 +551,14 @@ minstrel_get_sample_rate(struct minstrel - sample_idx = sample_table[mg->column][mg->index]; - mr = &mg->rates[sample_idx]; - sample_idx += mi->sample_group * MCS_GROUP_RATES; -+ minstrel_next_sample_idx(mi); - - /* - * When not using MRR, do not sample if the probability is already - * higher than 95% to avoid wasting airtime - */ - if (!mp->has_mrr && (mr->probability > MINSTREL_FRAC(95, 100))) -- goto next; -+ return -1; - - /* - * Make sure that lower rates get sampled only occasionally, -@@ -568,17 +567,13 @@ minstrel_get_sample_rate(struct minstrel - if (minstrel_get_duration(sample_idx) > - minstrel_get_duration(mi->max_tp_rate)) { - if (mr->sample_skipped < 20) -- goto next; -+ return -1; - - if (mi->sample_slow++ > 2) -- goto next; -+ return -1; - } - - return sample_idx; -- --next: -- minstrel_next_sample_idx(mi); -- return -1; - } - - static void diff --git a/package/mac80211/patches/570-ath9k_fix_reg_bit_macros.patch b/package/mac80211/patches/570-ath9k_fix_reg_bit_macros.patch deleted file mode 100644 index 7d961d2c2..000000000 --- a/package/mac80211/patches/570-ath9k_fix_reg_bit_macros.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/hw.h -+++ b/drivers/net/wireless/ath/ath9k/hw.h -@@ -95,9 +95,9 @@ - #define REG_READ_FIELD(_a, _r, _f) \ - (((REG_READ(_a, _r) & _f) >> _f##_S)) - #define REG_SET_BIT(_a, _r, _f) \ -- REG_WRITE(_a, _r, REG_READ(_a, _r) | _f) -+ REG_WRITE(_a, _r, REG_READ(_a, _r) | (_f)) - #define REG_CLR_BIT(_a, _r, _f) \ -- REG_WRITE(_a, _r, REG_READ(_a, _r) & ~_f) -+ REG_WRITE(_a, _r, REG_READ(_a, _r) & ~(_f)) - - #define DO_DELAY(x) do { \ - if ((++(x) % 64) == 0) \ diff --git a/package/mac80211/patches/571-ath9k_fix_dma_stop.patch b/package/mac80211/patches/571-ath9k_fix_dma_stop.patch deleted file mode 100644 index 9f7cfa82e..000000000 --- a/package/mac80211/patches/571-ath9k_fix_dma_stop.patch +++ /dev/null @@ -1,72 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1271,16 +1271,14 @@ bool ath_drain_all_txq(struct ath_softc - if (sc->sc_flags & SC_OP_INVALID) - return true; - -- /* Stop beacon queue */ -- ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); -+ ath9k_hw_abort_tx_dma(ah); - -- /* Stop data queues */ -+ /* Check if any queue remains active */ - for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { -- if (ATH_TXQ_SETUP(sc, i)) { -- txq = &sc->tx.txq[i]; -- ath9k_hw_stoptxdma(ah, txq->axq_qnum); -- npend += ath9k_hw_numtxpending(ah, txq->axq_qnum); -- } -+ if (!ATH_TXQ_SETUP(sc, i)) -+ continue; -+ -+ npend += ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum); - } - - if (npend) ---- a/drivers/net/wireless/ath/ath9k/mac.c -+++ b/drivers/net/wireless/ath/ath9k/mac.c -@@ -143,6 +143,34 @@ bool ath9k_hw_updatetxtriglevel(struct a - } - EXPORT_SYMBOL(ath9k_hw_updatetxtriglevel); - -+void ath9k_hw_abort_tx_dma(struct ath_hw *ah) -+{ -+ int i, q; -+ -+ REG_WRITE(ah, AR_Q_TXD, AR_Q_TXD_M); -+ -+ REG_SET_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); -+ REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); -+ REG_SET_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); -+ -+ for (q = 0; q < AR_NUM_QCU; q++) { -+ for (i = 0; i < 1000; i++) { -+ if (i) -+ udelay(5); -+ -+ if (!ath9k_hw_numtxpending(ah, q)) -+ break; -+ } -+ } -+ -+ REG_CLR_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); -+ REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); -+ REG_CLR_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); -+ -+ REG_WRITE(ah, AR_Q_TXD, 0); -+} -+EXPORT_SYMBOL(ath9k_hw_abort_tx_dma); -+ - bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q) - { - #define ATH9K_TX_STOP_DMA_TIMEOUT 4000 /* usec */ ---- a/drivers/net/wireless/ath/ath9k/mac.h -+++ b/drivers/net/wireless/ath/ath9k/mac.h -@@ -676,6 +676,7 @@ void ath9k_hw_cleartxdesc(struct ath_hw - u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q); - bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel); - bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q); -+void ath9k_hw_abort_tx_dma(struct ath_hw *ah); - void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs); - bool ath9k_hw_set_txq_props(struct ath_hw *ah, int q, - const struct ath9k_tx_queue_info *qinfo); diff --git a/package/mac80211/patches/572-ath9k_fix_tx_flush.patch b/package/mac80211/patches/572-ath9k_fix_tx_flush.patch deleted file mode 100644 index 630abc6fd..000000000 --- a/package/mac80211/patches/572-ath9k_fix_tx_flush.patch +++ /dev/null @@ -1,141 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -2149,56 +2149,42 @@ static void ath9k_set_coverage_class(str - - static void ath9k_flush(struct ieee80211_hw *hw, bool drop) - { --#define ATH_FLUSH_TIMEOUT 60 /* ms */ - struct ath_softc *sc = hw->priv; -- struct ath_txq *txq = NULL; -- struct ath_hw *ah = sc->sc_ah; -- struct ath_common *common = ath9k_hw_common(ah); -- int i, j, npend = 0; -+ int timeout = 200; /* ms */ -+ int i, j; - -+ ath9k_ps_wakeup(sc); - mutex_lock(&sc->mutex); - - cancel_delayed_work_sync(&sc->tx_complete_work); - -- for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { -- if (!ATH_TXQ_SETUP(sc, i)) -- continue; -- txq = &sc->tx.txq[i]; -- -- if (!drop) { -- for (j = 0; j < ATH_FLUSH_TIMEOUT; j++) { -- if (!ath9k_has_pending_frames(sc, txq)) -- break; -- usleep_range(1000, 2000); -- } -- } -+ if (drop) -+ timeout = 1; -+ -+ for (j = 0; j < timeout; j++) { -+ int npend = 0; -+ -+ if (j) -+ usleep_range(1000, 2000); - -- if (drop || ath9k_has_pending_frames(sc, txq)) { -- ath_dbg(common, ATH_DBG_QUEUE, "Drop frames from hw queue:%d\n", -- txq->axq_qnum); -- spin_lock_bh(&txq->axq_lock); -- txq->txq_flush_inprogress = true; -- spin_unlock_bh(&txq->axq_lock); -- -- ath9k_ps_wakeup(sc); -- ath9k_hw_stoptxdma(ah, txq->axq_qnum); -- npend = ath9k_hw_numtxpending(ah, txq->axq_qnum); -- ath9k_ps_restore(sc); -- if (npend) -- break; -+ for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { -+ if (!ATH_TXQ_SETUP(sc, i)) -+ continue; - -- ath_draintxq(sc, txq, false); -- txq->txq_flush_inprogress = false; -+ npend += ath9k_has_pending_frames(sc, &sc->tx.txq[i]); - } -+ -+ if (!npend) -+ goto out; - } - -- if (npend) { -+ if (!ath_drain_all_txq(sc, false)) - ath_reset(sc, false); -- txq->txq_flush_inprogress = false; -- } - -+out: - ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); - mutex_unlock(&sc->mutex); -+ ath9k_ps_restore(sc); - } - - struct ieee80211_ops ath9k_ops = { ---- a/drivers/net/wireless/ath/ath9k/ath9k.h -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -189,7 +189,6 @@ struct ath_txq { - u32 axq_ampdu_depth; - bool stopped; - bool axq_tx_inprogress; -- bool txq_flush_inprogress; - struct list_head axq_acq; - struct list_head txq_fifo[ATH_TXFIFO_DEPTH]; - struct list_head txq_fifo_pending; ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -2091,8 +2091,7 @@ static void ath_tx_processq(struct ath_s - spin_lock_bh(&txq->axq_lock); - if (list_empty(&txq->axq_q)) { - txq->axq_link = NULL; -- if (sc->sc_flags & SC_OP_TXAGGR && -- !txq->txq_flush_inprogress) -+ if (sc->sc_flags & SC_OP_TXAGGR) - ath_txq_schedule(sc, txq); - spin_unlock_bh(&txq->axq_lock); - break; -@@ -2173,7 +2172,7 @@ static void ath_tx_processq(struct ath_s - - spin_lock_bh(&txq->axq_lock); - -- if (sc->sc_flags & SC_OP_TXAGGR && !txq->txq_flush_inprogress) -+ if (sc->sc_flags & SC_OP_TXAGGR) - ath_txq_schedule(sc, txq); - spin_unlock_bh(&txq->axq_lock); - } -@@ -2317,18 +2316,17 @@ void ath_tx_edma_tasklet(struct ath_soft - - spin_lock_bh(&txq->axq_lock); - -- if (!txq->txq_flush_inprogress) { -- if (!list_empty(&txq->txq_fifo_pending)) { -- INIT_LIST_HEAD(&bf_head); -- bf = list_first_entry(&txq->txq_fifo_pending, -- struct ath_buf, list); -- list_cut_position(&bf_head, -- &txq->txq_fifo_pending, -- &bf->bf_lastbf->list); -- ath_tx_txqaddbuf(sc, txq, &bf_head); -- } else if (sc->sc_flags & SC_OP_TXAGGR) -- ath_txq_schedule(sc, txq); -- } -+ if (!list_empty(&txq->txq_fifo_pending)) { -+ INIT_LIST_HEAD(&bf_head); -+ bf = list_first_entry(&txq->txq_fifo_pending, -+ struct ath_buf, list); -+ list_cut_position(&bf_head, -+ &txq->txq_fifo_pending, -+ &bf->bf_lastbf->list); -+ ath_tx_txqaddbuf(sc, txq, &bf_head); -+ } else if (sc->sc_flags & SC_OP_TXAGGR) -+ ath_txq_schedule(sc, txq); -+ - spin_unlock_bh(&txq->axq_lock); - } - } diff --git a/package/mac80211/patches/573-ath9k_beacon_stop.patch b/package/mac80211/patches/573-ath9k_beacon_stop.patch deleted file mode 100644 index 5574d1716..000000000 --- a/package/mac80211/patches/573-ath9k_beacon_stop.patch +++ /dev/null @@ -1,143 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/mac.c -+++ b/drivers/net/wireless/ath/ath9k/mac.c -@@ -171,84 +171,31 @@ void ath9k_hw_abort_tx_dma(struct ath_hw - } - EXPORT_SYMBOL(ath9k_hw_abort_tx_dma); - --bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q) -+bool ath9k_hw_stop_dma_queue(struct ath_hw *ah, u32 q) - { --#define ATH9K_TX_STOP_DMA_TIMEOUT 4000 /* usec */ -+#define ATH9K_TX_STOP_DMA_TIMEOUT 1000 /* usec */ - #define ATH9K_TIME_QUANTUM 100 /* usec */ -- struct ath_common *common = ath9k_hw_common(ah); -- struct ath9k_hw_capabilities *pCap = &ah->caps; -- struct ath9k_tx_queue_info *qi; -- u32 tsfLow, j, wait; -- u32 wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM; -- -- if (q >= pCap->total_queues) { -- ath_dbg(common, ATH_DBG_QUEUE, -- "Stopping TX DMA, invalid queue: %u\n", q); -- return false; -- } -- -- qi = &ah->txq[q]; -- if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) { -- ath_dbg(common, ATH_DBG_QUEUE, -- "Stopping TX DMA, inactive queue: %u\n", q); -- return false; -- } -+ int wait_time = ATH9K_TX_STOP_DMA_TIMEOUT / ATH9K_TIME_QUANTUM; -+ int wait; - - REG_WRITE(ah, AR_Q_TXD, 1 << q); - - for (wait = wait_time; wait != 0; wait--) { -- if (ath9k_hw_numtxpending(ah, q) == 0) -- break; -- udelay(ATH9K_TIME_QUANTUM); -- } -- -- if (ath9k_hw_numtxpending(ah, q)) { -- ath_dbg(common, ATH_DBG_QUEUE, -- "%s: Num of pending TX Frames %d on Q %d\n", -- __func__, ath9k_hw_numtxpending(ah, q), q); -- -- for (j = 0; j < 2; j++) { -- tsfLow = REG_READ(ah, AR_TSF_L32); -- REG_WRITE(ah, AR_QUIET2, -- SM(10, AR_QUIET2_QUIET_DUR)); -- REG_WRITE(ah, AR_QUIET_PERIOD, 100); -- REG_WRITE(ah, AR_NEXT_QUIET_TIMER, tsfLow >> 10); -- REG_SET_BIT(ah, AR_TIMER_MODE, -- AR_QUIET_TIMER_EN); -- -- if ((REG_READ(ah, AR_TSF_L32) >> 10) == (tsfLow >> 10)) -- break; -- -- ath_dbg(common, ATH_DBG_QUEUE, -- "TSF has moved while trying to set quiet time TSF: 0x%08x\n", -- tsfLow); -- } -- -- REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); -- -- udelay(200); -- REG_CLR_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); -- -- wait = wait_time; -- while (ath9k_hw_numtxpending(ah, q)) { -- if ((--wait) == 0) { -- ath_err(common, -- "Failed to stop TX DMA in 100 msec after killing last frame\n"); -- break; -- } -+ if (wait != wait_time) - udelay(ATH9K_TIME_QUANTUM); -- } - -- REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); -+ if (ath9k_hw_numtxpending(ah, q) == 0) -+ break; - } - - REG_WRITE(ah, AR_Q_TXD, 0); -+ - return wait != 0; - - #undef ATH9K_TX_STOP_DMA_TIMEOUT - #undef ATH9K_TIME_QUANTUM - } --EXPORT_SYMBOL(ath9k_hw_stoptxdma); -+EXPORT_SYMBOL(ath9k_hw_stop_dma_queue); - - void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs) - { ---- a/drivers/net/wireless/ath/ath9k/mac.h -+++ b/drivers/net/wireless/ath/ath9k/mac.h -@@ -675,7 +675,7 @@ void ath9k_hw_txstart(struct ath_hw *ah, - void ath9k_hw_cleartxdesc(struct ath_hw *ah, void *ds); - u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q); - bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel); --bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q); -+bool ath9k_hw_stop_dma_queue(struct ath_hw *ah, u32 q); - void ath9k_hw_abort_tx_dma(struct ath_hw *ah); - void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs); - bool ath9k_hw_set_txq_props(struct ath_hw *ah, int q, ---- a/drivers/net/wireless/ath/ath9k/beacon.c -+++ b/drivers/net/wireless/ath/ath9k/beacon.c -@@ -373,6 +373,7 @@ void ath_beacon_tasklet(unsigned long da - ath_dbg(common, ATH_DBG_BSTUCK, - "missed %u consecutive beacons\n", - sc->beacon.bmisscnt); -+ ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq); - ath9k_hw_bstuck_nfcal(ah); - } else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) { - ath_dbg(common, ATH_DBG_BSTUCK, -@@ -450,16 +451,6 @@ void ath_beacon_tasklet(unsigned long da - sc->beacon.updateslot = OK; - } - if (bfaddr != 0) { -- /* -- * Stop any current dma and put the new frame(s) on the queue. -- * This should never fail since we check above that no frames -- * are still pending on the queue. -- */ -- if (!ath9k_hw_stoptxdma(ah, sc->beacon.beaconq)) { -- ath_err(common, "beacon queue %u did not stop?\n", -- sc->beacon.beaconq); -- } -- - /* NB: cabq traffic should already be queued and primed */ - ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bfaddr); - ath9k_hw_txstart(ah, sc->beacon.beaconq); -@@ -780,7 +771,7 @@ void ath9k_set_beaconing_status(struct a - ah->imask &= ~ATH9K_INT_SWBA; - ath9k_hw_set_interrupts(ah, ah->imask); - tasklet_kill(&sc->bcon_tasklet); -- ath9k_hw_stoptxdma(ah, sc->beacon.beaconq); -+ ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq); - } - ath9k_ps_restore(sc); - } diff --git a/package/mac80211/patches/581-mac80211_chantype_change_fix.patch b/package/mac80211/patches/581-mac80211_chantype_change_fix.patch deleted file mode 100644 index b855d1d80..000000000 --- a/package/mac80211/patches/581-mac80211_chantype_change_fix.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/net/mac80211/chan.c -+++ b/net/mac80211/chan.c -@@ -77,6 +77,9 @@ bool ieee80211_set_channel_type(struct i - switch (tmp->vif.bss_conf.channel_type) { - case NL80211_CHAN_NO_HT: - case NL80211_CHAN_HT20: -+ if (superchan > tmp->vif.bss_conf.channel_type) -+ break; -+ - superchan = tmp->vif.bss_conf.channel_type; - break; - case NL80211_CHAN_HT40PLUS: diff --git a/package/mac80211/patches/590-ath9k_tid_cleanup_send_bar.patch b/package/mac80211/patches/590-ath9k_tid_cleanup_send_bar.patch deleted file mode 100644 index 0f5848591..000000000 --- a/package/mac80211/patches/590-ath9k_tid_cleanup_send_bar.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -166,7 +166,7 @@ static void ath_tx_flush_tid(struct ath_ - fi = get_frame_info(bf->bf_mpdu); - if (fi->retries) { - ath_tx_update_baw(sc, tid, fi->seqno); -- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0); -+ ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 1); - } else { - ath_tx_send_normal(sc, txq, NULL, &bf_head); - } diff --git a/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch b/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch index c60d51a21..ebc7c6bee 100644 --- a/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch +++ b/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/mwl8k.c +++ b/drivers/net/wireless/mwl8k.c -@@ -4502,6 +4502,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw") +@@ -4500,6 +4500,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw") MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API)); static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = { diff --git a/package/mac80211/patches/710-p54_rssi_crash_fix.patch b/package/mac80211/patches/710-p54_rssi_crash_fix.patch deleted file mode 100644 index 73089cda5..000000000 --- a/package/mac80211/patches/710-p54_rssi_crash_fix.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/drivers/net/wireless/p54/eeprom.c -+++ b/drivers/net/wireless/p54/eeprom.c -@@ -524,10 +524,13 @@ err_data: - - struct p54_rssi_db_entry *p54_rssi_find(struct p54_common *priv, const u16 freq) - { -- struct p54_rssi_db_entry *entry = (void *)(priv->rssi_db->data + -- priv->rssi_db->offset); -+ struct p54_rssi_db_entry *entry; - int i, found = -1; - -+ if (!priv->rssi_db) -+ return &p54_rssi_default; -+ -+ entry = (void *)(priv->rssi_db->data + priv->rssi_db->offset); - for (i = 0; i < priv->rssi_db->entries; i++) { - if (!same_band(freq, entry[i].freq)) - continue; diff --git a/package/mac80211/patches/720-mac80211-print-restart-warning.patch b/package/mac80211/patches/720-mac80211-print-restart-warning.patch deleted file mode 100644 index 7a2859853..000000000 --- a/package/mac80211/patches/720-mac80211-print-restart-warning.patch +++ /dev/null @@ -1,14 +0,0 @@ -Index: compat-wireless-2011-02-25/net/mac80211/main.c -=================================================================== ---- compat-wireless-2011-02-25.orig/net/mac80211/main.c 2011-03-07 12:58:14.996968980 +0100 -+++ compat-wireless-2011-02-25/net/mac80211/main.c 2011-03-07 13:03:26.732273903 +0100 -@@ -384,6 +384,9 @@ void ieee80211_restart_hw(struct ieee802 - - trace_api_restart_hw(local); - -+ wiphy_info(hw->wiphy, -+ "Hardware restart was requested\n"); -+ - /* use this reason, ieee80211_reconfig will unblock it */ - ieee80211_stop_queues_by_reason(hw, - IEEE80211_QUEUE_STOP_REASON_SUSPEND); diff --git a/package/mac80211/patches/721-mac80211-fix-scan-race.patch b/package/mac80211/patches/721-mac80211-fix-scan-race.patch deleted file mode 100644 index efc01b176..000000000 --- a/package/mac80211/patches/721-mac80211-fix-scan-race.patch +++ /dev/null @@ -1,141 +0,0 @@ -Index: compat-wireless-2011-02-25/net/mac80211/scan.c -=================================================================== ---- compat-wireless-2011-02-25.orig/net/mac80211/scan.c 2011-03-07 14:43:55.695666042 +0100 -+++ compat-wireless-2011-02-25/net/mac80211/scan.c 2011-03-07 14:43:57.594439631 +0100 -@@ -258,10 +258,12 @@ static bool ieee80211_prep_hw_scan(struc - return true; - } - --static bool __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted, -+static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted, - bool was_hw_scan) - { - struct ieee80211_local *local = hw_to_local(hw); -+ bool on_oper_chan; -+ bool enable_beacons = false; - - lockdep_assert_held(&local->mtx); - -@@ -275,12 +277,12 @@ static bool __ieee80211_scan_completed(s - aborted = true; - - if (WARN_ON(!local->scan_req)) -- return false; -+ return; - - if (was_hw_scan && !aborted && ieee80211_prep_hw_scan(local)) { - int rc = drv_hw_scan(local, local->scan_sdata, local->hw_scan_req); - if (rc == 0) -- return false; -+ return; - } - - kfree(local->hw_scan_req); -@@ -294,26 +296,13 @@ static bool __ieee80211_scan_completed(s - local->scanning = 0; - local->scan_channel = NULL; - -- return true; --} -- --static void __ieee80211_scan_completed_finish(struct ieee80211_hw *hw, -- bool was_hw_scan) --{ -- struct ieee80211_local *local = hw_to_local(hw); -- bool on_oper_chan; -- bool enable_beacons = false; -- -- mutex_lock(&local->mtx); - on_oper_chan = ieee80211_cfg_on_oper_channel(local); - - WARN_ON(local->scanning & (SCAN_SW_SCANNING | SCAN_HW_SCANNING)); - -- if (was_hw_scan || !on_oper_chan) { -- if (WARN_ON(local->scan_channel)) -- local->scan_channel = NULL; -+ if (was_hw_scan || !on_oper_chan) - ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); -- } else -+ else - /* Set power back to normal operating levels. */ - ieee80211_hw_config(local, 0); - -@@ -331,7 +320,6 @@ static void __ieee80211_scan_completed_f - } - - ieee80211_recalc_idle(local); -- mutex_unlock(&local->mtx); - - ieee80211_mlme_notify_scan_completed(local); - ieee80211_ibss_notify_scan_completed(local); -@@ -686,12 +674,14 @@ void ieee80211_scan_work(struct work_str - { - struct ieee80211_local *local = - container_of(work, struct ieee80211_local, scan_work.work); -- struct ieee80211_sub_if_data *sdata = local->scan_sdata; -+ struct ieee80211_sub_if_data *sdata; - unsigned long next_delay = 0; -- bool aborted, hw_scan, finish; -+ bool aborted, hw_scan; - - mutex_lock(&local->mtx); - -+ sdata = local->scan_sdata; -+ - if (test_and_clear_bit(SCAN_COMPLETED, &local->scanning)) { - aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning); - goto out_complete; -@@ -755,17 +745,11 @@ void ieee80211_scan_work(struct work_str - } while (next_delay == 0); - - ieee80211_queue_delayed_work(&local->hw, &local->scan_work, next_delay); -- mutex_unlock(&local->mtx); -- return; -+ goto out; - - out_complete: - hw_scan = test_bit(SCAN_HW_SCANNING, &local->scanning); -- finish = __ieee80211_scan_completed(&local->hw, aborted, hw_scan); -- mutex_unlock(&local->mtx); -- if (finish) -- __ieee80211_scan_completed_finish(&local->hw, hw_scan); -- return; -- -+ __ieee80211_scan_completed(&local->hw, aborted, hw_scan); - out: - mutex_unlock(&local->mtx); - } -@@ -835,7 +819,6 @@ int ieee80211_request_internal_scan(stru - void ieee80211_scan_cancel(struct ieee80211_local *local) - { - bool abortscan; -- bool finish = false; - - /* - * We are only canceling software scan, or deferred scan that was not -@@ -855,14 +838,17 @@ void ieee80211_scan_cancel(struct ieee80 - - mutex_lock(&local->mtx); - abortscan = local->scan_req && !test_bit(SCAN_HW_SCANNING, &local->scanning); -- if (abortscan) -- finish = __ieee80211_scan_completed(&local->hw, true, false); -- mutex_unlock(&local->mtx); -- - if (abortscan) { -- /* The scan is canceled, but stop work from being pending */ -- cancel_delayed_work_sync(&local->scan_work); -+ /* -+ * The scan is canceled, but stop work from being pending. -+ * -+ * If the work is currently running, it must be blocked on -+ * the mutex, but we'll set scan_sdata = NULL and it'll -+ * simply exit once it acquires the mutex. -+ */ -+ cancel_delayed_work(&local->scan_work); -+ /* and clean up */ -+ __ieee80211_scan_completed(&local->hw, true, false); - } -- if (finish) -- __ieee80211_scan_completed_finish(&local->hw, false); -+ mutex_unlock(&local->mtx); - } |