--- /dev/null
+--- 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;