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