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