Linux Audio

Check our new training course

Loading...
v6.8
  1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2/*
  3 * Copyright (C) 2015-2017 Intel Deutschland GmbH
  4 * Copyright (C) 2018-2023 Intel Corporation
  5 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  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	77
 14
 15/* Lowest firmware API version supported */
 16#define IWL_22000_UCODE_API_MIN	50
 17
 18/* NVM versions */
 19#define IWL_22000_NVM_VERSION		0x0a1d
 20
 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		0x880000
 25#define IWL_22000_DCCM2_LEN		0x8000
 26#define IWL_22000_SMEM_OFFSET		0x400000
 27#define IWL_22000_SMEM_LEN		0xD0000
 28
 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 are
159 * needed; AX210 cannot (but use smaller RBs by default) - these sizes
160 * were picked according to 8 MSDUs inside 256 A-MSDUs in an A-MPDU, with
161 * additional overhead to account for processing time.
162 */
163#define IWL_NUM_RBDS_NON_HE		512
164#define IWL_NUM_RBDS_22000_HE		2048
165
166/*
167 * All JF radio modules are part of the 9000 series, but the MAC part
168 * looks more like 22000.  That's why this device is here, but called
169 * 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 bitmap
188	 * so we need to restrict the size of transmitted aggregation to the
189	 * 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 bitmap
224	 * so we need to restrict the size of transmitted aggregation to the
225	 * 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 bitmap
237	 * so we need to restrict the size of transmitted aggregation to the
238	 * 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 bitmap
250	 * so we need to restrict the size of transmitted aggregation to the
251	 * 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 bitmap
262	 * so we need to restrict the size of transmitted aggregation to the
263	 * 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 bitmap
275	 * so we need to restrict the size of transmitted aggregation to the
276	 * 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 bitmap
288	 * so we need to restrict the size of transmitted aggregation to the
289	 * 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 bitmap
300	 * so we need to restrict the size of transmitted aggregation to the
301	 * 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 bitmap
314         * so we need to restrict the size of transmitted aggregation to the
315         * 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 bitmap
327         * so we need to restrict the size of transmitted aggregation to the
328         * 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 bitmap
340         * so we need to restrict the size of transmitted aggregation to the
341         * 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 bitmap
352	 * so we need to restrict the size of transmitted aggregation to the
353	 * 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 bitmap
365	 * so we need to restrict the size of transmitted aggregation to the
366	 * 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 bitmap
378	 * so we need to restrict the size of transmitted aggregation to the
379	 * 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 bitmap
391	 * so we need to restrict the size of transmitted aggregation to the
392	 * 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 bitmap
404	 * so we need to restrict the size of transmitted aggregation to the
405	 * 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 bitmap
416	 * so we need to restrict the size of transmitted aggregation to the
417	 * 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));
v5.4
  1/******************************************************************************
  2 *
  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.
  5 *
  6 * GPL LICENSE SUMMARY
  7 *
  8 * Copyright(c) 2015-2017 Intel Deutschland GmbH
  9 * Copyright (C) 2018-2019 Intel Corporation
 10 *
 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.
 14 *
 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.
 19 *
 20 * BSD LICENSE
 21 *
 22 * Copyright(c) 2015-2017 Intel Deutschland GmbH
 23 * Copyright (C) 2018-2019 Intel Corporation
 24 * All rights reserved.
 25 *
 26 * Redistribution and use in source and binary forms, with or without
 27 * modification, are permitted provided that the following conditions
 28 * are met:
 29 *
 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
 35 *    distribution.
 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.
 39 *
 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.
 51 *
 52 *****************************************************************************/
 53
 54#include <linux/module.h>
 55#include <linux/stringify.h>
 56#include "iwl-config.h"
 
 
 57
 58/* Highest firmware API version supported */
 59#define IWL_22000_UCODE_API_MAX	50
 60
 61/* Lowest firmware API version supported */
 62#define IWL_22000_UCODE_API_MIN	39
 63
 64/* NVM versions */
 65#define IWL_22000_NVM_VERSION		0x0a1d
 66
 67/* Memory offsets and lengths */
 68#define IWL_22000_DCCM_OFFSET		0x800000 /* LMAC1 */
 69#define IWL_22000_DCCM_LEN		0x10000 /* LMAC1 */
 70#define IWL_22000_DCCM2_OFFSET		0x880000
 71#define IWL_22000_DCCM2_LEN		0x8000
 72#define IWL_22000_SMEM_OFFSET		0x400000
 73#define IWL_22000_SMEM_LEN		0xD0000
 74
 75#define IWL_22000_JF_FW_PRE		"iwlwifi-Qu-a0-jf-b0-"
 76#define IWL_22000_HR_FW_PRE		"iwlwifi-Qu-a0-hr-a0-"
 77#define IWL_22000_HR_CDB_FW_PRE		"iwlwifi-QuIcp-z0-hrcdb-a0-"
 78#define IWL_22000_HR_A_F0_FW_PRE	"iwlwifi-QuQnj-f0-hr-a0-"
 79#define IWL_22000_QU_B_HR_B_FW_PRE	"iwlwifi-Qu-b0-hr-b0-"
 80#define IWL_22000_HR_B_FW_PRE		"iwlwifi-QuQnj-b0-hr-b0-"
 81#define IWL_22000_HR_A0_FW_PRE		"iwlwifi-QuQnj-a0-hr-a0-"
 82#define IWL_QU_C_HR_B_FW_PRE		"iwlwifi-Qu-c0-hr-b0-"
 83#define IWL_QU_B_JF_B_FW_PRE		"iwlwifi-Qu-b0-jf-b0-"
 84#define IWL_QU_C_JF_B_FW_PRE		"iwlwifi-Qu-c0-jf-b0-"
 85#define IWL_QUZ_A_HR_B_FW_PRE		"iwlwifi-QuZ-a0-hr-b0-"
 86#define IWL_QUZ_A_JF_B_FW_PRE		"iwlwifi-QuZ-a0-jf-b0-"
 87#define IWL_QNJ_B_JF_B_FW_PRE		"iwlwifi-QuQnj-b0-jf-b0-"
 88#define IWL_CC_A_FW_PRE			"iwlwifi-cc-a0-"
 89#define IWL_22000_SO_A_JF_B_FW_PRE	"iwlwifi-so-a0-jf-b0-"
 90#define IWL_22000_SO_A_HR_B_FW_PRE      "iwlwifi-so-a0-hr-b0-"
 91#define IWL_22000_SO_A_GF_A_FW_PRE      "iwlwifi-so-a0-gf-a0-"
 92#define IWL_22000_TY_A_GF_A_FW_PRE      "iwlwifi-ty-a0-gf-a0-"
 93#define IWL_22000_SO_A_GF4_A_FW_PRE     "iwlwifi-so-a0-gf4-a0-"
 94
 95#define IWL_22000_HR_MODULE_FIRMWARE(api) \
 96	IWL_22000_HR_FW_PRE __stringify(api) ".ucode"
 97#define IWL_22000_JF_MODULE_FIRMWARE(api) \
 98	IWL_22000_JF_FW_PRE __stringify(api) ".ucode"
 99#define IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(api) \
100	IWL_22000_HR_A_F0_FW_PRE __stringify(api) ".ucode"
101#define IWL_22000_QU_B_HR_B_MODULE_FIRMWARE(api) \
102	IWL_22000_QU_B_HR_B_FW_PRE __stringify(api) ".ucode"
103#define IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(api)	\
104	IWL_22000_HR_B_FW_PRE __stringify(api) ".ucode"
105#define IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(api) \
106	IWL_22000_HR_A0_FW_PRE __stringify(api) ".ucode"
107#define IWL_QUZ_A_HR_B_MODULE_FIRMWARE(api) \
108	IWL_QUZ_A_HR_B_FW_PRE __stringify(api) ".ucode"
109#define IWL_QUZ_A_JF_B_MODULE_FIRMWARE(api) \
110	IWL_QUZ_A_JF_B_FW_PRE __stringify(api) ".ucode"
111#define IWL_QU_C_HR_B_MODULE_FIRMWARE(api) \
112	IWL_QU_C_HR_B_FW_PRE __stringify(api) ".ucode"
113#define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \
114	IWL_QU_B_JF_B_FW_PRE __stringify(api) ".ucode"
115#define IWL_QNJ_B_JF_B_MODULE_FIRMWARE(api)		\
116	IWL_QNJ_B_JF_B_FW_PRE __stringify(api) ".ucode"
117#define IWL_CC_A_MODULE_FIRMWARE(api)			\
118	IWL_CC_A_FW_PRE __stringify(api) ".ucode"
119#define IWL_22000_SO_A_JF_B_MODULE_FIRMWARE(api) \
120	IWL_22000_SO_A_JF_B_FW_PRE __stringify(api) ".ucode"
121#define IWL_22000_SO_A_HR_B_MODULE_FIRMWARE(api) \
122	IWL_22000_SO_A_HR_B_FW_PRE __stringify(api) ".ucode"
123#define IWL_22000_SO_A_GF_A_MODULE_FIRMWARE(api) \
124	IWL_22000_SO_A_GF_A_FW_PRE __stringify(api) ".ucode"
125#define IWL_22000_TY_A_GF_A_MODULE_FIRMWARE(api) \
126	IWL_22000_TY_A_GF_A_FW_PRE __stringify(api) ".ucode"
127
128static const struct iwl_base_params iwl_22000_base_params = {
129	.eeprom_size = OTP_LOW_IMAGE_SIZE_32K,
130	.num_of_queues = 512,
131	.max_tfd_queue_size = 256,
132	.shadow_ram_support = true,
133	.led_compensation = 57,
134	.wd_timeout = IWL_LONG_WD_TIMEOUT,
135	.max_event_log_size = 512,
136	.shadow_reg_enable = true,
137	.pcie_l1_allowed = true,
138};
139
140static const struct iwl_base_params iwl_22560_base_params = {
141	.eeprom_size = OTP_LOW_IMAGE_SIZE_32K,
142	.num_of_queues = 512,
143	.max_tfd_queue_size = 65536,
144	.shadow_ram_support = true,
145	.led_compensation = 57,
146	.wd_timeout = IWL_LONG_WD_TIMEOUT,
147	.max_event_log_size = 512,
148	.shadow_reg_enable = true,
149	.pcie_l1_allowed = true,
150};
151
152static const struct iwl_ht_params iwl_22000_ht_params = {
153	.stbc = true,
154	.ldpc = true,
155	.ht40_bands = BIT(NL80211_BAND_2GHZ) | BIT(NL80211_BAND_5GHZ),
 
156};
157
158#define IWL_DEVICE_22000_COMMON						\
159	.ucode_api_max = IWL_22000_UCODE_API_MAX,			\
160	.ucode_api_min = IWL_22000_UCODE_API_MIN,			\
161	.led_mode = IWL_LED_RF_STATE,					\
162	.nvm_hw_section_num = 10,					\
163	.non_shared_ant = ANT_B,					\
164	.dccm_offset = IWL_22000_DCCM_OFFSET,				\
165	.dccm_len = IWL_22000_DCCM_LEN,					\
166	.dccm2_offset = IWL_22000_DCCM2_OFFSET,				\
167	.dccm2_len = IWL_22000_DCCM2_LEN,				\
168	.smem_offset = IWL_22000_SMEM_OFFSET,				\
169	.smem_len = IWL_22000_SMEM_LEN,					\
170	.features = IWL_TX_CSUM_NETIF_FLAGS | NETIF_F_RXCSUM,		\
171	.apmg_not_supported = true,					\
172	.trans.mq_rx_supported = true,					\
173	.vht_mu_mimo_supported = true,					\
174	.mac_addr_from_csr = true,					\
175	.ht_params = &iwl_22000_ht_params,				\
176	.nvm_ver = IWL_22000_NVM_VERSION,				\
177	.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,		\
178	.trans.use_tfh = true,						\
179	.trans.rf_id = true,						\
180	.trans.gen2 = true,						\
181	.nvm_type = IWL_NVM_EXT,					\
182	.dbgc_supported = true,						\
183	.min_umac_error_event_table = 0x400000,				\
184	.d3_debug_data_base_addr = 0x401000,				\
185	.d3_debug_data_length = 60 * 1024,				\
186	.fw_mon_smem_write_ptr_addr = 0xa0c16c,				\
187	.fw_mon_smem_write_ptr_msk = 0xfffff,				\
188	.fw_mon_smem_cycle_cnt_ptr_addr = 0xa0c174,			\
189	.fw_mon_smem_cycle_cnt_ptr_msk = 0xfffff
 
 
 
 
 
 
190
191#define IWL_DEVICE_22500						\
192	IWL_DEVICE_22000_COMMON,					\
 
193	.trans.device_family = IWL_DEVICE_FAMILY_22000,			\
194	.trans.base_params = &iwl_22000_base_params,			\
195	.trans.csr = &iwl_csr_v1,					\
196	.gp2_reg_addr = 0xa02c68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
198#define IWL_DEVICE_22560						\
199	IWL_DEVICE_22000_COMMON,					\
200	.trans.device_family = IWL_DEVICE_FAMILY_22560,			\
201	.trans.base_params = &iwl_22560_base_params,			\
202	.trans.csr = &iwl_csr_v2
203
204#define IWL_DEVICE_AX210						\
205	IWL_DEVICE_22000_COMMON,					\
206	.trans.umac_prph_offset = 0x300000,				\
207	.trans.device_family = IWL_DEVICE_FAMILY_AX210,			\
208	.trans.base_params = &iwl_22560_base_params,			\
209	.trans.csr = &iwl_csr_v1,					\
210	.min_txq_size = 128,						\
211	.gp2_reg_addr = 0xd02c68,					\
212	.min_256_ba_txq_size = 512
213
214const struct iwl_cfg iwl22000_2ac_cfg_hr = {
215	.name = "Intel(R) Dual Band Wireless AC 22000",
216	.fw_name_pre = IWL_22000_HR_FW_PRE,
217	IWL_DEVICE_22500,
218};
219
220const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb = {
221	.name = "Intel(R) Dual Band Wireless AC 22000",
222	.fw_name_pre = IWL_22000_HR_CDB_FW_PRE,
223	IWL_DEVICE_22500,
224	.cdb = true,
 
 
 
 
 
225};
226
227const struct iwl_cfg iwl22000_2ac_cfg_jf = {
228	.name = "Intel(R) Dual Band Wireless AC 22000",
229	.fw_name_pre = IWL_22000_JF_FW_PRE,
230	IWL_DEVICE_22500,
231};
 
 
 
 
232
233const struct iwl_cfg iwl_ax101_cfg_qu_hr = {
234	.name = "Intel(R) Wi-Fi 6 AX101",
235	.fw_name_pre = IWL_22000_QU_B_HR_B_FW_PRE,
 
 
 
 
236	IWL_DEVICE_22500,
237	/*
238	 * This device doesn't support receiving BlockAck with a large bitmap
239	 * so we need to restrict the size of transmitted aggregation to the
240	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
241	 */
242	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
243	.tx_with_siso_diversity = true,
244};
245
246const struct iwl_cfg iwl_ax201_cfg_qu_hr = {
247	.name = "Intel(R) Wi-Fi 6 AX201 160MHz",
248	.fw_name_pre = IWL_22000_QU_B_HR_B_FW_PRE,
249	IWL_DEVICE_22500,
250	/*
251	 * This device doesn't support receiving BlockAck with a large bitmap
252	 * so we need to restrict the size of transmitted aggregation to the
253	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
254	 */
255	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
256};
257
258const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0 = {
259	.name = "Intel(R) Wi-Fi 6 AX101",
260	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,
261	IWL_DEVICE_22500,
262	/*
263	 * This device doesn't support receiving BlockAck with a large bitmap
264	 * so we need to restrict the size of transmitted aggregation to the
265	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
266	 */
267	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
 
268};
269
270const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0 = {
271	.name = "Intel(R) Wi-Fi 6 AX201 160MHz",
272	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,
273	IWL_DEVICE_22500,
274	/*
275	 * This device doesn't support receiving BlockAck with a large bitmap
276	 * so we need to restrict the size of transmitted aggregation to the
277	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
278	 */
279	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
280};
 
 
 
 
 
 
 
 
 
 
 
 
281
282const struct iwl_cfg iwl_ax101_cfg_quz_hr = {
283	.name = "Intel(R) Wi-Fi 6 AX101",
284	.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,
285	IWL_DEVICE_22500,
286	/*
287	 * This device doesn't support receiving BlockAck with a large bitmap
288	 * so we need to restrict the size of transmitted aggregation to the
289	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
290	 */
291	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
 
 
292};
293
294const struct iwl_cfg iwl_ax201_cfg_quz_hr = {
295		.name = "Intel(R) Wi-Fi 6 AX201 160MHz",
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 bitmap
300         * so we need to restrict the size of transmitted aggregation to the
301         * HT size; mac80211 would otherwise pick the HE max (256) by default.
302         */
303		.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
304};
305
306const struct iwl_cfg iwl_ax1650s_cfg_quz_hr = {
307		.name = "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)",
308		.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,
309		IWL_DEVICE_22500,
310		/*
311         * This device doesn't support receiving BlockAck with a large bitmap
312         * so we need to restrict the size of transmitted aggregation to the
313         * HT size; mac80211 would otherwise pick the HE max (256) by default.
314         */
315		.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
316};
317
318const struct iwl_cfg iwl_ax1650i_cfg_quz_hr = {
319		.name = "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",
320		.fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE,
321		IWL_DEVICE_22500,
322		/*
323         * This device doesn't support receiving BlockAck with a large bitmap
324         * so we need to restrict the size of transmitted aggregation to the
325         * HT size; mac80211 would otherwise pick the HE max (256) by default.
326         */
327		.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
328};
329
330const struct iwl_cfg iwl_ax200_cfg_cc = {
331	.name = "Intel(R) Wi-Fi 6 AX200 160MHz",
332	.fw_name_pre = IWL_CC_A_FW_PRE,
333	IWL_DEVICE_22500,
334	/*
335	 * This device doesn't support receiving BlockAck with a large bitmap
336	 * so we need to restrict the size of transmitted aggregation to the
337	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
338	 */
339	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
340	.trans.bisr_workaround = 1,
341};
342
343const struct iwl_cfg killer1650x_2ax_cfg = {
344	.name = "Killer(R) Wi-Fi 6 AX1650x 160MHz Wireless Network Adapter (200NGW)",
345	.fw_name_pre = IWL_CC_A_FW_PRE,
346	IWL_DEVICE_22500,
347	/*
348	 * This device doesn't support receiving BlockAck with a large bitmap
349	 * so we need to restrict the size of transmitted aggregation to the
350	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
351	 */
352	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
353	.trans.bisr_workaround = 1,
354};
355
356const struct iwl_cfg killer1650w_2ax_cfg = {
357	.name = "Killer(R) Wi-Fi 6 AX1650w 160MHz Wireless Network Adapter (200D2W)",
358	.fw_name_pre = IWL_CC_A_FW_PRE,
359	IWL_DEVICE_22500,
360	/*
361	 * This device doesn't support receiving BlockAck with a large bitmap
362	 * so we need to restrict the size of transmitted aggregation to the
363	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
364	 */
365	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
366	.trans.bisr_workaround = 1,
 
367};
368
369/*
370 * All JF radio modules are part of the 9000 series, but the MAC part
371 * looks more like 22000.  That's why this device is here, but called
372 * 9560 nevertheless.
373 */
374const struct iwl_cfg iwl9461_2ac_cfg_qu_b0_jf_b0 = {
375	.name = "Intel(R) Wireless-AC 9461",
376	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
377	IWL_DEVICE_22500,
378};
379
380const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0 = {
381	.name = "Intel(R) Wireless-AC 9462",
382	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
383	IWL_DEVICE_22500,
384};
385
386const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0 = {
387	.name = "Intel(R) Wireless-AC 9560",
388	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
389	IWL_DEVICE_22500,
390};
391
392const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0 = {
393	.name = "Intel(R) Wireless-AC 9560 160MHz",
394	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
395	IWL_DEVICE_22500,
396};
397
398const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0 = {
399	.name = "Intel(R) Wireless-AC 9461",
400	.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
401	IWL_DEVICE_22500,
402};
403
404const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0 = {
405	.name = "Intel(R) Wireless-AC 9462",
406	.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
407	IWL_DEVICE_22500,
408};
409
410const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0 = {
411	.name = "Intel(R) Wireless-AC 9560",
412	.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
413	IWL_DEVICE_22500,
414};
415
416const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0 = {
417	.name = "Intel(R) Wireless-AC 9560 160MHz",
418	.fw_name_pre = IWL_QU_C_JF_B_FW_PRE,
419	IWL_DEVICE_22500,
420};
421
422const struct iwl_cfg iwl9560_2ac_cfg_qnj_jf_b0 = {
423	.name = "Intel(R) Wireless-AC 9560 160MHz",
424	.fw_name_pre = IWL_QNJ_B_JF_B_FW_PRE,
425	IWL_DEVICE_22500,
426	/*
427	 * This device doesn't support receiving BlockAck with a large bitmap
428	 * so we need to restrict the size of transmitted aggregation to the
429	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
430	 */
431	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
 
432};
433
434const struct iwl_cfg iwl9560_2ac_cfg_quz_a0_jf_b0_soc = {
435	.name = "Intel(R) Wireless-AC 9560 160MHz",
436	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
437	IWL_DEVICE_22500,
438	/*
439	 * This device doesn't support receiving BlockAck with a large bitmap
440	 * so we need to restrict the size of transmitted aggregation to the
441	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
442	 */
443	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
444	.integrated = true,
445	.soc_latency = 5000,
446};
447
448const struct iwl_cfg iwl9560_2ac_160_cfg_quz_a0_jf_b0_soc = {
449	.name = "Intel(R) Wireless-AC 9560 160MHz",
450	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
451	IWL_DEVICE_22500,
452	/*
453	 * This device doesn't support receiving BlockAck with a large bitmap
454	 * so we need to restrict the size of transmitted aggregation to the
455	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
456	 */
457	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
458	.integrated = true,
459	.soc_latency = 5000,
460};
461
462const struct iwl_cfg iwl9461_2ac_cfg_quz_a0_jf_b0_soc = {
463	.name = "Intel(R) Dual Band Wireless AC 9461",
464	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
465	IWL_DEVICE_22500,
466	/*
467	 * This device doesn't support receiving BlockAck with a large bitmap
468	 * so we need to restrict the size of transmitted aggregation to the
469	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
470	 */
471	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
472	.integrated = true,
473	.soc_latency = 5000,
474};
475
476const struct iwl_cfg iwl9462_2ac_cfg_quz_a0_jf_b0_soc = {
477	.name = "Intel(R) Dual Band Wireless AC 9462",
478	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
479	IWL_DEVICE_22500,
480	/*
481	 * This device doesn't support receiving BlockAck with a large bitmap
482	 * so we need to restrict the size of transmitted aggregation to the
483	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
484	 */
485	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
486	.integrated = true,
487	.soc_latency = 5000,
488};
489
490const struct iwl_cfg iwl9560_killer_s_2ac_cfg_quz_a0_jf_b0_soc = {
491	.name = "Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)",
492	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
493	IWL_DEVICE_22500,
494	/*
495	 * This device doesn't support receiving BlockAck with a large bitmap
496	 * so we need to restrict the size of transmitted aggregation to the
497	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
498	 */
499	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
500	.integrated = true,
501	.soc_latency = 5000,
502};
503
504const struct iwl_cfg iwl9560_killer_i_2ac_cfg_quz_a0_jf_b0_soc = {
505	.name = "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)",
506	.fw_name_pre = IWL_QUZ_A_JF_B_FW_PRE,
507	IWL_DEVICE_22500,
508	/*
509	 * This device doesn't support receiving BlockAck with a large bitmap
510	 * so we need to restrict the size of transmitted aggregation to the
511	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
512	 */
513	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
514	.integrated = true,
515	.soc_latency = 5000,
516};
517
518const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0 = {
519	.name = "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)",
520	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
521	IWL_DEVICE_22500,
522};
523
524const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0 = {
525	.name = "Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)",
526	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
527	IWL_DEVICE_22500,
528};
529
530const struct iwl_cfg killer1650s_2ax_cfg_qu_b0_hr_b0 = {
531	.name = "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",
532	.fw_name_pre = IWL_22000_QU_B_HR_B_FW_PRE,
533	IWL_DEVICE_22500,
534	/*
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.
538	 */
539	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
 
540};
541
542const struct iwl_cfg killer1650i_2ax_cfg_qu_b0_hr_b0 = {
543	.name = "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)",
544	.fw_name_pre = IWL_22000_QU_B_HR_B_FW_PRE,
545	IWL_DEVICE_22500,
546	/*
547	 * This device doesn't support receiving BlockAck with a large bitmap
548	 * so we need to restrict the size of transmitted aggregation to the
549	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
550	 */
551	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
 
552};
553
554const struct iwl_cfg killer1650s_2ax_cfg_qu_c0_hr_b0 = {
555	.name = "Killer(R) Wi-Fi 6 AX1650i 160MHz Wireless Network Adapter (201NGW)",
556	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,
557	IWL_DEVICE_22500,
558	/*
559	 * This device doesn't support receiving BlockAck with a large bitmap
560	 * so we need to restrict the size of transmitted aggregation to the
561	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
562	 */
563	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
 
564};
565
566const struct iwl_cfg killer1650i_2ax_cfg_qu_c0_hr_b0 = {
567	.name = "Killer(R) Wi-Fi 6 AX1650s 160MHz Wireless Network Adapter (201D2W)",
568	.fw_name_pre = IWL_QU_C_HR_B_FW_PRE,
569	IWL_DEVICE_22500,
570	/*
571	 * This device doesn't support receiving BlockAck with a large bitmap
572	 * so we need to restrict the size of transmitted aggregation to the
573	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
574	 */
575	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
 
576};
577
578const struct iwl_cfg iwl22000_2ax_cfg_jf = {
579	.name = "Intel(R) Dual Band Wireless AX 22000",
580	.fw_name_pre = IWL_QU_B_JF_B_FW_PRE,
581	IWL_DEVICE_22500,
582	/*
583	 * This device doesn't support receiving BlockAck with a large bitmap
584	 * so we need to restrict the size of transmitted aggregation to the
585	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
586	 */
587	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
 
588};
589
590const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0_f0 = {
591	.name = "Intel(R) Dual Band Wireless AX 22000",
592	.fw_name_pre = IWL_22000_HR_A_F0_FW_PRE,
593	IWL_DEVICE_22500,
594	/*
595	 * This device doesn't support receiving BlockAck with a large bitmap
596	 * so we need to restrict the size of transmitted aggregation to the
597	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
598	 */
599	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
600};
601
602const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0 = {
603	.name = "Intel(R) Dual Band Wireless AX 22000",
604	.fw_name_pre = IWL_22000_HR_B_FW_PRE,
605	IWL_DEVICE_22500,
606	/*
607	 * This device doesn't support receiving BlockAck with a large bitmap
608	 * so we need to restrict the size of transmitted aggregation to the
609	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
610	 */
611	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
612};
613
614const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0 = {
615	.name = "Intel(R) Dual Band Wireless AX 22000",
616	.fw_name_pre = IWL_22000_HR_A0_FW_PRE,
617	IWL_DEVICE_22500,
618	/*
619	 * This device doesn't support receiving BlockAck with a large bitmap
620	 * so we need to restrict the size of transmitted aggregation to the
621	 * HT size; mac80211 would otherwise pick the HE max (256) by default.
622	 */
623	.max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT,
624};
625
626const struct iwl_cfg iwlax210_2ax_cfg_so_jf_a0 = {
627	.name = "Intel(R) Wireless-AC 9560 160MHz",
628	.fw_name_pre = IWL_22000_SO_A_JF_B_FW_PRE,
629	IWL_DEVICE_AX210,
630};
631
632const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0 = {
633	.name = "Intel(R) Wi-Fi 7 AX210 160MHz",
634	.fw_name_pre = IWL_22000_SO_A_HR_B_FW_PRE,
635	IWL_DEVICE_AX210,
636};
637
638const struct iwl_cfg iwlax211_2ax_cfg_so_gf_a0 = {
639	.name = "Intel(R) Wi-Fi 7 AX211 160MHz",
640	.fw_name_pre = IWL_22000_SO_A_GF_A_FW_PRE,
641	.uhb_supported = true,
642	IWL_DEVICE_AX210,
643};
644
645const struct iwl_cfg iwlax210_2ax_cfg_ty_gf_a0 = {
646	.name = "Intel(R) Wi-Fi 7 AX210 160MHz",
647	.fw_name_pre = IWL_22000_TY_A_GF_A_FW_PRE,
648	.uhb_supported = true,
649	IWL_DEVICE_AX210,
650};
651
652const struct iwl_cfg iwlax411_2ax_cfg_so_gf4_a0 = {
653	.name = "Intel(R) Wi-Fi 7 AX411 160MHz",
654	.fw_name_pre = IWL_22000_SO_A_GF4_A_FW_PRE,
655	IWL_DEVICE_AX210,
656};
657
658MODULE_FIRMWARE(IWL_22000_HR_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
659MODULE_FIRMWARE(IWL_22000_JF_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
660MODULE_FIRMWARE(IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
661MODULE_FIRMWARE(IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
662MODULE_FIRMWARE(IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
663MODULE_FIRMWARE(IWL_QU_C_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
664MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
665MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
666MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
667MODULE_FIRMWARE(IWL_QNJ_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
668MODULE_FIRMWARE(IWL_CC_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
669MODULE_FIRMWARE(IWL_22000_SO_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
670MODULE_FIRMWARE(IWL_22000_SO_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
671MODULE_FIRMWARE(IWL_22000_SO_A_GF_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
672MODULE_FIRMWARE(IWL_22000_TY_A_GF_A_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));