aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c8
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c8
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c8
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00.h12
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c4
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c8
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c8
7 files changed, 19 insertions, 37 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 9eed9e90fc0c..b042eb551cde 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1422,7 +1422,6 @@ static void rt2400pci_configure_filter(struct ieee80211_hw *hw,
1422 struct dev_addr_list *mc_list) 1422 struct dev_addr_list *mc_list)
1423{ 1423{
1424 struct rt2x00_dev *rt2x00dev = hw->priv; 1424 struct rt2x00_dev *rt2x00dev = hw->priv;
1425 struct interface *intf = &rt2x00dev->interface;
1426 u32 reg; 1425 u32 reg;
1427 1426
1428 /* 1427 /*
@@ -1441,21 +1440,18 @@ static void rt2400pci_configure_filter(struct ieee80211_hw *hw,
1441 * Apply some rules to the filters: 1440 * Apply some rules to the filters:
1442 * - Some filters imply different filters to be set. 1441 * - Some filters imply different filters to be set.
1443 * - Some things we can't filter out at all. 1442 * - Some things we can't filter out at all.
1444 * - Some filters are set based on interface type.
1445 */ 1443 */
1446 *total_flags |= FIF_ALLMULTI; 1444 *total_flags |= FIF_ALLMULTI;
1447 if (*total_flags & FIF_OTHER_BSS || 1445 if (*total_flags & FIF_OTHER_BSS ||
1448 *total_flags & FIF_PROMISC_IN_BSS) 1446 *total_flags & FIF_PROMISC_IN_BSS)
1449 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 1447 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
1450 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
1451 *total_flags |= FIF_PROMISC_IN_BSS;
1452 1448
1453 /* 1449 /*
1454 * Check if there is any work left for us. 1450 * Check if there is any work left for us.
1455 */ 1451 */
1456 if (intf->filter == *total_flags) 1452 if (rt2x00dev->packet_filter == *total_flags)
1457 return; 1453 return;
1458 intf->filter = *total_flags; 1454 rt2x00dev->packet_filter = *total_flags;
1459 1455
1460 /* 1456 /*
1461 * Start configuration steps. 1457 * Start configuration steps.
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 8b2f54b2e631..c92163d2d9ab 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1751,7 +1751,6 @@ static void rt2500pci_configure_filter(struct ieee80211_hw *hw,
1751 struct dev_addr_list *mc_list) 1751 struct dev_addr_list *mc_list)
1752{ 1752{
1753 struct rt2x00_dev *rt2x00dev = hw->priv; 1753 struct rt2x00_dev *rt2x00dev = hw->priv;
1754 struct interface *intf = &rt2x00dev->interface;
1755 u32 reg; 1754 u32 reg;
1756 1755
1757 /* 1756 /*
@@ -1770,22 +1769,19 @@ static void rt2500pci_configure_filter(struct ieee80211_hw *hw,
1770 * Apply some rules to the filters: 1769 * Apply some rules to the filters:
1771 * - Some filters imply different filters to be set. 1770 * - Some filters imply different filters to be set.
1772 * - Some things we can't filter out at all. 1771 * - Some things we can't filter out at all.
1773 * - Some filters are set based on interface type.
1774 */ 1772 */
1775 if (mc_count) 1773 if (mc_count)
1776 *total_flags |= FIF_ALLMULTI; 1774 *total_flags |= FIF_ALLMULTI;
1777 if (*total_flags & FIF_OTHER_BSS || 1775 if (*total_flags & FIF_OTHER_BSS ||
1778 *total_flags & FIF_PROMISC_IN_BSS) 1776 *total_flags & FIF_PROMISC_IN_BSS)
1779 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 1777 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
1780 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
1781 *total_flags |= FIF_PROMISC_IN_BSS;
1782 1778
1783 /* 1779 /*
1784 * Check if there is any work left for us. 1780 * Check if there is any work left for us.
1785 */ 1781 */
1786 if (intf->filter == *total_flags) 1782 if (rt2x00dev->packet_filter == *total_flags)
1787 return; 1783 return;
1788 intf->filter = *total_flags; 1784 rt2x00dev->packet_filter = *total_flags;
1789 1785
1790 /* 1786 /*
1791 * Start configuration steps. 1787 * Start configuration steps.
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 531d6a02755a..3dca09d6e319 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1611,7 +1611,6 @@ static void rt2500usb_configure_filter(struct ieee80211_hw *hw,
1611 struct dev_addr_list *mc_list) 1611 struct dev_addr_list *mc_list)
1612{ 1612{
1613 struct rt2x00_dev *rt2x00dev = hw->priv; 1613 struct rt2x00_dev *rt2x00dev = hw->priv;
1614 struct interface *intf = &rt2x00dev->interface;
1615 u16 reg; 1614 u16 reg;
1616 1615
1617 /* 1616 /*
@@ -1630,22 +1629,19 @@ static void rt2500usb_configure_filter(struct ieee80211_hw *hw,
1630 * Apply some rules to the filters: 1629 * Apply some rules to the filters:
1631 * - Some filters imply different filters to be set. 1630 * - Some filters imply different filters to be set.
1632 * - Some things we can't filter out at all. 1631 * - Some things we can't filter out at all.
1633 * - Some filters are set based on interface type.
1634 */ 1632 */
1635 if (mc_count) 1633 if (mc_count)
1636 *total_flags |= FIF_ALLMULTI; 1634 *total_flags |= FIF_ALLMULTI;
1637 if (*total_flags & FIF_OTHER_BSS || 1635 if (*total_flags & FIF_OTHER_BSS ||
1638 *total_flags & FIF_PROMISC_IN_BSS) 1636 *total_flags & FIF_PROMISC_IN_BSS)
1639 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 1637 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
1640 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
1641 *total_flags |= FIF_PROMISC_IN_BSS;
1642 1638
1643 /* 1639 /*
1644 * Check if there is any work left for us. 1640 * Check if there is any work left for us.
1645 */ 1641 */
1646 if (intf->filter == *total_flags) 1642 if (rt2x00dev->packet_filter == *total_flags)
1647 return; 1643 return;
1648 intf->filter = *total_flags; 1644 rt2x00dev->packet_filter = *total_flags;
1649 1645
1650 /* 1646 /*
1651 * When in atomic context, reschedule and let rt2x00lib 1647 * When in atomic context, reschedule and let rt2x00lib
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 5e4cb3ee2eae..be1fc0aebadc 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -388,11 +388,6 @@ struct interface {
388 * BBSID of the AP to associate with. 388 * BBSID of the AP to associate with.
389 */ 389 */
390 u8 bssid[ETH_ALEN]; 390 u8 bssid[ETH_ALEN];
391
392 /*
393 * Store the packet filter mode for the current interface.
394 */
395 unsigned int filter;
396}; 391};
397 392
398static inline int is_interface_present(struct interface *intf) 393static inline int is_interface_present(struct interface *intf)
@@ -676,6 +671,13 @@ struct rt2x00_dev {
676 struct mutex usb_cache_mutex; 671 struct mutex usb_cache_mutex;
677 672
678 /* 673 /*
674 * Current packet filter configuration for the device.
675 * This contains all currently active FIF_* flags send
676 * to us by mac80211 during configure_filter().
677 */
678 unsigned int packet_filter;
679
680 /*
679 * Interface configuration. 681 * Interface configuration.
680 */ 682 */
681 struct interface interface; 683 struct interface interface;
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index cea2bd91ff5f..911060df8037 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -417,7 +417,7 @@ static void rt2x00lib_packetfilter_scheduled(struct work_struct *work)
417{ 417{
418 struct rt2x00_dev *rt2x00dev = 418 struct rt2x00_dev *rt2x00dev =
419 container_of(work, struct rt2x00_dev, filter_work); 419 container_of(work, struct rt2x00_dev, filter_work);
420 unsigned int filter = rt2x00dev->interface.filter; 420 unsigned int filter = rt2x00dev->packet_filter;
421 421
422 /* 422 /*
423 * Since we had stored the filter inside interface.filter, 423 * Since we had stored the filter inside interface.filter,
@@ -425,7 +425,7 @@ static void rt2x00lib_packetfilter_scheduled(struct work_struct *work)
425 * assume nothing has changed (*total_flags will be compared 425 * assume nothing has changed (*total_flags will be compared
426 * to interface.filter to determine if any action is required). 426 * to interface.filter to determine if any action is required).
427 */ 427 */
428 rt2x00dev->interface.filter = 0; 428 rt2x00dev->packet_filter = 0;
429 429
430 rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw, 430 rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw,
431 filter, &filter, 0, NULL); 431 filter, &filter, 0, NULL);
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index fc36320a5f13..5c78c4cf80ae 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -2310,7 +2310,6 @@ static void rt61pci_configure_filter(struct ieee80211_hw *hw,
2310 struct dev_addr_list *mc_list) 2310 struct dev_addr_list *mc_list)
2311{ 2311{
2312 struct rt2x00_dev *rt2x00dev = hw->priv; 2312 struct rt2x00_dev *rt2x00dev = hw->priv;
2313 struct interface *intf = &rt2x00dev->interface;
2314 u32 reg; 2313 u32 reg;
2315 2314
2316 /* 2315 /*
@@ -2329,22 +2328,19 @@ static void rt61pci_configure_filter(struct ieee80211_hw *hw,
2329 * Apply some rules to the filters: 2328 * Apply some rules to the filters:
2330 * - Some filters imply different filters to be set. 2329 * - Some filters imply different filters to be set.
2331 * - Some things we can't filter out at all. 2330 * - Some things we can't filter out at all.
2332 * - Some filters are set based on interface type.
2333 */ 2331 */
2334 if (mc_count) 2332 if (mc_count)
2335 *total_flags |= FIF_ALLMULTI; 2333 *total_flags |= FIF_ALLMULTI;
2336 if (*total_flags & FIF_OTHER_BSS || 2334 if (*total_flags & FIF_OTHER_BSS ||
2337 *total_flags & FIF_PROMISC_IN_BSS) 2335 *total_flags & FIF_PROMISC_IN_BSS)
2338 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 2336 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
2339 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
2340 *total_flags |= FIF_PROMISC_IN_BSS;
2341 2337
2342 /* 2338 /*
2343 * Check if there is any work left for us. 2339 * Check if there is any work left for us.
2344 */ 2340 */
2345 if (intf->filter == *total_flags) 2341 if (rt2x00dev->packet_filter == *total_flags)
2346 return; 2342 return;
2347 intf->filter = *total_flags; 2343 rt2x00dev->packet_filter = *total_flags;
2348 2344
2349 /* 2345 /*
2350 * Start configuration steps. 2346 * Start configuration steps.
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 939341582e72..f2d1810fb3fe 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1846,7 +1846,6 @@ static void rt73usb_configure_filter(struct ieee80211_hw *hw,
1846 struct dev_addr_list *mc_list) 1846 struct dev_addr_list *mc_list)
1847{ 1847{
1848 struct rt2x00_dev *rt2x00dev = hw->priv; 1848 struct rt2x00_dev *rt2x00dev = hw->priv;
1849 struct interface *intf = &rt2x00dev->interface;
1850 u32 reg; 1849 u32 reg;
1851 1850
1852 /* 1851 /*
@@ -1865,22 +1864,19 @@ static void rt73usb_configure_filter(struct ieee80211_hw *hw,
1865 * Apply some rules to the filters: 1864 * Apply some rules to the filters:
1866 * - Some filters imply different filters to be set. 1865 * - Some filters imply different filters to be set.
1867 * - Some things we can't filter out at all. 1866 * - Some things we can't filter out at all.
1868 * - Some filters are set based on interface type.
1869 */ 1867 */
1870 if (mc_count) 1868 if (mc_count)
1871 *total_flags |= FIF_ALLMULTI; 1869 *total_flags |= FIF_ALLMULTI;
1872 if (*total_flags & FIF_OTHER_BSS || 1870 if (*total_flags & FIF_OTHER_BSS ||
1873 *total_flags & FIF_PROMISC_IN_BSS) 1871 *total_flags & FIF_PROMISC_IN_BSS)
1874 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; 1872 *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
1875 if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
1876 *total_flags |= FIF_PROMISC_IN_BSS;
1877 1873
1878 /* 1874 /*
1879 * Check if there is any work left for us. 1875 * Check if there is any work left for us.
1880 */ 1876 */
1881 if (intf->filter == *total_flags) 1877 if (rt2x00dev->packet_filter == *total_flags)
1882 return; 1878 return;
1883 intf->filter = *total_flags; 1879 rt2x00dev->packet_filter = *total_flags;
1884 1880
1885 /* 1881 /*
1886 * When in atomic context, reschedule and let rt2x00lib 1882 * When in atomic context, reschedule and let rt2x00lib