|
@@ -3777,7 +3777,9 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
|
|
|
enum ath10k_hw_txrx_mode txmode;
|
|
|
enum ath10k_mac_tx_path txpath;
|
|
|
struct sk_buff *skb;
|
|
|
+ struct ieee80211_hdr *hdr;
|
|
|
size_t skb_len;
|
|
|
+ bool is_mgmt, is_presp;
|
|
|
int ret;
|
|
|
|
|
|
spin_lock_bh(&ar->htt.tx_lock);
|
|
@@ -3801,6 +3803,22 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
|
|
|
skb_len = skb->len;
|
|
|
txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
|
|
|
txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
|
|
|
+ is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
|
|
|
+
|
|
|
+ if (is_mgmt) {
|
|
|
+ hdr = (struct ieee80211_hdr *)skb->data;
|
|
|
+ is_presp = ieee80211_is_probe_resp(hdr->frame_control);
|
|
|
+
|
|
|
+ spin_lock_bh(&ar->htt.tx_lock);
|
|
|
+ ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
|
|
|
+
|
|
|
+ if (ret) {
|
|
|
+ ath10k_htt_tx_dec_pending(htt);
|
|
|
+ spin_unlock_bh(&ar->htt.tx_lock);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ spin_unlock_bh(&ar->htt.tx_lock);
|
|
|
+ }
|
|
|
|
|
|
ret = ath10k_mac_tx(ar, vif, sta, txmode, txpath, skb);
|
|
|
if (unlikely(ret)) {
|
|
@@ -3808,6 +3826,8 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
|
|
|
|
|
|
spin_lock_bh(&ar->htt.tx_lock);
|
|
|
ath10k_htt_tx_dec_pending(htt);
|
|
|
+ if (is_mgmt)
|
|
|
+ ath10k_htt_tx_mgmt_dec_pending(htt);
|
|
|
spin_unlock_bh(&ar->htt.tx_lock);
|
|
|
|
|
|
return ret;
|