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) 2012 - 2014 Intel Corporation. All rights reserved.
9  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
10  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of version 2 of the GNU General Public License as
14  * published by the Free Software Foundation.
15  *
16  * This program is distributed in the hope that it will be useful, but
17  * WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
24  * USA
25  *
26  * The full GNU General Public License is included in this distribution
27  * in the file called COPYING.
28  *
29  * Contact Information:
30  *  Intel Linux Wireless <linuxwifi@intel.com>
31  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
32  *
33  * BSD LICENSE
34  *
35  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
36  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
37  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
38  * All rights reserved.
39  *
40  * Redistribution and use in source and binary forms, with or without
41  * modification, are permitted provided that the following conditions
42  * are met:
43  *
44  *  * Redistributions of source code must retain the above copyright
45  *    notice, this list of conditions and the following disclaimer.
46  *  * Redistributions in binary form must reproduce the above copyright
47  *    notice, this list of conditions and the following disclaimer in
48  *    the documentation and/or other materials provided with the
49  *    distribution.
50  *  * Neither the name Intel Corporation nor the names of its
51  *    contributors may be used to endorse or promote products derived
52  *    from this software without specific prior written permission.
53  *
54  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
55  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
56  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
57  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
58  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
59  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
60  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
61  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
62  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
63  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
64  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
65  *
66  *****************************************************************************/
67 
68 #ifndef __fw_api_h__
69 #define __fw_api_h__
70 
71 #include "fw-api-rs.h"
72 #include "fw-api-rx.h"
73 #include "fw-api-tx.h"
74 #include "fw-api-sta.h"
75 #include "fw-api-mac.h"
76 #include "fw-api-power.h"
77 #include "fw-api-d3.h"
78 #include "fw-api-coex.h"
79 #include "fw-api-scan.h"
80 #include "fw-api-stats.h"
81 #include "fw-api-tof.h"
82 
83 /* Tx queue numbers for non-DQA mode */
84 enum {
85 	IWL_MVM_OFFCHANNEL_QUEUE = 8,
86 	IWL_MVM_CMD_QUEUE = 9,
87 };
88 
89 /*
90  * DQA queue numbers
91  *
92  * @IWL_MVM_DQA_CMD_QUEUE: a queue reserved for sending HCMDs to the FW
93  * @IWL_MVM_DQA_AUX_QUEUE: a queue reserved for aux frames
94  * @IWL_MVM_DQA_P2P_DEVICE_QUEUE: a queue reserved for P2P device frames
95  * @IWL_MVM_DQA_GCAST_QUEUE: a queue reserved for P2P GO/SoftAP GCAST frames
96  * @IWL_MVM_DQA_BSS_CLIENT_QUEUE: a queue reserved for BSS activity, to ensure
97  *	that we are never left without the possibility to connect to an AP.
98  * @IWL_MVM_DQA_MIN_MGMT_QUEUE: first TXQ in pool for MGMT and non-QOS frames.
99  *	Each MGMT queue is mapped to a single STA
100  *	MGMT frames are frames that return true on ieee80211_is_mgmt()
101  * @IWL_MVM_DQA_MAX_MGMT_QUEUE: last TXQ in pool for MGMT frames
102  * @IWL_MVM_DQA_AP_PROBE_RESP_QUEUE: a queue reserved for P2P GO/SoftAP probe
103  *	responses
104  * @IWL_MVM_DQA_MIN_DATA_QUEUE: first TXQ in pool for DATA frames.
105  *	DATA frames are intended for !ieee80211_is_mgmt() frames, but if
106  *	the MGMT TXQ pool is exhausted, mgmt frames can be sent on DATA queues
107  *	as well
108  * @IWL_MVM_DQA_MAX_DATA_QUEUE: last TXQ in pool for DATA frames
109  */
110 enum iwl_mvm_dqa_txq {
111 	IWL_MVM_DQA_CMD_QUEUE = 0,
112 	IWL_MVM_DQA_AUX_QUEUE = 1,
113 	IWL_MVM_DQA_P2P_DEVICE_QUEUE = 2,
114 	IWL_MVM_DQA_GCAST_QUEUE = 3,
115 	IWL_MVM_DQA_BSS_CLIENT_QUEUE = 4,
116 	IWL_MVM_DQA_MIN_MGMT_QUEUE = 5,
117 	IWL_MVM_DQA_MAX_MGMT_QUEUE = 8,
118 	IWL_MVM_DQA_AP_PROBE_RESP_QUEUE = 9,
119 	IWL_MVM_DQA_MIN_DATA_QUEUE = 10,
120 	IWL_MVM_DQA_MAX_DATA_QUEUE = 31,
121 };
122 
123 enum iwl_mvm_tx_fifo {
124 	IWL_MVM_TX_FIFO_BK = 0,
125 	IWL_MVM_TX_FIFO_BE,
126 	IWL_MVM_TX_FIFO_VI,
127 	IWL_MVM_TX_FIFO_VO,
128 	IWL_MVM_TX_FIFO_MCAST = 5,
129 	IWL_MVM_TX_FIFO_CMD = 7,
130 };
131 
132 
133 /* commands */
134 enum {
135 	MVM_ALIVE = 0x1,
136 	REPLY_ERROR = 0x2,
137 	ECHO_CMD = 0x3,
138 
139 	INIT_COMPLETE_NOTIF = 0x4,
140 
141 	/* PHY context commands */
142 	PHY_CONTEXT_CMD = 0x8,
143 	DBG_CFG = 0x9,
144 	ANTENNA_COUPLING_NOTIFICATION = 0xa,
145 
146 	/* UMAC scan commands */
147 	SCAN_ITERATION_COMPLETE_UMAC = 0xb5,
148 	SCAN_CFG_CMD = 0xc,
149 	SCAN_REQ_UMAC = 0xd,
150 	SCAN_ABORT_UMAC = 0xe,
151 	SCAN_COMPLETE_UMAC = 0xf,
152 
153 	BA_WINDOW_STATUS_NOTIFICATION_ID = 0x13,
154 
155 	/* station table */
156 	ADD_STA_KEY = 0x17,
157 	ADD_STA = 0x18,
158 	REMOVE_STA = 0x19,
159 
160 	/* paging get item */
161 	FW_GET_ITEM_CMD = 0x1a,
162 
163 	/* TX */
164 	TX_CMD = 0x1c,
165 	TXPATH_FLUSH = 0x1e,
166 	MGMT_MCAST_KEY = 0x1f,
167 
168 	/* scheduler config */
169 	SCD_QUEUE_CFG = 0x1d,
170 
171 	/* global key */
172 	WEP_KEY = 0x20,
173 
174 	/* Memory */
175 	SHARED_MEM_CFG = 0x25,
176 
177 	/* TDLS */
178 	TDLS_CHANNEL_SWITCH_CMD = 0x27,
179 	TDLS_CHANNEL_SWITCH_NOTIFICATION = 0xaa,
180 	TDLS_CONFIG_CMD = 0xa7,
181 
182 	/* MAC and Binding commands */
183 	MAC_CONTEXT_CMD = 0x28,
184 	TIME_EVENT_CMD = 0x29, /* both CMD and response */
185 	TIME_EVENT_NOTIFICATION = 0x2a,
186 	BINDING_CONTEXT_CMD = 0x2b,
187 	TIME_QUOTA_CMD = 0x2c,
188 	NON_QOS_TX_COUNTER_CMD = 0x2d,
189 
190 	LQ_CMD = 0x4e,
191 
192 	/* paging block to FW cpu2 */
193 	FW_PAGING_BLOCK_CMD = 0x4f,
194 
195 	/* Scan offload */
196 	SCAN_OFFLOAD_REQUEST_CMD = 0x51,
197 	SCAN_OFFLOAD_ABORT_CMD = 0x52,
198 	HOT_SPOT_CMD = 0x53,
199 	SCAN_OFFLOAD_COMPLETE = 0x6D,
200 	SCAN_OFFLOAD_UPDATE_PROFILES_CMD = 0x6E,
201 	SCAN_OFFLOAD_CONFIG_CMD = 0x6f,
202 	MATCH_FOUND_NOTIFICATION = 0xd9,
203 	SCAN_ITERATION_COMPLETE = 0xe7,
204 
205 	/* Phy */
206 	PHY_CONFIGURATION_CMD = 0x6a,
207 	CALIB_RES_NOTIF_PHY_DB = 0x6b,
208 	PHY_DB_CMD = 0x6c,
209 
210 	/* ToF - 802.11mc FTM */
211 	TOF_CMD = 0x10,
212 	TOF_NOTIFICATION = 0x11,
213 
214 	/* Power - legacy power table command */
215 	POWER_TABLE_CMD = 0x77,
216 	PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION = 0x78,
217 	LTR_CONFIG = 0xee,
218 
219 	/* Thermal Throttling*/
220 	REPLY_THERMAL_MNG_BACKOFF = 0x7e,
221 
222 	/* Set/Get DC2DC frequency tune */
223 	DC2DC_CONFIG_CMD = 0x83,
224 
225 	/* NVM */
226 	NVM_ACCESS_CMD = 0x88,
227 
228 	SET_CALIB_DEFAULT_CMD = 0x8e,
229 
230 	BEACON_NOTIFICATION = 0x90,
231 	BEACON_TEMPLATE_CMD = 0x91,
232 	TX_ANT_CONFIGURATION_CMD = 0x98,
233 	STATISTICS_CMD = 0x9c,
234 	STATISTICS_NOTIFICATION = 0x9d,
235 	EOSP_NOTIFICATION = 0x9e,
236 	REDUCE_TX_POWER_CMD = 0x9f,
237 
238 	/* RF-KILL commands and notifications */
239 	CARD_STATE_CMD = 0xa0,
240 	CARD_STATE_NOTIFICATION = 0xa1,
241 
242 	MISSED_BEACONS_NOTIFICATION = 0xa2,
243 
244 	/* Power - new power table command */
245 	MAC_PM_POWER_TABLE = 0xa9,
246 
247 	MFUART_LOAD_NOTIFICATION = 0xb1,
248 
249 	RSS_CONFIG_CMD = 0xb3,
250 
251 	REPLY_RX_PHY_CMD = 0xc0,
252 	REPLY_RX_MPDU_CMD = 0xc1,
253 	FRAME_RELEASE = 0xc3,
254 	BA_NOTIF = 0xc5,
255 
256 	/* Location Aware Regulatory */
257 	MCC_UPDATE_CMD = 0xc8,
258 	MCC_CHUB_UPDATE_CMD = 0xc9,
259 
260 	MARKER_CMD = 0xcb,
261 
262 	/* BT Coex */
263 	BT_COEX_PRIO_TABLE = 0xcc,
264 	BT_COEX_PROT_ENV = 0xcd,
265 	BT_PROFILE_NOTIFICATION = 0xce,
266 	BT_CONFIG = 0x9b,
267 	BT_COEX_UPDATE_SW_BOOST = 0x5a,
268 	BT_COEX_UPDATE_CORUN_LUT = 0x5b,
269 	BT_COEX_UPDATE_REDUCED_TXP = 0x5c,
270 	BT_COEX_CI = 0x5d,
271 
272 	REPLY_SF_CFG_CMD = 0xd1,
273 	REPLY_BEACON_FILTERING_CMD = 0xd2,
274 
275 	/* DTS measurements */
276 	CMD_DTS_MEASUREMENT_TRIGGER = 0xdc,
277 	DTS_MEASUREMENT_NOTIFICATION = 0xdd,
278 
279 	REPLY_DEBUG_CMD = 0xf0,
280 	LDBG_CONFIG_CMD = 0xf6,
281 	DEBUG_LOG_MSG = 0xf7,
282 
283 	BCAST_FILTER_CMD = 0xcf,
284 	MCAST_FILTER_CMD = 0xd0,
285 
286 	/* D3 commands/notifications */
287 	D3_CONFIG_CMD = 0xd3,
288 	PROT_OFFLOAD_CONFIG_CMD = 0xd4,
289 	OFFLOADS_QUERY_CMD = 0xd5,
290 	REMOTE_WAKE_CONFIG_CMD = 0xd6,
291 	D0I3_END_CMD = 0xed,
292 
293 	/* for WoWLAN in particular */
294 	WOWLAN_PATTERNS = 0xe0,
295 	WOWLAN_CONFIGURATION = 0xe1,
296 	WOWLAN_TSC_RSC_PARAM = 0xe2,
297 	WOWLAN_TKIP_PARAM = 0xe3,
298 	WOWLAN_KEK_KCK_MATERIAL = 0xe4,
299 	WOWLAN_GET_STATUSES = 0xe5,
300 	WOWLAN_TX_POWER_PER_DB = 0xe6,
301 
302 	/* and for NetDetect */
303 	SCAN_OFFLOAD_PROFILES_QUERY_CMD = 0x56,
304 	SCAN_OFFLOAD_HOTSPOTS_CONFIG_CMD = 0x58,
305 	SCAN_OFFLOAD_HOTSPOTS_QUERY_CMD = 0x59,
306 
307 	REPLY_MAX = 0xff,
308 };
309 
310 /* Please keep this enum *SORTED* by hex value.
311  * Needed for binary search, otherwise a warning will be triggered.
312  */
313 enum iwl_mac_conf_subcmd_ids {
314 	LINK_QUALITY_MEASUREMENT_CMD = 0x1,
315 	LINK_QUALITY_MEASUREMENT_COMPLETE_NOTIF = 0xFE,
316 	CHANNEL_SWITCH_NOA_NOTIF = 0xFF,
317 };
318 
319 enum iwl_phy_ops_subcmd_ids {
320 	CMD_DTS_MEASUREMENT_TRIGGER_WIDE = 0x0,
321 	CTDP_CONFIG_CMD = 0x03,
322 	TEMP_REPORTING_THRESHOLDS_CMD = 0x04,
323 	GEO_TX_POWER_LIMIT = 0x05,
324 	CT_KILL_NOTIFICATION = 0xFE,
325 	DTS_MEASUREMENT_NOTIF_WIDE = 0xFF,
326 };
327 
328 enum iwl_system_subcmd_ids {
329 	SHARED_MEM_CFG_CMD = 0x0,
330 	INIT_EXTENDED_CFG_CMD = 0x03,
331 };
332 
333 enum iwl_data_path_subcmd_ids {
334 	DQA_ENABLE_CMD = 0x0,
335 	UPDATE_MU_GROUPS_CMD = 0x1,
336 	TRIGGER_RX_QUEUES_NOTIF_CMD = 0x2,
337 	STA_PM_NOTIF = 0xFD,
338 	MU_GROUP_MGMT_NOTIF = 0xFE,
339 	RX_QUEUES_NOTIFICATION = 0xFF,
340 };
341 
342 enum iwl_prot_offload_subcmd_ids {
343 	STORED_BEACON_NTF = 0xFF,
344 };
345 
346 enum iwl_regulatory_and_nvm_subcmd_ids {
347 	NVM_ACCESS_COMPLETE = 0x0,
348 };
349 
350 enum iwl_debug_cmds {
351 	LMAC_RD_WR = 0x0,
352 	UMAC_RD_WR = 0x1,
353 	MFU_ASSERT_DUMP_NTF = 0xFE,
354 };
355 
356 /* command groups */
357 enum {
358 	LEGACY_GROUP = 0x0,
359 	LONG_GROUP = 0x1,
360 	SYSTEM_GROUP = 0x2,
361 	MAC_CONF_GROUP = 0x3,
362 	PHY_OPS_GROUP = 0x4,
363 	DATA_PATH_GROUP = 0x5,
364 	PROT_OFFLOAD_GROUP = 0xb,
365 	REGULATORY_AND_NVM_GROUP = 0xc,
366 	DEBUG_GROUP = 0xf,
367 };
368 
369 /**
370  * struct iwl_cmd_response - generic response struct for most commands
371  * @status: status of the command asked, changes for each one
372  */
373 struct iwl_cmd_response {
374 	__le32 status;
375 };
376 
377 /*
378  * struct iwl_dqa_enable_cmd
379  * @cmd_queue: the TXQ number of the command queue
380  */
381 struct iwl_dqa_enable_cmd {
382 	__le32 cmd_queue;
383 } __packed; /* DQA_CONTROL_CMD_API_S_VER_1 */
384 
385 /*
386  * struct iwl_tx_ant_cfg_cmd
387  * @valid: valid antenna configuration
388  */
389 struct iwl_tx_ant_cfg_cmd {
390 	__le32 valid;
391 } __packed;
392 
393 /*
394  * Calibration control struct.
395  * Sent as part of the phy configuration command.
396  * @flow_trigger: bitmap for which calibrations to perform according to
397  *		flow triggers.
398  * @event_trigger: bitmap for which calibrations to perform according to
399  *		event triggers.
400  */
401 struct iwl_calib_ctrl {
402 	__le32 flow_trigger;
403 	__le32 event_trigger;
404 } __packed;
405 
406 /* This enum defines the bitmap of various calibrations to enable in both
407  * init ucode and runtime ucode through CALIBRATION_CFG_CMD.
408  */
409 enum iwl_calib_cfg {
410 	IWL_CALIB_CFG_XTAL_IDX			= BIT(0),
411 	IWL_CALIB_CFG_TEMPERATURE_IDX		= BIT(1),
412 	IWL_CALIB_CFG_VOLTAGE_READ_IDX		= BIT(2),
413 	IWL_CALIB_CFG_PAPD_IDX			= BIT(3),
414 	IWL_CALIB_CFG_TX_PWR_IDX		= BIT(4),
415 	IWL_CALIB_CFG_DC_IDX			= BIT(5),
416 	IWL_CALIB_CFG_BB_FILTER_IDX		= BIT(6),
417 	IWL_CALIB_CFG_LO_LEAKAGE_IDX		= BIT(7),
418 	IWL_CALIB_CFG_TX_IQ_IDX			= BIT(8),
419 	IWL_CALIB_CFG_TX_IQ_SKEW_IDX		= BIT(9),
420 	IWL_CALIB_CFG_RX_IQ_IDX			= BIT(10),
421 	IWL_CALIB_CFG_RX_IQ_SKEW_IDX		= BIT(11),
422 	IWL_CALIB_CFG_SENSITIVITY_IDX		= BIT(12),
423 	IWL_CALIB_CFG_CHAIN_NOISE_IDX		= BIT(13),
424 	IWL_CALIB_CFG_DISCONNECTED_ANT_IDX	= BIT(14),
425 	IWL_CALIB_CFG_ANT_COUPLING_IDX		= BIT(15),
426 	IWL_CALIB_CFG_DAC_IDX			= BIT(16),
427 	IWL_CALIB_CFG_ABS_IDX			= BIT(17),
428 	IWL_CALIB_CFG_AGC_IDX			= BIT(18),
429 };
430 
431 /*
432  * Phy configuration command.
433  */
434 struct iwl_phy_cfg_cmd {
435 	__le32	phy_cfg;
436 	struct iwl_calib_ctrl calib_control;
437 } __packed;
438 
439 #define PHY_CFG_RADIO_TYPE	(BIT(0) | BIT(1))
440 #define PHY_CFG_RADIO_STEP	(BIT(2) | BIT(3))
441 #define PHY_CFG_RADIO_DASH	(BIT(4) | BIT(5))
442 #define PHY_CFG_PRODUCT_NUMBER	(BIT(6) | BIT(7))
443 #define PHY_CFG_TX_CHAIN_A	BIT(8)
444 #define PHY_CFG_TX_CHAIN_B	BIT(9)
445 #define PHY_CFG_TX_CHAIN_C	BIT(10)
446 #define PHY_CFG_RX_CHAIN_A	BIT(12)
447 #define PHY_CFG_RX_CHAIN_B	BIT(13)
448 #define PHY_CFG_RX_CHAIN_C	BIT(14)
449 
450 
451 /* Target of the NVM_ACCESS_CMD */
452 enum {
453 	NVM_ACCESS_TARGET_CACHE = 0,
454 	NVM_ACCESS_TARGET_OTP = 1,
455 	NVM_ACCESS_TARGET_EEPROM = 2,
456 };
457 
458 /* Section types for NVM_ACCESS_CMD */
459 enum {
460 	NVM_SECTION_TYPE_SW = 1,
461 	NVM_SECTION_TYPE_REGULATORY = 3,
462 	NVM_SECTION_TYPE_CALIBRATION = 4,
463 	NVM_SECTION_TYPE_PRODUCTION = 5,
464 	NVM_SECTION_TYPE_MAC_OVERRIDE = 11,
465 	NVM_SECTION_TYPE_PHY_SKU = 12,
466 	NVM_MAX_NUM_SECTIONS = 13,
467 };
468 
469 /**
470  * struct iwl_nvm_access_cmd_ver2 - Request the device to send an NVM section
471  * @op_code: 0 - read, 1 - write
472  * @target: NVM_ACCESS_TARGET_*
473  * @type: NVM_SECTION_TYPE_*
474  * @offset: offset in bytes into the section
475  * @length: in bytes, to read/write
476  * @data: if write operation, the data to write. On read its empty
477  */
478 struct iwl_nvm_access_cmd {
479 	u8 op_code;
480 	u8 target;
481 	__le16 type;
482 	__le16 offset;
483 	__le16 length;
484 	u8 data[];
485 } __packed; /* NVM_ACCESS_CMD_API_S_VER_2 */
486 
487 #define NUM_OF_FW_PAGING_BLOCKS	33 /* 32 for data and 1 block for CSS */
488 
489 /*
490  * struct iwl_fw_paging_cmd - paging layout
491  *
492  * (FW_PAGING_BLOCK_CMD = 0x4f)
493  *
494  * Send to FW the paging layout in the driver.
495  *
496  * @flags: various flags for the command
497  * @block_size: the block size in powers of 2
498  * @block_num: number of blocks specified in the command.
499  * @device_phy_addr: virtual addresses from device side
500  *	32 bit address for API version 1, 64 bit address for API version 2.
501 */
502 struct iwl_fw_paging_cmd {
503 	__le32 flags;
504 	__le32 block_size;
505 	__le32 block_num;
506 	union {
507 		__le32 addr32[NUM_OF_FW_PAGING_BLOCKS];
508 		__le64 addr64[NUM_OF_FW_PAGING_BLOCKS];
509 	} device_phy_addr;
510 } __packed; /* FW_PAGING_BLOCK_CMD_API_S_VER_2 */
511 
512 /*
513  * Fw items ID's
514  *
515  * @IWL_FW_ITEM_ID_PAGING: Address of the pages that the FW will upload
516  *	download
517  */
518 enum iwl_fw_item_id {
519 	IWL_FW_ITEM_ID_PAGING = 3,
520 };
521 
522 /*
523  * struct iwl_fw_get_item_cmd - get an item from the fw
524  */
525 struct iwl_fw_get_item_cmd {
526 	__le32 item_id;
527 } __packed; /* FW_GET_ITEM_CMD_API_S_VER_1 */
528 
529 #define CONT_REC_COMMAND_SIZE	80
530 #define ENABLE_CONT_RECORDING	0x15
531 #define DISABLE_CONT_RECORDING	0x16
532 
533 /*
534  * struct iwl_continuous_record_mode - recording mode
535  */
536 struct iwl_continuous_record_mode {
537 	__le16 enable_recording;
538 } __packed;
539 
540 /*
541  * struct iwl_continuous_record_cmd - enable/disable continuous recording
542  */
543 struct iwl_continuous_record_cmd {
544 	struct iwl_continuous_record_mode record_mode;
545 	u8 pad[CONT_REC_COMMAND_SIZE -
546 		sizeof(struct iwl_continuous_record_mode)];
547 } __packed;
548 
549 struct iwl_fw_get_item_resp {
550 	__le32 item_id;
551 	__le32 item_byte_cnt;
552 	__le32 item_val;
553 } __packed; /* FW_GET_ITEM_RSP_S_VER_1 */
554 
555 /**
556  * struct iwl_nvm_access_resp_ver2 - response to NVM_ACCESS_CMD
557  * @offset: offset in bytes into the section
558  * @length: in bytes, either how much was written or read
559  * @type: NVM_SECTION_TYPE_*
560  * @status: 0 for success, fail otherwise
561  * @data: if read operation, the data returned. Empty on write.
562  */
563 struct iwl_nvm_access_resp {
564 	__le16 offset;
565 	__le16 length;
566 	__le16 type;
567 	__le16 status;
568 	u8 data[];
569 } __packed; /* NVM_ACCESS_CMD_RESP_API_S_VER_2 */
570 
571 /* MVM_ALIVE 0x1 */
572 
573 /* alive response is_valid values */
574 #define ALIVE_RESP_UCODE_OK	BIT(0)
575 #define ALIVE_RESP_RFKILL	BIT(1)
576 
577 /* alive response ver_type values */
578 enum {
579 	FW_TYPE_HW = 0,
580 	FW_TYPE_PROT = 1,
581 	FW_TYPE_AP = 2,
582 	FW_TYPE_WOWLAN = 3,
583 	FW_TYPE_TIMING = 4,
584 	FW_TYPE_WIPAN = 5
585 };
586 
587 /* alive response ver_subtype values */
588 enum {
589 	FW_SUBTYPE_FULL_FEATURE = 0,
590 	FW_SUBTYPE_BOOTSRAP = 1, /* Not valid */
591 	FW_SUBTYPE_REDUCED = 2,
592 	FW_SUBTYPE_ALIVE_ONLY = 3,
593 	FW_SUBTYPE_WOWLAN = 4,
594 	FW_SUBTYPE_AP_SUBTYPE = 5,
595 	FW_SUBTYPE_WIPAN = 6,
596 	FW_SUBTYPE_INITIALIZE = 9
597 };
598 
599 #define IWL_ALIVE_STATUS_ERR 0xDEAD
600 #define IWL_ALIVE_STATUS_OK 0xCAFE
601 
602 #define IWL_ALIVE_FLG_RFKILL	BIT(0)
603 
604 struct iwl_lmac_alive {
605 	__le32 ucode_minor;
606 	__le32 ucode_major;
607 	u8 ver_subtype;
608 	u8 ver_type;
609 	u8 mac;
610 	u8 opt;
611 	__le32 timestamp;
612 	__le32 error_event_table_ptr;	/* SRAM address for error log */
613 	__le32 log_event_table_ptr;	/* SRAM address for LMAC event log */
614 	__le32 cpu_register_ptr;
615 	__le32 dbgm_config_ptr;
616 	__le32 alive_counter_ptr;
617 	__le32 scd_base_ptr;		/* SRAM address for SCD */
618 	__le32 st_fwrd_addr;		/* pointer to Store and forward */
619 	__le32 st_fwrd_size;
620 } __packed; /* UCODE_ALIVE_NTFY_API_S_VER_3 */
621 
622 struct iwl_umac_alive {
623 	__le32 umac_minor;		/* UMAC version: minor */
624 	__le32 umac_major;		/* UMAC version: major */
625 	__le32 error_info_addr;		/* SRAM address for UMAC error log */
626 	__le32 dbg_print_buff_addr;
627 } __packed; /* UMAC_ALIVE_DATA_API_S_VER_2 */
628 
629 struct mvm_alive_resp_v3 {
630 	__le16 status;
631 	__le16 flags;
632 	struct iwl_lmac_alive lmac_data;
633 	struct iwl_umac_alive umac_data;
634 } __packed; /* ALIVE_RES_API_S_VER_3 */
635 
636 struct mvm_alive_resp {
637 	__le16 status;
638 	__le16 flags;
639 	struct iwl_lmac_alive lmac_data[2];
640 	struct iwl_umac_alive umac_data;
641 } __packed; /* ALIVE_RES_API_S_VER_4 */
642 
643 /* Error response/notification */
644 enum {
645 	FW_ERR_UNKNOWN_CMD = 0x0,
646 	FW_ERR_INVALID_CMD_PARAM = 0x1,
647 	FW_ERR_SERVICE = 0x2,
648 	FW_ERR_ARC_MEMORY = 0x3,
649 	FW_ERR_ARC_CODE = 0x4,
650 	FW_ERR_WATCH_DOG = 0x5,
651 	FW_ERR_WEP_GRP_KEY_INDX = 0x10,
652 	FW_ERR_WEP_KEY_SIZE = 0x11,
653 	FW_ERR_OBSOLETE_FUNC = 0x12,
654 	FW_ERR_UNEXPECTED = 0xFE,
655 	FW_ERR_FATAL = 0xFF
656 };
657 
658 /**
659  * struct iwl_error_resp - FW error indication
660  * ( REPLY_ERROR = 0x2 )
661  * @error_type: one of FW_ERR_*
662  * @cmd_id: the command ID for which the error occured
663  * @bad_cmd_seq_num: sequence number of the erroneous command
664  * @error_service: which service created the error, applicable only if
665  *	error_type = 2, otherwise 0
666  * @timestamp: TSF in usecs.
667  */
668 struct iwl_error_resp {
669 	__le32 error_type;
670 	u8 cmd_id;
671 	u8 reserved1;
672 	__le16 bad_cmd_seq_num;
673 	__le32 error_service;
674 	__le64 timestamp;
675 } __packed;
676 
677 
678 /* Common PHY, MAC and Bindings definitions */
679 #define MAX_MACS_IN_BINDING	(3)
680 #define MAX_BINDINGS		(4)
681 
682 /* Used to extract ID and color from the context dword */
683 #define FW_CTXT_ID_POS	  (0)
684 #define FW_CTXT_ID_MSK	  (0xff << FW_CTXT_ID_POS)
685 #define FW_CTXT_COLOR_POS (8)
686 #define FW_CTXT_COLOR_MSK (0xff << FW_CTXT_COLOR_POS)
687 #define FW_CTXT_INVALID	  (0xffffffff)
688 
689 #define FW_CMD_ID_AND_COLOR(_id, _color) ((_id << FW_CTXT_ID_POS) |\
690 					  (_color << FW_CTXT_COLOR_POS))
691 
692 /* Possible actions on PHYs, MACs and Bindings */
693 enum iwl_phy_ctxt_action {
694 	FW_CTXT_ACTION_STUB = 0,
695 	FW_CTXT_ACTION_ADD,
696 	FW_CTXT_ACTION_MODIFY,
697 	FW_CTXT_ACTION_REMOVE,
698 	FW_CTXT_ACTION_NUM
699 }; /* COMMON_CONTEXT_ACTION_API_E_VER_1 */
700 
701 /* Time Events */
702 
703 /* Time Event types, according to MAC type */
704 enum iwl_time_event_type {
705 	/* BSS Station Events */
706 	TE_BSS_STA_AGGRESSIVE_ASSOC,
707 	TE_BSS_STA_ASSOC,
708 	TE_BSS_EAP_DHCP_PROT,
709 	TE_BSS_QUIET_PERIOD,
710 
711 	/* P2P Device Events */
712 	TE_P2P_DEVICE_DISCOVERABLE,
713 	TE_P2P_DEVICE_LISTEN,
714 	TE_P2P_DEVICE_ACTION_SCAN,
715 	TE_P2P_DEVICE_FULL_SCAN,
716 
717 	/* P2P Client Events */
718 	TE_P2P_CLIENT_AGGRESSIVE_ASSOC,
719 	TE_P2P_CLIENT_ASSOC,
720 	TE_P2P_CLIENT_QUIET_PERIOD,
721 
722 	/* P2P GO Events */
723 	TE_P2P_GO_ASSOC_PROT,
724 	TE_P2P_GO_REPETITIVET_NOA,
725 	TE_P2P_GO_CT_WINDOW,
726 
727 	/* WiDi Sync Events */
728 	TE_WIDI_TX_SYNC,
729 
730 	/* Channel Switch NoA */
731 	TE_CHANNEL_SWITCH_PERIOD,
732 
733 	TE_MAX
734 }; /* MAC_EVENT_TYPE_API_E_VER_1 */
735 
736 
737 
738 /* Time event - defines for command API v1 */
739 
740 /*
741  * @TE_V1_FRAG_NONE: fragmentation of the time event is NOT allowed.
742  * @TE_V1_FRAG_SINGLE: fragmentation of the time event is allowed, but only
743  *	the first fragment is scheduled.
744  * @TE_V1_FRAG_DUAL: fragmentation of the time event is allowed, but only
745  *	the first 2 fragments are scheduled.
746  * @TE_V1_FRAG_ENDLESS: fragmentation of the time event is allowed, and any
747  *	number of fragments are valid.
748  *
749  * Other than the constant defined above, specifying a fragmentation value 'x'
750  * means that the event can be fragmented but only the first 'x' will be
751  * scheduled.
752  */
753 enum {
754 	TE_V1_FRAG_NONE = 0,
755 	TE_V1_FRAG_SINGLE = 1,
756 	TE_V1_FRAG_DUAL = 2,
757 	TE_V1_FRAG_ENDLESS = 0xffffffff
758 };
759 
760 /* If a Time Event can be fragmented, this is the max number of fragments */
761 #define TE_V1_FRAG_MAX_MSK	0x0fffffff
762 /* Repeat the time event endlessly (until removed) */
763 #define TE_V1_REPEAT_ENDLESS	0xffffffff
764 /* If a Time Event has bounded repetitions, this is the maximal value */
765 #define TE_V1_REPEAT_MAX_MSK_V1	0x0fffffff
766 
767 /* Time Event dependencies: none, on another TE, or in a specific time */
768 enum {
769 	TE_V1_INDEPENDENT		= 0,
770 	TE_V1_DEP_OTHER			= BIT(0),
771 	TE_V1_DEP_TSF			= BIT(1),
772 	TE_V1_EVENT_SOCIOPATHIC		= BIT(2),
773 }; /* MAC_EVENT_DEPENDENCY_POLICY_API_E_VER_2 */
774 
775 /*
776  * @TE_V1_NOTIF_NONE: no notifications
777  * @TE_V1_NOTIF_HOST_EVENT_START: request/receive notification on event start
778  * @TE_V1_NOTIF_HOST_EVENT_END:request/receive notification on event end
779  * @TE_V1_NOTIF_INTERNAL_EVENT_START: internal FW use
780  * @TE_V1_NOTIF_INTERNAL_EVENT_END: internal FW use.
781  * @TE_V1_NOTIF_HOST_FRAG_START: request/receive notification on frag start
782  * @TE_V1_NOTIF_HOST_FRAG_END:request/receive notification on frag end
783  * @TE_V1_NOTIF_INTERNAL_FRAG_START: internal FW use.
784  * @TE_V1_NOTIF_INTERNAL_FRAG_END: internal FW use.
785  *
786  * Supported Time event notifications configuration.
787  * A notification (both event and fragment) includes a status indicating weather
788  * the FW was able to schedule the event or not. For fragment start/end
789  * notification the status is always success. There is no start/end fragment
790  * notification for monolithic events.
791  */
792 enum {
793 	TE_V1_NOTIF_NONE = 0,
794 	TE_V1_NOTIF_HOST_EVENT_START = BIT(0),
795 	TE_V1_NOTIF_HOST_EVENT_END = BIT(1),
796 	TE_V1_NOTIF_INTERNAL_EVENT_START = BIT(2),
797 	TE_V1_NOTIF_INTERNAL_EVENT_END = BIT(3),
798 	TE_V1_NOTIF_HOST_FRAG_START = BIT(4),
799 	TE_V1_NOTIF_HOST_FRAG_END = BIT(5),
800 	TE_V1_NOTIF_INTERNAL_FRAG_START = BIT(6),
801 	TE_V1_NOTIF_INTERNAL_FRAG_END = BIT(7),
802 }; /* MAC_EVENT_ACTION_API_E_VER_2 */
803 
804 /* Time event - defines for command API */
805 
806 /*
807  * @TE_V2_FRAG_NONE: fragmentation of the time event is NOT allowed.
808  * @TE_V2_FRAG_SINGLE: fragmentation of the time event is allowed, but only
809  *  the first fragment is scheduled.
810  * @TE_V2_FRAG_DUAL: fragmentation of the time event is allowed, but only
811  *  the first 2 fragments are scheduled.
812  * @TE_V2_FRAG_ENDLESS: fragmentation of the time event is allowed, and any
813  *  number of fragments are valid.
814  *
815  * Other than the constant defined above, specifying a fragmentation value 'x'
816  * means that the event can be fragmented but only the first 'x' will be
817  * scheduled.
818  */
819 enum {
820 	TE_V2_FRAG_NONE = 0,
821 	TE_V2_FRAG_SINGLE = 1,
822 	TE_V2_FRAG_DUAL = 2,
823 	TE_V2_FRAG_MAX = 0xfe,
824 	TE_V2_FRAG_ENDLESS = 0xff
825 };
826 
827 /* Repeat the time event endlessly (until removed) */
828 #define TE_V2_REPEAT_ENDLESS	0xff
829 /* If a Time Event has bounded repetitions, this is the maximal value */
830 #define TE_V2_REPEAT_MAX	0xfe
831 
832 #define TE_V2_PLACEMENT_POS	12
833 #define TE_V2_ABSENCE_POS	15
834 
835 /* Time event policy values
836  * A notification (both event and fragment) includes a status indicating weather
837  * the FW was able to schedule the event or not. For fragment start/end
838  * notification the status is always success. There is no start/end fragment
839  * notification for monolithic events.
840  *
841  * @TE_V2_DEFAULT_POLICY: independent, social, present, unoticable
842  * @TE_V2_NOTIF_HOST_EVENT_START: request/receive notification on event start
843  * @TE_V2_NOTIF_HOST_EVENT_END:request/receive notification on event end
844  * @TE_V2_NOTIF_INTERNAL_EVENT_START: internal FW use
845  * @TE_V2_NOTIF_INTERNAL_EVENT_END: internal FW use.
846  * @TE_V2_NOTIF_HOST_FRAG_START: request/receive notification on frag start
847  * @TE_V2_NOTIF_HOST_FRAG_END:request/receive notification on frag end
848  * @TE_V2_NOTIF_INTERNAL_FRAG_START: internal FW use.
849  * @TE_V2_NOTIF_INTERNAL_FRAG_END: internal FW use.
850  * @TE_V2_DEP_OTHER: depends on another time event
851  * @TE_V2_DEP_TSF: depends on a specific time
852  * @TE_V2_EVENT_SOCIOPATHIC: can't co-exist with other events of tha same MAC
853  * @TE_V2_ABSENCE: are we present or absent during the Time Event.
854  */
855 enum {
856 	TE_V2_DEFAULT_POLICY = 0x0,
857 
858 	/* notifications (event start/stop, fragment start/stop) */
859 	TE_V2_NOTIF_HOST_EVENT_START = BIT(0),
860 	TE_V2_NOTIF_HOST_EVENT_END = BIT(1),
861 	TE_V2_NOTIF_INTERNAL_EVENT_START = BIT(2),
862 	TE_V2_NOTIF_INTERNAL_EVENT_END = BIT(3),
863 
864 	TE_V2_NOTIF_HOST_FRAG_START = BIT(4),
865 	TE_V2_NOTIF_HOST_FRAG_END = BIT(5),
866 	TE_V2_NOTIF_INTERNAL_FRAG_START = BIT(6),
867 	TE_V2_NOTIF_INTERNAL_FRAG_END = BIT(7),
868 	T2_V2_START_IMMEDIATELY = BIT(11),
869 
870 	TE_V2_NOTIF_MSK = 0xff,
871 
872 	/* placement characteristics */
873 	TE_V2_DEP_OTHER = BIT(TE_V2_PLACEMENT_POS),
874 	TE_V2_DEP_TSF = BIT(TE_V2_PLACEMENT_POS + 1),
875 	TE_V2_EVENT_SOCIOPATHIC = BIT(TE_V2_PLACEMENT_POS + 2),
876 
877 	/* are we present or absent during the Time Event. */
878 	TE_V2_ABSENCE = BIT(TE_V2_ABSENCE_POS),
879 };
880 
881 /**
882  * struct iwl_time_event_cmd_api - configuring Time Events
883  * with struct MAC_TIME_EVENT_DATA_API_S_VER_2 (see also
884  * with version 1. determined by IWL_UCODE_TLV_FLAGS)
885  * ( TIME_EVENT_CMD = 0x29 )
886  * @id_and_color: ID and color of the relevant MAC
887  * @action: action to perform, one of FW_CTXT_ACTION_*
888  * @id: this field has two meanings, depending on the action:
889  *	If the action is ADD, then it means the type of event to add.
890  *	For all other actions it is the unique event ID assigned when the
891  *	event was added by the FW.
892  * @apply_time: When to start the Time Event (in GP2)
893  * @max_delay: maximum delay to event's start (apply time), in TU
894  * @depends_on: the unique ID of the event we depend on (if any)
895  * @interval: interval between repetitions, in TU
896  * @duration: duration of event in TU
897  * @repeat: how many repetitions to do, can be TE_REPEAT_ENDLESS
898  * @max_frags: maximal number of fragments the Time Event can be divided to
899  * @policy: defines whether uCode shall notify the host or other uCode modules
900  *	on event and/or fragment start and/or end
901  *	using one of TE_INDEPENDENT, TE_DEP_OTHER, TE_DEP_TSF
902  *	TE_EVENT_SOCIOPATHIC
903  *	using TE_ABSENCE and using TE_NOTIF_*
904  */
905 struct iwl_time_event_cmd {
906 	/* COMMON_INDEX_HDR_API_S_VER_1 */
907 	__le32 id_and_color;
908 	__le32 action;
909 	__le32 id;
910 	/* MAC_TIME_EVENT_DATA_API_S_VER_2 */
911 	__le32 apply_time;
912 	__le32 max_delay;
913 	__le32 depends_on;
914 	__le32 interval;
915 	__le32 duration;
916 	u8 repeat;
917 	u8 max_frags;
918 	__le16 policy;
919 } __packed; /* MAC_TIME_EVENT_CMD_API_S_VER_2 */
920 
921 /**
922  * struct iwl_time_event_resp - response structure to iwl_time_event_cmd
923  * @status: bit 0 indicates success, all others specify errors
924  * @id: the Time Event type
925  * @unique_id: the unique ID assigned (in ADD) or given (others) to the TE
926  * @id_and_color: ID and color of the relevant MAC
927  */
928 struct iwl_time_event_resp {
929 	__le32 status;
930 	__le32 id;
931 	__le32 unique_id;
932 	__le32 id_and_color;
933 } __packed; /* MAC_TIME_EVENT_RSP_API_S_VER_1 */
934 
935 /**
936  * struct iwl_time_event_notif - notifications of time event start/stop
937  * ( TIME_EVENT_NOTIFICATION = 0x2a )
938  * @timestamp: action timestamp in GP2
939  * @session_id: session's unique id
940  * @unique_id: unique id of the Time Event itself
941  * @id_and_color: ID and color of the relevant MAC
942  * @action: one of TE_NOTIF_START or TE_NOTIF_END
943  * @status: true if scheduled, false otherwise (not executed)
944  */
945 struct iwl_time_event_notif {
946 	__le32 timestamp;
947 	__le32 session_id;
948 	__le32 unique_id;
949 	__le32 id_and_color;
950 	__le32 action;
951 	__le32 status;
952 } __packed; /* MAC_TIME_EVENT_NTFY_API_S_VER_1 */
953 
954 
955 /* Bindings and Time Quota */
956 
957 /**
958  * struct iwl_binding_cmd - configuring bindings
959  * ( BINDING_CONTEXT_CMD = 0x2b )
960  * @id_and_color: ID and color of the relevant Binding
961  * @action: action to perform, one of FW_CTXT_ACTION_*
962  * @macs: array of MAC id and colors which belong to the binding
963  * @phy: PHY id and color which belongs to the binding
964  * @lmac_id: the lmac id the binding belongs to
965  */
966 struct iwl_binding_cmd {
967 	/* COMMON_INDEX_HDR_API_S_VER_1 */
968 	__le32 id_and_color;
969 	__le32 action;
970 	/* BINDING_DATA_API_S_VER_1 */
971 	__le32 macs[MAX_MACS_IN_BINDING];
972 	__le32 phy;
973 	/* BINDING_CMD_API_S_VER_1 */
974 	__le32 lmac_id;
975 } __packed; /* BINDING_CMD_API_S_VER_2 */
976 
977 #define IWL_BINDING_CMD_SIZE_V1	offsetof(struct iwl_binding_cmd, lmac_id)
978 #define IWL_LMAC_24G_INDEX		0
979 #define IWL_LMAC_5G_INDEX		1
980 
981 /* The maximal number of fragments in the FW's schedule session */
982 #define IWL_MVM_MAX_QUOTA 128
983 
984 /**
985  * struct iwl_time_quota_data - configuration of time quota per binding
986  * @id_and_color: ID and color of the relevant Binding
987  * @quota: absolute time quota in TU. The scheduler will try to divide the
988  *	remainig quota (after Time Events) according to this quota.
989  * @max_duration: max uninterrupted context duration in TU
990  */
991 struct iwl_time_quota_data {
992 	__le32 id_and_color;
993 	__le32 quota;
994 	__le32 max_duration;
995 } __packed; /* TIME_QUOTA_DATA_API_S_VER_1 */
996 
997 /**
998  * struct iwl_time_quota_cmd - configuration of time quota between bindings
999  * ( TIME_QUOTA_CMD = 0x2c )
1000  * @quotas: allocations per binding
1001  * Note: on non-CDB the fourth one is the auxilary mac and is
1002  *	essentially zero.
1003  *	On CDB the fourth one is a regular binding.
1004  */
1005 struct iwl_time_quota_cmd {
1006 	struct iwl_time_quota_data quotas[MAX_BINDINGS];
1007 } __packed; /* TIME_QUOTA_ALLOCATION_CMD_API_S_VER_1 */
1008 
1009 
1010 /* PHY context */
1011 
1012 /* Supported bands */
1013 #define PHY_BAND_5  (0)
1014 #define PHY_BAND_24 (1)
1015 
1016 /* Supported channel width, vary if there is VHT support */
1017 #define PHY_VHT_CHANNEL_MODE20	(0x0)
1018 #define PHY_VHT_CHANNEL_MODE40	(0x1)
1019 #define PHY_VHT_CHANNEL_MODE80	(0x2)
1020 #define PHY_VHT_CHANNEL_MODE160	(0x3)
1021 
1022 /*
1023  * Control channel position:
1024  * For legacy set bit means upper channel, otherwise lower.
1025  * For VHT - bit-2 marks if the control is lower/upper relative to center-freq
1026  *   bits-1:0 mark the distance from the center freq. for 20Mhz, offset is 0.
1027  *                                   center_freq
1028  *                                        |
1029  * 40Mhz                          |_______|_______|
1030  * 80Mhz                  |_______|_______|_______|_______|
1031  * 160Mhz |_______|_______|_______|_______|_______|_______|_______|_______|
1032  * code      011     010     001     000  |  100     101     110    111
1033  */
1034 #define PHY_VHT_CTRL_POS_1_BELOW  (0x0)
1035 #define PHY_VHT_CTRL_POS_2_BELOW  (0x1)
1036 #define PHY_VHT_CTRL_POS_3_BELOW  (0x2)
1037 #define PHY_VHT_CTRL_POS_4_BELOW  (0x3)
1038 #define PHY_VHT_CTRL_POS_1_ABOVE  (0x4)
1039 #define PHY_VHT_CTRL_POS_2_ABOVE  (0x5)
1040 #define PHY_VHT_CTRL_POS_3_ABOVE  (0x6)
1041 #define PHY_VHT_CTRL_POS_4_ABOVE  (0x7)
1042 
1043 /*
1044  * @band: PHY_BAND_*
1045  * @channel: channel number
1046  * @width: PHY_[VHT|LEGACY]_CHANNEL_*
1047  * @ctrl channel: PHY_[VHT|LEGACY]_CTRL_*
1048  */
1049 struct iwl_fw_channel_info {
1050 	u8 band;
1051 	u8 channel;
1052 	u8 width;
1053 	u8 ctrl_pos;
1054 } __packed;
1055 
1056 #define PHY_RX_CHAIN_DRIVER_FORCE_POS	(0)
1057 #define PHY_RX_CHAIN_DRIVER_FORCE_MSK \
1058 	(0x1 << PHY_RX_CHAIN_DRIVER_FORCE_POS)
1059 #define PHY_RX_CHAIN_VALID_POS		(1)
1060 #define PHY_RX_CHAIN_VALID_MSK \
1061 	(0x7 << PHY_RX_CHAIN_VALID_POS)
1062 #define PHY_RX_CHAIN_FORCE_SEL_POS	(4)
1063 #define PHY_RX_CHAIN_FORCE_SEL_MSK \
1064 	(0x7 << PHY_RX_CHAIN_FORCE_SEL_POS)
1065 #define PHY_RX_CHAIN_FORCE_MIMO_SEL_POS	(7)
1066 #define PHY_RX_CHAIN_FORCE_MIMO_SEL_MSK \
1067 	(0x7 << PHY_RX_CHAIN_FORCE_MIMO_SEL_POS)
1068 #define PHY_RX_CHAIN_CNT_POS		(10)
1069 #define PHY_RX_CHAIN_CNT_MSK \
1070 	(0x3 << PHY_RX_CHAIN_CNT_POS)
1071 #define PHY_RX_CHAIN_MIMO_CNT_POS	(12)
1072 #define PHY_RX_CHAIN_MIMO_CNT_MSK \
1073 	(0x3 << PHY_RX_CHAIN_MIMO_CNT_POS)
1074 #define PHY_RX_CHAIN_MIMO_FORCE_POS	(14)
1075 #define PHY_RX_CHAIN_MIMO_FORCE_MSK \
1076 	(0x1 << PHY_RX_CHAIN_MIMO_FORCE_POS)
1077 
1078 /* TODO: fix the value, make it depend on firmware at runtime? */
1079 #define NUM_PHY_CTX	3
1080 
1081 /* TODO: complete missing documentation */
1082 /**
1083  * struct iwl_phy_context_cmd - config of the PHY context
1084  * ( PHY_CONTEXT_CMD = 0x8 )
1085  * @id_and_color: ID and color of the relevant Binding
1086  * @action: action to perform, one of FW_CTXT_ACTION_*
1087  * @apply_time: 0 means immediate apply and context switch.
1088  *	other value means apply new params after X usecs
1089  * @tx_param_color: ???
1090  * @channel_info:
1091  * @txchain_info: ???
1092  * @rxchain_info: ???
1093  * @acquisition_data: ???
1094  * @dsp_cfg_flags: set to 0
1095  */
1096 struct iwl_phy_context_cmd {
1097 	/* COMMON_INDEX_HDR_API_S_VER_1 */
1098 	__le32 id_and_color;
1099 	__le32 action;
1100 	/* PHY_CONTEXT_DATA_API_S_VER_1 */
1101 	__le32 apply_time;
1102 	__le32 tx_param_color;
1103 	struct iwl_fw_channel_info ci;
1104 	__le32 txchain_info;
1105 	__le32 rxchain_info;
1106 	__le32 acquisition_data;
1107 	__le32 dsp_cfg_flags;
1108 } __packed; /* PHY_CONTEXT_CMD_API_VER_1 */
1109 
1110 /*
1111  * Aux ROC command
1112  *
1113  * Command requests the firmware to create a time event for a certain duration
1114  * and remain on the given channel. This is done by using the Aux framework in
1115  * the FW.
1116  * The command was first used for Hot Spot issues - but can be used regardless
1117  * to Hot Spot.
1118  *
1119  * ( HOT_SPOT_CMD 0x53 )
1120  *
1121  * @id_and_color: ID and color of the MAC
1122  * @action: action to perform, one of FW_CTXT_ACTION_*
1123  * @event_unique_id: If the action FW_CTXT_ACTION_REMOVE then the
1124  *	event_unique_id should be the id of the time event assigned by ucode.
1125  *	Otherwise ignore the event_unique_id.
1126  * @sta_id_and_color: station id and color, resumed during "Remain On Channel"
1127  *	activity.
1128  * @channel_info: channel info
1129  * @node_addr: Our MAC Address
1130  * @reserved: reserved for alignment
1131  * @apply_time: GP2 value to start (should always be the current GP2 value)
1132  * @apply_time_max_delay: Maximum apply time delay value in TU. Defines max
1133  *	time by which start of the event is allowed to be postponed.
1134  * @duration: event duration in TU To calculate event duration:
1135  *	timeEventDuration = min(duration, remainingQuota)
1136  */
1137 struct iwl_hs20_roc_req {
1138 	/* COMMON_INDEX_HDR_API_S_VER_1 hdr */
1139 	__le32 id_and_color;
1140 	__le32 action;
1141 	__le32 event_unique_id;
1142 	__le32 sta_id_and_color;
1143 	struct iwl_fw_channel_info channel_info;
1144 	u8 node_addr[ETH_ALEN];
1145 	__le16 reserved;
1146 	__le32 apply_time;
1147 	__le32 apply_time_max_delay;
1148 	__le32 duration;
1149 } __packed; /* HOT_SPOT_CMD_API_S_VER_1 */
1150 
1151 /*
1152  * values for AUX ROC result values
1153  */
1154 enum iwl_mvm_hot_spot {
1155 	HOT_SPOT_RSP_STATUS_OK,
1156 	HOT_SPOT_RSP_STATUS_TOO_MANY_EVENTS,
1157 	HOT_SPOT_MAX_NUM_OF_SESSIONS,
1158 };
1159 
1160 /*
1161  * Aux ROC command response
1162  *
1163  * In response to iwl_hs20_roc_req the FW sends this command to notify the
1164  * driver the uid of the timevent.
1165  *
1166  * ( HOT_SPOT_CMD 0x53 )
1167  *
1168  * @event_unique_id: Unique ID of time event assigned by ucode
1169  * @status: Return status 0 is success, all the rest used for specific errors
1170  */
1171 struct iwl_hs20_roc_res {
1172 	__le32 event_unique_id;
1173 	__le32 status;
1174 } __packed; /* HOT_SPOT_RSP_API_S_VER_1 */
1175 
1176 /**
1177  * struct iwl_radio_version_notif - information on the radio version
1178  * ( RADIO_VERSION_NOTIFICATION = 0x68 )
1179  * @radio_flavor:
1180  * @radio_step:
1181  * @radio_dash:
1182  */
1183 struct iwl_radio_version_notif {
1184 	__le32 radio_flavor;
1185 	__le32 radio_step;
1186 	__le32 radio_dash;
1187 } __packed; /* RADIO_VERSION_NOTOFICATION_S_VER_1 */
1188 
1189 enum iwl_card_state_flags {
1190 	CARD_ENABLED		= 0x00,
1191 	HW_CARD_DISABLED	= 0x01,
1192 	SW_CARD_DISABLED	= 0x02,
1193 	CT_KILL_CARD_DISABLED	= 0x04,
1194 	HALT_CARD_DISABLED	= 0x08,
1195 	CARD_DISABLED_MSK	= 0x0f,
1196 	CARD_IS_RX_ON		= 0x10,
1197 };
1198 
1199 /**
1200  * struct iwl_radio_version_notif - information on the radio version
1201  * ( CARD_STATE_NOTIFICATION = 0xa1 )
1202  * @flags: %iwl_card_state_flags
1203  */
1204 struct iwl_card_state_notif {
1205 	__le32 flags;
1206 } __packed; /* CARD_STATE_NTFY_API_S_VER_1 */
1207 
1208 /**
1209  * struct iwl_missed_beacons_notif - information on missed beacons
1210  * ( MISSED_BEACONS_NOTIFICATION = 0xa2 )
1211  * @mac_id: interface ID
1212  * @consec_missed_beacons_since_last_rx: number of consecutive missed
1213  *	beacons since last RX.
1214  * @consec_missed_beacons: number of consecutive missed beacons
1215  * @num_expected_beacons:
1216  * @num_recvd_beacons:
1217  */
1218 struct iwl_missed_beacons_notif {
1219 	__le32 mac_id;
1220 	__le32 consec_missed_beacons_since_last_rx;
1221 	__le32 consec_missed_beacons;
1222 	__le32 num_expected_beacons;
1223 	__le32 num_recvd_beacons;
1224 } __packed; /* MISSED_BEACON_NTFY_API_S_VER_3 */
1225 
1226 /**
1227  * struct iwl_mfuart_load_notif - mfuart image version & status
1228  * ( MFUART_LOAD_NOTIFICATION = 0xb1 )
1229  * @installed_ver: installed image version
1230  * @external_ver: external image version
1231  * @status: MFUART loading status
1232  * @duration: MFUART loading time
1233  * @image_size: MFUART image size in bytes
1234 */
1235 struct iwl_mfuart_load_notif {
1236 	__le32 installed_ver;
1237 	__le32 external_ver;
1238 	__le32 status;
1239 	__le32 duration;
1240 	/* image size valid only in v2 of the command */
1241 	__le32 image_size;
1242 } __packed; /*MFU_LOADER_NTFY_API_S_VER_2*/
1243 
1244 /**
1245  * struct iwl_mfu_assert_dump_notif - mfuart dump logs
1246  * ( MFU_ASSERT_DUMP_NTF = 0xfe )
1247  * @assert_id: mfuart assert id that cause the notif
1248  * @curr_reset_num: number of asserts since uptime
1249  * @index_num: current chunk id
1250  * @parts_num: total number of chunks
1251  * @data_size: number of data bytes sent
1252  * @data: data buffer
1253  */
1254 struct iwl_mfu_assert_dump_notif {
1255 	__le32   assert_id;
1256 	__le32   curr_reset_num;
1257 	__le16   index_num;
1258 	__le16   parts_num;
1259 	__le32   data_size;
1260 	__le32   data[0];
1261 } __packed; /*MFU_DUMP_ASSERT_API_S_VER_1*/
1262 
1263 /**
1264  * struct iwl_set_calib_default_cmd - set default value for calibration.
1265  * ( SET_CALIB_DEFAULT_CMD = 0x8e )
1266  * @calib_index: the calibration to set value for
1267  * @length: of data
1268  * @data: the value to set for the calibration result
1269  */
1270 struct iwl_set_calib_default_cmd {
1271 	__le16 calib_index;
1272 	__le16 length;
1273 	u8 data[0];
1274 } __packed; /* PHY_CALIB_OVERRIDE_VALUES_S */
1275 
1276 #define MAX_PORT_ID_NUM	2
1277 #define MAX_MCAST_FILTERING_ADDRESSES 256
1278 
1279 /**
1280  * struct iwl_mcast_filter_cmd - configure multicast filter.
1281  * @filter_own: Set 1 to filter out multicast packets sent by station itself
1282  * @port_id:	Multicast MAC addresses array specifier. This is a strange way
1283  *		to identify network interface adopted in host-device IF.
1284  *		It is used by FW as index in array of addresses. This array has
1285  *		MAX_PORT_ID_NUM members.
1286  * @count:	Number of MAC addresses in the array
1287  * @pass_all:	Set 1 to pass all multicast packets.
1288  * @bssid:	current association BSSID.
1289  * @addr_list:	Place holder for array of MAC addresses.
1290  *		IMPORTANT: add padding if necessary to ensure DWORD alignment.
1291  */
1292 struct iwl_mcast_filter_cmd {
1293 	u8 filter_own;
1294 	u8 port_id;
1295 	u8 count;
1296 	u8 pass_all;
1297 	u8 bssid[6];
1298 	u8 reserved[2];
1299 	u8 addr_list[0];
1300 } __packed; /* MCAST_FILTERING_CMD_API_S_VER_1 */
1301 
1302 #define MAX_BCAST_FILTERS 8
1303 #define MAX_BCAST_FILTER_ATTRS 2
1304 
1305 /**
1306  * enum iwl_mvm_bcast_filter_attr_offset - written by fw for each Rx packet
1307  * @BCAST_FILTER_OFFSET_PAYLOAD_START: offset is from payload start.
1308  * @BCAST_FILTER_OFFSET_IP_END: offset is from ip header end (i.e.
1309  *	start of ip payload).
1310  */
1311 enum iwl_mvm_bcast_filter_attr_offset {
1312 	BCAST_FILTER_OFFSET_PAYLOAD_START = 0,
1313 	BCAST_FILTER_OFFSET_IP_END = 1,
1314 };
1315 
1316 /**
1317  * struct iwl_fw_bcast_filter_attr - broadcast filter attribute
1318  * @offset_type:	&enum iwl_mvm_bcast_filter_attr_offset.
1319  * @offset:	starting offset of this pattern.
1320  * @val:		value to match - big endian (MSB is the first
1321  *		byte to match from offset pos).
1322  * @mask:	mask to match (big endian).
1323  */
1324 struct iwl_fw_bcast_filter_attr {
1325 	u8 offset_type;
1326 	u8 offset;
1327 	__le16 reserved1;
1328 	__be32 val;
1329 	__be32 mask;
1330 } __packed; /* BCAST_FILTER_ATT_S_VER_1 */
1331 
1332 /**
1333  * enum iwl_mvm_bcast_filter_frame_type - filter frame type
1334  * @BCAST_FILTER_FRAME_TYPE_ALL: consider all frames.
1335  * @BCAST_FILTER_FRAME_TYPE_IPV4: consider only ipv4 frames
1336  */
1337 enum iwl_mvm_bcast_filter_frame_type {
1338 	BCAST_FILTER_FRAME_TYPE_ALL = 0,
1339 	BCAST_FILTER_FRAME_TYPE_IPV4 = 1,
1340 };
1341 
1342 /**
1343  * struct iwl_fw_bcast_filter - broadcast filter
1344  * @discard: discard frame (1) or let it pass (0).
1345  * @frame_type: &enum iwl_mvm_bcast_filter_frame_type.
1346  * @num_attrs: number of valid attributes in this filter.
1347  * @attrs: attributes of this filter. a filter is considered matched
1348  *	only when all its attributes are matched (i.e. AND relationship)
1349  */
1350 struct iwl_fw_bcast_filter {
1351 	u8 discard;
1352 	u8 frame_type;
1353 	u8 num_attrs;
1354 	u8 reserved1;
1355 	struct iwl_fw_bcast_filter_attr attrs[MAX_BCAST_FILTER_ATTRS];
1356 } __packed; /* BCAST_FILTER_S_VER_1 */
1357 
1358 #define BA_WINDOW_STREAMS_MAX		16
1359 #define BA_WINDOW_STATUS_TID_MSK	0x000F
1360 #define BA_WINDOW_STATUS_STA_ID_POS	4
1361 #define BA_WINDOW_STATUS_STA_ID_MSK	0x01F0
1362 #define BA_WINDOW_STATUS_VALID_MSK	BIT(9)
1363 
1364 /**
1365  * struct iwl_ba_window_status_notif - reordering window's status notification
1366  * @bitmap: bitmap of received frames [start_seq_num + 0]..[start_seq_num + 63]
1367  * @ra_tid: bit 3:0 - TID, bit 8:4 - STA_ID, bit 9 - valid
1368  * @start_seq_num: the start sequence number of the bitmap
1369  * @mpdu_rx_count: the number of received MPDUs since entering D0i3
1370  */
1371 struct iwl_ba_window_status_notif {
1372 	__le64 bitmap[BA_WINDOW_STREAMS_MAX];
1373 	__le16 ra_tid[BA_WINDOW_STREAMS_MAX];
1374 	__le32 start_seq_num[BA_WINDOW_STREAMS_MAX];
1375 	__le16 mpdu_rx_count[BA_WINDOW_STREAMS_MAX];
1376 } __packed; /* BA_WINDOW_STATUS_NTFY_API_S_VER_1 */
1377 
1378 /**
1379  * struct iwl_fw_bcast_mac - per-mac broadcast filtering configuration.
1380  * @default_discard: default action for this mac (discard (1) / pass (0)).
1381  * @attached_filters: bitmap of relevant filters for this mac.
1382  */
1383 struct iwl_fw_bcast_mac {
1384 	u8 default_discard;
1385 	u8 reserved1;
1386 	__le16 attached_filters;
1387 } __packed; /* BCAST_MAC_CONTEXT_S_VER_1 */
1388 
1389 /**
1390  * struct iwl_bcast_filter_cmd - broadcast filtering configuration
1391  * @disable: enable (0) / disable (1)
1392  * @max_bcast_filters: max number of filters (MAX_BCAST_FILTERS)
1393  * @max_macs: max number of macs (NUM_MAC_INDEX_DRIVER)
1394  * @filters: broadcast filters
1395  * @macs: broadcast filtering configuration per-mac
1396  */
1397 struct iwl_bcast_filter_cmd {
1398 	u8 disable;
1399 	u8 max_bcast_filters;
1400 	u8 max_macs;
1401 	u8 reserved1;
1402 	struct iwl_fw_bcast_filter filters[MAX_BCAST_FILTERS];
1403 	struct iwl_fw_bcast_mac macs[NUM_MAC_INDEX_DRIVER];
1404 } __packed; /* BCAST_FILTERING_HCMD_API_S_VER_1 */
1405 
1406 /*
1407  * enum iwl_mvm_marker_id - maker ids
1408  *
1409  * The ids for different type of markers to insert into the usniffer logs
1410  */
1411 enum iwl_mvm_marker_id {
1412 	MARKER_ID_TX_FRAME_LATENCY = 1,
1413 }; /* MARKER_ID_API_E_VER_1 */
1414 
1415 /**
1416  * struct iwl_mvm_marker - mark info into the usniffer logs
1417  *
1418  * (MARKER_CMD = 0xcb)
1419  *
1420  * Mark the UTC time stamp into the usniffer logs together with additional
1421  * metadata, so the usniffer output can be parsed.
1422  * In the command response the ucode will return the GP2 time.
1423  *
1424  * @dw_len: The amount of dwords following this byte including this byte.
1425  * @marker_id: A unique marker id (iwl_mvm_marker_id).
1426  * @reserved: reserved.
1427  * @timestamp: in milliseconds since 1970-01-01 00:00:00 UTC
1428  * @metadata: additional meta data that will be written to the unsiffer log
1429  */
1430 struct iwl_mvm_marker {
1431 	u8 dwLen;
1432 	u8 markerId;
1433 	__le16 reserved;
1434 	__le64 timestamp;
1435 	__le32 metadata[0];
1436 } __packed; /* MARKER_API_S_VER_1 */
1437 
1438 /*
1439  * enum iwl_dc2dc_config_id - flag ids
1440  *
1441  * Ids of dc2dc configuration flags
1442  */
1443 enum iwl_dc2dc_config_id {
1444 	DCDC_LOW_POWER_MODE_MSK_SET  = 0x1, /* not used */
1445 	DCDC_FREQ_TUNE_SET = 0x2,
1446 }; /* MARKER_ID_API_E_VER_1 */
1447 
1448 /**
1449  * struct iwl_dc2dc_config_cmd - configure dc2dc values
1450  *
1451  * (DC2DC_CONFIG_CMD = 0x83)
1452  *
1453  * Set/Get & configure dc2dc values.
1454  * The command always returns the current dc2dc values.
1455  *
1456  * @flags: set/get dc2dc
1457  * @enable_low_power_mode: not used.
1458  * @dc2dc_freq_tune0: frequency divider - digital domain
1459  * @dc2dc_freq_tune1: frequency divider - analog domain
1460  */
1461 struct iwl_dc2dc_config_cmd {
1462 	__le32 flags;
1463 	__le32 enable_low_power_mode; /* not used */
1464 	__le32 dc2dc_freq_tune0;
1465 	__le32 dc2dc_freq_tune1;
1466 } __packed; /* DC2DC_CONFIG_CMD_API_S_VER_1 */
1467 
1468 /**
1469  * struct iwl_dc2dc_config_resp - response for iwl_dc2dc_config_cmd
1470  *
1471  * Current dc2dc values returned by the FW.
1472  *
1473  * @dc2dc_freq_tune0: frequency divider - digital domain
1474  * @dc2dc_freq_tune1: frequency divider - analog domain
1475  */
1476 struct iwl_dc2dc_config_resp {
1477 	__le32 dc2dc_freq_tune0;
1478 	__le32 dc2dc_freq_tune1;
1479 } __packed; /* DC2DC_CONFIG_RESP_API_S_VER_1 */
1480 
1481 /***********************************
1482  * Smart Fifo API
1483  ***********************************/
1484 /* Smart Fifo state */
1485 enum iwl_sf_state {
1486 	SF_LONG_DELAY_ON = 0, /* should never be called by driver */
1487 	SF_FULL_ON,
1488 	SF_UNINIT,
1489 	SF_INIT_OFF,
1490 	SF_HW_NUM_STATES
1491 };
1492 
1493 /* Smart Fifo possible scenario */
1494 enum iwl_sf_scenario {
1495 	SF_SCENARIO_SINGLE_UNICAST,
1496 	SF_SCENARIO_AGG_UNICAST,
1497 	SF_SCENARIO_MULTICAST,
1498 	SF_SCENARIO_BA_RESP,
1499 	SF_SCENARIO_TX_RESP,
1500 	SF_NUM_SCENARIO
1501 };
1502 
1503 #define SF_TRANSIENT_STATES_NUMBER 2	/* SF_LONG_DELAY_ON and SF_FULL_ON */
1504 #define SF_NUM_TIMEOUT_TYPES 2		/* Aging timer and Idle timer */
1505 
1506 /* smart FIFO default values */
1507 #define SF_W_MARK_SISO 6144
1508 #define SF_W_MARK_MIMO2 8192
1509 #define SF_W_MARK_MIMO3 6144
1510 #define SF_W_MARK_LEGACY 4096
1511 #define SF_W_MARK_SCAN 4096
1512 
1513 /* SF Scenarios timers for default configuration (aligned to 32 uSec) */
1514 #define SF_SINGLE_UNICAST_IDLE_TIMER_DEF 160	/* 150 uSec  */
1515 #define SF_SINGLE_UNICAST_AGING_TIMER_DEF 400	/* 0.4 mSec */
1516 #define SF_AGG_UNICAST_IDLE_TIMER_DEF 160		/* 150 uSec */
1517 #define SF_AGG_UNICAST_AGING_TIMER_DEF 400		/* 0.4 mSec */
1518 #define SF_MCAST_IDLE_TIMER_DEF 160		/* 150 mSec */
1519 #define SF_MCAST_AGING_TIMER_DEF 400		/* 0.4 mSec */
1520 #define SF_BA_IDLE_TIMER_DEF 160			/* 150 uSec */
1521 #define SF_BA_AGING_TIMER_DEF 400			/* 0.4 mSec */
1522 #define SF_TX_RE_IDLE_TIMER_DEF 160			/* 150 uSec */
1523 #define SF_TX_RE_AGING_TIMER_DEF 400		/* 0.4 mSec */
1524 
1525 /* SF Scenarios timers for BSS MAC configuration (aligned to 32 uSec) */
1526 #define SF_SINGLE_UNICAST_IDLE_TIMER 320	/* 300 uSec  */
1527 #define SF_SINGLE_UNICAST_AGING_TIMER 2016	/* 2 mSec */
1528 #define SF_AGG_UNICAST_IDLE_TIMER 320		/* 300 uSec */
1529 #define SF_AGG_UNICAST_AGING_TIMER 2016		/* 2 mSec */
1530 #define SF_MCAST_IDLE_TIMER 2016		/* 2 mSec */
1531 #define SF_MCAST_AGING_TIMER 10016		/* 10 mSec */
1532 #define SF_BA_IDLE_TIMER 320			/* 300 uSec */
1533 #define SF_BA_AGING_TIMER 2016			/* 2 mSec */
1534 #define SF_TX_RE_IDLE_TIMER 320			/* 300 uSec */
1535 #define SF_TX_RE_AGING_TIMER 2016		/* 2 mSec */
1536 
1537 #define SF_LONG_DELAY_AGING_TIMER 1000000	/* 1 Sec */
1538 
1539 #define SF_CFG_DUMMY_NOTIF_OFF	BIT(16)
1540 
1541 /**
1542  * Smart Fifo configuration command.
1543  * @state: smart fifo state, types listed in enum %iwl_sf_sate.
1544  * @watermark: Minimum allowed availabe free space in RXF for transient state.
1545  * @long_delay_timeouts: aging and idle timer values for each scenario
1546  * in long delay state.
1547  * @full_on_timeouts: timer values for each scenario in full on state.
1548  */
1549 struct iwl_sf_cfg_cmd {
1550 	__le32 state;
1551 	__le32 watermark[SF_TRANSIENT_STATES_NUMBER];
1552 	__le32 long_delay_timeouts[SF_NUM_SCENARIO][SF_NUM_TIMEOUT_TYPES];
1553 	__le32 full_on_timeouts[SF_NUM_SCENARIO][SF_NUM_TIMEOUT_TYPES];
1554 } __packed; /* SF_CFG_API_S_VER_2 */
1555 
1556 /***********************************
1557  * Location Aware Regulatory (LAR) API - MCC updates
1558  ***********************************/
1559 
1560 /**
1561  * struct iwl_mcc_update_cmd_v1 - Request the device to update geographic
1562  * regulatory profile according to the given MCC (Mobile Country Code).
1563  * The MCC is two letter-code, ascii upper case[A-Z] or '00' for world domain.
1564  * 'ZZ' MCC will be used to switch to NVM default profile; in this case, the
1565  * MCC in the cmd response will be the relevant MCC in the NVM.
1566  * @mcc: given mobile country code
1567  * @source_id: the source from where we got the MCC, see iwl_mcc_source
1568  * @reserved: reserved for alignment
1569  */
1570 struct iwl_mcc_update_cmd_v1 {
1571 	__le16 mcc;
1572 	u8 source_id;
1573 	u8 reserved;
1574 } __packed; /* LAR_UPDATE_MCC_CMD_API_S_VER_1 */
1575 
1576 /**
1577  * struct iwl_mcc_update_cmd - Request the device to update geographic
1578  * regulatory profile according to the given MCC (Mobile Country Code).
1579  * The MCC is two letter-code, ascii upper case[A-Z] or '00' for world domain.
1580  * 'ZZ' MCC will be used to switch to NVM default profile; in this case, the
1581  * MCC in the cmd response will be the relevant MCC in the NVM.
1582  * @mcc: given mobile country code
1583  * @source_id: the source from where we got the MCC, see iwl_mcc_source
1584  * @reserved: reserved for alignment
1585  * @key: integrity key for MCC API OEM testing
1586  * @reserved2: reserved
1587  */
1588 struct iwl_mcc_update_cmd {
1589 	__le16 mcc;
1590 	u8 source_id;
1591 	u8 reserved;
1592 	__le32 key;
1593 	__le32 reserved2[5];
1594 } __packed; /* LAR_UPDATE_MCC_CMD_API_S_VER_2 */
1595 
1596 /**
1597  * iwl_mcc_update_resp_v1  - response to MCC_UPDATE_CMD.
1598  * Contains the new channel control profile map, if changed, and the new MCC
1599  * (mobile country code).
1600  * The new MCC may be different than what was requested in MCC_UPDATE_CMD.
1601  * @status: see &enum iwl_mcc_update_status
1602  * @mcc: the new applied MCC
1603  * @cap: capabilities for all channels which matches the MCC
1604  * @source_id: the MCC source, see iwl_mcc_source
1605  * @n_channels: number of channels in @channels_data (may be 14, 39, 50 or 51
1606  *		channels, depending on platform)
1607  * @channels: channel control data map, DWORD for each channel. Only the first
1608  *	16bits are used.
1609  */
1610 struct iwl_mcc_update_resp_v1  {
1611 	__le32 status;
1612 	__le16 mcc;
1613 	u8 cap;
1614 	u8 source_id;
1615 	__le32 n_channels;
1616 	__le32 channels[0];
1617 } __packed; /* LAR_UPDATE_MCC_CMD_RESP_S_VER_1 */
1618 
1619 /**
1620  * iwl_mcc_update_resp - response to MCC_UPDATE_CMD.
1621  * Contains the new channel control profile map, if changed, and the new MCC
1622  * (mobile country code).
1623  * The new MCC may be different than what was requested in MCC_UPDATE_CMD.
1624  * @status: see &enum iwl_mcc_update_status
1625  * @mcc: the new applied MCC
1626  * @cap: capabilities for all channels which matches the MCC
1627  * @source_id: the MCC source, see iwl_mcc_source
1628  * @time: time elapsed from the MCC test start (in 30 seconds TU)
1629  * @reserved: reserved.
1630  * @n_channels: number of channels in @channels_data (may be 14, 39, 50 or 51
1631  *		channels, depending on platform)
1632  * @channels: channel control data map, DWORD for each channel. Only the first
1633  *	16bits are used.
1634  */
1635 struct iwl_mcc_update_resp {
1636 	__le32 status;
1637 	__le16 mcc;
1638 	u8 cap;
1639 	u8 source_id;
1640 	__le16 time;
1641 	__le16 reserved;
1642 	__le32 n_channels;
1643 	__le32 channels[0];
1644 } __packed; /* LAR_UPDATE_MCC_CMD_RESP_S_VER_2 */
1645 
1646 /**
1647  * struct iwl_mcc_chub_notif - chub notifies of mcc change
1648  * (MCC_CHUB_UPDATE_CMD = 0xc9)
1649  * The Chub (Communication Hub, CommsHUB) is a HW component that connects to
1650  * the cellular and connectivity cores that gets updates of the mcc, and
1651  * notifies the ucode directly of any mcc change.
1652  * The ucode requests the driver to request the device to update geographic
1653  * regulatory  profile according to the given MCC (Mobile Country Code).
1654  * The MCC is two letter-code, ascii upper case[A-Z] or '00' for world domain.
1655  * 'ZZ' MCC will be used to switch to NVM default profile; in this case, the
1656  * MCC in the cmd response will be the relevant MCC in the NVM.
1657  * @mcc: given mobile country code
1658  * @source_id: identity of the change originator, see iwl_mcc_source
1659  * @reserved1: reserved for alignment
1660  */
1661 struct iwl_mcc_chub_notif {
1662 	u16 mcc;
1663 	u8 source_id;
1664 	u8 reserved1;
1665 } __packed; /* LAR_MCC_NOTIFY_S */
1666 
1667 enum iwl_mcc_update_status {
1668 	MCC_RESP_NEW_CHAN_PROFILE,
1669 	MCC_RESP_SAME_CHAN_PROFILE,
1670 	MCC_RESP_INVALID,
1671 	MCC_RESP_NVM_DISABLED,
1672 	MCC_RESP_ILLEGAL,
1673 	MCC_RESP_LOW_PRIORITY,
1674 	MCC_RESP_TEST_MODE_ACTIVE,
1675 	MCC_RESP_TEST_MODE_NOT_ACTIVE,
1676 	MCC_RESP_TEST_MODE_DENIAL_OF_SERVICE,
1677 };
1678 
1679 enum iwl_mcc_source {
1680 	MCC_SOURCE_OLD_FW = 0,
1681 	MCC_SOURCE_ME = 1,
1682 	MCC_SOURCE_BIOS = 2,
1683 	MCC_SOURCE_3G_LTE_HOST = 3,
1684 	MCC_SOURCE_3G_LTE_DEVICE = 4,
1685 	MCC_SOURCE_WIFI = 5,
1686 	MCC_SOURCE_RESERVED = 6,
1687 	MCC_SOURCE_DEFAULT = 7,
1688 	MCC_SOURCE_UNINITIALIZED = 8,
1689 	MCC_SOURCE_MCC_API = 9,
1690 	MCC_SOURCE_GET_CURRENT = 0x10,
1691 	MCC_SOURCE_GETTING_MCC_TEST_MODE = 0x11,
1692 };
1693 
1694 /* DTS measurements */
1695 
1696 enum iwl_dts_measurement_flags {
1697 	DTS_TRIGGER_CMD_FLAGS_TEMP	= BIT(0),
1698 	DTS_TRIGGER_CMD_FLAGS_VOLT	= BIT(1),
1699 };
1700 
1701 /**
1702  * iwl_dts_measurement_cmd - request DTS temperature and/or voltage measurements
1703  *
1704  * @flags: indicates which measurements we want as specified in &enum
1705  *	   iwl_dts_measurement_flags
1706  */
1707 struct iwl_dts_measurement_cmd {
1708 	__le32 flags;
1709 } __packed; /* TEMPERATURE_MEASUREMENT_TRIGGER_CMD_S */
1710 
1711 /**
1712 * enum iwl_dts_control_measurement_mode - DTS measurement type
1713 * @DTS_AUTOMATIC: Automatic mode (full SW control). Provide temperature read
1714 *                 back (latest value. Not waiting for new value). Use automatic
1715 *                 SW DTS configuration.
1716 * @DTS_REQUEST_READ: Request DTS read. Configure DTS with manual settings,
1717 *                    trigger DTS reading and provide read back temperature read
1718 *                    when available.
1719 * @DTS_OVER_WRITE: over-write the DTS temperatures in the SW until next read
1720 * @DTS_DIRECT_WITHOUT_MEASURE: DTS returns its latest temperature result,
1721 *                              without measurement trigger.
1722 */
1723 enum iwl_dts_control_measurement_mode {
1724 	DTS_AUTOMATIC			= 0,
1725 	DTS_REQUEST_READ		= 1,
1726 	DTS_OVER_WRITE			= 2,
1727 	DTS_DIRECT_WITHOUT_MEASURE	= 3,
1728 };
1729 
1730 /**
1731 * enum iwl_dts_used - DTS to use or used for measurement in the DTS request
1732 * @DTS_USE_TOP: Top
1733 * @DTS_USE_CHAIN_A: chain A
1734 * @DTS_USE_CHAIN_B: chain B
1735 * @DTS_USE_CHAIN_C: chain C
1736 * @XTAL_TEMPERATURE - read temperature from xtal
1737 */
1738 enum iwl_dts_used {
1739 	DTS_USE_TOP		= 0,
1740 	DTS_USE_CHAIN_A		= 1,
1741 	DTS_USE_CHAIN_B		= 2,
1742 	DTS_USE_CHAIN_C		= 3,
1743 	XTAL_TEMPERATURE	= 4,
1744 };
1745 
1746 /**
1747 * enum iwl_dts_bit_mode - bit-mode to use in DTS request read mode
1748 * @DTS_BIT6_MODE: bit 6 mode
1749 * @DTS_BIT8_MODE: bit 8 mode
1750 */
1751 enum iwl_dts_bit_mode {
1752 	DTS_BIT6_MODE	= 0,
1753 	DTS_BIT8_MODE	= 1,
1754 };
1755 
1756 /**
1757  * iwl_ext_dts_measurement_cmd - request extended DTS temperature measurements
1758  * @control_mode: see &enum iwl_dts_control_measurement_mode
1759  * @temperature: used when over write DTS mode is selected
1760  * @sensor: set temperature sensor to use. See &enum iwl_dts_used
1761  * @avg_factor: average factor to DTS in request DTS read mode
1762  * @bit_mode: value defines the DTS bit mode to use. See &enum iwl_dts_bit_mode
1763  * @step_duration: step duration for the DTS
1764  */
1765 struct iwl_ext_dts_measurement_cmd {
1766 	__le32 control_mode;
1767 	__le32 temperature;
1768 	__le32 sensor;
1769 	__le32 avg_factor;
1770 	__le32 bit_mode;
1771 	__le32 step_duration;
1772 } __packed; /* XVT_FW_DTS_CONTROL_MEASUREMENT_REQUEST_API_S */
1773 
1774 /**
1775  * struct iwl_dts_measurement_notif_v1 - measurements notification
1776  *
1777  * @temp: the measured temperature
1778  * @voltage: the measured voltage
1779  */
1780 struct iwl_dts_measurement_notif_v1 {
1781 	__le32 temp;
1782 	__le32 voltage;
1783 } __packed; /* TEMPERATURE_MEASUREMENT_TRIGGER_NTFY_S_VER_1*/
1784 
1785 /**
1786  * struct iwl_dts_measurement_notif_v2 - measurements notification
1787  *
1788  * @temp: the measured temperature
1789  * @voltage: the measured voltage
1790  * @threshold_idx: the trip index that was crossed
1791  */
1792 struct iwl_dts_measurement_notif_v2 {
1793 	__le32 temp;
1794 	__le32 voltage;
1795 	__le32 threshold_idx;
1796 } __packed; /* TEMPERATURE_MEASUREMENT_TRIGGER_NTFY_S_VER_2 */
1797 
1798 /**
1799  * struct ct_kill_notif - CT-kill entry notification
1800  *
1801  * @temperature: the current temperature in celsius
1802  * @reserved: reserved
1803  */
1804 struct ct_kill_notif {
1805 	__le16 temperature;
1806 	__le16 reserved;
1807 } __packed; /* GRP_PHY_CT_KILL_NTF */
1808 
1809 /**
1810 * enum ctdp_cmd_operation - CTDP command operations
1811 * @CTDP_CMD_OPERATION_START: update the current budget
1812 * @CTDP_CMD_OPERATION_STOP: stop ctdp
1813 * @CTDP_CMD_OPERATION_REPORT: get the avgerage budget
1814 */
1815 enum iwl_mvm_ctdp_cmd_operation {
1816 	CTDP_CMD_OPERATION_START	= 0x1,
1817 	CTDP_CMD_OPERATION_STOP		= 0x2,
1818 	CTDP_CMD_OPERATION_REPORT	= 0x4,
1819 };/* CTDP_CMD_OPERATION_TYPE_E */
1820 
1821 /**
1822  * struct iwl_mvm_ctdp_cmd - track and manage the FW power consumption budget
1823  *
1824  * @operation: see &enum iwl_mvm_ctdp_cmd_operation
1825  * @budget: the budget in milliwatt
1826  * @window_size: defined in API but not used
1827  */
1828 struct iwl_mvm_ctdp_cmd {
1829 	__le32 operation;
1830 	__le32 budget;
1831 	__le32 window_size;
1832 } __packed;
1833 
1834 #define IWL_MAX_DTS_TRIPS	8
1835 
1836 /**
1837  * struct iwl_temp_report_ths_cmd - set temperature thresholds
1838  *
1839  * @num_temps: number of temperature thresholds passed
1840  * @thresholds: array with the thresholds to be configured
1841  */
1842 struct temp_report_ths_cmd {
1843 	__le32 num_temps;
1844 	__le16 thresholds[IWL_MAX_DTS_TRIPS];
1845 } __packed; /* GRP_PHY_TEMP_REPORTING_THRESHOLDS_CMD */
1846 
1847 /***********************************
1848  * TDLS API
1849  ***********************************/
1850 
1851 /* Type of TDLS request */
1852 enum iwl_tdls_channel_switch_type {
1853 	TDLS_SEND_CHAN_SW_REQ = 0,
1854 	TDLS_SEND_CHAN_SW_RESP_AND_MOVE_CH,
1855 	TDLS_MOVE_CH,
1856 }; /* TDLS_STA_CHANNEL_SWITCH_CMD_TYPE_API_E_VER_1 */
1857 
1858 /**
1859  * Switch timing sub-element in a TDLS channel-switch command
1860  * @frame_timestamp: GP2 timestamp of channel-switch request/response packet
1861  *	received from peer
1862  * @max_offchan_duration: What amount of microseconds out of a DTIM is given
1863  *	to the TDLS off-channel communication. For instance if the DTIM is
1864  *	200TU and the TDLS peer is to be given 25% of the time, the value
1865  *	given will be 50TU, or 50 * 1024 if translated into microseconds.
1866  * @switch_time: switch time the peer sent in its channel switch timing IE
1867  * @switch_timout: switch timeout the peer sent in its channel switch timing IE
1868  */
1869 struct iwl_tdls_channel_switch_timing {
1870 	__le32 frame_timestamp; /* GP2 time of peer packet Rx */
1871 	__le32 max_offchan_duration; /* given in micro-seconds */
1872 	__le32 switch_time; /* given in micro-seconds */
1873 	__le32 switch_timeout; /* given in micro-seconds */
1874 } __packed; /* TDLS_STA_CHANNEL_SWITCH_TIMING_DATA_API_S_VER_1 */
1875 
1876 #define IWL_TDLS_CH_SW_FRAME_MAX_SIZE 200
1877 
1878 /**
1879  * TDLS channel switch frame template
1880  *
1881  * A template representing a TDLS channel-switch request or response frame
1882  *
1883  * @switch_time_offset: offset to the channel switch timing IE in the template
1884  * @tx_cmd: Tx parameters for the frame
1885  * @data: frame data
1886  */
1887 struct iwl_tdls_channel_switch_frame {
1888 	__le32 switch_time_offset;
1889 	struct iwl_tx_cmd tx_cmd;
1890 	u8 data[IWL_TDLS_CH_SW_FRAME_MAX_SIZE];
1891 } __packed; /* TDLS_STA_CHANNEL_SWITCH_FRAME_API_S_VER_1 */
1892 
1893 /**
1894  * TDLS channel switch command
1895  *
1896  * The command is sent to initiate a channel switch and also in response to
1897  * incoming TDLS channel-switch request/response packets from remote peers.
1898  *
1899  * @switch_type: see &enum iwl_tdls_channel_switch_type
1900  * @peer_sta_id: station id of TDLS peer
1901  * @ci: channel we switch to
1902  * @timing: timing related data for command
1903  * @frame: channel-switch request/response template, depending to switch_type
1904  */
1905 struct iwl_tdls_channel_switch_cmd {
1906 	u8 switch_type;
1907 	__le32 peer_sta_id;
1908 	struct iwl_fw_channel_info ci;
1909 	struct iwl_tdls_channel_switch_timing timing;
1910 	struct iwl_tdls_channel_switch_frame frame;
1911 } __packed; /* TDLS_STA_CHANNEL_SWITCH_CMD_API_S_VER_1 */
1912 
1913 /**
1914  * TDLS channel switch start notification
1915  *
1916  * @status: non-zero on success
1917  * @offchannel_duration: duration given in microseconds
1918  * @sta_id: peer currently performing the channel-switch with
1919  */
1920 struct iwl_tdls_channel_switch_notif {
1921 	__le32 status;
1922 	__le32 offchannel_duration;
1923 	__le32 sta_id;
1924 } __packed; /* TDLS_STA_CHANNEL_SWITCH_NTFY_API_S_VER_1 */
1925 
1926 /**
1927  * TDLS station info
1928  *
1929  * @sta_id: station id of the TDLS peer
1930  * @tx_to_peer_tid: TID reserved vs. the peer for FW based Tx
1931  * @tx_to_peer_ssn: initial SSN the FW should use for Tx on its TID vs the peer
1932  * @is_initiator: 1 if the peer is the TDLS link initiator, 0 otherwise
1933  */
1934 struct iwl_tdls_sta_info {
1935 	u8 sta_id;
1936 	u8 tx_to_peer_tid;
1937 	__le16 tx_to_peer_ssn;
1938 	__le32 is_initiator;
1939 } __packed; /* TDLS_STA_INFO_VER_1 */
1940 
1941 /**
1942  * TDLS basic config command
1943  *
1944  * @id_and_color: MAC id and color being configured
1945  * @tdls_peer_count: amount of currently connected TDLS peers
1946  * @tx_to_ap_tid: TID reverved vs. the AP for FW based Tx
1947  * @tx_to_ap_ssn: initial SSN the FW should use for Tx on its TID vs. the AP
1948  * @sta_info: per-station info. Only the first tdls_peer_count entries are set
1949  * @pti_req_data_offset: offset of network-level data for the PTI template
1950  * @pti_req_tx_cmd: Tx parameters for PTI request template
1951  * @pti_req_template: PTI request template data
1952  */
1953 struct iwl_tdls_config_cmd {
1954 	__le32 id_and_color; /* mac id and color */
1955 	u8 tdls_peer_count;
1956 	u8 tx_to_ap_tid;
1957 	__le16 tx_to_ap_ssn;
1958 	struct iwl_tdls_sta_info sta_info[IWL_MVM_TDLS_STA_COUNT];
1959 
1960 	__le32 pti_req_data_offset;
1961 	struct iwl_tx_cmd pti_req_tx_cmd;
1962 	u8 pti_req_template[0];
1963 } __packed; /* TDLS_CONFIG_CMD_API_S_VER_1 */
1964 
1965 /**
1966  * TDLS per-station config information from FW
1967  *
1968  * @sta_id: station id of the TDLS peer
1969  * @tx_to_peer_last_seq: last sequence number used by FW during FW-based Tx to
1970  *	the peer
1971  */
1972 struct iwl_tdls_config_sta_info_res {
1973 	__le16 sta_id;
1974 	__le16 tx_to_peer_last_seq;
1975 } __packed; /* TDLS_STA_INFO_RSP_VER_1 */
1976 
1977 /**
1978  * TDLS config information from FW
1979  *
1980  * @tx_to_ap_last_seq: last sequence number used by FW during FW-based Tx to AP
1981  * @sta_info: per-station TDLS config information
1982  */
1983 struct iwl_tdls_config_res {
1984 	__le32 tx_to_ap_last_seq;
1985 	struct iwl_tdls_config_sta_info_res sta_info[IWL_MVM_TDLS_STA_COUNT];
1986 } __packed; /* TDLS_CONFIG_RSP_API_S_VER_1 */
1987 
1988 #define TX_FIFO_MAX_NUM_9000		8
1989 #define TX_FIFO_MAX_NUM			15
1990 #define RX_FIFO_MAX_NUM			2
1991 #define TX_FIFO_INTERNAL_MAX_NUM	6
1992 
1993 /**
1994  * Shared memory configuration information from the FW
1995  *
1996  * @shared_mem_addr: shared memory addr (pre 8000 HW set to 0x0 as MARBH is not
1997  *	accessible)
1998  * @shared_mem_size: shared memory size
1999  * @sample_buff_addr: internal sample (mon/adc) buff addr (pre 8000 HW set to
2000  *	0x0 as accessible only via DBGM RDAT)
2001  * @sample_buff_size: internal sample buff size
2002  * @txfifo_addr: start addr of TXF0 (excluding the context table 0.5KB), (pre
2003  *	8000 HW set to 0x0 as not accessible)
2004  * @txfifo_size: size of TXF0 ... TXF7
2005  * @rxfifo_size: RXF1, RXF2 sizes. If there is no RXF2, it'll have a value of 0
2006  * @page_buff_addr: used by UMAC and performance debug (page miss analysis),
2007  *	when paging is not supported this should be 0
2008  * @page_buff_size: size of %page_buff_addr
2009  * @rxfifo_addr: Start address of rxFifo
2010  * @internal_txfifo_addr: start address of internalFifo
2011  * @internal_txfifo_size: internal fifos' size
2012  *
2013  * NOTE: on firmware that don't have IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG
2014  *	 set, the last 3 members don't exist.
2015  */
2016 struct iwl_shared_mem_cfg_v1 {
2017 	__le32 shared_mem_addr;
2018 	__le32 shared_mem_size;
2019 	__le32 sample_buff_addr;
2020 	__le32 sample_buff_size;
2021 	__le32 txfifo_addr;
2022 	__le32 txfifo_size[TX_FIFO_MAX_NUM_9000];
2023 	__le32 rxfifo_size[RX_FIFO_MAX_NUM];
2024 	__le32 page_buff_addr;
2025 	__le32 page_buff_size;
2026 	__le32 rxfifo_addr;
2027 	__le32 internal_txfifo_addr;
2028 	__le32 internal_txfifo_size[TX_FIFO_INTERNAL_MAX_NUM];
2029 } __packed; /* SHARED_MEM_ALLOC_API_S_VER_2 */
2030 
2031 /**
2032  * struct iwl_shared_mem_lmac_cfg - LMAC shared memory configuration
2033  *
2034  * @txfifo_addr: start addr of TXF0 (excluding the context table 0.5KB)
2035  * @txfifo_size: size of TX FIFOs
2036  * @rxfifo1_addr: RXF1 addr
2037  * @rxfifo1_size: RXF1 size
2038  */
2039 struct iwl_shared_mem_lmac_cfg {
2040 	__le32 txfifo_addr;
2041 	__le32 txfifo_size[TX_FIFO_MAX_NUM];
2042 	__le32 rxfifo1_addr;
2043 	__le32 rxfifo1_size;
2044 
2045 } __packed; /* SHARED_MEM_ALLOC_LMAC_API_S_VER_1 */
2046 
2047 /**
2048  * Shared memory configuration information from the FW
2049  *
2050  * @shared_mem_addr: shared memory address
2051  * @shared_mem_size: shared memory size
2052  * @sample_buff_addr: internal sample (mon/adc) buff addr
2053  * @sample_buff_size: internal sample buff size
2054  * @rxfifo2_addr: start addr of RXF2
2055  * @rxfifo2_size: size of RXF2
2056  * @page_buff_addr: used by UMAC and performance debug (page miss analysis),
2057  *	when paging is not supported this should be 0
2058  * @page_buff_size: size of %page_buff_addr
2059  * @lmac_num: number of LMACs (1 or 2)
2060  * @lmac_smem: per - LMAC smem data
2061  */
2062 struct iwl_shared_mem_cfg {
2063 	__le32 shared_mem_addr;
2064 	__le32 shared_mem_size;
2065 	__le32 sample_buff_addr;
2066 	__le32 sample_buff_size;
2067 	__le32 rxfifo2_addr;
2068 	__le32 rxfifo2_size;
2069 	__le32 page_buff_addr;
2070 	__le32 page_buff_size;
2071 	__le32 lmac_num;
2072 	struct iwl_shared_mem_lmac_cfg lmac_smem[2];
2073 } __packed; /* SHARED_MEM_ALLOC_API_S_VER_3 */
2074 
2075 /**
2076  * VHT MU-MIMO group configuration
2077  *
2078  * @membership_status: a bitmap of MU groups
2079  * @user_position:the position of station in a group. If the station is in the
2080  *	group then bits (group * 2) is the position -1
2081  */
2082 struct iwl_mu_group_mgmt_cmd {
2083 	__le32 reserved;
2084 	__le32 membership_status[2];
2085 	__le32 user_position[4];
2086 } __packed; /* MU_GROUP_ID_MNG_TABLE_API_S_VER_1 */
2087 
2088 /**
2089  * struct iwl_mu_group_mgmt_notif - VHT MU-MIMO group id notification
2090  *
2091  * @membership_status: a bitmap of MU groups
2092  * @user_position: the position of station in a group. If the station is in the
2093  *	group then bits (group * 2) is the position -1
2094  */
2095 struct iwl_mu_group_mgmt_notif {
2096 	__le32 membership_status[2];
2097 	__le32 user_position[4];
2098 } __packed; /* MU_GROUP_MNG_NTFY_API_S_VER_1 */
2099 
2100 #define MAX_STORED_BEACON_SIZE 600
2101 
2102 /**
2103  * Stored beacon notification
2104  *
2105  * @system_time: system time on air rise
2106  * @tsf: TSF on air rise
2107  * @beacon_timestamp: beacon on air rise
2108  * @band: band, matches &RX_RES_PHY_FLAGS_BAND_24 definition
2109  * @channel: channel this beacon was received on
2110  * @rates: rate in ucode internal format
2111  * @byte_count: frame's byte count
2112  */
2113 struct iwl_stored_beacon_notif {
2114 	__le32 system_time;
2115 	__le64 tsf;
2116 	__le32 beacon_timestamp;
2117 	__le16 band;
2118 	__le16 channel;
2119 	__le32 rates;
2120 	__le32 byte_count;
2121 	u8 data[MAX_STORED_BEACON_SIZE];
2122 } __packed; /* WOWLAN_STROED_BEACON_INFO_S_VER_2 */
2123 
2124 #define LQM_NUMBER_OF_STATIONS_IN_REPORT 16
2125 
2126 enum iwl_lqm_cmd_operatrions {
2127 	LQM_CMD_OPERATION_START_MEASUREMENT = 0x01,
2128 	LQM_CMD_OPERATION_STOP_MEASUREMENT = 0x02,
2129 };
2130 
2131 enum iwl_lqm_status {
2132 	LQM_STATUS_SUCCESS = 0,
2133 	LQM_STATUS_TIMEOUT = 1,
2134 	LQM_STATUS_ABORT = 2,
2135 };
2136 
2137 /**
2138  * Link Quality Measurement command
2139  * @cmd_operatrion: command operation to be performed (start or stop)
2140  *	as defined above.
2141  * @mac_id: MAC ID the measurement applies to.
2142  * @measurement_time: time of the total measurement to be performed, in uSec.
2143  * @timeout: maximum time allowed until a response is sent, in uSec.
2144  */
2145 struct iwl_link_qual_msrmnt_cmd {
2146 	__le32 cmd_operation;
2147 	__le32 mac_id;
2148 	__le32 measurement_time;
2149 	__le32 timeout;
2150 } __packed /* LQM_CMD_API_S_VER_1 */;
2151 
2152 /**
2153  * Link Quality Measurement notification
2154  *
2155  * @frequent_stations_air_time: an array containing the total air time
2156  *	(in uSec) used by the most frequently transmitting stations.
2157  * @number_of_stations: the number of uniqe stations included in the array
2158  *	(a number between 0 to 16)
2159  * @total_air_time_other_stations: the total air time (uSec) used by all the
2160  *	stations which are not included in the above report.
2161  * @time_in_measurement_window: the total time in uSec in which a measurement
2162  *	took place.
2163  * @tx_frame_dropped: the number of TX frames dropped due to retry limit during
2164  *	measurement
2165  * @mac_id: MAC ID the measurement applies to.
2166  * @status: return status. may be one of the LQM_STATUS_* defined above.
2167  * @reserved: reserved.
2168  */
2169 struct iwl_link_qual_msrmnt_notif {
2170 	__le32 frequent_stations_air_time[LQM_NUMBER_OF_STATIONS_IN_REPORT];
2171 	__le32 number_of_stations;
2172 	__le32 total_air_time_other_stations;
2173 	__le32 time_in_measurement_window;
2174 	__le32 tx_frame_dropped;
2175 	__le32 mac_id;
2176 	__le32 status;
2177 	__le32 reserved[3];
2178 } __packed; /* LQM_MEASUREMENT_COMPLETE_NTF_API_S_VER1 */
2179 
2180 /**
2181  * Channel switch NOA notification
2182  *
2183  * @id_and_color: ID and color of the MAC
2184  */
2185 struct iwl_channel_switch_noa_notif {
2186 	__le32 id_and_color;
2187 } __packed; /* CHANNEL_SWITCH_START_NTFY_API_S_VER_1 */
2188 
2189 /* Operation types for the debug mem access */
2190 enum {
2191 	DEBUG_MEM_OP_READ = 0,
2192 	DEBUG_MEM_OP_WRITE = 1,
2193 	DEBUG_MEM_OP_WRITE_BYTES = 2,
2194 };
2195 
2196 #define DEBUG_MEM_MAX_SIZE_DWORDS 32
2197 
2198 /**
2199  * struct iwl_dbg_mem_access_cmd - Request the device to read/write memory
2200  * @op: DEBUG_MEM_OP_*
2201  * @addr: address to read/write from/to
2202  * @len: in dwords, to read/write
2203  * @data: for write opeations, contains the source buffer
2204  */
2205 struct iwl_dbg_mem_access_cmd {
2206 	__le32 op;
2207 	__le32 addr;
2208 	__le32 len;
2209 	__le32 data[];
2210 } __packed; /* DEBUG_(U|L)MAC_RD_WR_CMD_API_S_VER_1 */
2211 
2212 /* Status responses for the debug mem access */
2213 enum {
2214 	DEBUG_MEM_STATUS_SUCCESS = 0x0,
2215 	DEBUG_MEM_STATUS_FAILED = 0x1,
2216 	DEBUG_MEM_STATUS_LOCKED = 0x2,
2217 	DEBUG_MEM_STATUS_HIDDEN = 0x3,
2218 	DEBUG_MEM_STATUS_LENGTH = 0x4,
2219 };
2220 
2221 /**
2222  * struct iwl_dbg_mem_access_rsp - Response to debug mem commands
2223  * @status: DEBUG_MEM_STATUS_*
2224  * @len: read dwords (0 for write operations)
2225  * @data: contains the read DWs
2226  */
2227 struct iwl_dbg_mem_access_rsp {
2228 	__le32 status;
2229 	__le32 len;
2230 	__le32 data[];
2231 } __packed; /* DEBUG_(U|L)MAC_RD_WR_RSP_API_S_VER_1 */
2232 
2233 /**
2234  * struct iwl_nvm_access_complete_cmd - NVM_ACCESS commands are completed
2235  */
2236 struct iwl_nvm_access_complete_cmd {
2237 	__le32 reserved;
2238 } __packed; /* NVM_ACCESS_COMPLETE_CMD_API_S_VER_1 */
2239 
2240 /**
2241  * enum iwl_extended_cfg_flag - commands driver may send before
2242  *	finishing init flow
2243  * @IWL_INIT_DEBUG_CFG: driver is going to send debug config command
2244  * @IWL_INIT_NVM: driver is going to send NVM_ACCESS commands
2245  * @IWL_INIT_PHY: driver is going to send PHY_DB commands
2246  */
2247 enum iwl_extended_cfg_flags {
2248 	IWL_INIT_DEBUG_CFG,
2249 	IWL_INIT_NVM,
2250 	IWL_INIT_PHY,
2251 };
2252 
2253 /**
2254  * struct iwl_extended_cfg_cmd - mark what commands ucode should wait for
2255  * before finishing init flows
2256  * @init_flags: values from iwl_extended_cfg_flags
2257  */
2258 struct iwl_init_extended_cfg_cmd {
2259 	__le32 init_flags;
2260 } __packed; /* INIT_EXTENDED_CFG_CMD_API_S_VER_1 */
2261 
2262 #endif /* __fw_api_h__ */
2263