ath5k: support for FIF_FCSFAIL filter
PATCH 1/2 ath5k: support for FIF_FCSFAIL filter
Hi all,
Currently ath5k can't report frames with CRC errors. In ath5k_configure_filter it actually sets the hardware filter properly when the FIF_FCSFAIL flag is set. However, in other functions the necessary checks weren't being done.
This patch fixes that.
--
From: "Mathy Vanhoef" <[email protected]>
When the FIF_FCSFAIL filter flag is set, pass frames with CRC errors.
Signed-off-by Mathy Vanhoef <[email protected]>
--- drivers/net/wireless/ath/ath5k/ath5k.h | 1 + drivers/net/wireless/ath/ath5k/base.c | 16 ++++++++++++++-- drivers/net/wireless/ath/ath5k/mac80211-ops.c | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-)
drivers/net/wireless/ath/ath5k/ath5k.h +1 -0
@@ -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;
drivers/net/wireless/ath/ath5k/base.c +14 -2
@@ -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; }
drivers/net/wireless/ath/ath5k/mac80211-ops.c +2 -0
@@ -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); }
Signature · 1 line
1.8.1.2