ar9170: use bitop macros for tx filter flags

This patch fixes a bug in configure_filter's (sub-)routines.
We never really cleared the flags once we updated the hardware state,
so we wasted our resources by applying already active settings.

Signed-off-by: Christian Lamparter <chunkeey@web.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Christian Lamparter 2009-05-23 20:28:21 +02:00 committed by John W. Linville
parent 29ceff5d58
commit 864cc02e7c
2 changed files with 19 additions and 9 deletions

View File

@ -140,7 +140,7 @@ struct ar9170 {
struct work_struct filter_config_work; struct work_struct filter_config_work;
u64 cur_mc_hash, want_mc_hash; u64 cur_mc_hash, want_mc_hash;
u32 cur_filter, want_filter; u32 cur_filter, want_filter;
unsigned int filter_changed; unsigned long filter_changed;
unsigned int filter_state; unsigned int filter_state;
bool sniffer_enabled; bool sniffer_enabled;
@ -195,7 +195,7 @@ struct ar9170_sta_info {
#define IS_STARTED(a) (a->state >= AR9170_STARTED) #define IS_STARTED(a) (a->state >= AR9170_STARTED)
#define IS_ACCEPTING_CMD(a) (a->state >= AR9170_IDLE) #define IS_ACCEPTING_CMD(a) (a->state >= AR9170_IDLE)
#define AR9170_FILTER_CHANGED_PROMISC BIT(0) #define AR9170_FILTER_CHANGED_MODE BIT(0)
#define AR9170_FILTER_CHANGED_MULTICAST BIT(1) #define AR9170_FILTER_CHANGED_MULTICAST BIT(1)
#define AR9170_FILTER_CHANGED_FRAMEFILTER BIT(2) #define AR9170_FILTER_CHANGED_FRAMEFILTER BIT(2)

View File

@ -957,6 +957,8 @@ static int ar9170_op_start(struct ieee80211_hw *hw)
mutex_lock(&ar->mutex); mutex_lock(&ar->mutex);
ar->filter_changed = 0;
/* reinitialize queues statistics */ /* reinitialize queues statistics */
memset(&ar->tx_stats, 0, sizeof(ar->tx_stats)); memset(&ar->tx_stats, 0, sizeof(ar->tx_stats));
for (i = 0; i < ARRAY_SIZE(ar->tx_stats); i++) for (i = 0; i < ARRAY_SIZE(ar->tx_stats); i++)
@ -1376,20 +1378,26 @@ static void ar9170_set_filters(struct work_struct *work)
return ; return ;
mutex_lock(&ar->mutex); mutex_lock(&ar->mutex);
if (ar->filter_changed & AR9170_FILTER_CHANGED_PROMISC) { if (test_and_clear_bit(AR9170_FILTER_CHANGED_MODE,
&ar->filter_changed)) {
err = ar9170_set_operating_mode(ar); err = ar9170_set_operating_mode(ar);
if (err) if (err)
goto unlock; goto unlock;
} }
if (ar->filter_changed & AR9170_FILTER_CHANGED_MULTICAST) { if (test_and_clear_bit(AR9170_FILTER_CHANGED_MULTICAST,
&ar->filter_changed)) {
err = ar9170_update_multicast(ar); err = ar9170_update_multicast(ar);
if (err) if (err)
goto unlock; goto unlock;
} }
if (ar->filter_changed & AR9170_FILTER_CHANGED_FRAMEFILTER) if (test_and_clear_bit(AR9170_FILTER_CHANGED_FRAMEFILTER,
&ar->filter_changed)) {
err = ar9170_update_frame_filter(ar); err = ar9170_update_frame_filter(ar);
if (err)
goto unlock;
}
unlock: unlock:
mutex_unlock(&ar->mutex); mutex_unlock(&ar->mutex);
@ -1419,7 +1427,7 @@ static void ar9170_op_configure_filter(struct ieee80211_hw *hw,
int i; int i;
/* always get broadcast frames */ /* always get broadcast frames */
mchash = 1ULL << (0xff>>2); mchash = 1ULL << (0xff >> 2);
for (i = 0; i < mc_count; i++) { for (i = 0; i < mc_count; i++) {
if (WARN_ON(!mclist)) if (WARN_ON(!mclist))
@ -1429,7 +1437,7 @@ static void ar9170_op_configure_filter(struct ieee80211_hw *hw,
} }
ar->want_mc_hash = mchash; ar->want_mc_hash = mchash;
} }
ar->filter_changed |= AR9170_FILTER_CHANGED_MULTICAST; set_bit(AR9170_FILTER_CHANGED_MULTICAST, &ar->filter_changed);
} }
if (changed_flags & FIF_CONTROL) { if (changed_flags & FIF_CONTROL) {
@ -1445,12 +1453,14 @@ static void ar9170_op_configure_filter(struct ieee80211_hw *hw,
else else
ar->want_filter = ar->cur_filter & ~filter; ar->want_filter = ar->cur_filter & ~filter;
ar->filter_changed |= AR9170_FILTER_CHANGED_FRAMEFILTER; set_bit(AR9170_FILTER_CHANGED_FRAMEFILTER,
&ar->filter_changed);
} }
if (changed_flags & FIF_PROMISC_IN_BSS) { if (changed_flags & FIF_PROMISC_IN_BSS) {
ar->sniffer_enabled = ((*new_flags) & FIF_PROMISC_IN_BSS) != 0; ar->sniffer_enabled = ((*new_flags) & FIF_PROMISC_IN_BSS) != 0;
ar->filter_changed |= AR9170_FILTER_CHANGED_PROMISC; set_bit(AR9170_FILTER_CHANGED_MODE,
&ar->filter_changed);
} }
if (likely(IS_STARTED(ar))) if (likely(IS_STARTED(ar)))