diff options
| author | Ivo van Doorn <ivdoorn@gmail.com> | 2008-03-25 09:13:18 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2008-03-25 16:42:00 -0400 |
| commit | 3a643d244f09fa1fdd25d48a56a073c1a69583ee (patch) | |
| tree | 3cd8423f72f37d66fdd2738409f72779da3911fc | |
| parent | 866a05038481d77cac6fc0186250b4c44e691b42 (diff) | |
rt2x00: Fix in_atomic() usage
rt73usb and rt2500usb used in_atomic to determine
if a configuration step should be rescheduled or not.
Since in_atomic() is not a valid method to determine
if sleeping is allowed we should fix the way this is handled
by adding a new flag to rt2x00.
In addition mark LED class support for the drivers broken
since that also uses the broken in_atomic() method but
so far no solution exists to have LED triggers work only
in scheduled context.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/rt2x00/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2400pci.c | 92 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 101 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 118 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 11 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00config.c | 10 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00mac.c | 57 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 105 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 122 |
9 files changed, 234 insertions, 386 deletions
diff --git a/drivers/net/wireless/rt2x00/Kconfig b/drivers/net/wireless/rt2x00/Kconfig index 4709c11da419..ad1549592c00 100644 --- a/drivers/net/wireless/rt2x00/Kconfig +++ b/drivers/net/wireless/rt2x00/Kconfig | |||
| @@ -134,7 +134,7 @@ config RT2500USB | |||
| 134 | 134 | ||
| 135 | config RT2500USB_LEDS | 135 | config RT2500USB_LEDS |
| 136 | bool "RT2500 leds support" | 136 | bool "RT2500 leds support" |
| 137 | depends on RT2500USB | 137 | depends on RT2500USB && BROKEN |
| 138 | select RT2X00_LIB_LEDS | 138 | select RT2X00_LIB_LEDS |
| 139 | ---help--- | 139 | ---help--- |
| 140 | This adds support for led triggers provided my mac80211. | 140 | This adds support for led triggers provided my mac80211. |
| @@ -152,7 +152,7 @@ config RT73USB | |||
| 152 | 152 | ||
| 153 | config RT73USB_LEDS | 153 | config RT73USB_LEDS |
| 154 | bool "RT73 leds support" | 154 | bool "RT73 leds support" |
| 155 | depends on RT73USB | 155 | depends on RT73USB && BROKEN |
| 156 | select RT2X00_LIB_LEDS | 156 | select RT2X00_LIB_LEDS |
| 157 | ---help--- | 157 | ---help--- |
| 158 | This adds support for led triggers provided my mac80211. | 158 | This adds support for led triggers provided my mac80211. |
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index c58b1c0abc3c..a6e9c89c802a 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c | |||
| @@ -270,6 +270,31 @@ static void rt2400pci_led_brightness(struct led_classdev *led_cdev, | |||
| 270 | /* | 270 | /* |
| 271 | * Configuration handlers. | 271 | * Configuration handlers. |
| 272 | */ | 272 | */ |
| 273 | static void rt2400pci_config_filter(struct rt2x00_dev *rt2x00dev, | ||
| 274 | const unsigned int filter_flags) | ||
| 275 | { | ||
| 276 | u32 reg; | ||
| 277 | |||
| 278 | /* | ||
| 279 | * Start configuration steps. | ||
| 280 | * Note that the version error will always be dropped | ||
| 281 | * since there is no filter for it at this time. | ||
| 282 | */ | ||
| 283 | rt2x00pci_register_read(rt2x00dev, RXCSR0, ®); | ||
| 284 | rt2x00_set_field32(®, RXCSR0_DROP_CRC, | ||
| 285 | !(filter_flags & FIF_FCSFAIL)); | ||
| 286 | rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, | ||
| 287 | !(filter_flags & FIF_PLCPFAIL)); | ||
| 288 | rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, | ||
| 289 | !(filter_flags & FIF_CONTROL)); | ||
| 290 | rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, | ||
| 291 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 292 | rt2x00_set_field32(®, RXCSR0_DROP_TODS, | ||
| 293 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 294 | rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1); | ||
| 295 | rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); | ||
| 296 | } | ||
| 297 | |||
| 273 | static void rt2400pci_config_intf(struct rt2x00_dev *rt2x00dev, | 298 | static void rt2400pci_config_intf(struct rt2x00_dev *rt2x00dev, |
| 274 | struct rt2x00_intf *intf, | 299 | struct rt2x00_intf *intf, |
| 275 | struct rt2x00intf_conf *conf, | 300 | struct rt2x00intf_conf *conf, |
| @@ -306,8 +331,8 @@ static void rt2400pci_config_intf(struct rt2x00_dev *rt2x00dev, | |||
| 306 | conf->bssid, sizeof(conf->bssid)); | 331 | conf->bssid, sizeof(conf->bssid)); |
| 307 | } | 332 | } |
| 308 | 333 | ||
| 309 | static int rt2400pci_config_erp(struct rt2x00_dev *rt2x00dev, | 334 | static void rt2400pci_config_erp(struct rt2x00_dev *rt2x00dev, |
| 310 | struct rt2x00lib_erp *erp) | 335 | struct rt2x00lib_erp *erp) |
| 311 | { | 336 | { |
| 312 | int preamble_mask; | 337 | int preamble_mask; |
| 313 | u32 reg; | 338 | u32 reg; |
| @@ -347,8 +372,6 @@ static int rt2400pci_config_erp(struct rt2x00_dev *rt2x00dev, | |||
| 347 | rt2x00_set_field32(®, ARCSR5_SERVICE, 0x84); | 372 | rt2x00_set_field32(®, ARCSR5_SERVICE, 0x84); |
| 348 | rt2x00_set_field32(®, ARCSR2_LENGTH, get_duration(ACK_SIZE, 110)); | 373 | rt2x00_set_field32(®, ARCSR2_LENGTH, get_duration(ACK_SIZE, 110)); |
| 349 | rt2x00pci_register_write(rt2x00dev, ARCSR5, reg); | 374 | rt2x00pci_register_write(rt2x00dev, ARCSR5, reg); |
| 350 | |||
| 351 | return 0; | ||
| 352 | } | 375 | } |
| 353 | 376 | ||
| 354 | static void rt2400pci_config_phymode(struct rt2x00_dev *rt2x00dev, | 377 | static void rt2400pci_config_phymode(struct rt2x00_dev *rt2x00dev, |
| @@ -1397,64 +1420,6 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 1397 | /* | 1420 | /* |
| 1398 | * IEEE80211 stack callback functions. | 1421 | * IEEE80211 stack callback functions. |
| 1399 | */ | 1422 | */ |
| 1400 | static void rt2400pci_configure_filter(struct ieee80211_hw *hw, | ||
| 1401 | unsigned int changed_flags, | ||
| 1402 | unsigned int *total_flags, | ||
| 1403 | int mc_count, | ||
| 1404 | struct dev_addr_list *mc_list) | ||
| 1405 | { | ||
| 1406 | struct rt2x00_dev *rt2x00dev = hw->priv; | ||
| 1407 | u32 reg; | ||
| 1408 | |||
| 1409 | /* | ||
| 1410 | * Mask off any flags we are going to ignore from | ||
| 1411 | * the total_flags field. | ||
| 1412 | */ | ||
| 1413 | *total_flags &= | ||
| 1414 | FIF_ALLMULTI | | ||
| 1415 | FIF_FCSFAIL | | ||
| 1416 | FIF_PLCPFAIL | | ||
| 1417 | FIF_CONTROL | | ||
| 1418 | FIF_OTHER_BSS | | ||
| 1419 | FIF_PROMISC_IN_BSS; | ||
| 1420 | |||
| 1421 | /* | ||
| 1422 | * Apply some rules to the filters: | ||
| 1423 | * - Some filters imply different filters to be set. | ||
| 1424 | * - Some things we can't filter out at all. | ||
| 1425 | */ | ||
| 1426 | *total_flags |= FIF_ALLMULTI; | ||
| 1427 | if (*total_flags & FIF_OTHER_BSS || | ||
| 1428 | *total_flags & FIF_PROMISC_IN_BSS) | ||
| 1429 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; | ||
| 1430 | |||
| 1431 | /* | ||
| 1432 | * Check if there is any work left for us. | ||
| 1433 | */ | ||
| 1434 | if (rt2x00dev->packet_filter == *total_flags) | ||
| 1435 | return; | ||
| 1436 | rt2x00dev->packet_filter = *total_flags; | ||
| 1437 | |||
| 1438 | /* | ||
| 1439 | * Start configuration steps. | ||
| 1440 | * Note that the version error will always be dropped | ||
| 1441 | * since there is no filter for it at this time. | ||
| 1442 | */ | ||
| 1443 | rt2x00pci_register_read(rt2x00dev, RXCSR0, ®); | ||
| 1444 | rt2x00_set_field32(®, RXCSR0_DROP_CRC, | ||
| 1445 | !(*total_flags & FIF_FCSFAIL)); | ||
| 1446 | rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, | ||
| 1447 | !(*total_flags & FIF_PLCPFAIL)); | ||
| 1448 | rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, | ||
| 1449 | !(*total_flags & FIF_CONTROL)); | ||
| 1450 | rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, | ||
| 1451 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 1452 | rt2x00_set_field32(®, RXCSR0_DROP_TODS, | ||
| 1453 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 1454 | rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1); | ||
| 1455 | rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); | ||
| 1456 | } | ||
| 1457 | |||
| 1458 | static int rt2400pci_set_retry_limit(struct ieee80211_hw *hw, | 1423 | static int rt2400pci_set_retry_limit(struct ieee80211_hw *hw, |
| 1459 | u32 short_retry, u32 long_retry) | 1424 | u32 short_retry, u32 long_retry) |
| 1460 | { | 1425 | { |
| @@ -1580,7 +1545,7 @@ static const struct ieee80211_ops rt2400pci_mac80211_ops = { | |||
| 1580 | .remove_interface = rt2x00mac_remove_interface, | 1545 | .remove_interface = rt2x00mac_remove_interface, |
| 1581 | .config = rt2x00mac_config, | 1546 | .config = rt2x00mac_config, |
| 1582 | .config_interface = rt2x00mac_config_interface, | 1547 | .config_interface = rt2x00mac_config_interface, |
| 1583 | .configure_filter = rt2400pci_configure_filter, | 1548 | .configure_filter = rt2x00mac_configure_filter, |
| 1584 | .get_stats = rt2x00mac_get_stats, | 1549 | .get_stats = rt2x00mac_get_stats, |
| 1585 | .set_retry_limit = rt2400pci_set_retry_limit, | 1550 | .set_retry_limit = rt2400pci_set_retry_limit, |
| 1586 | .bss_info_changed = rt2x00mac_bss_info_changed, | 1551 | .bss_info_changed = rt2x00mac_bss_info_changed, |
| @@ -1608,6 +1573,7 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = { | |||
| 1608 | .write_tx_data = rt2x00pci_write_tx_data, | 1573 | .write_tx_data = rt2x00pci_write_tx_data, |
| 1609 | .kick_tx_queue = rt2400pci_kick_tx_queue, | 1574 | .kick_tx_queue = rt2400pci_kick_tx_queue, |
| 1610 | .fill_rxdone = rt2400pci_fill_rxdone, | 1575 | .fill_rxdone = rt2400pci_fill_rxdone, |
| 1576 | .config_filter = rt2400pci_config_filter, | ||
| 1611 | .config_intf = rt2400pci_config_intf, | 1577 | .config_intf = rt2400pci_config_intf, |
| 1612 | .config_erp = rt2400pci_config_erp, | 1578 | .config_erp = rt2400pci_config_erp, |
| 1613 | .config = rt2400pci_config, | 1579 | .config = rt2400pci_config, |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index 9468dde3c95e..1bdb873b65f2 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
| @@ -270,6 +270,35 @@ static void rt2500pci_led_brightness(struct led_classdev *led_cdev, | |||
| 270 | /* | 270 | /* |
| 271 | * Configuration handlers. | 271 | * Configuration handlers. |
| 272 | */ | 272 | */ |
| 273 | static void rt2500pci_config_filter(struct rt2x00_dev *rt2x00dev, | ||
| 274 | const unsigned int filter_flags) | ||
| 275 | { | ||
| 276 | u32 reg; | ||
| 277 | |||
| 278 | /* | ||
| 279 | * Start configuration steps. | ||
| 280 | * Note that the version error will always be dropped | ||
| 281 | * and broadcast frames will always be accepted since | ||
| 282 | * there is no filter for it at this time. | ||
| 283 | */ | ||
| 284 | rt2x00pci_register_read(rt2x00dev, RXCSR0, ®); | ||
| 285 | rt2x00_set_field32(®, RXCSR0_DROP_CRC, | ||
| 286 | !(filter_flags & FIF_FCSFAIL)); | ||
| 287 | rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, | ||
| 288 | !(filter_flags & FIF_PLCPFAIL)); | ||
| 289 | rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, | ||
| 290 | !(filter_flags & FIF_CONTROL)); | ||
| 291 | rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, | ||
| 292 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 293 | rt2x00_set_field32(®, RXCSR0_DROP_TODS, | ||
| 294 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 295 | rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1); | ||
| 296 | rt2x00_set_field32(®, RXCSR0_DROP_MCAST, | ||
| 297 | !(filter_flags & FIF_ALLMULTI)); | ||
| 298 | rt2x00_set_field32(®, RXCSR0_DROP_BCAST, 0); | ||
| 299 | rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); | ||
| 300 | } | ||
| 301 | |||
| 273 | static void rt2500pci_config_intf(struct rt2x00_dev *rt2x00dev, | 302 | static void rt2500pci_config_intf(struct rt2x00_dev *rt2x00dev, |
| 274 | struct rt2x00_intf *intf, | 303 | struct rt2x00_intf *intf, |
| 275 | struct rt2x00intf_conf *conf, | 304 | struct rt2x00intf_conf *conf, |
| @@ -309,8 +338,8 @@ static void rt2500pci_config_intf(struct rt2x00_dev *rt2x00dev, | |||
| 309 | conf->bssid, sizeof(conf->bssid)); | 338 | conf->bssid, sizeof(conf->bssid)); |
| 310 | } | 339 | } |
| 311 | 340 | ||
| 312 | static int rt2500pci_config_erp(struct rt2x00_dev *rt2x00dev, | 341 | static void rt2500pci_config_erp(struct rt2x00_dev *rt2x00dev, |
| 313 | struct rt2x00lib_erp *erp) | 342 | struct rt2x00lib_erp *erp) |
| 314 | { | 343 | { |
| 315 | int preamble_mask; | 344 | int preamble_mask; |
| 316 | u32 reg; | 345 | u32 reg; |
| @@ -350,8 +379,6 @@ static int rt2500pci_config_erp(struct rt2x00_dev *rt2x00dev, | |||
| 350 | rt2x00_set_field32(®, ARCSR5_SERVICE, 0x84); | 379 | rt2x00_set_field32(®, ARCSR5_SERVICE, 0x84); |
| 351 | rt2x00_set_field32(®, ARCSR2_LENGTH, get_duration(ACK_SIZE, 110)); | 380 | rt2x00_set_field32(®, ARCSR2_LENGTH, get_duration(ACK_SIZE, 110)); |
| 352 | rt2x00pci_register_write(rt2x00dev, ARCSR5, reg); | 381 | rt2x00pci_register_write(rt2x00dev, ARCSR5, reg); |
| 353 | |||
| 354 | return 0; | ||
| 355 | } | 382 | } |
| 356 | 383 | ||
| 357 | static void rt2500pci_config_phymode(struct rt2x00_dev *rt2x00dev, | 384 | static void rt2500pci_config_phymode(struct rt2x00_dev *rt2x00dev, |
| @@ -1731,69 +1758,6 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 1731 | /* | 1758 | /* |
| 1732 | * IEEE80211 stack callback functions. | 1759 | * IEEE80211 stack callback functions. |
| 1733 | */ | 1760 | */ |
| 1734 | static void rt2500pci_configure_filter(struct ieee80211_hw *hw, | ||
| 1735 | unsigned int changed_flags, | ||
| 1736 | unsigned int *total_flags, | ||
| 1737 | int mc_count, | ||
| 1738 | struct dev_addr_list *mc_list) | ||
| 1739 | { | ||
| 1740 | struct rt2x00_dev *rt2x00dev = hw->priv; | ||
| 1741 | u32 reg; | ||
| 1742 | |||
| 1743 | /* | ||
| 1744 | * Mask off any flags we are going to ignore from | ||
| 1745 | * the total_flags field. | ||
| 1746 | */ | ||
| 1747 | *total_flags &= | ||
| 1748 | FIF_ALLMULTI | | ||
| 1749 | FIF_FCSFAIL | | ||
| 1750 | FIF_PLCPFAIL | | ||
| 1751 | FIF_CONTROL | | ||
| 1752 | FIF_OTHER_BSS | | ||
| 1753 | FIF_PROMISC_IN_BSS; | ||
| 1754 | |||
| 1755 | /* | ||
| 1756 | * Apply some rules to the filters: | ||
| 1757 | * - Some filters imply different filters to be set. | ||
| 1758 | * - Some things we can't filter out at all. | ||
| 1759 | */ | ||
| 1760 | if (mc_count) | ||
| 1761 | *total_flags |= FIF_ALLMULTI; | ||
| 1762 | if (*total_flags & FIF_OTHER_BSS || | ||
| 1763 | *total_flags & FIF_PROMISC_IN_BSS) | ||
| 1764 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; | ||
| 1765 | |||
| 1766 | /* | ||
| 1767 | * Check if there is any work left for us. | ||
| 1768 | */ | ||
| 1769 | if (rt2x00dev->packet_filter == *total_flags) | ||
| 1770 | return; | ||
| 1771 | rt2x00dev->packet_filter = *total_flags; | ||
| 1772 | |||
| 1773 | /* | ||
| 1774 | * Start configuration steps. | ||
| 1775 | * Note that the version error will always be dropped | ||
| 1776 | * and broadcast frames will always be accepted since | ||
| 1777 | * there is no filter for it at this time. | ||
| 1778 | */ | ||
| 1779 | rt2x00pci_register_read(rt2x00dev, RXCSR0, ®); | ||
| 1780 | rt2x00_set_field32(®, RXCSR0_DROP_CRC, | ||
| 1781 | !(*total_flags & FIF_FCSFAIL)); | ||
| 1782 | rt2x00_set_field32(®, RXCSR0_DROP_PHYSICAL, | ||
| 1783 | !(*total_flags & FIF_PLCPFAIL)); | ||
| 1784 | rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, | ||
| 1785 | !(*total_flags & FIF_CONTROL)); | ||
| 1786 | rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, | ||
| 1787 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 1788 | rt2x00_set_field32(®, RXCSR0_DROP_TODS, | ||
| 1789 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 1790 | rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1); | ||
| 1791 | rt2x00_set_field32(®, RXCSR0_DROP_MCAST, | ||
| 1792 | !(*total_flags & FIF_ALLMULTI)); | ||
| 1793 | rt2x00_set_field32(®, RXCSR0_DROP_BCAST, 0); | ||
| 1794 | rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); | ||
| 1795 | } | ||
| 1796 | |||
| 1797 | static int rt2500pci_set_retry_limit(struct ieee80211_hw *hw, | 1761 | static int rt2500pci_set_retry_limit(struct ieee80211_hw *hw, |
| 1798 | u32 short_retry, u32 long_retry) | 1762 | u32 short_retry, u32 long_retry) |
| 1799 | { | 1763 | { |
| @@ -1894,7 +1858,7 @@ static const struct ieee80211_ops rt2500pci_mac80211_ops = { | |||
| 1894 | .remove_interface = rt2x00mac_remove_interface, | 1858 | .remove_interface = rt2x00mac_remove_interface, |
| 1895 | .config = rt2x00mac_config, | 1859 | .config = rt2x00mac_config, |
| 1896 | .config_interface = rt2x00mac_config_interface, | 1860 | .config_interface = rt2x00mac_config_interface, |
| 1897 | .configure_filter = rt2500pci_configure_filter, | 1861 | .configure_filter = rt2x00mac_configure_filter, |
| 1898 | .get_stats = rt2x00mac_get_stats, | 1862 | .get_stats = rt2x00mac_get_stats, |
| 1899 | .set_retry_limit = rt2500pci_set_retry_limit, | 1863 | .set_retry_limit = rt2500pci_set_retry_limit, |
| 1900 | .bss_info_changed = rt2x00mac_bss_info_changed, | 1864 | .bss_info_changed = rt2x00mac_bss_info_changed, |
| @@ -1922,6 +1886,7 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = { | |||
| 1922 | .write_tx_data = rt2x00pci_write_tx_data, | 1886 | .write_tx_data = rt2x00pci_write_tx_data, |
| 1923 | .kick_tx_queue = rt2500pci_kick_tx_queue, | 1887 | .kick_tx_queue = rt2500pci_kick_tx_queue, |
| 1924 | .fill_rxdone = rt2500pci_fill_rxdone, | 1888 | .fill_rxdone = rt2500pci_fill_rxdone, |
| 1889 | .config_filter = rt2500pci_config_filter, | ||
| 1925 | .config_intf = rt2500pci_config_intf, | 1890 | .config_intf = rt2500pci_config_intf, |
| 1926 | .config_erp = rt2500pci_config_erp, | 1891 | .config_erp = rt2500pci_config_erp, |
| 1927 | .config = rt2500pci_config, | 1892 | .config = rt2500pci_config, |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 8959a684f40b..f5c18f011e93 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
| @@ -316,6 +316,35 @@ static void rt2500usb_led_brightness(struct led_classdev *led_cdev, | |||
| 316 | /* | 316 | /* |
| 317 | * Configuration handlers. | 317 | * Configuration handlers. |
| 318 | */ | 318 | */ |
| 319 | static void rt2500usb_config_filter(struct rt2x00_dev *rt2x00dev, | ||
| 320 | const unsigned int filter_flags) | ||
| 321 | { | ||
| 322 | u16 reg; | ||
| 323 | |||
| 324 | /* | ||
| 325 | * Start configuration steps. | ||
| 326 | * Note that the version error will always be dropped | ||
| 327 | * and broadcast frames will always be accepted since | ||
| 328 | * there is no filter for it at this time. | ||
| 329 | */ | ||
| 330 | rt2500usb_register_read(rt2x00dev, TXRX_CSR2, ®); | ||
| 331 | rt2x00_set_field16(®, TXRX_CSR2_DROP_CRC, | ||
| 332 | !(filter_flags & FIF_FCSFAIL)); | ||
| 333 | rt2x00_set_field16(®, TXRX_CSR2_DROP_PHYSICAL, | ||
| 334 | !(filter_flags & FIF_PLCPFAIL)); | ||
| 335 | rt2x00_set_field16(®, TXRX_CSR2_DROP_CONTROL, | ||
| 336 | !(filter_flags & FIF_CONTROL)); | ||
| 337 | rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME, | ||
| 338 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 339 | rt2x00_set_field16(®, TXRX_CSR2_DROP_TODS, | ||
| 340 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 341 | rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 1); | ||
| 342 | rt2x00_set_field16(®, TXRX_CSR2_DROP_MULTICAST, | ||
| 343 | !(filter_flags & FIF_ALLMULTI)); | ||
| 344 | rt2x00_set_field16(®, TXRX_CSR2_DROP_BROADCAST, 0); | ||
| 345 | rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg); | ||
| 346 | } | ||
| 347 | |||
| 319 | static void rt2500usb_config_intf(struct rt2x00_dev *rt2x00dev, | 348 | static void rt2500usb_config_intf(struct rt2x00_dev *rt2x00dev, |
| 320 | struct rt2x00_intf *intf, | 349 | struct rt2x00_intf *intf, |
| 321 | struct rt2x00intf_conf *conf, | 350 | struct rt2x00intf_conf *conf, |
| @@ -358,18 +387,11 @@ static void rt2500usb_config_intf(struct rt2x00_dev *rt2x00dev, | |||
| 358 | (3 * sizeof(__le16))); | 387 | (3 * sizeof(__le16))); |
| 359 | } | 388 | } |
| 360 | 389 | ||
| 361 | static int rt2500usb_config_erp(struct rt2x00_dev *rt2x00dev, | 390 | static void rt2500usb_config_erp(struct rt2x00_dev *rt2x00dev, |
| 362 | struct rt2x00lib_erp *erp) | 391 | struct rt2x00lib_erp *erp) |
| 363 | { | 392 | { |
| 364 | u16 reg; | 393 | u16 reg; |
| 365 | 394 | ||
| 366 | /* | ||
| 367 | * When in atomic context, we should let rt2x00lib | ||
| 368 | * try this configuration again later. | ||
| 369 | */ | ||
| 370 | if (in_atomic()) | ||
| 371 | return -EAGAIN; | ||
| 372 | |||
| 373 | rt2500usb_register_read(rt2x00dev, TXRX_CSR1, ®); | 395 | rt2500usb_register_read(rt2x00dev, TXRX_CSR1, ®); |
| 374 | rt2x00_set_field16(®, TXRX_CSR1_ACK_TIMEOUT, erp->ack_timeout); | 396 | rt2x00_set_field16(®, TXRX_CSR1_ACK_TIMEOUT, erp->ack_timeout); |
| 375 | rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg); | 397 | rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg); |
| @@ -378,8 +400,6 @@ static int rt2500usb_config_erp(struct rt2x00_dev *rt2x00dev, | |||
| 378 | rt2x00_set_field16(®, TXRX_CSR10_AUTORESPOND_PREAMBLE, | 400 | rt2x00_set_field16(®, TXRX_CSR10_AUTORESPOND_PREAMBLE, |
| 379 | !!erp->short_preamble); | 401 | !!erp->short_preamble); |
| 380 | rt2500usb_register_write(rt2x00dev, TXRX_CSR10, reg); | 402 | rt2500usb_register_write(rt2x00dev, TXRX_CSR10, reg); |
| 381 | |||
| 382 | return 0; | ||
| 383 | } | 403 | } |
| 384 | 404 | ||
| 385 | static void rt2500usb_config_phymode(struct rt2x00_dev *rt2x00dev, | 405 | static void rt2500usb_config_phymode(struct rt2x00_dev *rt2x00dev, |
| @@ -1644,6 +1664,7 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 1644 | */ | 1664 | */ |
| 1645 | __set_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags); | 1665 | __set_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags); |
| 1646 | __set_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags); | 1666 | __set_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags); |
| 1667 | __set_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags); | ||
| 1647 | 1668 | ||
| 1648 | /* | 1669 | /* |
| 1649 | * Set the rssi offset. | 1670 | * Set the rssi offset. |
| @@ -1656,78 +1677,6 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 1656 | /* | 1677 | /* |
| 1657 | * IEEE80211 stack callback functions. | 1678 | * IEEE80211 stack callback functions. |
| 1658 | */ | 1679 | */ |
| 1659 | static void rt2500usb_configure_filter(struct ieee80211_hw *hw, | ||
| 1660 | unsigned int changed_flags, | ||
| 1661 | unsigned int *total_flags, | ||
| 1662 | int mc_count, | ||
| 1663 | struct dev_addr_list *mc_list) | ||
| 1664 | { | ||
| 1665 | struct rt2x00_dev *rt2x00dev = hw->priv; | ||
| 1666 | u16 reg; | ||
| 1667 | |||
| 1668 | /* | ||
| 1669 | * Mask off any flags we are going to ignore from | ||
| 1670 | * the total_flags field. | ||
| 1671 | */ | ||
| 1672 | *total_flags &= | ||
| 1673 | FIF_ALLMULTI | | ||
| 1674 | FIF_FCSFAIL | | ||
| 1675 | FIF_PLCPFAIL | | ||
| 1676 | FIF_CONTROL | | ||
| 1677 | FIF_OTHER_BSS | | ||
| 1678 | FIF_PROMISC_IN_BSS; | ||
| 1679 | |||
| 1680 | /* | ||
| 1681 | * Apply some rules to the filters: | ||
| 1682 | * - Some filters imply different filters to be set. | ||
| 1683 | * - Some things we can't filter out at all. | ||
| 1684 | */ | ||
| 1685 | if (mc_count) | ||
| 1686 | *total_flags |= FIF_ALLMULTI; | ||
| 1687 | if (*total_flags & FIF_OTHER_BSS || | ||
| 1688 | *total_flags & FIF_PROMISC_IN_BSS) | ||
| 1689 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; | ||
| 1690 | |||
| 1691 | /* | ||
| 1692 | * Check if there is any work left for us. | ||
| 1693 | */ | ||
| 1694 | if (rt2x00dev->packet_filter == *total_flags) | ||
| 1695 | return; | ||
| 1696 | rt2x00dev->packet_filter = *total_flags; | ||
| 1697 | |||
| 1698 | /* | ||
| 1699 | * When in atomic context, reschedule and let rt2x00lib | ||
| 1700 | * call this function again. | ||
| 1701 | */ | ||
| 1702 | if (in_atomic()) { | ||
| 1703 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->filter_work); | ||
| 1704 | return; | ||
| 1705 | } | ||
| 1706 | |||
| 1707 | /* | ||
| 1708 | * Start configuration steps. | ||
| 1709 | * Note that the version error will always be dropped | ||
| 1710 | * and broadcast frames will always be accepted since | ||
| 1711 | * there is no filter for it at this time. | ||
| 1712 | */ | ||
| 1713 | rt2500usb_register_read(rt2x00dev, TXRX_CSR2, ®); | ||
| 1714 | rt2x00_set_field16(®, TXRX_CSR2_DROP_CRC, | ||
| 1715 | !(*total_flags & FIF_FCSFAIL)); | ||
| 1716 | rt2x00_set_field16(®, TXRX_CSR2_DROP_PHYSICAL, | ||
| 1717 | !(*total_flags & FIF_PLCPFAIL)); | ||
| 1718 | rt2x00_set_field16(®, TXRX_CSR2_DROP_CONTROL, | ||
| 1719 | !(*total_flags & FIF_CONTROL)); | ||
| 1720 | rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME, | ||
| 1721 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 1722 | rt2x00_set_field16(®, TXRX_CSR2_DROP_TODS, | ||
| 1723 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 1724 | rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 1); | ||
| 1725 | rt2x00_set_field16(®, TXRX_CSR2_DROP_MULTICAST, | ||
| 1726 | !(*total_flags & FIF_ALLMULTI)); | ||
| 1727 | rt2x00_set_field16(®, TXRX_CSR2_DROP_BROADCAST, 0); | ||
| 1728 | rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg); | ||
| 1729 | } | ||
| 1730 | |||
| 1731 | static int rt2500usb_beacon_update(struct ieee80211_hw *hw, | 1680 | static int rt2500usb_beacon_update(struct ieee80211_hw *hw, |
| 1732 | struct sk_buff *skb, | 1681 | struct sk_buff *skb, |
| 1733 | struct ieee80211_tx_control *control) | 1682 | struct ieee80211_tx_control *control) |
| @@ -1824,7 +1773,7 @@ static const struct ieee80211_ops rt2500usb_mac80211_ops = { | |||
| 1824 | .remove_interface = rt2x00mac_remove_interface, | 1773 | .remove_interface = rt2x00mac_remove_interface, |
| 1825 | .config = rt2x00mac_config, | 1774 | .config = rt2x00mac_config, |
| 1826 | .config_interface = rt2x00mac_config_interface, | 1775 | .config_interface = rt2x00mac_config_interface, |
| 1827 | .configure_filter = rt2500usb_configure_filter, | 1776 | .configure_filter = rt2x00mac_configure_filter, |
| 1828 | .get_stats = rt2x00mac_get_stats, | 1777 | .get_stats = rt2x00mac_get_stats, |
| 1829 | .bss_info_changed = rt2x00mac_bss_info_changed, | 1778 | .bss_info_changed = rt2x00mac_bss_info_changed, |
| 1830 | .conf_tx = rt2x00mac_conf_tx, | 1779 | .conf_tx = rt2x00mac_conf_tx, |
| @@ -1848,6 +1797,7 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = { | |||
| 1848 | .get_tx_data_len = rt2500usb_get_tx_data_len, | 1797 | .get_tx_data_len = rt2500usb_get_tx_data_len, |
| 1849 | .kick_tx_queue = rt2500usb_kick_tx_queue, | 1798 | .kick_tx_queue = rt2500usb_kick_tx_queue, |
| 1850 | .fill_rxdone = rt2500usb_fill_rxdone, | 1799 | .fill_rxdone = rt2500usb_fill_rxdone, |
| 1800 | .config_filter = rt2500usb_config_filter, | ||
| 1851 | .config_intf = rt2500usb_config_intf, | 1801 | .config_intf = rt2500usb_config_intf, |
| 1852 | .config_erp = rt2500usb_config_erp, | 1802 | .config_erp = rt2500usb_config_erp, |
| 1853 | .config = rt2500usb_config, | 1803 | .config = rt2500usb_config, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index c016bfe1defd..333484ddb993 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
| @@ -560,6 +560,8 @@ struct rt2x00lib_ops { | |||
| 560 | /* | 560 | /* |
| 561 | * Configuration handlers. | 561 | * Configuration handlers. |
| 562 | */ | 562 | */ |
| 563 | void (*config_filter) (struct rt2x00_dev *rt2x00dev, | ||
| 564 | const unsigned int filter_flags); | ||
| 563 | void (*config_intf) (struct rt2x00_dev *rt2x00dev, | 565 | void (*config_intf) (struct rt2x00_dev *rt2x00dev, |
| 564 | struct rt2x00_intf *intf, | 566 | struct rt2x00_intf *intf, |
| 565 | struct rt2x00intf_conf *conf, | 567 | struct rt2x00intf_conf *conf, |
| @@ -568,8 +570,8 @@ struct rt2x00lib_ops { | |||
| 568 | #define CONFIG_UPDATE_MAC ( 1 << 2 ) | 570 | #define CONFIG_UPDATE_MAC ( 1 << 2 ) |
| 569 | #define CONFIG_UPDATE_BSSID ( 1 << 3 ) | 571 | #define CONFIG_UPDATE_BSSID ( 1 << 3 ) |
| 570 | 572 | ||
| 571 | int (*config_erp) (struct rt2x00_dev *rt2x00dev, | 573 | void (*config_erp) (struct rt2x00_dev *rt2x00dev, |
| 572 | struct rt2x00lib_erp *erp); | 574 | struct rt2x00lib_erp *erp); |
| 573 | void (*config) (struct rt2x00_dev *rt2x00dev, | 575 | void (*config) (struct rt2x00_dev *rt2x00dev, |
| 574 | struct rt2x00lib_conf *libconf, | 576 | struct rt2x00lib_conf *libconf, |
| 575 | const unsigned int flags); | 577 | const unsigned int flags); |
| @@ -624,6 +626,7 @@ enum rt2x00_flags { | |||
| 624 | DRIVER_REQUIRE_FIRMWARE, | 626 | DRIVER_REQUIRE_FIRMWARE, |
| 625 | DRIVER_REQUIRE_BEACON_GUARD, | 627 | DRIVER_REQUIRE_BEACON_GUARD, |
| 626 | DRIVER_REQUIRE_ATIM_QUEUE, | 628 | DRIVER_REQUIRE_ATIM_QUEUE, |
| 629 | DRIVER_REQUIRE_SCHEDULED, | ||
| 627 | 630 | ||
| 628 | /* | 631 | /* |
| 629 | * Driver configuration | 632 | * Driver configuration |
| @@ -987,6 +990,10 @@ int rt2x00mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf); | |||
| 987 | int rt2x00mac_config_interface(struct ieee80211_hw *hw, | 990 | int rt2x00mac_config_interface(struct ieee80211_hw *hw, |
| 988 | struct ieee80211_vif *vif, | 991 | struct ieee80211_vif *vif, |
| 989 | struct ieee80211_if_conf *conf); | 992 | struct ieee80211_if_conf *conf); |
| 993 | void rt2x00mac_configure_filter(struct ieee80211_hw *hw, | ||
| 994 | unsigned int changed_flags, | ||
| 995 | unsigned int *total_flags, | ||
| 996 | int mc_count, struct dev_addr_list *mc_list); | ||
| 990 | int rt2x00mac_get_stats(struct ieee80211_hw *hw, | 997 | int rt2x00mac_get_stats(struct ieee80211_hw *hw, |
| 991 | struct ieee80211_low_level_stats *stats); | 998 | struct ieee80211_low_level_stats *stats); |
| 992 | int rt2x00mac_get_tx_stats(struct ieee80211_hw *hw, | 999 | int rt2x00mac_get_tx_stats(struct ieee80211_hw *hw, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c index 5e2d81a9e438..a9930a03f450 100644 --- a/drivers/net/wireless/rt2x00/rt2x00config.c +++ b/drivers/net/wireless/rt2x00/rt2x00config.c | |||
| @@ -80,7 +80,6 @@ void rt2x00lib_config_erp(struct rt2x00_dev *rt2x00dev, | |||
| 80 | struct ieee80211_bss_conf *bss_conf) | 80 | struct ieee80211_bss_conf *bss_conf) |
| 81 | { | 81 | { |
| 82 | struct rt2x00lib_erp erp; | 82 | struct rt2x00lib_erp erp; |
| 83 | int retval; | ||
| 84 | 83 | ||
| 85 | memset(&erp, 0, sizeof(erp)); | 84 | memset(&erp, 0, sizeof(erp)); |
| 86 | 85 | ||
| @@ -101,14 +100,7 @@ void rt2x00lib_config_erp(struct rt2x00_dev *rt2x00dev, | |||
| 101 | erp.ack_consume_time += PREAMBLE; | 100 | erp.ack_consume_time += PREAMBLE; |
| 102 | } | 101 | } |
| 103 | 102 | ||
| 104 | retval = rt2x00dev->ops->lib->config_erp(rt2x00dev, &erp); | 103 | rt2x00dev->ops->lib->config_erp(rt2x00dev, &erp); |
| 105 | |||
| 106 | if (retval) { | ||
| 107 | spin_lock(&intf->lock); | ||
| 108 | intf->delayed_flags |= DELAYED_CONFIG_ERP; | ||
| 109 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work); | ||
| 110 | spin_unlock(&intf->lock); | ||
| 111 | } | ||
| 112 | } | 104 | } |
| 113 | 105 | ||
| 114 | void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, | 106 | void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index 0a11c27d603b..17b6bb034ebf 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
| @@ -380,6 +380,50 @@ int rt2x00mac_config_interface(struct ieee80211_hw *hw, | |||
| 380 | } | 380 | } |
| 381 | EXPORT_SYMBOL_GPL(rt2x00mac_config_interface); | 381 | EXPORT_SYMBOL_GPL(rt2x00mac_config_interface); |
| 382 | 382 | ||
| 383 | void rt2x00mac_configure_filter(struct ieee80211_hw *hw, | ||
| 384 | unsigned int changed_flags, | ||
| 385 | unsigned int *total_flags, | ||
| 386 | int mc_count, struct dev_addr_list *mc_list) | ||
| 387 | { | ||
| 388 | struct rt2x00_dev *rt2x00dev = hw->priv; | ||
| 389 | |||
| 390 | /* | ||
| 391 | * Mask off any flags we are going to ignore | ||
| 392 | * from the total_flags field. | ||
| 393 | */ | ||
| 394 | *total_flags &= | ||
| 395 | FIF_ALLMULTI | | ||
| 396 | FIF_FCSFAIL | | ||
| 397 | FIF_PLCPFAIL | | ||
| 398 | FIF_CONTROL | | ||
| 399 | FIF_OTHER_BSS | | ||
| 400 | FIF_PROMISC_IN_BSS; | ||
| 401 | |||
| 402 | /* | ||
| 403 | * Apply some rules to the filters: | ||
| 404 | * - Some filters imply different filters to be set. | ||
| 405 | * - Some things we can't filter out at all. | ||
| 406 | * - Multicast filter seems to kill broadcast traffic so never use it. | ||
| 407 | */ | ||
| 408 | *total_flags |= FIF_ALLMULTI; | ||
| 409 | if (*total_flags & FIF_OTHER_BSS || | ||
| 410 | *total_flags & FIF_PROMISC_IN_BSS) | ||
| 411 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; | ||
| 412 | |||
| 413 | /* | ||
| 414 | * Check if there is any work left for us. | ||
| 415 | */ | ||
| 416 | if (rt2x00dev->packet_filter == *total_flags) | ||
| 417 | return; | ||
| 418 | rt2x00dev->packet_filter = *total_flags; | ||
| 419 | |||
| 420 | if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags)) | ||
| 421 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->filter_work); | ||
| 422 | else | ||
| 423 | rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags); | ||
| 424 | } | ||
| 425 | EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter); | ||
| 426 | |||
| 383 | int rt2x00mac_get_stats(struct ieee80211_hw *hw, | 427 | int rt2x00mac_get_stats(struct ieee80211_hw *hw, |
| 384 | struct ieee80211_low_level_stats *stats) | 428 | struct ieee80211_low_level_stats *stats) |
| 385 | { | 429 | { |
| @@ -419,6 +463,7 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, | |||
| 419 | { | 463 | { |
| 420 | struct rt2x00_dev *rt2x00dev = hw->priv; | 464 | struct rt2x00_dev *rt2x00dev = hw->priv; |
| 421 | struct rt2x00_intf *intf = vif_to_intf(vif); | 465 | struct rt2x00_intf *intf = vif_to_intf(vif); |
| 466 | unsigned int delayed = 0; | ||
| 422 | 467 | ||
| 423 | /* | 468 | /* |
| 424 | * When the association status has changed we must reset the link | 469 | * When the association status has changed we must reset the link |
| @@ -439,11 +484,19 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, | |||
| 439 | * When the erp information has changed, we should perform | 484 | * When the erp information has changed, we should perform |
| 440 | * additional configuration steps. For all other changes we are done. | 485 | * additional configuration steps. For all other changes we are done. |
| 441 | */ | 486 | */ |
| 442 | if (changes & BSS_CHANGED_ERP_PREAMBLE) | 487 | if (changes & BSS_CHANGED_ERP_PREAMBLE) { |
| 443 | rt2x00lib_config_erp(rt2x00dev, intf, bss_conf); | 488 | if (!test_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags)) |
| 489 | rt2x00lib_config_erp(rt2x00dev, intf, bss_conf); | ||
| 490 | else | ||
| 491 | delayed |= DELAYED_CONFIG_ERP; | ||
| 492 | } | ||
| 444 | 493 | ||
| 445 | spin_lock(&intf->lock); | 494 | spin_lock(&intf->lock); |
| 446 | memcpy(&intf->conf, bss_conf, sizeof(*bss_conf)); | 495 | memcpy(&intf->conf, bss_conf, sizeof(*bss_conf)); |
| 496 | if (delayed) { | ||
| 497 | intf->delayed_flags |= delayed; | ||
| 498 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->intf_work); | ||
| 499 | } | ||
| 447 | spin_unlock(&intf->lock); | 500 | spin_unlock(&intf->lock); |
| 448 | } | 501 | } |
| 449 | EXPORT_SYMBOL_GPL(rt2x00mac_bss_info_changed); | 502 | EXPORT_SYMBOL_GPL(rt2x00mac_bss_info_changed); |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 6e643c8db42e..0d2e6f7dd692 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
| @@ -321,6 +321,37 @@ static void rt61pci_led_brightness(struct led_classdev *led_cdev, | |||
| 321 | /* | 321 | /* |
| 322 | * Configuration handlers. | 322 | * Configuration handlers. |
| 323 | */ | 323 | */ |
| 324 | static void rt61pci_config_filter(struct rt2x00_dev *rt2x00dev, | ||
| 325 | const unsigned int filter_flags) | ||
| 326 | { | ||
| 327 | u32 reg; | ||
| 328 | |||
| 329 | /* | ||
| 330 | * Start configuration steps. | ||
| 331 | * Note that the version error will always be dropped | ||
| 332 | * and broadcast frames will always be accepted since | ||
| 333 | * there is no filter for it at this time. | ||
| 334 | */ | ||
| 335 | rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, ®); | ||
| 336 | rt2x00_set_field32(®, TXRX_CSR0_DROP_CRC, | ||
| 337 | !(filter_flags & FIF_FCSFAIL)); | ||
| 338 | rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, | ||
| 339 | !(filter_flags & FIF_PLCPFAIL)); | ||
| 340 | rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, | ||
| 341 | !(filter_flags & FIF_CONTROL)); | ||
| 342 | rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, | ||
| 343 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 344 | rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, | ||
| 345 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 346 | rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); | ||
| 347 | rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST, | ||
| 348 | !(filter_flags & FIF_ALLMULTI)); | ||
| 349 | rt2x00_set_field32(®, TXRX_CSR0_DROP_BROADCAST, 0); | ||
| 350 | rt2x00_set_field32(®, TXRX_CSR0_DROP_ACK_CTS, | ||
| 351 | !(filter_flags & FIF_CONTROL)); | ||
| 352 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg); | ||
| 353 | } | ||
| 354 | |||
| 324 | static void rt61pci_config_intf(struct rt2x00_dev *rt2x00dev, | 355 | static void rt61pci_config_intf(struct rt2x00_dev *rt2x00dev, |
| 325 | struct rt2x00_intf *intf, | 356 | struct rt2x00_intf *intf, |
| 326 | struct rt2x00intf_conf *conf, | 357 | struct rt2x00intf_conf *conf, |
| @@ -368,8 +399,8 @@ static void rt61pci_config_intf(struct rt2x00_dev *rt2x00dev, | |||
| 368 | } | 399 | } |
| 369 | } | 400 | } |
| 370 | 401 | ||
| 371 | static int rt61pci_config_erp(struct rt2x00_dev *rt2x00dev, | 402 | static void rt61pci_config_erp(struct rt2x00_dev *rt2x00dev, |
| 372 | struct rt2x00lib_erp *erp) | 403 | struct rt2x00lib_erp *erp) |
| 373 | { | 404 | { |
| 374 | u32 reg; | 405 | u32 reg; |
| 375 | 406 | ||
| @@ -381,8 +412,6 @@ static int rt61pci_config_erp(struct rt2x00_dev *rt2x00dev, | |||
| 381 | rt2x00_set_field32(®, TXRX_CSR4_AUTORESPOND_PREAMBLE, | 412 | rt2x00_set_field32(®, TXRX_CSR4_AUTORESPOND_PREAMBLE, |
| 382 | !!erp->short_preamble); | 413 | !!erp->short_preamble); |
| 383 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR4, reg); | 414 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR4, reg); |
| 384 | |||
| 385 | return 0; | ||
| 386 | } | 415 | } |
| 387 | 416 | ||
| 388 | static void rt61pci_config_phymode(struct rt2x00_dev *rt2x00dev, | 417 | static void rt61pci_config_phymode(struct rt2x00_dev *rt2x00dev, |
| @@ -2284,71 +2313,6 @@ static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 2284 | /* | 2313 | /* |
| 2285 | * IEEE80211 stack callback functions. | 2314 | * IEEE80211 stack callback functions. |
| 2286 | */ | 2315 | */ |
| 2287 | static void rt61pci_configure_filter(struct ieee80211_hw *hw, | ||
| 2288 | unsigned int changed_flags, | ||
| 2289 | unsigned int *total_flags, | ||
| 2290 | int mc_count, | ||
| 2291 | struct dev_addr_list *mc_list) | ||
| 2292 | { | ||
| 2293 | struct rt2x00_dev *rt2x00dev = hw->priv; | ||
| 2294 | u32 reg; | ||
| 2295 | |||
| 2296 | /* | ||
| 2297 | * Mask off any flags we are going to ignore from | ||
| 2298 | * the total_flags field. | ||
| 2299 | */ | ||
| 2300 | *total_flags &= | ||
| 2301 | FIF_ALLMULTI | | ||
| 2302 | FIF_FCSFAIL | | ||
| 2303 | FIF_PLCPFAIL | | ||
| 2304 | FIF_CONTROL | | ||
| 2305 | FIF_OTHER_BSS | | ||
| 2306 | FIF_PROMISC_IN_BSS; | ||
| 2307 | |||
| 2308 | /* | ||
| 2309 | * Apply some rules to the filters: | ||
| 2310 | * - Some filters imply different filters to be set. | ||
| 2311 | * - Some things we can't filter out at all. | ||
| 2312 | * - Multicast filter seems to kill broadcast traffic so never use it. | ||
| 2313 | */ | ||
| 2314 | *total_flags |= FIF_ALLMULTI; | ||
| 2315 | if (*total_flags & FIF_OTHER_BSS || | ||
| 2316 | *total_flags & FIF_PROMISC_IN_BSS) | ||
| 2317 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; | ||
| 2318 | |||
| 2319 | /* | ||
| 2320 | * Check if there is any work left for us. | ||
| 2321 | */ | ||
| 2322 | if (rt2x00dev->packet_filter == *total_flags) | ||
| 2323 | return; | ||
| 2324 | rt2x00dev->packet_filter = *total_flags; | ||
| 2325 | |||
| 2326 | /* | ||
| 2327 | * Start configuration steps. | ||
| 2328 | * Note that the version error will always be dropped | ||
| 2329 | * and broadcast frames will always be accepted since | ||
| 2330 | * there is no filter for it at this time. | ||
| 2331 | */ | ||
| 2332 | rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, ®); | ||
| 2333 | rt2x00_set_field32(®, TXRX_CSR0_DROP_CRC, | ||
| 2334 | !(*total_flags & FIF_FCSFAIL)); | ||
| 2335 | rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, | ||
| 2336 | !(*total_flags & FIF_PLCPFAIL)); | ||
| 2337 | rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, | ||
| 2338 | !(*total_flags & FIF_CONTROL)); | ||
| 2339 | rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, | ||
| 2340 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 2341 | rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, | ||
| 2342 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 2343 | rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); | ||
| 2344 | rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST, | ||
| 2345 | !(*total_flags & FIF_ALLMULTI)); | ||
| 2346 | rt2x00_set_field32(®, TXRX_CSR0_DROP_BROADCAST, 0); | ||
| 2347 | rt2x00_set_field32(®, TXRX_CSR0_DROP_ACK_CTS, | ||
| 2348 | !(*total_flags & FIF_CONTROL)); | ||
| 2349 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg); | ||
| 2350 | } | ||
| 2351 | |||
| 2352 | static int rt61pci_set_retry_limit(struct ieee80211_hw *hw, | 2316 | static int rt61pci_set_retry_limit(struct ieee80211_hw *hw, |
| 2353 | u32 short_retry, u32 long_retry) | 2317 | u32 short_retry, u32 long_retry) |
| 2354 | { | 2318 | { |
| @@ -2457,7 +2421,7 @@ static const struct ieee80211_ops rt61pci_mac80211_ops = { | |||
| 2457 | .remove_interface = rt2x00mac_remove_interface, | 2421 | .remove_interface = rt2x00mac_remove_interface, |
| 2458 | .config = rt2x00mac_config, | 2422 | .config = rt2x00mac_config, |
| 2459 | .config_interface = rt2x00mac_config_interface, | 2423 | .config_interface = rt2x00mac_config_interface, |
| 2460 | .configure_filter = rt61pci_configure_filter, | 2424 | .configure_filter = rt2x00mac_configure_filter, |
| 2461 | .get_stats = rt2x00mac_get_stats, | 2425 | .get_stats = rt2x00mac_get_stats, |
| 2462 | .set_retry_limit = rt61pci_set_retry_limit, | 2426 | .set_retry_limit = rt61pci_set_retry_limit, |
| 2463 | .bss_info_changed = rt2x00mac_bss_info_changed, | 2427 | .bss_info_changed = rt2x00mac_bss_info_changed, |
| @@ -2487,6 +2451,7 @@ static const struct rt2x00lib_ops rt61pci_rt2x00_ops = { | |||
| 2487 | .write_tx_data = rt2x00pci_write_tx_data, | 2451 | .write_tx_data = rt2x00pci_write_tx_data, |
| 2488 | .kick_tx_queue = rt61pci_kick_tx_queue, | 2452 | .kick_tx_queue = rt61pci_kick_tx_queue, |
| 2489 | .fill_rxdone = rt61pci_fill_rxdone, | 2453 | .fill_rxdone = rt61pci_fill_rxdone, |
| 2454 | .config_filter = rt61pci_config_filter, | ||
| 2490 | .config_intf = rt61pci_config_intf, | 2455 | .config_intf = rt61pci_config_intf, |
| 2491 | .config_erp = rt61pci_config_erp, | 2456 | .config_erp = rt61pci_config_erp, |
| 2492 | .config = rt61pci_config, | 2457 | .config = rt61pci_config, |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index b50f476e4bd1..187e832bab2e 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
| @@ -333,6 +333,37 @@ static void rt73usb_led_brightness(struct led_classdev *led_cdev, | |||
| 333 | /* | 333 | /* |
| 334 | * Configuration handlers. | 334 | * Configuration handlers. |
| 335 | */ | 335 | */ |
| 336 | static void rt73usb_config_filter(struct rt2x00_dev *rt2x00dev, | ||
| 337 | const unsigned int filter_flags) | ||
| 338 | { | ||
| 339 | u32 reg; | ||
| 340 | |||
| 341 | /* | ||
| 342 | * Start configuration steps. | ||
| 343 | * Note that the version error will always be dropped | ||
| 344 | * and broadcast frames will always be accepted since | ||
| 345 | * there is no filter for it at this time. | ||
| 346 | */ | ||
| 347 | rt73usb_register_read(rt2x00dev, TXRX_CSR0, ®); | ||
| 348 | rt2x00_set_field32(®, TXRX_CSR0_DROP_CRC, | ||
| 349 | !(filter_flags & FIF_FCSFAIL)); | ||
| 350 | rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, | ||
| 351 | !(filter_flags & FIF_PLCPFAIL)); | ||
| 352 | rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, | ||
| 353 | !(filter_flags & FIF_CONTROL)); | ||
| 354 | rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, | ||
| 355 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 356 | rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, | ||
| 357 | !(filter_flags & FIF_PROMISC_IN_BSS)); | ||
| 358 | rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); | ||
| 359 | rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST, | ||
| 360 | !(filter_flags & FIF_ALLMULTI)); | ||
| 361 | rt2x00_set_field32(®, TXRX_CSR0_DROP_BROADCAST, 0); | ||
| 362 | rt2x00_set_field32(®, TXRX_CSR0_DROP_ACK_CTS, | ||
| 363 | !(filter_flags & FIF_CONTROL)); | ||
| 364 | rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg); | ||
| 365 | } | ||
| 366 | |||
| 336 | static void rt73usb_config_intf(struct rt2x00_dev *rt2x00dev, | 367 | static void rt73usb_config_intf(struct rt2x00_dev *rt2x00dev, |
| 337 | struct rt2x00_intf *intf, | 368 | struct rt2x00_intf *intf, |
| 338 | struct rt2x00intf_conf *conf, | 369 | struct rt2x00intf_conf *conf, |
| @@ -380,18 +411,11 @@ static void rt73usb_config_intf(struct rt2x00_dev *rt2x00dev, | |||
| 380 | } | 411 | } |
| 381 | } | 412 | } |
| 382 | 413 | ||
| 383 | static int rt73usb_config_erp(struct rt2x00_dev *rt2x00dev, | 414 | static void rt73usb_config_erp(struct rt2x00_dev *rt2x00dev, |
| 384 | struct rt2x00lib_erp *erp) | 415 | struct rt2x00lib_erp *erp) |
| 385 | { | 416 | { |
| 386 | u32 reg; | 417 | u32 reg; |
| 387 | 418 | ||
| 388 | /* | ||
| 389 | * When in atomic context, we should let rt2x00lib | ||
| 390 | * try this configuration again later. | ||
| 391 | */ | ||
| 392 | if (in_atomic()) | ||
| 393 | return -EAGAIN; | ||
| 394 | |||
| 395 | rt73usb_register_read(rt2x00dev, TXRX_CSR0, ®); | 419 | rt73usb_register_read(rt2x00dev, TXRX_CSR0, ®); |
| 396 | rt2x00_set_field32(®, TXRX_CSR0_RX_ACK_TIMEOUT, erp->ack_timeout); | 420 | rt2x00_set_field32(®, TXRX_CSR0_RX_ACK_TIMEOUT, erp->ack_timeout); |
| 397 | rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg); | 421 | rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg); |
| @@ -400,8 +424,6 @@ static int rt73usb_config_erp(struct rt2x00_dev *rt2x00dev, | |||
| 400 | rt2x00_set_field32(®, TXRX_CSR4_AUTORESPOND_PREAMBLE, | 424 | rt2x00_set_field32(®, TXRX_CSR4_AUTORESPOND_PREAMBLE, |
| 401 | !!erp->short_preamble); | 425 | !!erp->short_preamble); |
| 402 | rt73usb_register_write(rt2x00dev, TXRX_CSR4, reg); | 426 | rt73usb_register_write(rt2x00dev, TXRX_CSR4, reg); |
| 403 | |||
| 404 | return 0; | ||
| 405 | } | 427 | } |
| 406 | 428 | ||
| 407 | static void rt73usb_config_phymode(struct rt2x00_dev *rt2x00dev, | 429 | static void rt73usb_config_phymode(struct rt2x00_dev *rt2x00dev, |
| @@ -1872,6 +1894,7 @@ static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 1872 | * This device requires firmware. | 1894 | * This device requires firmware. |
| 1873 | */ | 1895 | */ |
| 1874 | __set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags); | 1896 | __set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags); |
| 1897 | __set_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags); | ||
| 1875 | 1898 | ||
| 1876 | /* | 1899 | /* |
| 1877 | * Set the rssi offset. | 1900 | * Set the rssi offset. |
| @@ -1884,80 +1907,6 @@ static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 1884 | /* | 1907 | /* |
| 1885 | * IEEE80211 stack callback functions. | 1908 | * IEEE80211 stack callback functions. |
| 1886 | */ | 1909 | */ |
| 1887 | static void rt73usb_configure_filter(struct ieee80211_hw *hw, | ||
| 1888 | unsigned int changed_flags, | ||
| 1889 | unsigned int *total_flags, | ||
| 1890 | int mc_count, | ||
| 1891 | struct dev_addr_list *mc_list) | ||
| 1892 | { | ||
| 1893 | struct rt2x00_dev *rt2x00dev = hw->priv; | ||
| 1894 | u32 reg; | ||
| 1895 | |||
| 1896 | /* | ||
| 1897 | * Mask off any flags we are going to ignore from | ||
| 1898 | * the total_flags field. | ||
| 1899 | */ | ||
| 1900 | *total_flags &= | ||
| 1901 | FIF_ALLMULTI | | ||
| 1902 | FIF_FCSFAIL | | ||
| 1903 | FIF_PLCPFAIL | | ||
| 1904 | FIF_CONTROL | | ||
| 1905 | FIF_OTHER_BSS | | ||
| 1906 | FIF_PROMISC_IN_BSS; | ||
| 1907 | |||
| 1908 | /* | ||
| 1909 | * Apply some rules to the filters: | ||
| 1910 | * - Some filters imply different filters to be set. | ||
| 1911 | * - Some things we can't filter out at all. | ||
| 1912 | * - Multicast filter seems to kill broadcast traffic so never use it. | ||
| 1913 | */ | ||
| 1914 | *total_flags |= FIF_ALLMULTI; | ||
| 1915 | if (*total_flags & FIF_OTHER_BSS || | ||
| 1916 | *total_flags & FIF_PROMISC_IN_BSS) | ||
| 1917 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; | ||
| 1918 | |||
| 1919 | /* | ||
| 1920 | * Check if there is any work left for us. | ||
| 1921 | */ | ||
| 1922 | if (rt2x00dev->packet_filter == *total_flags) | ||
| 1923 | return; | ||
| 1924 | rt2x00dev->packet_filter = *total_flags; | ||
| 1925 | |||
| 1926 | /* | ||
| 1927 | * When in atomic context, reschedule and let rt2x00lib | ||
| 1928 | * call this function again. | ||
| 1929 | */ | ||
| 1930 | if (in_atomic()) { | ||
| 1931 | queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->filter_work); | ||
| 1932 | return; | ||
| 1933 | } | ||
| 1934 | |||
| 1935 | /* | ||
| 1936 | * Start configuration steps. | ||
| 1937 | * Note that the version error will always be dropped | ||
| 1938 | * and broadcast frames will always be accepted since | ||
| 1939 | * there is no filter for it at this time. | ||
| 1940 | */ | ||
| 1941 | rt73usb_register_read(rt2x00dev, TXRX_CSR0, ®); | ||
| 1942 | rt2x00_set_field32(®, TXRX_CSR0_DROP_CRC, | ||
| 1943 | !(*total_flags & FIF_FCSFAIL)); | ||
| 1944 | rt2x00_set_field32(®, TXRX_CSR0_DROP_PHYSICAL, | ||
| 1945 | !(*total_flags & FIF_PLCPFAIL)); | ||
| 1946 | rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, | ||
| 1947 | !(*total_flags & FIF_CONTROL)); | ||
| 1948 | rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, | ||
| 1949 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 1950 | rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, | ||
| 1951 | !(*total_flags & FIF_PROMISC_IN_BSS)); | ||
| 1952 | rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); | ||
| 1953 | rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST, | ||
| 1954 | !(*total_flags & FIF_ALLMULTI)); | ||
| 1955 | rt2x00_set_field32(®, TXRX_CSR0_DROP_BROADCAST, 0); | ||
| 1956 | rt2x00_set_field32(®, TXRX_CSR0_DROP_ACK_CTS, | ||
| 1957 | !(*total_flags & FIF_CONTROL)); | ||
| 1958 | rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg); | ||
| 1959 | } | ||
| 1960 | |||
| 1961 | static int rt73usb_set_retry_limit(struct ieee80211_hw *hw, | 1910 | static int rt73usb_set_retry_limit(struct ieee80211_hw *hw, |
| 1962 | u32 short_retry, u32 long_retry) | 1911 | u32 short_retry, u32 long_retry) |
| 1963 | { | 1912 | { |
| @@ -2067,7 +2016,7 @@ static const struct ieee80211_ops rt73usb_mac80211_ops = { | |||
| 2067 | .remove_interface = rt2x00mac_remove_interface, | 2016 | .remove_interface = rt2x00mac_remove_interface, |
| 2068 | .config = rt2x00mac_config, | 2017 | .config = rt2x00mac_config, |
| 2069 | .config_interface = rt2x00mac_config_interface, | 2018 | .config_interface = rt2x00mac_config_interface, |
| 2070 | .configure_filter = rt73usb_configure_filter, | 2019 | .configure_filter = rt2x00mac_configure_filter, |
| 2071 | .get_stats = rt2x00mac_get_stats, | 2020 | .get_stats = rt2x00mac_get_stats, |
| 2072 | .set_retry_limit = rt73usb_set_retry_limit, | 2021 | .set_retry_limit = rt73usb_set_retry_limit, |
| 2073 | .bss_info_changed = rt2x00mac_bss_info_changed, | 2022 | .bss_info_changed = rt2x00mac_bss_info_changed, |
| @@ -2096,6 +2045,7 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = { | |||
| 2096 | .get_tx_data_len = rt73usb_get_tx_data_len, | 2045 | .get_tx_data_len = rt73usb_get_tx_data_len, |
| 2097 | .kick_tx_queue = rt73usb_kick_tx_queue, | 2046 | .kick_tx_queue = rt73usb_kick_tx_queue, |
| 2098 | .fill_rxdone = rt73usb_fill_rxdone, | 2047 | .fill_rxdone = rt73usb_fill_rxdone, |
| 2048 | .config_filter = rt73usb_config_filter, | ||
| 2099 | .config_intf = rt73usb_config_intf, | 2049 | .config_intf = rt73usb_config_intf, |
| 2100 | .config_erp = rt73usb_config_erp, | 2050 | .config_erp = rt73usb_config_erp, |
| 2101 | .config = rt73usb_config, | 2051 | .config = rt73usb_config, |
