/***************************************************************************** * * Copyright (c) 2012 - 2020 Samsung Electronics Co., Ltd. All rights reserved * ****************************************************************************/ #include "nl80211_vendor_nan.h" #ifndef __SLSI_NL80211_VENDOR_H_ #define __SLSI_NL80211_VENDOR_H_ #define OUI_GOOGLE 0x001A11 #define OUI_SAMSUNG 0x0000f0 #define SLSI_NL80211_GSCAN_SUBCMD_RANGE_START 0x1000 #define SLSI_NL80211_GSCAN_EVENT_RANGE_START 0x01 #define SLSI_NL80211_RTT_SUBCMD_RANGE_START 0x1100 #define SLSI_NL80211_LOGGING_SUBCMD_RANGE_START 0x1400 #define SLSI_NL80211_NAN_SUBCMD_RANGE_START 0x1500 #define SLSI_NL80211_APF_SUBCMD_RANGE_START 0x1600 #define SLSI_GSCAN_SCAN_ID_START 0x410 #define SLSI_GSCAN_SCAN_ID_END 0x500 #define SLSI_GSCAN_MAX_BUCKETS (8) #define SLSI_GSCAN_MAX_CHANNELS (16) /* As per gscan.h */ #define SLSI_GSCAN_MAX_HOTLIST_APS (64) #define SLSI_GSCAN_MAX_BUCKETS_PER_GSCAN (SLSI_GSCAN_MAX_BUCKETS) #define SLSI_GSCAN_MAX_SCAN_CACHE_SIZE (12000) #define SLSI_GSCAN_MAX_AP_CACHE_PER_SCAN (16) #define SLSI_GSCAN_MAX_SCAN_REPORTING_THRESHOLD (100) #define SLSI_GSCAN_MAX_SIGNIFICANT_CHANGE_APS (64) #define SLSI_GSCAN_MAX_EPNO_SSIDS (32) #define SLSI_GSCAN_MAX_EPNO_HS2_PARAM (8) /* Framework is not using this. Tune when needed */ #define SLSI_REPORT_EVENTS_NONE (0) #define SLSI_REPORT_EVENTS_EACH_SCAN (1) #define SLSI_REPORT_EVENTS_FULL_RESULTS (2) #define SLSI_REPORT_EVENTS_NO_BATCH (4) #define SLSI_NL_ATTRIBUTE_U32_LEN (NLA_HDRLEN + 4) #define SLSI_NL_VENDOR_ID_OVERHEAD SLSI_NL_ATTRIBUTE_U32_LEN #define SLSI_NL_VENDOR_SUBCMD_OVERHEAD SLSI_NL_ATTRIBUTE_U32_LEN #define SLSI_NL_VENDOR_DATA_OVERHEAD (NLA_HDRLEN) #define SLSI_NL_VENDOR_REPLY_OVERHEAD (SLSI_NL_VENDOR_ID_OVERHEAD + \ SLSI_NL_VENDOR_SUBCMD_OVERHEAD + \ SLSI_NL_VENDOR_DATA_OVERHEAD) #define SLSI_GSCAN_RTT_UNSPECIFIED (-1) #define SLSI_GSCAN_HASH_TABLE_SIZE (32) #define SLSI_GSCAN_HASH_KEY_MASK (0x1F) #define SLSI_GSCAN_GET_HASH_KEY(_key) (_key & SLSI_GSCAN_HASH_KEY_MASK) #define SLSI_KEEP_SCAN_RESULT (0) #define SLSI_DISCARD_SCAN_RESULT (1) #define SLSI_GSCAN_MAX_BSSID_PER_IE (20) #define SLSI_LLS_CAPABILITY_QOS 0x00000001 /* set for QOS association */ #define SLSI_LLS_CAPABILITY_PROTECTED 0x00000002 /* set for protected association (802.11 beacon frame control protected bit set)*/ #define SLSI_LLS_CAPABILITY_INTERWORKING 0x00000004 /* set if 802.11 Extended Capabilities element interworking bit is set*/ #define SLSI_LLS_CAPABILITY_HS20 0x00000008 /* set for HS20 association*/ #define SLSI_LLS_CAPABILITY_SSID_UTF8 0x00000010 /* set is 802.11 Extended Capabilities element UTF-8 SSID bit is set*/ #define SLSI_LLS_CAPABILITY_COUNTRY 0x00000020 /* set is 802.11 Country Element is present*/ #define TIMESPEC_TO_US(ts) (((u64)(ts).tv_sec * USEC_PER_SEC) + (ts).tv_nsec / NSEC_PER_USEC) /* Feature enums */ #define SLSI_WIFI_HAL_FEATURE_INFRA 0x000001 /* Basic infrastructure mode */ #define SLSI_WIFI_HAL_FEATURE_INFRA_5G 0x000002 /* Support for 5 GHz Band */ #define SLSI_WIFI_HAL_FEATURE_HOTSPOT 0x000004 /* Support for GAS/ANQP */ #define SLSI_WIFI_HAL_FEATURE_P2P 0x000008 /* Wifi-Direct */ #define SLSI_WIFI_HAL_FEATURE_SOFT_AP 0x000010 /* Soft AP */ #define SLSI_WIFI_HAL_FEATURE_GSCAN 0x000020 /* Google-Scan APIs */ #define SLSI_WIFI_HAL_FEATURE_NAN 0x000040 /* Neighbor Awareness Networking */ #define SLSI_WIFI_HAL_FEATURE_D2D_RTT 0x000080 /* Device-to-device RTT */ #define SLSI_WIFI_HAL_FEATURE_D2AP_RTT 0x000100 /* Device-to-AP RTT */ #define SLSI_WIFI_HAL_FEATURE_BATCH_SCAN 0x000200 /* Batched Scan (legacy) */ #define SLSI_WIFI_HAL_FEATURE_PNO 0x000400 /* Preferred network offload */ #define SLSI_WIFI_HAL_FEATURE_ADDITIONAL_STA 0x000800 /* Support for two STAs */ #define SLSI_WIFI_HAL_FEATURE_TDLS 0x001000 /* Tunnel directed link setup */ #define SLSI_WIFI_HAL_FEATURE_TDLS_OFFCHANNEL 0x002000 /* Support for TDLS off channel */ #define SLSI_WIFI_HAL_FEATURE_EPR 0x004000 /* Enhanced power reporting */ #define SLSI_WIFI_HAL_FEATURE_AP_STA 0x008000 /* Support for AP STA Concurrency */ #define SLSI_WIFI_HAL_FEATURE_LINK_LAYER_STATS 0x010000 /* Link layer stats collection */ #define SLSI_WIFI_HAL_FEATURE_LOGGER 0x020000 /* WiFi Logger */ #define SLSI_WIFI_HAL_FEATURE_HAL_EPNO 0x040000 /* WiFi PNO enhanced */ #define SLSI_WIFI_HAL_FEATURE_RSSI_MONITOR 0x080000 /* RSSI Monitor */ #define SLSI_WIFI_HAL_FEATURE_MKEEP_ALIVE 0x100000 /* WiFi mkeep_alive */ #define SLSI_WIFI_HAL_FEATURE_CONFIG_NDO 0x200000 /* ND offload */ #define SLSI_WIFI_HAL_FEATURE_CONTROL_ROAMING 0x800000 /* Enable/Disable firmware roaming macro */ #define SLSI_WIFI_HAL_FEATURE_SCAN_RAND 0x2000000 /* Random MAC & Probe seq */ #define SLSI_WIFI_HAL_FEATURE_LOW_LATENCY 0x40000000 /* Low Latency modes */ #define SLSI_WIFI_HAL_FEATURE_P2P_RAND_MAC 0x80000000 /* Random P2P MAC */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)) #define SLSI_ATTRIBUTE_START_VAL 1 #else #define SLSI_ATTRIBUTE_START_VAL 0 #define SLSI_NL_ATTRIBUTE_COUNTRY_CODE 4 #define SLSI_NL_ATTRIBUTE_LATENCY_MODE 5 #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)) enum slsi_low_latency_attr { SLSI_NL_ATTRIBUTE_LATENCY_MODE = 1, SLSI_NL_ATTRIBUTE_LATENCY_MAX }; enum slsi_country_code_attr { SLSI_NL_ATTRIBUTE_COUNTRY_CODE = 1, SLSI_NL_ATTRIBUTE_COUNTRY_CODE_MAX }; #endif enum slsi_wifi_attr { SLSI_NL_ATTRIBUTE_ND_OFFLOAD_VALUE = SLSI_ATTRIBUTE_START_VAL, SLSI_NL_ATTRIBUTE_PNO_RANDOM_MAC_OUI, SLSI_NL_ATTRIBUTE_MAC_OUI_MAX }; enum SLSI_APF_ATTRIBUTES { SLSI_APF_ATTR_VERSION = 0, SLSI_APF_ATTR_MAX_LEN, SLSI_APF_ATTR_PROGRAM, SLSI_APF_ATTR_PROGRAM_LEN, SLSI_APF_ATTR_MAX }; enum SLSI_ROAM_ATTRIBUTES { SLSI_NL_ATTR_MAX_BLACKLIST_SIZE, SLSI_NL_ATTR_MAX_WHITELIST_SIZE, SLSI_NL_ATTR_ROAM_STATE, SLSI_NL_ATTR_ROAM_MAX }; enum slsi_acs_attr_offload { SLSI_ACS_ATTR_CHANNEL_INVALID = 0, SLSI_ACS_ATTR_PRIMARY_CHANNEL, SLSI_ACS_ATTR_SECONDARY_CHANNEL, SLSI_ACS_ATTR_HW_MODE, SLSI_ACS_ATTR_HT_ENABLED, SLSI_ACS_ATTR_HT40_ENABLED, SLSI_ACS_ATTR_VHT_ENABLED, SLSI_ACS_ATTR_CHWIDTH, SLSI_ACS_ATTR_CH_LIST, SLSI_ACS_ATTR_VHT_SEG0_CENTER_CHANNEL, SLSI_ACS_ATTR_VHT_SEG1_CENTER_CHANNEL, SLSI_ACS_ATTR_FREQ_LIST, /* keep last */ SLSI_ACS_ATTR_AFTER_LAST, SLSI_ACS_ATTR_MAX = SLSI_ACS_ATTR_AFTER_LAST - 1 }; #ifdef CONFIG_SLSI_WLAN_STA_FWD_BEACON enum slsi_wips_attr { SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_SSID = 0, SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_BSSID, SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_CHANNEL, SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_BCN_INTERVAL, SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_TIME_STAMP1, SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_TIME_STAMP2, SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_SYS_TIME, SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_MAX }; enum slsi_wips_abort_attr { SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_ABORT = 0, SLSI_WLAN_VENDOR_ATTR_FORWARD_BEACON_ABORT_MAX, }; enum slsi_forward_beacon_abort_reason { SLSI_FORWARD_BEACON_ABORT_REASON_UNSPECIFIED = 0, SLSI_FORWARD_BEACON_ABORT_REASON_SCANNING, SLSI_FORWARD_BEACON_ABORT_REASON_ROAMING, SLSI_FORWARD_BEACON_ABORT_REASON_SUSPENDED, SLSI_FORWARD_BEACON_ABORT_REASON_OFFSET = 0x8007, }; #endif enum slsi_acs_hw_mode { SLSI_ACS_MODE_IEEE80211B, SLSI_ACS_MODE_IEEE80211G, SLSI_ACS_MODE_IEEE80211A, SLSI_ACS_MODE_IEEE80211AD, SLSI_ACS_MODE_IEEE80211ANY, }; enum GSCAN_ATTRIBUTE { GSCAN_ATTRIBUTE_NUM_BUCKETS = 10, GSCAN_ATTRIBUTE_BASE_PERIOD, GSCAN_ATTRIBUTE_BUCKETS_BAND, GSCAN_ATTRIBUTE_BUCKET_ID, GSCAN_ATTRIBUTE_BUCKET_PERIOD, GSCAN_ATTRIBUTE_BUCKET_NUM_CHANNELS, GSCAN_ATTRIBUTE_BUCKET_CHANNELS, GSCAN_ATTRIBUTE_NUM_AP_PER_SCAN, GSCAN_ATTRIBUTE_REPORT_THRESHOLD, GSCAN_ATTRIBUTE_NUM_SCANS_TO_CACHE, GSCAN_ATTRIBUTE_REPORT_THRESHOLD_NUM_SCANS, GSCAN_ATTRIBUTE_BAND = GSCAN_ATTRIBUTE_BUCKETS_BAND, GSCAN_ATTRIBUTE_ENABLE_FEATURE = 20, GSCAN_ATTRIBUTE_SCAN_RESULTS_COMPLETE, /* indicates no more results */ GSCAN_ATTRIBUTE_REPORT_EVENTS, /* remaining reserved for additional attributes */ GSCAN_ATTRIBUTE_NUM_OF_RESULTS = 30, GSCAN_ATTRIBUTE_SCAN_RESULTS, /* flat array of wifi_scan_result */ GSCAN_ATTRIBUTE_NUM_CHANNELS, GSCAN_ATTRIBUTE_CHANNEL_LIST, GSCAN_ATTRIBUTE_SCAN_ID, GSCAN_ATTRIBUTE_SCAN_FLAGS, GSCAN_ATTRIBUTE_SCAN_BUCKET_BIT, /* remaining reserved for additional attributes */ GSCAN_ATTRIBUTE_RSSI_SAMPLE_SIZE = 60, GSCAN_ATTRIBUTE_LOST_AP_SAMPLE_SIZE, GSCAN_ATTRIBUTE_MIN_BREACHING, GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_BSSIDS, GSCAN_ATTRIBUTE_BUCKET_STEP_COUNT = 70, GSCAN_ATTRIBUTE_BUCKET_EXPONENT, GSCAN_ATTRIBUTE_BUCKET_MAX_PERIOD, GSCAN_ATTRIBUTE_NUM_BSSID, GSCAN_ATTRIBUTE_BLACKLIST_BSSID, GSCAN_ATTRIBUTE_MAX }; enum epno_ssid_attribute { SLSI_ATTRIBUTE_EPNO_MINIMUM_5G_RSSI = SLSI_ATTRIBUTE_START_VAL, SLSI_ATTRIBUTE_EPNO_MINIMUM_2G_RSSI, SLSI_ATTRIBUTE_EPNO_INITIAL_SCORE_MAX, SLSI_ATTRIBUTE_EPNO_CUR_CONN_BONUS, SLSI_ATTRIBUTE_EPNO_SAME_NETWORK_BONUS, SLSI_ATTRIBUTE_EPNO_SECURE_BONUS, SLSI_ATTRIBUTE_EPNO_5G_BONUS, SLSI_ATTRIBUTE_EPNO_SSID_NUM, SLSI_ATTRIBUTE_EPNO_SSID_LIST, SLSI_ATTRIBUTE_EPNO_SSID, SLSI_ATTRIBUTE_EPNO_SSID_LEN, SLSI_ATTRIBUTE_EPNO_FLAGS, SLSI_ATTRIBUTE_EPNO_AUTH, SLSI_ATTRIBUTE_EPNO_MAX }; enum epno_hs_attribute { SLSI_ATTRIBUTE_EPNO_HS_PARAM_LIST = SLSI_ATTRIBUTE_START_VAL, SLSI_ATTRIBUTE_EPNO_HS_NUM, SLSI_ATTRIBUTE_EPNO_HS_ID, SLSI_ATTRIBUTE_EPNO_HS_REALM, SLSI_ATTRIBUTE_EPNO_HS_CONSORTIUM_IDS, SLSI_ATTRIBUTE_EPNO_HS_PLMN, SLSI_ATTRIBUTE_EPNO_HS_MAX }; enum gscan_bucket_attributes { GSCAN_ATTRIBUTE_CH_BUCKET_1, GSCAN_ATTRIBUTE_CH_BUCKET_2, GSCAN_ATTRIBUTE_CH_BUCKET_3, GSCAN_ATTRIBUTE_CH_BUCKET_4, GSCAN_ATTRIBUTE_CH_BUCKET_5, GSCAN_ATTRIBUTE_CH_BUCKET_6, GSCAN_ATTRIBUTE_CH_BUCKET_7, GSCAN_ATTRIBUTE_CH_BUCKET_8 }; enum wifi_band { WIFI_BAND_UNSPECIFIED, WIFI_BAND_BG = 1, /* 2.4 GHz */ WIFI_BAND_A = 2, /* 5 GHz without DFS */ WIFI_BAND_A_DFS = 4, /* 5 GHz DFS only */ WIFI_BAND_A_WITH_DFS = 6, /* 5 GHz with DFS */ WIFI_BAND_ABG = 3, /* 2.4 GHz + 5 GHz; no DFS */ WIFI_BAND_ABG_WITH_DFS = 7, /* 2.4 GHz + 5 GHz with DFS */ }; enum wifi_scan_event { WIFI_SCAN_RESULTS_AVAILABLE, WIFI_SCAN_THRESHOLD_NUM_SCANS, WIFI_SCAN_THRESHOLD_PERCENT, WIFI_SCAN_FAILED, }; enum wifi_mkeep_alive_attribute { MKEEP_ALIVE_ATTRIBUTE_ID = SLSI_ATTRIBUTE_START_VAL, 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_MAX }; enum wifi_rssi_monitor_attr { SLSI_RSSI_MONITOR_ATTRIBUTE_MAX_RSSI = SLSI_ATTRIBUTE_START_VAL, SLSI_RSSI_MONITOR_ATTRIBUTE_MIN_RSSI, SLSI_RSSI_MONITOR_ATTRIBUTE_START, SLSI_RSSI_MONITOR_ATTRIBUTE_MAX }; enum lls_attribute { LLS_ATTRIBUTE_SET_MPDU_SIZE_THRESHOLD = 1, LLS_ATTRIBUTE_SET_AGGR_STATISTICS_GATHERING, LLS_ATTRIBUTE_CLEAR_STOP_REQUEST_MASK, LLS_ATTRIBUTE_CLEAR_STOP_REQUEST, LLS_ATTRIBUTE_MAX }; enum slsi_hal_vendor_subcmds { SLSI_NL80211_VENDOR_SUBCMD_GET_CAPABILITIES = SLSI_NL80211_GSCAN_SUBCMD_RANGE_START, SLSI_NL80211_VENDOR_SUBCMD_GET_VALID_CHANNELS, SLSI_NL80211_VENDOR_SUBCMD_ADD_GSCAN, SLSI_NL80211_VENDOR_SUBCMD_DEL_GSCAN, SLSI_NL80211_VENDOR_SUBCMD_GET_SCAN_RESULTS, /*****Deprecated due to fapi updates.Do not remove.************/ SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_HOTLIST, SLSI_NL80211_VENDOR_SUBCMD_RESET_BSSID_HOTLIST, SLSI_NL80211_VENDOR_SUBCMD_GET_HOTLIST_RESULTS, SLSI_NL80211_VENDOR_SUBCMD_SET_SIGNIFICANT_CHANGE, SLSI_NL80211_VENDOR_SUBCMD_RESET_SIGNIFICANT_CHANGE, /********************************************************/ SLSI_NL80211_VENDOR_SUBCMD_SET_GSCAN_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_NODFS, SLSI_NL80211_VENDOR_SUBCMD_START_KEEP_ALIVE_OFFLOAD, SLSI_NL80211_VENDOR_SUBCMD_STOP_KEEP_ALIVE_OFFLOAD, SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST, SLSI_NL80211_VENDOR_SUBCMD_SET_EPNO_LIST, SLSI_NL80211_VENDOR_SUBCMD_SET_HS_LIST, SLSI_NL80211_VENDOR_SUBCMD_RESET_HS_LIST, SLSI_NL80211_VENDOR_SUBCMD_SET_RSSI_MONITOR, SLSI_NL80211_VENDOR_SUBCMD_LSTATS_SUBCMD_SET_STATS, SLSI_NL80211_VENDOR_SUBCMD_LSTATS_SUBCMD_GET_STATS, SLSI_NL80211_VENDOR_SUBCMD_LSTATS_SUBCMD_CLEAR_STATS, SLSI_NL80211_VENDOR_SUBCMD_GET_FEATURE_SET, SLSI_NL80211_VENDOR_SUBCMD_SET_COUNTRY_CODE, SLSI_NL80211_VENDOR_SUBCMD_CONFIGURE_ND_OFFLOAD, SLSI_NL80211_VENDOR_SUBCMD_GET_ROAMING_CAPABILITIES, SLSI_NL80211_VENDOR_SUBCMD_SET_ROAMING_STATE, SLSI_NL80211_VENDOR_SUBCMD_SET_LATENCY_MODE, SLSI_NL80211_VENDOR_SUBCMD_RTT_GET_CAPABILITIES = SLSI_NL80211_RTT_SUBCMD_RANGE_START, SLSI_NL80211_VENDOR_SUBCMD_RTT_RANGE_START, SLSI_NL80211_VENDOR_SUBCMD_RTT_RANGE_CANCEL, SLSI_NL80211_VENDOR_SUBCMD_START_LOGGING = SLSI_NL80211_LOGGING_SUBCMD_RANGE_START, SLSI_NL80211_VENDOR_SUBCMD_TRIGGER_FW_MEM_DUMP, SLSI_NL80211_VENDOR_SUBCMD_GET_FW_MEM_DUMP, SLSI_NL80211_VENDOR_SUBCMD_GET_VERSION, SLSI_NL80211_VENDOR_SUBCMD_GET_RING_STATUS, SLSI_NL80211_VENDOR_SUBCMD_GET_RING_DATA, SLSI_NL80211_VENDOR_SUBCMD_GET_FEATURE, SLSI_NL80211_VENDOR_SUBCMD_RESET_LOGGING, SLSI_NL80211_VENDOR_SUBCMD_TRIGGER_DRIVER_MEM_DUMP, SLSI_NL80211_VENDOR_SUBCMD_GET_DRIVER_MEM_DUMP, SLSI_NL80211_VENDOR_SUBCMD_START_PKT_FATE_MONITORING, SLSI_NL80211_VENDOR_SUBCMD_GET_TX_PKT_FATES, SLSI_NL80211_VENDOR_SUBCMD_GET_RX_PKT_FATES, SLSI_NL80211_VENDOR_SUBCMD_GET_WAKE_REASON_STATS, SLSI_NL80211_VENDOR_SUBCMD_NAN_ENABLE = SLSI_NL80211_NAN_SUBCMD_RANGE_START, SLSI_NL80211_VENDOR_SUBCMD_NAN_DISABLE, SLSI_NL80211_VENDOR_SUBCMD_NAN_PUBLISH, SLSI_NL80211_VENDOR_SUBCMD_NAN_PUBLISHCANCEL, SLSI_NL80211_VENDOR_SUBCMD_NAN_SUBSCRIBE, SLSI_NL80211_VENDOR_SUBCMD_NAN_SUBSCRIBECANCEL, SLSI_NL80211_VENDOR_SUBCMD_NAN_TXFOLLOWUP, SLSI_NL80211_VENDOR_SUBCMD_NAN_CONFIG, SLSI_NL80211_VENDOR_SUBCMD_NAN_CAPABILITIES, SLSI_NL80211_VENDOR_SUBCMD_NAN_DATA_INTERFACE_CREATE, SLSI_NL80211_VENDOR_SUBCMD_NAN_DATA_INTERFACE_DELETE, SLSI_NL80211_VENDOR_SUBCMD_NAN_DATA_REQUEST_INITIATOR, SLSI_NL80211_VENDOR_SUBCMD_NAN_DATA_INDICATION_RESPONSE, SLSI_NL80211_VENDOR_SUBCMD_NAN_DATA_END, SLSI_NL80211_VENDOR_SUBCMD_APF_SET_FILTER = SLSI_NL80211_APF_SUBCMD_RANGE_START, SLSI_NL80211_VENDOR_SUBCMD_APF_GET_CAPABILITIES, SLSI_NL80211_VENDOR_SUBCMD_APF_READ_FILTER }; enum slsi_supp_vendor_subcmds { SLSI_NL80211_VENDOR_SUBCMD_UNSPEC = 0, SLSI_NL80211_VENDOR_SUBCMD_KEY_MGMT_SET_KEY, SLSI_NL80211_VENDOR_SUBCMD_ACS_INIT, }; enum slsi_vendor_event_values { /**********Deprecated now due to fapi updates.Do not remove*/ SLSI_NL80211_SIGNIFICANT_CHANGE_EVENT, SLSI_NL80211_HOTLIST_AP_FOUND_EVENT, /******************************************/ SLSI_NL80211_SCAN_RESULTS_AVAILABLE_EVENT, SLSI_NL80211_FULL_SCAN_RESULT_EVENT, SLSI_NL80211_SCAN_EVENT, /**********Deprecated now due to fapi updates.Do not remove*/ SLSI_NL80211_HOTLIST_AP_LOST_EVENT, /******************************************/ SLSI_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH, SLSI_NL80211_VENDOR_HANGED_EVENT, SLSI_NL80211_EPNO_EVENT, SLSI_NL80211_HOTSPOT_MATCH, SLSI_NL80211_RSSI_REPORT_EVENT = 10, SLSI_NL80211_LOGGER_RING_EVENT, SLSI_NL80211_LOGGER_FW_DUMP_EVENT, SLSI_NL80211_NAN_RESPONSE_EVENT, SLSI_NL80211_NAN_PUBLISH_TERMINATED_EVENT, SLSI_NL80211_NAN_MATCH_EVENT, SLSI_NL80211_NAN_MATCH_EXPIRED_EVENT, SLSI_NL80211_NAN_SUBSCRIBE_TERMINATED_EVENT, SLSI_NL80211_NAN_FOLLOWUP_EVENT, SLSI_NL80211_NAN_DISCOVERY_ENGINE_EVENT, SLSI_NL80211_NAN_DISABLED_EVENT = 20, SLSI_NL80211_RTT_RESULT_EVENT, SLSI_NL80211_RTT_COMPLETE_EVENT, SLSI_NL80211_VENDOR_ACS_EVENT, SLSI_NL80211_VENDOR_FORWARD_BEACON, SLSI_NL80211_VENDOR_FORWARD_BEACON_ABORT, SLSI_NL80211_NAN_TRANSMIT_FOLLOWUP_STATUS, SLSI_NAN_EVENT_NDP_REQ, SLSI_NAN_EVENT_NDP_CFM, SLSI_NAN_EVENT_NDP_END, SLSI_NL80211_VENDOR_RCL_CHANNEL_LIST_EVENT = 30 }; enum slsi_lls_interface_mode { SLSI_LLS_INTERFACE_STA = 0, SLSI_LLS_INTERFACE_SOFTAP = 1, SLSI_LLS_INTERFACE_IBSS = 2, SLSI_LLS_INTERFACE_P2P_CLIENT = 3, SLSI_LLS_INTERFACE_P2P_GO = 4, SLSI_LLS_INTERFACE_NAN = 5, SLSI_LLS_INTERFACE_MESH = 6, SLSI_LLS_INTERFACE_UNKNOWN = -1 }; enum slsi_lls_connection_state { SLSI_LLS_DISCONNECTED = 0, SLSI_LLS_AUTHENTICATING = 1, SLSI_LLS_ASSOCIATING = 2, SLSI_LLS_ASSOCIATED = 3, SLSI_LLS_EAPOL_STARTED = 4, /* if done by firmware/driver*/ SLSI_LLS_EAPOL_COMPLETED = 5, /* if done by firmware/driver*/ }; enum slsi_lls_roam_state { SLSI_LLS_ROAMING_IDLE = 0, SLSI_LLS_ROAMING_ACTIVE = 1, }; /* access categories */ enum slsi_lls_traffic_ac { SLSI_LLS_AC_VO = 0, SLSI_LLS_AC_VI = 1, SLSI_LLS_AC_BE = 2, SLSI_LLS_AC_BK = 3, SLSI_LLS_AC_MAX = 4, }; /* channel operating width */ enum slsi_lls_channel_width { SLSI_LLS_CHAN_WIDTH_20 = 0, SLSI_LLS_CHAN_WIDTH_40 = 1, SLSI_LLS_CHAN_WIDTH_80 = 2, SLSI_LLS_CHAN_WIDTH_160 = 3, SLSI_LLS_CHAN_WIDTH_80P80 = 4, SLSI_LLS_CHAN_WIDTH_5 = 5, SLSI_LLS_CHAN_WIDTH_10 = 6, SLSI_LLS_CHAN_WIDTH_INVALID = -1 }; /* wifi peer type */ enum slsi_lls_peer_type { SLSI_LLS_PEER_STA, SLSI_LLS_PEER_AP, SLSI_LLS_PEER_P2P_GO, SLSI_LLS_PEER_P2P_CLIENT, SLSI_LLS_PEER_NAN, SLSI_LLS_PEER_TDLS, SLSI_LLS_PEER_INVALID, }; /* slsi_enhanced_logging_attributes */ enum slsi_enhanced_logging_attributes { SLSI_ENHANCED_LOGGING_ATTRIBUTE_DRIVER_VERSION = SLSI_ATTRIBUTE_START_VAL, SLSI_ENHANCED_LOGGING_ATTRIBUTE_FW_VERSION, SLSI_ENHANCED_LOGGING_ATTRIBUTE_RING_ID, SLSI_ENHANCED_LOGGING_ATTRIBUTE_RING_NAME, SLSI_ENHANCED_LOGGING_ATTRIBUTE_RING_FLAGS, SLSI_ENHANCED_LOGGING_ATTRIBUTE_VERBOSE_LEVEL, SLSI_ENHANCED_LOGGING_ATTRIBUTE_LOG_MAX_INTERVAL, SLSI_ENHANCED_LOGGING_ATTRIBUTE_LOG_MIN_DATA_SIZE, SLSI_ENHANCED_LOGGING_ATTRIBUTE_FW_DUMP_LEN, SLSI_ENHANCED_LOGGING_ATTRIBUTE_FW_DUMP_DATA, SLSI_ENHANCED_LOGGING_ATTRIBUTE_RING_DATA, SLSI_ENHANCED_LOGGING_ATTRIBUTE_RING_STATUS, SLSI_ENHANCED_LOGGING_ATTRIBUTE_RING_NUM, SLSI_ENHANCED_LOGGING_ATTRIBUTE_DRIVER_DUMP_LEN, SLSI_ENHANCED_LOGGING_ATTRIBUTE_DRIVER_DUMP_DATA, SLSI_ENHANCED_LOGGING_ATTRIBUTE_PKT_FATE_NUM, SLSI_ENHANCED_LOGGING_ATTRIBUTE_PKT_FATE_DATA, SLSI_ENHANCED_LOGGING_ATTRIBUTE_MAX, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_INVALID = 0, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_TOTAL_CMD_EVENT_WAKE, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_CMD_EVENT_WAKE_CNT_PTR, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_CMD_EVENT_WAKE_CNT_SZ, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_TOTAL_DRIVER_FW_LOCAL_WAKE, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_DRIVER_FW_LOCAL_WAKE_CNT_PTR, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_DRIVER_FW_LOCAL_WAKE_CNT_SZ, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_TOTAL_RX_DATA_WAKE, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_RX_UNICAST_CNT, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_RX_MULTICAST_CNT, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_RX_BROADCAST_CNT, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_ICMP_PKT, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_ICMP6_PKT, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_ICMP6_RA, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_ICMP6_NA, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_ICMP6_NS, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_ICMP4_RX_MULTICAST_CNT, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_ICMP6_RX_MULTICAST_CNT, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_OTHER_RX_MULTICAST_CNT, SLSI_ENHANCED_LOGGING_ATTRIBUTE_WAKE_STATS_MAX, }; enum slsi_rtt_event_attributes { SLSI_RTT_EVENT_ATTR_ADDR = 0, SLSI_RTT_EVENT_ATTR_BURST_NUM, SLSI_RTT_EVENT_ATTR_MEASUREMENT_NUM, SLSI_RTT_EVENT_ATTR_SUCCESS_NUM, SLSI_RTT_EVENT_ATTR_NUM_PER_BURST_PEER, SLSI_RTT_EVENT_ATTR_STATUS, SLSI_RTT_EVENT_ATTR_RETRY_AFTER_DURATION, SLSI_RTT_EVENT_ATTR_TYPE, SLSI_RTT_EVENT_ATTR_RSSI, SLSI_RTT_EVENT_ATTR_RSSI_SPREAD, SLSI_RTT_EVENT_ATTR_TX_PREAMBLE, SLSI_RTT_EVENT_ATTR_TX_NSS, SLSI_RTT_EVENT_ATTR_TX_BW, SLSI_RTT_EVENT_ATTR_TX_MCS, SLSI_RTT_EVENT_ATTR_TX_RATE, SLSI_RTT_EVENT_ATTR_RX_PREAMBLE, SLSI_RTT_EVENT_ATTR_RX_NSS, SLSI_RTT_EVENT_ATTR_RX_BW, SLSI_RTT_EVENT_ATTR_RX_MCS, SLSI_RTT_EVENT_ATTR_RX_RATE, SLSI_RTT_EVENT_ATTR_RTT, SLSI_RTT_EVENT_ATTR_RTT_SD, SLSI_RTT_EVENT_ATTR_RTT_SPREAD, SLSI_RTT_EVENT_ATTR_DISTANCE_MM, SLSI_RTT_EVENT_ATTR_DISTANCE_SD_MM, SLSI_RTT_EVENT_ATTR_DISTANCE_SPREAD_MM, SLSI_RTT_EVENT_ATTR_TIMESTAMP_US, SLSI_RTT_EVENT_ATTR_BURST_DURATION_MSN, SLSI_RTT_EVENT_ATTR_NEGOTIATED_BURST_NUM, SLSI_RTT_EVENT_ATTR_LCI, SLSI_RTT_EVENT_ATTR_LCR, }; /* RTT peer type */ enum slsi_rtt_peer_type { SLSI_RTT_PEER_AP = 0x1, SLSI_RTT_PEER_STA, SLSI_RTT_PEER_P2P_GO, SLSI_RTT_PEER_P2P_CLIENT, SLSI_RTT_PEER_NAN, }; /* RTT Measurement Bandwidth */ enum slsi_wifi_rtt_bw { SLSI_WIFI_RTT_BW_5 = 0x01, SLSI_WIFI_RTT_BW_10 = 0x02, SLSI_WIFI_RTT_BW_20 = 0x04, SLSI_WIFI_RTT_BW_40 = 0x08, SLSI_WIFI_RTT_BW_80 = 0x10, SLSI_WIFI_RTT_BW_160 = 0x20 }; /* RTT Measurement Preamble */ enum slsi_wifi_rtt_preamble { SLSI_WIFI_RTT_PREAMBLE_LEGACY = 0x1, SLSI_WIFI_RTT_PREAMBLE_HT = 0x2, SLSI_WIFI_RTT_PREAMBLE_VHT = 0x4 }; /* RTT Type */ enum slsi_wifi_rtt_type { SLSI_RTT_TYPE_1_SIDED = 0x1, SLSI_RTT_TYPE_2_SIDED, }; enum slsi_rtt_attribute { SLSI_RTT_ATTRIBUTE_TARGET_CNT = SLSI_ATTRIBUTE_START_VAL, SLSI_RTT_ATTRIBUTE_TARGET_INFO, SLSI_RTT_ATTRIBUTE_TARGET_MAC, SLSI_RTT_ATTRIBUTE_TARGET_TYPE, SLSI_RTT_ATTRIBUTE_TARGET_PEER, SLSI_RTT_ATTRIBUTE_TARGET_CHAN_FREQ, SLSI_RTT_ATTRIBUTE_TARGET_PERIOD, SLSI_RTT_ATTRIBUTE_TARGET_NUM_BURST, SLSI_RTT_ATTRIBUTE_TARGET_NUM_FTM_BURST, SLSI_RTT_ATTRIBUTE_TARGET_NUM_RETRY_FTM, SLSI_RTT_ATTRIBUTE_TARGET_NUM_RETRY_FTMR, SLSI_RTT_ATTRIBUTE_TARGET_LCI, SLSI_RTT_ATTRIBUTE_TARGET_LCR, SLSI_RTT_ATTRIBUTE_TARGET_BURST_DURATION, SLSI_RTT_ATTRIBUTE_TARGET_PREAMBLE, SLSI_RTT_ATTRIBUTE_TARGET_BW, SLSI_RTT_ATTRIBUTE_RESULTS_COMPLETE = 30, SLSI_RTT_ATTRIBUTE_RESULTS_PER_TARGET, SLSI_RTT_ATTRIBUTE_RESULT_CNT, SLSI_RTT_ATTRIBUTE_RESULT, SLSI_RTT_ATTRIBUTE_TARGET_ID, SLSI_RTT_ATTRIBUTE_MAX }; /* Ranging status */ enum slsi_wifi_rtt_status { SLSI_RTT_STATUS_SUCCESS = 0, SLSI_RTT_STATUS_FAILURE, /* general failure status */ SLSI_RTT_STATUS_FAIL_NO_RSP, /* target STA does not respond to request */ SLSI_RTT_STATUS_FAIL_REJECTED, /* request rejected. Applies to 2-sided RTT only*/ SLSI_RTT_STATUS_FAIL_NOT_SCHEDULED_YET, SLSI_RTT_STATUS_FAIL_TM_TIMEOUT, /* timing measurement times out */ SLSI_RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL, /* Target on different channel, cannot range */ SLSI_RTT_STATUS_FAIL_NO_CAPABILITY, /* ranging not supported */ SLSI_RTT_STATUS_ABORTED, /* request aborted for unknown reason */ SLSI_RTT_STATUS_FAIL_INVALID_TS, /* Invalid T1-T4 timestamp */ SLSI_RTT_STATUS_FAIL_PROTOCOL, /* 11mc protocol failed */ SLSI_RTT_STATUS_FAIL_SCHEDULE, /* request could not be scheduled */ SLSI_RTT_STATUS_FAIL_BUSY_TRY_LATER, /* responder cannot collaborate at time of request */ SLSI_RTT_STATUS_INVALID_REQ, /* bad request args */ SLSI_RTT_STATUS_NO_WIFI, /* WiFi not enabled */ SLSI_RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE /* Responder overrides param info, cannot range with new params */ }; /* Format of information elements found in the beacon */ struct slsi_wifi_information_element { u8 id; /* element identifier */ u8 len; /* number of bytes to follow */ u8 data[]; }; struct slsi_nl_gscan_capabilities { int max_scan_cache_size; int max_scan_buckets; int max_ap_cache_per_scan; int max_rssi_sample_size; int max_scan_reporting_threshold; int max_hotlist_aps; int max_hotlist_ssids; int max_significant_wifi_change_aps; int max_bssid_history_entries; int max_number_epno_networks; int max_number_epno_networks_by_ssid; int max_number_of_white_listed_ssid; }; struct slsi_nl_channel_param { int channel; int dwell_time_ms; int passive; /* 0 => active, 1 => passive scan; ignored for DFS */ }; struct slsi_nl_bucket_param { int bucket_index; enum wifi_band band; int period; /* desired period in millisecond */ u8 report_events; int max_period; /* If non-zero: scan period will grow exponentially to a maximum period of max_period */ int exponent; /* multiplier: new_period = old_period ^ exponent */ int step_count; /* number of scans performed at a given period and until the exponent is applied */ int num_channels; struct slsi_nl_channel_param channels[SLSI_GSCAN_MAX_CHANNELS]; }; struct slsi_nl_gscan_param { int base_period; /* base timer period in ms */ int max_ap_per_scan; /* number of APs to store in each scan in the BSSID/RSSI history buffer */ int report_threshold_percent; /* when scan_buffer is this much full, wake up application processor */ int report_threshold_num_scans; /* wake up application processor after these many scans */ int num_buckets; struct slsi_nl_bucket_param nl_bucket[SLSI_GSCAN_MAX_BUCKETS]; }; struct slsi_nl_scan_result_param { u64 ts; /* time since boot (in microsecond) when the result was retrieved */ u8 ssid[IEEE80211_MAX_SSID_LEN + 1]; /* NULL terminated */ u8 bssid[6]; int channel; /* channel frequency in MHz */ int rssi; /* in db */ s64 rtt; /* in nanoseconds */ s64 rtt_sd; /* standard deviation in rtt */ u16 beacon_period; /* period advertised in the beacon */ u16 capability; /* capabilities advertised in the beacon */ u32 ie_length; /* size of the ie_data blob */ u8 ie_data[1]; /* beacon IE */ }; struct slsi_bucket { bool used; /* to identify if this entry is free */ bool for_change_tracking; /* Indicates if this scan_id is used for change_tracking */ u8 report_events; /* this is received from HAL/Framework */ u16 scan_id; /* SLSI_GSCAN_SCAN_ID_START + */ int scan_cycle; /* To find the current scan cycle */ struct slsi_gscan *gscan; /* gscan ref in which this bucket belongs */ }; struct slsi_gscan { int max_ap_per_scan; /* received from HAL/Framework */ int report_threshold_percent; /* received from HAL/Framework */ int report_threshold_num_scans; /* received from HAL/Framework */ int num_scans; int num_buckets; /* received from HAL/Framework */ struct slsi_nl_bucket_param nl_bucket; /* store the first bucket params. used in tracking*/ struct slsi_bucket *bucket[SLSI_GSCAN_MAX_BUCKETS_PER_GSCAN]; struct slsi_gscan *next; }; struct slsi_gscan_param { struct slsi_nl_bucket_param *nl_bucket; struct slsi_bucket *bucket; }; struct slsi_gscan_result { struct slsi_gscan_result *hnext; int scan_cycle; int scan_res_len; int anqp_length; struct slsi_nl_scan_result_param nl_scan_res; }; struct slsi_epno_ssid_param { u16 flags; u8 ssid_len; u8 ssid[32]; }; struct slsi_epno_param { u16 min_5g_rssi; /* minimum 5GHz RSSI for a BSSID to be considered */ u16 min_2g_rssi; /* minimum 2.4GHz RSSI for a BSSID to be considered */ u16 initial_score_max; /* maximum score that a network can have before bonuses */ u8 current_connection_bonus; /* report current connection bonus only, when there is a * network's score this much higher than the current connection */ u8 same_network_bonus; /* score bonus for all networks with the same network flag */ u8 secure_bonus; /* score bonus for networks that are not open */ u8 band_5g_bonus; /* 5GHz RSSI score bonus (applied to all 5GHz networks) */ u8 num_networks; /* number of wifi_epno_network objects */ struct slsi_epno_ssid_param epno_ssid[]; /* PNO networks */ }; struct slsi_epno_hs2_param { u32 id; /* identifier of this network block, report this in event */ u8 realm[256]; /* null terminated UTF8 encoded realm, 0 if unspecified */ s64 roaming_consortium_ids[16]; /* roaming consortium ids to match, 0s if unspecified */ u8 plmn[3]; /* mcc/mnc combination as per rules, 0s if unspecified */ }; struct slsi_rssi_monitor_evt { s16 rssi; u8 bssid[ETH_ALEN]; }; /* channel information */ struct slsi_lls_channel_info { enum slsi_lls_channel_width width; /* channel width (20, 40, 80, 80+80, 160)*/ int center_freq; /* primary 20 MHz channel */ int center_freq0; /* center frequency (MHz) first segment */ int center_freq1; /* center frequency (MHz) second segment */ }; /* channel statistics */ struct slsi_lls_channel_stat { struct slsi_lls_channel_info channel; u32 on_time; /* msecs the radio is awake (32 bits number accruing over time) */ u32 cca_busy_time; /* msecs the CCA register is busy (32 bits number accruing over time) */ }; /* wifi rate */ struct slsi_lls_rate { u32 preamble :3; /* 0: OFDM, 1:CCK, 2:HT 3:VHT 4..7 reserved*/ u32 nss :2; /* 0:1x1, 1:2x2, 3:3x3, 4:4x4*/ u32 bw :3; /* 0:20MHz, 1:40Mhz, 2:80Mhz, 3:160Mhz*/ u32 rate_mcs_idx :8; /* OFDM/CCK rate code mcs index*/ u32 reserved :16; /* reserved*/ u32 bitrate; /* units of 100 Kbps*/ }; /* per rate statistics */ struct slsi_lls_rate_stat { struct slsi_lls_rate rate; /* rate information*/ u32 tx_mpdu; /* number of successfully transmitted data pkts (ACK rcvd)*/ u32 rx_mpdu; /* number of received data pkts*/ u32 mpdu_lost; /* number of data packet losses (no ACK)*/ u32 retries; /* total number of data pkt retries*/ u32 retries_short; /* number of short data pkt retries*/ u32 retries_long; /* number of long data pkt retries*/ }; /* radio statistics */ struct slsi_lls_radio_stat { int radio; /* wifi radio (if multiple radio supported)*/ u32 on_time; /* msecs the radio is awake (32 bits number accruing over time)*/ u32 tx_time; /* msecs the radio is transmitting (32 bits number accruing over time)*/ u32 rx_time; /* msecs the radio is in active receive (32 bits number accruing over time)*/ u32 on_time_scan; /* msecs the radio is awake due to all scan (32 bits number accruing over time)*/ u32 on_time_nbd; /* msecs the radio is awake due to NAN (32 bits number accruing over time)*/ u32 on_time_gscan; /* msecs the radio is awake due to G?scan (32 bits number accruing over time)*/ u32 on_time_roam_scan; /* msecs the radio is awake due to roam?scan (32 bits number accruing over time)*/ u32 on_time_pno_scan; /* msecs the radio is awake due to PNO scan (32 bits number accruing over time)*/ u32 on_time_hs20; /* msecs the radio is awake due to HS2.0 scans and GAS exchange (32 bits number accruing over time)*/ u32 num_channels; /* number of channels*/ struct slsi_lls_channel_stat channels[]; /* channel statistics*/ }; struct slsi_lls_interface_link_layer_info { enum slsi_lls_interface_mode mode; /* interface mode*/ u8 mac_addr[6]; /* interface mac address (self)*/ enum slsi_lls_connection_state state; /* connection state (valid for STA, CLI only)*/ enum slsi_lls_roam_state roaming; /* roaming state*/ u32 capabilities; /* WIFI_CAPABILITY_XXX (self)*/ u8 ssid[33]; /* null terminated SSID*/ u8 bssid[6]; /* bssid*/ u8 ap_country_str[3]; /* country string advertised by AP*/ u8 country_str[3]; /* country string for this association*/ }; /* per peer statistics */ struct slsi_lls_peer_info { enum slsi_lls_peer_type type; /* peer type (AP, TDLS, GO etc.)*/ u8 peer_mac_address[6]; /* mac address*/ u32 capabilities; /* peer WIFI_CAPABILITY_XXX*/ u32 num_rate; /* number of rates*/ struct slsi_lls_rate_stat rate_stats[]; /* per rate statistics, number of entries = num_rate*/ }; /* Per access category statistics */ struct slsi_lls_wmm_ac_stat { enum slsi_lls_traffic_ac ac; /* access category (VI, VO, BE, BK)*/ u32 tx_mpdu; /* number of successfully transmitted unicast data pkts (ACK rcvd)*/ u32 rx_mpdu; /* number of received unicast data packets*/ u32 tx_mcast; /* number of successfully transmitted multicast data packets*/ u32 rx_mcast; /* number of received multicast data packets*/ u32 rx_ampdu; /* number of received unicast a-mpdus; support of this counter is optional*/ u32 tx_ampdu; /* number of transmitted unicast a-mpdus; support of this counter is optional*/ u32 mpdu_lost; /* number of data pkt losses (no ACK)*/ u32 retries; /* total number of data pkt retries*/ u32 retries_short; /* number of short data pkt retries*/ u32 retries_long; /* number of long data pkt retries*/ u32 contention_time_min; /* data pkt min contention time (usecs)*/ u32 contention_time_max; /* data pkt max contention time (usecs)*/ u32 contention_time_avg; /* data pkt avg contention time (usecs)*/ u32 contention_num_samples; /* num of data pkts used for contention statistics*/ }; struct slsi_rx_data_cnt_details { int rx_unicast_cnt; /*Total rx unicast packet which woke up host */ int rx_multicast_cnt; /*Total rx multicast packet which woke up host */ int rx_broadcast_cnt; /*Total rx broadcast packet which woke up host */ }; struct slsi_rx_wake_pkt_type_classification { int icmp_pkt; /*wake icmp packet count */ int icmp6_pkt; /*wake icmp6 packet count */ int icmp6_ra; /*wake icmp6 RA packet count */ int icmp6_na; /*wake icmp6 NA packet count */ int icmp6_ns; /*wake icmp6 NS packet count */ }; struct slsi_rx_multicast_cnt { int ipv4_rx_multicast_addr_cnt; /*Rx wake packet was ipv4 multicast */ int ipv6_rx_multicast_addr_cnt; /*Rx wake packet was ipv6 multicast */ int other_rx_multicast_addr_cnt;/*Rx wake packet was non-ipv4 and non-ipv6*/ }; /* * Structure holding all the driver/firmware wake count reasons. * * Buffers for the array fields (cmd_event_wake_cnt/driver_fw_local_wake_cnt) * are allocated and freed by the framework. The size of each allocated * array is indicated by the corresponding |_cnt| field. HAL needs to fill in * the corresponding |_used| field to indicate the number of elements used in * the array. */ struct slsi_wlan_driver_wake_reason_cnt { int total_cmd_event_wake; /* Total count of cmd event wakes */ int *cmd_event_wake_cnt; /* Individual wake count array, each index a reason */ int cmd_event_wake_cnt_sz; /* Max number of cmd event wake reasons */ int cmd_event_wake_cnt_used; /* Number of cmd event wake reasons specific to the driver */ int total_driver_fw_local_wake; /* Total count of drive/fw wakes, for local reasons */ int *driver_fw_local_wake_cnt; /* Individual wake count array, each index a reason */ int driver_fw_local_wake_cnt_sz; /* Max number of local driver/fw wake reasons */ int driver_fw_local_wake_cnt_used; /* Number of local driver/fw wake reasons specific to the driver */ int total_rx_data_wake; /* total data rx packets, that woke up host */ struct slsi_rx_data_cnt_details rx_wake_details; struct slsi_rx_wake_pkt_type_classification rx_wake_pkt_classification_info; struct slsi_rx_multicast_cnt rx_multicast_wake_pkt_info; }; /* interface statistics */ struct slsi_lls_iface_stat { void *iface; /* wifi interface*/ struct slsi_lls_interface_link_layer_info info; /* current state of the interface*/ u32 beacon_rx; /* access point beacon received count from connected AP*/ u64 average_tsf_offset; /* average beacon offset encountered (beacon_TSF - TBTT)*/ u32 leaky_ap_detected; /* indicate that this AP typically leaks packets beyond the driver guard time.*/ u32 leaky_ap_avg_num_frames_leaked; /* average number of frame leaked by AP after frame with PM bit set was ACK'ed by AP*/ u32 leaky_ap_guard_time; u32 mgmt_rx; /* access point mgmt frames received count from connected AP (including Beacon)*/ u32 mgmt_action_rx; /* action frames received count*/ u32 mgmt_action_tx; /* action frames transmit count*/ int rssi_mgmt; /* access Point Beacon and Management frames RSSI (averaged)*/ int rssi_data; /* access Point Data Frames RSSI (averaged) from connected AP*/ int rssi_ack; /* access Point ACK RSSI (averaged) from connected AP*/ struct slsi_lls_wmm_ac_stat ac[SLSI_LLS_AC_MAX]; /* per ac data packet statistics*/ u32 num_peers; /* number of peers*/ struct slsi_lls_peer_info peer_info[]; /* per peer statistics*/ }; enum slsi_wifi_hal_api_return_types { WIFI_HAL_SUCCESS = 0, WIFI_HAL_ERROR_NONE = 0, WIFI_HAL_ERROR_UNKNOWN = -1, WIFI_HAL_ERROR_UNINITIALIZED = -2, WIFI_HAL_ERROR_NOT_SUPPORTED = -3, WIFI_HAL_ERROR_NOT_AVAILABLE = -4, WIFI_HAL_ERROR_INVALID_ARGS = -5, WIFI_HAL_ERROR_INVALID_REQUEST_ID = -6, WIFI_HAL_ERROR_TIMED_OUT = -7, WIFI_HAL_ERROR_TOO_MANY_REQUESTS = -8, WIFI_HAL_ERROR_OUT_OF_MEMORY = -9 }; struct slsi_rtt_capabilities { u8 rtt_one_sided_supported; /* if 1-sided rtt data collection is supported */ u8 rtt_ftm_supported; /* if ftm rtt data collection is supported */ u8 lci_support; /* if initiator supports LCI request. Applies to 2-sided RTT */ u8 lcr_support; /* if initiator supports LCR request. Applies to 2-sided RTT */ u8 preamble_support; /* bit mask indicates what preamble is supported by initiator */ u8 bw_support; /* bit mask indicates what BW is supported by initiator */ u8 responder_supported; /* if 11mc responder mode is supported */ u8 mc_version; /* draft 11mc spec version supported by chip. For instance, *version 4.0 should be 40 and version 4.3 should be 43 etc. */ }; /*Data Structure to store rtt_id and list of mac_addresses which is being processed.*/ struct slsi_rtt_id_params { u8 fapi_req_id; u32 hal_request_id; u8 peer_type; u32 peer_count; u8 peers[]; }; /* RTT configuration */ struct slsi_rtt_config { u8 peer_addr[ETH_ALEN]; /* peer device mac address */ u8 rtt_peer; /* optional - peer device hint (STA, P2P, AP) */ u8 rtt_type; /* 1-sided or 2-sided RTT */ u16 channel_freq; /* Required for STA-AP mode, optional for P2P, NBD etc. */ u16 channel_info; u8 burst_period; /* Time interval between bursts (units: 100 ms). */ /* Applies to 1-sided and 2-sided RTT multi-burst requests. *Range: 0-31, 0: no preference by initiator (2-sided RTT) */ u8 num_burst; /* Total number of RTT bursts to be executed. It will be *specified in the same way as the parameter "Number of *Burst Exponent" found in the FTM frame format. It *applies to both: 1-sided RTT and 2-sided RTT. Valid *values are 0 to 15 as defined in 802.11mc std *0 means single shot *The implication of this parameter on the maximum *number of RTT results is the following: *for 1-sided RTT: max num of RTT results = (2^num_burst)*(num_frames_per_burst) *for 2-sided RTT: max num of RTT results = (2^num_burst)*(num_frames_per_burst - 1) */ u8 num_frames_per_burst; /* num of frames per burst. *Minimum value = 1, Maximum value = 31 *For 2-sided this equals the number of FTM frames *to be attempted in a single burst. This also *equals the number of FTM frames that the *initiator will request that the responder send *in a single frame. */ u8 num_retries_per_ftmr; /* Maximum number of retries that the initiator can *retry an FTMR frame. *Minimum value = 0, Maximum value = 3 */ u8 burst_duration; /* Applies to 1-sided and 2-sided RTT. Valid values will *be 2-11 and 15 as specified by the 802.11mc std for *the FTM parameter burst duration. In a multi-burst *request, if responder overrides with larger value, *the initiator will return failure. In a single-burst *request if responder overrides with larger value, *the initiator will sent TMR_STOP to terminate RTT *at the end of the burst_duration it requested. */ u16 preamble; /* RTT preamble to be used in the RTT frames */ u16 bw; /* RTT BW to be used in the RTT frames */ u16 LCI_request; /* 1: request LCI, 0: do not request LCI */ u16 LCR_request; /* 1: request LCR, 0: do not request LCR */ }; #define MAX_24G_CHANNELS 14 /*Max number of 2.4G channels*/ #define MAX_5G_CHANNELS 25 /*Max number of 5G channels*/ #define MAX_CHAN_VALUE_ACS (MAX_24G_CHANNELS + MAX_5G_CHANNELS) #define MAX_AP_THRESHOLD 10 /*Max AP threshold in ACS*/ struct slsi_acs_chan_info { u16 chan; u8 num_ap; u8 num_bss_load_ap; u8 total_chan_utilization; u8 avg_chan_utilization; int rssi_factor; int adj_rssi_factor; }; struct slsi_acs_selected_channels { u8 pri_channel; u8 sec_channel; u8 vht_seg0_center_ch; u8 vht_seg1_center_ch; u16 ch_width; enum slsi_acs_hw_mode hw_mode; }; struct slsi_acs_request { struct slsi_acs_chan_info acs_chan_info[MAX_CHAN_VALUE_ACS]; u8 hw_mode; u16 ch_width; u8 ch_list_len; }; struct slsi_logging_ap_info { short score; short rssi; u8 mac[ETH_ALEN]; u32 tp_score; u32 ch_util; }; void slsi_nl80211_vendor_init(struct slsi_dev *sdev); void slsi_nl80211_vendor_deinit(struct slsi_dev *sdev); u8 slsi_gscan_get_scan_policy(enum wifi_band band); void slsi_gscan_handle_scan_result(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb, u16 scan_id, bool scan_done); void slsi_gscan_hash_remove(struct slsi_dev *sdev, u8 *mac); void slsi_rx_significant_change_ind(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb); int slsi_gscan_alloc_buckets(struct slsi_dev *sdev, struct slsi_gscan *gscan, int num_buckets); int slsi_vendor_event(struct slsi_dev *sdev, int event_id, const void *data, int len); int slsi_mib_get_gscan_cap(struct slsi_dev *sdev, struct slsi_nl_gscan_capabilities *cap); void slsi_rx_rssi_report_ind(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb); int slsi_mib_get_apf_cap(struct slsi_dev *sdev, struct net_device *dev); int slsi_mib_get_rtt_cap(struct slsi_dev *sdev, struct net_device *dev, struct slsi_rtt_capabilities *cap); void slsi_rx_range_ind(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb); void slsi_rx_range_done_ind(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb); int slsi_tx_rate_calc(struct sk_buff *nl_skb, u16 fw_rate, int res, bool tx_rate); void slsi_rx_event_log_indication(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb); #ifdef CONFIG_SCSC_WLAN_DEBUG char *slsi_print_event_name(int event_id); #endif static inline bool slsi_is_gscan_id(u16 scan_id) { if ((scan_id >= SLSI_GSCAN_SCAN_ID_START) && (scan_id <= SLSI_GSCAN_SCAN_ID_END)) return true; return false; } static inline enum slsi_lls_traffic_ac slsi_fapi_to_android_traffic_q(enum slsi_traffic_q fapi_q) { switch (fapi_q) { case SLSI_TRAFFIC_Q_BE: return SLSI_LLS_AC_BE; case SLSI_TRAFFIC_Q_BK: return SLSI_LLS_AC_BK; case SLSI_TRAFFIC_Q_VI: return SLSI_LLS_AC_VI; case SLSI_TRAFFIC_Q_VO: return SLSI_LLS_AC_VO; default: return SLSI_LLS_AC_MAX; } } #endif