1 /*
2  * This file is part of wl1271
3  *
4  * Copyright (C) 1998-2009 Texas Instruments. All rights reserved.
5  * Copyright (C) 2009 Nokia Corporation
6  *
7  * Contact: Luciano Coelho <luciano.coelho@nokia.com>
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * version 2 as published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21  * 02110-1301 USA
22  *
23  */
24 
25 #ifndef __CMD_H__
26 #define __CMD_H__
27 
28 #include "wl12xx.h"
29 
30 struct acx_header;
31 
32 int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len,
33 		    size_t res_len);
34 int wl1271_cmd_general_parms(struct wl1271 *wl);
35 int wl128x_cmd_general_parms(struct wl1271 *wl);
36 int wl1271_cmd_radio_parms(struct wl1271 *wl);
37 int wl128x_cmd_radio_parms(struct wl1271 *wl);
38 int wl1271_cmd_ext_radio_parms(struct wl1271 *wl);
39 int wl12xx_cmd_role_enable(struct wl1271 *wl, u8 *addr, u8 role_type,
40 			   u8 *role_id);
41 int wl12xx_cmd_role_disable(struct wl1271 *wl, u8 *role_id);
42 int wl12xx_cmd_role_start_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif);
43 int wl12xx_cmd_role_stop_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif);
44 int wl12xx_cmd_role_start_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif);
45 int wl12xx_cmd_role_stop_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif);
46 int wl12xx_cmd_role_start_ibss(struct wl1271 *wl, struct wl12xx_vif *wlvif);
47 int wl12xx_start_dev(struct wl1271 *wl, struct wl12xx_vif *wlvif);
48 int wl12xx_stop_dev(struct wl1271 *wl, struct wl12xx_vif *wlvif);
49 int wl1271_cmd_test(struct wl1271 *wl, void *buf, size_t buf_len, u8 answer);
50 int wl1271_cmd_interrogate(struct wl1271 *wl, u16 id, void *buf, size_t len);
51 int wl1271_cmd_configure(struct wl1271 *wl, u16 id, void *buf, size_t len);
52 int wl1271_cmd_data_path(struct wl1271 *wl, bool enable);
53 int wl1271_cmd_ps_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
54 		       u8 ps_mode, u16 auto_ps_timeout);
55 int wl1271_cmd_read_memory(struct wl1271 *wl, u32 addr, void *answer,
56 			   size_t len);
57 int wl1271_cmd_template_set(struct wl1271 *wl, u8 role_id,
58 			    u16 template_id, void *buf, size_t buf_len,
59 			    int index, u32 rates);
60 int wl12xx_cmd_build_null_data(struct wl1271 *wl, struct wl12xx_vif *wlvif);
61 int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif,
62 			     u16 aid);
63 int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
64 			       u8 role_id, u8 band,
65 			       const u8 *ssid, size_t ssid_len,
66 			       const u8 *ie, size_t ie_len);
67 struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl,
68 					      struct wl12xx_vif *wlvif,
69 					      struct sk_buff *skb);
70 int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif);
71 int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif);
72 int wl12xx_cmd_build_klv_null_data(struct wl1271 *wl,
73 				   struct wl12xx_vif *wlvif);
74 int wl12xx_cmd_set_default_wep_key(struct wl1271 *wl, u8 id, u8 hlid);
75 int wl1271_cmd_set_sta_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
76 			   u16 action, u8 id, u8 key_type,
77 			   u8 key_size, const u8 *key, const u8 *addr,
78 			   u32 tx_seq_32, u16 tx_seq_16);
79 int wl1271_cmd_set_ap_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
80 			  u16 action, u8 id, u8 key_type,
81 			  u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32,
82 			  u16 tx_seq_16);
83 int wl12xx_cmd_set_peer_state(struct wl1271 *wl, u8 hlid);
84 int wl12xx_roc(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 role_id);
85 int wl12xx_croc(struct wl1271 *wl, u8 role_id);
86 int wl12xx_cmd_add_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif,
87 			struct ieee80211_sta *sta, u8 hlid);
88 int wl12xx_cmd_remove_peer(struct wl1271 *wl, u8 hlid);
89 int wl12xx_cmd_config_fwlog(struct wl1271 *wl);
90 int wl12xx_cmd_start_fwlog(struct wl1271 *wl);
91 int wl12xx_cmd_stop_fwlog(struct wl1271 *wl);
92 int wl12xx_cmd_channel_switch(struct wl1271 *wl,
93 			      struct wl12xx_vif *wlvif,
94 			      struct ieee80211_channel_switch *ch_switch);
95 int wl12xx_cmd_stop_channel_switch(struct wl1271 *wl);
96 int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif,
97 			 u8 *hlid);
98 void wl12xx_free_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid);
99 
100 enum wl1271_commands {
101 	CMD_INTERROGATE	= 1, /* use this to read information elements */
102 	CMD_CONFIGURE	= 2, /* use this to write information elements */
103 	CMD_ENABLE_RX	= 3,
104 	CMD_ENABLE_TX	= 4,
105 	CMD_DISABLE_RX	= 5,
106 	CMD_DISABLE_TX	= 6,
107 	CMD_SCAN	= 7,
108 	CMD_STOP_SCAN	= 8,
109 	CMD_SET_KEYS	= 9,
110 	CMD_READ_MEMORY	= 10,
111 	CMD_WRITE_MEMORY	= 11,
112 	CMD_SET_TEMPLATE	= 12,
113 	CMD_TEST		= 13,
114 	CMD_NOISE_HIST		= 14,
115 	CMD_QUIET_ELEMENT_SET_STATE = 15,
116 	CMD_SET_BCN_MODE	= 16,
117 
118 	CMD_MEASUREMENT		= 17,
119 	CMD_STOP_MEASUREMENT	= 18,
120 	CMD_SET_PS_MODE		= 19,
121 	CMD_CHANNEL_SWITCH	= 20,
122 	CMD_STOP_CHANNEL_SWICTH = 21,
123 	CMD_AP_DISCOVERY	= 22,
124 	CMD_STOP_AP_DISCOVERY	= 23,
125 	CMD_HEALTH_CHECK	= 24,
126 	CMD_DEBUG		= 25,
127 	CMD_TRIGGER_SCAN_TO	= 26,
128 	CMD_CONNECTION_SCAN_CFG	= 27,
129 	CMD_CONNECTION_SCAN_SSID_CFG	= 28,
130 	CMD_START_PERIODIC_SCAN	= 29,
131 	CMD_STOP_PERIODIC_SCAN	= 30,
132 	CMD_SET_PEER_STATE	= 31,
133 	CMD_REMAIN_ON_CHANNEL	= 32,
134 	CMD_CANCEL_REMAIN_ON_CHANNEL	= 33,
135 	CMD_CONFIG_FWLOGGER		= 34,
136 	CMD_START_FWLOGGER			= 35,
137 	CMD_STOP_FWLOGGER			= 36,
138 
139 	/* Access point commands */
140 	CMD_ADD_PEER		= 37,
141 	CMD_REMOVE_PEER		= 38,
142 
143 	/* Role API */
144 	CMD_ROLE_ENABLE		= 39,
145 	CMD_ROLE_DISABLE	= 40,
146 	CMD_ROLE_START		= 41,
147 	CMD_ROLE_STOP		= 42,
148 
149 	/* DFS */
150 	CMD_START_RADAR_DETECTION	= 43,
151 	CMD_STOP_RADAR_DETECTION	= 44,
152 
153 	/* WIFI Direct */
154 	CMD_WFD_START_DISCOVERY	= 45,
155 	CMD_WFD_STOP_DISCOVERY	= 46,
156 	CMD_WFD_ATTRIBUTE_CONFIG	= 47,
157 	CMD_NOP			= 48,
158 	CMD_LAST_COMMAND,
159 
160 	MAX_COMMAND_ID = 0xFFFF,
161 };
162 
163 #define MAX_CMD_PARAMS 572
164 
165 enum {
166 	CMD_TEMPL_KLV_IDX_NULL_DATA = 0,
167 	CMD_TEMPL_KLV_IDX_MAX = 4
168 };
169 
170 enum cmd_templ {
171 	CMD_TEMPL_NULL_DATA = 0,
172 	CMD_TEMPL_BEACON,
173 	CMD_TEMPL_CFG_PROBE_REQ_2_4,
174 	CMD_TEMPL_CFG_PROBE_REQ_5,
175 	CMD_TEMPL_PROBE_RESPONSE,
176 	CMD_TEMPL_QOS_NULL_DATA,
177 	CMD_TEMPL_PS_POLL,
178 	CMD_TEMPL_KLV,
179 	CMD_TEMPL_DISCONNECT,
180 	CMD_TEMPL_PROBE_REQ_2_4, /* for firmware internal use only */
181 	CMD_TEMPL_PROBE_REQ_5,   /* for firmware internal use only */
182 	CMD_TEMPL_BAR,           /* for firmware internal use only */
183 	CMD_TEMPL_CTS,           /*
184 				  * For CTS-to-self (FastCTS) mechanism
185 				  * for BT/WLAN coexistence (SoftGemini). */
186 	CMD_TEMPL_AP_BEACON,
187 	CMD_TEMPL_AP_PROBE_RESPONSE,
188 	CMD_TEMPL_ARP_RSP,
189 	CMD_TEMPL_DEAUTH_AP,
190 	CMD_TEMPL_TEMPORARY,
191 	CMD_TEMPL_LINK_MEASUREMENT_REPORT,
192 
193 	CMD_TEMPL_MAX = 0xff
194 };
195 
196 /* unit ms */
197 #define WL1271_COMMAND_TIMEOUT     2000
198 #define WL1271_CMD_TEMPL_DFLT_SIZE 252
199 #define WL1271_CMD_TEMPL_MAX_SIZE  512
200 #define WL1271_EVENT_TIMEOUT       750
201 
202 struct wl1271_cmd_header {
203 	__le16 id;
204 	__le16 status;
205 	/* payload */
206 	u8 data[0];
207 } __packed;
208 
209 #define WL1271_CMD_MAX_PARAMS 572
210 
211 struct wl1271_command {
212 	struct wl1271_cmd_header header;
213 	u8  parameters[WL1271_CMD_MAX_PARAMS];
214 } __packed;
215 
216 enum {
217 	CMD_MAILBOX_IDLE		=  0,
218 	CMD_STATUS_SUCCESS		=  1,
219 	CMD_STATUS_UNKNOWN_CMD		=  2,
220 	CMD_STATUS_UNKNOWN_IE		=  3,
221 	CMD_STATUS_REJECT_MEAS_SG_ACTIVE	= 11,
222 	CMD_STATUS_RX_BUSY		= 13,
223 	CMD_STATUS_INVALID_PARAM		= 14,
224 	CMD_STATUS_TEMPLATE_TOO_LARGE		= 15,
225 	CMD_STATUS_OUT_OF_MEMORY		= 16,
226 	CMD_STATUS_STA_TABLE_FULL		= 17,
227 	CMD_STATUS_RADIO_ERROR		= 18,
228 	CMD_STATUS_WRONG_NESTING		= 19,
229 	CMD_STATUS_TIMEOUT		= 21, /* Driver internal use.*/
230 	CMD_STATUS_FW_RESET		= 22, /* Driver internal use.*/
231 	CMD_STATUS_TEMPLATE_OOM		= 23,
232 	CMD_STATUS_NO_RX_BA_SESSION	= 24,
233 	MAX_COMMAND_STATUS		= 0xff
234 };
235 
236 #define CMDMBOX_HEADER_LEN 4
237 #define CMDMBOX_INFO_ELEM_HEADER_LEN 4
238 
239 enum {
240 	BSS_TYPE_IBSS = 0,
241 	BSS_TYPE_STA_BSS = 2,
242 	BSS_TYPE_AP_BSS = 3,
243 	MAX_BSS_TYPE = 0xFF
244 };
245 
246 #define WL1271_JOIN_CMD_CTRL_TX_FLUSH     0x80 /* Firmware flushes all Tx */
247 #define WL1271_JOIN_CMD_TX_SESSION_OFFSET 1
248 #define WL1271_JOIN_CMD_BSS_TYPE_5GHZ 0x10
249 
250 struct wl12xx_cmd_role_enable {
251 	struct wl1271_cmd_header header;
252 
253 	u8 role_id;
254 	u8 role_type;
255 	u8 mac_address[ETH_ALEN];
256 } __packed;
257 
258 struct wl12xx_cmd_role_disable {
259 	struct wl1271_cmd_header header;
260 
261 	u8 role_id;
262 	u8 padding[3];
263 } __packed;
264 
265 enum wl12xx_band {
266 	WL12XX_BAND_2_4GHZ		= 0,
267 	WL12XX_BAND_5GHZ		= 1,
268 	WL12XX_BAND_JAPAN_4_9_GHZ	= 2,
269 	WL12XX_BAND_DEFAULT		= WL12XX_BAND_2_4GHZ,
270 	WL12XX_BAND_INVALID		= 0x7E,
271 	WL12XX_BAND_MAX_RADIO		= 0x7F,
272 };
273 
274 struct wl12xx_cmd_role_start {
275 	struct wl1271_cmd_header header;
276 
277 	u8 role_id;
278 	u8 band;
279 	u8 channel;
280 	u8 padding;
281 
282 	union {
283 		struct {
284 			u8 hlid;
285 			u8 session;
286 			u8 padding_1[54];
287 		} __packed device;
288 		/* sta & p2p_cli use the same struct */
289 		struct {
290 			u8 bssid[ETH_ALEN];
291 			u8 hlid; /* data hlid */
292 			u8 session;
293 			__le32 remote_rates; /* remote supported rates */
294 
295 			/*
296 			 * The target uses this field to determine the rate at
297 			 * which to transmit control frame responses (such as
298 			 * ACK or CTS frames).
299 			 */
300 			__le32 basic_rate_set;
301 			__le32 local_rates; /* local supported rates */
302 
303 			u8 ssid_type;
304 			u8 ssid_len;
305 			u8 ssid[IEEE80211_MAX_SSID_LEN];
306 
307 			__le16 beacon_interval; /* in TBTTs */
308 		} __packed sta;
309 		struct {
310 			u8 bssid[ETH_ALEN];
311 			u8 hlid; /* data hlid */
312 			u8 dtim_interval;
313 			__le32 remote_rates; /* remote supported rates */
314 
315 			__le32 basic_rate_set;
316 			__le32 local_rates; /* local supported rates */
317 
318 			u8 ssid_type;
319 			u8 ssid_len;
320 			u8 ssid[IEEE80211_MAX_SSID_LEN];
321 
322 			__le16 beacon_interval; /* in TBTTs */
323 
324 			u8 padding_1[4];
325 		} __packed ibss;
326 		/* ap & p2p_go use the same struct */
327 		struct {
328 			__le16 aging_period; /* in secs */
329 			u8 beacon_expiry; /* in ms */
330 			u8 bss_index;
331 			/* The host link id for the AP's global queue */
332 			u8 global_hlid;
333 			/* The host link id for the AP's broadcast queue */
334 			u8 broadcast_hlid;
335 
336 			__le16 beacon_interval; /* in TBTTs */
337 
338 			__le32 basic_rate_set;
339 			__le32 local_rates; /* local supported rates */
340 
341 			u8 dtim_interval;
342 
343 			u8 ssid_type;
344 			u8 ssid_len;
345 			u8 ssid[IEEE80211_MAX_SSID_LEN];
346 
347 			u8 reset_tsf;
348 
349 			u8 padding_1[4];
350 		} __packed ap;
351 	};
352 } __packed;
353 
354 struct wl12xx_cmd_role_stop {
355 	struct wl1271_cmd_header header;
356 
357 	u8 role_id;
358 	u8 disc_type; /* only STA and P2P_CLI */
359 	__le16 reason; /* only STA and P2P_CLI */
360 } __packed;
361 
362 struct cmd_enabledisable_path {
363 	struct wl1271_cmd_header header;
364 
365 	u8 channel;
366 	u8 padding[3];
367 } __packed;
368 
369 #define WL1271_RATE_AUTOMATIC  0
370 
371 struct wl1271_cmd_template_set {
372 	struct wl1271_cmd_header header;
373 
374 	u8 role_id;
375 	u8 template_type;
376 	__le16 len;
377 	u8 index;  /* relevant only for KLV_TEMPLATE type */
378 	u8 padding[3];
379 
380 	__le32 enabled_rates;
381 	u8 short_retry_limit;
382 	u8 long_retry_limit;
383 	u8 aflags;
384 	u8 reserved;
385 
386 	u8 template_data[WL1271_CMD_TEMPL_MAX_SIZE];
387 } __packed;
388 
389 #define TIM_ELE_ID    5
390 #define PARTIAL_VBM_MAX    251
391 
392 struct wl1271_tim {
393 	u8 identity;
394 	u8 length;
395 	u8 dtim_count;
396 	u8 dtim_period;
397 	u8 bitmap_ctrl;
398 	u8 pvb_field[PARTIAL_VBM_MAX]; /* Partial Virtual Bitmap */
399 } __packed;
400 
401 enum wl1271_cmd_ps_mode {
402 	STATION_AUTO_PS_MODE,   /* Dynamic Power Save */
403 	STATION_ACTIVE_MODE,
404 	STATION_POWER_SAVE_MODE
405 };
406 
407 struct wl1271_cmd_ps_params {
408 	struct wl1271_cmd_header header;
409 
410 	u8 role_id;
411 	u8 ps_mode; /* STATION_* */
412 	u16 auto_ps_timeout;
413 } __packed;
414 
415 /* HW encryption keys */
416 #define NUM_ACCESS_CATEGORIES_COPY 4
417 
418 enum wl1271_cmd_key_action {
419 	KEY_ADD_OR_REPLACE = 1,
420 	KEY_REMOVE         = 2,
421 	KEY_SET_ID         = 3,
422 	MAX_KEY_ACTION     = 0xffff,
423 };
424 
425 enum wl1271_cmd_lid_key_type {
426 	UNICAST_LID_TYPE     = 0,
427 	BROADCAST_LID_TYPE   = 1,
428 	WEP_DEFAULT_LID_TYPE = 2
429 };
430 
431 enum wl1271_cmd_key_type {
432 	KEY_NONE = 0,
433 	KEY_WEP  = 1,
434 	KEY_TKIP = 2,
435 	KEY_AES  = 3,
436 	KEY_GEM  = 4,
437 };
438 
439 struct wl1271_cmd_set_keys {
440 	struct wl1271_cmd_header header;
441 
442 	/*
443 	 * Indicates whether the HLID is a unicast key set
444 	 * or broadcast key set. A special value 0xFF is
445 	 * used to indicate that the HLID is on WEP-default
446 	 * (multi-hlids). of type wl1271_cmd_lid_key_type.
447 	 */
448 	u8 hlid;
449 
450 	/*
451 	 * In WEP-default network (hlid == 0xFF) used to
452 	 * indicate which network STA/IBSS/AP role should be
453 	 * changed
454 	 */
455 	u8 lid_key_type;
456 
457 	/*
458 	 * Key ID - For TKIP and AES key types, this field
459 	 * indicates the value that should be inserted into
460 	 * the KeyID field of frames transmitted using this
461 	 * key entry. For broadcast keys the index use as a
462 	 * marker for TX/RX key.
463 	 * For WEP default network (HLID=0xFF), this field
464 	 * indicates the ID of the key to add or remove.
465 	 */
466 	u8 key_id;
467 	u8 reserved_1;
468 
469 	/* key_action_e */
470 	__le16 key_action;
471 
472 	/* key size in bytes */
473 	u8 key_size;
474 
475 	/* key_type_e */
476 	u8 key_type;
477 
478 	/* This field holds the security key data to add to the STA table */
479 	u8 key[MAX_KEY_SIZE];
480 	__le16 ac_seq_num16[NUM_ACCESS_CATEGORIES_COPY];
481 	__le32 ac_seq_num32[NUM_ACCESS_CATEGORIES_COPY];
482 } __packed;
483 
484 struct wl1271_cmd_test_header {
485 	u8 id;
486 	u8 padding[3];
487 } __packed;
488 
489 enum wl1271_channel_tune_bands {
490 	WL1271_CHANNEL_TUNE_BAND_2_4,
491 	WL1271_CHANNEL_TUNE_BAND_5,
492 	WL1271_CHANNEL_TUNE_BAND_4_9
493 };
494 
495 #define WL1271_PD_REFERENCE_POINT_BAND_B_G  0
496 
497 #define TEST_CMD_INI_FILE_RADIO_PARAM       0x19
498 #define TEST_CMD_INI_FILE_GENERAL_PARAM     0x1E
499 #define TEST_CMD_INI_FILE_RF_EXTENDED_PARAM 0x26
500 
501 struct wl1271_general_parms_cmd {
502 	struct wl1271_cmd_header header;
503 
504 	struct wl1271_cmd_test_header test;
505 
506 	struct wl1271_ini_general_params general_params;
507 
508 	u8 sr_debug_table[WL1271_INI_MAX_SMART_REFLEX_PARAM];
509 	u8 sr_sen_n_p;
510 	u8 sr_sen_n_p_gain;
511 	u8 sr_sen_nrn;
512 	u8 sr_sen_prn;
513 	u8 padding[3];
514 } __packed;
515 
516 struct wl128x_general_parms_cmd {
517 	struct wl1271_cmd_header header;
518 
519 	struct wl1271_cmd_test_header test;
520 
521 	struct wl128x_ini_general_params general_params;
522 
523 	u8 sr_debug_table[WL1271_INI_MAX_SMART_REFLEX_PARAM];
524 	u8 sr_sen_n_p;
525 	u8 sr_sen_n_p_gain;
526 	u8 sr_sen_nrn;
527 	u8 sr_sen_prn;
528 	u8 padding[3];
529 } __packed;
530 
531 struct wl1271_radio_parms_cmd {
532 	struct wl1271_cmd_header header;
533 
534 	struct wl1271_cmd_test_header test;
535 
536 	/* Static radio parameters */
537 	struct wl1271_ini_band_params_2 static_params_2;
538 	struct wl1271_ini_band_params_5 static_params_5;
539 
540 	/* Dynamic radio parameters */
541 	struct wl1271_ini_fem_params_2 dyn_params_2;
542 	u8 padding2;
543 	struct wl1271_ini_fem_params_5 dyn_params_5;
544 	u8 padding3[2];
545 } __packed;
546 
547 struct wl128x_radio_parms_cmd {
548 	struct wl1271_cmd_header header;
549 
550 	struct wl1271_cmd_test_header test;
551 
552 	/* Static radio parameters */
553 	struct wl128x_ini_band_params_2 static_params_2;
554 	struct wl128x_ini_band_params_5 static_params_5;
555 
556 	u8 fem_vendor_and_options;
557 
558 	/* Dynamic radio parameters */
559 	struct wl128x_ini_fem_params_2 dyn_params_2;
560 	u8 padding2;
561 	struct wl128x_ini_fem_params_5 dyn_params_5;
562 } __packed;
563 
564 struct wl1271_ext_radio_parms_cmd {
565 	struct wl1271_cmd_header header;
566 
567 	struct wl1271_cmd_test_header test;
568 
569 	u8 tx_per_channel_power_compensation_2[CONF_TX_PWR_COMPENSATION_LEN_2];
570 	u8 tx_per_channel_power_compensation_5[CONF_TX_PWR_COMPENSATION_LEN_5];
571 	u8 padding[3];
572 } __packed;
573 
574 /*
575  * There are three types of disconnections:
576  *
577  * DISCONNECT_IMMEDIATE: the fw doesn't send any frames
578  * DISCONNECT_DEAUTH:    the fw generates a DEAUTH request with the reason
579  *                       we have passed
580  * DISCONNECT_DISASSOC:  the fw generates a DESASSOC request with the reason
581  *                       we have passed
582  */
583 enum wl1271_disconnect_type {
584 	DISCONNECT_IMMEDIATE,
585 	DISCONNECT_DEAUTH,
586 	DISCONNECT_DISASSOC
587 };
588 
589 #define WL1271_CMD_STA_STATE_CONNECTED  1
590 
591 struct wl12xx_cmd_set_peer_state {
592 	struct wl1271_cmd_header header;
593 
594 	u8 hlid;
595 	u8 state;
596 	u8 padding[2];
597 } __packed;
598 
599 struct wl12xx_cmd_roc {
600 	struct wl1271_cmd_header header;
601 
602 	u8 role_id;
603 	u8 channel;
604 	u8 band;
605 	u8 padding;
606 };
607 
608 struct wl12xx_cmd_croc {
609 	struct wl1271_cmd_header header;
610 
611 	u8 role_id;
612 	u8 padding[3];
613 };
614 
615 enum wl12xx_ssid_type {
616 	WL12XX_SSID_TYPE_PUBLIC = 0,
617 	WL12XX_SSID_TYPE_HIDDEN = 1,
618 	WL12XX_SSID_TYPE_ANY = 2,
619 };
620 
621 enum wl1271_psd_type {
622 	WL1271_PSD_LEGACY = 0,
623 	WL1271_PSD_UPSD_TRIGGER = 1,
624 	WL1271_PSD_LEGACY_PSPOLL = 2,
625 	WL1271_PSD_SAPSD = 3
626 };
627 
628 struct wl12xx_cmd_add_peer {
629 	struct wl1271_cmd_header header;
630 
631 	u8 addr[ETH_ALEN];
632 	u8 hlid;
633 	u8 aid;
634 	u8 psd_type[NUM_ACCESS_CATEGORIES_COPY];
635 	__le32 supported_rates;
636 	u8 bss_index;
637 	u8 sp_len;
638 	u8 wmm;
639 	u8 padding1;
640 } __packed;
641 
642 struct wl12xx_cmd_remove_peer {
643 	struct wl1271_cmd_header header;
644 
645 	u8 hlid;
646 	u8 reason_opcode;
647 	u8 send_deauth_flag;
648 	u8 padding1;
649 } __packed;
650 
651 /*
652  * Continuous mode - packets are transferred to the host periodically
653  * via the data path.
654  * On demand - Log messages are stored in a cyclic buffer in the
655  * firmware, and only transferred to the host when explicitly requested
656  */
657 enum wl12xx_fwlogger_log_mode {
658 	WL12XX_FWLOG_CONTINUOUS,
659 	WL12XX_FWLOG_ON_DEMAND
660 };
661 
662 /* Include/exclude timestamps from the log messages */
663 enum wl12xx_fwlogger_timestamp {
664 	WL12XX_FWLOG_TIMESTAMP_DISABLED,
665 	WL12XX_FWLOG_TIMESTAMP_ENABLED
666 };
667 
668 /*
669  * Logs can be routed to the debug pinouts (where available), to the host bus
670  * (SDIO/SPI), or dropped
671  */
672 enum wl12xx_fwlogger_output {
673 	WL12XX_FWLOG_OUTPUT_NONE,
674 	WL12XX_FWLOG_OUTPUT_DBG_PINS,
675 	WL12XX_FWLOG_OUTPUT_HOST,
676 };
677 
678 struct wl12xx_cmd_config_fwlog {
679 	struct wl1271_cmd_header header;
680 
681 	/* See enum wl12xx_fwlogger_log_mode */
682 	u8 logger_mode;
683 
684 	/* Minimum log level threshold */
685 	u8 log_severity;
686 
687 	/* Include/exclude timestamps from the log messages */
688 	u8 timestamp;
689 
690 	/* See enum wl1271_fwlogger_output */
691 	u8 output;
692 
693 	/* Regulates the frequency of log messages */
694 	u8 threshold;
695 
696 	u8 padding[3];
697 } __packed;
698 
699 struct wl12xx_cmd_start_fwlog {
700 	struct wl1271_cmd_header header;
701 } __packed;
702 
703 struct wl12xx_cmd_stop_fwlog {
704 	struct wl1271_cmd_header header;
705 } __packed;
706 
707 struct wl12xx_cmd_channel_switch {
708 	struct wl1271_cmd_header header;
709 
710 	u8 role_id;
711 
712 	/* The new serving channel */
713 	u8 channel;
714 	/* Relative time of the serving channel switch in TBTT units */
715 	u8 switch_time;
716 	/* Stop the role TX, should expect it after radar detection */
717 	u8 stop_tx;
718 	/* The target channel tx status 1-stopped 0-open*/
719 	u8 post_switch_tx_disable;
720 
721 	u8 padding[3];
722 } __packed;
723 
724 struct wl12xx_cmd_stop_channel_switch {
725 	struct wl1271_cmd_header header;
726 } __packed;
727 
728 #endif /* __WL1271_CMD_H__ */
729