ath5k: support for FIF_FCSFAIL filter
authorMathy Vanhoef <vanhoefm@gmail.com>
Fri, 13 Jun 2014 21:40:22 +0000 (23:40 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 1 Jul 2014 18:26:25 +0000 (14:26 -0400)
When the FIF_FCSFAIL filter flag is set, pass frames with CRC errors.

Signed-off-by: Mathy Vanhoef <vanhoefm@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath5k/ath5k.h
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath5k/mac80211-ops.c

index 74bd54d6acebaeb2052d0184898a6b7e13f27a49..85316bb3f8c66a51baffad61a5b306337f4ec04f 100644 (file)
@@ -1285,6 +1285,7 @@ struct ath5k_hw {
 #define ATH_STAT_STARTED       3               /* opened & irqs enabled */
 
        unsigned int            filter_flags;   /* HW flags, AR5K_RX_FILTER_* */
+       unsigned int            fif_filter_flags; /* Current FIF_* filter flags */
        struct ieee80211_channel *curchan;      /* current h/w channel */
 
        u16                     nvifs;
index 4b18434ba697c20c048e457bcdbc1c788c41da9b..5839a3434119db91ccad538cb3d4d4694aae1c96 100644 (file)
@@ -1382,6 +1382,9 @@ ath5k_receive_frame(struct ath5k_hw *ah, struct sk_buff *skb,
        rxs->flag = 0;
        if (unlikely(rs->rs_status & AR5K_RXERR_MIC))
                rxs->flag |= RX_FLAG_MMIC_ERROR;
+       if (unlikely(rs->rs_status & AR5K_RXERR_CRC))
+               rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
+
 
        /*
         * always extend the mac timestamp, since this information is
@@ -1449,6 +1452,8 @@ ath5k_receive_frame_ok(struct ath5k_hw *ah, struct ath5k_rx_status *rs)
        ah->stats.rx_bytes_count += rs->rs_datalen;
 
        if (unlikely(rs->rs_status)) {
+               unsigned int filters;
+
                if (rs->rs_status & AR5K_RXERR_CRC)
                        ah->stats.rxerr_crc++;
                if (rs->rs_status & AR5K_RXERR_FIFO)
@@ -1480,8 +1485,15 @@ ath5k_receive_frame_ok(struct ath5k_hw *ah, struct ath5k_rx_status *rs)
                        return true;
                }
 
-               /* reject any frames with non-crypto errors */
-               if (rs->rs_status & ~(AR5K_RXERR_DECRYPT))
+               /*
+                * Reject any frames with non-crypto errors, and take into account the
+                * current FIF_* filters.
+                */
+               filters = AR5K_RXERR_DECRYPT;
+               if (ah->fif_filter_flags & FIF_FCSFAIL)
+                       filters |= AR5K_RXERR_CRC;
+
+               if (rs->rs_status & ~filters)
                        return false;
        }
 
index afb23b3cc7be64d6b0ae8f79d46a3a9c9d07eab3..b65c38fdaa4b23723ac8f59add51e46acc7d16f1 100644 (file)
@@ -473,6 +473,8 @@ ath5k_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
        /* Set the cached hw filter flags, this will later actually
         * be set in HW */
        ah->filter_flags = rfilt;
+       /* Store current FIF filter flags */
+       ah->fif_filter_flags = *new_flags;
 
        mutex_unlock(&ah->lock);
 }