1 /*
2  * Copyright (c) 2012 Qualcomm Atheros, Inc.
3  * Copyright (c) 2006-2012 Wilocity .
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /*
19  * This file contains the definitions of the WMI protocol specified in the
20  * Wireless Module Interface (WMI) for the Wilocity
21  * MARLON 60 Gigabit wireless solution.
22  * It includes definitions of all the commands and events.
23  * Commands are messages from the host to the WM.
24  * Events are messages from the WM to the host.
25  */
26 
27 #ifndef __WILOCITY_WMI_H__
28 #define __WILOCITY_WMI_H__
29 
30 /* General */
31 
32 #define WMI_MAC_LEN		(6)
33 #define WMI_PROX_RANGE_NUM	(3)
34 
35 /* List of Commands */
36 enum wmi_command_id {
37 	WMI_CONNECT_CMDID		= 0x0001,
38 	WMI_DISCONNECT_CMDID		= 0x0003,
39 	WMI_START_SCAN_CMDID		= 0x0007,
40 	WMI_SET_BSS_FILTER_CMDID	= 0x0009,
41 	WMI_SET_PROBED_SSID_CMDID	= 0x000a,
42 	WMI_SET_LISTEN_INT_CMDID	= 0x000b,
43 	WMI_BCON_CTRL_CMDID		= 0x000f,
44 	WMI_ADD_CIPHER_KEY_CMDID	= 0x0016,
45 	WMI_DELETE_CIPHER_KEY_CMDID	= 0x0017,
46 	WMI_SET_APPIE_CMDID		= 0x003f,
47 	WMI_GET_APPIE_CMDID		= 0x0040,
48 	WMI_SET_WSC_STATUS_CMDID	= 0x0041,
49 	WMI_PXMT_RANGE_CFG_CMDID	= 0x0042,
50 	WMI_PXMT_SNR2_RANGE_CFG_CMDID	= 0x0043,
51 	WMI_FAST_MEM_ACC_MODE_CMDID	= 0x0300,
52 	WMI_MEM_READ_CMDID		= 0x0800,
53 	WMI_MEM_WR_CMDID		= 0x0801,
54 	WMI_ECHO_CMDID			= 0x0803,
55 	WMI_DEEP_ECHO_CMDID		= 0x0804,
56 	WMI_CONFIG_MAC_CMDID		= 0x0805,
57 	WMI_CONFIG_PHY_DEBUG_CMDID	= 0x0806,
58 	WMI_ADD_STATION_CMDID		= 0x0807,
59 	WMI_ADD_DEBUG_TX_PCKT_CMDID	= 0x0808,
60 	WMI_PHY_GET_STATISTICS_CMDID	= 0x0809,
61 	WMI_FS_TUNE_CMDID		= 0x080a,
62 	WMI_CORR_MEASURE_CMDID		= 0x080b,
63 	WMI_TEMP_SENSE_CMDID		= 0x080e,
64 	WMI_DC_CALIB_CMDID		= 0x080f,
65 	WMI_SEND_TONE_CMDID		= 0x0810,
66 	WMI_IQ_TX_CALIB_CMDID		= 0x0811,
67 	WMI_IQ_RX_CALIB_CMDID		= 0x0812,
68 	WMI_SET_UCODE_IDLE_CMDID	= 0x0813,
69 	WMI_SET_WORK_MODE_CMDID		= 0x0815,
70 	WMI_LO_LEAKAGE_CALIB_CMDID	= 0x0816,
71 	WMI_MARLON_R_ACTIVATE_CMDID	= 0x0817,
72 	WMI_MARLON_R_READ_CMDID		= 0x0818,
73 	WMI_MARLON_R_WRITE_CMDID	= 0x0819,
74 	WMI_MARLON_R_TXRX_SEL_CMDID	= 0x081a,
75 	MAC_IO_STATIC_PARAMS_CMDID	= 0x081b,
76 	MAC_IO_DYNAMIC_PARAMS_CMDID	= 0x081c,
77 	WMI_SILENT_RSSI_CALIB_CMDID	= 0x081d,
78 	WMI_CFG_RX_CHAIN_CMDID		= 0x0820,
79 	WMI_VRING_CFG_CMDID		= 0x0821,
80 	WMI_RX_ON_CMDID			= 0x0822,
81 	WMI_VRING_BA_EN_CMDID		= 0x0823,
82 	WMI_VRING_BA_DIS_CMDID		= 0x0824,
83 	WMI_RCP_ADDBA_RESP_CMDID	= 0x0825,
84 	WMI_RCP_DELBA_CMDID		= 0x0826,
85 	WMI_SET_SSID_CMDID		= 0x0827,
86 	WMI_GET_SSID_CMDID		= 0x0828,
87 	WMI_SET_PCP_CHANNEL_CMDID	= 0x0829,
88 	WMI_GET_PCP_CHANNEL_CMDID	= 0x082a,
89 	WMI_SW_TX_REQ_CMDID		= 0x082b,
90 	WMI_RX_OFF_CMDID		= 0x082c,
91 	WMI_READ_MAC_RXQ_CMDID		= 0x0830,
92 	WMI_READ_MAC_TXQ_CMDID		= 0x0831,
93 	WMI_WRITE_MAC_RXQ_CMDID		= 0x0832,
94 	WMI_WRITE_MAC_TXQ_CMDID		= 0x0833,
95 	WMI_WRITE_MAC_XQ_FIELD_CMDID	= 0x0834,
96 	WMI_MLME_PUSH_CMDID		= 0x0835,
97 	WMI_BEAMFORMING_MGMT_CMDID	= 0x0836,
98 	WMI_BF_TXSS_MGMT_CMDID		= 0x0837,
99 	WMI_BF_SM_MGMT_CMDID		= 0x0838,
100 	WMI_BF_RXSS_MGMT_CMDID		= 0x0839,
101 	WMI_SET_SECTORS_CMDID		= 0x0849,
102 	WMI_MAINTAIN_PAUSE_CMDID	= 0x0850,
103 	WMI_MAINTAIN_RESUME_CMDID	= 0x0851,
104 	WMI_RS_MGMT_CMDID		= 0x0852,
105 	WMI_RF_MGMT_CMDID		= 0x0853,
106 	/* Performance monitoring commands */
107 	WMI_BF_CTRL_CMDID		= 0x0862,
108 	WMI_NOTIFY_REQ_CMDID		= 0x0863,
109 	WMI_GET_STATUS_CMDID		= 0x0864,
110 	WMI_UNIT_TEST_CMDID		= 0x0900,
111 	WMI_HICCUP_CMDID		= 0x0901,
112 	WMI_FLASH_READ_CMDID		= 0x0902,
113 	WMI_FLASH_WRITE_CMDID		= 0x0903,
114 	WMI_SECURITY_UNIT_TEST_CMDID	= 0x0904,
115 
116 	WMI_SET_MAC_ADDRESS_CMDID	= 0xf003,
117 	WMI_ABORT_SCAN_CMDID		= 0xf007,
118 	WMI_SET_PMK_CMDID		= 0xf028,
119 
120 	WMI_SET_PROMISCUOUS_MODE_CMDID	= 0xf041,
121 	WMI_GET_PMK_CMDID		= 0xf048,
122 	WMI_SET_PASSPHRASE_CMDID	= 0xf049,
123 	WMI_SEND_ASSOC_RES_CMDID	= 0xf04a,
124 	WMI_SET_ASSOC_REQ_RELAY_CMDID	= 0xf04b,
125 	WMI_EAPOL_TX_CMDID		= 0xf04c,
126 	WMI_MAC_ADDR_REQ_CMDID		= 0xf04d,
127 	WMI_FW_VER_CMDID		= 0xf04e,
128 };
129 
130 /*
131  * Commands data structures
132  */
133 
134 /*
135  * Frame Types
136  */
137 enum wmi_mgmt_frame_type {
138 	WMI_FRAME_BEACON	= 0,
139 	WMI_FRAME_PROBE_REQ	= 1,
140 	WMI_FRAME_PROBE_RESP	= 2,
141 	WMI_FRAME_ASSOC_REQ	= 3,
142 	WMI_FRAME_ASSOC_RESP	= 4,
143 	WMI_NUM_MGMT_FRAME,
144 };
145 
146 /*
147  * WMI_CONNECT_CMDID
148  */
149 enum wmi_network_type {
150 	WMI_NETTYPE_INFRA		= 0x01,
151 	WMI_NETTYPE_ADHOC		= 0x02,
152 	WMI_NETTYPE_ADHOC_CREATOR	= 0x04,
153 	WMI_NETTYPE_AP			= 0x10,
154 	WMI_NETTYPE_P2P			= 0x20,
155 	WMI_NETTYPE_WBE			= 0x40, /* PCIE over 60g */
156 };
157 
158 enum wmi_dot11_auth_mode {
159 	WMI_AUTH11_OPEN			= 0x01,
160 	WMI_AUTH11_SHARED		= 0x02,
161 	WMI_AUTH11_LEAP			= 0x04,
162 	WMI_AUTH11_WSC			= 0x08,
163 };
164 
165 enum wmi_auth_mode {
166 	WMI_AUTH_NONE			= 0x01,
167 	WMI_AUTH_WPA			= 0x02,
168 	WMI_AUTH_WPA2			= 0x04,
169 	WMI_AUTH_WPA_PSK		= 0x08,
170 	WMI_AUTH_WPA2_PSK		= 0x10,
171 	WMI_AUTH_WPA_CCKM		= 0x20,
172 	WMI_AUTH_WPA2_CCKM		= 0x40,
173 };
174 
175 enum wmi_crypto_type {
176 	WMI_CRYPT_NONE			= 0x01,
177 	WMI_CRYPT_WEP			= 0x02,
178 	WMI_CRYPT_TKIP			= 0x04,
179 	WMI_CRYPT_AES			= 0x08,
180 	WMI_CRYPT_AES_GCMP		= 0x20,
181 };
182 
183 
184 enum wmi_connect_ctrl_flag_bits {
185 	WMI_CONNECT_ASSOC_POLICY_USER		= 0x0001,
186 	WMI_CONNECT_SEND_REASSOC		= 0x0002,
187 	WMI_CONNECT_IGNORE_WPAx_GROUP_CIPHER	= 0x0004,
188 	WMI_CONNECT_PROFILE_MATCH_DONE		= 0x0008,
189 	WMI_CONNECT_IGNORE_AAC_BEACON		= 0x0010,
190 	WMI_CONNECT_CSA_FOLLOW_BSS		= 0x0020,
191 	WMI_CONNECT_DO_WPA_OFFLOAD		= 0x0040,
192 	WMI_CONNECT_DO_NOT_DEAUTH		= 0x0080,
193 };
194 
195 #define WMI_MAX_SSID_LEN    (32)
196 
197 struct wmi_connect_cmd {
198 	u8 network_type;
199 	u8 dot11_auth_mode;
200 	u8 auth_mode;
201 	u8 pairwise_crypto_type;
202 	u8 pairwise_crypto_len;
203 	u8 group_crypto_type;
204 	u8 group_crypto_len;
205 	u8 ssid_len;
206 	u8 ssid[WMI_MAX_SSID_LEN];
207 	u8 channel;
208 	u8 reserved0;
209 	u8 bssid[WMI_MAC_LEN];
210 	__le32 ctrl_flags;
211 	u8 dst_mac[WMI_MAC_LEN];
212 	u8 reserved1[2];
213 } __packed;
214 
215 
216 /*
217  * WMI_RECONNECT_CMDID
218  */
219 struct wmi_reconnect_cmd {
220 	u8 channel;			/* hint */
221 	u8 reserved;
222 	u8 bssid[WMI_MAC_LEN];		/* mandatory if set */
223 } __packed;
224 
225 
226 /*
227  * WMI_SET_PMK_CMDID
228  */
229 
230 #define WMI_MIN_KEY_INDEX	(0)
231 #define WMI_MAX_KEY_INDEX	(3)
232 #define WMI_MAX_KEY_LEN		(32)
233 #define WMI_PASSPHRASE_LEN	(64)
234 #define WMI_PMK_LEN		(32)
235 
236 struct  wmi_set_pmk_cmd {
237 	u8 pmk[WMI_PMK_LEN];
238 } __packed;
239 
240 
241 /*
242  * WMI_SET_PASSPHRASE_CMDID
243  */
244 struct wmi_set_passphrase_cmd {
245 	u8 ssid[WMI_MAX_SSID_LEN];
246 	u8 passphrase[WMI_PASSPHRASE_LEN];
247 	u8 ssid_len;
248 	u8 passphrase_len;
249 } __packed;
250 
251 /*
252  * WMI_ADD_CIPHER_KEY_CMDID
253  */
254 enum wmi_key_usage {
255 	WMI_KEY_USE_PAIRWISE	= 0,
256 	WMI_KEY_USE_GROUP	= 1,
257 	WMI_KEY_USE_TX		= 2,  /* default Tx Key - Static WEP only */
258 };
259 
260 struct wmi_add_cipher_key_cmd {
261 	u8 key_index;
262 	u8 key_type;
263 	u8 key_usage;		/* enum wmi_key_usage */
264 	u8 key_len;
265 	u8 key_rsc[8];		/* key replay sequence counter */
266 	u8 key[WMI_MAX_KEY_LEN];
267 	u8 key_op_ctrl;		/* Additional Key Control information */
268 	u8 mac[WMI_MAC_LEN];
269 } __packed;
270 
271 /*
272  * WMI_DELETE_CIPHER_KEY_CMDID
273  */
274 struct wmi_delete_cipher_key_cmd {
275 	u8 key_index;
276 	u8 mac[WMI_MAC_LEN];
277 } __packed;
278 
279 
280 /*
281  * WMI_START_SCAN_CMDID
282  *
283  * Start L1 scan operation
284  *
285  * Returned events:
286  * - WMI_RX_MGMT_PACKET_EVENTID - for every probe resp.
287  * - WMI_SCAN_COMPLETE_EVENTID
288  */
289 enum wmi_scan_type {
290 	WMI_LONG_SCAN		= 0,
291 	WMI_SHORT_SCAN		= 1,
292 };
293 
294 struct wmi_start_scan_cmd {
295 	u8 reserved[8];
296 	__le32 home_dwell_time;	/* Max duration in the home channel(ms) */
297 	__le32 force_scan_interval;	/* Time interval between scans (ms)*/
298 	u8 scan_type;		/* wmi_scan_type */
299 	u8 num_channels;		/* how many channels follow */
300 	struct {
301 		u8 channel;
302 		u8 reserved;
303 	} channel_list[0];	/* channels ID's */
304 				/* 0 - 58320 MHz */
305 				/* 1 - 60480 MHz */
306 				/* 2 - 62640 MHz */
307 } __packed;
308 
309 /*
310  * WMI_SET_PROBED_SSID_CMDID
311  */
312 #define MAX_PROBED_SSID_INDEX   (15)
313 
314 enum wmi_ssid_flag {
315 	WMI_SSID_FLAG_DISABLE	= 0,	/* disables entry */
316 	WMI_SSID_FLAG_SPECIFIC	= 1,	/* probes specified ssid */
317 	WMI_SSID_FLAG_ANY	= 2,	/* probes for any ssid */
318 };
319 
320 struct wmi_probed_ssid_cmd {
321 	u8 entry_index;			/* 0 to MAX_PROBED_SSID_INDEX */
322 	u8 flag;			/* enum wmi_ssid_flag */
323 	u8 ssid_len;
324 	u8 ssid[WMI_MAX_SSID_LEN];
325 } __packed;
326 
327 /*
328  * WMI_SET_APPIE_CMDID
329  * Add Application specified IE to a management frame
330  */
331 struct wmi_set_appie_cmd {
332 	u8 mgmt_frm_type;	/* enum wmi_mgmt_frame_type */
333 	u8 reserved;
334 	__le16 ie_len;	/* Length of the IE to be added to MGMT frame */
335 	u8 ie_info[0];
336 } __packed;
337 
338 #define WMI_MAX_IE_LEN (1024)
339 
340 struct wmi_pxmt_range_cfg_cmd {
341 	u8 dst_mac[WMI_MAC_LEN];
342 	__le16 range;
343 } __packed;
344 
345 struct wmi_pxmt_snr2_range_cfg_cmd {
346 	s8 snr2range_arr[WMI_PROX_RANGE_NUM-1];
347 } __packed;
348 
349 /*
350  * WMI_RF_MGMT_CMDID
351  */
352 enum wmi_rf_mgmt_type {
353 	WMI_RF_MGMT_W_DISABLE	= 0,
354 	WMI_RF_MGMT_W_ENABLE	= 1,
355 	WMI_RF_MGMT_GET_STATUS	= 2,
356 };
357 
358 struct wmi_rf_mgmt_cmd {
359 	__le32 rf_mgmt_type;
360 } __packed;
361 
362 /*
363  * WMI_SET_SSID_CMDID
364  */
365 struct wmi_set_ssid_cmd {
366 	__le32 ssid_len;
367 	u8 ssid[WMI_MAX_SSID_LEN];
368 } __packed;
369 
370 /*
371  * WMI_SET_PCP_CHANNEL_CMDID
372  */
373 struct wmi_set_pcp_channel_cmd {
374 	u8 channel;
375 	u8 reserved[3];
376 } __packed;
377 
378 /*
379  * WMI_BCON_CTRL_CMDID
380  */
381 struct wmi_bcon_ctrl_cmd {
382 	__le16 bcon_interval;
383 	__le16 frag_num;
384 	__le64 ss_mask;
385 	u8 network_type;
386 	u8 reserved;
387 	u8 disable_sec_offload;
388 	u8 disable_sec;
389 } __packed;
390 
391 /*
392  * WMI_SW_TX_REQ_CMDID
393  */
394 struct wmi_sw_tx_req_cmd {
395 	u8 dst_mac[WMI_MAC_LEN];
396 	__le16 len;
397 	u8 payload[0];
398 } __packed;
399 
400 /*
401  * WMI_VRING_CFG_CMDID
402  */
403 
404 struct wmi_sw_ring_cfg {
405 	__le64 ring_mem_base;
406 	__le16 ring_size;
407 	__le16 max_mpdu_size;
408 } __packed;
409 
410 struct wmi_vring_cfg_schd {
411 	__le16 priority;
412 	__le16 timeslot_us;
413 } __packed;
414 
415 enum wmi_vring_cfg_encap_trans_type {
416 	WMI_VRING_ENC_TYPE_802_3		= 0,
417 	WMI_VRING_ENC_TYPE_NATIVE_WIFI		= 1,
418 };
419 
420 enum wmi_vring_cfg_ds_cfg {
421 	WMI_VRING_DS_PBSS			= 0,
422 	WMI_VRING_DS_STATION			= 1,
423 	WMI_VRING_DS_AP				= 2,
424 	WMI_VRING_DS_ADDR4			= 3,
425 };
426 
427 enum wmi_vring_cfg_nwifi_ds_trans_type {
428 	WMI_NWIFI_TX_TRANS_MODE_NO		= 0,
429 	WMI_NWIFI_TX_TRANS_MODE_AP2PBSS		= 1,
430 	WMI_NWIFI_TX_TRANS_MODE_STA2PBSS	= 2,
431 };
432 
433 enum wmi_vring_cfg_schd_params_priority {
434 	WMI_SCH_PRIO_REGULAR			= 0,
435 	WMI_SCH_PRIO_HIGH			= 1,
436 };
437 
438 struct wmi_vring_cfg {
439 	struct wmi_sw_ring_cfg tx_sw_ring;
440 	u8 ringid;				/* 0-23 vrings */
441 
442 	#define CIDXTID_CID_POS (0)
443 	#define CIDXTID_CID_LEN (4)
444 	#define CIDXTID_CID_MSK (0xF)
445 	#define CIDXTID_TID_POS (4)
446 	#define CIDXTID_TID_LEN (4)
447 	#define CIDXTID_TID_MSK (0xF0)
448 	u8 cidxtid;
449 
450 	u8 encap_trans_type;
451 	u8 ds_cfg;				/* 802.3 DS cfg */
452 	u8 nwifi_ds_trans_type;
453 
454 	#define VRING_CFG_MAC_CTRL_LIFETIME_EN_POS (0)
455 	#define VRING_CFG_MAC_CTRL_LIFETIME_EN_LEN (1)
456 	#define VRING_CFG_MAC_CTRL_LIFETIME_EN_MSK (0x1)
457 	#define VRING_CFG_MAC_CTRL_AGGR_EN_POS (1)
458 	#define VRING_CFG_MAC_CTRL_AGGR_EN_LEN (1)
459 	#define VRING_CFG_MAC_CTRL_AGGR_EN_MSK (0x2)
460 	u8 mac_ctrl;
461 
462 	#define VRING_CFG_TO_RESOLUTION_VALUE_POS (0)
463 	#define VRING_CFG_TO_RESOLUTION_VALUE_LEN (6)
464 	#define VRING_CFG_TO_RESOLUTION_VALUE_MSK (0x3F)
465 	u8 to_resolution;
466 	u8 agg_max_wsize;
467 	struct wmi_vring_cfg_schd schd_params;
468 } __packed;
469 
470 enum wmi_vring_cfg_cmd_action {
471 	WMI_VRING_CMD_ADD			= 0,
472 	WMI_VRING_CMD_MODIFY			= 1,
473 	WMI_VRING_CMD_DELETE			= 2,
474 };
475 
476 struct wmi_vring_cfg_cmd {
477 	__le32 action;
478 	struct wmi_vring_cfg vring_cfg;
479 } __packed;
480 
481 /*
482  * WMI_VRING_BA_EN_CMDID
483  */
484 struct wmi_vring_ba_en_cmd {
485 	u8 ringid;
486 	u8 agg_max_wsize;
487 	__le16 ba_timeout;
488 } __packed;
489 
490 /*
491  * WMI_VRING_BA_DIS_CMDID
492  */
493 struct wmi_vring_ba_dis_cmd {
494 	u8 ringid;
495 	u8 reserved;
496 	__le16 reason;
497 } __packed;
498 
499 /*
500  * WMI_NOTIFY_REQ_CMDID
501  */
502 struct wmi_notify_req_cmd {
503 	u8 cid;
504 	u8 reserved[3];
505 	__le32 interval_usec;
506 } __packed;
507 
508 /*
509  * WMI_CFG_RX_CHAIN_CMDID
510  */
511 enum wmi_sniffer_cfg_mode {
512 	WMI_SNIFFER_OFF				= 0,
513 	WMI_SNIFFER_ON				= 1,
514 };
515 
516 enum wmi_sniffer_cfg_phy_info_mode {
517 	WMI_SNIFFER_PHY_INFO_DISABLED		= 0,
518 	WMI_SNIFFER_PHY_INFO_ENABLED		= 1,
519 };
520 
521 enum wmi_sniffer_cfg_phy_support {
522 	WMI_SNIFFER_CP				= 0,
523 	WMI_SNIFFER_DP				= 1,
524 	WMI_SNIFFER_BOTH_PHYS			= 2,
525 };
526 
527 struct wmi_sniffer_cfg {
528 	__le32 mode;		/* enum wmi_sniffer_cfg_mode */
529 	__le32 phy_info_mode;	/* enum wmi_sniffer_cfg_phy_info_mode */
530 	__le32 phy_support;	/* enum wmi_sniffer_cfg_phy_support */
531 	u8 channel;
532 	u8 reserved[3];
533 } __packed;
534 
535 enum wmi_cfg_rx_chain_cmd_action {
536 	WMI_RX_CHAIN_ADD			= 0,
537 	WMI_RX_CHAIN_DEL			= 1,
538 };
539 
540 enum wmi_cfg_rx_chain_cmd_decap_trans_type {
541 	WMI_DECAP_TYPE_802_3			= 0,
542 	WMI_DECAP_TYPE_NATIVE_WIFI		= 1,
543 };
544 
545 enum wmi_cfg_rx_chain_cmd_nwifi_ds_trans_type {
546 	WMI_NWIFI_RX_TRANS_MODE_NO		= 0,
547 	WMI_NWIFI_RX_TRANS_MODE_PBSS2AP		= 1,
548 	WMI_NWIFI_RX_TRANS_MODE_PBSS2STA	= 2,
549 };
550 
551 struct wmi_cfg_rx_chain_cmd {
552 	__le32 action;
553 	struct wmi_sw_ring_cfg rx_sw_ring;
554 	u8 mid;
555 	u8 decap_trans_type;
556 
557 	#define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_POS (0)
558 	#define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_LEN (1)
559 	#define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_MSK (0x1)
560 	u8 l2_802_3_offload_ctrl;
561 
562 	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_POS (0)
563 	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_LEN (1)
564 	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_MSK (0x1)
565 	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_POS (1)
566 	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_LEN (1)
567 	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_MSK (0x2)
568 	u8 l2_nwifi_offload_ctrl;
569 
570 	u8 vlan_id;
571 	u8 nwifi_ds_trans_type;
572 
573 	#define L3_L4_CTRL_IPV4_CHECKSUM_EN_POS (0)
574 	#define L3_L4_CTRL_IPV4_CHECKSUM_EN_LEN (1)
575 	#define L3_L4_CTRL_IPV4_CHECKSUM_EN_MSK (0x1)
576 	#define L3_L4_CTRL_TCPIP_CHECKSUM_EN_POS (1)
577 	#define L3_L4_CTRL_TCPIP_CHECKSUM_EN_LEN (1)
578 	#define L3_L4_CTRL_TCPIP_CHECKSUM_EN_MSK (0x2)
579 	u8 l3_l4_ctrl;
580 
581 	#define RING_CTRL_OVERRIDE_PREFETCH_THRSH_POS (0)
582 	#define RING_CTRL_OVERRIDE_PREFETCH_THRSH_LEN (1)
583 	#define RING_CTRL_OVERRIDE_PREFETCH_THRSH_MSK (0x1)
584 	#define RING_CTRL_OVERRIDE_WB_THRSH_POS (1)
585 	#define RING_CTRL_OVERRIDE_WB_THRSH_LEN (1)
586 	#define RING_CTRL_OVERRIDE_WB_THRSH_MSK (0x2)
587 	#define RING_CTRL_OVERRIDE_ITR_THRSH_POS (2)
588 	#define RING_CTRL_OVERRIDE_ITR_THRSH_LEN (1)
589 	#define RING_CTRL_OVERRIDE_ITR_THRSH_MSK (0x4)
590 	#define RING_CTRL_OVERRIDE_HOST_THRSH_POS (3)
591 	#define RING_CTRL_OVERRIDE_HOST_THRSH_LEN (1)
592 	#define RING_CTRL_OVERRIDE_HOST_THRSH_MSK (0x8)
593 	u8 ring_ctrl;
594 
595 	__le16 prefetch_thrsh;
596 	__le16 wb_thrsh;
597 	__le32 itr_value;
598 	__le16 host_thrsh;
599 	u8 reserved[2];
600 	struct wmi_sniffer_cfg sniffer_cfg;
601 } __packed;
602 
603 /*
604  * WMI_RCP_ADDBA_RESP_CMDID
605  */
606 struct wmi_rcp_addba_resp_cmd {
607 
608 	#define CIDXTID_CID_POS (0)
609 	#define CIDXTID_CID_LEN (4)
610 	#define CIDXTID_CID_MSK (0xF)
611 	#define CIDXTID_TID_POS (4)
612 	#define CIDXTID_TID_LEN (4)
613 	#define CIDXTID_TID_MSK (0xF0)
614 	u8 cidxtid;
615 
616 	u8 dialog_token;
617 	__le16 status_code;
618 	__le16 ba_param_set;	/* ieee80211_ba_parameterset field to send */
619 	__le16 ba_timeout;
620 } __packed;
621 
622 /*
623  * WMI_RCP_DELBA_CMDID
624  */
625 struct wmi_rcp_delba_cmd {
626 
627 	#define CIDXTID_CID_POS (0)
628 	#define CIDXTID_CID_LEN (4)
629 	#define CIDXTID_CID_MSK (0xF)
630 	#define CIDXTID_TID_POS (4)
631 	#define CIDXTID_TID_LEN (4)
632 	#define CIDXTID_TID_MSK (0xF0)
633 	u8 cidxtid;
634 
635 	u8 reserved;
636 	__le16 reason;
637 } __packed;
638 
639 /*
640  * WMI_RCP_ADDBA_REQ_CMDID
641  */
642 struct wmi_rcp_addba_req_cmd {
643 
644 	#define CIDXTID_CID_POS (0)
645 	#define CIDXTID_CID_LEN (4)
646 	#define CIDXTID_CID_MSK (0xF)
647 	#define CIDXTID_TID_POS (4)
648 	#define CIDXTID_TID_LEN (4)
649 	#define CIDXTID_TID_MSK (0xF0)
650 	u8 cidxtid;
651 
652 	u8 dialog_token;
653 	/* ieee80211_ba_parameterset field as it received */
654 	__le16 ba_param_set;
655 	__le16 ba_timeout;
656 	/* ieee80211_ba_seqstrl field as it received */
657 	__le16 ba_seq_ctrl;
658 } __packed;
659 
660 /*
661  * WMI_SET_MAC_ADDRESS_CMDID
662  */
663 struct wmi_set_mac_address_cmd {
664 	u8 mac[WMI_MAC_LEN];
665 	u8 reserved[2];
666 } __packed;
667 
668 
669 /*
670 * WMI_EAPOL_TX_CMDID
671 */
672 struct wmi_eapol_tx_cmd {
673 	u8 dst_mac[WMI_MAC_LEN];
674 	__le16 eapol_len;
675 	u8 eapol[0];
676 } __packed;
677 
678 /*
679  * WMI_ECHO_CMDID
680  *
681  * Check FW is alive
682  *
683  * WMI_DEEP_ECHO_CMDID
684  *
685  * Check FW and ucode are alive
686  *
687  * Returned event: WMI_ECHO_RSP_EVENTID
688  * same event for both commands
689  */
690 struct wmi_echo_cmd {
691 	__le32 value;
692 } __packed;
693 
694 /*
695  * WMI Events
696  */
697 
698 /*
699  * List of Events (target to host)
700  */
701 enum wmi_event_id {
702 	WMI_IMM_RSP_EVENTID			= 0x0000,
703 	WMI_READY_EVENTID			= 0x1001,
704 	WMI_CONNECT_EVENTID			= 0x1002,
705 	WMI_DISCONNECT_EVENTID			= 0x1003,
706 	WMI_SCAN_COMPLETE_EVENTID		= 0x100a,
707 	WMI_REPORT_STATISTICS_EVENTID		= 0x100b,
708 	WMI_RD_MEM_RSP_EVENTID			= 0x1800,
709 	WMI_FW_READY_EVENTID			= 0x1801,
710 	WMI_EXIT_FAST_MEM_ACC_MODE_EVENTID	= 0x0200,
711 	WMI_ECHO_RSP_EVENTID			= 0x1803,
712 	WMI_CONFIG_MAC_DONE_EVENTID		= 0x1805,
713 	WMI_CONFIG_PHY_DEBUG_DONE_EVENTID	= 0x1806,
714 	WMI_ADD_STATION_DONE_EVENTID		= 0x1807,
715 	WMI_ADD_DEBUG_TX_PCKT_DONE_EVENTID	= 0x1808,
716 	WMI_PHY_GET_STATISTICS_EVENTID		= 0x1809,
717 	WMI_FS_TUNE_DONE_EVENTID		= 0x180a,
718 	WMI_CORR_MEASURE_DONE_EVENTID		= 0x180b,
719 	WMI_TEMP_SENSE_DONE_EVENTID		= 0x180e,
720 	WMI_DC_CALIB_DONE_EVENTID		= 0x180f,
721 	WMI_IQ_TX_CALIB_DONE_EVENTID		= 0x1811,
722 	WMI_IQ_RX_CALIB_DONE_EVENTID		= 0x1812,
723 	WMI_SET_WORK_MODE_DONE_EVENTID		= 0x1815,
724 	WMI_LO_LEAKAGE_CALIB_DONE_EVENTID	= 0x1816,
725 	WMI_MARLON_R_ACTIVATE_DONE_EVENTID	= 0x1817,
726 	WMI_MARLON_R_READ_DONE_EVENTID		= 0x1818,
727 	WMI_MARLON_R_WRITE_DONE_EVENTID		= 0x1819,
728 	WMI_MARLON_R_TXRX_SEL_DONE_EVENTID	= 0x181a,
729 	WMI_SILENT_RSSI_CALIB_DONE_EVENTID	= 0x181d,
730 
731 	WMI_CFG_RX_CHAIN_DONE_EVENTID		= 0x1820,
732 	WMI_VRING_CFG_DONE_EVENTID		= 0x1821,
733 	WMI_RX_ON_DONE_EVENTID			= 0x1822,
734 	WMI_BA_STATUS_EVENTID			= 0x1823,
735 	WMI_RCP_ADDBA_REQ_EVENTID		= 0x1824,
736 	WMI_ADDBA_RESP_SENT_EVENTID		= 0x1825,
737 	WMI_DELBA_EVENTID			= 0x1826,
738 	WMI_GET_SSID_EVENTID			= 0x1828,
739 	WMI_GET_PCP_CHANNEL_EVENTID		= 0x182a,
740 	WMI_SW_TX_COMPLETE_EVENTID		= 0x182b,
741 	WMI_RX_OFF_DONE_EVENTID			= 0x182c,
742 
743 	WMI_READ_MAC_RXQ_EVENTID		= 0x1830,
744 	WMI_READ_MAC_TXQ_EVENTID		= 0x1831,
745 	WMI_WRITE_MAC_RXQ_EVENTID		= 0x1832,
746 	WMI_WRITE_MAC_TXQ_EVENTID		= 0x1833,
747 	WMI_WRITE_MAC_XQ_FIELD_EVENTID		= 0x1834,
748 
749 	WMI_BEAFORMING_MGMT_DONE_EVENTID	= 0x1836,
750 	WMI_BF_TXSS_MGMT_DONE_EVENTID		= 0x1837,
751 	WMI_BF_RXSS_MGMT_DONE_EVENTID		= 0x1839,
752 	WMI_RS_MGMT_DONE_EVENTID		= 0x1852,
753 	WMI_RF_MGMT_STATUS_EVENTID		= 0x1853,
754 	WMI_BF_SM_MGMT_DONE_EVENTID		= 0x1838,
755 	WMI_RX_MGMT_PACKET_EVENTID		= 0x1840,
756 
757 	/* Performance monitoring events */
758 	WMI_DATA_PORT_OPEN_EVENTID		= 0x1860,
759 	WMI_WBE_LINKDOWN_EVENTID		= 0x1861,
760 
761 	WMI_BF_CTRL_DONE_EVENTID		= 0x1862,
762 	WMI_NOTIFY_REQ_DONE_EVENTID		= 0x1863,
763 	WMI_GET_STATUS_DONE_EVENTID		= 0x1864,
764 
765 	WMI_UNIT_TEST_EVENTID			= 0x1900,
766 	WMI_FLASH_READ_DONE_EVENTID		= 0x1902,
767 	WMI_FLASH_WRITE_DONE_EVENTID		= 0x1903,
768 
769 	WMI_SET_CHANNEL_EVENTID			= 0x9000,
770 	WMI_ASSOC_REQ_EVENTID			= 0x9001,
771 	WMI_EAPOL_RX_EVENTID			= 0x9002,
772 	WMI_MAC_ADDR_RESP_EVENTID		= 0x9003,
773 	WMI_FW_VER_EVENTID			= 0x9004,
774 };
775 
776 /*
777  * Events data structures
778  */
779 
780 /*
781  * WMI_RF_MGMT_STATUS_EVENTID
782  */
783 enum wmi_rf_status {
784 	WMI_RF_ENABLED			= 0,
785 	WMI_RF_DISABLED_HW		= 1,
786 	WMI_RF_DISABLED_SW		= 2,
787 	WMI_RF_DISABLED_HW_SW		= 3,
788 };
789 
790 struct wmi_rf_mgmt_status_event {
791 	__le32 rf_status;
792 } __packed;
793 
794 /*
795  * WMI_GET_STATUS_DONE_EVENTID
796  */
797 struct wmi_get_status_done_event {
798 	__le32 is_associated;
799 	u8 cid;
800 	u8 reserved0[3];
801 	u8 bssid[WMI_MAC_LEN];
802 	u8 channel;
803 	u8 reserved1;
804 	u8 network_type;
805 	u8 reserved2[3];
806 	__le32 ssid_len;
807 	u8 ssid[WMI_MAX_SSID_LEN];
808 	__le32 rf_status;
809 	__le32 is_secured;
810 } __packed;
811 
812 /*
813  * WMI_FW_VER_EVENTID
814  */
815 struct wmi_fw_ver_event {
816 	u8 major;
817 	u8 minor;
818 	__le16 subminor;
819 	__le16 build;
820 } __packed;
821 
822 /*
823 * WMI_MAC_ADDR_RESP_EVENTID
824 */
825 struct wmi_mac_addr_resp_event {
826 	u8 mac[WMI_MAC_LEN];
827 	u8 auth_mode;
828 	u8 crypt_mode;
829 	__le32 offload_mode;
830 } __packed;
831 
832 /*
833 * WMI_EAPOL_RX_EVENTID
834 */
835 struct wmi_eapol_rx_event {
836 	u8 src_mac[WMI_MAC_LEN];
837 	__le16 eapol_len;
838 	u8 eapol[0];
839 } __packed;
840 
841 /*
842 * WMI_READY_EVENTID
843 */
844 enum wmi_phy_capability {
845 	WMI_11A_CAPABILITY		= 1,
846 	WMI_11G_CAPABILITY		= 2,
847 	WMI_11AG_CAPABILITY		= 3,
848 	WMI_11NA_CAPABILITY		= 4,
849 	WMI_11NG_CAPABILITY		= 5,
850 	WMI_11NAG_CAPABILITY		= 6,
851 	WMI_11AD_CAPABILITY		= 7,
852 	WMI_11N_CAPABILITY_OFFSET = WMI_11NA_CAPABILITY - WMI_11A_CAPABILITY,
853 };
854 
855 struct wmi_ready_event {
856 	__le32 sw_version;
857 	__le32 abi_version;
858 	u8 mac[WMI_MAC_LEN];
859 	u8 phy_capability;		/* enum wmi_phy_capability */
860 	u8 reserved;
861 } __packed;
862 
863 /*
864  * WMI_NOTIFY_REQ_DONE_EVENTID
865  */
866 struct wmi_notify_req_done_event {
867 	__le32 status;
868 	__le64 tsf;
869 	__le32 snr_val;
870 	__le32 tx_tpt;
871 	__le32 tx_goodput;
872 	__le32 rx_goodput;
873 	__le16 bf_mcs;
874 	__le16 my_rx_sector;
875 	__le16 my_tx_sector;
876 	__le16 other_rx_sector;
877 	__le16 other_tx_sector;
878 	__le16 range;
879 } __packed;
880 
881 /*
882  * WMI_CONNECT_EVENTID
883  */
884 struct wmi_connect_event {
885 	u8 channel;
886 	u8 reserved0;
887 	u8 bssid[WMI_MAC_LEN];
888 	__le16 listen_interval;
889 	__le16 beacon_interval;
890 	u8 network_type;
891 	u8 reserved1[3];
892 	u8 beacon_ie_len;
893 	u8 assoc_req_len;
894 	u8 assoc_resp_len;
895 	u8 cid;
896 	u8 reserved2[3];
897 	u8 assoc_info[0];
898 } __packed;
899 
900 /*
901  * WMI_DISCONNECT_EVENTID
902  */
903 enum wmi_disconnect_reason {
904 	WMI_DIS_REASON_NO_NETWORK_AVAIL		= 1,
905 	WMI_DIS_REASON_LOST_LINK		= 2, /* bmiss */
906 	WMI_DIS_REASON_DISCONNECT_CMD		= 3,
907 	WMI_DIS_REASON_BSS_DISCONNECTED		= 4,
908 	WMI_DIS_REASON_AUTH_FAILED		= 5,
909 	WMI_DIS_REASON_ASSOC_FAILED		= 6,
910 	WMI_DIS_REASON_NO_RESOURCES_AVAIL	= 7,
911 	WMI_DIS_REASON_CSERV_DISCONNECT		= 8,
912 	WMI_DIS_REASON_INVALID_PROFILE		= 10,
913 	WMI_DIS_REASON_DOT11H_CHANNEL_SWITCH	= 11,
914 	WMI_DIS_REASON_PROFILE_MISMATCH		= 12,
915 	WMI_DIS_REASON_CONNECTION_EVICTED	= 13,
916 	WMI_DIS_REASON_IBSS_MERGE		= 14,
917 };
918 
919 struct wmi_disconnect_event {
920 	__le16 protocol_reason_status;	/* reason code, see 802.11 spec. */
921 	u8 bssid[WMI_MAC_LEN];		/* set if known */
922 	u8 disconnect_reason;		/* see wmi_disconnect_reason_e */
923 	u8 assoc_resp_len;
924 	u8 assoc_info[0];
925 } __packed;
926 
927 /*
928  * WMI_SCAN_COMPLETE_EVENTID
929  */
930 struct wmi_scan_complete_event {
931 	__le32 status;
932 } __packed;
933 
934 /*
935  * WMI_BA_STATUS_EVENTID
936  */
937 enum wmi_vring_ba_status {
938 	WMI_BA_AGREED			= 0,
939 	WMI_BA_NON_AGREED		= 1,
940 };
941 
942 struct wmi_vring_ba_status_event {
943 	__le16 status;
944 	u8 reserved[2];
945 	u8 ringid;
946 	u8 agg_wsize;
947 	__le16 ba_timeout;
948 } __packed;
949 
950 /*
951  * WMI_DELBA_EVENTID
952  */
953 struct wmi_delba_event {
954 
955 	#define CIDXTID_CID_POS (0)
956 	#define CIDXTID_CID_LEN (4)
957 	#define CIDXTID_CID_MSK (0xF)
958 	#define CIDXTID_TID_POS (4)
959 	#define CIDXTID_TID_LEN (4)
960 	#define CIDXTID_TID_MSK (0xF0)
961 	u8 cidxtid;
962 
963 	u8 from_initiator;
964 	__le16 reason;
965 } __packed;
966 
967 /*
968  * WMI_VRING_CFG_DONE_EVENTID
969  */
970 enum wmi_vring_cfg_done_event_status {
971 	WMI_VRING_CFG_SUCCESS		= 0,
972 	WMI_VRING_CFG_FAILURE		= 1,
973 };
974 
975 struct wmi_vring_cfg_done_event {
976 	u8 ringid;
977 	u8 status;
978 	u8 reserved[2];
979 	__le32 tx_vring_tail_ptr;
980 } __packed;
981 
982 /*
983  * WMI_ADDBA_RESP_SENT_EVENTID
984  */
985 enum wmi_rcp_addba_resp_sent_event_status {
986 	WMI_ADDBA_SUCCESS		= 0,
987 	WMI_ADDBA_FAIL			= 1,
988 };
989 
990 struct wmi_rcp_addba_resp_sent_event {
991 
992 	#define CIDXTID_CID_POS (0)
993 	#define CIDXTID_CID_LEN (4)
994 	#define CIDXTID_CID_MSK (0xF)
995 	#define CIDXTID_TID_POS (4)
996 	#define CIDXTID_TID_LEN (4)
997 	#define CIDXTID_TID_MSK (0xF0)
998 	u8 cidxtid;
999 
1000 	u8 reserved;
1001 	__le16 status;
1002 } __packed;
1003 
1004 /*
1005  * WMI_RCP_ADDBA_REQ_EVENTID
1006  */
1007 struct wmi_rcp_addba_req_event {
1008 
1009 	#define CIDXTID_CID_POS (0)
1010 	#define CIDXTID_CID_LEN (4)
1011 	#define CIDXTID_CID_MSK (0xF)
1012 	#define CIDXTID_TID_POS (4)
1013 	#define CIDXTID_TID_LEN (4)
1014 	#define CIDXTID_TID_MSK (0xF0)
1015 	u8 cidxtid;
1016 
1017 	u8 dialog_token;
1018 	__le16 ba_param_set;	/* ieee80211_ba_parameterset as it received */
1019 	__le16 ba_timeout;
1020 	__le16 ba_seq_ctrl;	/* ieee80211_ba_seqstrl field as it received */
1021 } __packed;
1022 
1023 /*
1024  * WMI_CFG_RX_CHAIN_DONE_EVENTID
1025  */
1026 enum wmi_cfg_rx_chain_done_event_status {
1027 	WMI_CFG_RX_CHAIN_SUCCESS	= 1,
1028 };
1029 
1030 struct wmi_cfg_rx_chain_done_event {
1031 	__le32 rx_ring_tail_ptr;	/* Rx V-Ring Tail pointer */
1032 	__le32 status;
1033 } __packed;
1034 
1035 /*
1036  * WMI_WBE_LINKDOWN_EVENTID
1037  */
1038 enum wmi_wbe_link_down_event_reason {
1039 	WMI_WBE_REASON_USER_REQUEST	= 0,
1040 	WMI_WBE_REASON_RX_DISASSOC	= 1,
1041 	WMI_WBE_REASON_BAD_PHY_LINK	= 2,
1042 };
1043 
1044 struct wmi_wbe_link_down_event {
1045 	u8 cid;
1046 	u8 reserved[3];
1047 	__le32 reason;
1048 } __packed;
1049 
1050 /*
1051  * WMI_DATA_PORT_OPEN_EVENTID
1052  */
1053 struct wmi_data_port_open_event {
1054 	u8 cid;
1055 	u8 reserved[3];
1056 } __packed;
1057 
1058 /*
1059  * WMI_GET_PCP_CHANNEL_EVENTID
1060  */
1061 struct wmi_get_pcp_channel_event {
1062 	u8 channel;
1063 	u8 reserved[3];
1064 } __packed;
1065 
1066 /*
1067  * WMI_SW_TX_COMPLETE_EVENTID
1068  */
1069 enum wmi_sw_tx_status {
1070 	WMI_TX_SW_STATUS_SUCCESS		= 0,
1071 	WMI_TX_SW_STATUS_FAILED_NO_RESOURCES	= 1,
1072 	WMI_TX_SW_STATUS_FAILED_TX		= 2,
1073 };
1074 
1075 struct wmi_sw_tx_complete_event {
1076 	u8 status;	/* enum wmi_sw_tx_status */
1077 	u8 reserved[3];
1078 } __packed;
1079 
1080 /*
1081  * WMI_GET_SSID_EVENTID
1082  */
1083 struct wmi_get_ssid_event {
1084 	__le32 ssid_len;
1085 	u8 ssid[WMI_MAX_SSID_LEN];
1086 } __packed;
1087 
1088 /*
1089  * WMI_RX_MGMT_PACKET_EVENTID
1090  */
1091 struct wmi_rx_mgmt_info {
1092 	u8 mcs;
1093 	s8 snr;
1094 	__le16 range;
1095 	__le16 stype;
1096 	__le16 status;
1097 	__le32 len;
1098 	u8 qid;
1099 	u8 mid;
1100 	u8 cid;
1101 	u8 channel;	/* From Radio MNGR */
1102 } __packed;
1103 
1104 struct wmi_rx_mgmt_packet_event {
1105 	struct wmi_rx_mgmt_info info;
1106 	u8 payload[0];
1107 } __packed;
1108 
1109 /*
1110  * WMI_ECHO_RSP_EVENTID
1111  */
1112 struct wmi_echo_event {
1113 	__le32 echoed_value;
1114 } __packed;
1115 
1116 #endif /* __WILOCITY_WMI_H__ */
1117