aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00
diff options
context:
space:
mode:
authorIvo van Doorn <ivdoorn@gmail.com>2008-03-31 09:24:53 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-04-01 17:14:08 -0400
commite0b005fa1479045fe879944036268af3ebcd1835 (patch)
tree0c5c72716cdf76f48be7cc38aa8ae5e86396a47e /drivers/net/wireless/rt2x00
parentbc5213f468b4d0520a06e27ea2cc9724bc5b896c (diff)
rt2x00: TO_DS filter depends on intf_ap_count
The TO_DS filter does not only depend on the FIF_PROMISC_IN_BSS flag provided by mac80211, but also on the intf_ap_count count. This makes sense, since when Master mode is active, we should all frames that are send to the active AP (the device itself). This means that when an interface is added we should force the packet filter to be updated during the next mac80211 call of configure_filter() to make sure the intf_ap_count field is checked. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c3
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c3
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c3
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00mac.c7
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c3
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c3
6 files changed, 17 insertions, 5 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index a6e9c89c802a..9abdfb84697c 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -290,7 +290,8 @@ static void rt2400pci_config_filter(struct rt2x00_dev *rt2x00dev,
290 rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME, 290 rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME,
291 !(filter_flags & FIF_PROMISC_IN_BSS)); 291 !(filter_flags & FIF_PROMISC_IN_BSS));
292 rt2x00_set_field32(&reg, RXCSR0_DROP_TODS, 292 rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,
293 !(filter_flags & FIF_PROMISC_IN_BSS)); 293 !(filter_flags & FIF_PROMISC_IN_BSS) &&
294 !rt2x00dev->intf_ap_count);
294 rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1); 295 rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
295 rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); 296 rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
296} 297}
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 1bdb873b65f2..54c9a75b549b 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -291,7 +291,8 @@ static void rt2500pci_config_filter(struct rt2x00_dev *rt2x00dev,
291 rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME, 291 rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME,
292 !(filter_flags & FIF_PROMISC_IN_BSS)); 292 !(filter_flags & FIF_PROMISC_IN_BSS));
293 rt2x00_set_field32(&reg, RXCSR0_DROP_TODS, 293 rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,
294 !(filter_flags & FIF_PROMISC_IN_BSS)); 294 !(filter_flags & FIF_PROMISC_IN_BSS) &&
295 !rt2x00dev->intf_ap_count);
295 rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1); 296 rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);
296 rt2x00_set_field32(&reg, RXCSR0_DROP_MCAST, 297 rt2x00_set_field32(&reg, RXCSR0_DROP_MCAST,
297 !(filter_flags & FIF_ALLMULTI)); 298 !(filter_flags & FIF_ALLMULTI));
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index f5c18f011e93..28fdf191e956 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -337,7 +337,8 @@ static void rt2500usb_config_filter(struct rt2x00_dev *rt2x00dev,
337 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME, 337 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_NOT_TO_ME,
338 !(filter_flags & FIF_PROMISC_IN_BSS)); 338 !(filter_flags & FIF_PROMISC_IN_BSS));
339 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_TODS, 339 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_TODS,
340 !(filter_flags & FIF_PROMISC_IN_BSS)); 340 !(filter_flags & FIF_PROMISC_IN_BSS) &&
341 !rt2x00dev->intf_ap_count);
341 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 1); 342 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_VERSION_ERROR, 1);
342 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_MULTICAST, 343 rt2x00_set_field16(&reg, TXRX_CSR2_DROP_MULTICAST,
343 !(filter_flags & FIF_ALLMULTI)); 344 !(filter_flags & FIF_ALLMULTI));
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c
index a0adf5a04aa0..dc70e7aedfff 100644
--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
@@ -253,6 +253,13 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
253 */ 253 */
254 rt2x00lib_config_intf(rt2x00dev, intf, conf->type, intf->mac, NULL); 254 rt2x00lib_config_intf(rt2x00dev, intf, conf->type, intf->mac, NULL);
255 255
256 /*
257 * Some filters depend on the current working mode. We can force
258 * an update during the next configure_filter() run by mac80211 by
259 * resetting the current packet_filter state.
260 */
261 rt2x00dev->packet_filter = 0;
262
256 return 0; 263 return 0;
257} 264}
258EXPORT_SYMBOL_GPL(rt2x00mac_add_interface); 265EXPORT_SYMBOL_GPL(rt2x00mac_add_interface);
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 0d2e6f7dd692..c5c625143335 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -342,7 +342,8 @@ static void rt61pci_config_filter(struct rt2x00_dev *rt2x00dev,
342 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME, 342 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME,
343 !(filter_flags & FIF_PROMISC_IN_BSS)); 343 !(filter_flags & FIF_PROMISC_IN_BSS));
344 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS, 344 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,
345 !(filter_flags & FIF_PROMISC_IN_BSS)); 345 !(filter_flags & FIF_PROMISC_IN_BSS) &&
346 !rt2x00dev->intf_ap_count);
346 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1); 347 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
347 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST, 348 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,
348 !(filter_flags & FIF_ALLMULTI)); 349 !(filter_flags & FIF_ALLMULTI));
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index b3c846223432..796cf2990b72 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -354,7 +354,8 @@ static void rt73usb_config_filter(struct rt2x00_dev *rt2x00dev,
354 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME, 354 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME,
355 !(filter_flags & FIF_PROMISC_IN_BSS)); 355 !(filter_flags & FIF_PROMISC_IN_BSS));
356 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS, 356 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,
357 !(filter_flags & FIF_PROMISC_IN_BSS)); 357 !(filter_flags & FIF_PROMISC_IN_BSS) &&
358 !rt2x00dev->intf_ap_count);
358 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1); 359 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);
359 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST, 360 rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,
360 !(filter_flags & FIF_ALLMULTI)); 361 !(filter_flags & FIF_ALLMULTI));