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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQEcBAABAgAGBQJVYwxHAAoJEG4XJFUm622bBTwH/RH0Yx5MBK+sD4d16i70d5nh dbE0wSBy9ZOT6cMVkAqViZg9T+EQ61+Lre7hwNNM6l/NLkTyjyEXB0Not9ERfLc/ E1g4BBHUfg9LUrbufIgWcTZRLewMk7lOBDN22hIcaVYAM6m9QFNwK+qnkFSXNkCq Pc0aRDWEYHrVvx8A/XYjInrb/oJqT6z7t83lWHbgtJGmCAVsEaqSvdn2badpecHi xar7PrdvYkXzFyd7xxmXPcvwkiAzKdIDdF3WR+SuS/V7Tk+2Cw5yrBWrIKc3QqtA +DfIY3Xa9zHHr1SLvoOQ0VooWTsY+RhSdmEbilG0KFOgNnJz3Zm5Abr2mzkvqvA= =05aZ -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
c260c2f1e3
@ -21,6 +21,7 @@ config IWLWIFI
|
|||||||
Intel 7260 Wi-Fi Adapter
|
Intel 7260 Wi-Fi Adapter
|
||||||
Intel 3160 Wi-Fi Adapter
|
Intel 3160 Wi-Fi Adapter
|
||||||
Intel 7265 Wi-Fi Adapter
|
Intel 7265 Wi-Fi Adapter
|
||||||
|
Intel 3165 Wi-Fi Adapter
|
||||||
|
|
||||||
|
|
||||||
This driver uses the kernel's mac80211 subsystem.
|
This driver uses the kernel's mac80211 subsystem.
|
||||||
|
@ -70,15 +70,14 @@
|
|||||||
|
|
||||||
/* Highest firmware API version supported */
|
/* Highest firmware API version supported */
|
||||||
#define IWL7260_UCODE_API_MAX 13
|
#define IWL7260_UCODE_API_MAX 13
|
||||||
#define IWL3160_UCODE_API_MAX 13
|
|
||||||
|
|
||||||
/* Oldest version we won't warn about */
|
/* Oldest version we won't warn about */
|
||||||
#define IWL7260_UCODE_API_OK 12
|
#define IWL7260_UCODE_API_OK 12
|
||||||
#define IWL3160_UCODE_API_OK 12
|
#define IWL3165_UCODE_API_OK 13
|
||||||
|
|
||||||
/* Lowest firmware API version supported */
|
/* Lowest firmware API version supported */
|
||||||
#define IWL7260_UCODE_API_MIN 10
|
#define IWL7260_UCODE_API_MIN 10
|
||||||
#define IWL3160_UCODE_API_MIN 10
|
#define IWL3165_UCODE_API_MIN 13
|
||||||
|
|
||||||
/* NVM versions */
|
/* NVM versions */
|
||||||
#define IWL7260_NVM_VERSION 0x0a1d
|
#define IWL7260_NVM_VERSION 0x0a1d
|
||||||
@ -104,9 +103,6 @@
|
|||||||
#define IWL3160_FW_PRE "iwlwifi-3160-"
|
#define IWL3160_FW_PRE "iwlwifi-3160-"
|
||||||
#define IWL3160_MODULE_FIRMWARE(api) IWL3160_FW_PRE __stringify(api) ".ucode"
|
#define IWL3160_MODULE_FIRMWARE(api) IWL3160_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL3165_FW_PRE "iwlwifi-3165-"
|
|
||||||
#define IWL3165_MODULE_FIRMWARE(api) IWL3165_FW_PRE __stringify(api) ".ucode"
|
|
||||||
|
|
||||||
#define IWL7265_FW_PRE "iwlwifi-7265-"
|
#define IWL7265_FW_PRE "iwlwifi-7265-"
|
||||||
#define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode"
|
#define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
@ -248,8 +244,13 @@ static const struct iwl_ht_params iwl7265_ht_params = {
|
|||||||
|
|
||||||
const struct iwl_cfg iwl3165_2ac_cfg = {
|
const struct iwl_cfg iwl3165_2ac_cfg = {
|
||||||
.name = "Intel(R) Dual Band Wireless AC 3165",
|
.name = "Intel(R) Dual Band Wireless AC 3165",
|
||||||
.fw_name_pre = IWL3165_FW_PRE,
|
.fw_name_pre = IWL7265D_FW_PRE,
|
||||||
IWL_DEVICE_7000,
|
IWL_DEVICE_7000,
|
||||||
|
/* sparse doens't like the re-assignment but it is safe */
|
||||||
|
#ifndef __CHECKER__
|
||||||
|
.ucode_api_ok = IWL3165_UCODE_API_OK,
|
||||||
|
.ucode_api_min = IWL3165_UCODE_API_MIN,
|
||||||
|
#endif
|
||||||
.ht_params = &iwl7000_ht_params,
|
.ht_params = &iwl7000_ht_params,
|
||||||
.nvm_ver = IWL3165_NVM_VERSION,
|
.nvm_ver = IWL3165_NVM_VERSION,
|
||||||
.nvm_calib_ver = IWL3165_TX_POWER_VERSION,
|
.nvm_calib_ver = IWL3165_TX_POWER_VERSION,
|
||||||
@ -325,6 +326,5 @@ const struct iwl_cfg iwl7265d_n_cfg = {
|
|||||||
|
|
||||||
MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
|
MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
|
||||||
MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK));
|
MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK));
|
||||||
MODULE_FIRMWARE(IWL3165_MODULE_FIRMWARE(IWL3160_UCODE_API_OK));
|
|
||||||
MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
|
MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
|
||||||
MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
|
MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
|
* Copyright(c) 2015 Intel Mobile Communications GmbH
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
@ -31,6 +32,7 @@
|
|||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
*
|
*
|
||||||
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||||
|
* Copyright(c) 2015 Intel Mobile Communications GmbH
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* 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,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data->sku_cap_mimo_disabled)
|
||||||
|
rx_chains = 1;
|
||||||
|
|
||||||
ht_info->ht_supported = true;
|
ht_info->ht_supported = true;
|
||||||
ht_info->cap = IEEE80211_HT_CAP_DSSSCCK40;
|
ht_info->cap = IEEE80211_HT_CAP_DSSSCCK40;
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
|
* Copyright(c) 2015 Intel Mobile Communications GmbH
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
@ -31,6 +32,7 @@
|
|||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
*
|
*
|
||||||
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||||
|
* Copyright(c) 2015 Intel Mobile Communications GmbH
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -84,6 +86,7 @@ struct iwl_nvm_data {
|
|||||||
bool sku_cap_11ac_enable;
|
bool sku_cap_11ac_enable;
|
||||||
bool sku_cap_amt_enable;
|
bool sku_cap_amt_enable;
|
||||||
bool sku_cap_ipan_enable;
|
bool sku_cap_ipan_enable;
|
||||||
|
bool sku_cap_mimo_disabled;
|
||||||
|
|
||||||
u16 radio_cfg_type;
|
u16 radio_cfg_type;
|
||||||
u8 radio_cfg_step;
|
u8 radio_cfg_step;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
@ -32,7 +32,7 @@
|
|||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
*
|
*
|
||||||
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -116,10 +116,11 @@ enum family_8000_nvm_offsets {
|
|||||||
|
|
||||||
/* SKU Capabilities (actual values from NVM definition) */
|
/* SKU Capabilities (actual values from NVM definition) */
|
||||||
enum nvm_sku_bits {
|
enum nvm_sku_bits {
|
||||||
NVM_SKU_CAP_BAND_24GHZ = BIT(0),
|
NVM_SKU_CAP_BAND_24GHZ = BIT(0),
|
||||||
NVM_SKU_CAP_BAND_52GHZ = BIT(1),
|
NVM_SKU_CAP_BAND_52GHZ = BIT(1),
|
||||||
NVM_SKU_CAP_11N_ENABLE = BIT(2),
|
NVM_SKU_CAP_11N_ENABLE = BIT(2),
|
||||||
NVM_SKU_CAP_11AC_ENABLE = BIT(3),
|
NVM_SKU_CAP_11AC_ENABLE = BIT(3),
|
||||||
|
NVM_SKU_CAP_MIMO_DISABLE = BIT(5),
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -368,6 +369,11 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
|
|||||||
if (cfg->ht_params->ldpc)
|
if (cfg->ht_params->ldpc)
|
||||||
vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
|
vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
|
||||||
|
|
||||||
|
if (data->sku_cap_mimo_disabled) {
|
||||||
|
num_rx_ants = 1;
|
||||||
|
num_tx_ants = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (num_tx_ants > 1)
|
if (num_tx_ants > 1)
|
||||||
vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
|
vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
|
||||||
else
|
else
|
||||||
@ -527,6 +533,10 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
|
|||||||
const u8 *hw_addr;
|
const u8 *hw_addr;
|
||||||
|
|
||||||
if (mac_override) {
|
if (mac_override) {
|
||||||
|
static const u8 reserved_mac[] = {
|
||||||
|
0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
hw_addr = (const u8 *)(mac_override +
|
hw_addr = (const u8 *)(mac_override +
|
||||||
MAC_ADDRESS_OVERRIDE_FAMILY_8000);
|
MAC_ADDRESS_OVERRIDE_FAMILY_8000);
|
||||||
|
|
||||||
@ -538,7 +548,12 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
|
|||||||
data->hw_addr[4] = hw_addr[5];
|
data->hw_addr[4] = hw_addr[5];
|
||||||
data->hw_addr[5] = hw_addr[4];
|
data->hw_addr[5] = hw_addr[4];
|
||||||
|
|
||||||
if (is_valid_ether_addr(data->hw_addr))
|
/*
|
||||||
|
* Force the use of the OTP MAC address in case of reserved MAC
|
||||||
|
* address in the NVM, or if address is given but invalid.
|
||||||
|
*/
|
||||||
|
if (is_valid_ether_addr(data->hw_addr) &&
|
||||||
|
memcmp(reserved_mac, hw_addr, ETH_ALEN) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
IWL_ERR_DEV(dev,
|
IWL_ERR_DEV(dev,
|
||||||
@ -610,6 +625,7 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
|
|||||||
data->sku_cap_11n_enable = false;
|
data->sku_cap_11n_enable = false;
|
||||||
data->sku_cap_11ac_enable = data->sku_cap_11n_enable &&
|
data->sku_cap_11ac_enable = data->sku_cap_11n_enable &&
|
||||||
(sku & NVM_SKU_CAP_11AC_ENABLE);
|
(sku & NVM_SKU_CAP_11AC_ENABLE);
|
||||||
|
data->sku_cap_mimo_disabled = sku & NVM_SKU_CAP_MIMO_DISABLE;
|
||||||
|
|
||||||
data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
|
data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
|
||||||
|
|
||||||
|
@ -776,7 +776,7 @@ static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id,
|
|||||||
struct iwl_host_cmd cmd = {
|
struct iwl_host_cmd cmd = {
|
||||||
.id = BT_CONFIG,
|
.id = BT_CONFIG,
|
||||||
.len = { sizeof(*bt_cmd), },
|
.len = { sizeof(*bt_cmd), },
|
||||||
.dataflags = { IWL_HCMD_DFL_NOCOPY, },
|
.dataflags = { IWL_HCMD_DFL_DUP, },
|
||||||
.flags = CMD_ASYNC,
|
.flags = CMD_ASYNC,
|
||||||
};
|
};
|
||||||
struct iwl_mvm_sta *mvmsta;
|
struct iwl_mvm_sta *mvmsta;
|
||||||
|
@ -1750,8 +1750,10 @@ static void iwl_mvm_query_netdetect_reasons(struct iwl_mvm *mvm,
|
|||||||
int i, j, n_matches, ret;
|
int i, j, n_matches, ret;
|
||||||
|
|
||||||
fw_status = iwl_mvm_get_wakeup_status(mvm, vif);
|
fw_status = iwl_mvm_get_wakeup_status(mvm, vif);
|
||||||
if (!IS_ERR_OR_NULL(fw_status))
|
if (!IS_ERR_OR_NULL(fw_status)) {
|
||||||
reasons = le32_to_cpu(fw_status->wakeup_reasons);
|
reasons = le32_to_cpu(fw_status->wakeup_reasons);
|
||||||
|
kfree(fw_status);
|
||||||
|
}
|
||||||
|
|
||||||
if (reasons & IWL_WOWLAN_WAKEUP_BY_RFKILL_DEASSERTED)
|
if (reasons & IWL_WOWLAN_WAKEUP_BY_RFKILL_DEASSERTED)
|
||||||
wakeup.rfkill_release = true;
|
wakeup.rfkill_release = true;
|
||||||
@ -1868,15 +1870,15 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
|
|||||||
/* get the BSS vif pointer again */
|
/* get the BSS vif pointer again */
|
||||||
vif = iwl_mvm_get_bss_vif(mvm);
|
vif = iwl_mvm_get_bss_vif(mvm);
|
||||||
if (IS_ERR_OR_NULL(vif))
|
if (IS_ERR_OR_NULL(vif))
|
||||||
goto out_unlock;
|
goto err;
|
||||||
|
|
||||||
ret = iwl_trans_d3_resume(mvm->trans, &d3_status, test);
|
ret = iwl_trans_d3_resume(mvm->trans, &d3_status, test);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_unlock;
|
goto err;
|
||||||
|
|
||||||
if (d3_status != IWL_D3_STATUS_ALIVE) {
|
if (d3_status != IWL_D3_STATUS_ALIVE) {
|
||||||
IWL_INFO(mvm, "Device was reset during suspend\n");
|
IWL_INFO(mvm, "Device was reset during suspend\n");
|
||||||
goto out_unlock;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* query SRAM first in case we want event logging */
|
/* query SRAM first in case we want event logging */
|
||||||
@ -1902,7 +1904,8 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
|
|||||||
goto out_iterate;
|
goto out_iterate;
|
||||||
}
|
}
|
||||||
|
|
||||||
out_unlock:
|
err:
|
||||||
|
iwl_mvm_free_nd(mvm);
|
||||||
mutex_unlock(&mvm->mutex);
|
mutex_unlock(&mvm->mutex);
|
||||||
|
|
||||||
out_iterate:
|
out_iterate:
|
||||||
@ -1915,6 +1918,14 @@ out:
|
|||||||
/* return 1 to reconfigure the device */
|
/* return 1 to reconfigure the device */
|
||||||
set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
|
set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
|
||||||
set_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status);
|
set_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status);
|
||||||
|
|
||||||
|
/* We always return 1, which causes mac80211 to do a reconfig
|
||||||
|
* with IEEE80211_RECONFIG_TYPE_RESTART. This type of
|
||||||
|
* reconfig calls iwl_mvm_restart_complete(), where we unref
|
||||||
|
* the IWL_MVM_REF_UCODE_DOWN, so we need to take the
|
||||||
|
* reference here.
|
||||||
|
*/
|
||||||
|
iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2021,7 +2032,6 @@ static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file)
|
|||||||
__iwl_mvm_resume(mvm, true);
|
__iwl_mvm_resume(mvm, true);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
iwl_abort_notification_waits(&mvm->notif_wait);
|
iwl_abort_notification_waits(&mvm->notif_wait);
|
||||||
iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
|
|
||||||
ieee80211_restart_hw(mvm->hw);
|
ieee80211_restart_hw(mvm->hw);
|
||||||
|
|
||||||
/* wait for restart and disconnect all interfaces */
|
/* wait for restart and disconnect all interfaces */
|
||||||
|
@ -3995,9 +3995,6 @@ static void iwl_mvm_mac_event_callback(struct ieee80211_hw *hw,
|
|||||||
if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_MLME))
|
if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_MLME))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (event->u.mlme.status == MLME_SUCCESS)
|
|
||||||
return;
|
|
||||||
|
|
||||||
trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_MLME);
|
trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_MLME);
|
||||||
trig_mlme = (void *)trig->data;
|
trig_mlme = (void *)trig->data;
|
||||||
if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
|
if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
|
||||||
|
@ -1263,11 +1263,13 @@ static void iwl_mvm_d0i3_exit_work(struct work_struct *wk)
|
|||||||
ieee80211_iterate_active_interfaces(
|
ieee80211_iterate_active_interfaces(
|
||||||
mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
|
mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||||
iwl_mvm_d0i3_disconnect_iter, mvm);
|
iwl_mvm_d0i3_disconnect_iter, mvm);
|
||||||
|
|
||||||
iwl_free_resp(&get_status_cmd);
|
|
||||||
out:
|
out:
|
||||||
iwl_mvm_d0i3_enable_tx(mvm, qos_seq);
|
iwl_mvm_d0i3_enable_tx(mvm, qos_seq);
|
||||||
|
|
||||||
|
/* qos_seq might point inside resp_pkt, so free it only now */
|
||||||
|
if (get_status_cmd.resp_pkt)
|
||||||
|
iwl_free_resp(&get_status_cmd);
|
||||||
|
|
||||||
/* the FW might have updated the regdomain */
|
/* the FW might have updated the regdomain */
|
||||||
iwl_mvm_update_changed_regdom(mvm);
|
iwl_mvm_update_changed_regdom(mvm);
|
||||||
|
|
||||||
|
@ -180,6 +180,9 @@ static bool rs_mimo_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||||||
if (iwl_mvm_vif_low_latency(mvmvif) && mvmsta->vif->p2p)
|
if (iwl_mvm_vif_low_latency(mvmvif) && mvmsta->vif->p2p)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (mvm->nvm_data->sku_cap_mimo_disabled)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1049,9 +1049,11 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power)
|
|||||||
iwl_pcie_rx_stop(trans);
|
iwl_pcie_rx_stop(trans);
|
||||||
|
|
||||||
/* Power-down device's busmaster DMA clocks */
|
/* Power-down device's busmaster DMA clocks */
|
||||||
iwl_write_prph(trans, APMG_CLK_DIS_REG,
|
if (trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) {
|
||||||
APMG_CLK_VAL_DMA_CLK_RQT);
|
iwl_write_prph(trans, APMG_CLK_DIS_REG,
|
||||||
udelay(5);
|
APMG_CLK_VAL_DMA_CLK_RQT);
|
||||||
|
udelay(5);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure (redundant) we've released our request to stay awake */
|
/* Make sure (redundant) we've released our request to stay awake */
|
||||||
|
@ -359,12 +359,13 @@ static void ssb_pcicore_init_hostmode(struct ssb_pcicore *pc)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Accessing PCI config without a proper delay after devices reset (not
|
* Accessing PCI config without a proper delay after devices reset (not
|
||||||
* GPIO reset) was causing reboots on WRT300N v1.0.
|
* GPIO reset) was causing reboots on WRT300N v1.0 (BCM4704).
|
||||||
* Tested delay 850 us lowered reboot chance to 50-80%, 1000 us fixed it
|
* Tested delay 850 us lowered reboot chance to 50-80%, 1000 us fixed it
|
||||||
* completely. Flushing all writes was also tested but with no luck.
|
* completely. Flushing all writes was also tested but with no luck.
|
||||||
|
* The same problem was reported for WRT350N v1 (BCM4705), so we just
|
||||||
|
* sleep here unconditionally.
|
||||||
*/
|
*/
|
||||||
if (pc->dev->bus->chip_id == 0x4704)
|
usleep_range(1000, 2000);
|
||||||
usleep_range(1000, 2000);
|
|
||||||
|
|
||||||
/* Enable PCI bridge BAR0 prefetch and burst */
|
/* Enable PCI bridge BAR0 prefetch and burst */
|
||||||
val = PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
|
val = PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
|
||||||
|
Loading…
Reference in New Issue
Block a user