Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 864cc02e authored by Christian Lamparter's avatar Christian Lamparter Committed by John W. Linville
Browse files

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: default avatarChristian Lamparter <chunkeey@web.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 29ceff5d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -140,7 +140,7 @@ struct ar9170 {
	struct work_struct filter_config_work;
	u64 cur_mc_hash, want_mc_hash;
	u32 cur_filter, want_filter;
	unsigned int filter_changed;
	unsigned long filter_changed;
	unsigned int filter_state;
	bool sniffer_enabled;

@@ -195,7 +195,7 @@ struct ar9170_sta_info {
#define IS_STARTED(a)		(a->state >= AR9170_STARTED)
#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_FRAMEFILTER	BIT(2)

+17 −7
Original line number Diff line number Diff line
@@ -957,6 +957,8 @@ static int ar9170_op_start(struct ieee80211_hw *hw)

	mutex_lock(&ar->mutex);

	ar->filter_changed = 0;

	/* reinitialize queues statistics */
	memset(&ar->tx_stats, 0, sizeof(ar->tx_stats));
	for (i = 0; i < ARRAY_SIZE(ar->tx_stats); i++)
@@ -1376,20 +1378,26 @@ static void ar9170_set_filters(struct work_struct *work)
		return ;

	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);
		if (err)
			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);
		if (err)
			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);
		if (err)
			goto unlock;
	}

unlock:
	mutex_unlock(&ar->mutex);
@@ -1429,7 +1437,7 @@ static void ar9170_op_configure_filter(struct ieee80211_hw *hw,
			}
		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) {
@@ -1445,12 +1453,14 @@ static void ar9170_op_configure_filter(struct ieee80211_hw *hw,
		else
			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) {
		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)))