mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-18 08:16:26 +07:00
First batch of iwlwifi updates for v4.16
* Rename the temporary name A000 to 22000;
* Change in the way we print the firmware version;
* Remove some unused code;
* Other small improvements;
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEF3LNfgb2BPWm68smoUecoho8xfoFAloea/wACgkQoUecoho8
xfr7SA/9FKFcgKFQrF6aUlMBv09NttoyyLZcFspSkVQb0r7CkNJZT+t8eMg3nzCD
atoLqH41cI8x7OoAyiFv6FJVi+5TqEAGd9GuOVxARN8vVOtgwCQc18CoyXxjcqYE
Dw6Nb55H+Dro/9ucYo4f0VC2unVOeBZlEUnJrImctKCMIECWcrDaqdp9BwzxUp3p
y3mO33izj8p+fjp/qQnbWapIZILi/K/XMQv/Q7LmLXddq7hmVNhVLezbEj29a0wl
kCfzO0UQ2fUa8fWrCrg2QXfjWLsOjLUjfrt/Dm5HH4iTa4CuSvv/+2JA88S3V/TB
I0pwqkUq+N1XZC62efYP6TmTl4+Xag1nUNHl7njofxNDYZ2xq3ocCxhzdMF6O1eW
++RuzIhz71e/U07NoJ83GcPxbzsv1BO2Y+6kZMygUq6EKsfWsDRUOWsM7lZ088Vl
YtmU2PU8OgXBSo5QFNKjt3d4G1dJ7CvLkCAb1aQSQ/V8YrSHHxTpxpWCXGC/GSCs
jm4XDj4oDQMgKtq1PzaR/rVn1+8jzxPHcjGMtFzirDrGDwdpgsZDRK2YZb6KrKvu
1RS5M/WsCj2Jld7Ws+h/IbVVmMIG8RPVxgGQwqGCWEZbp6QNW6M72wcgO+jzUsQ+
COidUDnMiRzRWRaAta0wrUBU4dKVOiEPJJdTRX6G4Cd8dHSVlfI=
=j1dk
-----END PGP SIGNATURE-----
Merge tag 'iwlwifi-next-for-kalle-2017-11-29' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next
First batch of iwlwifi updates for v4.16
* Rename the temporary name A000 to 22000;
* Change in the way we print the firmware version;
* Remove some unused code;
* Other small improvements;
kvalo:
There were conflicts, I fixed them with taking into account commit c2c48ddfc8
("iwlwifi: fix firmware names for 9000 and A000 series hw"):
CONFLICT (content): Merge conflict in drivers/net/wireless/intel/iwlwifi/iwl-config.h
CONFLICT (modify/delete): drivers/net/wireless/intel/iwlwifi/cfg/a000.c deleted in ca495785063c428641cc6df8888afd2587ca6677 and modified in HEAD. Version HEAD of drivers/net/wireless/intel/iwlwifi/cfg/a000.c left in tree.
This commit is contained in:
commit
80b0ebd488
@ -9,7 +9,7 @@ iwlwifi-objs += iwl-phy-db.o iwl-nvm-parse.o
|
||||
iwlwifi-objs += pcie/drv.o pcie/rx.o pcie/tx.o pcie/trans.o
|
||||
iwlwifi-objs += pcie/ctxt-info.o pcie/trans-gen2.o pcie/tx-gen2.o
|
||||
iwlwifi-$(CONFIG_IWLDVM) += cfg/1000.o cfg/2000.o cfg/5000.o cfg/6000.o
|
||||
iwlwifi-$(CONFIG_IWLMVM) += cfg/7000.o cfg/8000.o cfg/9000.o cfg/a000.o
|
||||
iwlwifi-$(CONFIG_IWLMVM) += cfg/7000.o cfg/8000.o cfg/9000.o cfg/22000.o
|
||||
iwlwifi-objs += iwl-trans.o
|
||||
iwlwifi-objs += fw/notif-wait.o
|
||||
iwlwifi-$(CONFIG_IWLMVM) += fw/paging.o fw/smem.o fw/init.o fw/dbg.o
|
||||
|
216
drivers/net/wireless/intel/iwlwifi/cfg/22000.c
Normal file
216
drivers/net/wireless/intel/iwlwifi/cfg/22000.c
Normal file
@ -0,0 +1,216 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
*
|
||||
* 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
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/stringify.h>
|
||||
#include "iwl-config.h"
|
||||
#include "iwl-agn-hw.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL_22000_UCODE_API_MAX 34
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL_22000_UCODE_API_MIN 24
|
||||
|
||||
/* NVM versions */
|
||||
#define IWL_22000_NVM_VERSION 0x0a1d
|
||||
#define IWL_22000_TX_POWER_VERSION 0xffff /* meaningless */
|
||||
|
||||
/* Memory offsets and lengths */
|
||||
#define IWL_22000_DCCM_OFFSET 0x800000 /* LMAC1 */
|
||||
#define IWL_22000_DCCM_LEN 0x10000 /* LMAC1 */
|
||||
#define IWL_22000_DCCM2_OFFSET 0x880000
|
||||
#define IWL_22000_DCCM2_LEN 0x8000
|
||||
#define IWL_22000_SMEM_OFFSET 0x400000
|
||||
#define IWL_22000_SMEM_LEN 0xD0000
|
||||
|
||||
#define IWL_22000_JF_FW_PRE "iwlwifi-Qu-a0-jf-b0-"
|
||||
#define IWL_22000_HR_FW_PRE "iwlwifi-Qu-a0-hr-a0-"
|
||||
#define IWL_22000_HR_CDB_FW_PRE "iwlwifi-QuIcp-z0-hrcdb-a0-"
|
||||
#define IWL_22000_HR_F0_FW_PRE "iwlwifi-QuQnj-f0-hr-a0-"
|
||||
#define IWL_22000_JF_B0_FW_PRE "iwlwifi-QuQnj-a0-jf-b0-"
|
||||
#define IWL_22000_HR_A0_FW_PRE "iwlwifi-QuQnj-a0-hr-a0-"
|
||||
|
||||
#define IWL_22000_HR_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_HR_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_22000_JF_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_JF_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_22000_HR_F0_QNJ_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_HR_F0_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_22000_JF_B0_QNJ_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_JF_B0_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_HR_A0_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define NVM_HW_SECTION_NUM_FAMILY_22000 10
|
||||
|
||||
static const struct iwl_base_params iwl_22000_base_params = {
|
||||
.eeprom_size = OTP_LOW_IMAGE_SIZE_FAMILY_22000,
|
||||
.num_of_queues = 512,
|
||||
.shadow_ram_support = true,
|
||||
.led_compensation = 57,
|
||||
.wd_timeout = IWL_LONG_WD_TIMEOUT,
|
||||
.max_event_log_size = 512,
|
||||
.shadow_reg_enable = true,
|
||||
.pcie_l1_allowed = true,
|
||||
};
|
||||
|
||||
static const struct iwl_ht_params iwl_22000_ht_params = {
|
||||
.stbc = true,
|
||||
.ldpc = true,
|
||||
.ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ),
|
||||
};
|
||||
|
||||
#define IWL_DEVICE_22000 \
|
||||
.ucode_api_max = IWL_22000_UCODE_API_MAX, \
|
||||
.ucode_api_min = IWL_22000_UCODE_API_MIN, \
|
||||
.device_family = IWL_DEVICE_FAMILY_22000, \
|
||||
.max_inst_size = IWL60_RTC_INST_SIZE, \
|
||||
.max_data_size = IWL60_RTC_DATA_SIZE, \
|
||||
.base_params = &iwl_22000_base_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.nvm_hw_section_num = NVM_HW_SECTION_NUM_FAMILY_22000, \
|
||||
.non_shared_ant = ANT_A, \
|
||||
.dccm_offset = IWL_22000_DCCM_OFFSET, \
|
||||
.dccm_len = IWL_22000_DCCM_LEN, \
|
||||
.dccm2_offset = IWL_22000_DCCM2_OFFSET, \
|
||||
.dccm2_len = IWL_22000_DCCM2_LEN, \
|
||||
.smem_offset = IWL_22000_SMEM_OFFSET, \
|
||||
.smem_len = IWL_22000_SMEM_LEN, \
|
||||
.features = IWL_TX_CSUM_NETIF_FLAGS | NETIF_F_RXCSUM, \
|
||||
.apmg_not_supported = true, \
|
||||
.mq_rx_supported = true, \
|
||||
.vht_mu_mimo_supported = true, \
|
||||
.mac_addr_from_csr = true, \
|
||||
.use_tfh = true, \
|
||||
.rf_id = true, \
|
||||
.gen2 = true, \
|
||||
.nvm_type = IWL_NVM_EXT, \
|
||||
.dbgc_supported = true, \
|
||||
.tx_cmd_queue_size = 32, \
|
||||
.min_umac_error_event_table = 0x400000
|
||||
|
||||
const struct iwl_cfg iwl22000_2ac_cfg_hr = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 22000",
|
||||
.fw_name_pre = IWL_22000_HR_FW_PRE,
|
||||
IWL_DEVICE_22000,
|
||||
.ht_params = &iwl_22000_ht_params,
|
||||
.nvm_ver = IWL_22000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_22000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 22000",
|
||||
.fw_name_pre = IWL_22000_HR_CDB_FW_PRE,
|
||||
IWL_DEVICE_22000,
|
||||
.ht_params = &iwl_22000_ht_params,
|
||||
.nvm_ver = IWL_22000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_22000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
.cdb = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ac_cfg_jf = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 22000",
|
||||
.fw_name_pre = IWL_22000_JF_FW_PRE,
|
||||
IWL_DEVICE_22000,
|
||||
.ht_params = &iwl_22000_ht_params,
|
||||
.nvm_ver = IWL_22000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_22000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_hr = {
|
||||
.name = "Intel(R) Dual Band Wireless AX 22000",
|
||||
.fw_name_pre = IWL_22000_HR_FW_PRE,
|
||||
IWL_DEVICE_22000,
|
||||
.ht_params = &iwl_22000_ht_params,
|
||||
.nvm_ver = IWL_22000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_22000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_f0 = {
|
||||
.name = "Intel(R) Dual Band Wireless AX 22000",
|
||||
.fw_name_pre = IWL_22000_HR_F0_FW_PRE,
|
||||
IWL_DEVICE_22000,
|
||||
.ht_params = &iwl_22000_ht_params,
|
||||
.nvm_ver = IWL_22000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_22000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_qnj_jf_b0 = {
|
||||
.name = "Intel(R) Dual Band Wireless AX 22000",
|
||||
.fw_name_pre = IWL_22000_JF_B0_FW_PRE,
|
||||
IWL_DEVICE_22000,
|
||||
.ht_params = &iwl_22000_ht_params,
|
||||
.nvm_ver = IWL_22000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_22000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0 = {
|
||||
.name = "Intel(R) Dual Band Wireless AX 22000",
|
||||
.fw_name_pre = IWL_22000_HR_A0_FW_PRE,
|
||||
IWL_DEVICE_22000,
|
||||
.ht_params = &iwl_22000_ht_params,
|
||||
.nvm_ver = IWL_22000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_22000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL_22000_HR_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_22000_JF_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_22000_HR_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_22000_JF_B0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
|
@ -1,216 +0,0 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
*
|
||||
* 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
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/stringify.h>
|
||||
#include "iwl-config.h"
|
||||
#include "iwl-agn-hw.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL_A000_UCODE_API_MAX 34
|
||||
|
||||
/* Lowest firmware API version supported */
|
||||
#define IWL_A000_UCODE_API_MIN 24
|
||||
|
||||
/* NVM versions */
|
||||
#define IWL_A000_NVM_VERSION 0x0a1d
|
||||
#define IWL_A000_TX_POWER_VERSION 0xffff /* meaningless */
|
||||
|
||||
/* Memory offsets and lengths */
|
||||
#define IWL_A000_DCCM_OFFSET 0x800000 /* LMAC1 */
|
||||
#define IWL_A000_DCCM_LEN 0x10000 /* LMAC1 */
|
||||
#define IWL_A000_DCCM2_OFFSET 0x880000
|
||||
#define IWL_A000_DCCM2_LEN 0x8000
|
||||
#define IWL_A000_SMEM_OFFSET 0x400000
|
||||
#define IWL_A000_SMEM_LEN 0xD0000
|
||||
|
||||
#define IWL_A000_JF_FW_PRE "iwlwifi-Qu-a0-jf-b0-"
|
||||
#define IWL_A000_HR_FW_PRE "iwlwifi-Qu-a0-hr-a0-"
|
||||
#define IWL_A000_HR_CDB_FW_PRE "iwlwifi-QuIcp-z0-hrcdb-a0-"
|
||||
#define IWL_A000_HR_F0_FW_PRE "iwlwifi-QuQnj-f0-hr-a0-"
|
||||
#define IWL_A000_JF_B0_FW_PRE "iwlwifi-QuQnj-a0-jf-b0-"
|
||||
#define IWL_A000_HR_A0_FW_PRE "iwlwifi-QuQnj-a0-hr-a0-"
|
||||
|
||||
#define IWL_A000_HR_MODULE_FIRMWARE(api) \
|
||||
IWL_A000_HR_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_A000_JF_MODULE_FIRMWARE(api) \
|
||||
IWL_A000_JF_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_A000_HR_F0_QNJ_MODULE_FIRMWARE(api) \
|
||||
IWL_A000_HR_F0_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_A000_JF_B0_QNJ_MODULE_FIRMWARE(api) \
|
||||
IWL_A000_JF_B0_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL_A000_HR_A0_QNJ_MODULE_FIRMWARE(api) \
|
||||
IWL_A000_HR_A0_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define NVM_HW_SECTION_NUM_FAMILY_A000 10
|
||||
|
||||
static const struct iwl_base_params iwl_a000_base_params = {
|
||||
.eeprom_size = OTP_LOW_IMAGE_SIZE_FAMILY_A000,
|
||||
.num_of_queues = 512,
|
||||
.shadow_ram_support = true,
|
||||
.led_compensation = 57,
|
||||
.wd_timeout = IWL_LONG_WD_TIMEOUT,
|
||||
.max_event_log_size = 512,
|
||||
.shadow_reg_enable = true,
|
||||
.pcie_l1_allowed = true,
|
||||
};
|
||||
|
||||
static const struct iwl_ht_params iwl_a000_ht_params = {
|
||||
.stbc = true,
|
||||
.ldpc = true,
|
||||
.ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ),
|
||||
};
|
||||
|
||||
#define IWL_DEVICE_A000 \
|
||||
.ucode_api_max = IWL_A000_UCODE_API_MAX, \
|
||||
.ucode_api_min = IWL_A000_UCODE_API_MIN, \
|
||||
.device_family = IWL_DEVICE_FAMILY_A000, \
|
||||
.max_inst_size = IWL60_RTC_INST_SIZE, \
|
||||
.max_data_size = IWL60_RTC_DATA_SIZE, \
|
||||
.base_params = &iwl_a000_base_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.nvm_hw_section_num = NVM_HW_SECTION_NUM_FAMILY_A000, \
|
||||
.non_shared_ant = ANT_A, \
|
||||
.dccm_offset = IWL_A000_DCCM_OFFSET, \
|
||||
.dccm_len = IWL_A000_DCCM_LEN, \
|
||||
.dccm2_offset = IWL_A000_DCCM2_OFFSET, \
|
||||
.dccm2_len = IWL_A000_DCCM2_LEN, \
|
||||
.smem_offset = IWL_A000_SMEM_OFFSET, \
|
||||
.smem_len = IWL_A000_SMEM_LEN, \
|
||||
.features = IWL_TX_CSUM_NETIF_FLAGS | NETIF_F_RXCSUM, \
|
||||
.apmg_not_supported = true, \
|
||||
.mq_rx_supported = true, \
|
||||
.vht_mu_mimo_supported = true, \
|
||||
.mac_addr_from_csr = true, \
|
||||
.use_tfh = true, \
|
||||
.rf_id = true, \
|
||||
.gen2 = true, \
|
||||
.nvm_type = IWL_NVM_EXT, \
|
||||
.dbgc_supported = true, \
|
||||
.tx_cmd_queue_size = 32, \
|
||||
.min_umac_error_event_table = 0x400000
|
||||
|
||||
const struct iwl_cfg iwla000_2ac_cfg_hr = {
|
||||
.name = "Intel(R) Dual Band Wireless AC a000",
|
||||
.fw_name_pre = IWL_A000_HR_FW_PRE,
|
||||
IWL_DEVICE_A000,
|
||||
.ht_params = &iwl_a000_ht_params,
|
||||
.nvm_ver = IWL_A000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_A000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwla000_2ac_cfg_hr_cdb = {
|
||||
.name = "Intel(R) Dual Band Wireless AC a000",
|
||||
.fw_name_pre = IWL_A000_HR_CDB_FW_PRE,
|
||||
IWL_DEVICE_A000,
|
||||
.ht_params = &iwl_a000_ht_params,
|
||||
.nvm_ver = IWL_A000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_A000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
.cdb = true,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwla000_2ac_cfg_jf = {
|
||||
.name = "Intel(R) Dual Band Wireless AC a000",
|
||||
.fw_name_pre = IWL_A000_JF_FW_PRE,
|
||||
IWL_DEVICE_A000,
|
||||
.ht_params = &iwl_a000_ht_params,
|
||||
.nvm_ver = IWL_A000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_A000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwla000_2ax_cfg_hr = {
|
||||
.name = "Intel(R) Dual Band Wireless AX a000",
|
||||
.fw_name_pre = IWL_A000_HR_FW_PRE,
|
||||
IWL_DEVICE_A000,
|
||||
.ht_params = &iwl_a000_ht_params,
|
||||
.nvm_ver = IWL_A000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_A000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwla000_2ax_cfg_qnj_hr_f0 = {
|
||||
.name = "Intel(R) Dual Band Wireless AX a000",
|
||||
.fw_name_pre = IWL_A000_HR_F0_FW_PRE,
|
||||
IWL_DEVICE_A000,
|
||||
.ht_params = &iwl_a000_ht_params,
|
||||
.nvm_ver = IWL_A000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_A000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwla000_2ax_cfg_qnj_jf_b0 = {
|
||||
.name = "Intel(R) Dual Band Wireless AX a000",
|
||||
.fw_name_pre = IWL_A000_JF_B0_FW_PRE,
|
||||
IWL_DEVICE_A000,
|
||||
.ht_params = &iwl_a000_ht_params,
|
||||
.nvm_ver = IWL_A000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_A000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwla000_2ax_cfg_qnj_hr_a0 = {
|
||||
.name = "Intel(R) Dual Band Wireless AX a000",
|
||||
.fw_name_pre = IWL_A000_HR_A0_FW_PRE,
|
||||
IWL_DEVICE_A000,
|
||||
.ht_params = &iwl_a000_ht_params,
|
||||
.nvm_ver = IWL_A000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL_A000_TX_POWER_VERSION,
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL_A000_HR_MODULE_FIRMWARE(IWL_A000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_A000_JF_MODULE_FIRMWARE(IWL_A000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_A000_HR_F0_QNJ_MODULE_FIRMWARE(IWL_A000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_A000_JF_B0_QNJ_MODULE_FIRMWARE(IWL_A000_UCODE_API_MAX));
|
||||
MODULE_FIRMWARE(IWL_A000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_A000_UCODE_API_MAX));
|
@ -95,8 +95,8 @@ enum {
|
||||
#define IWL_ALIVE_FLG_RFKILL BIT(0)
|
||||
|
||||
struct iwl_lmac_alive {
|
||||
__le32 ucode_minor;
|
||||
__le32 ucode_major;
|
||||
__le32 ucode_minor;
|
||||
u8 ver_subtype;
|
||||
u8 ver_type;
|
||||
u8 mac;
|
||||
@ -113,8 +113,8 @@ struct iwl_lmac_alive {
|
||||
} __packed; /* UCODE_ALIVE_NTFY_API_S_VER_3 */
|
||||
|
||||
struct iwl_umac_alive {
|
||||
__le32 umac_minor; /* UMAC version: minor */
|
||||
__le32 umac_major; /* UMAC version: major */
|
||||
__le32 umac_minor; /* UMAC version: minor */
|
||||
__le32 error_info_addr; /* SRAM address for UMAC error log */
|
||||
__le32 dbg_print_buff_addr;
|
||||
} __packed; /* UMAC_ALIVE_DATA_API_S_VER_2 */
|
||||
|
@ -188,11 +188,6 @@ enum iwl_bt_mxbox_dw3 {
|
||||
BT_MBOX(3, UPDATE_REQUEST, 21, 1),
|
||||
};
|
||||
|
||||
enum iwl_bt_mxbox_dw4 {
|
||||
BT_MBOX(4, ATS_BT_INTERVAL, 0, 7),
|
||||
BT_MBOX(4, ATS_BT_ACTIVE_MAX_TH, 7, 7),
|
||||
};
|
||||
|
||||
#define BT_MBOX_MSG(_notif, _num, _field) \
|
||||
((le32_to_cpu((_notif)->mbox_msg[(_num)]) & BT_MBOX##_num##_##_field)\
|
||||
>> BT_MBOX##_num##_##_field##_POS)
|
||||
@ -232,31 +227,6 @@ enum iwl_bt_ci_compliance {
|
||||
* @reserved: reserved
|
||||
*/
|
||||
struct iwl_bt_coex_profile_notif {
|
||||
__le32 mbox_msg[8];
|
||||
__le32 msg_idx;
|
||||
__le32 bt_ci_compliance;
|
||||
|
||||
__le32 primary_ch_lut;
|
||||
__le32 secondary_ch_lut;
|
||||
__le32 bt_activity_grading;
|
||||
u8 ttc_status;
|
||||
u8 rrc_status;
|
||||
__le16 reserved;
|
||||
} __packed; /* BT_COEX_PROFILE_NTFY_API_S_VER_5 */
|
||||
|
||||
/**
|
||||
* struct iwl_bt_coex_profile_notif - notification about BT coex
|
||||
* @mbox_msg: message from BT to WiFi
|
||||
* @msg_idx: the index of the message
|
||||
* @bt_ci_compliance: enum %iwl_bt_ci_compliance
|
||||
* @primary_ch_lut: LUT used for primary channel &enum iwl_bt_coex_lut_type
|
||||
* @secondary_ch_lut: LUT used for secondary channel &enum iwl_bt_coex_lut_type
|
||||
* @bt_activity_grading: the activity of BT &enum iwl_bt_activity_grading
|
||||
* @ttc_status: is TTC enabled - one bit per PHY
|
||||
* @rrc_status: is RRC enabled - one bit per PHY
|
||||
* @reserved: reserved
|
||||
*/
|
||||
struct iwl_bt_coex_profile_notif_v4 {
|
||||
__le32 mbox_msg[4];
|
||||
__le32 msg_idx;
|
||||
__le32 bt_ci_compliance;
|
||||
|
@ -215,7 +215,7 @@ enum iwl_legacy_cmds {
|
||||
/**
|
||||
* @SCD_QUEUE_CFG: &struct iwl_scd_txq_cfg_cmd for older hardware,
|
||||
* &struct iwl_tx_queue_cfg_cmd with &struct iwl_tx_queue_cfg_rsp
|
||||
* for newer (A000) hardware.
|
||||
* for newer (22000) hardware.
|
||||
*/
|
||||
SCD_QUEUE_CFG = 0x1d,
|
||||
|
||||
|
@ -121,7 +121,7 @@ enum iwl_tx_flags {
|
||||
}; /* TX_FLAGS_BITS_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* enum iwl_tx_cmd_flags - bitmasks for tx_flags in TX command for a000
|
||||
* enum iwl_tx_cmd_flags - bitmasks for tx_flags in TX command for 22000
|
||||
* @IWL_TX_FLAGS_CMD_RATE: use rate from the TX command
|
||||
* @IWL_TX_FLAGS_ENCRYPT_DIS: frame should not be encrypted, even if it belongs
|
||||
* to a secured STA
|
||||
@ -301,7 +301,7 @@ struct iwl_dram_sec_info {
|
||||
} __packed; /* DRAM_SEC_INFO_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_tx_cmd_gen2 - TX command struct to FW for a000 devices
|
||||
* struct iwl_tx_cmd_gen2 - TX command struct to FW for 22000 devices
|
||||
* ( TX_CMD = 0x1c )
|
||||
* @len: in bytes of the payload, see below for details
|
||||
* @offload_assist: TX offload configuration
|
||||
|
@ -964,7 +964,20 @@ int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fwrt,
|
||||
if (trigger)
|
||||
delay = msecs_to_jiffies(le32_to_cpu(trigger->stop_delay));
|
||||
|
||||
if (WARN(fwrt->trans->state == IWL_TRANS_NO_FW,
|
||||
/*
|
||||
* If the loading of the FW completed successfully, the next step is to
|
||||
* get the SMEM config data. Thus, if fwrt->smem_cfg.num_lmacs is non
|
||||
* zero, the FW was already loaded successully. If the state is "NO_FW"
|
||||
* in such a case - WARN and exit, since FW may be dead. Otherwise, we
|
||||
* can try to collect the data, since FW might just not be fully
|
||||
* loaded (no "ALIVE" yet), and the debug data is accessible.
|
||||
*
|
||||
* Corner case: got the FW alive but crashed before getting the SMEM
|
||||
* config. In such a case, due to HW access problems, we might
|
||||
* collect garbage.
|
||||
*/
|
||||
if (WARN((fwrt->trans->state == IWL_TRANS_NO_FW) &&
|
||||
fwrt->smem_cfg.num_lmacs,
|
||||
"Can't collect dbg data when FW isn't alive\n"))
|
||||
return -EIO;
|
||||
|
||||
|
@ -246,8 +246,6 @@ typedef unsigned int __bitwise iwl_ucode_tlv_api_t;
|
||||
* @IWL_UCODE_TLV_API_STA_TYPE: This ucode supports station type assignement.
|
||||
* @IWL_UCODE_TLV_API_NAN2_VER2: This ucode supports NAN API version 2
|
||||
* @IWL_UCODE_TLV_API_NEW_RX_STATS: should new RX STATISTICS API be used
|
||||
* @IWL_UCODE_TLV_API_ATS_COEX_EXTERNAL: the coex notification is enlared to
|
||||
* include information about ACL time sharing.
|
||||
* @IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY: Quota command includes a field
|
||||
* indicating low latency direction.
|
||||
*
|
||||
@ -267,7 +265,6 @@ enum iwl_ucode_tlv_api {
|
||||
IWL_UCODE_TLV_API_ADAPTIVE_DWELL = (__force iwl_ucode_tlv_api_t)32,
|
||||
IWL_UCODE_TLV_API_NEW_BEACON_TEMPLATE = (__force iwl_ucode_tlv_api_t)34,
|
||||
IWL_UCODE_TLV_API_NEW_RX_STATS = (__force iwl_ucode_tlv_api_t)35,
|
||||
IWL_UCODE_TLV_API_COEX_ATS_EXTERNAL = (__force iwl_ucode_tlv_api_t)37,
|
||||
IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY = (__force iwl_ucode_tlv_api_t)38,
|
||||
|
||||
NUM_IWL_UCODE_TLV_API
|
||||
|
@ -63,8 +63,8 @@
|
||||
#include "runtime.h"
|
||||
#include "fw/api/commands.h"
|
||||
|
||||
static void iwl_parse_shared_mem_a000(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_rx_packet *pkt)
|
||||
static void iwl_parse_shared_mem_22000(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_rx_packet *pkt)
|
||||
{
|
||||
struct iwl_shared_mem_cfg *mem_cfg = (void *)pkt->data;
|
||||
int i, lmac;
|
||||
@ -143,8 +143,8 @@ void iwl_get_shared_mem_conf(struct iwl_fw_runtime *fwrt)
|
||||
return;
|
||||
|
||||
pkt = cmd.resp_pkt;
|
||||
if (fwrt->trans->cfg->device_family == IWL_DEVICE_FAMILY_A000)
|
||||
iwl_parse_shared_mem_a000(fwrt, pkt);
|
||||
if (fwrt->trans->cfg->device_family == IWL_DEVICE_FAMILY_22000)
|
||||
iwl_parse_shared_mem_22000(fwrt, pkt);
|
||||
else
|
||||
iwl_parse_shared_mem(fwrt, pkt);
|
||||
|
||||
|
@ -89,7 +89,7 @@ enum iwl_device_family {
|
||||
IWL_DEVICE_FAMILY_7000,
|
||||
IWL_DEVICE_FAMILY_8000,
|
||||
IWL_DEVICE_FAMILY_9000,
|
||||
IWL_DEVICE_FAMILY_A000,
|
||||
IWL_DEVICE_FAMILY_22000,
|
||||
};
|
||||
|
||||
/*
|
||||
@ -266,7 +266,7 @@ struct iwl_tt_params {
|
||||
#define OTP_LOW_IMAGE_SIZE_FAMILY_7000 (16 * 512 * sizeof(u16)) /* 16 KB */
|
||||
#define OTP_LOW_IMAGE_SIZE_FAMILY_8000 (32 * 512 * sizeof(u16)) /* 32 KB */
|
||||
#define OTP_LOW_IMAGE_SIZE_FAMILY_9000 OTP_LOW_IMAGE_SIZE_FAMILY_8000
|
||||
#define OTP_LOW_IMAGE_SIZE_FAMILY_A000 OTP_LOW_IMAGE_SIZE_FAMILY_9000
|
||||
#define OTP_LOW_IMAGE_SIZE_FAMILY_22000 OTP_LOW_IMAGE_SIZE_FAMILY_9000
|
||||
|
||||
struct iwl_eeprom_params {
|
||||
const u8 regulatory_bands[7];
|
||||
@ -330,7 +330,7 @@ struct iwl_pwr_tx_backoff {
|
||||
* @vht_mu_mimo_supported: VHT MU-MIMO support
|
||||
* @rf_id: need to read rf_id to determine the firmware image
|
||||
* @integrated: discrete or integrated
|
||||
* @gen2: a000 and on transport operation
|
||||
* @gen2: 22000 and on transport operation
|
||||
* @cdb: CDB support
|
||||
* @nvm_type: see &enum iwl_nvm_type
|
||||
* @tx_cmd_queue_size: size of the cmd queue. If zero, use the same value as
|
||||
@ -477,13 +477,13 @@ extern const struct iwl_cfg iwl9460_2ac_cfg_soc;
|
||||
extern const struct iwl_cfg iwl9461_2ac_cfg_soc;
|
||||
extern const struct iwl_cfg iwl9462_2ac_cfg_soc;
|
||||
extern const struct iwl_cfg iwl9560_2ac_cfg_soc;
|
||||
extern const struct iwl_cfg iwla000_2ac_cfg_hr;
|
||||
extern const struct iwl_cfg iwla000_2ac_cfg_hr_cdb;
|
||||
extern const struct iwl_cfg iwla000_2ac_cfg_jf;
|
||||
extern const struct iwl_cfg iwla000_2ax_cfg_hr;
|
||||
extern const struct iwl_cfg iwla000_2ax_cfg_qnj_hr_f0;
|
||||
extern const struct iwl_cfg iwla000_2ax_cfg_qnj_jf_b0;
|
||||
extern const struct iwl_cfg iwla000_2ax_cfg_qnj_hr_a0;
|
||||
extern const struct iwl_cfg iwl22000_2ac_cfg_hr;
|
||||
extern const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb;
|
||||
extern const struct iwl_cfg iwl22000_2ac_cfg_jf;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_hr;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_f0;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_jf_b0;
|
||||
extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0;
|
||||
#endif /* CONFIG_IWLMVM */
|
||||
|
||||
#endif /* __IWL_CONFIG_H__ */
|
||||
|
@ -919,9 +919,14 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
|
||||
minor = le32_to_cpup(ptr++);
|
||||
local_comp = le32_to_cpup(ptr);
|
||||
|
||||
snprintf(drv->fw.fw_version,
|
||||
sizeof(drv->fw.fw_version), "%u.%u.%u",
|
||||
major, minor, local_comp);
|
||||
if (major >= 35)
|
||||
snprintf(drv->fw.fw_version,
|
||||
sizeof(drv->fw.fw_version),
|
||||
"%u.%08x.%u", major, minor, local_comp);
|
||||
else
|
||||
snprintf(drv->fw.fw_version,
|
||||
sizeof(drv->fw.fw_version),
|
||||
"%u.%u.%u", major, minor, local_comp);
|
||||
break;
|
||||
}
|
||||
case IWL_UCODE_TLV_FW_DBG_DEST: {
|
||||
|
@ -121,7 +121,7 @@
|
||||
#define FH_MEM_CBBC_16_19_UPPER_BOUND (FH_MEM_LOWER_BOUND + 0xC00)
|
||||
#define FH_MEM_CBBC_20_31_LOWER_BOUND (FH_MEM_LOWER_BOUND + 0xB20)
|
||||
#define FH_MEM_CBBC_20_31_UPPER_BOUND (FH_MEM_LOWER_BOUND + 0xB80)
|
||||
/* a000 TFD table address, 64 bit */
|
||||
/* 22000 TFD table address, 64 bit */
|
||||
#define TFH_TFDQ_CBB_TABLE (0x1C00)
|
||||
|
||||
/* Find TFD CB base pointer for given queue */
|
||||
@ -140,7 +140,7 @@ static inline unsigned int FH_MEM_CBBC_QUEUE(struct iwl_trans *trans,
|
||||
return FH_MEM_CBBC_20_31_LOWER_BOUND + 4 * (chnl - 20);
|
||||
}
|
||||
|
||||
/* a000 configuration registers */
|
||||
/* 22000 configuration registers */
|
||||
|
||||
/*
|
||||
* TFH Configuration register.
|
||||
@ -697,8 +697,8 @@ struct iwl_tfh_tb {
|
||||
* Each Tx queue uses a circular buffer of 256 TFDs stored in host DRAM.
|
||||
* Both driver and device share these circular buffers, each of which must be
|
||||
* contiguous 256 TFDs.
|
||||
* For pre a000 HW it is 256 x 128 bytes-per-TFD = 32 KBytes
|
||||
* For a000 HW and on it is 256 x 256 bytes-per-TFD = 65 KBytes
|
||||
* For pre 22000 HW it is 256 x 128 bytes-per-TFD = 32 KBytes
|
||||
* For 22000 HW and on it is 256 x 256 bytes-per-TFD = 65 KBytes
|
||||
*
|
||||
* Driver must indicate the physical address of the base of each
|
||||
* circular buffer via the FH_MEM_CBBC_QUEUE registers.
|
||||
@ -750,10 +750,10 @@ struct iwl_tfh_tfd {
|
||||
/**
|
||||
* struct iwlagn_schedq_bc_tbl scheduler byte count table
|
||||
* base physical address provided by SCD_DRAM_BASE_ADDR
|
||||
* For devices up to a000:
|
||||
* For devices up to 22000:
|
||||
* @tfd_offset 0-12 - tx command byte count
|
||||
* 12-16 - station index
|
||||
* For a000 and on:
|
||||
* For 22000 and on:
|
||||
* @tfd_offset 0-12 - tx command byte count
|
||||
* 12-13 - number of 64 byte chunks
|
||||
* 14-16 - reserved
|
||||
|
@ -549,7 +549,7 @@ struct iwl_trans_ops {
|
||||
unsigned int queue_wdg_timeout);
|
||||
void (*txq_disable)(struct iwl_trans *trans, int queue,
|
||||
bool configure_scd);
|
||||
/* a000 functions */
|
||||
/* 22000 functions */
|
||||
int (*txq_alloc)(struct iwl_trans *trans,
|
||||
struct iwl_tx_queue_cfg_cmd *cmd,
|
||||
int cmd_id,
|
||||
|
@ -7,7 +7,6 @@
|
||||
*
|
||||
* Copyright(c) 2013 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
*
|
||||
* 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
|
||||
@ -34,7 +33,6 @@
|
||||
*
|
||||
* Copyright(c) 2013 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -514,36 +512,17 @@ void iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
|
||||
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||
struct iwl_bt_coex_profile_notif *notif = (void *)pkt->data;
|
||||
|
||||
if (!iwl_mvm_has_new_ats_coex_api(mvm)) {
|
||||
struct iwl_bt_coex_profile_notif_v4 *v4 = (void *)pkt->data;
|
||||
|
||||
mvm->last_bt_notif.mbox_msg[0] = v4->mbox_msg[0];
|
||||
mvm->last_bt_notif.mbox_msg[1] = v4->mbox_msg[1];
|
||||
mvm->last_bt_notif.mbox_msg[2] = v4->mbox_msg[2];
|
||||
mvm->last_bt_notif.mbox_msg[3] = v4->mbox_msg[3];
|
||||
mvm->last_bt_notif.msg_idx = v4->msg_idx;
|
||||
mvm->last_bt_notif.bt_ci_compliance = v4->bt_ci_compliance;
|
||||
mvm->last_bt_notif.primary_ch_lut = v4->primary_ch_lut;
|
||||
mvm->last_bt_notif.secondary_ch_lut = v4->secondary_ch_lut;
|
||||
mvm->last_bt_notif.bt_activity_grading =
|
||||
v4->bt_activity_grading;
|
||||
mvm->last_bt_notif.ttc_status = v4->ttc_status;
|
||||
mvm->last_bt_notif.rrc_status = v4->rrc_status;
|
||||
} else {
|
||||
/* save this notification for future use: rssi fluctuations */
|
||||
memcpy(&mvm->last_bt_notif, notif, sizeof(mvm->last_bt_notif));
|
||||
}
|
||||
|
||||
IWL_DEBUG_COEX(mvm, "BT Coex Notification received\n");
|
||||
IWL_DEBUG_COEX(mvm, "\tBT ci compliance %d\n",
|
||||
mvm->last_bt_notif.bt_ci_compliance);
|
||||
IWL_DEBUG_COEX(mvm, "\tBT ci compliance %d\n", notif->bt_ci_compliance);
|
||||
IWL_DEBUG_COEX(mvm, "\tBT primary_ch_lut %d\n",
|
||||
le32_to_cpu(mvm->last_bt_notif.primary_ch_lut));
|
||||
le32_to_cpu(notif->primary_ch_lut));
|
||||
IWL_DEBUG_COEX(mvm, "\tBT secondary_ch_lut %d\n",
|
||||
le32_to_cpu(mvm->last_bt_notif.secondary_ch_lut));
|
||||
le32_to_cpu(notif->secondary_ch_lut));
|
||||
IWL_DEBUG_COEX(mvm, "\tBT activity grading %d\n",
|
||||
le32_to_cpu(mvm->last_bt_notif.bt_activity_grading));
|
||||
le32_to_cpu(notif->bt_activity_grading));
|
||||
|
||||
/* remember this notification for future use: rssi fluctuations */
|
||||
memcpy(&mvm->last_bt_notif, notif, sizeof(mvm->last_bt_notif));
|
||||
|
||||
iwl_mvm_bt_coex_notif_handle(mvm);
|
||||
}
|
||||
|
@ -429,231 +429,6 @@ static int iwl_mvm_send_patterns(struct iwl_mvm *mvm,
|
||||
return err;
|
||||
}
|
||||
|
||||
enum iwl_mvm_tcp_packet_type {
|
||||
MVM_TCP_TX_SYN,
|
||||
MVM_TCP_RX_SYNACK,
|
||||
MVM_TCP_TX_DATA,
|
||||
MVM_TCP_RX_ACK,
|
||||
MVM_TCP_RX_WAKE,
|
||||
MVM_TCP_TX_FIN,
|
||||
};
|
||||
|
||||
static __le16 pseudo_hdr_check(int len, __be32 saddr, __be32 daddr)
|
||||
{
|
||||
__sum16 check = tcp_v4_check(len, saddr, daddr, 0);
|
||||
return cpu_to_le16(be16_to_cpu((__force __be16)check));
|
||||
}
|
||||
|
||||
static void iwl_mvm_build_tcp_packet(struct ieee80211_vif *vif,
|
||||
struct cfg80211_wowlan_tcp *tcp,
|
||||
void *_pkt, u8 *mask,
|
||||
__le16 *pseudo_hdr_csum,
|
||||
enum iwl_mvm_tcp_packet_type ptype)
|
||||
{
|
||||
struct {
|
||||
struct ethhdr eth;
|
||||
struct iphdr ip;
|
||||
struct tcphdr tcp;
|
||||
u8 data[];
|
||||
} __packed *pkt = _pkt;
|
||||
u16 ip_tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr);
|
||||
int i;
|
||||
|
||||
pkt->eth.h_proto = cpu_to_be16(ETH_P_IP),
|
||||
pkt->ip.version = 4;
|
||||
pkt->ip.ihl = 5;
|
||||
pkt->ip.protocol = IPPROTO_TCP;
|
||||
|
||||
switch (ptype) {
|
||||
case MVM_TCP_TX_SYN:
|
||||
case MVM_TCP_TX_DATA:
|
||||
case MVM_TCP_TX_FIN:
|
||||
memcpy(pkt->eth.h_dest, tcp->dst_mac, ETH_ALEN);
|
||||
memcpy(pkt->eth.h_source, vif->addr, ETH_ALEN);
|
||||
pkt->ip.ttl = 128;
|
||||
pkt->ip.saddr = tcp->src;
|
||||
pkt->ip.daddr = tcp->dst;
|
||||
pkt->tcp.source = cpu_to_be16(tcp->src_port);
|
||||
pkt->tcp.dest = cpu_to_be16(tcp->dst_port);
|
||||
/* overwritten for TX SYN later */
|
||||
pkt->tcp.doff = sizeof(struct tcphdr) / 4;
|
||||
pkt->tcp.window = cpu_to_be16(65000);
|
||||
break;
|
||||
case MVM_TCP_RX_SYNACK:
|
||||
case MVM_TCP_RX_ACK:
|
||||
case MVM_TCP_RX_WAKE:
|
||||
memcpy(pkt->eth.h_dest, vif->addr, ETH_ALEN);
|
||||
memcpy(pkt->eth.h_source, tcp->dst_mac, ETH_ALEN);
|
||||
pkt->ip.saddr = tcp->dst;
|
||||
pkt->ip.daddr = tcp->src;
|
||||
pkt->tcp.source = cpu_to_be16(tcp->dst_port);
|
||||
pkt->tcp.dest = cpu_to_be16(tcp->src_port);
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (ptype) {
|
||||
case MVM_TCP_TX_SYN:
|
||||
/* firmware assumes 8 option bytes - 8 NOPs for now */
|
||||
memset(pkt->data, 0x01, 8);
|
||||
ip_tot_len += 8;
|
||||
pkt->tcp.doff = (sizeof(struct tcphdr) + 8) / 4;
|
||||
pkt->tcp.syn = 1;
|
||||
break;
|
||||
case MVM_TCP_TX_DATA:
|
||||
ip_tot_len += tcp->payload_len;
|
||||
memcpy(pkt->data, tcp->payload, tcp->payload_len);
|
||||
pkt->tcp.psh = 1;
|
||||
pkt->tcp.ack = 1;
|
||||
break;
|
||||
case MVM_TCP_TX_FIN:
|
||||
pkt->tcp.fin = 1;
|
||||
pkt->tcp.ack = 1;
|
||||
break;
|
||||
case MVM_TCP_RX_SYNACK:
|
||||
pkt->tcp.syn = 1;
|
||||
pkt->tcp.ack = 1;
|
||||
break;
|
||||
case MVM_TCP_RX_ACK:
|
||||
pkt->tcp.ack = 1;
|
||||
break;
|
||||
case MVM_TCP_RX_WAKE:
|
||||
ip_tot_len += tcp->wake_len;
|
||||
pkt->tcp.psh = 1;
|
||||
pkt->tcp.ack = 1;
|
||||
memcpy(pkt->data, tcp->wake_data, tcp->wake_len);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (ptype) {
|
||||
case MVM_TCP_TX_SYN:
|
||||
case MVM_TCP_TX_DATA:
|
||||
case MVM_TCP_TX_FIN:
|
||||
pkt->ip.tot_len = cpu_to_be16(ip_tot_len);
|
||||
pkt->ip.check = ip_fast_csum(&pkt->ip, pkt->ip.ihl);
|
||||
break;
|
||||
case MVM_TCP_RX_WAKE:
|
||||
for (i = 0; i < DIV_ROUND_UP(tcp->wake_len, 8); i++) {
|
||||
u8 tmp = tcp->wake_mask[i];
|
||||
mask[i + 6] |= tmp << 6;
|
||||
if (i + 1 < DIV_ROUND_UP(tcp->wake_len, 8))
|
||||
mask[i + 7] = tmp >> 2;
|
||||
}
|
||||
/* fall through for ethernet/IP/TCP headers mask */
|
||||
case MVM_TCP_RX_SYNACK:
|
||||
case MVM_TCP_RX_ACK:
|
||||
mask[0] = 0xff; /* match ethernet */
|
||||
/*
|
||||
* match ethernet, ip.version, ip.ihl
|
||||
* the ip.ihl half byte is really masked out by firmware
|
||||
*/
|
||||
mask[1] = 0x7f;
|
||||
mask[2] = 0x80; /* match ip.protocol */
|
||||
mask[3] = 0xfc; /* match ip.saddr, ip.daddr */
|
||||
mask[4] = 0x3f; /* match ip.daddr, tcp.source, tcp.dest */
|
||||
mask[5] = 0x80; /* match tcp flags */
|
||||
/* leave rest (0 or set for MVM_TCP_RX_WAKE) */
|
||||
break;
|
||||
};
|
||||
|
||||
*pseudo_hdr_csum = pseudo_hdr_check(ip_tot_len - sizeof(struct iphdr),
|
||||
pkt->ip.saddr, pkt->ip.daddr);
|
||||
}
|
||||
|
||||
static int iwl_mvm_send_remote_wake_cfg(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct cfg80211_wowlan_tcp *tcp)
|
||||
{
|
||||
struct iwl_wowlan_remote_wake_config *cfg;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = REMOTE_WAKE_CONFIG_CMD,
|
||||
.len = { sizeof(*cfg), },
|
||||
.dataflags = { IWL_HCMD_DFL_NOCOPY, },
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (!tcp)
|
||||
return 0;
|
||||
|
||||
cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
|
||||
if (!cfg)
|
||||
return -ENOMEM;
|
||||
cmd.data[0] = cfg;
|
||||
|
||||
cfg->max_syn_retries = 10;
|
||||
cfg->max_data_retries = 10;
|
||||
cfg->tcp_syn_ack_timeout = 1; /* seconds */
|
||||
cfg->tcp_ack_timeout = 1; /* seconds */
|
||||
|
||||
/* SYN (TX) */
|
||||
iwl_mvm_build_tcp_packet(
|
||||
vif, tcp, cfg->syn_tx.data, NULL,
|
||||
&cfg->syn_tx.info.tcp_pseudo_header_checksum,
|
||||
MVM_TCP_TX_SYN);
|
||||
cfg->syn_tx.info.tcp_payload_length = 0;
|
||||
|
||||
/* SYN/ACK (RX) */
|
||||
iwl_mvm_build_tcp_packet(
|
||||
vif, tcp, cfg->synack_rx.data, cfg->synack_rx.rx_mask,
|
||||
&cfg->synack_rx.info.tcp_pseudo_header_checksum,
|
||||
MVM_TCP_RX_SYNACK);
|
||||
cfg->synack_rx.info.tcp_payload_length = 0;
|
||||
|
||||
/* KEEPALIVE/ACK (TX) */
|
||||
iwl_mvm_build_tcp_packet(
|
||||
vif, tcp, cfg->keepalive_tx.data, NULL,
|
||||
&cfg->keepalive_tx.info.tcp_pseudo_header_checksum,
|
||||
MVM_TCP_TX_DATA);
|
||||
cfg->keepalive_tx.info.tcp_payload_length =
|
||||
cpu_to_le16(tcp->payload_len);
|
||||
cfg->sequence_number_offset = tcp->payload_seq.offset;
|
||||
/* length must be 0..4, the field is little endian */
|
||||
cfg->sequence_number_length = tcp->payload_seq.len;
|
||||
cfg->initial_sequence_number = cpu_to_le32(tcp->payload_seq.start);
|
||||
cfg->keepalive_interval = cpu_to_le16(tcp->data_interval);
|
||||
if (tcp->payload_tok.len) {
|
||||
cfg->token_offset = tcp->payload_tok.offset;
|
||||
cfg->token_length = tcp->payload_tok.len;
|
||||
cfg->num_tokens =
|
||||
cpu_to_le16(tcp->tokens_size % tcp->payload_tok.len);
|
||||
memcpy(cfg->tokens, tcp->payload_tok.token_stream,
|
||||
tcp->tokens_size);
|
||||
} else {
|
||||
/* set tokens to max value to almost never run out */
|
||||
cfg->num_tokens = cpu_to_le16(65535);
|
||||
}
|
||||
|
||||
/* ACK (RX) */
|
||||
iwl_mvm_build_tcp_packet(
|
||||
vif, tcp, cfg->keepalive_ack_rx.data,
|
||||
cfg->keepalive_ack_rx.rx_mask,
|
||||
&cfg->keepalive_ack_rx.info.tcp_pseudo_header_checksum,
|
||||
MVM_TCP_RX_ACK);
|
||||
cfg->keepalive_ack_rx.info.tcp_payload_length = 0;
|
||||
|
||||
/* WAKEUP (RX) */
|
||||
iwl_mvm_build_tcp_packet(
|
||||
vif, tcp, cfg->wake_rx.data, cfg->wake_rx.rx_mask,
|
||||
&cfg->wake_rx.info.tcp_pseudo_header_checksum,
|
||||
MVM_TCP_RX_WAKE);
|
||||
cfg->wake_rx.info.tcp_payload_length =
|
||||
cpu_to_le16(tcp->wake_len);
|
||||
|
||||
/* FIN */
|
||||
iwl_mvm_build_tcp_packet(
|
||||
vif, tcp, cfg->fin_tx.data, NULL,
|
||||
&cfg->fin_tx.info.tcp_pseudo_header_checksum,
|
||||
MVM_TCP_TX_FIN);
|
||||
cfg->fin_tx.info.tcp_payload_length = 0;
|
||||
|
||||
ret = iwl_mvm_send_cmd(mvm, &cmd);
|
||||
kfree(cfg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int iwl_mvm_d3_reprogram(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *ap_sta)
|
||||
{
|
||||
@ -1082,12 +857,7 @@ iwl_mvm_wowlan_config(struct iwl_mvm *mvm,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = iwl_mvm_send_proto_offload(mvm, vif, false, true, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = iwl_mvm_send_remote_wake_cfg(mvm, vif, wowlan->tcp);
|
||||
return ret;
|
||||
return iwl_mvm_send_proto_offload(mvm, vif, false, true, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -470,8 +470,7 @@ static ssize_t iwl_dbgfs_disable_power_off_write(struct iwl_mvm *mvm, char *buf,
|
||||
}
|
||||
|
||||
static
|
||||
int iwl_mvm_coex_dump_mbox(struct iwl_mvm *mvm,
|
||||
struct iwl_bt_coex_profile_notif *notif, char *buf,
|
||||
int iwl_mvm_coex_dump_mbox(struct iwl_bt_coex_profile_notif *notif, char *buf,
|
||||
int pos, int bufsz)
|
||||
{
|
||||
pos += scnprintf(buf+pos, bufsz-pos, "MBOX dw0:\n");
|
||||
@ -525,12 +524,7 @@ int iwl_mvm_coex_dump_mbox(struct iwl_mvm *mvm,
|
||||
BT_MBOX_PRINT(3, INBAND_P, false);
|
||||
BT_MBOX_PRINT(3, MSG_TYPE_2, false);
|
||||
BT_MBOX_PRINT(3, SSN_2, false);
|
||||
BT_MBOX_PRINT(3, UPDATE_REQUEST, !iwl_mvm_has_new_ats_coex_api(mvm));
|
||||
|
||||
if (iwl_mvm_has_new_ats_coex_api(mvm)) {
|
||||
BT_MBOX_PRINT(4, ATS_BT_INTERVAL, false);
|
||||
BT_MBOX_PRINT(4, ATS_BT_ACTIVE_MAX_TH, true);
|
||||
}
|
||||
BT_MBOX_PRINT(3, UPDATE_REQUEST, true);
|
||||
|
||||
return pos;
|
||||
}
|
||||
@ -549,7 +543,7 @@ static ssize_t iwl_dbgfs_bt_notif_read(struct file *file, char __user *user_buf,
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
|
||||
pos += iwl_mvm_coex_dump_mbox(mvm, notif, buf, pos, bufsz);
|
||||
pos += iwl_mvm_coex_dump_mbox(notif, buf, pos, bufsz);
|
||||
|
||||
pos += scnprintf(buf + pos, bufsz - pos, "bt_ci_compliance = %d\n",
|
||||
notif->bt_ci_compliance);
|
||||
|
@ -297,7 +297,7 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
|
||||
if (ret) {
|
||||
struct iwl_trans *trans = mvm->trans;
|
||||
|
||||
if (trans->cfg->device_family == IWL_DEVICE_FAMILY_A000)
|
||||
if (trans->cfg->device_family == IWL_DEVICE_FAMILY_22000)
|
||||
IWL_ERR(mvm,
|
||||
"SecBoot CPU1 Status: 0x%x, CPU2 Status: 0x%x\n",
|
||||
iwl_read_prph(trans, UMAG_SB_CPU_1_STATUS),
|
||||
@ -998,9 +998,9 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
|
||||
goto error;
|
||||
|
||||
/* Init RSS configuration */
|
||||
/* TODO - remove a000 disablement when we have RXQ config API */
|
||||
/* TODO - remove 22000 disablement when we have RXQ config API */
|
||||
if (iwl_mvm_has_new_rx_api(mvm) &&
|
||||
mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_A000) {
|
||||
mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_22000) {
|
||||
ret = iwl_send_rss_cfg_cmd(mvm);
|
||||
if (ret) {
|
||||
IWL_ERR(mvm, "Failed to configure RSS queues: %d\n",
|
||||
|
@ -114,29 +114,6 @@ static const struct ieee80211_iface_combination iwl_mvm_iface_combinations[] = {
|
||||
},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static const struct nl80211_wowlan_tcp_data_token_feature
|
||||
iwl_mvm_wowlan_tcp_token_feature = {
|
||||
.min_len = 0,
|
||||
.max_len = 255,
|
||||
.bufsize = IWL_WOWLAN_REMOTE_WAKE_MAX_TOKENS,
|
||||
};
|
||||
|
||||
static const struct wiphy_wowlan_tcp_support iwl_mvm_wowlan_tcp_support = {
|
||||
.tok = &iwl_mvm_wowlan_tcp_token_feature,
|
||||
.data_payload_max = IWL_WOWLAN_TCP_MAX_PACKET_LEN -
|
||||
sizeof(struct ethhdr) -
|
||||
sizeof(struct iphdr) -
|
||||
sizeof(struct tcphdr),
|
||||
.data_interval_max = 65535, /* __le16 in API */
|
||||
.wake_payload_max = IWL_WOWLAN_REMOTE_WAKE_MAX_PACKET_LEN -
|
||||
sizeof(struct ethhdr) -
|
||||
sizeof(struct iphdr) -
|
||||
sizeof(struct tcphdr),
|
||||
.seq = true,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
|
||||
/*
|
||||
* Use the reserved field to indicate magic values.
|
||||
@ -702,7 +679,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
||||
mvm->wowlan.pattern_min_len = IWL_WOWLAN_MIN_PATTERN_LEN;
|
||||
mvm->wowlan.pattern_max_len = IWL_WOWLAN_MAX_PATTERN_LEN;
|
||||
mvm->wowlan.max_nd_match_sets = IWL_SCAN_MAX_PROFILES;
|
||||
mvm->wowlan.tcp = &iwl_mvm_wowlan_tcp_support;
|
||||
hw->wiphy->wowlan = &mvm->wowlan;
|
||||
}
|
||||
#endif
|
||||
@ -3216,6 +3192,10 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
|
||||
IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value,
|
||||
duration, type);
|
||||
|
||||
/*
|
||||
* Flush the done work, just in case it's still pending, so that
|
||||
* the work it does can complete and we can accept new frames.
|
||||
*/
|
||||
flush_work(&mvm->roc_done_wk);
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
@ -4301,7 +4281,7 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
|
||||
mvm->trans->num_rx_queues);
|
||||
|
||||
/* TODO - remove this when we have RXQ config API */
|
||||
if (mvm->trans->cfg->device_family == IWL_DEVICE_FAMILY_A000) {
|
||||
if (mvm->trans->cfg->device_family == IWL_DEVICE_FAMILY_22000) {
|
||||
qmask = BIT(0);
|
||||
if (notif->sync)
|
||||
atomic_set(&mvm->queue_sync_counter, 1);
|
||||
|
@ -1245,7 +1245,7 @@ static inline bool iwl_mvm_has_new_tx_api(struct iwl_mvm *mvm)
|
||||
static inline bool iwl_mvm_has_unified_ucode(struct iwl_mvm *mvm)
|
||||
{
|
||||
/* TODO - better define this */
|
||||
return mvm->trans->cfg->device_family >= IWL_DEVICE_FAMILY_A000;
|
||||
return mvm->trans->cfg->device_family >= IWL_DEVICE_FAMILY_22000;
|
||||
}
|
||||
|
||||
static inline bool iwl_mvm_is_cdb_supported(struct iwl_mvm *mvm)
|
||||
@ -1269,12 +1269,6 @@ static inline bool iwl_mvm_has_new_rx_stats_api(struct iwl_mvm *mvm)
|
||||
IWL_UCODE_TLV_API_NEW_RX_STATS);
|
||||
}
|
||||
|
||||
static inline bool iwl_mvm_has_new_ats_coex_api(struct iwl_mvm *mvm)
|
||||
{
|
||||
return fw_has_api(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_API_COEX_ATS_EXTERNAL);
|
||||
}
|
||||
|
||||
static inline bool iwl_mvm_has_quota_low_latency(struct iwl_mvm *mvm)
|
||||
{
|
||||
return fw_has_api(&mvm->fw->ucode_capa,
|
||||
|
@ -1877,12 +1877,10 @@ static int rs_switch_to_column(struct iwl_mvm *mvm,
|
||||
struct rs_rate *rate = &search_tbl->rate;
|
||||
const struct rs_tx_column *column = &rs_tx_columns[col_id];
|
||||
const struct rs_tx_column *curr_column = &rs_tx_columns[tbl->column];
|
||||
u32 sz = (sizeof(struct iwl_scale_tbl_info) -
|
||||
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
|
||||
unsigned long rate_mask = 0;
|
||||
u32 rate_idx = 0;
|
||||
|
||||
memcpy(search_tbl, tbl, sz);
|
||||
memcpy(search_tbl, tbl, offsetof(struct iwl_scale_tbl_info, win));
|
||||
|
||||
rate->sgi = column->sgi;
|
||||
rate->ant = column->ant;
|
||||
|
@ -439,7 +439,8 @@ void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
|
||||
rx_status->bw = RATE_INFO_BW_160;
|
||||
break;
|
||||
}
|
||||
if (rate_n_flags & RATE_MCS_SGI_MSK)
|
||||
if (!(rate_n_flags & RATE_MCS_CCK_MSK) &&
|
||||
rate_n_flags & RATE_MCS_SGI_MSK)
|
||||
rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
|
||||
if (rate_n_flags & RATE_HT_MCS_GF_MSK)
|
||||
rx_status->enc_flags |= RX_ENC_FLAG_HT_GF;
|
||||
|
@ -1010,7 +1010,9 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
|
||||
rx_status->bw = RATE_INFO_BW_160;
|
||||
break;
|
||||
}
|
||||
if (rate_n_flags & RATE_MCS_SGI_MSK)
|
||||
|
||||
if (!(rate_n_flags & RATE_MCS_CCK_MSK) &&
|
||||
rate_n_flags & RATE_MCS_SGI_MSK)
|
||||
rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
|
||||
if (rate_n_flags & RATE_HT_MCS_GF_MSK)
|
||||
rx_status->enc_flags |= RX_ENC_FLAG_HT_GF;
|
||||
|
@ -1760,7 +1760,7 @@ int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
|
||||
}
|
||||
|
||||
/*
|
||||
* For a000 firmware and on we cannot add queue to a station unknown
|
||||
* For 22000 firmware and on we cannot add queue to a station unknown
|
||||
* to firmware so enable queue here - after the station was added
|
||||
*/
|
||||
if (iwl_mvm_has_new_tx_api(mvm))
|
||||
@ -1858,7 +1858,7 @@ int iwl_mvm_send_add_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* For a000 firmware and on we cannot add queue to a station unknown
|
||||
* For 22000 firmware and on we cannot add queue to a station unknown
|
||||
* to firmware so enable queue here - after the station was added
|
||||
*/
|
||||
if (iwl_mvm_has_new_tx_api(mvm)) {
|
||||
@ -2037,7 +2037,7 @@ int iwl_mvm_add_mcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
||||
|
||||
/*
|
||||
* Enable cab queue after the ADD_STA command is sent.
|
||||
* This is needed for a000 firmware which won't accept SCD_QUEUE_CFG
|
||||
* This is needed for 22000 firmware which won't accept SCD_QUEUE_CFG
|
||||
* command with unknown station id, and for FW that doesn't support
|
||||
* station API since the cab queue is not included in the
|
||||
* tfd_queue_mask.
|
||||
@ -2503,7 +2503,7 @@ int iwl_mvm_sta_tx_agg_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
tid_data->next_reclaimed);
|
||||
|
||||
/*
|
||||
* In A000 HW, the next_reclaimed index is only 8 bit, so we'll need
|
||||
* In 22000 HW, the next_reclaimed index is only 8 bit, so we'll need
|
||||
* to align the wrap around of ssn so we compare relevant values.
|
||||
*/
|
||||
normalized_ssn = tid_data->ssn;
|
||||
@ -3588,7 +3588,7 @@ u16 iwl_mvm_tid_queued(struct iwl_mvm *mvm, struct iwl_mvm_tid_data *tid_data)
|
||||
u16 sn = IEEE80211_SEQ_TO_SN(tid_data->seq_number);
|
||||
|
||||
/*
|
||||
* In A000 HW, the next_reclaimed index is only 8 bit, so we'll need
|
||||
* In 22000 HW, the next_reclaimed index is only 8 bit, so we'll need
|
||||
* to align the wrap around of ssn so we compare relevant values.
|
||||
*/
|
||||
if (mvm->trans->cfg->gen2)
|
||||
|
@ -759,12 +759,6 @@ int iwl_mvm_start_p2p_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/*
|
||||
* Flush the done work, just in case it's still pending, so that
|
||||
* the work it does can complete and we can accept new frames.
|
||||
*/
|
||||
flush_work(&mvm->roc_done_wk);
|
||||
|
||||
time_cmd.action = cpu_to_le32(FW_CTXT_ACTION_ADD);
|
||||
time_cmd.id_and_color =
|
||||
cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id, mvmvif->color));
|
||||
|
@ -1131,7 +1131,7 @@ static void iwl_mvm_check_ratid_empty(struct iwl_mvm *mvm,
|
||||
}
|
||||
|
||||
/*
|
||||
* In A000 HW, the next_reclaimed index is only 8 bit, so we'll need
|
||||
* In 22000 HW, the next_reclaimed index is only 8 bit, so we'll need
|
||||
* to align the wrap around of ssn so we compare relevant values.
|
||||
*/
|
||||
normalized_ssn = tid_data->ssn;
|
||||
@ -1623,7 +1623,7 @@ static void iwl_mvm_tx_reclaim(struct iwl_mvm *mvm, int sta_id, int tid,
|
||||
int freed;
|
||||
|
||||
if (WARN_ONCE(sta_id >= IWL_MVM_STATION_COUNT ||
|
||||
tid >= IWL_MAX_TID_COUNT,
|
||||
tid > IWL_MAX_TID_COUNT,
|
||||
"sta_id %d tid %d", sta_id, tid))
|
||||
return;
|
||||
|
||||
@ -1678,7 +1678,7 @@ static void iwl_mvm_tx_reclaim(struct iwl_mvm *mvm, int sta_id, int tid,
|
||||
if (ieee80211_is_data_qos(hdr->frame_control))
|
||||
freed++;
|
||||
else
|
||||
WARN_ON_ONCE(1);
|
||||
WARN_ON_ONCE(tid != IWL_MAX_TID_COUNT);
|
||||
|
||||
iwl_trans_free_tx_cmd(mvm->trans, info->driver_data[1]);
|
||||
|
||||
@ -1770,8 +1770,12 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
|
||||
struct iwl_mvm_compressed_ba_tfd *ba_tfd =
|
||||
&ba_res->tfd[i];
|
||||
|
||||
tid = ba_tfd->tid;
|
||||
if (tid == IWL_MGMT_TID)
|
||||
tid = IWL_MAX_TID_COUNT;
|
||||
|
||||
mvmsta->tid_data[i].lq_color = lq_color;
|
||||
iwl_mvm_tx_reclaim(mvm, sta_id, ba_tfd->tid,
|
||||
iwl_mvm_tx_reclaim(mvm, sta_id, tid,
|
||||
(int)(le16_to_cpu(ba_tfd->q_num)),
|
||||
le16_to_cpu(ba_tfd->tfd_index),
|
||||
&ba_info,
|
||||
|
@ -651,19 +651,19 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
{IWL_PCI_DEVICE(0xA370, 0x4034, iwl9560_2ac_cfg_soc)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x40A4, iwl9462_2ac_cfg_soc)},
|
||||
|
||||
/* a000 Series */
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0A10, iwla000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0310, iwla000_2ac_cfg_jf)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0000, iwla000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0070, iwla000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0078, iwla000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0070, iwla000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0030, iwla000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1080, iwla000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0090, iwla000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0310, iwla000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x40C0, 0x0000, iwla000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x40C0, 0x0A10, iwla000_2ax_cfg_hr)},
|
||||
/* 22000 Series */
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0A10, iwl22000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0310, iwl22000_2ac_cfg_jf)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0000, iwl22000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x34F0, 0x0070, iwl22000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0078, iwl22000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0070, iwl22000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0030, iwl22000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x1080, iwl22000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0090, iwl22000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0310, iwl22000_2ac_cfg_hr_cdb)},
|
||||
{IWL_PCI_DEVICE(0x40C0, 0x0000, iwl22000_2ax_cfg_hr)},
|
||||
{IWL_PCI_DEVICE(0x40C0, 0x0A10, iwl22000_2ax_cfg_hr)},
|
||||
|
||||
#endif /* CONFIG_IWLMVM */
|
||||
|
||||
@ -705,7 +705,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
iwl_trans->cfg = cfg_7265d;
|
||||
}
|
||||
|
||||
if (iwl_trans->cfg->rf_id && cfg == &iwla000_2ac_cfg_hr_cdb &&
|
||||
if (iwl_trans->cfg->rf_id && cfg == &iwl22000_2ac_cfg_hr_cdb &&
|
||||
iwl_trans->hw_rev != CSR_HW_REV_TYPE_HR_CDB) {
|
||||
u32 rf_id_chp = CSR_HW_RF_ID_TYPE_CHIP_ID(iwl_trans->hw_rf_id);
|
||||
u32 jf_chp_id = CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_JF);
|
||||
@ -713,14 +713,14 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
if (rf_id_chp == jf_chp_id) {
|
||||
if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_QNJ)
|
||||
cfg = &iwla000_2ax_cfg_qnj_jf_b0;
|
||||
cfg = &iwl22000_2ax_cfg_qnj_jf_b0;
|
||||
else
|
||||
cfg = &iwla000_2ac_cfg_jf;
|
||||
cfg = &iwl22000_2ac_cfg_jf;
|
||||
} else if (rf_id_chp == hr_chp_id) {
|
||||
if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_QNJ)
|
||||
cfg = &iwla000_2ax_cfg_qnj_hr_a0;
|
||||
cfg = &iwl22000_2ax_cfg_qnj_hr_a0;
|
||||
else
|
||||
cfg = &iwla000_2ac_cfg_hr;
|
||||
cfg = &iwl22000_2ac_cfg_hr;
|
||||
}
|
||||
iwl_trans->cfg = cfg;
|
||||
}
|
||||
|
@ -3240,9 +3240,9 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
||||
|
||||
hw_status = iwl_read_prph(trans, UMAG_GEN_HW_STATUS);
|
||||
if (hw_status & UMAG_GEN_HW_IS_FPGA)
|
||||
trans->cfg = &iwla000_2ax_cfg_qnj_hr_f0;
|
||||
trans->cfg = &iwl22000_2ax_cfg_qnj_hr_f0;
|
||||
else
|
||||
trans->cfg = &iwla000_2ac_cfg_hr;
|
||||
trans->cfg = &iwl22000_2ac_cfg_hr;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user