blob: f681482287c877d5f447d21099a9fee408e5be94 [file] [log] [blame]
/** @file moal_cfg80211_util.h
*
* @brief This file contains the CFG80211 vendor specific defines.
*
*
* Copyright 2015-2020 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
* (the License). You may use, redistribute and/or modify the File in
* accordance with the terms and conditions of the License, a copy of which
* is available by writing to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
* ARE EXPRESSLY DISCLAIMED. The License provides additional details about
* this warranty disclaimer.
*
*/
#ifndef _MOAL_CFGVENDOR_H_
#define _MOAL_CFGVENDOR_H_
#include "moal_main.h"
#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
#define RING_NAME_MAX 32
typedef int wifi_ring_buffer_id;
#define VALID_RING(id) (id >= 0 && id < RING_ID_MAX)
/** WiFi ring control structure */
typedef struct _wifi_ring_ctrl {
/** Written bytes */
t_u32 written_bytes;
/** Read Bytes */
t_u32 read_bytes;
/** Written records */
t_u32 written_records;
} ring_buffer_ctrl;
enum ring_state {
/** ring is not initialized*/
RING_STOP = 0,
/** ring is live and logging*/
RING_ACTIVE,
/** ring is initialized but not logging*/
RING_SUSPEND,
};
/** WiFi ring buffer sttructure */
typedef struct _wifi_ring_buffer {
/** Ring ID */
wifi_ring_buffer_id ring_id;
/** Ring name */
t_u8 name[RING_NAME_MAX];
/** Ring size */
t_u32 ring_size;
/** Write pointer */
t_u32 wp;
/** Read pointer */
t_u32 rp;
/** Log level */
t_u32 log_level;
/** Threshold */
t_u32 threshold;
/** Ring buffer */
void *ring_buf;
/** Lock */
spinlock_t lock;
/** Buffer control */
ring_buffer_ctrl ctrl;
/** Ring state */
enum ring_state state;
/** Delayed work */
struct delayed_work work;
/** Interval */
unsigned long interval;
/** Moal priv */
moal_private *priv;
} wifi_ring_buffer;
#define VERBOSE_RING_NAME "verbose"
#define EVENT_RING_NAME "event"
#define DEFAULT_RING_BUFFER_SIZE 1024
#define TLV_LOG_HEADER_LEN 4
#define WIFI_LOGGER_MEMORY_DUMP_SUPPORTED MBIT(0) /* Memory dump of Fw */
#define WIFI_LOGGER_PER_PACKET_TX_RX_STATUS_SUPPORT MBIT(1) /*PKT status */
#define WIFI_LOGGER_CONNECT_EVENT_SUPPORTED MBIT(2) /* connectivity event */
#define WIFI_LOGGER_POWER_EVENT_SUPPORTED MBIT(3) /* Power of driver */
#define WIFI_LOGGER_WAKE_LOCK_SUPPORTED MBIT(4) /* Wake lock of driver */
#define WIFI_LOGGER_VERBOSE_SUPPORTED MBIT(5) /*verbose log of Fw */
#define WIFI_LOGGER_WATCHDOG_TIMER_SUPPORTED \
MBIT(6) /*monitor the health of Fw */
/**
* Parameters of wifi logger events are TLVs
* Event parameters tags are defined as:
*/
#define WIFI_TAG_VENDOR_SPECIFIC 0 // take a byte stream as parameter
#define WIFI_TAG_BSSID 1 // takes a 6 bytes MAC address as parameter
#define WIFI_TAG_ADDR 2 // takes a 6 bytes MAC address as parameter
#define WIFI_TAG_SSID 3 // takes a 32 bytes SSID address as parameter
#define WIFI_TAG_STATUS 4 // takes an integer as parameter
#define WIFI_TAG_REASON_CODE 14 // take a reason code as per 802.11 as parameter
#define WIFI_TAG_RSSI 21 // take an integer as parameter
#define WIFI_TAG_CHANNEL 22 // take an integer as parameter
#define RING_ENTRY_SIZE (sizeof(wifi_ring_buffer_entry))
#define ENTRY_LENGTH(hdr) (hdr->entry_size + RING_ENTRY_SIZE)
#define READ_AVAIL_SPACE(ring) \
(ring->ctrl.written_bytes - ring->ctrl.read_bytes)
enum logger_attributes {
ATTR_WIFI_LOGGER_INVALID = 0,
ATTR_WIFI_LOGGER_RING_ID,
ATTR_WIFI_LOGGER_FLAGS,
ATTR_WIFI_LOGGER_VERBOSE_LEVEL,
ATTR_WIFI_LOGGER_MIN_DATA_SIZE,
ATTR_RING_BUFFER_STATUS,
ATTR_NUM_RINGS,
ATTR_WIFI_LOGGER_FEATURE_SET,
ATTR_WIFI_LOGGER_MAX_INTERVAL_SEC,
ATTR_RING_BUFFER,
ATTR_NAME,
ATTR_MEM_DUMP,
ATTR_ERR_CODE,
ATTR_RING_DATA,
ATTR_WAKE_REASON_STAT,
ATTR_PACKET_FATE_TX,
ATTR_PACKET_FATE_RX,
ATTR_PACKET_FATE_DATA,
ATTR_FW_DUMP_PATH = 20,
ATTR_DRV_DUMP_PATH = 21,
ATTR_WIFI_LOGGER_AFTER_LAST,
ATTR_WIFI_LOGGER_MAX = ATTR_WIFI_LOGGER_AFTER_LAST - 1
};
/* Below events refer to the wifi_connectivity_event ring and shall be supported
*/
enum {
WIFI_EVENT_ASSOCIATION_REQUESTED = 0,
WIFI_EVENT_AUTH_COMPLETE,
WIFI_EVENT_ASSOC_COMPLETE,
};
enum {
/* set for binary entries */
RING_BUFFER_ENTRY_FLAGS_HAS_BINARY = (1 << (0)),
/* set if 64 bits timestamp is present */
RING_BUFFER_ENTRY_FLAGS_HAS_TIMESTAMP = (1 << (1))
};
enum {
ENTRY_TYPE_CONNECT_EVENT = 1,
ENTRY_TYPE_PKT,
ENTRY_TYPE_WAKE_LOCK,
ENTRY_TYPE_POWER_EVENT,
ENTRY_TYPE_DATA
};
/** WiFi ring buffer entry structure */
typedef struct {
/** size of payload excluding the header */
t_u16 entry_size;
/** Flags */
t_u8 flags;
/** entry type */
t_u8 type;
/** present if has_timestamp bit is set. */
t_u64 timestamp;
} __attribute__ ((packed)) wifi_ring_buffer_entry;
/** WiFi ring buffer status structure*/
typedef struct _wifi_ring_buffer_status {
/** Ring name */
t_u8 name[RING_NAME_MAX];
/** Flag */
t_u32 flag;
/** Ring ID */
wifi_ring_buffer_id ring_id;
/** Buffer size */
t_u32 ring_buffer_byte_size;
/** Verbose Level */
t_u32 verbose_level;
/** Written bytes */
t_u32 written_bytes;
/** Read bytes */
t_u32 read_bytes;
/** Written records */
t_u32 written_records;
} wifi_ring_buffer_status;
/** TLV log structure */
typedef struct {
/** Tag */
u16 tag;
/** Length of value*/
u16 length;
/** Value */
u8 value[];
} __attribute__ ((packed)) tlv_log;
/** WiFi ring buffer driver structure */
typedef struct {
/** event */
u16 event;
/** TLV log structure array */
tlv_log tlvs[];
/** separate parameter structure per event to be provided and optional
* data the event_data is expected to include an official android part,
* with some parameter as transmit rate, num retries, num scan result
* found etc... as well, event_data can include a vendor proprietary
* part which is understood by the developer only
*/
} __attribute__ ((packed)) wifi_ring_buffer_driver_connectivity_event;
/** Assoc logger data structure */
typedef struct _assoc_logger {
/** vendor specific */
t_u8 oui[3];
/** BSSID */
t_u8 bssid[MLAN_MAC_ADDR_LENGTH];
/** SSID */
t_u8 ssid[MLAN_MAX_SSID_LENGTH];
/** RSSI */
t_s32 rssi;
/** Channel */
t_u32 channel;
} assoc_logger_data;
int woal_ring_event_logger(moal_private *priv, int ring_id,
pmlan_event pmevent);
int woal_wake_reason_logger(moal_private *priv,
mlan_ds_hs_wakeup_reason wake_reason);
#define MD5_PREFIX_LEN 4
#define MAX_FATE_LOG_LEN 32
#define MAX_FRAME_LEN_ETHERNET 1518
#define MAX_FRAME_LEN_80211_MGMT 2352
/** packet_fate_packet_type */
typedef enum {
PACKET_TYPE_TX,
PACKET_TYPE_RX,
} packet_fate_packet_type;
/** packet fate frame_type */
typedef enum {
FRAME_TYPE_UNKNOWN,
FRAME_TYPE_ETHERNET_II,
FRAME_TYPE_80211_MGMT,
} frame_type;
/** wifi_tx_packet_fate */
typedef enum {
/** Sent over air and ACKed. */
TX_PKT_FATE_ACKED,
/** Sent over air but not ACKed. (Normal for broadcast/multicast.) */
TX_PKT_FATE_SENT,
/** Queued within firmware, but not yet sent over air. */
TX_PKT_FATE_FW_QUEUED,
/** Dropped by firmware as invalid. E.g. bad source address, bad
* checksum, or invalid for current state.
*/
TX_PKT_FATE_FW_DROP_INVALID,
/** Dropped by firmware due to lack of buffer space. */
TX_PKT_FATE_FW_DROP_NOBUFS,
/** Dropped by firmware for any other reason. Includes frames that were
* sent by driver to firmware, but unaccounted for by firmware.
*/
TX_PKT_FATE_FW_DROP_OTHER,
/** Queued within driver, not yet sent to firmware. */
TX_PKT_FATE_DRV_QUEUED,
/** Dropped by driver as invalid. E.g. bad source address, or invalid
* for current state.
*/
TX_PKT_FATE_DRV_DROP_INVALID,
/** Dropped by driver due to lack of buffer space. */
TX_PKT_FATE_DRV_DROP_NOBUFS,
/** Dropped by driver for any other reason. */
TX_PKT_FATE_DRV_DROP_OTHER,
} wifi_tx_packet_fate;
/** wifi_rx_packet_fate */
typedef enum {
/** Valid and delivered to network stack (e.g., netif_rx()). */
RX_PKT_FATE_SUCCESS,
/** Queued within firmware, but not yet sent to driver. */
RX_PKT_FATE_FW_QUEUED,
/** Dropped by firmware due to host-programmable filters. */
RX_PKT_FATE_FW_DROP_FILTER,
/** Dropped by firmware as invalid. E.g. bad checksum, decrypt failed,
* or invalid for current state.
*/
RX_PKT_FATE_FW_DROP_INVALID,
/** Dropped by firmware due to lack of buffer space. */
RX_PKT_FATE_FW_DROP_NOBUFS,
/** Dropped by firmware for any other reason. */
RX_PKT_FATE_FW_DROP_OTHER,
/** Queued within driver, not yet delivered to network stack. */
RX_PKT_FATE_DRV_QUEUED,
/** Dropped by driver due to filter rules. */
RX_PKT_FATE_DRV_DROP_FILTER,
/** Dropped by driver as invalid. E.g. not permitted in current state.
*/
RX_PKT_FATE_DRV_DROP_INVALID,
/** Dropped by driver due to lack of buffer space. */
RX_PKT_FATE_DRV_DROP_NOBUFS,
/** Dropped by driver for any other reason. */
RX_PKT_FATE_DRV_DROP_OTHER,
} wifi_rx_packet_fate;
/** frame_info_i */
typedef struct {
/** Payload Type */
frame_type payload_type;
/** Driver timestamp in uS */
u32 driver_timestamp_usec;
/** FW timestamp in uS */
u32 firmware_timestamp_usec;
/** Frame Length */
u32 frame_len;
} frame_info_i;
/** wifi_tx_report_i */
typedef struct {
/** MD5 prefix */
char md5_prefix[MD5_PREFIX_LEN];
/** TX packet fate */
wifi_tx_packet_fate fate;
/** frame information */
frame_info_i frame_inf;
} wifi_tx_report_i;
/** wifi_rx_report_i */
typedef struct {
/** MD5 prefix */
char md5_prefix[MD5_PREFIX_LEN];
/** TX packet fate */
wifi_rx_packet_fate fate;
/** frame information */
frame_info_i frame_inf;
} wifi_rx_report_i;
/** packet_fate_report_t */
typedef struct packet_fate_report_t {
union {
wifi_tx_report_i tx_report_i;
wifi_rx_report_i rx_report_i;
} u;
} PACKET_FATE_REPORT;
int woal_packet_fate_monitor(moal_private *priv,
packet_fate_packet_type pkt_type, t_u8 fate,
frame_type payload_type,
t_u32 driver_timestamp_usec,
t_u32 firmware_timestamp_usec, t_u8 *data,
t_u32 len);
/** =========== Define Copied from apf.h START =========== */
/* Number of memory slots, see ldm/stm instructions. */
#define MEM_ITEMS 16
/* Upon program execution starting some memory slots are prefilled: */
/* 4*([APF_FRAME_HEADER_SIZE]&15) */
#define MEM_OFFSET_IPV4_HEADER_SIZE 13
/* Size of packet in bytes. */
#define MEM_OFFSET_PKT_SIZE 14
/* Age since filter installed in seconds. */
#define MEM_OFFSET_FILTER_AGE 15
/* Leave 0 opcode unused as it's a good indicator of accidental incorrect
* execution (e.g. data).
*/
/* Load 1 byte from immediate offset, e.g. "ldb R0, [5]" */
#define NXP_LDB_OPCODE 1
/* Load 2 bytes from immediate offset, e.g. "ldh R0, [5]" */
#define NXP_LDH_OPCODE 2
/* Load 4 bytes from immediate offset, e.g. "ldw R0, [5]" */
#define NXP_LDW_OPCODE 3
/* Load 1 byte from immediate offset plus register, e.g. "ldbx R0, [5]R0" */
#define NXP_LDBX_OPCODE 4
/* Load 2 byte from immediate offset plus register, e.g. "ldhx R0, [5]R0" */
#define NXP_LDHX_OPCODE 5
/* Load 4 byte from immediate offset plus register, e.g. "ldwx R0, [5]R0" */
#define NXP_LDWX_OPCODE 6
/* Add, e.g. "add R0,5" */
#define NXP_ADD_OPCODE 7
/* Multiply, e.g. "mul R0,5" */
#define NXP_MUL_OPCODE 8
/* Divide, e.g. "div R0,5" */
#define NXP_DIV_OPCODE 9
/* And, e.g. "and R0,5" */
#define NXP_AND_OPCODE 10
/* Or, e.g. "or R0,5" */
#define NXP_OR_OPCODE 11
/* Left shift, e.g, "sh R0, 5" or "sh R0, -5" (shifts right) */
#define NXP_SH_OPCODE 12
/* Load immediate, e.g. "li R0,5" (immediate encoded as signed value) */
#define NXP_LI_OPCODE 13
/* Unconditional jump, e.g. "jmp label" */
#define NXP_JMP_OPCODE 14
/* Compare equal and branch, e.g. "jeq R0,5,label" */
#define NXP_JEQ_OPCODE 15
/* Compare not equal and branch, e.g. "jne R0,5,label" */
#define NXP_JNE_OPCODE 16
/* Compare greater than and branch, e.g. "jgt R0,5,label" */
#define NXP_JGT_OPCODE 17
/* Compare less than and branch, e.g. "jlt R0,5,label" */
#define NXP_JLT_OPCODE 18
/* Compare any bits set and branch, e.g. "jset R0,5,label" */
#define NXP_JSET_OPCODE 19
/* Compare not equal byte sequence, e.g. "jnebs R0,5,label,0x1122334455" */
#define NXP_JNEBS_OPCODE 20
/* Immediate value is one of *_EXT_OPCODE
* Extended opcodes. These all have an opcode of EXT_OPCODE
* and specify the actual opcode in the immediate field.
*/
#define NXP_EXT_OPCODE 21
/* Load from memory, e.g. "ldm R0,5"
* Values 0-15 represent loading the different memory slots.
*/
#define NXP_LDM_EXT_OPCODE 0
/* Store to memory, e.g. "stm R0,5" *
* Values 16-31 represent storing to the different memory slots.
*/
#define NXP_STM_EXT_OPCODE 16
/* Not, e.g. "not R0" */
#define NXP_NOT_EXT_OPCODE 32
/* Negate, e.g. "neg R0" */
#define NXP_NEG_EXT_OPCODE 33
/* Swap, e.g. "swap R0,R1" */
#define NXP_SWAP_EXT_OPCODE 34
/* Move, e.g. "move R0,R1" */
#define NXP_MOV_EXT_OPCODE 35
#define GET_OPCODE(i) (((i) >> 3) & 31)
#define GET_REGISTER(i) ((i)&1)
#define GET_IMM_LENGTH(i) (((i) >> 1) & 3)
/** =========== Define Copied from apf.h END =========== */
/** =========== Define Copied from apf_interpreter.h START =========== */
/**
* Version of APF instruction set processed by accept_packet().
* Should be returned by wifi_get_packet_filter_info.
*/
#define APF_VERSION 2
/** =========== Define Copied from apf_interpreter.h END =========== */
/** =========== Define Copied from apf_interpreter.c START =========== */
/* Return code indicating "packet" should accepted. */
#define PASS_PKT 1
/* Return code indicating "packet" should be dropped. */
#define DROP_PKT 0
/* If "c" is of an unsigned type, generate a compile warning that gets promoted
* to an error. This makes bounds checking simpler because ">= 0" can be
* avoided. Otherwise adding superfluous ">= 0" with unsigned expressions
* generates compile warnings.
*/
#define ENFORCE_UNSIGNED(c) ((c) == (uint32_t)(c))
/** =========== Define Copied from apf_interpreter.c END =========== */
/** depend on the format of skb->data */
#define APF_FRAME_HEADER_SIZE 14
#define PACKET_FILTER_MAX_LEN 1024
enum {
PACKET_FILTER_STATE_INIT = 0,
PACKET_FILTER_STATE_STOP,
PACKET_FILTER_STATE_START,
};
enum wifi_attr_packet_filter {
ATTR_PACKET_FILTER_INVALID = 0,
ATTR_PACKET_FILTER_TOTAL_LENGTH,
ATTR_PACKET_FILTER_PROGRAM,
ATTR_PACKET_FILTER_VERSION,
ATTR_PACKET_FILTER_MAX_LEN,
ATTR_PACKET_FILTER_AFTER_LAST,
ATTR_PACKET_FILTER_MAX = ATTR_PACKET_FILTER_AFTER_LAST - 1
};
/** Packet filter structure */
typedef struct _packet_filter {
spinlock_t lock;
t_u8 state;
t_u8 packet_filter_program[PACKET_FILTER_MAX_LEN];
t_u8 packet_filter_len;
t_u32 packet_filter_version;
t_u32 packet_filter_max_len;
} packet_filter;
int woal_filter_packet(moal_private *priv, t_u8 *data, t_u32 len,
t_u32 filter_age);
int woal_init_wifi_hal(moal_private *priv);
int woal_deinit_wifi_hal(moal_private *priv);
#define ATTRIBUTE_U32_LEN (nla_total_size(NLA_HDRLEN + 4))
#define VENDOR_ID_OVERHEAD ATTRIBUTE_U32_LEN
#define VENDOR_SUBCMD_OVERHEAD ATTRIBUTE_U32_LEN
#define VENDOR_DATA_OVERHEAD (nla_total_size(NLA_HDRLEN))
#define VENDOR_REPLY_OVERHEAD \
(VENDOR_ID_OVERHEAD + VENDOR_SUBCMD_OVERHEAD + VENDOR_DATA_OVERHEAD)
/* Features Enums*/
#define WLAN_FEATURE_INFRA 0x0001 // Basic infrastructure mode support
#define WLAN_FEATURE_INFRA_5G 0x0002 // 5 GHz Band support
#define WLAN_FEATURE_HOTSPOT 0x0004 // GAS/ANQP support
#define WLAN_FEATURE_P2P 0x0008 // Wifi-Direct/P2P
#define WLAN_FEATURE_SOFT_AP 0x0010 // Soft AP support
#define WLAN_FEATURE_GSCAN 0x0020 // Google-Scan APIsi support
#define WLAN_FEATURE_NAN 0x0040 // Neighbor Awareness Networking (NAN)
#define WLAN_FEATURE_D2D_RTT 0x0080 // Device-to-device RTT support
#define WLAN_FEATURE_D2AP_RTT 0x0100 // Device-to-AP RTT support
#define WLAN_FEATURE_BATCH_SCAN 0x0200 // Batched Scan (legacy) support
#define WLAN_FEATURE_PNO 0x0400 // Preferred network offload support
#define WLAN_FEATURE_ADDITIONAL_STA 0x0800 // Two STAs support
#define WLAN_FEATURE_TDLS 0x1000 // Tunnel directed link setup (TDLS)
#define WLAN_FEATURE_TDLS_OFFCHANNEL 0x2000 // TDLS off channel support
#define WLAN_FEATURE_EPR 0x4000 // Enhanced power reporting support
#define WLAN_FEATURE_AP_STA 0x8000 // AP STA Concurrency support
#define WLAN_FEATURE_LINK_LAYER_STATS \
0x10000 // Link layer stats collection support
#define WLAN_FEATURE_LOGGER 0x20000 // WiFi Logger support
#define WLAN_FEATURE_HAL_EPNO 0x40000 // WiFi enhanced PNO support
#define WLAN_FEATURE_RSSI_MONITOR 0x80000 // RSSI Monitor support
#define WLAN_FEATURE_MKEEP_ALIVE 0x100000 // WiFi mkeep_alive support
#define WLAN_FEATURE_CONFIG_NDO 0x200000 // ND offload configure support
#define WLAN_FEATURE_TX_TRANSMIT_POWER \
0x400000 // Capture Tx transmit power levels
#define WLAN_FEATURE_CONTROL_ROAMING 0x800000 // Enable/Disable firmware roaming
#define WLAN_FEATURE_IE_WHITELIST 0x1000000 // Probe IE white listing support
#define WLAN_FEATURE_SCAN_RAND \
0x2000000 // MAC & Probe Sequence Number randomization Support
#define WLAN_FEATURE_SET_LATENCY_MODE 0x40000000 // Support Latency mode setting
// Add more features here
#define MAX_CHANNEL_NUM 200
/** Wifi Band */
typedef enum {
WIFI_BAND_UNSPECIFIED,
/** 2.4 GHz */
WIFI_BAND_BG = 1,
/** 5 GHz without DFS */
WIFI_BAND_A = 2,
/** 5 GHz DFS only */
WIFI_BAND_A_DFS = 4,
/** 5 GHz with DFS */
WIFI_BAND_A_WITH_DFS = 6,
/** 2.4 GHz + 5 GHz; no DFS */
WIFI_BAND_ABG = 3,
/** 2.4 GHz + 5 GHz with DFS */
WIFI_BAND_ABG_WITH_DFS = 7,
/** Keep it last */
WIFI_BAND_LAST,
WIFI_BAND_MAX = WIFI_BAND_LAST - 1,
} wifi_band;
typedef enum wifi_attr {
ATTR_FEATURE_SET_INVALID = 0,
ATTR_SCAN_MAC_OUI_SET = 1,
ATTR_FEATURE_SET = 2,
ATTR_NODFS_VALUE = 3,
ATTR_COUNTRY_CODE = 4,
ATTR_CHANNELS_BAND = 5,
ATTR_NUM_CHANNELS = 6,
ATTR_CHANNEL_LIST = 7,
ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE_MAX = 8,
ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE = 9,
ATTR_GET_CONCURRENCY_MATRIX_SET = 10,
ATTR_WIFI_LATENCY_MODE = 11,
ATTR_WIFI_AFTER_LAST,
ATTR_WIFI_MAX = ATTR_WIFI_AFTER_LAST - 1
} wifi_attr_t;
enum mrvl_wlan_vendor_attr_wifi_logger {
MRVL_WLAN_VENDOR_ATTR_NAME = 10,
};
/**vendor event*/
enum vendor_event {
event_hang = 0,
event_fw_dump_done = 1,
event_rssi_monitor = 0x1501,
event_cloud_keep_alive = 0x10003,
event_dfs_radar_detected = 0x10004,
event_dfs_cac_started = 0x10005,
event_dfs_cac_finished = 0x10006,
event_dfs_cac_aborted = 0x10007,
event_dfs_nop_finished = 0x10008,
event_wifi_logger_ring_buffer_data = 0x1000b,
event_wifi_logger_alert,
event_packet_fate_monitor,
event_wake_reason_report,
event_max,
};
/** struct dfs_event */
typedef struct _dfs_event {
/** Frequency */
int freq;
/** HT enable */
int ht_enabled;
/** Channel Offset */
int chan_offset;
/** Channel width */
enum nl80211_chan_width chan_width;
/** Center Frequency 1 */
int cf1;
/** Center Frequency 2 */
int cf2;
} dfs_event;
void woal_cfg80211_dfs_vendor_event(moal_private *priv, int event,
struct cfg80211_chan_def *chandef);
enum ATTR_LINK_LAYER_STAT {
ATTR_LL_STATS_INVALID,
ATTR_LL_STATS_MPDU_SIZE_THRESHOLD,
ATTR_LL_STATS_AGGRESSIVE_STATS_GATHERING,
ATTR_LL_STATS_IFACE,
ATTR_LL_STATS_NUM_RADIO,
ATTR_LL_STATS_RADIO,
ATTR_LL_STATS_CLEAR_REQ_MASK,
ATTR_LL_STATS_STOP_REQ,
ATTR_LL_STATS_CLEAR_RSP_MASK,
ATTR_LL_STATS_STOP_RSP,
ATTR_LL_STATS_AFTER_LAST,
ATTR_LL_STATS_MAX = ATTR_LL_STATS_AFTER_LAST - 1,
};
enum ATTR_RSSI_MONITOR {
ATTR_RSSI_MONITOR_INVALID,
ATTR_RSSI_MONITOR_CONTROL,
ATTR_RSSI_MONITOR_MIN_RSSI,
ATTR_RSSI_MONITOR_MAX_RSSI,
ATTR_RSSI_MONITOR_CUR_BSSID,
ATTR_RSSI_MONITOR_CUR_RSSI,
ATTR_RSSI_MONITOR_AFTER_LAST,
ATTR_RSSI_MONITOR_MAX = ATTR_RSSI_MONITOR_AFTER_LAST - 1,
};
void woal_cfg80211_rssi_monitor_event(moal_private *priv, t_s16 rssi);
/**vendor sub command*/
enum vendor_sub_command {
sub_cmd_set_drvdbg = 0,
sub_cmd_start_keep_alive = 0x0003,
sub_cmd_stop_keep_alive = 0x0004,
sub_cmd_dfs_capability = 0x0005,
sub_cmd_set_scan_mac_oui = 0x0007,
sub_cmd_set_packet_filter = 0x0011,
sub_cmd_get_packet_filter_capability,
sub_cmd_nd_offload = 0x0100,
sub_cmd_link_statistic_set = 0x1200,
sub_cmd_link_statistic_get = 0x1201,
sub_cmd_link_statistic_clr = 0x1202,
sub_cmd_get_valid_channels = 0x1009,
sub_cmd_get_wifi_supp_feature_set = 0x100a,
sub_cmd_set_country_code = 0x100d,
sub_cmd_set_latency_mode = 0x1015,
sub_cmd_get_fw_version = 0x1404,
sub_cmd_get_drv_version = 0x1406,
sub_cmd_start_logging = 0x1400,
sub_cmd_get_wifi_logger_supp_feature_set,
sub_cmd_get_ring_buff_data,
sub_cmd_get_ring_buff_status,
sub_cmd_get_fw_mem_dump = 0x1405,
sub_cmd_get_drv_mem_dump = 0x1407,
sub_cmd_start_packet_fate_monitor = 0x1408,
sub_cmd_rssi_monitor = 0x1500,
/*Sub-command for wifi hal */
sub_cmd_get_roaming_capability = 0x1700,
sub_cmd_fw_roaming_enable = 0x1701,
sub_cmd_fw_roaming_config = 0x1702,
sub_cmd_max,
};
void woal_register_cfg80211_vendor_command(struct wiphy *wiphy);
int woal_cfg80211_vendor_event(moal_private *priv, int event,
t_u8 *data, int len);
enum mrvl_wlan_vendor_attr {
MRVL_WLAN_VENDOR_ATTR_INVALID = 0,
/* Used by MRVL_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY */
MRVL_WLAN_VENDOR_ATTR_DFS = 1,
MRVL_WLAN_VENDOR_ATTR_AFTER_LAST,
MRVL_WLAN_VENDOR_ATTR_MAX = MRVL_WLAN_VENDOR_ATTR_AFTER_LAST - 1,
};
typedef enum {
ATTR_ND_OFFLOAD_INVALID = 0,
ATTR_ND_OFFLOAD_CONTROL,
ATTR_ND_OFFLOAD_AFTER_LAST,
ATTR_ND_OFFLOAD_MAX = ATTR_ND_OFFLOAD_AFTER_LAST - 1,
} ND_OFFLOAD_ATTR;
#define MKEEP_ALIVE_IP_PKT_MAX 256
enum mkeep_alive_attributes {
MKEEP_ALIVE_ATTRIBUTE_INVALID = 0,
MKEEP_ALIVE_ATTRIBUTE_ID,
MKEEP_ALIVE_ATTRIBUTE_ETHER_TYPE,
MKEEP_ALIVE_ATTRIBUTE_IP_PKT,
MKEEP_ALIVE_ATTRIBUTE_IP_PKT_LEN,
MKEEP_ALIVE_ATTRIBUTE_SRC_MAC_ADDR,
MKEEP_ALIVE_ATTRIBUTE_DST_MAC_ADDR,
MKEEP_ALIVE_ATTRIBUTE_PERIOD_MSEC,
MKEEP_ALIVE_ATTRIBUTE_RETRY_INTERVAL,
MKEEP_ALIVE_ATTRIBUTE_RETRY_CNT,
MKEEP_ALIVE_ATTRIBUTE_AFTER_LAST,
MKEEP_ALIVE_ATTRIBUTE_MAX = MKEEP_ALIVE_ATTRIBUTE_AFTER_LAST - 1
};
/** WiFi roaming capabilities structure */
typedef struct {
/** max blacklist size */
u32 max_blacklist_size;
/** max whitelist size */
u32 max_whitelist_size;
} wifi_roaming_capabilities;
/** WiFi BSSID params structure */
typedef struct {
/** Num of BSSID */
u32 num_bssid;
/** List of AP mac address */
t_u8 mac_addr[MAX_AP_LIST][MLAN_MAC_ADDR_LENGTH];
} wifi_bssid_params;
/** SSID structure */
typedef struct {
/** Length */
u32 length;
/** SSID */
char ssid[MLAN_MAX_SSID_LENGTH];
} ssid_t;
/** WiFi SSID params structure */
typedef struct {
/** No of SSID */
u32 num_ssid;
/** Whitelist SSID */
ssid_t whitelist_ssid[MAX_SSID_NUM];
} wifi_ssid_params;
/*Attribute for wifi hal*/
enum mrvl_wlan_vendor_attr_fw_roaming {
MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_INVALID = 0,
MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CAPA,
MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONTROL,
MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONFIG_BSSID,
MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONFIG_SSID,
/* keep last */
MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_AFTER_LAST,
MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_MAX =
MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_AFTER_LAST - 1
};
#endif
#endif /* _MOAL_CFGVENDOR_H_ */