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