summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch')
-rw-r--r--package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch334
1 files changed, 0 insertions, 334 deletions
diff --git a/package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch b/package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch
deleted file mode 100644
index b6d9a8426..000000000
--- a/package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch
+++ /dev/null
@@ -1,334 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ath9k.h
-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -200,6 +200,7 @@ struct ath_atx_ac {
- int sched;
- struct list_head list;
- struct list_head tid_q;
-+ bool clear_ps_filter;
- };
-
- struct ath_frame_info {
-@@ -257,6 +258,8 @@ struct ath_node {
- struct ath_atx_ac ac[WME_NUM_AC];
- u16 maxampdu;
- u8 mpdudensity;
-+
-+ bool sleeping;
- };
-
- #define AGGR_CLEANUP BIT(1)
-@@ -338,6 +341,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);
-
-+void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an);
-+bool ath_tx_aggr_sleep(struct ath_softc *sc, struct ath_node *an);
-+
- /********/
- /* VIFs */
- /********/
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1792,6 +1792,27 @@ static int ath9k_sta_remove(struct ieee8
- return 0;
- }
-
-+static void ath9k_sta_notify(struct ieee80211_hw *hw,
-+ struct ieee80211_vif *vif,
-+ enum sta_notify_cmd cmd,
-+ struct ieee80211_sta *sta)
-+{
-+ struct ath_softc *sc = hw->priv;
-+ struct ath_node *an = (struct ath_node *) sta->drv_priv;
-+
-+ switch (cmd) {
-+ case STA_NOTIFY_SLEEP:
-+ an->sleeping = true;
-+ if (ath_tx_aggr_sleep(sc, an))
-+ ieee80211_sta_set_tim(sta);
-+ break;
-+ case STA_NOTIFY_AWAKE:
-+ an->sleeping = false;
-+ ath_tx_aggr_wakeup(sc, an);
-+ break;
-+ }
-+}
-+
- static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
- const struct ieee80211_tx_queue_params *params)
- {
-@@ -2198,6 +2219,7 @@ struct ieee80211_ops ath9k_ops = {
- .configure_filter = ath9k_configure_filter,
- .sta_add = ath9k_sta_add,
- .sta_remove = ath9k_sta_remove,
-+ .sta_notify = ath9k_sta_notify,
- .conf_tx = ath9k_conf_tx,
- .bss_info_changed = ath9k_bss_info_changed,
- .set_key = ath9k_set_key,
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -357,6 +357,7 @@ static void ath_tx_complete_aggr(struct
- struct ath_frame_info *fi;
- int nframes;
- u8 tidno;
-+ bool clear_filter;
-
- skb = bf->bf_mpdu;
- hdr = (struct ieee80211_hdr *)skb->data;
-@@ -441,22 +442,24 @@ static void ath_tx_complete_aggr(struct
- /* transmit completion */
- acked_cnt++;
- } else {
-- if (!(tid->state & AGGR_CLEANUP) && retry) {
-- if (fi->retries < ATH_MAX_SW_RETRIES) {
-- ath_tx_set_retry(sc, txq, bf->bf_mpdu);
-- txpending = 1;
-- } else {
-- bf->bf_state.bf_type |= BUF_XRETRY;
-- txfail = 1;
-- sendbar = 1;
-- txfail_cnt++;
-- }
-- } else {
-+ if ((tid->state & AGGR_CLEANUP) || !retry) {
- /*
- * cleanup in progress, just fail
- * the un-acked sub-frames
- */
- txfail = 1;
-+ } else if (fi->retries < ATH_MAX_SW_RETRIES) {
-+ if (!(ts->ts_status & ATH9K_TXERR_FILT) ||
-+ !an->sleeping)
-+ ath_tx_set_retry(sc, txq, bf->bf_mpdu);
-+
-+ clear_filter = true;
-+ txpending = 1;
-+ } else {
-+ bf->bf_state.bf_type |= BUF_XRETRY;
-+ txfail = 1;
-+ sendbar = 1;
-+ txfail_cnt++;
- }
- }
-
-@@ -496,6 +499,7 @@ static void ath_tx_complete_aggr(struct
- !txfail, sendbar);
- } else {
- /* retry the un-acked ones */
-+ ath9k_hw_set_clrdmask(sc->sc_ah, bf->bf_desc, false);
- if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) {
- if (bf->bf_next == NULL && bf_last->bf_stale) {
- struct ath_buf *tbf;
-@@ -546,7 +550,12 @@ static void ath_tx_complete_aggr(struct
-
- /* prepend un-acked frames to the beginning of the pending frame queue */
- if (!list_empty(&bf_pending)) {
-+ if (an->sleeping)
-+ ieee80211_sta_set_tim(sta);
-+
- spin_lock_bh(&txq->axq_lock);
-+ if (clear_filter)
-+ tid->ac->clear_ps_filter = true;
- list_splice(&bf_pending, &tid->buf_q);
- ath_tx_queue_tid(txq, tid);
- spin_unlock_bh(&txq->axq_lock);
-@@ -816,6 +825,11 @@ static void ath_tx_sched_aggr(struct ath
- bf = list_first_entry(&bf_q, struct ath_buf, list);
- bf->bf_lastbf = list_entry(bf_q.prev, struct ath_buf, list);
-
-+ if (tid->ac->clear_ps_filter) {
-+ tid->ac->clear_ps_filter = false;
-+ ath9k_hw_set_clrdmask(sc->sc_ah, bf->bf_desc, true);
-+ }
-+
- /* if only one frame, send as non-aggregate */
- if (bf == bf->bf_lastbf) {
- fi = get_frame_info(bf->bf_mpdu);
-@@ -896,6 +910,67 @@ void ath_tx_aggr_stop(struct ath_softc *
- ath_tx_flush_tid(sc, txtid);
- }
-
-+bool ath_tx_aggr_sleep(struct ath_softc *sc, struct ath_node *an)
-+{
-+ struct ath_atx_tid *tid;
-+ struct ath_atx_ac *ac;
-+ struct ath_txq *txq;
-+ bool buffered = false;
-+ int tidno;
-+
-+ for (tidno = 0, tid = &an->tid[tidno];
-+ tidno < WME_NUM_TID; tidno++, tid++) {
-+
-+ if (!tid->sched)
-+ continue;
-+
-+ ac = tid->ac;
-+ txq = ac->txq;
-+
-+ spin_lock_bh(&txq->axq_lock);
-+
-+ if (!list_empty(&tid->buf_q))
-+ buffered = true;
-+
-+ tid->sched = false;
-+ list_del(&tid->list);
-+
-+ if (ac->sched) {
-+ ac->sched = false;
-+ list_del(&ac->list);
-+ }
-+
-+ spin_unlock_bh(&txq->axq_lock);
-+ }
-+
-+ return buffered;
-+}
-+
-+void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an)
-+{
-+ struct ath_atx_tid *tid;
-+ struct ath_atx_ac *ac;
-+ struct ath_txq *txq;
-+ int tidno;
-+
-+ for (tidno = 0, tid = &an->tid[tidno];
-+ tidno < WME_NUM_TID; tidno++, tid++) {
-+
-+ ac = tid->ac;
-+ txq = ac->txq;
-+
-+ spin_lock_bh(&txq->axq_lock);
-+ ac->clear_ps_filter = true;
-+
-+ if (!list_empty(&tid->buf_q) && !tid->paused) {
-+ ath_tx_queue_tid(txq, tid);
-+ ath_txq_schedule(sc, txq);
-+ }
-+
-+ spin_unlock_bh(&txq->axq_lock);
-+ }
-+}
-+
- void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
- {
- struct ath_atx_tid *txtid;
-@@ -1491,7 +1566,6 @@ static int setup_tx_flags(struct sk_buff
- struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
- int flags = 0;
-
-- flags |= ATH9K_TXDESC_CLRDMASK; /* needed for crypto errors */
- flags |= ATH9K_TXDESC_INTREQ;
-
- if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK)
-@@ -1754,6 +1828,9 @@ static void ath_tx_start_dma(struct ath_
- if (txctl->paprd)
- bf->bf_state.bfs_paprd_timestamp = jiffies;
-
-+ if (tx_info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT)
-+ ath9k_hw_set_clrdmask(sc->sc_ah, bf->bf_desc, true);
-+
- ath_tx_send_normal(sc, txctl->txq, tid, &bf_head);
- }
-
---- a/drivers/net/wireless/ath/ath9k/hw-ops.h
-+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
-@@ -122,6 +122,11 @@ static inline void ath9k_hw_set11n_burst
- ath9k_hw_ops(ah)->set11n_burstduration(ah, ds, burstDuration);
- }
-
-+static inline void ath9k_hw_set_clrdmask(struct ath_hw *ah, void *ds, bool val)
-+{
-+ ath9k_hw_ops(ah)->set_clrdmask(ah, ds, val);
-+}
-+
- /* Private hardware call ops */
-
- /* PHY ops */
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -626,6 +626,7 @@ struct ath_hw_ops {
- void (*clr11n_aggr)(struct ath_hw *ah, void *ds);
- void (*set11n_burstduration)(struct ath_hw *ah, void *ds,
- u32 burstDuration);
-+ void (*set_clrdmask)(struct ath_hw *ah, void *ds, bool val);
- };
-
- struct ath_nf_limits {
---- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
-@@ -290,7 +290,6 @@ static void ar9002_hw_set11n_txdesc(stru
- | (flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0)
- | SM(txPower, AR_XmitPower)
- | (flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0)
-- | (flags & ATH9K_TXDESC_CLRDMASK ? AR_ClrDestMask : 0)
- | (flags & ATH9K_TXDESC_INTREQ ? AR_TxIntrReq : 0)
- | (keyIx != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0);
-
-@@ -311,6 +310,16 @@ static void ar9002_hw_set11n_txdesc(stru
- }
- }
-
-+static void ar9002_hw_set_clrdmask(struct ath_hw *ah, void *ds, bool val)
-+{
-+ struct ar5416_desc *ads = AR5416DESC(ds);
-+
-+ if (val)
-+ ads->ds_ctl0 |= AR_ClrDestMask;
-+ else
-+ ads->ds_ctl0 &= ~AR_ClrDestMask;
-+}
-+
- static void ar9002_hw_set11n_ratescenario(struct ath_hw *ah, void *ds,
- void *lastds,
- u32 durUpdateEn, u32 rtsctsRate,
-@@ -448,4 +457,5 @@ void ar9002_hw_attach_mac_ops(struct ath
- ops->set11n_aggr_last = ar9002_hw_set11n_aggr_last;
- ops->clr11n_aggr = ar9002_hw_clr11n_aggr;
- ops->set11n_burstduration = ar9002_hw_set11n_burstduration;
-+ ops->set_clrdmask = ar9002_hw_set_clrdmask;
- }
---- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-@@ -329,7 +329,6 @@ static void ar9003_hw_set11n_txdesc(stru
- | (flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0)
- | SM(txpower, AR_XmitPower)
- | (flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0)
-- | (flags & ATH9K_TXDESC_CLRDMASK ? AR_ClrDestMask : 0)
- | (keyIx != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0)
- | (flags & ATH9K_TXDESC_LOWRXCHAIN ? AR_LowRxChain : 0);
-
-@@ -350,6 +349,16 @@ static void ar9003_hw_set11n_txdesc(stru
- ads->ctl22 = 0;
- }
-
-+static void ar9003_hw_set_clrdmask(struct ath_hw *ah, void *ds, bool val)
-+{
-+ struct ar9003_txc *ads = (struct ar9003_txc *) ds;
-+
-+ if (val)
-+ ads->ctl11 |= AR_ClrDestMask;
-+ else
-+ ads->ctl11 &= ~AR_ClrDestMask;
-+}
-+
- static void ar9003_hw_set11n_ratescenario(struct ath_hw *ah, void *ds,
- void *lastds,
- u32 durUpdateEn, u32 rtsctsRate,
-@@ -510,6 +519,7 @@ void ar9003_hw_attach_mac_ops(struct ath
- ops->set11n_aggr_last = ar9003_hw_set11n_aggr_last;
- ops->clr11n_aggr = ar9003_hw_clr11n_aggr;
- ops->set11n_burstduration = ar9003_hw_set11n_burstduration;
-+ ops->set_clrdmask = ar9003_hw_set_clrdmask;
- }
-
- void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size)
---- a/drivers/net/wireless/ath/ath9k/mac.h
-+++ b/drivers/net/wireless/ath/ath9k/mac.h
-@@ -239,7 +239,6 @@ struct ath_desc {
- void *ds_vdata;
- } __packed __aligned(4);
-
--#define ATH9K_TXDESC_CLRDMASK 0x0001
- #define ATH9K_TXDESC_NOACK 0x0002
- #define ATH9K_TXDESC_RTSENA 0x0004
- #define ATH9K_TXDESC_CTSENA 0x0008