ath10k-ct: use ieee80211_tx_status_ext testing
authorFelix Fietkau <nbd@nbd.name>
Tue, 14 Dec 2021 17:07:32 +0000 (18:07 +0100)
committerFelix Fietkau <nbd@nbd.name>
Tue, 14 Dec 2021 17:07:50 +0000 (18:07 +0100)
Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/kernel/ath10k-ct/patches/400-use_ieee80211_tx_status_ext.patch [new file with mode: 0644]

diff --git a/package/kernel/ath10k-ct/patches/400-use_ieee80211_tx_status_ext.patch b/package/kernel/ath10k-ct/patches/400-use_ieee80211_tx_status_ext.patch
new file mode 100644 (file)
index 0000000..3919ad2
--- /dev/null
@@ -0,0 +1,62 @@
+--- a/ath10k-5.15/txrx.c
++++ b/ath10k-5.15/txrx.c
+@@ -161,7 +161,8 @@ int ath10k_txrx_tx_unref(struct ath10k_h
+ {
+       struct ath10k *ar = htt->ar;
+       struct device *dev = ar->dev;
+-      struct ieee80211_tx_info *info;
++      struct ieee80211_tx_info tx_info = {}, *info;
++      struct ieee80211_tx_status status = {};
+       struct ieee80211_txq *txq;
+       struct ath10k_skb_cb *skb_cb;
+       struct ath10k_txq *artxq;
+@@ -201,10 +202,16 @@ int ath10k_txrx_tx_unref(struct ath10k_h
+       skb_cb = ATH10K_SKB_CB(msdu);
+       txq = skb_cb->txq;
++      status.skb = msdu;
++      rcu_read_lock();
+       if (txq) {
+               artxq = (void *)txq->drv_priv;
+               artxq->num_fw_queued--;
++              status.sta = txq->sta;
++              status.info = info = &tx_info;
++      } else {
++              info = IEEE80211_SKB_CB(msdu);
+       }
+       flags = skb_cb->flags;
+@@ -214,19 +221,15 @@ int ath10k_txrx_tx_unref(struct ath10k_h
+               wake_up(&htt->empty_tx_wq);
+       spin_unlock_bh(&htt->tx_lock);
+-      rcu_read_lock();
+       if (txq && txq->sta && skb_cb->airtime_est)
+               ieee80211_sta_register_airtime(txq->sta, txq->tid,
+                                              skb_cb->airtime_est, 0);
+-      rcu_read_unlock();
+       if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL)
+               dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
+       ath10k_report_offchan_tx(htt->ar, msdu);
+-      info = IEEE80211_SKB_CB(msdu);
+-      memset(&info->status, 0, sizeof(info->status));
+       info->status.rates[0].idx = -1;
+       trace_ath10k_txrx_tx_unref(ar, tx_done->msdu_id);
+@@ -317,7 +320,11 @@ int ath10k_txrx_tx_unref(struct ath10k_h
+       }
+ #endif
+-      ieee80211_tx_status(htt->ar->hw, msdu);
++      if (status.sta)
++              ieee80211_tx_status_ext(htt->ar->hw, &status);
++      else
++              ieee80211_tx_status(htt->ar->hw, msdu);
++      rcu_read_unlock();
+       /* we do not own the msdu anymore */
+       return 0;