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/wireless/iwlwifi | |
| 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/wireless/iwlwifi')
| -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 */ |
