aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/carl9170/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/carl9170/main.c')
-rw-r--r--drivers/net/wireless/ath/carl9170/main.c30
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