1
2
3
4
5
6
7#ifndef __iwl_fw_file_h__
8#define __iwl_fw_file_h__
9
10#include <linux/netdevice.h>
11#include <linux/nl80211.h>
12
13
14struct iwl_ucode_header {
15 __le32 ver;
16 union {
17 struct {
18 __le32 inst_size;
19 __le32 data_size;
20 __le32 init_size;
21 __le32 init_data_size;
22 __le32 boot_size;
23 u8 data[0];
24 } v1;
25 struct {
26 __le32 build;
27 __le32 inst_size;
28 __le32 data_size;
29 __le32 init_size;
30 __le32 init_data_size;
31 __le32 boot_size;
32 u8 data[0];
33 } v2;
34 } u;
35};
36
37#define IWL_UCODE_TLV_DEBUG_BASE 0x1000005
38#define IWL_UCODE_TLV_CONST_BASE 0x100
39
40
41
42
43
44
45
46
47enum iwl_ucode_tlv_type {
48 IWL_UCODE_TLV_INVALID = 0,
49 IWL_UCODE_TLV_INST = 1,
50 IWL_UCODE_TLV_DATA = 2,
51 IWL_UCODE_TLV_INIT = 3,
52 IWL_UCODE_TLV_INIT_DATA = 4,
53 IWL_UCODE_TLV_BOOT = 5,
54 IWL_UCODE_TLV_PROBE_MAX_LEN = 6,
55 IWL_UCODE_TLV_PAN = 7,
56 IWL_UCODE_TLV_RUNT_EVTLOG_PTR = 8,
57 IWL_UCODE_TLV_RUNT_EVTLOG_SIZE = 9,
58 IWL_UCODE_TLV_RUNT_ERRLOG_PTR = 10,
59 IWL_UCODE_TLV_INIT_EVTLOG_PTR = 11,
60 IWL_UCODE_TLV_INIT_EVTLOG_SIZE = 12,
61 IWL_UCODE_TLV_INIT_ERRLOG_PTR = 13,
62 IWL_UCODE_TLV_ENHANCE_SENS_TBL = 14,
63 IWL_UCODE_TLV_PHY_CALIBRATION_SIZE = 15,
64 IWL_UCODE_TLV_WOWLAN_INST = 16,
65 IWL_UCODE_TLV_WOWLAN_DATA = 17,
66 IWL_UCODE_TLV_FLAGS = 18,
67 IWL_UCODE_TLV_SEC_RT = 19,
68 IWL_UCODE_TLV_SEC_INIT = 20,
69 IWL_UCODE_TLV_SEC_WOWLAN = 21,
70 IWL_UCODE_TLV_DEF_CALIB = 22,
71 IWL_UCODE_TLV_PHY_SKU = 23,
72 IWL_UCODE_TLV_SECURE_SEC_RT = 24,
73 IWL_UCODE_TLV_SECURE_SEC_INIT = 25,
74 IWL_UCODE_TLV_SECURE_SEC_WOWLAN = 26,
75 IWL_UCODE_TLV_NUM_OF_CPU = 27,
76 IWL_UCODE_TLV_CSCHEME = 28,
77 IWL_UCODE_TLV_API_CHANGES_SET = 29,
78 IWL_UCODE_TLV_ENABLED_CAPABILITIES = 30,
79 IWL_UCODE_TLV_N_SCAN_CHANNELS = 31,
80 IWL_UCODE_TLV_PAGING = 32,
81 IWL_UCODE_TLV_SEC_RT_USNIFFER = 34,
82
83 IWL_UCODE_TLV_FW_VERSION = 36,
84 IWL_UCODE_TLV_FW_DBG_DEST = 38,
85 IWL_UCODE_TLV_FW_DBG_CONF = 39,
86 IWL_UCODE_TLV_FW_DBG_TRIGGER = 40,
87 IWL_UCODE_TLV_CMD_VERSIONS = 48,
88 IWL_UCODE_TLV_FW_GSCAN_CAPA = 50,
89 IWL_UCODE_TLV_FW_MEM_SEG = 51,
90 IWL_UCODE_TLV_IML = 52,
91 IWL_UCODE_TLV_UMAC_DEBUG_ADDRS = 54,
92 IWL_UCODE_TLV_LMAC_DEBUG_ADDRS = 55,
93 IWL_UCODE_TLV_FW_RECOVERY_INFO = 57,
94 IWL_UCODE_TLV_HW_TYPE = 58,
95 IWL_UCODE_TLV_FW_FSEQ_VERSION = 60,
96 IWL_UCODE_TLV_PHY_INTEGRATION_VERSION = 61,
97
98 IWL_UCODE_TLV_PNVM_VERSION = 62,
99 IWL_UCODE_TLV_PNVM_SKU = 64,
100
101 IWL_UCODE_TLV_FW_NUM_STATIONS = IWL_UCODE_TLV_CONST_BASE + 0,
102
103 IWL_UCODE_TLV_TYPE_DEBUG_INFO = IWL_UCODE_TLV_DEBUG_BASE + 0,
104 IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION = IWL_UCODE_TLV_DEBUG_BASE + 1,
105 IWL_UCODE_TLV_TYPE_HCMD = IWL_UCODE_TLV_DEBUG_BASE + 2,
106 IWL_UCODE_TLV_TYPE_REGIONS = IWL_UCODE_TLV_DEBUG_BASE + 3,
107 IWL_UCODE_TLV_TYPE_TRIGGERS = IWL_UCODE_TLV_DEBUG_BASE + 4,
108 IWL_UCODE_TLV_DEBUG_MAX = IWL_UCODE_TLV_TYPE_TRIGGERS,
109
110
111 IWL_UCODE_TLV_FW_DBG_DUMP_LST = 0x1000,
112};
113
114struct iwl_ucode_tlv {
115 __le32 type;
116 __le32 length;
117 u8 data[0];
118};
119
120#define IWL_TLV_UCODE_MAGIC 0x0a4c5749
121#define FW_VER_HUMAN_READABLE_SZ 64
122
123struct iwl_tlv_ucode_header {
124
125
126
127
128
129
130 __le32 zero;
131 __le32 magic;
132 u8 human_readable[FW_VER_HUMAN_READABLE_SZ];
133
134 __le32 ver;
135 __le32 build;
136 __le64 ignore;
137
138
139
140
141
142
143 u8 data[0];
144};
145
146
147
148
149
150
151struct iwl_ucode_api {
152 __le32 api_index;
153 __le32 api_flags;
154} __packed;
155
156struct iwl_ucode_capa {
157 __le32 api_index;
158 __le32 api_capa;
159} __packed;
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182enum iwl_ucode_tlv_flag {
183 IWL_UCODE_TLV_FLAGS_PAN = BIT(0),
184 IWL_UCODE_TLV_FLAGS_NEWSCAN = BIT(1),
185 IWL_UCODE_TLV_FLAGS_MFP = BIT(2),
186 IWL_UCODE_TLV_FLAGS_SHORT_BL = BIT(7),
187 IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS = BIT(10),
188 IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID = BIT(12),
189 IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL = BIT(15),
190 IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE = BIT(16),
191 IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT = BIT(24),
192 IWL_UCODE_TLV_FLAGS_EBS_SUPPORT = BIT(25),
193 IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD = BIT(26),
194 IWL_UCODE_TLV_FLAGS_BCAST_FILTERING = BIT(29),
195};
196
197typedef unsigned int __bitwise iwl_ucode_tlv_api_t;
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244enum iwl_ucode_tlv_api {
245
246 IWL_UCODE_TLV_API_FRAGMENTED_SCAN = (__force iwl_ucode_tlv_api_t)8,
247 IWL_UCODE_TLV_API_WIFI_MCC_UPDATE = (__force iwl_ucode_tlv_api_t)9,
248 IWL_UCODE_TLV_API_LQ_SS_PARAMS = (__force iwl_ucode_tlv_api_t)18,
249 IWL_UCODE_TLV_API_NEW_VERSION = (__force iwl_ucode_tlv_api_t)20,
250 IWL_UCODE_TLV_API_SCAN_TSF_REPORT = (__force iwl_ucode_tlv_api_t)28,
251 IWL_UCODE_TLV_API_TKIP_MIC_KEYS = (__force iwl_ucode_tlv_api_t)29,
252 IWL_UCODE_TLV_API_STA_TYPE = (__force iwl_ucode_tlv_api_t)30,
253 IWL_UCODE_TLV_API_NAN2_VER2 = (__force iwl_ucode_tlv_api_t)31,
254
255 IWL_UCODE_TLV_API_ADAPTIVE_DWELL = (__force iwl_ucode_tlv_api_t)32,
256 IWL_UCODE_TLV_API_OCE = (__force iwl_ucode_tlv_api_t)33,
257 IWL_UCODE_TLV_API_NEW_BEACON_TEMPLATE = (__force iwl_ucode_tlv_api_t)34,
258 IWL_UCODE_TLV_API_NEW_RX_STATS = (__force iwl_ucode_tlv_api_t)35,
259 IWL_UCODE_TLV_API_WOWLAN_KEY_MATERIAL = (__force iwl_ucode_tlv_api_t)36,
260 IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY = (__force iwl_ucode_tlv_api_t)38,
261 IWL_UCODE_TLV_API_DEPRECATE_TTAK = (__force iwl_ucode_tlv_api_t)41,
262 IWL_UCODE_TLV_API_ADAPTIVE_DWELL_V2 = (__force iwl_ucode_tlv_api_t)42,
263 IWL_UCODE_TLV_API_FRAG_EBS = (__force iwl_ucode_tlv_api_t)44,
264 IWL_UCODE_TLV_API_REDUCE_TX_POWER = (__force iwl_ucode_tlv_api_t)45,
265 IWL_UCODE_TLV_API_SHORT_BEACON_NOTIF = (__force iwl_ucode_tlv_api_t)46,
266 IWL_UCODE_TLV_API_BEACON_FILTER_V4 = (__force iwl_ucode_tlv_api_t)47,
267 IWL_UCODE_TLV_API_REGULATORY_NVM_INFO = (__force iwl_ucode_tlv_api_t)48,
268 IWL_UCODE_TLV_API_FTM_NEW_RANGE_REQ = (__force iwl_ucode_tlv_api_t)49,
269 IWL_UCODE_TLV_API_SCAN_OFFLOAD_CHANS = (__force iwl_ucode_tlv_api_t)50,
270 IWL_UCODE_TLV_API_MBSSID_HE = (__force iwl_ucode_tlv_api_t)52,
271 IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE = (__force iwl_ucode_tlv_api_t)53,
272 IWL_UCODE_TLV_API_FTM_RTT_ACCURACY = (__force iwl_ucode_tlv_api_t)54,
273 IWL_UCODE_TLV_API_SAR_TABLE_VER = (__force iwl_ucode_tlv_api_t)55,
274 IWL_UCODE_TLV_API_REDUCED_SCAN_CONFIG = (__force iwl_ucode_tlv_api_t)56,
275 IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP = (__force iwl_ucode_tlv_api_t)57,
276 IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER = (__force iwl_ucode_tlv_api_t)58,
277 IWL_UCODE_TLV_API_BAND_IN_RX_DATA = (__force iwl_ucode_tlv_api_t)59,
278
279 NUM_IWL_UCODE_TLV_API
280#ifdef __CHECKER__
281
282 = 128
283#endif
284};
285
286typedef unsigned int __bitwise iwl_ucode_tlv_capa_t;
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369enum iwl_ucode_tlv_capa {
370
371 IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = (__force iwl_ucode_tlv_capa_t)0,
372 IWL_UCODE_TLV_CAPA_LAR_SUPPORT = (__force iwl_ucode_tlv_capa_t)1,
373 IWL_UCODE_TLV_CAPA_UMAC_SCAN = (__force iwl_ucode_tlv_capa_t)2,
374 IWL_UCODE_TLV_CAPA_BEAMFORMER = (__force iwl_ucode_tlv_capa_t)3,
375 IWL_UCODE_TLV_CAPA_TDLS_SUPPORT = (__force iwl_ucode_tlv_capa_t)6,
376 IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT = (__force iwl_ucode_tlv_capa_t)8,
377 IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT = (__force iwl_ucode_tlv_capa_t)9,
378 IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT = (__force iwl_ucode_tlv_capa_t)10,
379 IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT = (__force iwl_ucode_tlv_capa_t)11,
380 IWL_UCODE_TLV_CAPA_DQA_SUPPORT = (__force iwl_ucode_tlv_capa_t)12,
381 IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH = (__force iwl_ucode_tlv_capa_t)13,
382 IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG = (__force iwl_ucode_tlv_capa_t)17,
383 IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT = (__force iwl_ucode_tlv_capa_t)18,
384 IWL_UCODE_TLV_CAPA_DC2DC_CONFIG_SUPPORT = (__force iwl_ucode_tlv_capa_t)19,
385 IWL_UCODE_TLV_CAPA_CSUM_SUPPORT = (__force iwl_ucode_tlv_capa_t)21,
386 IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS = (__force iwl_ucode_tlv_capa_t)22,
387 IWL_UCODE_TLV_CAPA_P2P_SCM_UAPSD = (__force iwl_ucode_tlv_capa_t)26,
388 IWL_UCODE_TLV_CAPA_BT_COEX_PLCR = (__force iwl_ucode_tlv_capa_t)28,
389 IWL_UCODE_TLV_CAPA_LAR_MULTI_MCC = (__force iwl_ucode_tlv_capa_t)29,
390 IWL_UCODE_TLV_CAPA_BT_COEX_RRC = (__force iwl_ucode_tlv_capa_t)30,
391 IWL_UCODE_TLV_CAPA_GSCAN_SUPPORT = (__force iwl_ucode_tlv_capa_t)31,
392
393
394 IWL_UCODE_TLV_CAPA_SOC_LATENCY_SUPPORT = (__force iwl_ucode_tlv_capa_t)37,
395 IWL_UCODE_TLV_CAPA_STA_PM_NOTIF = (__force iwl_ucode_tlv_capa_t)38,
396 IWL_UCODE_TLV_CAPA_BINDING_CDB_SUPPORT = (__force iwl_ucode_tlv_capa_t)39,
397 IWL_UCODE_TLV_CAPA_CDB_SUPPORT = (__force iwl_ucode_tlv_capa_t)40,
398 IWL_UCODE_TLV_CAPA_D0I3_END_FIRST = (__force iwl_ucode_tlv_capa_t)41,
399 IWL_UCODE_TLV_CAPA_TLC_OFFLOAD = (__force iwl_ucode_tlv_capa_t)43,
400 IWL_UCODE_TLV_CAPA_DYNAMIC_QUOTA = (__force iwl_ucode_tlv_capa_t)44,
401 IWL_UCODE_TLV_CAPA_COEX_SCHEMA_2 = (__force iwl_ucode_tlv_capa_t)45,
402 IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD = (__force iwl_ucode_tlv_capa_t)46,
403 IWL_UCODE_TLV_CAPA_FTM_CALIBRATED = (__force iwl_ucode_tlv_capa_t)47,
404 IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS = (__force iwl_ucode_tlv_capa_t)48,
405 IWL_UCODE_TLV_CAPA_CS_MODIFY = (__force iwl_ucode_tlv_capa_t)49,
406 IWL_UCODE_TLV_CAPA_SET_LTR_GEN2 = (__force iwl_ucode_tlv_capa_t)50,
407 IWL_UCODE_TLV_CAPA_SET_PPAG = (__force iwl_ucode_tlv_capa_t)52,
408 IWL_UCODE_TLV_CAPA_TAS_CFG = (__force iwl_ucode_tlv_capa_t)53,
409 IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD = (__force iwl_ucode_tlv_capa_t)54,
410 IWL_UCODE_TLV_CAPA_PROTECTED_TWT = (__force iwl_ucode_tlv_capa_t)56,
411 IWL_UCODE_TLV_CAPA_FW_RESET_HANDSHAKE = (__force iwl_ucode_tlv_capa_t)57,
412 IWL_UCODE_TLV_CAPA_PASSIVE_6GHZ_SCAN = (__force iwl_ucode_tlv_capa_t)58,
413
414
415 IWL_UCODE_TLV_CAPA_EXTENDED_DTS_MEASURE = (__force iwl_ucode_tlv_capa_t)64,
416 IWL_UCODE_TLV_CAPA_SHORT_PM_TIMEOUTS = (__force iwl_ucode_tlv_capa_t)65,
417 IWL_UCODE_TLV_CAPA_BT_MPLUT_SUPPORT = (__force iwl_ucode_tlv_capa_t)67,
418 IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT = (__force iwl_ucode_tlv_capa_t)68,
419 IWL_UCODE_TLV_CAPA_CSA_AND_TBTT_OFFLOAD = (__force iwl_ucode_tlv_capa_t)70,
420 IWL_UCODE_TLV_CAPA_BEACON_ANT_SELECTION = (__force iwl_ucode_tlv_capa_t)71,
421 IWL_UCODE_TLV_CAPA_BEACON_STORING = (__force iwl_ucode_tlv_capa_t)72,
422 IWL_UCODE_TLV_CAPA_LAR_SUPPORT_V3 = (__force iwl_ucode_tlv_capa_t)73,
423 IWL_UCODE_TLV_CAPA_CT_KILL_BY_FW = (__force iwl_ucode_tlv_capa_t)74,
424 IWL_UCODE_TLV_CAPA_TEMP_THS_REPORT_SUPPORT = (__force iwl_ucode_tlv_capa_t)75,
425 IWL_UCODE_TLV_CAPA_CTDP_SUPPORT = (__force iwl_ucode_tlv_capa_t)76,
426 IWL_UCODE_TLV_CAPA_USNIFFER_UNIFIED = (__force iwl_ucode_tlv_capa_t)77,
427 IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG = (__force iwl_ucode_tlv_capa_t)80,
428 IWL_UCODE_TLV_CAPA_LQM_SUPPORT = (__force iwl_ucode_tlv_capa_t)81,
429 IWL_UCODE_TLV_CAPA_TX_POWER_ACK = (__force iwl_ucode_tlv_capa_t)84,
430 IWL_UCODE_TLV_CAPA_D3_DEBUG = (__force iwl_ucode_tlv_capa_t)87,
431 IWL_UCODE_TLV_CAPA_LED_CMD_SUPPORT = (__force iwl_ucode_tlv_capa_t)88,
432 IWL_UCODE_TLV_CAPA_MCC_UPDATE_11AX_SUPPORT = (__force iwl_ucode_tlv_capa_t)89,
433 IWL_UCODE_TLV_CAPA_CSI_REPORTING = (__force iwl_ucode_tlv_capa_t)90,
434 IWL_UCODE_TLV_CAPA_DBG_SUSPEND_RESUME_CMD_SUPP = (__force iwl_ucode_tlv_capa_t)92,
435 IWL_UCODE_TLV_CAPA_DBG_BUF_ALLOC_CMD_SUPP = (__force iwl_ucode_tlv_capa_t)93,
436
437
438 IWL_UCODE_TLV_CAPA_MLME_OFFLOAD = (__force iwl_ucode_tlv_capa_t)96,
439
440
441
442
443 IWL_UCODE_TLV_CAPA_PSC_CHAN_SUPPORT = (__force iwl_ucode_tlv_capa_t)98,
444
445 IWL_UCODE_TLV_CAPA_BIGTK_SUPPORT = (__force iwl_ucode_tlv_capa_t)100,
446 IWL_UCODE_TLV_CAPA_RFIM_SUPPORT = (__force iwl_ucode_tlv_capa_t)102,
447
448 NUM_IWL_UCODE_TLV_CAPA
449#ifdef __CHECKER__
450
451 = 128
452#endif
453};
454
455
456#define IWL_DEFAULT_STANDARD_PHY_CALIBRATE_TBL_SIZE 18
457#define IWL_MAX_STANDARD_PHY_CALIBRATE_TBL_SIZE 19
458#define IWL_MAX_PHY_CALIBRATE_TBL_SIZE 253
459
460
461#define IWL_DEFAULT_MAX_PROBE_LENGTH 200
462
463
464
465
466
467#define CPU1_CPU2_SEPARATOR_SECTION 0xFFFFCCCC
468#define PAGING_SEPARATOR_SECTION 0xAAAABBBB
469
470
471#define IWL_UCODE_MAJOR(ver) (((ver) & 0xFF000000) >> 24)
472#define IWL_UCODE_MINOR(ver) (((ver) & 0x00FF0000) >> 16)
473#define IWL_UCODE_API(ver) (((ver) & 0x0000FF00) >> 8)
474#define IWL_UCODE_SERIAL(ver) ((ver) & 0x000000FF)
475
476
477
478
479
480
481
482
483
484struct iwl_tlv_calib_ctrl {
485 __le32 flow_trigger;
486 __le32 event_trigger;
487} __packed;
488
489enum iwl_fw_phy_cfg {
490 FW_PHY_CFG_RADIO_TYPE_POS = 0,
491 FW_PHY_CFG_RADIO_TYPE = 0x3 << FW_PHY_CFG_RADIO_TYPE_POS,
492 FW_PHY_CFG_RADIO_STEP_POS = 2,
493 FW_PHY_CFG_RADIO_STEP = 0x3 << FW_PHY_CFG_RADIO_STEP_POS,
494 FW_PHY_CFG_RADIO_DASH_POS = 4,
495 FW_PHY_CFG_RADIO_DASH = 0x3 << FW_PHY_CFG_RADIO_DASH_POS,
496 FW_PHY_CFG_TX_CHAIN_POS = 16,
497 FW_PHY_CFG_TX_CHAIN = 0xf << FW_PHY_CFG_TX_CHAIN_POS,
498 FW_PHY_CFG_RX_CHAIN_POS = 20,
499 FW_PHY_CFG_RX_CHAIN = 0xf << FW_PHY_CFG_RX_CHAIN_POS,
500 FW_PHY_CFG_CHAIN_SAD_POS = 23,
501 FW_PHY_CFG_CHAIN_SAD_ENABLED = 0x1 << FW_PHY_CFG_CHAIN_SAD_POS,
502 FW_PHY_CFG_CHAIN_SAD_ANT_A = 0x2 << FW_PHY_CFG_CHAIN_SAD_POS,
503 FW_PHY_CFG_CHAIN_SAD_ANT_B = 0x4 << FW_PHY_CFG_CHAIN_SAD_POS,
504 FW_PHY_CFG_SHARED_CLK = BIT(31),
505};
506
507#define IWL_UCODE_MAX_CS 1
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522struct iwl_fw_cipher_scheme {
523 __le32 cipher;
524 u8 flags;
525 u8 hdr_len;
526 u8 pn_len;
527 u8 pn_off;
528 u8 key_idx_off;
529 u8 key_idx_mask;
530 u8 key_idx_shift;
531 u8 mic_len;
532 u8 hw_cipher;
533} __packed;
534
535enum iwl_fw_dbg_reg_operator {
536 CSR_ASSIGN,
537 CSR_SETBIT,
538 CSR_CLEARBIT,
539
540 PRPH_ASSIGN,
541 PRPH_SETBIT,
542 PRPH_CLEARBIT,
543
544 INDIRECT_ASSIGN,
545 INDIRECT_SETBIT,
546 INDIRECT_CLEARBIT,
547
548 PRPH_BLOCKBIT,
549};
550
551
552
553
554
555
556
557
558struct iwl_fw_dbg_reg_op {
559 u8 op;
560 u8 reserved[3];
561 __le32 addr;
562 __le32 val;
563} __packed;
564
565
566
567
568
569
570
571
572
573enum iwl_fw_dbg_monitor_mode {
574 SMEM_MODE = 0,
575 EXTERNAL_MODE = 1,
576 MARBH_MODE = 2,
577 MIPI_MODE = 3,
578};
579
580
581
582
583
584
585
586
587
588
589struct iwl_fw_dbg_mem_seg_tlv {
590 __le32 data_type;
591 __le32 ofs;
592 __le32 len;
593} __packed;
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611struct iwl_fw_dbg_dest_tlv_v1 {
612 u8 version;
613 u8 monitor_mode;
614 u8 size_power;
615 u8 reserved;
616 __le32 base_reg;
617 __le32 end_reg;
618 __le32 write_ptr_reg;
619 __le32 wrap_count;
620 u8 base_shift;
621 u8 end_shift;
622 struct iwl_fw_dbg_reg_op reg_ops[0];
623} __packed;
624
625
626#define IWL_LDBG_M2S_BUF_SIZE_MSK 0x0fff0000
627
628#define IWL_LDBG_M2S_BUF_BA_MSK 0x00000fff
629
630#define IWL_M2S_UNIT_SIZE 0x100
631
632struct iwl_fw_dbg_dest_tlv {
633 u8 version;
634 u8 monitor_mode;
635 u8 size_power;
636 u8 reserved;
637 __le32 cfg_reg;
638 __le32 write_ptr_reg;
639 __le32 wrap_count;
640 u8 base_shift;
641 u8 size_shift;
642 struct iwl_fw_dbg_reg_op reg_ops[0];
643} __packed;
644
645struct iwl_fw_dbg_conf_hcmd {
646 u8 id;
647 u8 reserved;
648 __le16 len;
649 u8 data[0];
650} __packed;
651
652
653
654
655
656
657
658
659
660enum iwl_fw_dbg_trigger_mode {
661 IWL_FW_DBG_TRIGGER_START = BIT(0),
662 IWL_FW_DBG_TRIGGER_STOP = BIT(1),
663 IWL_FW_DBG_TRIGGER_MONITOR_ONLY = BIT(2),
664};
665
666
667
668
669
670enum iwl_fw_dbg_trigger_flags {
671 IWL_FW_DBG_FORCE_RESTART = BIT(0),
672};
673
674
675
676
677
678
679
680
681
682
683
684enum iwl_fw_dbg_trigger_vif_type {
685 IWL_FW_DBG_CONF_VIF_ANY = NL80211_IFTYPE_UNSPECIFIED,
686 IWL_FW_DBG_CONF_VIF_IBSS = NL80211_IFTYPE_ADHOC,
687 IWL_FW_DBG_CONF_VIF_STATION = NL80211_IFTYPE_STATION,
688 IWL_FW_DBG_CONF_VIF_AP = NL80211_IFTYPE_AP,
689 IWL_FW_DBG_CONF_VIF_P2P_CLIENT = NL80211_IFTYPE_P2P_CLIENT,
690 IWL_FW_DBG_CONF_VIF_P2P_GO = NL80211_IFTYPE_P2P_GO,
691 IWL_FW_DBG_CONF_VIF_P2P_DEVICE = NL80211_IFTYPE_P2P_DEVICE,
692};
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712struct iwl_fw_dbg_trigger_tlv {
713 __le32 id;
714 __le32 vif_type;
715 __le32 stop_conf_ids;
716 __le32 stop_delay;
717 u8 mode;
718 u8 start_conf_id;
719 __le16 occurrences;
720 __le16 trig_dis_ms;
721 u8 flags;
722 u8 reserved[5];
723
724 u8 data[0];
725} __packed;
726
727#define FW_DBG_START_FROM_ALIVE 0
728#define FW_DBG_CONF_MAX 32
729#define FW_DBG_INVALID 0xff
730
731
732
733
734
735
736
737
738
739
740struct iwl_fw_dbg_trigger_missed_bcon {
741 __le32 stop_consec_missed_bcon;
742 __le32 stop_consec_missed_bcon_since_rx;
743 __le32 reserved2[2];
744 __le32 start_consec_missed_bcon;
745 __le32 start_consec_missed_bcon_since_rx;
746 __le32 reserved1[2];
747} __packed;
748
749
750
751
752
753struct iwl_fw_dbg_trigger_cmd {
754 struct cmd {
755 u8 cmd_id;
756 u8 group_id;
757 } __packed cmds[16];
758} __packed;
759
760
761
762
763
764
765
766
767struct iwl_fw_dbg_trigger_stats {
768 __le32 stop_offset;
769 __le32 stop_threshold;
770 __le32 start_offset;
771 __le32 start_threshold;
772} __packed;
773
774
775
776
777
778struct iwl_fw_dbg_trigger_low_rssi {
779 __le32 rssi;
780} __packed;
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799struct iwl_fw_dbg_trigger_mlme {
800 u8 stop_auth_denied;
801 u8 stop_auth_timeout;
802 u8 stop_rx_deauth;
803 u8 stop_tx_deauth;
804
805 u8 stop_assoc_denied;
806 u8 stop_assoc_timeout;
807 u8 stop_connection_loss;
808 u8 reserved;
809
810 u8 start_auth_denied;
811 u8 start_auth_timeout;
812 u8 start_rx_deauth;
813 u8 start_tx_deauth;
814
815 u8 start_assoc_denied;
816 u8 start_assoc_timeout;
817 u8 start_connection_loss;
818 u8 reserved2;
819} __packed;
820
821
822
823
824
825
826
827
828
829
830
831
832struct iwl_fw_dbg_trigger_txq_timer {
833 __le32 command_queue;
834 __le32 bss;
835 __le32 softap;
836 __le32 p2p_go;
837 __le32 p2p_client;
838 __le32 p2p_device;
839 __le32 ibss;
840 __le32 tdls;
841 __le32 reserved[4];
842} __packed;
843
844
845
846
847
848
849
850
851
852struct iwl_fw_dbg_trigger_time_event {
853 struct {
854 __le32 id;
855 __le32 action_bitmap;
856 __le32 status_bitmap;
857 } __packed time_events[16];
858} __packed;
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877struct iwl_fw_dbg_trigger_ba {
878 __le16 rx_ba_start;
879 __le16 rx_ba_stop;
880 __le16 tx_ba_start;
881 __le16 tx_ba_stop;
882 __le16 rx_bar;
883 __le16 tx_bar;
884 __le16 frame_timeout;
885} __packed;
886
887
888
889
890
891
892
893struct iwl_fw_dbg_trigger_tdls {
894 u8 action_bitmap;
895 u8 peer_mode;
896 u8 peer[ETH_ALEN];
897 u8 reserved[4];
898} __packed;
899
900
901
902
903
904
905struct iwl_fw_dbg_trigger_tx_status {
906 struct tx_status {
907 u8 status;
908 u8 reserved[3];
909 } __packed statuses[16];
910 __le32 reserved[2];
911} __packed;
912
913
914
915
916
917
918
919
920
921
922
923
924struct iwl_fw_dbg_conf_tlv {
925 u8 id;
926 u8 usniffer;
927 u8 reserved;
928 u8 num_of_hcmds;
929 struct iwl_fw_dbg_conf_hcmd hcmd;
930} __packed;
931
932#define IWL_FW_CMD_VER_UNKNOWN 99
933
934
935
936
937
938
939
940
941struct iwl_fw_cmd_version {
942 u8 cmd;
943 u8 group;
944 u8 cmd_ver;
945 u8 notif_ver;
946} __packed;
947
948static inline size_t _iwl_tlv_array_len(const struct iwl_ucode_tlv *tlv,
949 size_t fixed_size, size_t var_size)
950{
951 size_t var_len = le32_to_cpu(tlv->length) - fixed_size;
952
953 if (WARN_ON(var_len % var_size))
954 return 0;
955
956 return var_len / var_size;
957}
958
959#define iwl_tlv_array_len(_tlv_ptr, _struct_ptr, _memb) \
960 _iwl_tlv_array_len((_tlv_ptr), sizeof(*(_struct_ptr)), \
961 sizeof(_struct_ptr->_memb[0]))
962
963#endif
964