diff options
Diffstat (limited to 'drivers/net/wireless/ath/carl9170/main.c')
-rw-r--r-- | drivers/net/wireless/ath/carl9170/main.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c index 84bd38e9961c..3cc99f3f7ab5 100644 --- a/drivers/net/wireless/ath/carl9170/main.c +++ b/drivers/net/wireless/ath/carl9170/main.c | |||
@@ -380,6 +380,13 @@ static int carl9170_op_start(struct ieee80211_hw *hw) | |||
380 | if (err) | 380 | if (err) |
381 | goto out; | 381 | goto out; |
382 | 382 | ||
383 | if (ar->fw.rx_filter) { | ||
384 | err = carl9170_rx_filter(ar, CARL9170_RX_FILTER_OTHER_RA | | ||
385 | CARL9170_RX_FILTER_CTL_OTHER | CARL9170_RX_FILTER_BAD); | ||
386 | if (err) | ||
387 | goto out; | ||
388 | } | ||
389 | |||
383 | err = carl9170_write_reg(ar, AR9170_MAC_REG_DMA_TRIGGER, | 390 | err = carl9170_write_reg(ar, AR9170_MAC_REG_DMA_TRIGGER, |
384 | AR9170_DMA_TRIGGER_RXQ); | 391 | AR9170_DMA_TRIGGER_RXQ); |
385 | if (err) | 392 | if (err) |
@@ -840,8 +847,7 @@ static void carl9170_op_configure_filter(struct ieee80211_hw *hw, | |||
840 | struct ar9170 *ar = hw->priv; | 847 | struct ar9170 *ar = hw->priv; |
841 | 848 | ||
842 | /* mask supported flags */ | 849 | /* mask supported flags */ |
843 | *new_flags &= FIF_ALLMULTI | FIF_FCSFAIL | FIF_PLCPFAIL | | 850 | *new_flags &= FIF_ALLMULTI | ar->rx_filter_caps; |
844 | FIF_OTHER_BSS | FIF_PROMISC_IN_BSS; | ||
845 | 851 | ||
846 | if (!IS_ACCEPTING_CMD(ar)) | 852 | if (!IS_ACCEPTING_CMD(ar)) |
847 | return; | 853 | return; |
@@ -867,6 +873,26 @@ static void carl9170_op_configure_filter(struct ieee80211_hw *hw, | |||
867 | WARN_ON(carl9170_set_operating_mode(ar)); | 873 | WARN_ON(carl9170_set_operating_mode(ar)); |
868 | } | 874 | } |
869 | 875 | ||
876 | if (ar->fw.rx_filter && changed_flags & ar->rx_filter_caps) { | ||
877 | u32 rx_filter = 0; | ||
878 | |||
879 | if (!(*new_flags & (FIF_FCSFAIL | FIF_PLCPFAIL))) | ||
880 | rx_filter |= CARL9170_RX_FILTER_BAD; | ||
881 | |||
882 | if (!(*new_flags & FIF_CONTROL)) | ||
883 | rx_filter |= CARL9170_RX_FILTER_CTL_OTHER; | ||
884 | |||
885 | if (!(*new_flags & FIF_PSPOLL)) | ||
886 | rx_filter |= CARL9170_RX_FILTER_CTL_PSPOLL; | ||
887 | |||
888 | if (!(*new_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS))) { | ||
889 | rx_filter |= CARL9170_RX_FILTER_OTHER_RA; | ||
890 | rx_filter |= CARL9170_RX_FILTER_DECRY_FAIL; | ||
891 | } | ||
892 | |||
893 | WARN_ON(carl9170_rx_filter(ar, rx_filter)); | ||
894 | } | ||
895 | |||
870 | mutex_unlock(&ar->mutex); | 896 | mutex_unlock(&ar->mutex); |
871 | } | 897 | } |
872 | 898 | ||