[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