ath10k: handle TKIP MIC error correctly
authorJanusz Dziedzic <janusz.dziedzic@tieto.com>
Fri, 13 Dec 2013 12:44:16 +0000 (13:44 +0100)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 16 Dec 2013 13:13:34 +0000 (15:13 +0200)
We should check MIC error flag base on
rx_attention, to have consistent status
of MIC failure and FCS error.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.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 7fc7919..b93ae35 100644 (file)
@@ -1183,6 +1183,7 @@ struct htt_rx_info {
        } rate;
        bool fcs_err;
        bool amsdu_more;
+       bool mic_err;
 };
 
 struct ath10k_htt {
index fcb534f..fe8bd1b 100644 (file)
@@ -838,6 +838,20 @@ static bool ath10k_htt_rx_has_fcs_err(struct sk_buff *skb)
        return false;
 }
 
+static bool ath10k_htt_rx_has_mic_err(struct sk_buff *skb)
+{
+       struct htt_rx_desc *rxd;
+       u32 flags;
+
+       rxd = (void *)skb->data - sizeof(*rxd);
+       flags = __le32_to_cpu(rxd->attention.flags);
+
+       if (flags & RX_ATTENTION_FLAGS_TKIP_MIC_ERR)
+               return true;
+
+       return false;
+}
+
 static int ath10k_htt_rx_get_csum_state(struct sk_buff *skb)
 {
        struct htt_rx_desc *rxd;
@@ -960,6 +974,7 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
 
                        info.skb     = msdu_head;
                        info.fcs_err = ath10k_htt_rx_has_fcs_err(msdu_head);
+                       info.mic_err = ath10k_htt_rx_has_mic_err(msdu_head);
                        info.signal  = ATH10K_DEFAULT_NOISE_FLOOR;
                        info.signal += rx->ppdu.combined_rssi;
 
index 2282980..74f45fa 100644 (file)
@@ -231,7 +231,7 @@ void ath10k_process_rx(struct ath10k *ar, struct htt_rx_info *info)
                                ~IEEE80211_FCTL_PROTECTED);
        }
 
-       if (info->status == HTT_RX_IND_MPDU_STATUS_TKIP_MIC_ERR)
+       if (info->mic_err)
                status->flag |= RX_FLAG_MMIC_ERROR;
 
        if (info->fcs_err)