xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/nxp/mlinux/moal_cfg80211_util.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /** @file moal_cfg80211_util.h
2  *
3  * @brief This file contains the CFG80211 vendor specific defines.
4  *
5  *
6  * Copyright 2015-2021 NXP
7  *
8  * This software file (the File) is distributed by NXP
9  * under the terms of the GNU General Public License Version 2, June 1991
10  * (the License).  You may use, redistribute and/or modify the File in
11  * accordance with the terms and conditions of the License, a copy of which
12  * is available by writing to the Free Software Foundation, Inc.,
13  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
14  * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
15  *
16  * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
18  * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
19  * this warranty disclaimer.
20  *
21  */
22 
23 #ifndef _MOAL_CFGVENDOR_H_
24 #define _MOAL_CFGVENDOR_H_
25 
26 #include "moal_main.h"
27 
28 #define TLV_TYPE_APINFO (PROPRIETARY_TLV_BASE_ID + 249)
29 #define TLV_TYPE_KEYINFO (PROPRIETARY_TLV_BASE_ID + 250)
30 #define TLV_TYPE_ASSOC_REQ_IE (PROPRIETARY_TLV_BASE_ID + 292)
31 
32 /** Key Info structure */
33 typedef struct _key_info_tlv {
34 	/** Header */
35 	MrvlIEtypesHeader_t header;
36 	/** kck, kek, key_replay*/
37 	mlan_ds_misc_gtk_rekey_data key;
38 } key_info;
39 
40 /** APinfo TLV structure */
41 typedef struct _apinfo_tlv {
42 	/** Header */
43 	MrvlIEtypesHeader_t header;
44 	/** Assoc response buffer */
45 	t_u8 rsp_ie[1];
46 } apinfo;
47 
48 #if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
49 #define RING_NAME_MAX 32
50 typedef int wifi_ring_buffer_id;
51 
52 #define VALID_RING(id) (id >= 0 && id < RING_ID_MAX)
53 
54 /** WiFi ring control structure */
55 typedef struct _wifi_ring_ctrl {
56 	/** Written bytes */
57 	t_u32 written_bytes;
58 	/** Read Bytes */
59 	t_u32 read_bytes;
60 	/** Written records */
61 	t_u32 written_records;
62 } ring_buffer_ctrl;
63 
64 enum ring_state {
65 	/** ring is not initialized*/
66 	RING_STOP = 0,
67 	/** ring is live and logging*/
68 	RING_ACTIVE,
69 	/** ring is initialized but not logging*/
70 	RING_SUSPEND,
71 };
72 
73 /** WiFi ring buffer sttructure */
74 typedef struct _wifi_ring_buffer {
75 	/** Ring ID */
76 	wifi_ring_buffer_id ring_id;
77 	/** Ring name */
78 	t_u8 name[RING_NAME_MAX];
79 	/** Ring size */
80 	t_u32 ring_size;
81 	/** Write pointer */
82 	t_u32 wp;
83 	/** Read pointer */
84 	t_u32 rp;
85 	/** Log level */
86 	t_u32 log_level;
87 	/** Threshold */
88 	t_u32 threshold;
89 	/** Ring buffer */
90 	void *ring_buf;
91 	/** Lock */
92 	spinlock_t lock;
93 	/** Buffer control */
94 	ring_buffer_ctrl ctrl;
95 	/** Ring state */
96 	enum ring_state state;
97 	/** Delayed work */
98 	struct delayed_work work;
99 	/** Interval */
100 	unsigned long interval;
101 	/** Moal priv */
102 	moal_private *priv;
103 } wifi_ring_buffer;
104 
105 #define VERBOSE_RING_NAME "verbose"
106 #define EVENT_RING_NAME "event"
107 
108 #define DEFAULT_RING_BUFFER_SIZE 1024
109 
110 #define TLV_LOG_HEADER_LEN 4
111 
112 #define WIFI_LOGGER_MEMORY_DUMP_SUPPORTED MBIT(0) /* Memory dump of Fw*/
113 #define WIFI_LOGGER_PER_PACKET_TX_RX_STATUS_SUPPORT MBIT(1) /*PKT status*/
114 #define WIFI_LOGGER_CONNECT_EVENT_SUPPORTED MBIT(2) /* connectivity event*/
115 #define WIFI_LOGGER_POWER_EVENT_SUPPORTED MBIT(3) /* Power of driver*/
116 #define WIFI_LOGGER_WAKE_LOCK_SUPPORTED MBIT(4) /* Wake lock of driver*/
117 #define WIFI_LOGGER_VERBOSE_SUPPORTED MBIT(5) /*verbose log of Fw*/
118 #define WIFI_LOGGER_WATCHDOG_TIMER_SUPPORTED                                   \
119 	MBIT(6) /*monitor the health of Fw*/
120 
121 /**
122  * Parameters of wifi logger events are TLVs
123  * Event parameters tags are defined as:
124  */
125 #define WIFI_TAG_VENDOR_SPECIFIC 0 // take a byte stream as parameter
126 #define WIFI_TAG_BSSID 1 // takes a 6 bytes MAC address as parameter
127 #define WIFI_TAG_ADDR 2 // takes a 6 bytes MAC address as parameter
128 #define WIFI_TAG_SSID 3 // takes a 32 bytes SSID address as parameter
129 #define WIFI_TAG_STATUS 4 // takes an integer as parameter
130 #define WIFI_TAG_REASON_CODE 14 // take a reason code as per 802.11 as parameter
131 #define WIFI_TAG_RSSI 21 // take an integer as parameter
132 #define WIFI_TAG_CHANNEL 22 // take an integer as parameter
133 
134 #define RING_ENTRY_SIZE (sizeof(wifi_ring_buffer_entry))
135 #define ENTRY_LENGTH(hdr) (hdr->entry_size + RING_ENTRY_SIZE)
136 #define READ_AVAIL_SPACE(ring)                                                 \
137 	(ring->ctrl.written_bytes - ring->ctrl.read_bytes)
138 
139 enum logger_attributes {
140 	ATTR_WIFI_LOGGER_INVALID = 0,
141 	ATTR_WIFI_LOGGER_RING_ID,
142 	ATTR_WIFI_LOGGER_FLAGS,
143 	ATTR_WIFI_LOGGER_VERBOSE_LEVEL,
144 	ATTR_WIFI_LOGGER_MIN_DATA_SIZE,
145 	ATTR_RING_BUFFER_STATUS,
146 	ATTR_NUM_RINGS,
147 	ATTR_WIFI_LOGGER_FEATURE_SET,
148 	ATTR_WIFI_LOGGER_MAX_INTERVAL_SEC,
149 	ATTR_RING_BUFFER,
150 	ATTR_NAME,
151 	ATTR_MEM_DUMP,
152 	ATTR_ERR_CODE,
153 	ATTR_RING_DATA,
154 	ATTR_WAKE_REASON_STAT,
155 	ATTR_PACKET_FATE_TX,
156 	ATTR_PACKET_FATE_RX,
157 	ATTR_PACKET_FATE_DATA,
158 	ATTR_FW_DUMP_PATH = 20,
159 	ATTR_DRV_DUMP_PATH = 21,
160 	ATTR_WIFI_LOGGER_AFTER_LAST,
161 	ATTR_WIFI_LOGGER_MAX = ATTR_WIFI_LOGGER_AFTER_LAST - 1
162 };
163 
164 /* Below events refer to the wifi_connectivity_event ring and shall be supported
165  */
166 enum { WIFI_EVENT_ASSOCIATION_REQUESTED = 0,
167        WIFI_EVENT_AUTH_COMPLETE,
168        WIFI_EVENT_ASSOC_COMPLETE,
169 };
170 
171 enum {
172 	/* set for binary entries */
173 	RING_BUFFER_ENTRY_FLAGS_HAS_BINARY = (1 << (0)),
174 	/* set if 64 bits timestamp is present */
175 	RING_BUFFER_ENTRY_FLAGS_HAS_TIMESTAMP = (1 << (1))
176 };
177 
178 enum { ENTRY_TYPE_CONNECT_EVENT = 1,
179        ENTRY_TYPE_PKT,
180        ENTRY_TYPE_WAKE_LOCK,
181        ENTRY_TYPE_POWER_EVENT,
182        ENTRY_TYPE_DATA };
183 
184 /** WiFi ring buffer entry structure */
185 typedef struct {
186 	/** size of payload excluding the header */
187 	t_u16 entry_size;
188 	/** Flags */
189 	t_u8 flags;
190 	/** entry type */
191 	t_u8 type;
192 	/** present if has_timestamp bit is set. */
193 	t_u64 timestamp;
194 } __attribute__((packed)) wifi_ring_buffer_entry;
195 
196 /** WiFi ring buffer status structure*/
197 typedef struct _wifi_ring_buffer_status {
198 	/** Ring name */
199 	t_u8 name[RING_NAME_MAX];
200 	/** Flag */
201 	t_u32 flag;
202 	/** Ring ID */
203 	wifi_ring_buffer_id ring_id;
204 	/** Buffer size */
205 	t_u32 ring_buffer_byte_size;
206 	/** Verbose Level */
207 	t_u32 verbose_level;
208 	/** Written bytes */
209 	t_u32 written_bytes;
210 	/** Read bytes */
211 	t_u32 read_bytes;
212 	/** Written records */
213 	t_u32 written_records;
214 } wifi_ring_buffer_status;
215 
216 /** TLV log structure */
217 typedef struct {
218 	/** Tag */
219 	u16 tag;
220 	/** Length of value*/
221 	u16 length;
222 	/** Value */
223 	u8 value[];
224 } __attribute__((packed)) tlv_log;
225 
226 /** WiFi ring buffer driver structure */
227 typedef struct {
228 	/** event */
229 	u16 event;
230 	/** TLV log structure array */
231 	tlv_log tlvs[];
232 	/** separate parameter structure per event to be provided and optional
233 	 * data the event_data is expected to include an official android part,
234 	 * with some parameter as transmit rate, num retries, num scan result
235 	 * found etc... as well, event_data can include a vendor proprietary
236 	 * part which is understood by the developer only
237 	 */
238 } __attribute__((packed)) wifi_ring_buffer_driver_connectivity_event;
239 
240 /** Assoc logger data structure */
241 typedef struct _assoc_logger {
242 	/** vendor specific */
243 	t_u8 oui[3];
244 	/** BSSID */
245 	t_u8 bssid[MLAN_MAC_ADDR_LENGTH];
246 	/** SSID */
247 	t_u8 ssid[MLAN_MAX_SSID_LENGTH];
248 	/** RSSI */
249 	t_s32 rssi;
250 	/** Channel */
251 	t_u32 channel;
252 } assoc_logger_data;
253 
254 int woal_ring_event_logger(moal_private *priv, int ring_id,
255 			   pmlan_event pmevent);
256 
257 int woal_wake_reason_logger(moal_private *priv,
258 			    mlan_ds_hs_wakeup_reason wake_reason);
259 
260 #define MD5_PREFIX_LEN 4
261 #define MAX_FATE_LOG_LEN 32
262 #define MAX_FRAME_LEN_ETHERNET 1518
263 #define MAX_FRAME_LEN_80211_MGMT 2352
264 
265 /** packet_fate_packet_type */
266 typedef enum {
267 	PACKET_TYPE_TX,
268 	PACKET_TYPE_RX,
269 } packet_fate_packet_type;
270 
271 /** packet fate frame_type */
272 typedef enum {
273 	FRAME_TYPE_UNKNOWN,
274 	FRAME_TYPE_ETHERNET_II,
275 	FRAME_TYPE_80211_MGMT,
276 } frame_type;
277 
278 /** wifi_tx_packet_fate */
279 typedef enum {
280 	/** Sent over air and ACKed. */
281 	TX_PKT_FATE_ACKED,
282 
283 	/** Sent over air but not ACKed. (Normal for broadcast/multicast.) */
284 	TX_PKT_FATE_SENT,
285 
286 	/** Queued within firmware, but not yet sent over air. */
287 	TX_PKT_FATE_FW_QUEUED,
288 
289 	/** Dropped by firmware as invalid. E.g. bad source address, bad
290 	 *  checksum, or invalid for current state.
291 	 */
292 	TX_PKT_FATE_FW_DROP_INVALID,
293 
294 	/** Dropped by firmware due to lack of buffer space. */
295 	TX_PKT_FATE_FW_DROP_NOBUFS,
296 
297 	/** Dropped by firmware for any other reason. Includes frames that were
298 	 *  sent by driver to firmware, but unaccounted for by firmware.
299 	 */
300 	TX_PKT_FATE_FW_DROP_OTHER,
301 
302 	/** Queued within driver, not yet sent to firmware. */
303 	TX_PKT_FATE_DRV_QUEUED,
304 
305 	/** Dropped by driver as invalid. E.g. bad source address, or invalid
306 	 *  for current state.
307 	 */
308 	TX_PKT_FATE_DRV_DROP_INVALID,
309 
310 	/** Dropped by driver due to lack of buffer space. */
311 	TX_PKT_FATE_DRV_DROP_NOBUFS,
312 
313 	/** Dropped by driver for any other reason. */
314 	TX_PKT_FATE_DRV_DROP_OTHER,
315 } wifi_tx_packet_fate;
316 
317 /** wifi_rx_packet_fate */
318 typedef enum {
319 	/** Valid and delivered to network stack (e.g., netif_rx()). */
320 	RX_PKT_FATE_SUCCESS,
321 
322 	/** Queued within firmware, but not yet sent to driver. */
323 	RX_PKT_FATE_FW_QUEUED,
324 
325 	/** Dropped by firmware due to host-programmable filters. */
326 	RX_PKT_FATE_FW_DROP_FILTER,
327 
328 	/** Dropped by firmware as invalid. E.g. bad checksum, decrypt failed,
329 	 *  or invalid for current state.
330 	 */
331 	RX_PKT_FATE_FW_DROP_INVALID,
332 
333 	/** Dropped by firmware due to lack of buffer space. */
334 	RX_PKT_FATE_FW_DROP_NOBUFS,
335 
336 	/** Dropped by firmware for any other reason. */
337 	RX_PKT_FATE_FW_DROP_OTHER,
338 
339 	/** Queued within driver, not yet delivered to network stack. */
340 	RX_PKT_FATE_DRV_QUEUED,
341 
342 	/** Dropped by driver due to filter rules. */
343 	RX_PKT_FATE_DRV_DROP_FILTER,
344 
345 	/** Dropped by driver as invalid. E.g. not permitted in current state.
346 	 */
347 	RX_PKT_FATE_DRV_DROP_INVALID,
348 
349 	/** Dropped by driver due to lack of buffer space. */
350 	RX_PKT_FATE_DRV_DROP_NOBUFS,
351 
352 	/** Dropped by driver for any other reason. */
353 	RX_PKT_FATE_DRV_DROP_OTHER,
354 } wifi_rx_packet_fate;
355 
356 /** frame_info_i */
357 typedef struct {
358 	/** Payload Type */
359 	frame_type payload_type;
360 	/** Driver timestamp in uS */
361 	u32 driver_timestamp_usec;
362 	/** FW timestamp in uS */
363 	u32 firmware_timestamp_usec;
364 	/** Frame Length */
365 	u32 frame_len;
366 } frame_info_i;
367 
368 /** wifi_tx_report_i */
369 typedef struct {
370 	/** MD5 prefix */
371 	char md5_prefix[MD5_PREFIX_LEN];
372 	/** TX packet fate */
373 	wifi_tx_packet_fate fate;
374 	/** frame information */
375 	frame_info_i frame_inf;
376 } wifi_tx_report_i;
377 
378 /** wifi_rx_report_i */
379 typedef struct {
380 	/** MD5 prefix */
381 	char md5_prefix[MD5_PREFIX_LEN];
382 	/** TX packet fate */
383 	wifi_rx_packet_fate fate;
384 	/** frame information */
385 	frame_info_i frame_inf;
386 } wifi_rx_report_i;
387 
388 /** packet_fate_report_t */
389 typedef struct packet_fate_report_t {
390 	union {
391 		wifi_tx_report_i tx_report_i;
392 		wifi_rx_report_i rx_report_i;
393 	} u;
394 } PACKET_FATE_REPORT;
395 
396 int woal_packet_fate_monitor(moal_private *priv,
397 			     packet_fate_packet_type pkt_type, t_u8 fate,
398 			     frame_type payload_type,
399 			     t_u32 driver_timestamp_usec,
400 			     t_u32 firmware_timestamp_usec, t_u8 *data,
401 			     t_u32 len);
402 
403 /** =========== Define Copied from apf.h START =========== */
404 /* Number of memory slots, see ldm/stm instructions. */
405 #define MEM_ITEMS 16
406 /* Upon program execution starting some memory slots are prefilled: */
407 /* 4*([APF_FRAME_HEADER_SIZE]&15) */
408 #define MEM_OFFSET_IPV4_HEADER_SIZE 13
409 /* Size of packet in bytes. */
410 #define MEM_OFFSET_PKT_SIZE 14
411 /* Age since filter installed in seconds. */
412 #define MEM_OFFSET_FILTER_AGE 15
413 
414 /* Leave 0 opcode unused as it's a good indicator of accidental incorrect
415  * execution (e.g. data).
416  */
417 /* Load 1 byte from immediate offset, e.g. "ldb R0, [5]" */
418 #define NXP_LDB_OPCODE 1
419 /* Load 2 bytes from immediate offset, e.g. "ldh R0, [5]" */
420 #define NXP_LDH_OPCODE 2
421 /* Load 4 bytes from immediate offset, e.g. "ldw R0, [5]" */
422 #define NXP_LDW_OPCODE 3
423 /* Load 1 byte from immediate offset plus register, e.g. "ldbx R0, [5]R0" */
424 #define NXP_LDBX_OPCODE 4
425 /* Load 2 byte from immediate offset plus register, e.g. "ldhx R0, [5]R0" */
426 #define NXP_LDHX_OPCODE 5
427 /* Load 4 byte from immediate offset plus register, e.g. "ldwx R0, [5]R0" */
428 #define NXP_LDWX_OPCODE 6
429 /* Add, e.g. "add R0,5" */
430 #define NXP_ADD_OPCODE 7
431 /* Multiply, e.g. "mul R0,5" */
432 #define NXP_MUL_OPCODE 8
433 /* Divide, e.g. "div R0,5" */
434 #define NXP_DIV_OPCODE 9
435 /* And, e.g. "and R0,5" */
436 #define NXP_AND_OPCODE 10
437 /* Or, e.g. "or R0,5" */
438 #define NXP_OR_OPCODE 11
439 /* Left shift, e.g, "sh R0, 5" or "sh R0, -5" (shifts right) */
440 #define NXP_SH_OPCODE 12
441 /* Load immediate, e.g. "li R0,5" (immediate encoded as signed value) */
442 #define NXP_LI_OPCODE 13
443 /* Unconditional jump, e.g. "jmp label" */
444 #define NXP_JMP_OPCODE 14
445 /* Compare equal and branch, e.g. "jeq R0,5,label" */
446 #define NXP_JEQ_OPCODE 15
447 /* Compare not equal and branch, e.g. "jne R0,5,label" */
448 #define NXP_JNE_OPCODE 16
449 /* Compare greater than and branch, e.g. "jgt R0,5,label" */
450 #define NXP_JGT_OPCODE 17
451 /* Compare less than and branch, e.g. "jlt R0,5,label" */
452 #define NXP_JLT_OPCODE 18
453 /* Compare any bits set and branch, e.g. "jset R0,5,label" */
454 #define NXP_JSET_OPCODE 19
455 /* Compare not equal byte sequence, e.g. "jnebs R0,5,label,0x1122334455" */
456 #define NXP_JNEBS_OPCODE 20
457 /* Immediate value is one of *_EXT_OPCODE
458  * Extended opcodes. These all have an opcode of EXT_OPCODE
459  * and specify the actual opcode in the immediate field.
460  */
461 #define NXP_EXT_OPCODE 21
462 /* Load from memory, e.g. "ldm R0,5"
463  * Values 0-15 represent loading the different memory slots.
464  */
465 #define NXP_LDM_EXT_OPCODE 0
466 /* Store to memory, e.g. "stm R0,5" *
467  * Values 16-31 represent storing to the different memory slots.
468  */
469 #define NXP_STM_EXT_OPCODE 16
470 /* Not, e.g. "not R0" */
471 #define NXP_NOT_EXT_OPCODE 32
472 /* Negate, e.g. "neg R0" */
473 #define NXP_NEG_EXT_OPCODE 33
474 /* Swap, e.g. "swap R0,R1" */
475 #define NXP_SWAP_EXT_OPCODE 34
476 /* Move, e.g. "move R0,R1" */
477 #define NXP_MOV_EXT_OPCODE 35
478 
479 #define GET_OPCODE(i) (((i) >> 3) & 31)
480 #define GET_REGISTER(i) ((i)&1)
481 #define GET_IMM_LENGTH(i) (((i) >> 1) & 3)
482 /** =========== Define Copied from apf.h END =========== */
483 
484 /** =========== Define Copied from apf_interpreter.h START =========== */
485 /**
486  * Version of APF instruction set processed by accept_packet().
487  * Should be returned by wifi_get_packet_filter_info.
488  */
489 #define APF_VERSION 2
490 /** =========== Define Copied from apf_interpreter.h END =========== */
491 
492 /** =========== Define Copied from apf_interpreter.c START =========== */
493 /* Return code indicating "packet" should accepted. */
494 #define PASS_PKT 1
495 /* Return code indicating "packet" should be dropped. */
496 #define DROP_PKT 0
497 /* If "c" is of an unsigned type, generate a compile warning that gets promoted
498  * to an error. This makes bounds checking simpler because ">= 0" can be
499  * avoided. Otherwise adding superfluous ">= 0" with unsigned expressions
500  * generates compile warnings.
501  */
502 #define ENFORCE_UNSIGNED(c) ((c) == (uint32_t)(c))
503 /** =========== Define Copied from apf_interpreter.c END =========== */
504 
505 /** depend on the format of skb->data */
506 #define APF_FRAME_HEADER_SIZE 14
507 #define PACKET_FILTER_MAX_LEN 1024
508 
509 enum { PACKET_FILTER_STATE_INIT = 0,
510        PACKET_FILTER_STATE_STOP,
511        PACKET_FILTER_STATE_START,
512 };
513 
514 enum wifi_attr_packet_filter {
515 	ATTR_PACKET_FILTER_INVALID = 0,
516 	ATTR_PACKET_FILTER_TOTAL_LENGTH,
517 	ATTR_PACKET_FILTER_PROGRAM,
518 	ATTR_PACKET_FILTER_VERSION,
519 	ATTR_PACKET_FILTER_MAX_LEN,
520 	ATTR_PACKET_FILTER_AFTER_LAST,
521 	ATTR_PACKET_FILTER_MAX = ATTR_PACKET_FILTER_AFTER_LAST - 1
522 };
523 
524 /** Packet filter structure */
525 typedef struct _packet_filter {
526 	spinlock_t lock;
527 	t_u8 state;
528 	t_u8 packet_filter_program[PACKET_FILTER_MAX_LEN];
529 	t_u8 packet_filter_len;
530 	t_u32 packet_filter_version;
531 	t_u32 packet_filter_max_len;
532 } packet_filter;
533 
534 int woal_filter_packet(moal_private *priv, t_u8 *data, t_u32 len,
535 		       t_u32 filter_age);
536 
537 int woal_init_wifi_hal(moal_private *priv);
538 int woal_deinit_wifi_hal(moal_private *priv);
539 
540 #define ATTRIBUTE_U32_LEN (nla_total_size(NLA_HDRLEN + 4))
541 #define VENDOR_ID_OVERHEAD ATTRIBUTE_U32_LEN
542 #define VENDOR_SUBCMD_OVERHEAD ATTRIBUTE_U32_LEN
543 #define VENDOR_DATA_OVERHEAD (nla_total_size(NLA_HDRLEN))
544 
545 #define VENDOR_REPLY_OVERHEAD                                                  \
546 	(VENDOR_ID_OVERHEAD + VENDOR_SUBCMD_OVERHEAD + VENDOR_DATA_OVERHEAD)
547 
548 /* Features Enums*/
549 #define WLAN_FEATURE_INFRA 0x0001 // Basic infrastructure mode support
550 #define WLAN_FEATURE_INFRA_5G 0x0002 // 5 GHz Band support
551 #define WLAN_FEATURE_HOTSPOT 0x0004 // GAS/ANQP support
552 #define WLAN_FEATURE_P2P 0x0008 // Wifi-Direct/P2P
553 #define WLAN_FEATURE_SOFT_AP 0x0010 // Soft AP support
554 #define WLAN_FEATURE_GSCAN 0x0020 // Google-Scan APIsi support
555 #define WLAN_FEATURE_NAN 0x0040 // Neighbor Awareness Networking (NAN)
556 #define WLAN_FEATURE_D2D_RTT 0x0080 // Device-to-device RTT support
557 #define WLAN_FEATURE_D2AP_RTT 0x0100 // Device-to-AP RTT support
558 #define WLAN_FEATURE_BATCH_SCAN 0x0200 // Batched Scan (legacy) support
559 #define WLAN_FEATURE_PNO 0x0400 // Preferred network offload support
560 #define WLAN_FEATURE_ADDITIONAL_STA 0x0800 // Two STAs support
561 #define WLAN_FEATURE_TDLS 0x1000 // Tunnel directed link setup (TDLS)
562 #define WLAN_FEATURE_TDLS_OFFCHANNEL 0x2000 // TDLS off channel support
563 #define WLAN_FEATURE_EPR 0x4000 // Enhanced power reporting support
564 #define WLAN_FEATURE_AP_STA 0x8000 // AP STA Concurrency support
565 #define WLAN_FEATURE_LINK_LAYER_STATS                                          \
566 	0x10000 // Link layer stats collection support
567 #define WLAN_FEATURE_LOGGER 0x20000 // WiFi Logger support
568 #define WLAN_FEATURE_HAL_EPNO 0x40000 // WiFi enhanced PNO support
569 #define WLAN_FEATURE_RSSI_MONITOR 0x80000 // RSSI Monitor support
570 #define WLAN_FEATURE_MKEEP_ALIVE 0x100000 // WiFi mkeep_alive support
571 #define WLAN_FEATURE_CONFIG_NDO 0x200000 // ND offload configure support
572 #define WLAN_FEATURE_TX_TRANSMIT_POWER                                         \
573 	0x400000 // Capture Tx transmit power levels
574 #define WLAN_FEATURE_CONTROL_ROAMING 0x800000 // Enable/Disable firmware roaming
575 #define WLAN_FEATURE_IE_WHITELIST 0x1000000 // Probe IE white listing support
576 #define WLAN_FEATURE_SCAN_RAND                                                 \
577 	0x2000000 // MAC & Probe Sequence Number randomization Support
578 // Add more features here
579 
580 #define MAX_CHANNEL_NUM 200
581 
582 /** Wifi Band */
583 typedef enum {
584 	WIFI_BAND_UNSPECIFIED,
585 	/** 2.4 GHz */
586 	WIFI_BAND_BG = 1,
587 	/** 5 GHz without DFS */
588 	WIFI_BAND_A = 2,
589 	/** 5 GHz DFS only */
590 	WIFI_BAND_A_DFS = 4,
591 	/** 5 GHz with DFS */
592 	WIFI_BAND_A_WITH_DFS = 6,
593 	/** 2.4 GHz + 5 GHz; no DFS */
594 	WIFI_BAND_ABG = 3,
595 	/** 2.4 GHz + 5 GHz with DFS */
596 	WIFI_BAND_ABG_WITH_DFS = 7,
597 
598 	/** Keep it last */
599 	WIFI_BAND_LAST,
600 	WIFI_BAND_MAX = WIFI_BAND_LAST - 1,
601 } wifi_band;
602 
603 typedef enum wifi_attr {
604 	ATTR_FEATURE_SET_INVALID = 0,
605 	ATTR_SCAN_MAC_OUI_SET = 1,
606 	ATTR_FEATURE_SET = 2,
607 	ATTR_NODFS_VALUE = 3,
608 	ATTR_COUNTRY_CODE = 4,
609 	ATTR_CHANNELS_BAND = 5,
610 	ATTR_NUM_CHANNELS = 6,
611 	ATTR_CHANNEL_LIST = 7,
612 	ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE_MAX = 8,
613 	ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE = 9,
614 	ATTR_GET_CONCURRENCY_MATRIX_SET = 10,
615 	ATTR_WIFI_AFTER_LAST,
616 	ATTR_WIFI_MAX = ATTR_WIFI_AFTER_LAST - 1
617 } wifi_attr_t;
618 
619 enum mrvl_wlan_vendor_attr_wifi_logger {
620 	MRVL_WLAN_VENDOR_ATTR_NAME = 10,
621 };
622 
623 /**vendor event*/
624 enum vendor_event {
625 	event_hang = 0,
626 	event_fw_dump_done = 1,
627 	event_fw_reset_success = 2,
628 	event_fw_reset_failure = 3,
629 	event_fw_reset_start = 4,
630 	event_rssi_monitor = 0x1501,
631 	event_set_key_mgmt_offload = 0x10001,
632 	event_fw_roam_success = 0x10002,
633 	event_cloud_keep_alive = 0x10003,
634 	event_dfs_radar_detected = 0x10004,
635 	event_dfs_cac_started = 0x10005,
636 	event_dfs_cac_finished = 0x10006,
637 	event_dfs_cac_aborted = 0x10007,
638 	event_dfs_nop_finished = 0x10008,
639 	event_wifi_logger_ring_buffer_data = 0x1000b,
640 	event_wifi_logger_alert,
641 	event_packet_fate_monitor,
642 	event_wake_reason_report,
643 	event_max,
644 };
645 
646 /** struct dfs_event */
647 typedef struct _dfs_event {
648 	/** Frequency */
649 	int freq;
650 	/** HT enable */
651 	int ht_enabled;
652 	/** Channel Offset */
653 	int chan_offset;
654 	/** Channel width */
655 	enum nl80211_chan_width chan_width;
656 	/** Center Frequency 1 */
657 	int cf1;
658 	/** Center Frequency 2 */
659 	int cf2;
660 } dfs_event;
661 
662 void woal_cfg80211_dfs_vendor_event(moal_private *priv, int event,
663 				    struct cfg80211_chan_def *chandef);
664 
665 enum ATTR_LINK_LAYER_STAT {
666 	ATTR_LL_STATS_INVALID,
667 	ATTR_LL_STATS_MPDU_SIZE_THRESHOLD,
668 	ATTR_LL_STATS_AGGRESSIVE_STATS_GATHERING,
669 	ATTR_LL_STATS_IFACE,
670 	ATTR_LL_STATS_NUM_RADIO,
671 	ATTR_LL_STATS_RADIO,
672 	ATTR_LL_STATS_CLEAR_REQ_MASK,
673 	ATTR_LL_STATS_STOP_REQ,
674 	ATTR_LL_STATS_CLEAR_RSP_MASK,
675 	ATTR_LL_STATS_STOP_RSP,
676 	ATTR_LL_STATS_AFTER_LAST,
677 	ATTR_LL_STATS_MAX = ATTR_LL_STATS_AFTER_LAST - 1,
678 };
679 
680 enum ATTR_RSSI_MONITOR {
681 	ATTR_RSSI_MONITOR_INVALID,
682 	ATTR_RSSI_MONITOR_CONTROL,
683 	ATTR_RSSI_MONITOR_MIN_RSSI,
684 	ATTR_RSSI_MONITOR_MAX_RSSI,
685 	ATTR_RSSI_MONITOR_CUR_BSSID,
686 	ATTR_RSSI_MONITOR_CUR_RSSI,
687 	ATTR_RSSI_MONITOR_AFTER_LAST,
688 	ATTR_RSSI_MONITOR_MAX = ATTR_RSSI_MONITOR_AFTER_LAST - 1,
689 };
690 void woal_cfg80211_rssi_monitor_event(moal_private *priv, t_s16 rssi);
691 
692 /**vendor sub command*/
693 enum vendor_sub_command {
694 	sub_cmd_set_drvdbg = 0,
695 	sub_cmd_set_roaming_offload_key = 0x0002,
696 	sub_cmd_start_keep_alive = 0x0003,
697 	sub_cmd_stop_keep_alive = 0x0004,
698 	sub_cmd_dfs_capability = 0x0005,
699 	sub_cmd_set_scan_mac_oui = 0x0007,
700 	sub_cmd_set_packet_filter = 0x0011,
701 	sub_cmd_get_packet_filter_capability,
702 	sub_cmd_nd_offload = 0x0100,
703 	sub_cmd_link_statistic_set = 0x1200,
704 	sub_cmd_link_statistic_get = 0x1201,
705 	sub_cmd_link_statistic_clr = 0x1202,
706 	sub_cmd_get_valid_channels = 0x1009,
707 	sub_cmd_get_wifi_supp_feature_set = 0x100a,
708 	sub_cmd_set_country_code = 0x100d,
709 	sub_cmd_get_fw_version = 0x1404,
710 	sub_cmd_get_drv_version = 0x1406,
711 	sub_cmd_start_logging = 0x1400,
712 	sub_cmd_get_wifi_logger_supp_feature_set,
713 	sub_cmd_get_ring_buff_data,
714 	sub_cmd_get_ring_buff_status,
715 	sub_cmd_get_fw_mem_dump = 0x1405,
716 	sub_cmd_get_drv_mem_dump = 0x1407,
717 	sub_cmd_start_packet_fate_monitor = 0x1408,
718 	sub_cmd_rssi_monitor = 0x1500,
719 	/*Sub-command for wifi hal*/
720 	sub_cmd_get_roaming_capability = 0x1700,
721 	sub_cmd_fw_roaming_enable = 0x1701,
722 	sub_cmd_fw_roaming_config = 0x1702,
723 	subcmd_cfr_request = 0x1900,
724 	subcmd_cfr_cancel,
725 	subcmd_get_csi_dump_path,
726 	subcmd_get_csi_config,
727 	subcmd_get_csi_capa,
728 	sub_cmd_max,
729 };
730 
731 void woal_register_cfg80211_vendor_command(struct wiphy *wiphy);
732 int woal_cfg80211_vendor_event(moal_private *priv, int event, t_u8 *data,
733 			       int len);
734 
735 enum mrvl_wlan_vendor_attr {
736 	MRVL_WLAN_VENDOR_ATTR_INVALID = 0,
737 	/* Used by MRVL_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY */
738 	MRVL_WLAN_VENDOR_ATTR_DFS = 1,
739 	MRVL_WLAN_VENDOR_ATTR_AFTER_LAST,
740 
741 	MRVL_WLAN_VENDOR_ATTR_MAX = MRVL_WLAN_VENDOR_ATTR_AFTER_LAST - 1,
742 };
743 
744 typedef enum {
745 	ATTR_ND_OFFLOAD_INVALID = 0,
746 	ATTR_ND_OFFLOAD_CONTROL,
747 	ATTR_ND_OFFLOAD_AFTER_LAST,
748 	ATTR_ND_OFFLOAD_MAX = ATTR_ND_OFFLOAD_AFTER_LAST - 1,
749 } ND_OFFLOAD_ATTR;
750 
751 #define MKEEP_ALIVE_IP_PKT_MAX 256
752 enum mkeep_alive_attributes {
753 	MKEEP_ALIVE_ATTRIBUTE_INVALID = 0,
754 	MKEEP_ALIVE_ATTRIBUTE_ID,
755 	MKEEP_ALIVE_ATTRIBUTE_ETHER_TYPE,
756 	MKEEP_ALIVE_ATTRIBUTE_IP_PKT,
757 	MKEEP_ALIVE_ATTRIBUTE_IP_PKT_LEN,
758 	MKEEP_ALIVE_ATTRIBUTE_SRC_MAC_ADDR,
759 	MKEEP_ALIVE_ATTRIBUTE_DST_MAC_ADDR,
760 	MKEEP_ALIVE_ATTRIBUTE_PERIOD_MSEC,
761 	MKEEP_ALIVE_ATTRIBUTE_RETRY_INTERVAL,
762 	MKEEP_ALIVE_ATTRIBUTE_RETRY_CNT,
763 	MKEEP_ALIVE_ATTRIBUTE_AFTER_LAST,
764 	MKEEP_ALIVE_ATTRIBUTE_MAX = MKEEP_ALIVE_ATTRIBUTE_AFTER_LAST - 1
765 };
766 
767 int woal_roam_ap_info(moal_private *priv, t_u8 *data, int len);
768 
769 /*Attribute for wpa_supplicant*/
770 enum mrvl_wlan_vendor_attr_roam_auth {
771 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_INVALID = 0,
772 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_BSSID,
773 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_REQ_IE,
774 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_RESP_IE,
775 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_AUTHORIZED,
776 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_KEY_REPLAY_CTR,
777 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KCK,
778 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KEK,
779 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_SUBNET_STATUS,
780 	/* keep last */
781 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST,
782 	MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_MAX =
783 		MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST - 1
784 };
785 
786 /** WiFi roaming capabilities structure */
787 typedef struct {
788 	/** max blacklist size */
789 	u32 max_blacklist_size;
790 	/** max whitelist size */
791 	u32 max_whitelist_size;
792 } wifi_roaming_capabilities;
793 
794 /** WiFi BSSID params structure */
795 typedef struct {
796 	/** Num of BSSID */
797 	u32 num_bssid;
798 	/** List of AP mac address */
799 	t_u8 mac_addr[MAX_AP_LIST][MLAN_MAC_ADDR_LENGTH];
800 } wifi_bssid_params;
801 
802 /** SSID structure */
803 typedef struct {
804 	/** Length */
805 	u32 length;
806 	/** SSID */
807 	char ssid[MLAN_MAX_SSID_LENGTH];
808 } ssid_t;
809 
810 /** WiFi SSID params structure */
811 typedef struct {
812 	/** No of SSID */
813 	u32 num_ssid;
814 	/** Whitelist SSID */
815 	ssid_t whitelist_ssid[MAX_SSID_NUM];
816 } wifi_ssid_params;
817 
818 /*Attribute for wifi hal*/
819 enum mrvl_wlan_vendor_attr_fw_roaming {
820 	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_INVALID = 0,
821 	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CAPA,
822 	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONTROL,
823 	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONFIG_BSSID,
824 	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONFIG_SSID,
825 	/* keep last */
826 	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_AFTER_LAST,
827 	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_MAX =
828 		MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_AFTER_LAST - 1
829 };
830 
831 enum attr_csi {
832 	ATTR_CSI_INVALID = 0,
833 	ATTR_CSI_CONFIG,
834 	ATTR_PEER_MAC_ADDR,
835 	ATTR_CSI_DUMP_PATH,
836 	ATTR_CSI_CAPA,
837 	ATTR_CSI_DUMP_FORMAT,
838 	ATTR_CSI_AFTER_LAST,
839 	ATTR_CSI_MAX = ATTR_CSI_AFTER_LAST - 1,
840 };
841 
842 /** CSI capability structure */
843 typedef struct {
844 	/**Bit mask indicates what BW is supported */
845 	t_u8 bw_support;
846 	/** Bit mask indicates what capturing method is supported */
847 	t_u8 method_support;
848 	/** Max number of capture peers supported */
849 	t_u8 max_peer;
850 } wifi_csi_capabilities;
851 
852 mlan_status woal_cfg80211_event_csi_dump(moal_private *priv, t_u8 *data,
853 					 int len);
854 #endif
855 #endif /* _MOAL_CFGVENDOR_H_ */
856