aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorIvo van Doorn <ivdoorn@gmail.com>2007-10-06 08:13:38 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:55:10 -0400
commit5886d0dbf5b4226c6b6c8c44c555c5dd83c67b02 (patch)
treeec47ec07e93b548f5852465f4ab0266f0284bac3 /drivers
parent483272f5ee968b25172b80bd2d27e37fef1dcc3a (diff)
[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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c4
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c4
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c4
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00.h2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c13
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c4
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c4
7 files changed, 20 insertions, 15 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 7b2a85ade135..e3cac0f26d7b 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1497,8 +1497,8 @@ static void rt2400pci_configure_filter(struct ieee80211_hw *hw,
1497 * - Some filters are set based on interface type. 1497 * - Some filters are set based on interface type.
1498 */ 1498 */
1499 *total_flags |= FIF_ALLMULTI; 1499 *total_flags |= FIF_ALLMULTI;
1500 if (changed_flags & FIF_OTHER_BSS || 1500 if (*total_flags & FIF_OTHER_BSS ||
1501 changed_flags & FIF_PROMISC_IN_BSS) 1501 *total_flags & FIF_PROMISC_IN_BSS)
1502 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 1502 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
1503 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP)) 1503 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
1504 *total_flags |= FIF_PROMISC_IN_BSS; 1504 *total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 63a7b3cdf0cd..5d982316b854 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1830,8 +1830,8 @@ static void rt2500pci_configure_filter(struct ieee80211_hw *hw,
1830 */ 1830 */
1831 if (mc_count) 1831 if (mc_count)
1832 *total_flags |= FIF_ALLMULTI; 1832 *total_flags |= FIF_ALLMULTI;
1833 if (changed_flags & FIF_OTHER_BSS || 1833 if (*total_flags & FIF_OTHER_BSS ||
1834 changed_flags & FIF_PROMISC_IN_BSS) 1834 *total_flags & FIF_PROMISC_IN_BSS)
1835 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 1835 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
1836 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP)) 1836 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
1837 *total_flags |= FIF_PROMISC_IN_BSS; 1837 *total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 973f653ecfc2..3dbd381f1428 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1602,8 +1602,8 @@ static void rt2500usb_configure_filter(struct ieee80211_hw *hw,
1602 */ 1602 */
1603 if (mc_count) 1603 if (mc_count)
1604 *total_flags |= FIF_ALLMULTI; 1604 *total_flags |= FIF_ALLMULTI;
1605 if (changed_flags & FIF_OTHER_BSS || 1605 if (*total_flags & FIF_OTHER_BSS ||
1606 changed_flags & FIF_PROMISC_IN_BSS) 1606 *total_flags & FIF_PROMISC_IN_BSS)
1607 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 1607 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
1608 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP)) 1608 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
1609 *total_flags |= FIF_PROMISC_IN_BSS; 1609 *total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 82dfcd95bb26..9bb5fb964a21 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -410,8 +410,6 @@ struct rt2x00lib_ops {
410 */ 410 */
411 void (*config_mac_addr) (struct rt2x00_dev *rt2x00dev, __le32 *mac); 411 void (*config_mac_addr) (struct rt2x00_dev *rt2x00dev, __le32 *mac);
412 void (*config_bssid) (struct rt2x00_dev *rt2x00dev, __le32 *bssid); 412 void (*config_bssid) (struct rt2x00_dev *rt2x00dev, __le32 *bssid);
413 void (*config_packet_filter) (struct rt2x00_dev *rt2x00dev,
414 const unsigned int filter);
415 void (*config_type) (struct rt2x00_dev *rt2x00dev, const int type); 413 void (*config_type) (struct rt2x00_dev *rt2x00dev, const int type);
416 void (*config) (struct rt2x00_dev *rt2x00dev, const unsigned int flags, 414 void (*config) (struct rt2x00_dev *rt2x00dev, const unsigned int flags,
417 struct ieee80211_conf *conf); 415 struct ieee80211_conf *conf);
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index f25475318c9b..1e07c3938cb3 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -276,11 +276,18 @@ static void rt2x00lib_packetfilter_scheduled(struct work_struct *work)
276{ 276{
277 struct rt2x00_dev *rt2x00dev = 277 struct rt2x00_dev *rt2x00dev =
278 container_of(work, struct rt2x00_dev, filter_work); 278 container_of(work, struct rt2x00_dev, filter_work);
279 unsigned int filter = rt2x00dev->interface.filter;
280
281 /*
282 * Since we had stored the filter inside interface.filter,
283 * we should now clear that field. Otherwise the driver will
284 * assume nothing has changed (*total_flags will be compared
285 * to interface.filter to determine if any action is required).
286 */
287 rt2x00dev->interface.filter = 0;
279 288
280 rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw, 289 rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw,
281 rt2x00dev->interface.filter, 290 filter, &filter, 0, NULL);
282 &rt2x00dev->interface.filter,
283 0, NULL);
284} 291}
285 292
286/* 293/*
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 5d31ced11149..588b22b16419 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -2389,8 +2389,8 @@ static void rt61pci_configure_filter(struct ieee80211_hw *hw,
2389 */ 2389 */
2390 if (mc_count) 2390 if (mc_count)
2391 *total_flags |= FIF_ALLMULTI; 2391 *total_flags |= FIF_ALLMULTI;
2392 if (changed_flags & FIF_OTHER_BSS || 2392 if (*total_flags & FIF_OTHER_BSS ||
2393 changed_flags & FIF_PROMISC_IN_BSS) 2393 *total_flags & FIF_PROMISC_IN_BSS)
2394 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 2394 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
2395 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP)) 2395 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
2396 *total_flags |= FIF_PROMISC_IN_BSS; 2396 *total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 5fa697bfaa14..6d1635b5cd07 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1856,8 +1856,8 @@ static void rt73usb_configure_filter(struct ieee80211_hw *hw,
1856 */ 1856 */
1857 if (mc_count) 1857 if (mc_count)
1858 *total_flags |= FIF_ALLMULTI; 1858 *total_flags |= FIF_ALLMULTI;
1859 if (changed_flags & FIF_OTHER_BSS || 1859 if (*total_flags & FIF_OTHER_BSS ||
1860 changed_flags & FIF_PROMISC_IN_BSS) 1860 *total_flags & FIF_PROMISC_IN_BSS)
1861 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 1861 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
1862 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP)) 1862 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
1863 *total_flags |= FIF_PROMISC_IN_BSS; 1863 *total_flags |= FIF_PROMISC_IN_BSS;