From b7dc13b6a4fb30c354141ebba718e8dc8ebfdd37 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 20 Apr 2011 18:14:35 +0000 Subject: mac80211: update to wireless-testing 2011-04-19, contains several beacon related fixes for ath9k git-svn-id: svn://svn.openwrt.org/openwrt/trunk@26744 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../patches/521-ath9k_fix_ap_ps_buffering.patch | 334 --------------------- 1 file changed, 334 deletions(-) delete mode 100644 package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch (limited to 'package/mac80211/patches/521-ath9k_fix_ap_ps_buffering.patch') 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 b6d9a8426e..0000000000 --- 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 -- cgit v1.2.3