[OpenWrt-Devel] [PATCH 1/3] Back port txq-depth patch.

greearb at candelatech.com greearb at candelatech.com
Wed Jan 18 18:15:56 EST 2017


From: Ben Greear <greearb at candelatech.com>

This lets ath10k-ct compile.

Signed-off-by: Ben Greear <greearb at candelatech.com>
---

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 <michal.kazior at tieto.com>
+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 <michal.kazior at tieto.com>
+Signed-off-by: Johannes Berg <johannes.berg at intel.com>
+
+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
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list