aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/310-ath10k-improve-tx-scheduling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/310-ath10k-improve-tx-scheduling.patch')
-rw-r--r--package/kernel/mac80211/patches/310-ath10k-improve-tx-scheduling.patch67
1 files changed, 67 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/310-ath10k-improve-tx-scheduling.patch b/package/kernel/mac80211/patches/310-ath10k-improve-tx-scheduling.patch
new file mode 100644
index 0000000000..81ac2db842
--- /dev/null
+++ b/package/kernel/mac80211/patches/310-ath10k-improve-tx-scheduling.patch
@@ -0,0 +1,67 @@
+From: Michal Kazior <michal.kazior@tieto.com>
+Date: Mon, 23 May 2016 23:12:45 +0300
+Subject: [PATCH] ath10k: improve tx scheduling
+
+Recent changes revolving around implementing
+wake_tx_queue support introduced a significant
+performance regressions on some (slower, uni-proc)
+systems.
+
+Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
+Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
+---
+
+--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
++++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
+@@ -2291,7 +2291,6 @@ bool ath10k_htt_t2h_msg_handler(struct a
+ ath10k_htt_tx_mgmt_dec_pending(htt);
+ spin_unlock_bh(&htt->tx_lock);
+ }
+- ath10k_mac_tx_push_pending(ar);
+ break;
+ }
+ case HTT_T2H_MSG_TYPE_TX_COMPL_IND:
+@@ -2442,8 +2441,6 @@ static void ath10k_htt_txrx_compl_task(u
+ dev_kfree_skb_any(skb);
+ }
+
+- ath10k_mac_tx_push_pending(ar);
+-
+ num_mpdus = atomic_read(&htt->num_mpdus_ready);
+
+ while (num_mpdus) {
+--- a/drivers/net/wireless/ath/ath10k/mac.c
++++ b/drivers/net/wireless/ath/ath10k/mac.c
+@@ -3827,6 +3827,9 @@ void ath10k_mac_tx_push_pending(struct a
+ int ret;
+ int max;
+
++ if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2))
++ return;
++
+ spin_lock_bh(&ar->txqs_lock);
+ rcu_read_lock();
+
+@@ -4097,9 +4100,7 @@ static void ath10k_mac_op_wake_tx_queue(
+ list_add_tail(&artxq->list, &ar->txqs);
+ spin_unlock_bh(&ar->txqs_lock);
+
+- if (ath10k_mac_tx_can_push(hw, txq))
+- tasklet_schedule(&ar->htt.txrx_compl_task);
+-
++ ath10k_mac_tx_push_pending(ar);
+ ath10k_htt_tx_txq_update(hw, txq);
+ }
+
+--- a/drivers/net/wireless/ath/ath10k/txrx.c
++++ b/drivers/net/wireless/ath/ath10k/txrx.c
+@@ -117,6 +117,9 @@ int ath10k_txrx_tx_unref(struct ath10k_h
+
+ ieee80211_tx_status(htt->ar->hw, msdu);
+ /* we do not own the msdu anymore */
++
++ ath10k_mac_tx_push_pending(ar);
++
+ return 0;
+ }
+