diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-06-20 19:24:02 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-06-20 19:24:02 -0400 |
| commit | ff446f2001cf9b5ed97c6256c4ee3549d3b7abed (patch) | |
| tree | ec5fd60a8b9c21ae85eaa99003f26e6c342e2234 /drivers/net/wireless | |
| parent | 78091dc2f6f04b03131218df590c877cadcd9379 (diff) | |
| parent | 485802a6c524e62b5924849dd727ddbb1497cc71 (diff) | |
Merge 3.5-rc3 into usb-next
This lets us catch the USB fixes that went into 3.5-rc3 into this branch,
as we want them here as well.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/net/wireless')
| -rw-r--r-- | drivers/net/wireless/b43/b43.h | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/main.c | 19 | ||||
| -rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2100.c | 20 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 23 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-sta.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-drv.c | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-eeprom.c | 18 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-mac80211.c | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-prph.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans-pcie.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/mac80211_hwsim.c | 22 | ||||
| -rw-r--r-- | drivers/net/wireless/mwifiex/cfg80211.c | 13 | ||||
| -rw-r--r-- | drivers/net/wireless/mwifiex/fw.h | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/mwifiex/uap_cmd.c | 10 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 3 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00mac.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 13 | ||||
| -rw-r--r-- | drivers/net/wireless/rtl818x/rtl8187/leds.c | 2 |
19 files changed, 129 insertions, 49 deletions
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index 67c13af6f206..c06b6cb5c91e 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
| @@ -877,6 +877,10 @@ struct b43_wl { | |||
| 877 | * from the mac80211 subsystem. */ | 877 | * from the mac80211 subsystem. */ |
| 878 | u16 mac80211_initially_registered_queues; | 878 | u16 mac80211_initially_registered_queues; |
| 879 | 879 | ||
| 880 | /* Set this if we call ieee80211_register_hw() and check if we call | ||
| 881 | * ieee80211_unregister_hw(). */ | ||
| 882 | bool hw_registred; | ||
| 883 | |||
| 880 | /* We can only have one operating interface (802.11 core) | 884 | /* We can only have one operating interface (802.11 core) |
| 881 | * at a time. General information about this interface follows. | 885 | * at a time. General information about this interface follows. |
| 882 | */ | 886 | */ |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 5a39b226b2e3..acd03a4f9730 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -2437,6 +2437,7 @@ start_ieee80211: | |||
| 2437 | err = ieee80211_register_hw(wl->hw); | 2437 | err = ieee80211_register_hw(wl->hw); |
| 2438 | if (err) | 2438 | if (err) |
| 2439 | goto err_one_core_detach; | 2439 | goto err_one_core_detach; |
| 2440 | wl->hw_registred = true; | ||
| 2440 | b43_leds_register(wl->current_dev); | 2441 | b43_leds_register(wl->current_dev); |
| 2441 | goto out; | 2442 | goto out; |
| 2442 | 2443 | ||
| @@ -5299,6 +5300,7 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev) | |||
| 5299 | 5300 | ||
| 5300 | hw->queues = modparam_qos ? B43_QOS_QUEUE_NUM : 1; | 5301 | hw->queues = modparam_qos ? B43_QOS_QUEUE_NUM : 1; |
| 5301 | wl->mac80211_initially_registered_queues = hw->queues; | 5302 | wl->mac80211_initially_registered_queues = hw->queues; |
| 5303 | wl->hw_registred = false; | ||
| 5302 | hw->max_rates = 2; | 5304 | hw->max_rates = 2; |
| 5303 | SET_IEEE80211_DEV(hw, dev->dev); | 5305 | SET_IEEE80211_DEV(hw, dev->dev); |
| 5304 | if (is_valid_ether_addr(sprom->et1mac)) | 5306 | if (is_valid_ether_addr(sprom->et1mac)) |
| @@ -5370,12 +5372,15 @@ static void b43_bcma_remove(struct bcma_device *core) | |||
| 5370 | * as the ieee80211 unreg will destroy the workqueue. */ | 5372 | * as the ieee80211 unreg will destroy the workqueue. */ |
| 5371 | cancel_work_sync(&wldev->restart_work); | 5373 | cancel_work_sync(&wldev->restart_work); |
| 5372 | 5374 | ||
| 5373 | /* Restore the queues count before unregistering, because firmware detect | 5375 | B43_WARN_ON(!wl); |
| 5374 | * might have modified it. Restoring is important, so the networking | 5376 | if (wl->current_dev == wldev && wl->hw_registred) { |
| 5375 | * stack can properly free resources. */ | 5377 | /* Restore the queues count before unregistering, because firmware detect |
| 5376 | wl->hw->queues = wl->mac80211_initially_registered_queues; | 5378 | * might have modified it. Restoring is important, so the networking |
| 5377 | b43_leds_stop(wldev); | 5379 | * stack can properly free resources. */ |
| 5378 | ieee80211_unregister_hw(wl->hw); | 5380 | wl->hw->queues = wl->mac80211_initially_registered_queues; |
| 5381 | b43_leds_stop(wldev); | ||
| 5382 | ieee80211_unregister_hw(wl->hw); | ||
| 5383 | } | ||
| 5379 | 5384 | ||
| 5380 | b43_one_core_detach(wldev->dev); | 5385 | b43_one_core_detach(wldev->dev); |
| 5381 | 5386 | ||
| @@ -5446,7 +5451,7 @@ static void b43_ssb_remove(struct ssb_device *sdev) | |||
| 5446 | cancel_work_sync(&wldev->restart_work); | 5451 | cancel_work_sync(&wldev->restart_work); |
| 5447 | 5452 | ||
| 5448 | B43_WARN_ON(!wl); | 5453 | B43_WARN_ON(!wl); |
| 5449 | if (wl->current_dev == wldev) { | 5454 | if (wl->current_dev == wldev && wl->hw_registred) { |
| 5450 | /* Restore the queues count before unregistering, because firmware detect | 5455 | /* Restore the queues count before unregistering, because firmware detect |
| 5451 | * might have modified it. Restoring is important, so the networking | 5456 | * might have modified it. Restoring is important, so the networking |
| 5452 | * stack can properly free resources. */ | 5457 | * stack can properly free resources. */ |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c index e2480d196276..8e7e6928c936 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | |||
| @@ -89,9 +89,9 @@ int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev) | |||
| 89 | data |= 1 << SDIO_FUNC_1 | 1 << SDIO_FUNC_2 | 1; | 89 | data |= 1 << SDIO_FUNC_1 | 1 << SDIO_FUNC_2 | 1; |
| 90 | brcmf_sdio_regwb(sdiodev, SDIO_CCCR_IENx, data, &ret); | 90 | brcmf_sdio_regwb(sdiodev, SDIO_CCCR_IENx, data, &ret); |
| 91 | 91 | ||
| 92 | /* redirect, configure ane enable io for interrupt signal */ | 92 | /* redirect, configure and enable io for interrupt signal */ |
| 93 | data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE; | 93 | data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE; |
| 94 | if (sdiodev->irq_flags | IRQF_TRIGGER_HIGH) | 94 | if (sdiodev->irq_flags & IRQF_TRIGGER_HIGH) |
| 95 | data |= SDIO_SEPINT_ACT_HI; | 95 | data |= SDIO_SEPINT_ACT_HI; |
| 96 | brcmf_sdio_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret); | 96 | brcmf_sdio_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret); |
| 97 | 97 | ||
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c index 9cfae0c08707..95aa8e1683ec 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/ipw2x00/ipw2100.c | |||
| @@ -1903,14 +1903,6 @@ static void ipw2100_down(struct ipw2100_priv *priv) | |||
| 1903 | netif_stop_queue(priv->net_dev); | 1903 | netif_stop_queue(priv->net_dev); |
| 1904 | } | 1904 | } |
| 1905 | 1905 | ||
| 1906 | /* Called by register_netdev() */ | ||
| 1907 | static int ipw2100_net_init(struct net_device *dev) | ||
| 1908 | { | ||
| 1909 | struct ipw2100_priv *priv = libipw_priv(dev); | ||
| 1910 | |||
| 1911 | return ipw2100_up(priv, 1); | ||
| 1912 | } | ||
| 1913 | |||
| 1914 | static int ipw2100_wdev_init(struct net_device *dev) | 1906 | static int ipw2100_wdev_init(struct net_device *dev) |
| 1915 | { | 1907 | { |
| 1916 | struct ipw2100_priv *priv = libipw_priv(dev); | 1908 | struct ipw2100_priv *priv = libipw_priv(dev); |
| @@ -6087,7 +6079,6 @@ static const struct net_device_ops ipw2100_netdev_ops = { | |||
| 6087 | .ndo_stop = ipw2100_close, | 6079 | .ndo_stop = ipw2100_close, |
| 6088 | .ndo_start_xmit = libipw_xmit, | 6080 | .ndo_start_xmit = libipw_xmit, |
| 6089 | .ndo_change_mtu = libipw_change_mtu, | 6081 | .ndo_change_mtu = libipw_change_mtu, |
| 6090 | .ndo_init = ipw2100_net_init, | ||
| 6091 | .ndo_tx_timeout = ipw2100_tx_timeout, | 6082 | .ndo_tx_timeout = ipw2100_tx_timeout, |
| 6092 | .ndo_set_mac_address = ipw2100_set_address, | 6083 | .ndo_set_mac_address = ipw2100_set_address, |
| 6093 | .ndo_validate_addr = eth_validate_addr, | 6084 | .ndo_validate_addr = eth_validate_addr, |
| @@ -6329,6 +6320,10 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, | |||
| 6329 | printk(KERN_INFO DRV_NAME | 6320 | printk(KERN_INFO DRV_NAME |
| 6330 | ": Detected Intel PRO/Wireless 2100 Network Connection\n"); | 6321 | ": Detected Intel PRO/Wireless 2100 Network Connection\n"); |
| 6331 | 6322 | ||
| 6323 | err = ipw2100_up(priv, 1); | ||
| 6324 | if (err) | ||
| 6325 | goto fail; | ||
| 6326 | |||
| 6332 | err = ipw2100_wdev_init(dev); | 6327 | err = ipw2100_wdev_init(dev); |
| 6333 | if (err) | 6328 | if (err) |
| 6334 | goto fail; | 6329 | goto fail; |
| @@ -6338,12 +6333,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, | |||
| 6338 | * network device we would call ipw2100_up. This introduced a race | 6333 | * network device we would call ipw2100_up. This introduced a race |
| 6339 | * condition with newer hotplug configurations (network was coming | 6334 | * condition with newer hotplug configurations (network was coming |
| 6340 | * up and making calls before the device was initialized). | 6335 | * up and making calls before the device was initialized). |
| 6341 | * | 6336 | */ |
| 6342 | * If we called ipw2100_up before we registered the device, then the | ||
| 6343 | * device name wasn't registered. So, we instead use the net_dev->init | ||
| 6344 | * member to call a function that then just turns and calls ipw2100_up. | ||
| 6345 | * net_dev->init is called after name allocation but before the | ||
| 6346 | * notifier chain is called */ | ||
| 6347 | err = register_netdev(dev); | 6337 | err = register_netdev(dev); |
| 6348 | if (err) { | 6338 | if (err) { |
| 6349 | printk(KERN_WARNING DRV_NAME | 6339 | printk(KERN_WARNING DRV_NAME |
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index 19f7ee84ae89..e5e8ada4aaf6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | |||
| @@ -35,17 +35,20 @@ | |||
| 35 | #define IWL6000_UCODE_API_MAX 6 | 35 | #define IWL6000_UCODE_API_MAX 6 |
| 36 | #define IWL6050_UCODE_API_MAX 5 | 36 | #define IWL6050_UCODE_API_MAX 5 |
| 37 | #define IWL6000G2_UCODE_API_MAX 6 | 37 | #define IWL6000G2_UCODE_API_MAX 6 |
| 38 | #define IWL6035_UCODE_API_MAX 6 | ||
| 38 | 39 | ||
| 39 | /* Oldest version we won't warn about */ | 40 | /* Oldest version we won't warn about */ |
| 40 | #define IWL6000_UCODE_API_OK 4 | 41 | #define IWL6000_UCODE_API_OK 4 |
| 41 | #define IWL6000G2_UCODE_API_OK 5 | 42 | #define IWL6000G2_UCODE_API_OK 5 |
| 42 | #define IWL6050_UCODE_API_OK 5 | 43 | #define IWL6050_UCODE_API_OK 5 |
| 43 | #define IWL6000G2B_UCODE_API_OK 6 | 44 | #define IWL6000G2B_UCODE_API_OK 6 |
| 45 | #define IWL6035_UCODE_API_OK 6 | ||
| 44 | 46 | ||
| 45 | /* Lowest firmware API version supported */ | 47 | /* Lowest firmware API version supported */ |
| 46 | #define IWL6000_UCODE_API_MIN 4 | 48 | #define IWL6000_UCODE_API_MIN 4 |
| 47 | #define IWL6050_UCODE_API_MIN 4 | 49 | #define IWL6050_UCODE_API_MIN 4 |
| 48 | #define IWL6000G2_UCODE_API_MIN 4 | 50 | #define IWL6000G2_UCODE_API_MIN 5 |
| 51 | #define IWL6035_UCODE_API_MIN 6 | ||
| 49 | 52 | ||
| 50 | /* EEPROM versions */ | 53 | /* EEPROM versions */ |
| 51 | #define EEPROM_6000_TX_POWER_VERSION (4) | 54 | #define EEPROM_6000_TX_POWER_VERSION (4) |
| @@ -227,9 +230,25 @@ const struct iwl_cfg iwl6030_2bg_cfg = { | |||
| 227 | IWL_DEVICE_6030, | 230 | IWL_DEVICE_6030, |
| 228 | }; | 231 | }; |
| 229 | 232 | ||
| 233 | #define IWL_DEVICE_6035 \ | ||
| 234 | .fw_name_pre = IWL6030_FW_PRE, \ | ||
| 235 | .ucode_api_max = IWL6035_UCODE_API_MAX, \ | ||
| 236 | .ucode_api_ok = IWL6035_UCODE_API_OK, \ | ||
| 237 | .ucode_api_min = IWL6035_UCODE_API_MIN, \ | ||
| 238 | .device_family = IWL_DEVICE_FAMILY_6030, \ | ||
| 239 | .max_inst_size = IWL60_RTC_INST_SIZE, \ | ||
| 240 | .max_data_size = IWL60_RTC_DATA_SIZE, \ | ||
| 241 | .eeprom_ver = EEPROM_6030_EEPROM_VERSION, \ | ||
| 242 | .eeprom_calib_ver = EEPROM_6030_TX_POWER_VERSION, \ | ||
| 243 | .base_params = &iwl6000_g2_base_params, \ | ||
| 244 | .bt_params = &iwl6000_bt_params, \ | ||
| 245 | .need_temp_offset_calib = true, \ | ||
| 246 | .led_mode = IWL_LED_RF_STATE, \ | ||
| 247 | .adv_pm = true | ||
| 248 | |||
| 230 | const struct iwl_cfg iwl6035_2agn_cfg = { | 249 | const struct iwl_cfg iwl6035_2agn_cfg = { |
| 231 | .name = "Intel(R) Centrino(R) Advanced-N 6235 AGN", | 250 | .name = "Intel(R) Centrino(R) Advanced-N 6235 AGN", |
| 232 | IWL_DEVICE_6030, | 251 | IWL_DEVICE_6035, |
| 233 | .ht_params = &iwl6000_ht_params, | 252 | .ht_params = &iwl6000_ht_params, |
| 234 | }; | 253 | }; |
| 235 | 254 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c index aea07aab3c9e..eb6a8eaf42fc 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c | |||
| @@ -1267,7 +1267,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, | |||
| 1267 | key_flags |= STA_KEY_MULTICAST_MSK; | 1267 | key_flags |= STA_KEY_MULTICAST_MSK; |
| 1268 | 1268 | ||
| 1269 | sta_cmd.key.key_flags = key_flags; | 1269 | sta_cmd.key.key_flags = key_flags; |
| 1270 | sta_cmd.key.key_offset = WEP_INVALID_OFFSET; | 1270 | sta_cmd.key.key_offset = keyconf->hw_key_idx; |
| 1271 | sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; | 1271 | sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; |
| 1272 | sta_cmd.mode = STA_CONTROL_MODIFY_MSK; | 1272 | sta_cmd.mode = STA_CONTROL_MODIFY_MSK; |
| 1273 | 1273 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c index d742900969ea..fac67a526a30 100644 --- a/drivers/net/wireless/iwlwifi/iwl-drv.c +++ b/drivers/net/wireless/iwlwifi/iwl-drv.c | |||
| @@ -861,13 +861,18 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) | |||
| 861 | 861 | ||
| 862 | /* We have our copies now, allow OS release its copies */ | 862 | /* We have our copies now, allow OS release its copies */ |
| 863 | release_firmware(ucode_raw); | 863 | release_firmware(ucode_raw); |
| 864 | complete(&drv->request_firmware_complete); | ||
| 865 | 864 | ||
| 866 | drv->op_mode = iwl_dvm_ops.start(drv->trans, drv->cfg, &drv->fw); | 865 | drv->op_mode = iwl_dvm_ops.start(drv->trans, drv->cfg, &drv->fw); |
| 867 | 866 | ||
| 868 | if (!drv->op_mode) | 867 | if (!drv->op_mode) |
| 869 | goto out_free_fw; | 868 | goto out_unbind; |
| 870 | 869 | ||
| 870 | /* | ||
| 871 | * Complete the firmware request last so that | ||
| 872 | * a driver unbind (stop) doesn't run while we | ||
| 873 | * are doing the start() above. | ||
| 874 | */ | ||
| 875 | complete(&drv->request_firmware_complete); | ||
| 871 | return; | 876 | return; |
| 872 | 877 | ||
| 873 | try_again: | 878 | try_again: |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c index 50c58911e718..b8e2b223ac36 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c | |||
| @@ -568,28 +568,28 @@ static int iwl_find_otp_image(struct iwl_trans *trans, | |||
| 568 | * iwl_get_max_txpower_avg - get the highest tx power from all chains. | 568 | * iwl_get_max_txpower_avg - get the highest tx power from all chains. |
| 569 | * find the highest tx power from all chains for the channel | 569 | * find the highest tx power from all chains for the channel |
| 570 | */ | 570 | */ |
| 571 | static s8 iwl_get_max_txpower_avg(const struct iwl_cfg *cfg, | 571 | static s8 iwl_get_max_txpower_avg(struct iwl_priv *priv, |
| 572 | struct iwl_eeprom_enhanced_txpwr *enhanced_txpower, | 572 | struct iwl_eeprom_enhanced_txpwr *enhanced_txpower, |
| 573 | int element, s8 *max_txpower_in_half_dbm) | 573 | int element, s8 *max_txpower_in_half_dbm) |
| 574 | { | 574 | { |
| 575 | s8 max_txpower_avg = 0; /* (dBm) */ | 575 | s8 max_txpower_avg = 0; /* (dBm) */ |
| 576 | 576 | ||
| 577 | /* Take the highest tx power from any valid chains */ | 577 | /* Take the highest tx power from any valid chains */ |
| 578 | if ((cfg->valid_tx_ant & ANT_A) && | 578 | if ((priv->hw_params.valid_tx_ant & ANT_A) && |
| 579 | (enhanced_txpower[element].chain_a_max > max_txpower_avg)) | 579 | (enhanced_txpower[element].chain_a_max > max_txpower_avg)) |
| 580 | max_txpower_avg = enhanced_txpower[element].chain_a_max; | 580 | max_txpower_avg = enhanced_txpower[element].chain_a_max; |
| 581 | if ((cfg->valid_tx_ant & ANT_B) && | 581 | if ((priv->hw_params.valid_tx_ant & ANT_B) && |
| 582 | (enhanced_txpower[element].chain_b_max > max_txpower_avg)) | 582 | (enhanced_txpower[element].chain_b_max > max_txpower_avg)) |
| 583 | max_txpower_avg = enhanced_txpower[element].chain_b_max; | 583 | max_txpower_avg = enhanced_txpower[element].chain_b_max; |
| 584 | if ((cfg->valid_tx_ant & ANT_C) && | 584 | if ((priv->hw_params.valid_tx_ant & ANT_C) && |
| 585 | (enhanced_txpower[element].chain_c_max > max_txpower_avg)) | 585 | (enhanced_txpower[element].chain_c_max > max_txpower_avg)) |
| 586 | max_txpower_avg = enhanced_txpower[element].chain_c_max; | 586 | max_txpower_avg = enhanced_txpower[element].chain_c_max; |
| 587 | if (((cfg->valid_tx_ant == ANT_AB) | | 587 | if (((priv->hw_params.valid_tx_ant == ANT_AB) | |
| 588 | (cfg->valid_tx_ant == ANT_BC) | | 588 | (priv->hw_params.valid_tx_ant == ANT_BC) | |
| 589 | (cfg->valid_tx_ant == ANT_AC)) && | 589 | (priv->hw_params.valid_tx_ant == ANT_AC)) && |
| 590 | (enhanced_txpower[element].mimo2_max > max_txpower_avg)) | 590 | (enhanced_txpower[element].mimo2_max > max_txpower_avg)) |
| 591 | max_txpower_avg = enhanced_txpower[element].mimo2_max; | 591 | max_txpower_avg = enhanced_txpower[element].mimo2_max; |
| 592 | if ((cfg->valid_tx_ant == ANT_ABC) && | 592 | if ((priv->hw_params.valid_tx_ant == ANT_ABC) && |
| 593 | (enhanced_txpower[element].mimo3_max > max_txpower_avg)) | 593 | (enhanced_txpower[element].mimo3_max > max_txpower_avg)) |
| 594 | max_txpower_avg = enhanced_txpower[element].mimo3_max; | 594 | max_txpower_avg = enhanced_txpower[element].mimo3_max; |
| 595 | 595 | ||
| @@ -691,7 +691,7 @@ static void iwl_eeprom_enhanced_txpower(struct iwl_priv *priv) | |||
| 691 | ((txp->delta_20_in_40 & 0xf0) >> 4), | 691 | ((txp->delta_20_in_40 & 0xf0) >> 4), |
| 692 | (txp->delta_20_in_40 & 0x0f)); | 692 | (txp->delta_20_in_40 & 0x0f)); |
| 693 | 693 | ||
| 694 | max_txp_avg = iwl_get_max_txpower_avg(priv->cfg, txp_array, idx, | 694 | max_txp_avg = iwl_get_max_txpower_avg(priv, txp_array, idx, |
| 695 | &max_txp_avg_halfdbm); | 695 | &max_txp_avg_halfdbm); |
| 696 | 696 | ||
| 697 | /* | 697 | /* |
diff --git a/drivers/net/wireless/iwlwifi/iwl-mac80211.c b/drivers/net/wireless/iwlwifi/iwl-mac80211.c index ab2f4d7500a4..3ee23134c02b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-mac80211.c +++ b/drivers/net/wireless/iwlwifi/iwl-mac80211.c | |||
| @@ -199,6 +199,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv, | |||
| 199 | WIPHY_FLAG_DISABLE_BEACON_HINTS | | 199 | WIPHY_FLAG_DISABLE_BEACON_HINTS | |
| 200 | WIPHY_FLAG_IBSS_RSN; | 200 | WIPHY_FLAG_IBSS_RSN; |
| 201 | 201 | ||
| 202 | #ifdef CONFIG_PM_SLEEP | ||
| 202 | if (priv->fw->img[IWL_UCODE_WOWLAN].sec[0].len && | 203 | if (priv->fw->img[IWL_UCODE_WOWLAN].sec[0].len && |
| 203 | priv->trans->ops->wowlan_suspend && | 204 | priv->trans->ops->wowlan_suspend && |
| 204 | device_can_wakeup(priv->trans->dev)) { | 205 | device_can_wakeup(priv->trans->dev)) { |
| @@ -217,6 +218,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv, | |||
| 217 | hw->wiphy->wowlan.pattern_max_len = | 218 | hw->wiphy->wowlan.pattern_max_len = |
| 218 | IWLAGN_WOWLAN_MAX_PATTERN_LEN; | 219 | IWLAGN_WOWLAN_MAX_PATTERN_LEN; |
| 219 | } | 220 | } |
| 221 | #endif | ||
| 220 | 222 | ||
| 221 | if (iwlwifi_mod_params.power_save) | 223 | if (iwlwifi_mod_params.power_save) |
| 222 | hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; | 224 | hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; |
| @@ -249,6 +251,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv, | |||
| 249 | ret = ieee80211_register_hw(priv->hw); | 251 | ret = ieee80211_register_hw(priv->hw); |
| 250 | if (ret) { | 252 | if (ret) { |
| 251 | IWL_ERR(priv, "Failed to register hw (error %d)\n", ret); | 253 | IWL_ERR(priv, "Failed to register hw (error %d)\n", ret); |
| 254 | iwl_leds_exit(priv); | ||
| 252 | return ret; | 255 | return ret; |
| 253 | } | 256 | } |
| 254 | priv->mac80211_registered = 1; | 257 | priv->mac80211_registered = 1; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h index 3b1069290fa9..dfd54662e3e6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h | |||
| @@ -224,6 +224,7 @@ | |||
| 224 | #define SCD_TXFACT (SCD_BASE + 0x10) | 224 | #define SCD_TXFACT (SCD_BASE + 0x10) |
| 225 | #define SCD_ACTIVE (SCD_BASE + 0x14) | 225 | #define SCD_ACTIVE (SCD_BASE + 0x14) |
| 226 | #define SCD_QUEUECHAIN_SEL (SCD_BASE + 0xe8) | 226 | #define SCD_QUEUECHAIN_SEL (SCD_BASE + 0xe8) |
| 227 | #define SCD_CHAINEXT_EN (SCD_BASE + 0x244) | ||
| 227 | #define SCD_AGGR_SEL (SCD_BASE + 0x248) | 228 | #define SCD_AGGR_SEL (SCD_BASE + 0x248) |
| 228 | #define SCD_INTERRUPT_MASK (SCD_BASE + 0x108) | 229 | #define SCD_INTERRUPT_MASK (SCD_BASE + 0x108) |
| 229 | 230 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c index ec6fb395b84d..79c6b91417f9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c | |||
| @@ -1058,6 +1058,11 @@ static void iwl_tx_start(struct iwl_trans *trans) | |||
| 1058 | iwl_write_prph(trans, SCD_DRAM_BASE_ADDR, | 1058 | iwl_write_prph(trans, SCD_DRAM_BASE_ADDR, |
| 1059 | trans_pcie->scd_bc_tbls.dma >> 10); | 1059 | trans_pcie->scd_bc_tbls.dma >> 10); |
| 1060 | 1060 | ||
| 1061 | /* The chain extension of the SCD doesn't work well. This feature is | ||
| 1062 | * enabled by default by the HW, so we need to disable it manually. | ||
| 1063 | */ | ||
| 1064 | iwl_write_prph(trans, SCD_CHAINEXT_EN, 0); | ||
| 1065 | |||
| 1061 | /* Enable DMA channel */ | 1066 | /* Enable DMA channel */ |
| 1062 | for (chan = 0; chan < FH_TCSR_CHNL_NUM ; chan++) | 1067 | for (chan = 0; chan < FH_TCSR_CHNL_NUM ; chan++) |
| 1063 | iwl_write_direct32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(chan), | 1068 | iwl_write_direct32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(chan), |
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index fb787df01666..a0b7cfd34685 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
| @@ -1555,6 +1555,7 @@ static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2, | |||
| 1555 | hdr = (struct ieee80211_hdr *) skb->data; | 1555 | hdr = (struct ieee80211_hdr *) skb->data; |
| 1556 | mac80211_hwsim_monitor_ack(data2->hw, hdr->addr2); | 1556 | mac80211_hwsim_monitor_ack(data2->hw, hdr->addr2); |
| 1557 | } | 1557 | } |
| 1558 | txi->flags |= IEEE80211_TX_STAT_ACK; | ||
| 1558 | } | 1559 | } |
| 1559 | ieee80211_tx_status_irqsafe(data2->hw, skb); | 1560 | ieee80211_tx_status_irqsafe(data2->hw, skb); |
| 1560 | return 0; | 1561 | return 0; |
| @@ -1721,6 +1722,24 @@ static void hwsim_exit_netlink(void) | |||
| 1721 | "unregister family %i\n", ret); | 1722 | "unregister family %i\n", ret); |
| 1722 | } | 1723 | } |
| 1723 | 1724 | ||
| 1725 | static const struct ieee80211_iface_limit hwsim_if_limits[] = { | ||
| 1726 | { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) }, | ||
| 1727 | { .max = 2048, .types = BIT(NL80211_IFTYPE_STATION) | | ||
| 1728 | BIT(NL80211_IFTYPE_P2P_CLIENT) | | ||
| 1729 | #ifdef CONFIG_MAC80211_MESH | ||
| 1730 | BIT(NL80211_IFTYPE_MESH_POINT) | | ||
| 1731 | #endif | ||
| 1732 | BIT(NL80211_IFTYPE_AP) | | ||
| 1733 | BIT(NL80211_IFTYPE_P2P_GO) }, | ||
| 1734 | }; | ||
| 1735 | |||
| 1736 | static const struct ieee80211_iface_combination hwsim_if_comb = { | ||
| 1737 | .limits = hwsim_if_limits, | ||
| 1738 | .n_limits = ARRAY_SIZE(hwsim_if_limits), | ||
| 1739 | .max_interfaces = 2048, | ||
| 1740 | .num_different_channels = 1, | ||
| 1741 | }; | ||
| 1742 | |||
| 1724 | static int __init init_mac80211_hwsim(void) | 1743 | static int __init init_mac80211_hwsim(void) |
| 1725 | { | 1744 | { |
| 1726 | int i, err = 0; | 1745 | int i, err = 0; |
| @@ -1782,6 +1801,9 @@ static int __init init_mac80211_hwsim(void) | |||
| 1782 | hw->wiphy->n_addresses = 2; | 1801 | hw->wiphy->n_addresses = 2; |
| 1783 | hw->wiphy->addresses = data->addresses; | 1802 | hw->wiphy->addresses = data->addresses; |
| 1784 | 1803 | ||
| 1804 | hw->wiphy->iface_combinations = &hwsim_if_comb; | ||
| 1805 | hw->wiphy->n_iface_combinations = 1; | ||
| 1806 | |||
| 1785 | if (fake_hw_scan) { | 1807 | if (fake_hw_scan) { |
| 1786 | hw->wiphy->max_scan_ssids = 255; | 1808 | hw->wiphy->max_scan_ssids = 255; |
| 1787 | hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; | 1809 | hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; |
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index 87671446e24b..015fec3371a0 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
| @@ -948,6 +948,19 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy, | |||
| 948 | bss_cfg->ssid.ssid_len = params->ssid_len; | 948 | bss_cfg->ssid.ssid_len = params->ssid_len; |
| 949 | } | 949 | } |
| 950 | 950 | ||
| 951 | switch (params->hidden_ssid) { | ||
| 952 | case NL80211_HIDDEN_SSID_NOT_IN_USE: | ||
| 953 | bss_cfg->bcast_ssid_ctl = 1; | ||
| 954 | break; | ||
| 955 | case NL80211_HIDDEN_SSID_ZERO_LEN: | ||
| 956 | bss_cfg->bcast_ssid_ctl = 0; | ||
| 957 | break; | ||
| 958 | case NL80211_HIDDEN_SSID_ZERO_CONTENTS: | ||
| 959 | /* firmware doesn't support this type of hidden SSID */ | ||
| 960 | default: | ||
| 961 | return -EINVAL; | ||
| 962 | } | ||
| 963 | |||
| 951 | if (mwifiex_set_secure_params(priv, bss_cfg, params)) { | 964 | if (mwifiex_set_secure_params(priv, bss_cfg, params)) { |
| 952 | kfree(bss_cfg); | 965 | kfree(bss_cfg); |
| 953 | wiphy_err(wiphy, "Failed to parse secuirty parameters!\n"); | 966 | wiphy_err(wiphy, "Failed to parse secuirty parameters!\n"); |
diff --git a/drivers/net/wireless/mwifiex/fw.h b/drivers/net/wireless/mwifiex/fw.h index 9f674bbebe65..561452a5c818 100644 --- a/drivers/net/wireless/mwifiex/fw.h +++ b/drivers/net/wireless/mwifiex/fw.h | |||
| @@ -122,6 +122,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER { | |||
| 122 | #define TLV_TYPE_CHANNELBANDLIST (PROPRIETARY_TLV_BASE_ID + 42) | 122 | #define TLV_TYPE_CHANNELBANDLIST (PROPRIETARY_TLV_BASE_ID + 42) |
| 123 | #define TLV_TYPE_UAP_BEACON_PERIOD (PROPRIETARY_TLV_BASE_ID + 44) | 123 | #define TLV_TYPE_UAP_BEACON_PERIOD (PROPRIETARY_TLV_BASE_ID + 44) |
| 124 | #define TLV_TYPE_UAP_DTIM_PERIOD (PROPRIETARY_TLV_BASE_ID + 45) | 124 | #define TLV_TYPE_UAP_DTIM_PERIOD (PROPRIETARY_TLV_BASE_ID + 45) |
| 125 | #define TLV_TYPE_UAP_BCAST_SSID (PROPRIETARY_TLV_BASE_ID + 48) | ||
| 125 | #define TLV_TYPE_UAP_RTS_THRESHOLD (PROPRIETARY_TLV_BASE_ID + 51) | 126 | #define TLV_TYPE_UAP_RTS_THRESHOLD (PROPRIETARY_TLV_BASE_ID + 51) |
| 126 | #define TLV_TYPE_UAP_WPA_PASSPHRASE (PROPRIETARY_TLV_BASE_ID + 60) | 127 | #define TLV_TYPE_UAP_WPA_PASSPHRASE (PROPRIETARY_TLV_BASE_ID + 60) |
| 127 | #define TLV_TYPE_UAP_ENCRY_PROTOCOL (PROPRIETARY_TLV_BASE_ID + 64) | 128 | #define TLV_TYPE_UAP_ENCRY_PROTOCOL (PROPRIETARY_TLV_BASE_ID + 64) |
| @@ -1209,6 +1210,11 @@ struct host_cmd_tlv_ssid { | |||
| 1209 | u8 ssid[0]; | 1210 | u8 ssid[0]; |
| 1210 | } __packed; | 1211 | } __packed; |
| 1211 | 1212 | ||
| 1213 | struct host_cmd_tlv_bcast_ssid { | ||
| 1214 | struct host_cmd_tlv tlv; | ||
| 1215 | u8 bcast_ctl; | ||
| 1216 | } __packed; | ||
| 1217 | |||
| 1212 | struct host_cmd_tlv_beacon_period { | 1218 | struct host_cmd_tlv_beacon_period { |
| 1213 | struct host_cmd_tlv tlv; | 1219 | struct host_cmd_tlv tlv; |
| 1214 | __le16 period; | 1220 | __le16 period; |
diff --git a/drivers/net/wireless/mwifiex/uap_cmd.c b/drivers/net/wireless/mwifiex/uap_cmd.c index 76dfbc42a732..8173ab66066d 100644 --- a/drivers/net/wireless/mwifiex/uap_cmd.c +++ b/drivers/net/wireless/mwifiex/uap_cmd.c | |||
| @@ -132,6 +132,7 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size) | |||
| 132 | struct host_cmd_tlv_dtim_period *dtim_period; | 132 | struct host_cmd_tlv_dtim_period *dtim_period; |
| 133 | struct host_cmd_tlv_beacon_period *beacon_period; | 133 | struct host_cmd_tlv_beacon_period *beacon_period; |
| 134 | struct host_cmd_tlv_ssid *ssid; | 134 | struct host_cmd_tlv_ssid *ssid; |
| 135 | struct host_cmd_tlv_bcast_ssid *bcast_ssid; | ||
| 135 | struct host_cmd_tlv_channel_band *chan_band; | 136 | struct host_cmd_tlv_channel_band *chan_band; |
| 136 | struct host_cmd_tlv_frag_threshold *frag_threshold; | 137 | struct host_cmd_tlv_frag_threshold *frag_threshold; |
| 137 | struct host_cmd_tlv_rts_threshold *rts_threshold; | 138 | struct host_cmd_tlv_rts_threshold *rts_threshold; |
| @@ -153,6 +154,14 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size) | |||
| 153 | cmd_size += sizeof(struct host_cmd_tlv) + | 154 | cmd_size += sizeof(struct host_cmd_tlv) + |
| 154 | bss_cfg->ssid.ssid_len; | 155 | bss_cfg->ssid.ssid_len; |
| 155 | tlv += sizeof(struct host_cmd_tlv) + bss_cfg->ssid.ssid_len; | 156 | tlv += sizeof(struct host_cmd_tlv) + bss_cfg->ssid.ssid_len; |
| 157 | |||
| 158 | bcast_ssid = (struct host_cmd_tlv_bcast_ssid *)tlv; | ||
| 159 | bcast_ssid->tlv.type = cpu_to_le16(TLV_TYPE_UAP_BCAST_SSID); | ||
| 160 | bcast_ssid->tlv.len = | ||
| 161 | cpu_to_le16(sizeof(bcast_ssid->bcast_ctl)); | ||
| 162 | bcast_ssid->bcast_ctl = bss_cfg->bcast_ssid_ctl; | ||
| 163 | cmd_size += sizeof(struct host_cmd_tlv_bcast_ssid); | ||
| 164 | tlv += sizeof(struct host_cmd_tlv_bcast_ssid); | ||
| 156 | } | 165 | } |
| 157 | if (bss_cfg->channel && bss_cfg->channel <= MAX_CHANNEL_BAND_BG) { | 166 | if (bss_cfg->channel && bss_cfg->channel <= MAX_CHANNEL_BAND_BG) { |
| 158 | chan_band = (struct host_cmd_tlv_channel_band *)tlv; | 167 | chan_band = (struct host_cmd_tlv_channel_band *)tlv; |
| @@ -416,6 +425,7 @@ int mwifiex_uap_set_channel(struct mwifiex_private *priv, int channel) | |||
| 416 | if (!bss_cfg) | 425 | if (!bss_cfg) |
| 417 | return -ENOMEM; | 426 | return -ENOMEM; |
| 418 | 427 | ||
| 428 | mwifiex_set_sys_config_invalid_data(bss_cfg); | ||
| 419 | bss_cfg->band_cfg = BAND_CONFIG_MANUAL; | 429 | bss_cfg->band_cfg = BAND_CONFIG_MANUAL; |
| 420 | bss_cfg->channel = channel; | 430 | bss_cfg->channel = channel; |
| 421 | 431 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index ca36cccaba31..8f754025b06e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
| @@ -396,8 +396,7 @@ struct rt2x00_intf { | |||
| 396 | * for hardware which doesn't support hardware | 396 | * for hardware which doesn't support hardware |
| 397 | * sequence counting. | 397 | * sequence counting. |
| 398 | */ | 398 | */ |
| 399 | spinlock_t seqlock; | 399 | atomic_t seqno; |
| 400 | u16 seqno; | ||
| 401 | }; | 400 | }; |
| 402 | 401 | ||
| 403 | static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif) | 402 | static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index b49773ef72f2..dd24b2663b5e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
| @@ -277,7 +277,6 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw, | |||
| 277 | else | 277 | else |
| 278 | rt2x00dev->intf_sta_count++; | 278 | rt2x00dev->intf_sta_count++; |
| 279 | 279 | ||
| 280 | spin_lock_init(&intf->seqlock); | ||
| 281 | mutex_init(&intf->beacon_skb_mutex); | 280 | mutex_init(&intf->beacon_skb_mutex); |
| 282 | intf->beacon = entry; | 281 | intf->beacon = entry; |
| 283 | 282 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 4c662eccf53c..2fd830103415 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
| @@ -207,6 +207,7 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev, | |||
| 207 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); | 207 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); |
| 208 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 208 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
| 209 | struct rt2x00_intf *intf = vif_to_intf(tx_info->control.vif); | 209 | struct rt2x00_intf *intf = vif_to_intf(tx_info->control.vif); |
| 210 | u16 seqno; | ||
| 210 | 211 | ||
| 211 | if (!(tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)) | 212 | if (!(tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)) |
| 212 | return; | 213 | return; |
| @@ -238,15 +239,13 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev, | |||
| 238 | * sequence counting per-frame, since those will override the | 239 | * sequence counting per-frame, since those will override the |
| 239 | * sequence counter given by mac80211. | 240 | * sequence counter given by mac80211. |
| 240 | */ | 241 | */ |
| 241 | spin_lock(&intf->seqlock); | ||
| 242 | |||
| 243 | if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)) | 242 | if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)) |
| 244 | intf->seqno += 0x10; | 243 | seqno = atomic_add_return(0x10, &intf->seqno); |
| 245 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | 244 | else |
| 246 | hdr->seq_ctrl |= cpu_to_le16(intf->seqno); | 245 | seqno = atomic_read(&intf->seqno); |
| 247 | |||
| 248 | spin_unlock(&intf->seqlock); | ||
| 249 | 246 | ||
| 247 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | ||
| 248 | hdr->seq_ctrl |= cpu_to_le16(seqno); | ||
| 250 | } | 249 | } |
| 251 | 250 | ||
| 252 | static void rt2x00queue_create_tx_descriptor_plcp(struct rt2x00_dev *rt2x00dev, | 251 | static void rt2x00queue_create_tx_descriptor_plcp(struct rt2x00_dev *rt2x00dev, |
diff --git a/drivers/net/wireless/rtl818x/rtl8187/leds.c b/drivers/net/wireless/rtl818x/rtl8187/leds.c index 2e0de2f5f0f9..c2d5b495c179 100644 --- a/drivers/net/wireless/rtl818x/rtl8187/leds.c +++ b/drivers/net/wireless/rtl818x/rtl8187/leds.c | |||
| @@ -117,7 +117,7 @@ static void rtl8187_led_brightness_set(struct led_classdev *led_dev, | |||
| 117 | radio_on = true; | 117 | radio_on = true; |
| 118 | } else if (radio_on) { | 118 | } else if (radio_on) { |
| 119 | radio_on = false; | 119 | radio_on = false; |
| 120 | cancel_delayed_work_sync(&priv->led_on); | 120 | cancel_delayed_work(&priv->led_on); |
| 121 | ieee80211_queue_delayed_work(hw, &priv->led_off, 0); | 121 | ieee80211_queue_delayed_work(hw, &priv->led_off, 0); |
| 122 | } | 122 | } |
| 123 | } else if (radio_on) { | 123 | } else if (radio_on) { |
