diff options
author | David S. Miller <davem@davemloft.net> | 2015-05-25 13:08:59 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-05-25 13:08:59 -0400 |
commit | c260c2f1e35621c41aaa0c7f5bddced3307f0039 (patch) | |
tree | 7958b602038e27e38bc760a575c21bed04c64f57 /drivers/net | |
parent | 3f7352bf21f8fd7ba3e2fcef9488756f188e12be (diff) | |
parent | aefa441b150279dd8d25658e018898a3fe9a6769 (diff) |
Merge tag 'wireless-drivers-for-davem-2015-05-25' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers
Kalle Valo says:
====================
iwlwifi:
* fix firmware name and other things to enable 3165
* fix bad APMG configuration for 8000 (no AMPG on these devices)
* fix MAC address assignment for 8000
* fix firmware debugging triggers (MLME)
* fix several bugs in low power states code (net-detect, d0i3)
ssb:
* fix reboot after device reset for WRT350N v1
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/iwlwifi/Kconfig | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-7000.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-nvm-parse.c | 30 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/coex_legacy.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/d3.c | 22 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mac80211.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/ops.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/rs.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 8 |
11 files changed, 69 insertions, 30 deletions
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig index ab019b45551b..f89f446e5c8a 100644 --- a/drivers/net/wireless/iwlwifi/Kconfig +++ b/drivers/net/wireless/iwlwifi/Kconfig | |||
@@ -21,6 +21,7 @@ config IWLWIFI | |||
21 | Intel 7260 Wi-Fi Adapter | 21 | Intel 7260 Wi-Fi Adapter |
22 | Intel 3160 Wi-Fi Adapter | 22 | Intel 3160 Wi-Fi Adapter |
23 | Intel 7265 Wi-Fi Adapter | 23 | Intel 7265 Wi-Fi Adapter |
24 | Intel 3165 Wi-Fi Adapter | ||
24 | 25 | ||
25 | 26 | ||
26 | This driver uses the kernel's mac80211 subsystem. | 27 | This driver uses the kernel's mac80211 subsystem. |
diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c index 36e786f0387b..74ad278116be 100644 --- a/drivers/net/wireless/iwlwifi/iwl-7000.c +++ b/drivers/net/wireless/iwlwifi/iwl-7000.c | |||
@@ -70,15 +70,14 @@ | |||
70 | 70 | ||
71 | /* Highest firmware API version supported */ | 71 | /* Highest firmware API version supported */ |
72 | #define IWL7260_UCODE_API_MAX 13 | 72 | #define IWL7260_UCODE_API_MAX 13 |
73 | #define IWL3160_UCODE_API_MAX 13 | ||
74 | 73 | ||
75 | /* Oldest version we won't warn about */ | 74 | /* Oldest version we won't warn about */ |
76 | #define IWL7260_UCODE_API_OK 12 | 75 | #define IWL7260_UCODE_API_OK 12 |
77 | #define IWL3160_UCODE_API_OK 12 | 76 | #define IWL3165_UCODE_API_OK 13 |
78 | 77 | ||
79 | /* Lowest firmware API version supported */ | 78 | /* Lowest firmware API version supported */ |
80 | #define IWL7260_UCODE_API_MIN 10 | 79 | #define IWL7260_UCODE_API_MIN 10 |
81 | #define IWL3160_UCODE_API_MIN 10 | 80 | #define IWL3165_UCODE_API_MIN 13 |
82 | 81 | ||
83 | /* NVM versions */ | 82 | /* NVM versions */ |
84 | #define IWL7260_NVM_VERSION 0x0a1d | 83 | #define IWL7260_NVM_VERSION 0x0a1d |
@@ -104,9 +103,6 @@ | |||
104 | #define IWL3160_FW_PRE "iwlwifi-3160-" | 103 | #define IWL3160_FW_PRE "iwlwifi-3160-" |
105 | #define IWL3160_MODULE_FIRMWARE(api) IWL3160_FW_PRE __stringify(api) ".ucode" | 104 | #define IWL3160_MODULE_FIRMWARE(api) IWL3160_FW_PRE __stringify(api) ".ucode" |
106 | 105 | ||
107 | #define IWL3165_FW_PRE "iwlwifi-3165-" | ||
108 | #define IWL3165_MODULE_FIRMWARE(api) IWL3165_FW_PRE __stringify(api) ".ucode" | ||
109 | |||
110 | #define IWL7265_FW_PRE "iwlwifi-7265-" | 106 | #define IWL7265_FW_PRE "iwlwifi-7265-" |
111 | #define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" | 107 | #define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode" |
112 | 108 | ||
@@ -248,8 +244,13 @@ static const struct iwl_ht_params iwl7265_ht_params = { | |||
248 | 244 | ||
249 | const struct iwl_cfg iwl3165_2ac_cfg = { | 245 | const struct iwl_cfg iwl3165_2ac_cfg = { |
250 | .name = "Intel(R) Dual Band Wireless AC 3165", | 246 | .name = "Intel(R) Dual Band Wireless AC 3165", |
251 | .fw_name_pre = IWL3165_FW_PRE, | 247 | .fw_name_pre = IWL7265D_FW_PRE, |
252 | IWL_DEVICE_7000, | 248 | IWL_DEVICE_7000, |
249 | /* sparse doens't like the re-assignment but it is safe */ | ||
250 | #ifndef __CHECKER__ | ||
251 | .ucode_api_ok = IWL3165_UCODE_API_OK, | ||
252 | .ucode_api_min = IWL3165_UCODE_API_MIN, | ||
253 | #endif | ||
253 | .ht_params = &iwl7000_ht_params, | 254 | .ht_params = &iwl7000_ht_params, |
254 | .nvm_ver = IWL3165_NVM_VERSION, | 255 | .nvm_ver = IWL3165_NVM_VERSION, |
255 | .nvm_calib_ver = IWL3165_TX_POWER_VERSION, | 256 | .nvm_calib_ver = IWL3165_TX_POWER_VERSION, |
@@ -325,6 +326,5 @@ const struct iwl_cfg iwl7265d_n_cfg = { | |||
325 | 326 | ||
326 | MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | 327 | MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
327 | MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK)); | 328 | MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK)); |
328 | MODULE_FIRMWARE(IWL3165_MODULE_FIRMWARE(IWL3160_UCODE_API_OK)); | ||
329 | MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | 329 | MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
330 | MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | 330 | MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c b/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c index 41ff85de7334..21302b6f2bfd 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c | |||
@@ -6,6 +6,7 @@ | |||
6 | * GPL LICENSE SUMMARY | 6 | * GPL LICENSE SUMMARY |
7 | * | 7 | * |
8 | * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. | 8 | * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. |
9 | * Copyright(c) 2015 Intel Mobile Communications GmbH | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of version 2 of the GNU General Public License as | 12 | * it under the terms of version 2 of the GNU General Public License as |
@@ -31,6 +32,7 @@ | |||
31 | * BSD LICENSE | 32 | * BSD LICENSE |
32 | * | 33 | * |
33 | * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. | 34 | * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. |
35 | * Copyright(c) 2015 Intel Mobile Communications GmbH | ||
34 | * All rights reserved. | 36 | * All rights reserved. |
35 | * | 37 | * |
36 | * Redistribution and use in source and binary forms, with or without | 38 | * Redistribution and use in source and binary forms, with or without |
@@ -748,6 +750,9 @@ void iwl_init_ht_hw_capab(const struct iwl_cfg *cfg, | |||
748 | return; | 750 | return; |
749 | } | 751 | } |
750 | 752 | ||
753 | if (data->sku_cap_mimo_disabled) | ||
754 | rx_chains = 1; | ||
755 | |||
751 | ht_info->ht_supported = true; | 756 | ht_info->ht_supported = true; |
752 | ht_info->cap = IEEE80211_HT_CAP_DSSSCCK40; | 757 | ht_info->cap = IEEE80211_HT_CAP_DSSSCCK40; |
753 | 758 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h b/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h index 5234a0bf11e4..750c8c9ee70d 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h | |||
@@ -6,6 +6,7 @@ | |||
6 | * GPL LICENSE SUMMARY | 6 | * GPL LICENSE SUMMARY |
7 | * | 7 | * |
8 | * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. | 8 | * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. |
9 | * Copyright(c) 2015 Intel Mobile Communications GmbH | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of version 2 of the GNU General Public License as | 12 | * it under the terms of version 2 of the GNU General Public License as |
@@ -31,6 +32,7 @@ | |||
31 | * BSD LICENSE | 32 | * BSD LICENSE |
32 | * | 33 | * |
33 | * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. | 34 | * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. |
35 | * Copyright(c) 2015 Intel Mobile Communications GmbH | ||
34 | * All rights reserved. | 36 | * All rights reserved. |
35 | * | 37 | * |
36 | * Redistribution and use in source and binary forms, with or without | 38 | * Redistribution and use in source and binary forms, with or without |
@@ -84,6 +86,7 @@ struct iwl_nvm_data { | |||
84 | bool sku_cap_11ac_enable; | 86 | bool sku_cap_11ac_enable; |
85 | bool sku_cap_amt_enable; | 87 | bool sku_cap_amt_enable; |
86 | bool sku_cap_ipan_enable; | 88 | bool sku_cap_ipan_enable; |
89 | bool sku_cap_mimo_disabled; | ||
87 | 90 | ||
88 | u16 radio_cfg_type; | 91 | u16 radio_cfg_type; |
89 | u8 radio_cfg_step; | 92 | u8 radio_cfg_step; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c index 83903a5025c2..75e96db6626b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c +++ b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * GPL LICENSE SUMMARY | 6 | * GPL LICENSE SUMMARY |
7 | * | 7 | * |
8 | * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. | 8 | * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. |
9 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH | 9 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH |
10 | * | 10 | * |
11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of version 2 of the GNU General Public License as | 12 | * it under the terms of version 2 of the GNU General Public License as |
@@ -32,7 +32,7 @@ | |||
32 | * BSD LICENSE | 32 | * BSD LICENSE |
33 | * | 33 | * |
34 | * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. | 34 | * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. |
35 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH | 35 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH |
36 | * All rights reserved. | 36 | * All rights reserved. |
37 | * | 37 | * |
38 | * Redistribution and use in source and binary forms, with or without | 38 | * Redistribution and use in source and binary forms, with or without |
@@ -116,10 +116,11 @@ enum family_8000_nvm_offsets { | |||
116 | 116 | ||
117 | /* SKU Capabilities (actual values from NVM definition) */ | 117 | /* SKU Capabilities (actual values from NVM definition) */ |
118 | enum nvm_sku_bits { | 118 | enum nvm_sku_bits { |
119 | NVM_SKU_CAP_BAND_24GHZ = BIT(0), | 119 | NVM_SKU_CAP_BAND_24GHZ = BIT(0), |
120 | NVM_SKU_CAP_BAND_52GHZ = BIT(1), | 120 | NVM_SKU_CAP_BAND_52GHZ = BIT(1), |
121 | NVM_SKU_CAP_11N_ENABLE = BIT(2), | 121 | NVM_SKU_CAP_11N_ENABLE = BIT(2), |
122 | NVM_SKU_CAP_11AC_ENABLE = BIT(3), | 122 | NVM_SKU_CAP_11AC_ENABLE = BIT(3), |
123 | NVM_SKU_CAP_MIMO_DISABLE = BIT(5), | ||
123 | }; | 124 | }; |
124 | 125 | ||
125 | /* | 126 | /* |
@@ -368,6 +369,11 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg, | |||
368 | if (cfg->ht_params->ldpc) | 369 | if (cfg->ht_params->ldpc) |
369 | vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC; | 370 | vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC; |
370 | 371 | ||
372 | if (data->sku_cap_mimo_disabled) { | ||
373 | num_rx_ants = 1; | ||
374 | num_tx_ants = 1; | ||
375 | } | ||
376 | |||
371 | if (num_tx_ants > 1) | 377 | if (num_tx_ants > 1) |
372 | vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC; | 378 | vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC; |
373 | else | 379 | else |
@@ -527,6 +533,10 @@ static void iwl_set_hw_address_family_8000(struct device *dev, | |||
527 | const u8 *hw_addr; | 533 | const u8 *hw_addr; |
528 | 534 | ||
529 | if (mac_override) { | 535 | if (mac_override) { |
536 | static const u8 reserved_mac[] = { | ||
537 | 0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00 | ||
538 | }; | ||
539 | |||
530 | hw_addr = (const u8 *)(mac_override + | 540 | hw_addr = (const u8 *)(mac_override + |
531 | MAC_ADDRESS_OVERRIDE_FAMILY_8000); | 541 | MAC_ADDRESS_OVERRIDE_FAMILY_8000); |
532 | 542 | ||
@@ -538,7 +548,12 @@ static void iwl_set_hw_address_family_8000(struct device *dev, | |||
538 | data->hw_addr[4] = hw_addr[5]; | 548 | data->hw_addr[4] = hw_addr[5]; |
539 | data->hw_addr[5] = hw_addr[4]; | 549 | data->hw_addr[5] = hw_addr[4]; |
540 | 550 | ||
541 | if (is_valid_ether_addr(data->hw_addr)) | 551 | /* |
552 | * Force the use of the OTP MAC address in case of reserved MAC | ||
553 | * address in the NVM, or if address is given but invalid. | ||
554 | */ | ||
555 | if (is_valid_ether_addr(data->hw_addr) && | ||
556 | memcmp(reserved_mac, hw_addr, ETH_ALEN) != 0) | ||
542 | return; | 557 | return; |
543 | 558 | ||
544 | IWL_ERR_DEV(dev, | 559 | IWL_ERR_DEV(dev, |
@@ -610,6 +625,7 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg, | |||
610 | data->sku_cap_11n_enable = false; | 625 | data->sku_cap_11n_enable = false; |
611 | data->sku_cap_11ac_enable = data->sku_cap_11n_enable && | 626 | data->sku_cap_11ac_enable = data->sku_cap_11n_enable && |
612 | (sku & NVM_SKU_CAP_11AC_ENABLE); | 627 | (sku & NVM_SKU_CAP_11AC_ENABLE); |
628 | data->sku_cap_mimo_disabled = sku & NVM_SKU_CAP_MIMO_DISABLE; | ||
613 | 629 | ||
614 | data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw); | 630 | data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw); |
615 | 631 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c b/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c index d954591e0be5..6ac6de2af977 100644 --- a/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c +++ b/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c | |||
@@ -776,7 +776,7 @@ static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id, | |||
776 | struct iwl_host_cmd cmd = { | 776 | struct iwl_host_cmd cmd = { |
777 | .id = BT_CONFIG, | 777 | .id = BT_CONFIG, |
778 | .len = { sizeof(*bt_cmd), }, | 778 | .len = { sizeof(*bt_cmd), }, |
779 | .dataflags = { IWL_HCMD_DFL_NOCOPY, }, | 779 | .dataflags = { IWL_HCMD_DFL_DUP, }, |
780 | .flags = CMD_ASYNC, | 780 | .flags = CMD_ASYNC, |
781 | }; | 781 | }; |
782 | struct iwl_mvm_sta *mvmsta; | 782 | struct iwl_mvm_sta *mvmsta; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c index 1b1b2bf26819..4310cf102d78 100644 --- a/drivers/net/wireless/iwlwifi/mvm/d3.c +++ b/drivers/net/wireless/iwlwifi/mvm/d3.c | |||
@@ -1750,8 +1750,10 @@ static void iwl_mvm_query_netdetect_reasons(struct iwl_mvm *mvm, | |||
1750 | int i, j, n_matches, ret; | 1750 | int i, j, n_matches, ret; |
1751 | 1751 | ||
1752 | fw_status = iwl_mvm_get_wakeup_status(mvm, vif); | 1752 | fw_status = iwl_mvm_get_wakeup_status(mvm, vif); |
1753 | if (!IS_ERR_OR_NULL(fw_status)) | 1753 | if (!IS_ERR_OR_NULL(fw_status)) { |
1754 | reasons = le32_to_cpu(fw_status->wakeup_reasons); | 1754 | reasons = le32_to_cpu(fw_status->wakeup_reasons); |
1755 | kfree(fw_status); | ||
1756 | } | ||
1755 | 1757 | ||
1756 | if (reasons & IWL_WOWLAN_WAKEUP_BY_RFKILL_DEASSERTED) | 1758 | if (reasons & IWL_WOWLAN_WAKEUP_BY_RFKILL_DEASSERTED) |
1757 | wakeup.rfkill_release = true; | 1759 | wakeup.rfkill_release = true; |
@@ -1868,15 +1870,15 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test) | |||
1868 | /* get the BSS vif pointer again */ | 1870 | /* get the BSS vif pointer again */ |
1869 | vif = iwl_mvm_get_bss_vif(mvm); | 1871 | vif = iwl_mvm_get_bss_vif(mvm); |
1870 | if (IS_ERR_OR_NULL(vif)) | 1872 | if (IS_ERR_OR_NULL(vif)) |
1871 | goto out_unlock; | 1873 | goto err; |
1872 | 1874 | ||
1873 | ret = iwl_trans_d3_resume(mvm->trans, &d3_status, test); | 1875 | ret = iwl_trans_d3_resume(mvm->trans, &d3_status, test); |
1874 | if (ret) | 1876 | if (ret) |
1875 | goto out_unlock; | 1877 | goto err; |
1876 | 1878 | ||
1877 | if (d3_status != IWL_D3_STATUS_ALIVE) { | 1879 | if (d3_status != IWL_D3_STATUS_ALIVE) { |
1878 | IWL_INFO(mvm, "Device was reset during suspend\n"); | 1880 | IWL_INFO(mvm, "Device was reset during suspend\n"); |
1879 | goto out_unlock; | 1881 | goto err; |
1880 | } | 1882 | } |
1881 | 1883 | ||
1882 | /* query SRAM first in case we want event logging */ | 1884 | /* query SRAM first in case we want event logging */ |
@@ -1902,7 +1904,8 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test) | |||
1902 | goto out_iterate; | 1904 | goto out_iterate; |
1903 | } | 1905 | } |
1904 | 1906 | ||
1905 | out_unlock: | 1907 | err: |
1908 | iwl_mvm_free_nd(mvm); | ||
1906 | mutex_unlock(&mvm->mutex); | 1909 | mutex_unlock(&mvm->mutex); |
1907 | 1910 | ||
1908 | out_iterate: | 1911 | out_iterate: |
@@ -1915,6 +1918,14 @@ out: | |||
1915 | /* return 1 to reconfigure the device */ | 1918 | /* return 1 to reconfigure the device */ |
1916 | set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); | 1919 | set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); |
1917 | set_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status); | 1920 | set_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status); |
1921 | |||
1922 | /* We always return 1, which causes mac80211 to do a reconfig | ||
1923 | * with IEEE80211_RECONFIG_TYPE_RESTART. This type of | ||
1924 | * reconfig calls iwl_mvm_restart_complete(), where we unref | ||
1925 | * the IWL_MVM_REF_UCODE_DOWN, so we need to take the | ||
1926 | * reference here. | ||
1927 | */ | ||
1928 | iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN); | ||
1918 | return 1; | 1929 | return 1; |
1919 | } | 1930 | } |
1920 | 1931 | ||
@@ -2021,7 +2032,6 @@ static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file) | |||
2021 | __iwl_mvm_resume(mvm, true); | 2032 | __iwl_mvm_resume(mvm, true); |
2022 | rtnl_unlock(); | 2033 | rtnl_unlock(); |
2023 | iwl_abort_notification_waits(&mvm->notif_wait); | 2034 | iwl_abort_notification_waits(&mvm->notif_wait); |
2024 | iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN); | ||
2025 | ieee80211_restart_hw(mvm->hw); | 2035 | ieee80211_restart_hw(mvm->hw); |
2026 | 2036 | ||
2027 | /* wait for restart and disconnect all interfaces */ | 2037 | /* wait for restart and disconnect all interfaces */ |
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c index 40265b9c66ae..dda9f7b5f342 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
@@ -3995,9 +3995,6 @@ static void iwl_mvm_mac_event_callback(struct ieee80211_hw *hw, | |||
3995 | if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_MLME)) | 3995 | if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_MLME)) |
3996 | return; | 3996 | return; |
3997 | 3997 | ||
3998 | if (event->u.mlme.status == MLME_SUCCESS) | ||
3999 | return; | ||
4000 | |||
4001 | trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_MLME); | 3998 | trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_MLME); |
4002 | trig_mlme = (void *)trig->data; | 3999 | trig_mlme = (void *)trig->data; |
4003 | if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig)) | 4000 | if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig)) |
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c index 1c66297d82c0..2ea01238754e 100644 --- a/drivers/net/wireless/iwlwifi/mvm/ops.c +++ b/drivers/net/wireless/iwlwifi/mvm/ops.c | |||
@@ -1263,11 +1263,13 @@ static void iwl_mvm_d0i3_exit_work(struct work_struct *wk) | |||
1263 | ieee80211_iterate_active_interfaces( | 1263 | ieee80211_iterate_active_interfaces( |
1264 | mvm->hw, IEEE80211_IFACE_ITER_NORMAL, | 1264 | mvm->hw, IEEE80211_IFACE_ITER_NORMAL, |
1265 | iwl_mvm_d0i3_disconnect_iter, mvm); | 1265 | iwl_mvm_d0i3_disconnect_iter, mvm); |
1266 | |||
1267 | iwl_free_resp(&get_status_cmd); | ||
1268 | out: | 1266 | out: |
1269 | iwl_mvm_d0i3_enable_tx(mvm, qos_seq); | 1267 | iwl_mvm_d0i3_enable_tx(mvm, qos_seq); |
1270 | 1268 | ||
1269 | /* qos_seq might point inside resp_pkt, so free it only now */ | ||
1270 | if (get_status_cmd.resp_pkt) | ||
1271 | iwl_free_resp(&get_status_cmd); | ||
1272 | |||
1271 | /* the FW might have updated the regdomain */ | 1273 | /* the FW might have updated the regdomain */ |
1272 | iwl_mvm_update_changed_regdom(mvm); | 1274 | iwl_mvm_update_changed_regdom(mvm); |
1273 | 1275 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c index f9928f2c125f..33cd68ae7bf9 100644 --- a/drivers/net/wireless/iwlwifi/mvm/rs.c +++ b/drivers/net/wireless/iwlwifi/mvm/rs.c | |||
@@ -180,6 +180,9 @@ static bool rs_mimo_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | |||
180 | if (iwl_mvm_vif_low_latency(mvmvif) && mvmsta->vif->p2p) | 180 | if (iwl_mvm_vif_low_latency(mvmvif) && mvmsta->vif->p2p) |
181 | return false; | 181 | return false; |
182 | 182 | ||
183 | if (mvm->nvm_data->sku_cap_mimo_disabled) | ||
184 | return false; | ||
185 | |||
183 | return true; | 186 | return true; |
184 | } | 187 | } |
185 | 188 | ||
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index 47bbf573fdc8..d6f6515fe663 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
@@ -1049,9 +1049,11 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power) | |||
1049 | iwl_pcie_rx_stop(trans); | 1049 | iwl_pcie_rx_stop(trans); |
1050 | 1050 | ||
1051 | /* Power-down device's busmaster DMA clocks */ | 1051 | /* Power-down device's busmaster DMA clocks */ |
1052 | iwl_write_prph(trans, APMG_CLK_DIS_REG, | 1052 | if (trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) { |
1053 | APMG_CLK_VAL_DMA_CLK_RQT); | 1053 | iwl_write_prph(trans, APMG_CLK_DIS_REG, |
1054 | udelay(5); | 1054 | APMG_CLK_VAL_DMA_CLK_RQT); |
1055 | udelay(5); | ||
1056 | } | ||
1055 | } | 1057 | } |
1056 | 1058 | ||
1057 | /* Make sure (redundant) we've released our request to stay awake */ | 1059 | /* Make sure (redundant) we've released our request to stay awake */ |