diff --git a/patches/openwrt/0029-ath9k-add-experimental-patch.patch b/patches/openwrt/0029-ath9k-add-experimental-patch.patch new file mode 100644 index 00000000..32e7e211 --- /dev/null +++ b/patches/openwrt/0029-ath9k-add-experimental-patch.patch @@ -0,0 +1,79 @@ +From: Matthias Schiffer +Date: Tue, 15 Jul 2014 20:08:17 +0200 +Subject: ath9k: add experimental patch + +diff --git a/package/mac80211/patches/950-ath9k-txq.patch b/package/mac80211/patches/950-ath9k-txq.patch +new file mode 100644 +index 0000000..0aa3149 +--- /dev/null ++++ b/package/mac80211/patches/950-ath9k-txq.patch +@@ -0,0 +1,69 @@ ++--- a/drivers/net/wireless/ath/ath9k/ath9k.h +++++ b/drivers/net/wireless/ath/ath9k/ath9k.h ++@@ -185,7 +185,8 @@ struct ath_atx_ac { ++ ++ struct ath_frame_info { ++ struct ath_buf *bf; ++- int framelen; +++ u16 framelen; +++ s8 txq; ++ enum ath9k_key_type keytype; ++ u8 keyix; ++ u8 rtscts_rate; ++--- a/drivers/net/wireless/ath/ath9k/xmit.c +++++ b/drivers/net/wireless/ath/ath9k/xmit.c ++@@ -147,15 +147,13 @@ static void ath_set_rates(struct ieee802 ++ static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq, ++ struct sk_buff *skb) ++ { ++- int q; ++- ++- q = skb_get_queue_mapping(skb); ++- if (txq == sc->tx.uapsdq) ++- txq = sc->tx.txq_map[q]; +++ struct ath_frame_info *fi = get_frame_info(skb); +++ int q = fi->txq; ++ ++- if (txq != sc->tx.txq_map[q]) +++ if (q < 0) ++ return; ++ +++ txq = sc->tx.txq_map[q]; ++ if (WARN_ON(--txq->pending_frames < 0)) ++ txq->pending_frames = 0; ++ ++@@ -1999,6 +1997,7 @@ static void setup_frame_info(struct ieee ++ an = (struct ath_node *) sta->drv_priv; ++ ++ memset(fi, 0, sizeof(*fi)); +++ fi->txq = -1; ++ if (hw_key) ++ fi->keyix = hw_key->hw_key_idx; ++ else if (an && ieee80211_is_data(hdr->frame_control) && an->ps_key > 0) ++@@ -2150,6 +2149,7 @@ int ath_tx_start(struct ieee80211_hw *hw ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_sta *sta = txctl->sta; ++ struct ieee80211_vif *vif = info->control.vif; +++ struct ath_frame_info *fi = get_frame_info(skb); ++ struct ath_softc *sc = hw->priv; ++ struct ath_txq *txq = txctl->txq; ++ struct ath_atx_tid *tid = NULL; ++@@ -2170,11 +2170,13 @@ int ath_tx_start(struct ieee80211_hw *hw ++ q = skb_get_queue_mapping(skb); ++ ++ ath_txq_lock(sc, txq); ++- if (txq == sc->tx.txq_map[q] && ++- ++txq->pending_frames > sc->tx.txq_max_pending[q] && ++- !txq->stopped) { ++- ieee80211_stop_queue(sc->hw, q); ++- txq->stopped = true; +++ if (txq == sc->tx.txq_map[q]) { +++ fi->txq = q; +++ if (++txq->pending_frames > sc->tx.txq_max_pending[q] && +++ !txq->stopped) { +++ ieee80211_stop_queue(sc->hw, q); +++ txq->stopped = true; +++ } ++ } ++ ++ if (txctl->an && ieee80211_is_data_present(hdr->frame_control))