162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2012-2014, 2018-2020, 2023 Intel Corporation 462306a36Sopenharmony_ci * Copyright (C) 2013-2014 Intel Mobile Communications GmbH 562306a36Sopenharmony_ci * Copyright (C) 2015 Intel Deutschland GmbH 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/module.h> 862306a36Sopenharmony_ci#include <linux/stringify.h> 962306a36Sopenharmony_ci#include "iwl-config.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* Highest firmware API version supported */ 1262306a36Sopenharmony_ci#define IWL7260_UCODE_API_MAX 17 1362306a36Sopenharmony_ci#define IWL7265_UCODE_API_MAX 17 1462306a36Sopenharmony_ci#define IWL7265D_UCODE_API_MAX 29 1562306a36Sopenharmony_ci#define IWL3168_UCODE_API_MAX 29 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* Lowest firmware API version supported */ 1862306a36Sopenharmony_ci#define IWL7260_UCODE_API_MIN 17 1962306a36Sopenharmony_ci#define IWL7265_UCODE_API_MIN 17 2062306a36Sopenharmony_ci#define IWL7265D_UCODE_API_MIN 22 2162306a36Sopenharmony_ci#define IWL3168_UCODE_API_MIN 22 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* NVM versions */ 2462306a36Sopenharmony_ci#define IWL7260_NVM_VERSION 0x0a1d 2562306a36Sopenharmony_ci#define IWL3160_NVM_VERSION 0x709 2662306a36Sopenharmony_ci#define IWL3165_NVM_VERSION 0x709 2762306a36Sopenharmony_ci#define IWL3168_NVM_VERSION 0xd01 2862306a36Sopenharmony_ci#define IWL7265_NVM_VERSION 0x0a1d 2962306a36Sopenharmony_ci#define IWL7265D_NVM_VERSION 0x0c11 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* DCCM offsets and lengths */ 3262306a36Sopenharmony_ci#define IWL7000_DCCM_OFFSET 0x800000 3362306a36Sopenharmony_ci#define IWL7260_DCCM_LEN 0x14000 3462306a36Sopenharmony_ci#define IWL3160_DCCM_LEN 0x10000 3562306a36Sopenharmony_ci#define IWL7265_DCCM_LEN 0x17A00 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define IWL7260_FW_PRE "iwlwifi-7260" 3862306a36Sopenharmony_ci#define IWL7260_MODULE_FIRMWARE(api) IWL7260_FW_PRE "-" __stringify(api) ".ucode" 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define IWL3160_FW_PRE "iwlwifi-3160" 4162306a36Sopenharmony_ci#define IWL3160_MODULE_FIRMWARE(api) IWL3160_FW_PRE "-" __stringify(api) ".ucode" 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define IWL3168_FW_PRE "iwlwifi-3168" 4462306a36Sopenharmony_ci#define IWL3168_MODULE_FIRMWARE(api) IWL3168_FW_PRE "-" __stringify(api) ".ucode" 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define IWL7265_FW_PRE "iwlwifi-7265" 4762306a36Sopenharmony_ci#define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE "-" __stringify(api) ".ucode" 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define IWL7265D_FW_PRE "iwlwifi-7265D" 5062306a36Sopenharmony_ci#define IWL7265D_MODULE_FIRMWARE(api) IWL7265D_FW_PRE "-" __stringify(api) ".ucode" 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic const struct iwl_base_params iwl7000_base_params = { 5362306a36Sopenharmony_ci .eeprom_size = OTP_LOW_IMAGE_SIZE_16K, 5462306a36Sopenharmony_ci .num_of_queues = 31, 5562306a36Sopenharmony_ci .max_tfd_queue_size = 256, 5662306a36Sopenharmony_ci .shadow_ram_support = true, 5762306a36Sopenharmony_ci .led_compensation = 57, 5862306a36Sopenharmony_ci .wd_timeout = IWL_LONG_WD_TIMEOUT, 5962306a36Sopenharmony_ci .max_event_log_size = 512, 6062306a36Sopenharmony_ci .shadow_reg_enable = true, 6162306a36Sopenharmony_ci .pcie_l1_allowed = true, 6262306a36Sopenharmony_ci .apmg_wake_up_wa = true, 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic const struct iwl_tt_params iwl7000_high_temp_tt_params = { 6662306a36Sopenharmony_ci .ct_kill_entry = 118, 6762306a36Sopenharmony_ci .ct_kill_exit = 96, 6862306a36Sopenharmony_ci .ct_kill_duration = 5, 6962306a36Sopenharmony_ci .dynamic_smps_entry = 114, 7062306a36Sopenharmony_ci .dynamic_smps_exit = 110, 7162306a36Sopenharmony_ci .tx_protection_entry = 114, 7262306a36Sopenharmony_ci .tx_protection_exit = 108, 7362306a36Sopenharmony_ci .tx_backoff = { 7462306a36Sopenharmony_ci {.temperature = 112, .backoff = 300}, 7562306a36Sopenharmony_ci {.temperature = 113, .backoff = 800}, 7662306a36Sopenharmony_ci {.temperature = 114, .backoff = 1500}, 7762306a36Sopenharmony_ci {.temperature = 115, .backoff = 3000}, 7862306a36Sopenharmony_ci {.temperature = 116, .backoff = 5000}, 7962306a36Sopenharmony_ci {.temperature = 117, .backoff = 10000}, 8062306a36Sopenharmony_ci }, 8162306a36Sopenharmony_ci .support_ct_kill = true, 8262306a36Sopenharmony_ci .support_dynamic_smps = true, 8362306a36Sopenharmony_ci .support_tx_protection = true, 8462306a36Sopenharmony_ci .support_tx_backoff = true, 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic const struct iwl_ht_params iwl7000_ht_params = { 8862306a36Sopenharmony_ci .stbc = true, 8962306a36Sopenharmony_ci .ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ), 9062306a36Sopenharmony_ci}; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define IWL_DEVICE_7000_COMMON \ 9362306a36Sopenharmony_ci .trans.device_family = IWL_DEVICE_FAMILY_7000, \ 9462306a36Sopenharmony_ci .trans.base_params = &iwl7000_base_params, \ 9562306a36Sopenharmony_ci .led_mode = IWL_LED_RF_STATE, \ 9662306a36Sopenharmony_ci .nvm_hw_section_num = 0, \ 9762306a36Sopenharmony_ci .non_shared_ant = ANT_A, \ 9862306a36Sopenharmony_ci .dccm_offset = IWL7000_DCCM_OFFSET 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define IWL_DEVICE_7000 \ 10162306a36Sopenharmony_ci IWL_DEVICE_7000_COMMON, \ 10262306a36Sopenharmony_ci .ucode_api_max = IWL7260_UCODE_API_MAX, \ 10362306a36Sopenharmony_ci .ucode_api_min = IWL7260_UCODE_API_MIN 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#define IWL_DEVICE_7005 \ 10662306a36Sopenharmony_ci IWL_DEVICE_7000_COMMON, \ 10762306a36Sopenharmony_ci .ucode_api_max = IWL7265_UCODE_API_MAX, \ 10862306a36Sopenharmony_ci .ucode_api_min = IWL7265_UCODE_API_MIN 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define IWL_DEVICE_3008 \ 11162306a36Sopenharmony_ci IWL_DEVICE_7000_COMMON, \ 11262306a36Sopenharmony_ci .ucode_api_max = IWL3168_UCODE_API_MAX, \ 11362306a36Sopenharmony_ci .ucode_api_min = IWL3168_UCODE_API_MIN 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci#define IWL_DEVICE_7005D \ 11662306a36Sopenharmony_ci IWL_DEVICE_7000_COMMON, \ 11762306a36Sopenharmony_ci .ucode_api_max = IWL7265D_UCODE_API_MAX, \ 11862306a36Sopenharmony_ci .ucode_api_min = IWL7265D_UCODE_API_MIN 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ciconst struct iwl_cfg iwl7260_2ac_cfg = { 12162306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless AC 7260", 12262306a36Sopenharmony_ci .fw_name_pre = IWL7260_FW_PRE, 12362306a36Sopenharmony_ci IWL_DEVICE_7000, 12462306a36Sopenharmony_ci .ht_params = &iwl7000_ht_params, 12562306a36Sopenharmony_ci .nvm_ver = IWL7260_NVM_VERSION, 12662306a36Sopenharmony_ci .host_interrupt_operation_mode = true, 12762306a36Sopenharmony_ci .lp_xtal_workaround = true, 12862306a36Sopenharmony_ci .dccm_len = IWL7260_DCCM_LEN, 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ciconst struct iwl_cfg iwl7260_2ac_cfg_high_temp = { 13262306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless AC 7260", 13362306a36Sopenharmony_ci .fw_name_pre = IWL7260_FW_PRE, 13462306a36Sopenharmony_ci IWL_DEVICE_7000, 13562306a36Sopenharmony_ci .ht_params = &iwl7000_ht_params, 13662306a36Sopenharmony_ci .nvm_ver = IWL7260_NVM_VERSION, 13762306a36Sopenharmony_ci .high_temp = true, 13862306a36Sopenharmony_ci .host_interrupt_operation_mode = true, 13962306a36Sopenharmony_ci .lp_xtal_workaround = true, 14062306a36Sopenharmony_ci .dccm_len = IWL7260_DCCM_LEN, 14162306a36Sopenharmony_ci .thermal_params = &iwl7000_high_temp_tt_params, 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ciconst struct iwl_cfg iwl7260_2n_cfg = { 14562306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless N 7260", 14662306a36Sopenharmony_ci .fw_name_pre = IWL7260_FW_PRE, 14762306a36Sopenharmony_ci IWL_DEVICE_7000, 14862306a36Sopenharmony_ci .ht_params = &iwl7000_ht_params, 14962306a36Sopenharmony_ci .nvm_ver = IWL7260_NVM_VERSION, 15062306a36Sopenharmony_ci .host_interrupt_operation_mode = true, 15162306a36Sopenharmony_ci .lp_xtal_workaround = true, 15262306a36Sopenharmony_ci .dccm_len = IWL7260_DCCM_LEN, 15362306a36Sopenharmony_ci}; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ciconst struct iwl_cfg iwl7260_n_cfg = { 15662306a36Sopenharmony_ci .name = "Intel(R) Wireless N 7260", 15762306a36Sopenharmony_ci .fw_name_pre = IWL7260_FW_PRE, 15862306a36Sopenharmony_ci IWL_DEVICE_7000, 15962306a36Sopenharmony_ci .ht_params = &iwl7000_ht_params, 16062306a36Sopenharmony_ci .nvm_ver = IWL7260_NVM_VERSION, 16162306a36Sopenharmony_ci .host_interrupt_operation_mode = true, 16262306a36Sopenharmony_ci .lp_xtal_workaround = true, 16362306a36Sopenharmony_ci .dccm_len = IWL7260_DCCM_LEN, 16462306a36Sopenharmony_ci}; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ciconst struct iwl_cfg iwl3160_2ac_cfg = { 16762306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless AC 3160", 16862306a36Sopenharmony_ci .fw_name_pre = IWL3160_FW_PRE, 16962306a36Sopenharmony_ci IWL_DEVICE_7000, 17062306a36Sopenharmony_ci .ht_params = &iwl7000_ht_params, 17162306a36Sopenharmony_ci .nvm_ver = IWL3160_NVM_VERSION, 17262306a36Sopenharmony_ci .host_interrupt_operation_mode = true, 17362306a36Sopenharmony_ci .dccm_len = IWL3160_DCCM_LEN, 17462306a36Sopenharmony_ci}; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ciconst struct iwl_cfg iwl3160_2n_cfg = { 17762306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless N 3160", 17862306a36Sopenharmony_ci .fw_name_pre = IWL3160_FW_PRE, 17962306a36Sopenharmony_ci IWL_DEVICE_7000, 18062306a36Sopenharmony_ci .ht_params = &iwl7000_ht_params, 18162306a36Sopenharmony_ci .nvm_ver = IWL3160_NVM_VERSION, 18262306a36Sopenharmony_ci .host_interrupt_operation_mode = true, 18362306a36Sopenharmony_ci .dccm_len = IWL3160_DCCM_LEN, 18462306a36Sopenharmony_ci}; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ciconst struct iwl_cfg iwl3160_n_cfg = { 18762306a36Sopenharmony_ci .name = "Intel(R) Wireless N 3160", 18862306a36Sopenharmony_ci .fw_name_pre = IWL3160_FW_PRE, 18962306a36Sopenharmony_ci IWL_DEVICE_7000, 19062306a36Sopenharmony_ci .ht_params = &iwl7000_ht_params, 19162306a36Sopenharmony_ci .nvm_ver = IWL3160_NVM_VERSION, 19262306a36Sopenharmony_ci .host_interrupt_operation_mode = true, 19362306a36Sopenharmony_ci .dccm_len = IWL3160_DCCM_LEN, 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistatic const struct iwl_pwr_tx_backoff iwl7265_pwr_tx_backoffs[] = { 19762306a36Sopenharmony_ci {.pwr = 1600, .backoff = 0}, 19862306a36Sopenharmony_ci {.pwr = 1300, .backoff = 467}, 19962306a36Sopenharmony_ci {.pwr = 900, .backoff = 1900}, 20062306a36Sopenharmony_ci {.pwr = 800, .backoff = 2630}, 20162306a36Sopenharmony_ci {.pwr = 700, .backoff = 3720}, 20262306a36Sopenharmony_ci {.pwr = 600, .backoff = 5550}, 20362306a36Sopenharmony_ci {.pwr = 500, .backoff = 9350}, 20462306a36Sopenharmony_ci {0}, 20562306a36Sopenharmony_ci}; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_cistatic const struct iwl_ht_params iwl7265_ht_params = { 20862306a36Sopenharmony_ci .stbc = true, 20962306a36Sopenharmony_ci .ldpc = true, 21062306a36Sopenharmony_ci .ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ), 21162306a36Sopenharmony_ci}; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ciconst struct iwl_cfg iwl3165_2ac_cfg = { 21462306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless AC 3165", 21562306a36Sopenharmony_ci .fw_name_pre = IWL7265D_FW_PRE, 21662306a36Sopenharmony_ci IWL_DEVICE_7005D, 21762306a36Sopenharmony_ci .ht_params = &iwl7000_ht_params, 21862306a36Sopenharmony_ci .nvm_ver = IWL3165_NVM_VERSION, 21962306a36Sopenharmony_ci .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 22062306a36Sopenharmony_ci .dccm_len = IWL7265_DCCM_LEN, 22162306a36Sopenharmony_ci}; 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ciconst struct iwl_cfg iwl3168_2ac_cfg = { 22462306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless AC 3168", 22562306a36Sopenharmony_ci .fw_name_pre = IWL3168_FW_PRE, 22662306a36Sopenharmony_ci IWL_DEVICE_3008, 22762306a36Sopenharmony_ci .ht_params = &iwl7000_ht_params, 22862306a36Sopenharmony_ci .nvm_ver = IWL3168_NVM_VERSION, 22962306a36Sopenharmony_ci .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 23062306a36Sopenharmony_ci .dccm_len = IWL7265_DCCM_LEN, 23162306a36Sopenharmony_ci .nvm_type = IWL_NVM_SDP, 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ciconst struct iwl_cfg iwl7265_2ac_cfg = { 23562306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless AC 7265", 23662306a36Sopenharmony_ci .fw_name_pre = IWL7265_FW_PRE, 23762306a36Sopenharmony_ci IWL_DEVICE_7005, 23862306a36Sopenharmony_ci .ht_params = &iwl7265_ht_params, 23962306a36Sopenharmony_ci .nvm_ver = IWL7265_NVM_VERSION, 24062306a36Sopenharmony_ci .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 24162306a36Sopenharmony_ci .dccm_len = IWL7265_DCCM_LEN, 24262306a36Sopenharmony_ci}; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ciconst struct iwl_cfg iwl7265_2n_cfg = { 24562306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless N 7265", 24662306a36Sopenharmony_ci .fw_name_pre = IWL7265_FW_PRE, 24762306a36Sopenharmony_ci IWL_DEVICE_7005, 24862306a36Sopenharmony_ci .ht_params = &iwl7265_ht_params, 24962306a36Sopenharmony_ci .nvm_ver = IWL7265_NVM_VERSION, 25062306a36Sopenharmony_ci .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 25162306a36Sopenharmony_ci .dccm_len = IWL7265_DCCM_LEN, 25262306a36Sopenharmony_ci}; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ciconst struct iwl_cfg iwl7265_n_cfg = { 25562306a36Sopenharmony_ci .name = "Intel(R) Wireless N 7265", 25662306a36Sopenharmony_ci .fw_name_pre = IWL7265_FW_PRE, 25762306a36Sopenharmony_ci IWL_DEVICE_7005, 25862306a36Sopenharmony_ci .ht_params = &iwl7265_ht_params, 25962306a36Sopenharmony_ci .nvm_ver = IWL7265_NVM_VERSION, 26062306a36Sopenharmony_ci .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 26162306a36Sopenharmony_ci .dccm_len = IWL7265_DCCM_LEN, 26262306a36Sopenharmony_ci}; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ciconst struct iwl_cfg iwl7265d_2ac_cfg = { 26562306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless AC 7265", 26662306a36Sopenharmony_ci .fw_name_pre = IWL7265D_FW_PRE, 26762306a36Sopenharmony_ci IWL_DEVICE_7005D, 26862306a36Sopenharmony_ci .ht_params = &iwl7265_ht_params, 26962306a36Sopenharmony_ci .nvm_ver = IWL7265D_NVM_VERSION, 27062306a36Sopenharmony_ci .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 27162306a36Sopenharmony_ci .dccm_len = IWL7265_DCCM_LEN, 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ciconst struct iwl_cfg iwl7265d_2n_cfg = { 27562306a36Sopenharmony_ci .name = "Intel(R) Dual Band Wireless N 7265", 27662306a36Sopenharmony_ci .fw_name_pre = IWL7265D_FW_PRE, 27762306a36Sopenharmony_ci IWL_DEVICE_7005D, 27862306a36Sopenharmony_ci .ht_params = &iwl7265_ht_params, 27962306a36Sopenharmony_ci .nvm_ver = IWL7265D_NVM_VERSION, 28062306a36Sopenharmony_ci .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 28162306a36Sopenharmony_ci .dccm_len = IWL7265_DCCM_LEN, 28262306a36Sopenharmony_ci}; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ciconst struct iwl_cfg iwl7265d_n_cfg = { 28562306a36Sopenharmony_ci .name = "Intel(R) Wireless N 7265", 28662306a36Sopenharmony_ci .fw_name_pre = IWL7265D_FW_PRE, 28762306a36Sopenharmony_ci IWL_DEVICE_7005D, 28862306a36Sopenharmony_ci .ht_params = &iwl7265_ht_params, 28962306a36Sopenharmony_ci .nvm_ver = IWL7265D_NVM_VERSION, 29062306a36Sopenharmony_ci .pwr_tx_backoffs = iwl7265_pwr_tx_backoffs, 29162306a36Sopenharmony_ci .dccm_len = IWL7265_DCCM_LEN, 29262306a36Sopenharmony_ci}; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ciMODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_MAX)); 29562306a36Sopenharmony_ciMODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_MAX)); 29662306a36Sopenharmony_ciMODULE_FIRMWARE(IWL3168_MODULE_FIRMWARE(IWL3168_UCODE_API_MAX)); 29762306a36Sopenharmony_ciMODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7265_UCODE_API_MAX)); 29862306a36Sopenharmony_ciMODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7265D_UCODE_API_MAX)); 299