From: Ben Greear <[email protected]> This lets ath10k-ct compile.
Signed-off-by: Ben Greear <[email protected]> --- This and next 2 patches are against chaos-calmer tree. This seems to allow ath10k-ct driver and firmware to work for me, and should help the next person trying such a thing. .../mac80211/patches/9997-mac80211-txq-depth.patch | 127 +++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 package/kernel/mac80211/patches/9997-mac80211-txq-depth.patch diff --git a/package/kernel/mac80211/patches/9997-mac80211-txq-depth.patch b/package/kernel/mac80211/patches/9997-mac80211-txq-depth.patch new file mode 100644 index 0000000..37f8eef --- /dev/null +++ b/package/kernel/mac80211/patches/9997-mac80211-txq-depth.patch @@ -0,0 +1,127 @@ +From f2ac7e301ae6397669ff3f79e691942a9b5d2f39 Mon Sep 17 00:00:00 2001 +From: Michal Kazior <[email protected]> +Date: Wed, 27 Jan 2016 15:26:12 +0100 +Subject: mac80211: expose txq queue depth and size to drivers + +This will allow drivers to make more educated +decisions whether to defer transmission or not. + +Relying on wake_tx_queue() call count implicitly +was not possible because it could be called +without queued frame count actually changing on +software tx aggregation start/stop code paths. + +It was also not possible to know how long +byte-wise queue was without dequeueing. + +Signed-off-by: Michal Kazior <[email protected]> +Signed-off-by: Johannes Berg <[email protected]> + +diff --git a/include/net/mac80211.h b/include/net/mac80211.h +index dbcd69a..fd35fc4 100644 +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -5596,4 +5596,19 @@ void ieee80211_unreserve_tid(struct ieee80211_sta *sta, u8 tid); + */ + struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, + struct ieee80211_txq *txq); ++ ++/** ++ * ieee80211_txq_get_depth - get pending frame/byte count of given txq ++ * ++ * The values are not guaranteed to be coherent with regard to each other, i.e. ++ * txq state can change half-way of this function and the caller may end up ++ * with "new" frame_cnt and "old" byte_cnt or vice-versa. ++ * ++ * @txq: pointer obtained from station or virtual interface ++ * @frame_cnt: pointer to store frame count ++ * @byte_cnt: pointer to store byte count ++ */ ++void ieee80211_txq_get_depth(struct ieee80211_txq *txq, ++ unsigned long *frame_cnt, ++ unsigned long *byte_cnt); + #endif /* MAC80211_H */ +diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h +index a29f61d..a96f8c0 100644 +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -804,6 +804,7 @@ enum txq_info_flags { + struct txq_info { + struct sk_buff_head queue; + unsigned long flags; ++ unsigned long byte_cnt; + + /* keep last! */ + struct ieee80211_txq txq; +diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c +index 0451f12..453b4e74 100644 +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -979,6 +979,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, + + spin_lock_bh(&txqi->queue.lock); + ieee80211_purge_tx_queue(&local->hw, &txqi->queue); ++ txqi->byte_cnt = 0; + spin_unlock_bh(&txqi->queue.lock); + + atomic_set(&sdata->txqs_len[txqi->txq.ac], 0); +diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c +index b28e7a2..5894c0a 100644 +--- a/net/mac80211/sta_info.c ++++ b/net/mac80211/sta_info.c +@@ -116,6 +116,7 @@ static void __cleanup_single_sta(struct sta_info *sta) + + ieee80211_purge_tx_queue(&local->hw, &txqi->queue); + atomic_sub(n, &sdata->txqs_len[txqi->txq.ac]); ++ txqi->byte_cnt = 0; + } + } + +diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c +index 723cd7a..a5aa275 100644 +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -1270,7 +1270,11 @@ static void ieee80211_drv_tx(struct ieee80211_local *local, + if (atomic_read(&sdata->txqs_len[ac]) >= local->hw.txq_ac_max_pending) + netif_stop_subqueue(sdata->dev, ac); + +- skb_queue_tail(&txqi->queue, skb); ++ spin_lock_bh(&txqi->queue.lock); ++ txqi->byte_cnt += skb->len; ++ __skb_queue_tail(&txqi->queue, skb); ++ spin_unlock_bh(&txqi->queue.lock); ++ + drv_wake_tx_queue(local, txqi); + + return; +@@ -1298,6 +1302,8 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, + if (!skb) + goto out; + ++ txqi->byte_cnt -= skb->len; ++ + atomic_dec(&sdata->txqs_len[ac]); + if (__netif_subqueue_stopped(sdata->dev, ac)) + ieee80211_propagate_queue_wake(local, sdata->vif.hw_queue[ac]); +diff --git a/net/mac80211/util.c b/net/mac80211/util.c +index fb90d9c..091f3dd 100644 +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -3368,3 +3368,17 @@ void ieee80211_init_tx_queue(struct ieee80211_sub_if_data *sdata, + txqi->txq.ac = IEEE80211_AC_BE; + } + } ++ ++void ieee80211_txq_get_depth(struct ieee80211_txq *txq, ++ unsigned long *frame_cnt, ++ unsigned long *byte_cnt) ++{ ++ struct txq_info *txqi = to_txq_info(txq); ++ ++ if (frame_cnt) ++ *frame_cnt = txqi->queue.qlen; ++ ++ if (byte_cnt) ++ *byte_cnt = txqi->byte_cnt; ++} ++EXPORT_SYMBOL(ieee80211_txq_get_depth); -- 2.4.11 _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
