[PATCH] rt2x00: Don't use changed_flags inside configure_packet_filter

We shouldn't use changed_flags when configuring the packet filter,
we work directly with the total_flags which is safe enough since
we already check if something has changed after we applied our
packet filtering flag rules.
Also make sure that when the packet filter is scheduled, the
rt2x00dev->interface.filter is cleared to make sure the drivers
will update the packet filter instead of failing at the check:
*total_flags == rt2x00dev->interface.filter

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 7b2a85a..e3cac0f2 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1497,8 +1497,8 @@
 	 * - Some filters are set based on interface type.
 	 */
 	*total_flags |= FIF_ALLMULTI;
-	if (changed_flags & FIF_OTHER_BSS ||
-	    changed_flags & FIF_PROMISC_IN_BSS)
+	if (*total_flags & FIF_OTHER_BSS ||
+	    *total_flags & FIF_PROMISC_IN_BSS)
 		*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
 	if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
 		*total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 63a7b3c..5d98231 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1830,8 +1830,8 @@
 	 */
 	if (mc_count)
 		*total_flags |= FIF_ALLMULTI;
-	if (changed_flags & FIF_OTHER_BSS ||
-	    changed_flags & FIF_PROMISC_IN_BSS)
+	if (*total_flags & FIF_OTHER_BSS ||
+	    *total_flags & FIF_PROMISC_IN_BSS)
 		*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
 	if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
 		*total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 973f653..3dbd381 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1602,8 +1602,8 @@
 	 */
 	if (mc_count)
 		*total_flags |= FIF_ALLMULTI;
-	if (changed_flags & FIF_OTHER_BSS ||
-	    changed_flags & FIF_PROMISC_IN_BSS)
+	if (*total_flags & FIF_OTHER_BSS ||
+	    *total_flags & FIF_PROMISC_IN_BSS)
 		*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
 	if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
 		*total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 82dfcd9..9bb5fb9 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -410,8 +410,6 @@
 	 */
 	void (*config_mac_addr) (struct rt2x00_dev *rt2x00dev, __le32 *mac);
 	void (*config_bssid) (struct rt2x00_dev *rt2x00dev, __le32 *bssid);
-	void (*config_packet_filter) (struct rt2x00_dev *rt2x00dev,
-				      const unsigned int filter);
 	void (*config_type) (struct rt2x00_dev *rt2x00dev, const int type);
 	void (*config) (struct rt2x00_dev *rt2x00dev, const unsigned int flags,
 			struct ieee80211_conf *conf);
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index f254753..1e07c39 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -276,11 +276,18 @@
 {
 	struct rt2x00_dev *rt2x00dev =
 	    container_of(work, struct rt2x00_dev, filter_work);
+	unsigned int filter = rt2x00dev->interface.filter;
+
+	/*
+	 * Since we had stored the filter inside interface.filter,
+	 * we should now clear that field. Otherwise the driver will
+	 * assume nothing has changed (*total_flags will be compared
+	 * to interface.filter to determine if any action is required).
+	 */
+	rt2x00dev->interface.filter = 0;
 
 	rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw,
-					     rt2x00dev->interface.filter,
-					     &rt2x00dev->interface.filter,
-					     0, NULL);
+					     filter, &filter, 0, NULL);
 }
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 5d31ced..588b22b 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -2389,8 +2389,8 @@
 	 */
 	if (mc_count)
 		*total_flags |= FIF_ALLMULTI;
-	if (changed_flags & FIF_OTHER_BSS ||
-	    changed_flags & FIF_PROMISC_IN_BSS)
+	if (*total_flags & FIF_OTHER_BSS ||
+	    *total_flags & FIF_PROMISC_IN_BSS)
 		*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
 	if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
 		*total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 5fa697b..6d1635b 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1856,8 +1856,8 @@
 	 */
 	if (mc_count)
 		*total_flags |= FIF_ALLMULTI;
-	if (changed_flags & FIF_OTHER_BSS ||
-	    changed_flags & FIF_PROMISC_IN_BSS)
+	if (*total_flags & FIF_OTHER_BSS ||
+	    *total_flags & FIF_PROMISC_IN_BSS)
 		*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
 	if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
 		*total_flags |= FIF_PROMISC_IN_BSS;