brintos

brintos / linux-shallow public Read only

0
0
Text · 14.7 KiB · 2e2fcb3 Raw
429 lines · c
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause2/*3 * Copyright (C) 2015-2017 Intel Deutschland GmbH4 * Copyright (C) 2018-2024 Intel Corporation5 */6#include <linux/module.h>7#include <linux/stringify.h>8#include "iwl-config.h"9#include "iwl-prph.h"10#include "fw/api/txq.h"11 12/* Highest firmware API version supported */13#define IWL_22000_UCODE_API_MAX	7714 15/* Lowest firmware API version supported */16#define IWL_22000_UCODE_API_MIN	7717 18/* NVM versions */19#define IWL_22000_NVM_VERSION		0x0a1d20 21/* Memory offsets and lengths */22#define IWL_22000_DCCM_OFFSET		0x800000 /* LMAC1 */23#define IWL_22000_DCCM_LEN		0x10000 /* LMAC1 */24#define IWL_22000_DCCM2_OFFSET		0x88000025#define IWL_22000_DCCM2_LEN		0x800026#define IWL_22000_SMEM_OFFSET		0x40000027#define IWL_22000_SMEM_LEN		0xD000028 29#define IWL_QU_B_HR_B_FW_PRE		"iwlwifi-Qu-b0-hr-b0"30#define IWL_QU_C_HR_B_FW_PRE		"iwlwifi-Qu-c0-hr-b0"31#define IWL_QU_B_JF_B_FW_PRE		"iwlwifi-Qu-b0-jf-b0"32#define IWL_QU_C_JF_B_FW_PRE		"iwlwifi-Qu-c0-jf-b0"33#define IWL_QUZ_A_HR_B_FW_PRE		"iwlwifi-QuZ-a0-hr-b0"34#define IWL_QUZ_A_JF_B_FW_PRE		"iwlwifi-QuZ-a0-jf-b0"35#define IWL_CC_A_FW_PRE			"iwlwifi-cc-a0"36 37#define IWL_QU_B_HR_B_MODULE_FIRMWARE(api) \38	IWL_QU_B_HR_B_FW_PRE "-" __stringify(api) ".ucode"39#define IWL_QUZ_A_HR_B_MODULE_FIRMWARE(api) \40	IWL_QUZ_A_HR_B_FW_PRE "-" __stringify(api) ".ucode"41#define IWL_QUZ_A_JF_B_MODULE_FIRMWARE(api) \42	IWL_QUZ_A_JF_B_FW_PRE "-" __stringify(api) ".ucode"43#define IWL_QU_C_HR_B_MODULE_FIRMWARE(api) \44	IWL_QU_C_HR_B_FW_PRE "-" __stringify(api) ".ucode"45#define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \46	IWL_QU_B_JF_B_FW_PRE "-" __stringify(api) ".ucode"47#define IWL_CC_A_MODULE_FIRMWARE(api)			\48	IWL_CC_A_FW_PRE "-" __stringify(api) ".ucode"49 50static const struct iwl_base_params iwl_22000_base_params = {51	.eeprom_size = OTP_LOW_IMAGE_SIZE_32K,52	.num_of_queues = 512,53	.max_tfd_queue_size = 256,54	.shadow_ram_support = true,55	.led_compensation = 57,56	.wd_timeout = IWL_LONG_WD_TIMEOUT,57	.max_event_log_size = 512,58	.shadow_reg_enable = true,59	.pcie_l1_allowed = true,60};61 62const struct iwl_ht_params iwl_22000_ht_params = {63	.stbc = true,64	.ldpc = true,65	.ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ) |66		      BIT(NL80211_BAND_6GHZ),67};68 69#define IWL_DEVICE_22000_COMMON						\70	.ucode_api_min = IWL_22000_UCODE_API_MIN,			\71	.led_mode = IWL_LED_RF_STATE,					\72	.nvm_hw_section_num = 10,					\73	.non_shared_ant = ANT_B,					\74	.dccm_offset = IWL_22000_DCCM_OFFSET,				\75	.dccm_len = IWL_22000_DCCM_LEN,					\76	.dccm2_offset = IWL_22000_DCCM2_OFFSET,				\77	.dccm2_len = IWL_22000_DCCM2_LEN,				\78	.smem_offset = IWL_22000_SMEM_OFFSET,				\79	.smem_len = IWL_22000_SMEM_LEN,					\80	.features = IWL_TX_CSUM_NETIF_FLAGS | NETIF_F_RXCSUM,		\81	.apmg_not_supported = true,					\82	.trans.mq_rx_supported = true,					\83	.vht_mu_mimo_supported = true,					\84	.mac_addr_from_csr = 0x380,					\85	.ht_params = &iwl_22000_ht_params,				\86	.nvm_ver = IWL_22000_NVM_VERSION,				\87	.trans.rf_id = true,						\88	.trans.gen2 = true,						\89	.nvm_type = IWL_NVM_EXT,					\90	.dbgc_supported = true,						\91	.min_umac_error_event_table = 0x400000,				\92	.d3_debug_data_base_addr = 0x401000,				\93	.d3_debug_data_length = 60 * 1024,				\94	.mon_smem_regs = {						\95		.write_ptr = {						\96			.addr = LDBG_M2S_BUF_WPTR,			\97			.mask = LDBG_M2S_BUF_WPTR_VAL_MSK,		\98	},								\99		.cycle_cnt = {						\100			.addr = LDBG_M2S_BUF_WRAP_CNT,			\101			.mask = LDBG_M2S_BUF_WRAP_CNT_VAL_MSK,		\102		},							\103	}104 105#define IWL_DEVICE_22500						\106	IWL_DEVICE_22000_COMMON,					\107	.ucode_api_max = IWL_22000_UCODE_API_MAX,			\108	.trans.device_family = IWL_DEVICE_FAMILY_22000,			\109	.trans.base_params = &iwl_22000_base_params,			\110	.gp2_reg_addr = 0xa02c68,					\111	.mon_dram_regs = {						\112		.write_ptr = {						\113			.addr = MON_BUFF_WRPTR_VER2,			\114			.mask = 0xffffffff,				\115		},							\116		.cycle_cnt = {						\117			.addr = MON_BUFF_CYCLE_CNT_VER2,		\118			.mask = 0xffffffff,				\119		},							\120	}121 122const struct iwl_cfg_trans_params iwl_qu_trans_cfg = {123	.mq_rx_supported = true,124	.rf_id = true,125	.gen2 = true,126	.device_family = IWL_DEVICE_FAMILY_22000,127	.base_params = &iwl_22000_base_params,128	.integrated = true,129	.xtal_latency = 500,130	.ltr_delay = IWL_CFG_TRANS_LTR_DELAY_200US,131};132 133const struct iwl_cfg_trans_params iwl_qu_medium_latency_trans_cfg = {134	.mq_rx_supported = true,135	.rf_id = true,136	.gen2 = true,137	.device_family = IWL_DEVICE_FAMILY_22000,138	.base_params = &iwl_22000_base_params,139	.integrated = true,140	.xtal_latency = 1820,141	.ltr_delay = IWL_CFG_TRANS_LTR_DELAY_1820US,142};143 144const struct iwl_cfg_trans_params iwl_qu_long_latency_trans_cfg = {145	.mq_rx_supported = true,146	.rf_id = true,147	.gen2 = true,148	.device_family = IWL_DEVICE_FAMILY_22000,149	.base_params = &iwl_22000_base_params,150	.integrated = true,151	.xtal_latency = 12000,152	.low_latency_xtal = true,153	.ltr_delay = IWL_CFG_TRANS_LTR_DELAY_2500US,154};155 156/*157 * If the device doesn't support HE, no need to have that many buffers.158 * 22000 devices can split multiple frames into a single RB, so fewer are159 * needed; AX210 cannot (but use smaller RBs by default) - these sizes160 * were picked according to 8 MSDUs inside 256 A-MSDUs in an A-MPDU, with161 * additional overhead to account for processing time.162 */163#define IWL_NUM_RBDS_NON_HE		512164#define IWL_NUM_RBDS_22000_HE		2048165 166/*167 * All JF radio modules are part of the 9000 series, but the MAC part168 * looks more like 22000.  That's why this device is here, but called169 * 9560 nevertheless.170 */171const struct iwl_cfg iwl9560_qu_b0_jf_b0_cfg = {172	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,173	IWL_DEVICE_22500,174	.num_rbds = IWL_NUM_RBDS_NON_HE,175};176 177const struct iwl_cfg iwl9560_qu_c0_jf_b0_cfg = {178	.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,179	IWL_DEVICE_22500,180	.num_rbds = IWL_NUM_RBDS_NON_HE,181};182 183const struct iwl_cfg iwl9560_quz_a0_jf_b0_cfg = {184	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,185	IWL_DEVICE_22500,186	/*187	 * This device doesn't support receiving BlockAck with a large bitmap188	 * so we need to restrict the size of transmitted aggregation to the189	 * HT size; mac80211 would otherwise pick the HE max (256) by default.190	 */191	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,192	.num_rbds = IWL_NUM_RBDS_NON_HE,193};194 195const struct iwl_cfg_trans_params iwl_ax200_trans_cfg = {196	.device_family = IWL_DEVICE_FAMILY_22000,197	.base_params = &iwl_22000_base_params,198	.mq_rx_supported = true,199	.rf_id = true,200	.gen2 = true,201	.bisr_workaround = 1,202};203 204const char iwl_ax101_name[] = "Intel(R) Wi-Fi 6 AX101";205const char iwl_ax200_name[] = "Intel(R) Wi-Fi 6 AX200 160MHz";206const char iwl_ax201_name[] = "Intel(R) Wi-Fi 6 AX201 160MHz";207const char iwl_ax203_name[] = "Intel(R) Wi-Fi 6 AX203";208const char iwl_ax204_name[] = "Intel(R) Wi-Fi 6 AX204 160MHz";209 210const char iwl_ax200_killer_1650w_name[] =211	"Killer(R) Wi-Fi 6 AX1650w 160MHz Wireless Network Adapter (200D2W)";212const char iwl_ax200_killer_1650x_name[] =213	"Killer(R) Wi-Fi 6 AX1650x 160MHz Wireless Network Adapter (200NGW)";214const char iwl_ax201_killer_1650s_name[] =215	"Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)";216const char iwl_ax201_killer_1650i_name[] =217	"Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)";218 219const struct iwl_cfg iwl_qu_b0_hr1_b0 = {220	.fw_name_pre = IWL_QU_B_HR_B_FW_PRE,221	IWL_DEVICE_22500,222	/*223	 * This device doesn't support receiving BlockAck with a large bitmap224	 * so we need to restrict the size of transmitted aggregation to the225	 * HT size; mac80211 would otherwise pick the HE max (256) by default.226	 */227	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,228	.tx_with_siso_diversity = true,229	.num_rbds = IWL_NUM_RBDS_22000_HE,230};231 232const struct iwl_cfg iwl_qu_b0_hr_b0 = {233	.fw_name_pre = IWL_QU_B_HR_B_FW_PRE,234	IWL_DEVICE_22500,235	/*236	 * This device doesn't support receiving BlockAck with a large bitmap237	 * so we need to restrict the size of transmitted aggregation to the238	 * HT size; mac80211 would otherwise pick the HE max (256) by default.239	 */240	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,241	.num_rbds = IWL_NUM_RBDS_22000_HE,242};243 244const struct iwl_cfg iwl_ax201_cfg_qu_hr = {245	.name = "Intel(R) Wi-Fi 6 AX201 160MHz",246	.fw_name_pre = IWL_QU_B_HR_B_FW_PRE,247	IWL_DEVICE_22500,248	/*249	 * This device doesn't support receiving BlockAck with a large bitmap250	 * so we need to restrict the size of transmitted aggregation to the251	 * HT size; mac80211 would otherwise pick the HE max (256) by default.252	 */253	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,254	.num_rbds = IWL_NUM_RBDS_22000_HE,255};256 257const struct iwl_cfg iwl_qu_c0_hr1_b0 = {258	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,259	IWL_DEVICE_22500,260	/*261	 * This device doesn't support receiving BlockAck with a large bitmap262	 * so we need to restrict the size of transmitted aggregation to the263	 * HT size; mac80211 would otherwise pick the HE max (256) by default.264	 */265	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,266	.tx_with_siso_diversity = true,267	.num_rbds = IWL_NUM_RBDS_22000_HE,268};269 270const struct iwl_cfg iwl_qu_c0_hr_b0 = {271	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,272	IWL_DEVICE_22500,273	/*274	 * This device doesn't support receiving BlockAck with a large bitmap275	 * so we need to restrict the size of transmitted aggregation to the276	 * HT size; mac80211 would otherwise pick the HE max (256) by default.277	 */278	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,279	.num_rbds = IWL_NUM_RBDS_22000_HE,280};281 282const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0 = {283	.name = "Intel(R) Wi-Fi 6 AX201 160MHz",284	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,285	IWL_DEVICE_22500,286	/*287	 * This device doesn't support receiving BlockAck with a large bitmap288	 * so we need to restrict the size of transmitted aggregation to the289	 * HT size; mac80211 would otherwise pick the HE max (256) by default.290	 */291	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,292	.num_rbds = IWL_NUM_RBDS_22000_HE,293};294 295const struct iwl_cfg iwl_quz_a0_hr1_b0 = {296	.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,297	IWL_DEVICE_22500,298	/*299	 * This device doesn't support receiving BlockAck with a large bitmap300	 * so we need to restrict the size of transmitted aggregation to the301	 * HT size; mac80211 would otherwise pick the HE max (256) by default.302	 */303	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,304	.tx_with_siso_diversity = true,305	.num_rbds = IWL_NUM_RBDS_22000_HE,306};307 308const struct iwl_cfg iwl_ax201_cfg_quz_hr = {309	.name = "Intel(R) Wi-Fi 6 AX201 160MHz",310	.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,311	IWL_DEVICE_22500,312	/*313         * This device doesn't support receiving BlockAck with a large bitmap314         * so we need to restrict the size of transmitted aggregation to the315         * HT size; mac80211 would otherwise pick the HE max (256) by default.316         */317	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,318	.num_rbds = IWL_NUM_RBDS_22000_HE,319};320 321const struct iwl_cfg iwl_ax1650s_cfg_quz_hr = {322	.name = "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)",323	.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,324	IWL_DEVICE_22500,325	/*326         * This device doesn't support receiving BlockAck with a large bitmap327         * so we need to restrict the size of transmitted aggregation to the328         * HT size; mac80211 would otherwise pick the HE max (256) by default.329         */330	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,331	.num_rbds = IWL_NUM_RBDS_22000_HE,332};333 334const struct iwl_cfg iwl_ax1650i_cfg_quz_hr = {335	.name = "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",336	.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,337	IWL_DEVICE_22500,338	/*339         * This device doesn't support receiving BlockAck with a large bitmap340         * so we need to restrict the size of transmitted aggregation to the341         * HT size; mac80211 would otherwise pick the HE max (256) by default.342         */343	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,344	.num_rbds = IWL_NUM_RBDS_22000_HE,345};346 347const struct iwl_cfg iwl_ax200_cfg_cc = {348	.fw_name_pre = IWL_CC_A_FW_PRE,349	IWL_DEVICE_22500,350	/*351	 * This device doesn't support receiving BlockAck with a large bitmap352	 * so we need to restrict the size of transmitted aggregation to the353	 * HT size; mac80211 would otherwise pick the HE max (256) by default.354	 */355	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,356	.num_rbds = IWL_NUM_RBDS_22000_HE,357};358 359const struct iwl_cfg killer1650s_2ax_cfg_qu_b0_hr_b0 = {360	.name = "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201NGW)",361	.fw_name_pre = IWL_QU_B_HR_B_FW_PRE,362	IWL_DEVICE_22500,363	/*364	 * This device doesn't support receiving BlockAck with a large bitmap365	 * so we need to restrict the size of transmitted aggregation to the366	 * HT size; mac80211 would otherwise pick the HE max (256) by default.367	 */368	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,369	.num_rbds = IWL_NUM_RBDS_22000_HE,370};371 372const struct iwl_cfg killer1650i_2ax_cfg_qu_b0_hr_b0 = {373	.name = "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201D2W)",374	.fw_name_pre = IWL_QU_B_HR_B_FW_PRE,375	IWL_DEVICE_22500,376	/*377	 * This device doesn't support receiving BlockAck with a large bitmap378	 * so we need to restrict the size of transmitted aggregation to the379	 * HT size; mac80211 would otherwise pick the HE max (256) by default.380	 */381	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,382	.num_rbds = IWL_NUM_RBDS_22000_HE,383};384 385const struct iwl_cfg killer1650s_2ax_cfg_qu_c0_hr_b0 = {386	.name = "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201NGW)",387	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,388	IWL_DEVICE_22500,389	/*390	 * This device doesn't support receiving BlockAck with a large bitmap391	 * so we need to restrict the size of transmitted aggregation to the392	 * HT size; mac80211 would otherwise pick the HE max (256) by default.393	 */394	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,395	.num_rbds = IWL_NUM_RBDS_22000_HE,396};397 398const struct iwl_cfg killer1650i_2ax_cfg_qu_c0_hr_b0 = {399	.name = "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201D2W)",400	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,401	IWL_DEVICE_22500,402	/*403	 * This device doesn't support receiving BlockAck with a large bitmap404	 * so we need to restrict the size of transmitted aggregation to the405	 * HT size; mac80211 would otherwise pick the HE max (256) by default.406	 */407	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,408	.num_rbds = IWL_NUM_RBDS_22000_HE,409};410 411const struct iwl_cfg iwl_cfg_quz_a0_hr_b0 = {412	.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,413	IWL_DEVICE_22500,414	/*415	 * This device doesn't support receiving BlockAck with a large bitmap416	 * so we need to restrict the size of transmitted aggregation to the417	 * HT size; mac80211 would otherwise pick the HE max (256) by default.418	 */419	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,420	.num_rbds = IWL_NUM_RBDS_22000_HE,421};422 423MODULE_FIRMWARE(IWL_QU_B_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));424MODULE_FIRMWARE(IWL_QU_C_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));425MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));426MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));427MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));428MODULE_FIRMWARE(IWL_CC_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));429