OSDN Git Service

ath10k: fix no-ack frame status
authorSujith Manoharan <c_manoha@qca.qualcomm.com>
Wed, 1 Apr 2015 19:53:21 +0000 (22:53 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 9 Apr 2015 12:11:30 +0000 (15:11 +0300)
Use the new IEEE80211_TX_STAT_NOACK_TRANSMITTED flag
to indicate successful transmission of no-ack frames.
This fixes multicast frame accounting.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/htt.h
drivers/net/wireless/ath/ath10k/htt_rx.c
drivers/net/wireless/ath/ath10k/txrx.c

index ef64f30..7e8a0d8 100644 (file)
@@ -1297,6 +1297,7 @@ struct htt_tx_done {
        u32 msdu_id;
        bool discard;
        bool no_ack;
+       bool success;
 };
 
 struct htt_peer_map_event {
index d5395bc..b26e32f 100644 (file)
@@ -1634,6 +1634,7 @@ static void ath10k_htt_rx_frm_tx_compl(struct ath10k *ar,
                tx_done.no_ack = true;
                break;
        case HTT_DATA_TX_STATUS_OK:
+               tx_done.success = true;
                break;
        case HTT_DATA_TX_STATUS_DISCARD:
        case HTT_DATA_TX_STATUS_POSTPONE:
@@ -1983,6 +1984,7 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
 
                switch (status) {
                case HTT_MGMT_TX_STATUS_OK:
+                       tx_done.success = true;
                        break;
                case HTT_MGMT_TX_STATUS_RETRY:
                        tx_done.no_ack = true;
index 3f00cec..826500b 100644 (file)
@@ -55,8 +55,10 @@ void ath10k_txrx_tx_unref(struct ath10k_htt *htt,
 
        lockdep_assert_held(&htt->tx_lock);
 
-       ath10k_dbg(ar, ATH10K_DBG_HTT, "htt tx completion msdu_id %u discard %d no_ack %d\n",
-                  tx_done->msdu_id, !!tx_done->discard, !!tx_done->no_ack);
+       ath10k_dbg(ar, ATH10K_DBG_HTT,
+                  "htt tx completion msdu_id %u discard %d no_ack %d success %d\n",
+                  tx_done->msdu_id, !!tx_done->discard,
+                  !!tx_done->no_ack, !!tx_done->success);
 
        if (tx_done->msdu_id >= htt->max_num_pending_tx) {
                ath10k_warn(ar, "warning: msdu_id %d too big, ignoring\n",
@@ -97,6 +99,9 @@ void ath10k_txrx_tx_unref(struct ath10k_htt *htt,
        if (tx_done->no_ack)
                info->flags &= ~IEEE80211_TX_STAT_ACK;
 
+       if (tx_done->success && (info->flags & IEEE80211_TX_CTL_NO_ACK))
+               info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
+
        ieee80211_tx_status(htt->ar->hw, msdu);
        /* we do not own the msdu anymore */