1 /******************************************************************************
3 * This file is provided under a dual BSD/GPLv2 license. When using or
4 * redistributing this file, you may do so under either license.
8 * Copyright(c) 2015-2017 Intel Deutschland GmbH
9 * Copyright (C) 2018-2019 Intel Corporation
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of version 2 of the GNU General Public License as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
22 * Copyright(c) 2015-2017 Intel Deutschland GmbH
23 * Copyright (C) 2018-2019 Intel Corporation
24 * All rights reserved.
26 * Redistribution and use in source and binary forms, with or without
27 * modification, are permitted provided that the following conditions
30 * * Redistributions of source code must retain the above copyright
31 * notice, this list of conditions and the following disclaimer.
32 * * Redistributions in binary form must reproduce the above copyright
33 * notice, this list of conditions and the following disclaimer in
34 * the documentation and/or other materials provided with the
36 * * Neither the name Intel Corporation nor the names of its
37 * contributors may be used to endorse or promote products derived
38 * from this software without specific prior written permission.
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52 *****************************************************************************/
54 #include <linux/module.h>
55 #include <linux/stringify.h>
56 #include "iwl-config.h"
59 /* Highest firmware API version supported */
60 #define IWL_22000_UCODE_API_MAX 52
62 /* Lowest firmware API version supported */
63 #define IWL_22000_UCODE_API_MIN 39
66 #define IWL_22000_NVM_VERSION 0x0a1d
68 /* Memory offsets and lengths */
69 #define IWL_22000_DCCM_OFFSET 0x800000 /* LMAC1 */
70 #define IWL_22000_DCCM_LEN 0x10000 /* LMAC1 */
71 #define IWL_22000_DCCM2_OFFSET 0x880000
72 #define IWL_22000_DCCM2_LEN 0x8000
73 #define IWL_22000_SMEM_OFFSET 0x400000
74 #define IWL_22000_SMEM_LEN 0xD0000
76 #define IWL_22000_JF_FW_PRE "iwlwifi-Qu-a0-jf-b0-"
77 #define IWL_22000_HR_FW_PRE "iwlwifi-Qu-a0-hr-a0-"
78 #define IWL_22000_HR_CDB_FW_PRE "iwlwifi-QuIcp-z0-hrcdb-a0-"
79 #define IWL_22000_HR_A_F0_FW_PRE "iwlwifi-QuQnj-f0-hr-a0-"
80 #define IWL_22000_QU_B_HR_B_FW_PRE "iwlwifi-Qu-b0-hr-b0-"
81 #define IWL_22000_HR_B_FW_PRE "iwlwifi-QuQnj-b0-hr-b0-"
82 #define IWL_22000_HR_A0_FW_PRE "iwlwifi-QuQnj-a0-hr-a0-"
83 #define IWL_QU_C_HR_B_FW_PRE "iwlwifi-Qu-c0-hr-b0-"
84 #define IWL_QU_B_JF_B_FW_PRE "iwlwifi-Qu-b0-jf-b0-"
85 #define IWL_QU_C_JF_B_FW_PRE "iwlwifi-Qu-c0-jf-b0-"
86 #define IWL_QUZ_A_HR_B_FW_PRE "iwlwifi-QuZ-a0-hr-b0-"
87 #define IWL_QUZ_A_JF_B_FW_PRE "iwlwifi-QuZ-a0-jf-b0-"
88 #define IWL_QNJ_B_JF_B_FW_PRE "iwlwifi-QuQnj-b0-jf-b0-"
89 #define IWL_CC_A_FW_PRE "iwlwifi-cc-a0-"
90 #define IWL_22000_SO_A_JF_B_FW_PRE "iwlwifi-so-a0-jf-b0-"
91 #define IWL_22000_SO_A_HR_B_FW_PRE "iwlwifi-so-a0-hr-b0-"
92 #define IWL_22000_SO_A_GF_A_FW_PRE "iwlwifi-so-a0-gf-a0-"
93 #define IWL_22000_TY_A_GF_A_FW_PRE "iwlwifi-ty-a0-gf-a0-"
94 #define IWL_22000_SO_A_GF4_A_FW_PRE "iwlwifi-so-a0-gf4-a0-"
95 #define IWL_22000_SOSNJ_A_GF4_A_FW_PRE "iwlwifi-SoSnj-a0-gf4-a0-"
97 #define IWL_22000_HR_MODULE_FIRMWARE(api) \
98 IWL_22000_HR_FW_PRE __stringify(api) ".ucode"
99 #define IWL_22000_JF_MODULE_FIRMWARE(api) \
100 IWL_22000_JF_FW_PRE __stringify(api) ".ucode"
101 #define IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(api) \
102 IWL_22000_HR_A_F0_FW_PRE __stringify(api) ".ucode"
103 #define IWL_22000_QU_B_HR_B_MODULE_FIRMWARE(api) \
104 IWL_22000_QU_B_HR_B_FW_PRE __stringify(api) ".ucode"
105 #define IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(api) \
106 IWL_22000_HR_B_FW_PRE __stringify(api) ".ucode"
107 #define IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(api) \
108 IWL_22000_HR_A0_FW_PRE __stringify(api) ".ucode"
109 #define IWL_QUZ_A_HR_B_MODULE_FIRMWARE(api) \
110 IWL_QUZ_A_HR_B_FW_PRE __stringify(api) ".ucode"
111 #define IWL_QUZ_A_JF_B_MODULE_FIRMWARE(api) \
112 IWL_QUZ_A_JF_B_FW_PRE __stringify(api) ".ucode"
113 #define IWL_QU_C_HR_B_MODULE_FIRMWARE(api) \
114 IWL_QU_C_HR_B_FW_PRE __stringify(api) ".ucode"
115 #define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \
116 IWL_QU_B_JF_B_FW_PRE __stringify(api) ".ucode"
117 #define IWL_QNJ_B_JF_B_MODULE_FIRMWARE(api) \
118 IWL_QNJ_B_JF_B_FW_PRE __stringify(api) ".ucode"
119 #define IWL_CC_A_MODULE_FIRMWARE(api) \
120 IWL_CC_A_FW_PRE __stringify(api) ".ucode"
121 #define IWL_22000_SO_A_JF_B_MODULE_FIRMWARE(api) \
122 IWL_22000_SO_A_JF_B_FW_PRE __stringify(api) ".ucode"
123 #define IWL_22000_SO_A_HR_B_MODULE_FIRMWARE(api) \
124 IWL_22000_SO_A_HR_B_FW_PRE __stringify(api) ".ucode"
125 #define IWL_22000_SO_A_GF_A_MODULE_FIRMWARE(api) \
126 IWL_22000_SO_A_GF_A_FW_PRE __stringify(api) ".ucode"
127 #define IWL_22000_TY_A_GF_A_MODULE_FIRMWARE(api) \
128 IWL_22000_TY_A_GF_A_FW_PRE __stringify(api) ".ucode"
130 static const struct iwl_base_params iwl_22000_base_params
= {
131 .eeprom_size
= OTP_LOW_IMAGE_SIZE_32K
,
132 .num_of_queues
= 512,
133 .max_tfd_queue_size
= 256,
134 .shadow_ram_support
= true,
135 .led_compensation
= 57,
136 .wd_timeout
= IWL_LONG_WD_TIMEOUT
,
137 .max_event_log_size
= 512,
138 .shadow_reg_enable
= true,
139 .pcie_l1_allowed
= true,
142 static const struct iwl_base_params iwl_ax210_base_params
= {
143 .eeprom_size
= OTP_LOW_IMAGE_SIZE_32K
,
144 .num_of_queues
= 512,
145 .max_tfd_queue_size
= 65536,
146 .shadow_ram_support
= true,
147 .led_compensation
= 57,
148 .wd_timeout
= IWL_LONG_WD_TIMEOUT
,
149 .max_event_log_size
= 512,
150 .shadow_reg_enable
= true,
151 .pcie_l1_allowed
= true,
154 static const struct iwl_ht_params iwl_22000_ht_params
= {
157 .ht40_bands
= BIT(NL80211_BAND_2GHZ
) | BIT(NL80211_BAND_5GHZ
),
160 #define IWL_DEVICE_22000_COMMON \
161 .ucode_api_max = IWL_22000_UCODE_API_MAX, \
162 .ucode_api_min = IWL_22000_UCODE_API_MIN, \
163 .led_mode = IWL_LED_RF_STATE, \
164 .nvm_hw_section_num = 10, \
165 .non_shared_ant = ANT_B, \
166 .dccm_offset = IWL_22000_DCCM_OFFSET, \
167 .dccm_len = IWL_22000_DCCM_LEN, \
168 .dccm2_offset = IWL_22000_DCCM2_OFFSET, \
169 .dccm2_len = IWL_22000_DCCM2_LEN, \
170 .smem_offset = IWL_22000_SMEM_OFFSET, \
171 .smem_len = IWL_22000_SMEM_LEN, \
172 .features = IWL_TX_CSUM_NETIF_FLAGS | NETIF_F_RXCSUM, \
173 .apmg_not_supported = true, \
174 .trans.mq_rx_supported = true, \
175 .vht_mu_mimo_supported = true, \
176 .mac_addr_from_csr = true, \
177 .ht_params = &iwl_22000_ht_params, \
178 .nvm_ver = IWL_22000_NVM_VERSION, \
179 .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
180 .trans.use_tfh = true, \
181 .trans.rf_id = true, \
182 .trans.gen2 = true, \
183 .nvm_type = IWL_NVM_EXT, \
184 .dbgc_supported = true, \
185 .min_umac_error_event_table = 0x400000, \
186 .d3_debug_data_base_addr = 0x401000, \
187 .d3_debug_data_length = 60 * 1024, \
190 .addr = LDBG_M2S_BUF_WPTR, \
191 .mask = LDBG_M2S_BUF_WPTR_VAL_MSK, \
194 .addr = LDBG_M2S_BUF_WRAP_CNT, \
195 .mask = LDBG_M2S_BUF_WRAP_CNT_VAL_MSK, \
199 #define IWL_DEVICE_22500 \
200 IWL_DEVICE_22000_COMMON, \
201 .trans.device_family = IWL_DEVICE_FAMILY_22000, \
202 .trans.base_params = &iwl_22000_base_params, \
203 .gp2_reg_addr = 0xa02c68, \
206 .addr = MON_BUFF_WRPTR_VER2, \
207 .mask = 0xffffffff, \
210 .addr = MON_BUFF_CYCLE_CNT_VER2, \
211 .mask = 0xffffffff, \
215 #define IWL_DEVICE_AX210 \
216 IWL_DEVICE_22000_COMMON, \
217 .trans.umac_prph_offset = 0x300000, \
218 .trans.device_family = IWL_DEVICE_FAMILY_AX210, \
219 .trans.base_params = &iwl_ax210_base_params, \
220 .min_txq_size = 128, \
221 .gp2_reg_addr = 0xd02c68, \
222 .min_256_ba_txq_size = 512, \
225 .addr = DBGC_CUR_DBGBUF_STATUS, \
226 .mask = DBGC_CUR_DBGBUF_STATUS_OFFSET_MSK, \
229 .addr = DBGC_DBGBUF_WRAP_AROUND, \
230 .mask = 0xffffffff, \
233 .addr = DBGC_CUR_DBGBUF_STATUS, \
234 .mask = DBGC_CUR_DBGBUF_STATUS_IDX_MSK, \
239 * If the device doesn't support HE, no need to have that many buffers.
240 * 22000 devices can split multiple frames into a single RB, so fewer are
241 * needed; AX210 cannot (but use smaller RBs by default) - these sizes
242 * were picked according to 8 MSDUs inside 256 A-MSDUs in an A-MPDU, with
243 * additional overhead to account for processing time.
245 #define IWL_NUM_RBDS_NON_HE 512
246 #define IWL_NUM_RBDS_22000_HE 2048
247 #define IWL_NUM_RBDS_AX210_HE 4096
249 const struct iwl_cfg iwl_ax101_cfg_qu_hr
= {
250 .name
= "Intel(R) Wi-Fi 6 AX101",
251 .fw_name_pre
= IWL_22000_QU_B_HR_B_FW_PRE
,
254 * This device doesn't support receiving BlockAck with a large bitmap
255 * so we need to restrict the size of transmitted aggregation to the
256 * HT size; mac80211 would otherwise pick the HE max (256) by default.
258 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
259 .tx_with_siso_diversity
= true,
260 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
263 const struct iwl_cfg iwl_ax201_cfg_qu_hr
= {
264 .name
= "Intel(R) Wi-Fi 6 AX201 160MHz",
265 .fw_name_pre
= IWL_22000_QU_B_HR_B_FW_PRE
,
268 * This device doesn't support receiving BlockAck with a large bitmap
269 * so we need to restrict the size of transmitted aggregation to the
270 * HT size; mac80211 would otherwise pick the HE max (256) by default.
272 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
273 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
276 const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0
= {
277 .name
= "Intel(R) Wi-Fi 6 AX101",
278 .fw_name_pre
= IWL_QU_C_HR_B_FW_PRE
,
281 * This device doesn't support receiving BlockAck with a large bitmap
282 * so we need to restrict the size of transmitted aggregation to the
283 * HT size; mac80211 would otherwise pick the HE max (256) by default.
285 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
286 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
289 const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0
= {
290 .name
= "Intel(R) Wi-Fi 6 AX201 160MHz",
291 .fw_name_pre
= IWL_QU_C_HR_B_FW_PRE
,
294 * This device doesn't support receiving BlockAck with a large bitmap
295 * so we need to restrict the size of transmitted aggregation to the
296 * HT size; mac80211 would otherwise pick the HE max (256) by default.
298 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
299 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
302 const struct iwl_cfg iwl_ax101_cfg_quz_hr
= {
303 .name
= "Intel(R) Wi-Fi 6 AX101",
304 .fw_name_pre
= IWL_QUZ_A_HR_B_FW_PRE
,
307 * This device doesn't support receiving BlockAck with a large bitmap
308 * so we need to restrict the size of transmitted aggregation to the
309 * HT size; mac80211 would otherwise pick the HE max (256) by default.
311 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
312 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
315 const struct iwl_cfg iwl_ax201_cfg_quz_hr
= {
316 .name
= "Intel(R) Wi-Fi 6 AX201 160MHz",
317 .fw_name_pre
= IWL_QUZ_A_HR_B_FW_PRE
,
320 * This device doesn't support receiving BlockAck with a large bitmap
321 * so we need to restrict the size of transmitted aggregation to the
322 * HT size; mac80211 would otherwise pick the HE max (256) by default.
324 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
325 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
328 const struct iwl_cfg iwl_ax1650s_cfg_quz_hr
= {
329 .name
= "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)",
330 .fw_name_pre
= IWL_QUZ_A_HR_B_FW_PRE
,
333 * This device doesn't support receiving BlockAck with a large bitmap
334 * so we need to restrict the size of transmitted aggregation to the
335 * HT size; mac80211 would otherwise pick the HE max (256) by default.
337 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
338 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
341 const struct iwl_cfg iwl_ax1650i_cfg_quz_hr
= {
342 .name
= "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",
343 .fw_name_pre
= IWL_QUZ_A_HR_B_FW_PRE
,
346 * This device doesn't support receiving BlockAck with a large bitmap
347 * so we need to restrict the size of transmitted aggregation to the
348 * HT size; mac80211 would otherwise pick the HE max (256) by default.
350 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
351 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
354 const struct iwl_cfg iwl_ax200_cfg_cc
= {
355 .name
= "Intel(R) Wi-Fi 6 AX200 160MHz",
356 .fw_name_pre
= IWL_CC_A_FW_PRE
,
359 * This device doesn't support receiving BlockAck with a large bitmap
360 * so we need to restrict the size of transmitted aggregation to the
361 * HT size; mac80211 would otherwise pick the HE max (256) by default.
363 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
364 .trans
.bisr_workaround
= 1,
365 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
368 const struct iwl_cfg killer1650x_2ax_cfg
= {
369 .name
= "Killer(R) Wi-Fi 6 AX1650x 160MHz Wireless Network Adapter (200NGW)",
370 .fw_name_pre
= IWL_CC_A_FW_PRE
,
373 * This device doesn't support receiving BlockAck with a large bitmap
374 * so we need to restrict the size of transmitted aggregation to the
375 * HT size; mac80211 would otherwise pick the HE max (256) by default.
377 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
378 .trans
.bisr_workaround
= 1,
379 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
382 const struct iwl_cfg killer1650w_2ax_cfg
= {
383 .name
= "Killer(R) Wi-Fi 6 AX1650w 160MHz Wireless Network Adapter (200D2W)",
384 .fw_name_pre
= IWL_CC_A_FW_PRE
,
387 * This device doesn't support receiving BlockAck with a large bitmap
388 * so we need to restrict the size of transmitted aggregation to the
389 * HT size; mac80211 would otherwise pick the HE max (256) by default.
391 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
392 .trans
.bisr_workaround
= 1,
393 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
397 * All JF radio modules are part of the 9000 series, but the MAC part
398 * looks more like 22000. That's why this device is here, but called
401 const struct iwl_cfg iwl9461_2ac_cfg_qu_b0_jf_b0
= {
402 .name
= "Intel(R) Wireless-AC 9461",
403 .fw_name_pre
= IWL_QU_B_JF_B_FW_PRE
,
405 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
408 const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0
= {
409 .name
= "Intel(R) Wireless-AC 9462",
410 .fw_name_pre
= IWL_QU_B_JF_B_FW_PRE
,
412 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
415 const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0
= {
416 .name
= "Intel(R) Wireless-AC 9560",
417 .fw_name_pre
= IWL_QU_B_JF_B_FW_PRE
,
419 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
422 const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0
= {
423 .name
= "Intel(R) Wireless-AC 9560 160MHz",
424 .fw_name_pre
= IWL_QU_B_JF_B_FW_PRE
,
426 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
429 const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0
= {
430 .name
= "Intel(R) Wireless-AC 9461",
431 .fw_name_pre
= IWL_QU_C_JF_B_FW_PRE
,
433 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
436 const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0
= {
437 .name
= "Intel(R) Wireless-AC 9462",
438 .fw_name_pre
= IWL_QU_C_JF_B_FW_PRE
,
440 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
443 const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0
= {
444 .name
= "Intel(R) Wireless-AC 9560",
445 .fw_name_pre
= IWL_QU_C_JF_B_FW_PRE
,
447 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
450 const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0
= {
451 .name
= "Intel(R) Wireless-AC 9560 160MHz",
452 .fw_name_pre
= IWL_QU_C_JF_B_FW_PRE
,
454 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
457 const struct iwl_cfg iwl9560_2ac_cfg_qnj_jf_b0
= {
458 .name
= "Intel(R) Wireless-AC 9560 160MHz",
459 .fw_name_pre
= IWL_QNJ_B_JF_B_FW_PRE
,
462 * This device doesn't support receiving BlockAck with a large bitmap
463 * so we need to restrict the size of transmitted aggregation to the
464 * HT size; mac80211 would otherwise pick the HE max (256) by default.
466 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
467 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
470 const struct iwl_cfg iwl9560_2ac_cfg_quz_a0_jf_b0_soc
= {
471 .name
= "Intel(R) Wireless-AC 9560 160MHz",
472 .fw_name_pre
= IWL_QUZ_A_JF_B_FW_PRE
,
475 * This device doesn't support receiving BlockAck with a large bitmap
476 * so we need to restrict the size of transmitted aggregation to the
477 * HT size; mac80211 would otherwise pick the HE max (256) by default.
479 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
482 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
485 const struct iwl_cfg iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc
= {
486 .name
= "Intel(R) Wireless-AC 9560 160MHz",
487 .fw_name_pre
= IWL_QUZ_A_JF_B_FW_PRE
,
490 * This device doesn't support receiving BlockAck with a large bitmap
491 * so we need to restrict the size of transmitted aggregation to the
492 * HT size; mac80211 would otherwise pick the HE max (256) by default.
494 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
497 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
500 const struct iwl_cfg iwl9461_2ac_cfg_quz_a0_jf_b0_soc
= {
501 .name
= "Intel(R) Dual Band Wireless AC 9461",
502 .fw_name_pre
= IWL_QUZ_A_JF_B_FW_PRE
,
505 * This device doesn't support receiving BlockAck with a large bitmap
506 * so we need to restrict the size of transmitted aggregation to the
507 * HT size; mac80211 would otherwise pick the HE max (256) by default.
509 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
512 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
515 const struct iwl_cfg iwl9462_2ac_cfg_quz_a0_jf_b0_soc
= {
516 .name
= "Intel(R) Dual Band Wireless AC 9462",
517 .fw_name_pre
= IWL_QUZ_A_JF_B_FW_PRE
,
520 * This device doesn't support receiving BlockAck with a large bitmap
521 * so we need to restrict the size of transmitted aggregation to the
522 * HT size; mac80211 would otherwise pick the HE max (256) by default.
524 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
527 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
530 const struct iwl_cfg iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc
= {
531 .name
= "Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)",
532 .fw_name_pre
= IWL_QUZ_A_JF_B_FW_PRE
,
535 * This device doesn't support receiving BlockAck with a large bitmap
536 * so we need to restrict the size of transmitted aggregation to the
537 * HT size; mac80211 would otherwise pick the HE max (256) by default.
539 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
542 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
545 const struct iwl_cfg iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc
= {
546 .name
= "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)",
547 .fw_name_pre
= IWL_QUZ_A_JF_B_FW_PRE
,
550 * This device doesn't support receiving BlockAck with a large bitmap
551 * so we need to restrict the size of transmitted aggregation to the
552 * HT size; mac80211 would otherwise pick the HE max (256) by default.
554 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
557 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
560 const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0
= {
561 .name
= "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)",
562 .fw_name_pre
= IWL_QU_B_JF_B_FW_PRE
,
564 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
567 const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0
= {
568 .name
= "Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)",
569 .fw_name_pre
= IWL_QU_B_JF_B_FW_PRE
,
571 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
574 const struct iwl_cfg killer1650s_2ax_cfg_qu_b0_hr_b0
= {
575 .name
= "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",
576 .fw_name_pre
= IWL_22000_QU_B_HR_B_FW_PRE
,
579 * This device doesn't support receiving BlockAck with a large bitmap
580 * so we need to restrict the size of transmitted aggregation to the
581 * HT size; mac80211 would otherwise pick the HE max (256) by default.
583 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
584 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
587 const struct iwl_cfg killer1650i_2ax_cfg_qu_b0_hr_b0
= {
588 .name
= "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)",
589 .fw_name_pre
= IWL_22000_QU_B_HR_B_FW_PRE
,
592 * This device doesn't support receiving BlockAck with a large bitmap
593 * so we need to restrict the size of transmitted aggregation to the
594 * HT size; mac80211 would otherwise pick the HE max (256) by default.
596 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
597 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
600 const struct iwl_cfg killer1650s_2ax_cfg_qu_c0_hr_b0
= {
601 .name
= "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",
602 .fw_name_pre
= IWL_QU_C_HR_B_FW_PRE
,
605 * This device doesn't support receiving BlockAck with a large bitmap
606 * so we need to restrict the size of transmitted aggregation to the
607 * HT size; mac80211 would otherwise pick the HE max (256) by default.
609 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
610 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
613 const struct iwl_cfg killer1650i_2ax_cfg_qu_c0_hr_b0
= {
614 .name
= "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)",
615 .fw_name_pre
= IWL_QU_C_HR_B_FW_PRE
,
618 * This device doesn't support receiving BlockAck with a large bitmap
619 * so we need to restrict the size of transmitted aggregation to the
620 * HT size; mac80211 would otherwise pick the HE max (256) by default.
622 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
623 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
626 const struct iwl_cfg iwl22000_2ax_cfg_jf
= {
627 .name
= "Intel(R) Dual Band Wireless AX 22000",
628 .fw_name_pre
= IWL_QU_B_JF_B_FW_PRE
,
631 * This device doesn't support receiving BlockAck with a large bitmap
632 * so we need to restrict the size of transmitted aggregation to the
633 * HT size; mac80211 would otherwise pick the HE max (256) by default.
635 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
636 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
639 const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0_f0
= {
640 .name
= "Intel(R) Dual Band Wireless AX 22000",
641 .fw_name_pre
= IWL_22000_HR_A_F0_FW_PRE
,
644 * This device doesn't support receiving BlockAck with a large bitmap
645 * so we need to restrict the size of transmitted aggregation to the
646 * HT size; mac80211 would otherwise pick the HE max (256) by default.
648 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
649 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
652 const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0
= {
653 .name
= "Intel(R) Dual Band Wireless AX 22000",
654 .fw_name_pre
= IWL_22000_HR_B_FW_PRE
,
657 * This device doesn't support receiving BlockAck with a large bitmap
658 * so we need to restrict the size of transmitted aggregation to the
659 * HT size; mac80211 would otherwise pick the HE max (256) by default.
661 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
662 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
665 const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0
= {
666 .name
= "Intel(R) Dual Band Wireless AX 22000",
667 .fw_name_pre
= IWL_22000_HR_A0_FW_PRE
,
670 * This device doesn't support receiving BlockAck with a large bitmap
671 * so we need to restrict the size of transmitted aggregation to the
672 * HT size; mac80211 would otherwise pick the HE max (256) by default.
674 .max_tx_agg_size
= IEEE80211_MAX_AMPDU_BUF_HT
,
675 .num_rbds
= IWL_NUM_RBDS_22000_HE
,
678 const struct iwl_cfg iwlax210_2ax_cfg_so_jf_a0
= {
679 .name
= "Intel(R) Wireless-AC 9560 160MHz",
680 .fw_name_pre
= IWL_22000_SO_A_JF_B_FW_PRE
,
682 .num_rbds
= IWL_NUM_RBDS_NON_HE
,
685 const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0
= {
686 .name
= "Intel(R) Wi-Fi 7 AX210 160MHz",
687 .fw_name_pre
= IWL_22000_SO_A_HR_B_FW_PRE
,
689 .num_rbds
= IWL_NUM_RBDS_AX210_HE
,
692 const struct iwl_cfg iwlax211_2ax_cfg_so_gf_a0
= {
693 .name
= "Intel(R) Wi-Fi 7 AX211 160MHz",
694 .fw_name_pre
= IWL_22000_SO_A_GF_A_FW_PRE
,
695 .uhb_supported
= true,
697 .num_rbds
= IWL_NUM_RBDS_AX210_HE
,
700 const struct iwl_cfg iwlax210_2ax_cfg_ty_gf_a0
= {
701 .name
= "Intel(R) Wi-Fi 7 AX210 160MHz",
702 .fw_name_pre
= IWL_22000_TY_A_GF_A_FW_PRE
,
703 .uhb_supported
= true,
705 .num_rbds
= IWL_NUM_RBDS_AX210_HE
,
708 const struct iwl_cfg iwlax411_2ax_cfg_so_gf4_a0
= {
709 .name
= "Intel(R) Wi-Fi 7 AX411 160MHz",
710 .fw_name_pre
= IWL_22000_SO_A_GF4_A_FW_PRE
,
711 .uhb_supported
= true,
713 .num_rbds
= IWL_NUM_RBDS_AX210_HE
,
716 const struct iwl_cfg iwlax411_2ax_cfg_sosnj_gf4_a0
= {
717 .name
= "Intel(R) Wi-Fi 7 AX411 160MHz",
718 .fw_name_pre
= IWL_22000_SOSNJ_A_GF4_A_FW_PRE
,
719 .uhb_supported
= true,
721 .num_rbds
= IWL_NUM_RBDS_AX210_HE
,
724 MODULE_FIRMWARE(IWL_22000_HR_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
725 MODULE_FIRMWARE(IWL_22000_JF_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
726 MODULE_FIRMWARE(IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
727 MODULE_FIRMWARE(IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
728 MODULE_FIRMWARE(IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
729 MODULE_FIRMWARE(IWL_QU_C_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
730 MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
731 MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
732 MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
733 MODULE_FIRMWARE(IWL_QNJ_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
734 MODULE_FIRMWARE(IWL_CC_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
735 MODULE_FIRMWARE(IWL_22000_SO_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
736 MODULE_FIRMWARE(IWL_22000_SO_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
737 MODULE_FIRMWARE(IWL_22000_SO_A_GF_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));
738 MODULE_FIRMWARE(IWL_22000_TY_A_GF_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX
));