1 /* 2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: declares driver functions interfacing with linux kernel 22 */ 23 24 25 #ifndef _WLAN_CFG80211_H_ 26 #define _WLAN_CFG80211_H_ 27 28 #include <linux/version.h> 29 #include <linux/netdevice.h> 30 #include <net/netlink.h> 31 #include <net/cfg80211.h> 32 #include <qca_vendor.h> 33 #include <qdf_nbuf.h> 34 #include "qal_devcfg.h" 35 #include "wlan_osif_features.h" 36 37 #define osif_alert(params...) \ 38 QDF_TRACE_FATAL(QDF_MODULE_ID_OS_IF, params) 39 #define osif_err(params...) \ 40 QDF_TRACE_ERROR(QDF_MODULE_ID_OS_IF, params) 41 #define osif_warn(params...) \ 42 QDF_TRACE_WARN(QDF_MODULE_ID_OS_IF, params) 43 #define osif_notice(params...) \ 44 QDF_TRACE_INFO(QDF_MODULE_ID_OS_IF, params) 45 #define osif_info(params...) \ 46 QDF_TRACE_INFO(QDF_MODULE_ID_OS_IF, params) 47 #define osif_debug(params...) \ 48 QDF_TRACE_DEBUG(QDF_MODULE_ID_OS_IF, params) 49 #define osif_rl_debug(params...) \ 50 QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_OS_IF, params) 51 #define osif_err_rl(params...) \ 52 QDF_TRACE_ERROR_RL(QDF_MODULE_ID_OS_IF, params) 53 54 #define osif_nofl_alert(params...) \ 55 QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_OS_IF, params) 56 #define osif_nofl_err(params...) \ 57 QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_OS_IF, params) 58 #define osif_nofl_warn(params...) \ 59 QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_OS_IF, params) 60 #define osif_nofl_info(params...) \ 61 QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_OS_IF, params) 62 #define osif_nofl_debug(params...) \ 63 QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_OS_IF, params) 64 65 #define osif_enter_dev(dev) \ 66 QDF_TRACE_ENTER(QDF_MODULE_ID_OS_IF, "enter(%s)", (dev)->name) 67 68 /** 69 * enum qca_nl80211_vendor_subcmds_index - vendor sub commands index 70 * 71 * @QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX: Avoid frequency 72 * @QCA_NL80211_VENDOR_SUBCMD_NAN_INDEX: Nan 73 * @QCA_NL80211_VENDOR_SUBCMD_STATS_EXT_INDEX: Ext stats 74 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_START_INDEX: Ext scan start 75 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_STOP_INDEX: Ext scan stop 76 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CAPABILITIES_INDEX: Ext scan get 77 * capability 78 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CACHED_RESULTS_INDEX: Ext scan get 79 * cached results 80 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_RESULTS_AVAILABLE_INDEX: Ext scan 81 * results available 82 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_FULL_SCAN_RESULT_INDEX: Ext scan full 83 * scan result 84 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_EVENT_INDEX: Ext scan event 85 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_FOUND_INDEX: Ext scan hot list 86 * AP found 87 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_BSSID_HOTLIST_INDEX: Ext scan set 88 * bssid hotlist 89 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_BSSID_HOTLIST_INDEX: Ext scan reset 90 * bssid hotlist 91 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SIGNIFICANT_CHANGE_INDEX: Ext scan 92 * significant change 93 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SIGNIFICANT_CHANGE_INDEX: Ext scan 94 * set significant change 95 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SIGNIFICANT_CHANGE_INDEX: Ext scan 96 * reset significant change 97 * @QCA_NL80211_VENDOR_SUBCMD_LL_STATS_SET_INDEX: Set stats 98 * @QCA_NL80211_VENDOR_SUBCMD_LL_STATS_GET_INDEX: Get stats 99 * @QCA_NL80211_VENDOR_SUBCMD_LL_STATS_CLR_INDEX: Clear stats 100 * @QCA_NL80211_VENDOR_SUBCMD_LL_RADIO_STATS_INDEX: Radio stats 101 * @QCA_NL80211_VENDOR_SUBCMD_LL_IFACE_STATS_INDEX: Iface stats 102 * @QCA_NL80211_VENDOR_SUBCMD_LL_PEER_INFO_STATS_INDEX: Peer info stats 103 * @QCA_NL80211_VENDOR_SUBCMD_LL_STATS_EXT_INDEX: MAC layer counters 104 * @QCA_NL80211_VENDOR_SUBCMD_TDLS_STATE_CHANGE_INDEX: Ext tdls state change 105 * @QCA_NL80211_VENDOR_SUBCMD_DO_ACS_INDEX: ACS command 106 * @QCA_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH_INDEX: Pass Roam and Auth info 107 * @QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_STARTED_INDEX: 108 * @QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_FINISHED_INDEX: 109 * @QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_ABORTED_INDEX: 110 * @QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_NOP_FINISHED_INDEX: 111 * @QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_RADAR_DETECTED_INDEX: 112 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_LOST_INDEX: hotlist ap lost 113 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_NETWORK_FOUND_INDEX: 114 * pno network found index 115 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_PASSPOINT_NETWORK_FOUND_INDEX: 116 * passpoint match found index 117 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST_INDEX: 118 * set ssid hotlist index 119 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST_INDEX: 120 * reset ssid hotlist index 121 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX: 122 * hotlist ssid found index 123 * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX: 124 * hotlist ssid lost index 125 * @QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_CONFIGURATION_INDEX: 126 * @QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX: 127 * @QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP_INDEX: 128 * @QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT_INDEX: 129 * dcc stats event index 130 * @QCA_NL80211_VENDOR_SUBCMD_SCAN_INDEX: vendor scan index 131 * @QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE_INDEX: 132 * vendor scan complete event index 133 * @QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG_INDEX: 134 * update gateway parameters index 135 * @QCA_NL80211_VENDOR_SUBCMD_INTEROP_ISSUES_AP_INDEX: 136 * update aps info which has interop issues events index 137 * @QCA_NL80211_VENDOR_SUBCMD_TSF_INDEX: TSF response events index 138 * @QCA_NL80211_VENDOR_SUBCMD_NDP_INDEX: 139 * @QCA_NL80211_VENDOR_SUBCMD_P2P_LO_EVENT_INDEX: 140 * P2P listen offload index 141 * @QCA_NL80211_VENDOR_SUBCMD_SAP_CONDITIONAL_CHAN_SWITCH_INDEX: SAP 142 * conditional channel switch index 143 * @QCA_NL80211_VENDOR_SUBCMD_UPDATE_EXTERNAL_ACS_CONFIG: 144 * @QCA_NL80211_VENDOR_SUBCMD_PWR_SAVE_FAIL_DETECTED_INDEX: 145 * @QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_GET_INDEX: NUD DEBUG Stats index 146 * @QCA_NL80211_VENDOR_SUBCMD_HANG_REASON_INDEX: hang event reason index 147 * @QCA_NL80211_VENDOR_SUBCMD_WLAN_MAC_INFO_INDEX: MAC mode info index 148 * @QCA_NL80211_VENDOR_SUBCMD_NAN_EXT_INDEX: NAN Extended index 149 * @QCA_NL80211_VENDOR_SUBCMD_THROUGHPUT_CHANGE_EVENT_INDEX: 150 * @QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES_INDEX: 151 * @QCA_NL80211_VENDOR_SUBCMD_PEER_STATS_CACHE_FLUSH_INDEX: 152 * @QCA_NL80211_VENDOR_SUBCMD_BEACON_REPORTING_INDEX: Beacon reporting index 153 * @QCA_NL80211_VENDOR_SUBCMD_ROAM_INDEX: 154 * @QCA_NL80211_VENDOR_SUBCMD_OEM_DATA_INDEX: 155 * @QCA_NL80211_VENDOR_SUBCMD_REQUEST_SAR_LIMITS_INDEX: Request SAR limit index 156 * @QCA_NL80211_VENDOR_SUBCMD_UPDATE_STA_INFO_INDEX: Update STA info index 157 * @QCA_NL80211_VENDOR_SUBCMD_MEDIUM_ASSESS_INDEX: 158 * @QCA_NL80211_VENDOR_SUBCMD_UPDATE_SSID_INDEX: Update SSID index 159 * @QCA_NL80211_VENDOR_SUBCMD_WIFI_FW_STATS_INDEX: Wifi FW stats index 160 * @QCA_NL80211_VENDOR_SUBCMD_MBSSID_TX_VDEV_STATUS_INDEX: 161 * MBSSID TX VDEV status index 162 * @QCA_NL80211_VENDOR_SUBCMD_THERMAL_INDEX: Report thermal event index 163 * @QCA_NL80211_VENDOR_SUBCMD_CONFIG_TWT_INDEX: TWT config index 164 * @QCA_NL80211_VENDOR_SUBCMD_PEER_CFR_CAPTURE_CFG_INDEX: CFR data event index 165 * @QCA_NL80211_VENDOR_SUBCMD_DIAG_EVENT_INDEX: 166 * @QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS_INDEX: 167 * @QCA_NL80211_VENDOR_SUBCMD_MCC_QUOTA_INDEX: 168 * @QCA_NL80211_VENDOR_SUBCMD_PEER_FLUSH_PENDING_INDEX: 169 * @QCA_NL80211_VENDOR_SUBCMD_DRIVER_READY_INDEX: Driver Ready after SSR index 170 * @QCA_NL80211_VENDOR_SUBCMD_PASN_AUTH_STATUS_INDEX: PASN auth status index 171 * @QCA_NL80211_VENDOR_SUBCMD_SCS_RULE_CONFIG_INDEX: SCS rule config index 172 * @QCA_NL80211_VENDOR_SUBCMD_SR_INDEX: SR Event index 173 * @QCA_NL80211_VENDOR_SUBCMD_MLO_PEER_PRIM_NETDEV_EVENT_INDEX: primary netdev 174 * event index 175 * @QCA_NL80211_VENDOR_SUBCMD_AFC_EVENT_INDEX: AFC Event index 176 * @QCA_NL80211_VENDOR_SUBCMD_DOZED_AP_INDEX: Dozed AP event index 177 * @QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS_INDEX: Roam stats index index 178 * @QCA_NL80211_VENDOR_SUBCMD_CONNECTED_CHANNEL_STATS_INDEX: Connected channel 179 * stats index 180 * @QCA_NL80211_VENDOR_SUBCMD_DRIVER_DISCONNECT_REASON_INDEX: 181 * Driver disconnect reason index 182 * @QCA_NL80211_VENDOR_SUBCMD_TID_TO_LINK_MAP_INDEX: TID-to-link map index 183 * @QCA_NL80211_VENDOR_SUBCMD_LINK_RECONFIG_INDEX: link reconfig event index 184 * @QCA_NL80211_VENDOR_SUBCMD_AUDIO_TRANSPORT_SWITCH_INDEX: Audio transport 185 * switch event index 186 * @QCA_NL80211_VENDOR_SUBCMD_TX_LATENCY_INDEX: event index for transmit 187 * latency stats 188 * @QCA_NL80211_VENDOR_SUBCMD_RECONFIG_REMOVE_COMPLETE_EVENT_INDEX: ML Reconfig 189 * remove complete event index 190 * @QCA_NL80211_VENDOR_SUBCMD_FW_PAGE_FAULT_REPORT_INDEX: Pagefault report 191 * event index 192 */ 193 194 enum qca_nl80211_vendor_subcmds_index { 195 QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX = 0, 196 197 QCA_NL80211_VENDOR_SUBCMD_NAN_INDEX, 198 199 #ifdef WLAN_FEATURE_STATS_EXT 200 QCA_NL80211_VENDOR_SUBCMD_STATS_EXT_INDEX, 201 #endif /* WLAN_FEATURE_STATS_EXT */ 202 203 #ifdef FEATURE_WLAN_EXTSCAN 204 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_START_INDEX, 205 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_STOP_INDEX, 206 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CAPABILITIES_INDEX, 207 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CACHED_RESULTS_INDEX, 208 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_RESULTS_AVAILABLE_INDEX, 209 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_FULL_SCAN_RESULT_INDEX, 210 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_EVENT_INDEX, 211 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_FOUND_INDEX, 212 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_BSSID_HOTLIST_INDEX, 213 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_BSSID_HOTLIST_INDEX, 214 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SIGNIFICANT_CHANGE_INDEX, 215 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SIGNIFICANT_CHANGE_INDEX, 216 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SIGNIFICANT_CHANGE_INDEX, 217 #endif /* FEATURE_WLAN_EXTSCAN */ 218 219 #ifdef WLAN_FEATURE_LINK_LAYER_STATS 220 QCA_NL80211_VENDOR_SUBCMD_LL_STATS_SET_INDEX, 221 QCA_NL80211_VENDOR_SUBCMD_LL_STATS_GET_INDEX, 222 QCA_NL80211_VENDOR_SUBCMD_LL_STATS_CLR_INDEX, 223 QCA_NL80211_VENDOR_SUBCMD_LL_RADIO_STATS_INDEX, 224 QCA_NL80211_VENDOR_SUBCMD_LL_IFACE_STATS_INDEX, 225 QCA_NL80211_VENDOR_SUBCMD_LL_PEER_INFO_STATS_INDEX, 226 QCA_NL80211_VENDOR_SUBCMD_LL_STATS_EXT_INDEX, 227 #endif /* WLAN_FEATURE_LINK_LAYER_STATS */ 228 229 QCA_NL80211_VENDOR_SUBCMD_TDLS_STATE_CHANGE_INDEX, 230 QCA_NL80211_VENDOR_SUBCMD_DO_ACS_INDEX, 231 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 232 QCA_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH_INDEX, 233 #endif 234 /* DFS */ 235 QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_STARTED_INDEX, 236 QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_FINISHED_INDEX, 237 QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_ABORTED_INDEX, 238 QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_NOP_FINISHED_INDEX, 239 QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_RADAR_DETECTED_INDEX, 240 #ifdef FEATURE_WLAN_EXTSCAN 241 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_LOST_INDEX, 242 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_NETWORK_FOUND_INDEX, 243 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_PASSPOINT_NETWORK_FOUND_INDEX, 244 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST_INDEX, 245 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST_INDEX, 246 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX, 247 QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX, 248 #endif /* FEATURE_WLAN_EXTSCAN */ 249 QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_CONFIGURATION_INDEX, 250 QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX, 251 #ifdef WLAN_FEATURE_MEMDUMP 252 QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP_INDEX, 253 #endif /* WLAN_FEATURE_MEMDUMP */ 254 /* OCB events */ 255 QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT_INDEX, 256 QCA_NL80211_VENDOR_SUBCMD_SCAN_INDEX, 257 QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE_INDEX, 258 QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG_INDEX, 259 QCA_NL80211_VENDOR_SUBCMD_INTEROP_ISSUES_AP_INDEX, 260 #ifdef WLAN_FEATURE_TSF 261 QCA_NL80211_VENDOR_SUBCMD_TSF_INDEX, 262 #endif 263 QCA_NL80211_VENDOR_SUBCMD_NDP_INDEX, 264 QCA_NL80211_VENDOR_SUBCMD_P2P_LO_EVENT_INDEX, 265 QCA_NL80211_VENDOR_SUBCMD_SAP_CONDITIONAL_CHAN_SWITCH_INDEX, 266 QCA_NL80211_VENDOR_SUBCMD_UPDATE_EXTERNAL_ACS_CONFIG, 267 QCA_NL80211_VENDOR_SUBCMD_PWR_SAVE_FAIL_DETECTED_INDEX, 268 QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_GET_INDEX, 269 QCA_NL80211_VENDOR_SUBCMD_HANG_REASON_INDEX, 270 QCA_NL80211_VENDOR_SUBCMD_WLAN_MAC_INFO_INDEX, 271 QCA_NL80211_VENDOR_SUBCMD_NAN_EXT_INDEX, 272 QCA_NL80211_VENDOR_SUBCMD_THROUGHPUT_CHANGE_EVENT_INDEX, 273 QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES_INDEX, 274 QCA_NL80211_VENDOR_SUBCMD_PEER_STATS_CACHE_FLUSH_INDEX, 275 QCA_NL80211_VENDOR_SUBCMD_BEACON_REPORTING_INDEX, 276 QCA_NL80211_VENDOR_SUBCMD_ROAM_INDEX, 277 QCA_NL80211_VENDOR_SUBCMD_OEM_DATA_INDEX, 278 QCA_NL80211_VENDOR_SUBCMD_REQUEST_SAR_LIMITS_INDEX, 279 QCA_NL80211_VENDOR_SUBCMD_UPDATE_STA_INFO_INDEX, 280 QCA_NL80211_VENDOR_SUBCMD_MEDIUM_ASSESS_INDEX, 281 QCA_NL80211_VENDOR_SUBCMD_UPDATE_SSID_INDEX, 282 QCA_NL80211_VENDOR_SUBCMD_WIFI_FW_STATS_INDEX, 283 QCA_NL80211_VENDOR_SUBCMD_MBSSID_TX_VDEV_STATUS_INDEX, 284 QCA_NL80211_VENDOR_SUBCMD_THERMAL_INDEX, 285 QCA_NL80211_VENDOR_SUBCMD_DRIVER_DISCONNECT_REASON_INDEX, 286 #ifdef WLAN_SUPPORT_TWT 287 QCA_NL80211_VENDOR_SUBCMD_CONFIG_TWT_INDEX, 288 #endif 289 #ifdef WLAN_CFR_ENABLE 290 QCA_NL80211_VENDOR_SUBCMD_PEER_CFR_CAPTURE_CFG_INDEX, 291 #endif 292 #ifdef WLAN_FEATURE_CONNECTIVITY_LOGGING 293 QCA_NL80211_VENDOR_SUBCMD_DIAG_EVENT_INDEX, 294 #endif 295 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 296 QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS_INDEX, 297 #endif 298 QCA_NL80211_VENDOR_SUBCMD_MCC_QUOTA_INDEX, 299 QCA_NL80211_VENDOR_SUBCMD_PEER_FLUSH_PENDING_INDEX, 300 QCA_NL80211_VENDOR_SUBCMD_DRIVER_READY_INDEX, 301 QCA_NL80211_VENDOR_SUBCMD_PASN_AUTH_STATUS_INDEX, 302 QCA_NL80211_VENDOR_SUBCMD_SCS_RULE_CONFIG_INDEX, 303 #ifdef WLAN_FEATURE_SR 304 QCA_NL80211_VENDOR_SUBCMD_SR_INDEX, 305 #endif 306 QCA_NL80211_VENDOR_SUBCMD_MLO_PEER_PRIM_NETDEV_EVENT_INDEX, 307 #ifdef CONFIG_AFC_SUPPORT 308 QCA_NL80211_VENDOR_SUBCMD_AFC_EVENT_INDEX, 309 #endif 310 #ifdef WLAN_SUPPORT_GAP_LL_PS_MODE 311 QCA_NL80211_VENDOR_SUBCMD_DOZED_AP_INDEX, 312 #endif 313 #ifdef WLAN_FEATURE_ROAM_INFO_STATS 314 QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS_INDEX, 315 #endif 316 QCA_NL80211_VENDOR_SUBCMD_CONNECTED_CHANNEL_STATS_INDEX, 317 #ifdef WLAN_FEATURE_11BE_MLO 318 QCA_NL80211_VENDOR_SUBCMD_TID_TO_LINK_MAP_INDEX, 319 #ifdef CONN_MGR_ADV_FEATURE 320 QCA_NL80211_VENDOR_SUBCMD_LINK_RECONFIG_INDEX, 321 #endif 322 #endif 323 QCA_NL80211_VENDOR_SUBCMD_AUDIO_TRANSPORT_SWITCH_INDEX, 324 #ifdef WLAN_FEATURE_TX_LATENCY_STATS 325 QCA_NL80211_VENDOR_SUBCMD_TX_LATENCY_INDEX, 326 #endif 327 QCA_NL80211_VENDOR_SUBCMD_RECONFIG_REMOVE_COMPLETE_EVENT_INDEX, 328 QCA_NL80211_VENDOR_SUBCMD_FW_PAGE_FAULT_REPORT_INDEX, 329 }; 330 331 #if !defined(SUPPORT_WDEV_CFG80211_VENDOR_EVENT_ALLOC) && \ 332 (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) && \ 333 !defined(WITH_BACKPORTS) 334 335 static inline struct sk_buff * backported_cfg80211_vendor_event_alloc(struct wiphy * wiphy,struct wireless_dev * wdev,int approxlen,int event_idx,gfp_t gfp)336 backported_cfg80211_vendor_event_alloc(struct wiphy *wiphy, 337 struct wireless_dev *wdev, 338 int approxlen, 339 int event_idx, gfp_t gfp) 340 { 341 struct sk_buff *skb; 342 343 skb = cfg80211_vendor_event_alloc(wiphy, approxlen, event_idx, gfp); 344 345 if (skb && wdev) { 346 struct nlattr *attr; 347 u32 ifindex = wdev->netdev->ifindex; 348 349 nla_nest_cancel(skb, ((void **)skb->cb)[2]); 350 if (nla_put_u32(skb, NL80211_ATTR_IFINDEX, ifindex)) 351 goto nla_fail; 352 353 attr = nla_nest_start(skb, NL80211_ATTR_VENDOR_DATA); 354 ((void **)skb->cb)[2] = attr; 355 } 356 357 return skb; 358 359 nla_fail: 360 kfree_skb(skb); 361 362 return NULL; 363 } 364 365 #define cfg80211_vendor_event_alloc backported_cfg80211_vendor_event_alloc 366 #endif 367 368 /* For kernel version >= 5.2, driver needs to provide policy */ 369 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0)) 370 #define vendor_command_policy(__policy, __maxattr) \ 371 .policy = __policy, \ 372 .maxattr = __maxattr 373 #define VENDOR_NLA_POLICY_NESTED(__policy) \ 374 NLA_POLICY_NESTED(__policy) 375 #define VENDOR_NLA_POLICY_NESTED_ARRAY(__policy) \ 376 NLA_POLICY_NESTED_ARRAY(__policy) 377 #else 378 #define vendor_command_policy(__policy, __maxattr) 379 #define VENDOR_NLA_POLICY_NESTED(__policy) {.type = NLA_NESTED} 380 #define VENDOR_NLA_POLICY_NESTED_ARRAY(__policy) \ 381 VENDOR_NLA_POLICY_NESTED(__policy) 382 #endif /*End of (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) */ 383 384 /* For kernel version <= 4.20, driver needs to provide policy */ 385 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)) 386 #define VENDOR_NLA_POLICY_MAC_ADDR NLA_POLICY_ETH_ADDR 387 #define VENDOR_NLA_POLICY_IPV4_ADDR NLA_POLICY_EXACT_LEN(QDF_IPV4_ADDR_SIZE) 388 #define VENDOR_NLA_POLICY_IPV6_ADDR NLA_POLICY_EXACT_LEN(QDF_IPV6_ADDR_SIZE) 389 #else 390 #define VENDOR_NLA_POLICY_MAC_ADDR \ 391 {.type = NLA_UNSPEC, .len = QDF_MAC_ADDR_SIZE} 392 #define NLA_EXACT_LEN NLA_UNSPEC 393 #define VENDOR_NLA_POLICY_IPV4_ADDR \ 394 {.type = NLA_EXACT_LEN, .len = QDF_IPV4_ADDR_SIZE} 395 #define VENDOR_NLA_POLICY_IPV6_ADDR \ 396 {.type = NLA_EXACT_LEN, .len = QDF_IPV6_ADDR_SIZE} 397 #endif /*End of (LINUX_VERSION_CODE <= KERNEL_VERSION(4, 20, 0) */ 398 399 #if defined(NBUF_MEMORY_DEBUG) && defined(NETLINK_BUF_TRACK) 400 #define wlan_cfg80211_vendor_free_skb(skb) \ 401 qdf_nbuf_free(skb) 402 403 #define wlan_cfg80211_vendor_event(skb, gfp) \ 404 { \ 405 qdf_nbuf_count_dec(skb); \ 406 qdf_net_buf_debug_release_skb(skb); \ 407 cfg80211_vendor_event(skb, gfp); \ 408 } 409 410 #define wlan_cfg80211_vendor_cmd_reply(skb) \ 411 { \ 412 qdf_nbuf_count_dec(skb); \ 413 qdf_net_buf_debug_release_skb(skb); \ 414 cfg80211_vendor_cmd_reply(skb); \ 415 } 416 wlan_cfg80211_qal_devcfg_send_response(qdf_nbuf_t skb)417 static inline QDF_STATUS wlan_cfg80211_qal_devcfg_send_response(qdf_nbuf_t skb) 418 { 419 qdf_nbuf_count_dec(skb); 420 qdf_net_buf_debug_release_skb(skb); 421 return qal_devcfg_send_response(skb); 422 } 423 424 static inline struct sk_buff * __cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy * wiphy,int len,const char * func,uint32_t line)425 __cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int len, 426 const char *func, uint32_t line) 427 { 428 struct sk_buff *skb; 429 430 skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len); 431 if (skb) { 432 qdf_nbuf_count_inc(skb); 433 qdf_net_buf_debug_acquire_skb(skb, func, line); 434 } 435 return skb; 436 } 437 #define wlan_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \ 438 __cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len, __func__, __LINE__) 439 440 static inline struct sk_buff * __cfg80211_vendor_event_alloc(struct wiphy * wiphy,struct wireless_dev * wdev,int approxlen,int event_idx,gfp_t gfp,const char * func,uint32_t line)441 __cfg80211_vendor_event_alloc(struct wiphy *wiphy, 442 struct wireless_dev *wdev, 443 int approxlen, 444 int event_idx, 445 gfp_t gfp, 446 const char *func, 447 uint32_t line) 448 { 449 struct sk_buff *skb; 450 451 skb = cfg80211_vendor_event_alloc(wiphy, wdev, 452 approxlen, 453 event_idx, 454 gfp); 455 if (skb) { 456 qdf_nbuf_count_inc(skb); 457 qdf_net_buf_debug_acquire_skb(skb, func, line); 458 } 459 return skb; 460 } 461 #define wlan_cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp) \ 462 __cfg80211_vendor_event_alloc(wiphy, wdev, len, \ 463 idx, gfp, \ 464 __func__, __LINE__) 465 #else /* NBUF_MEMORY_DEBUG && NETLINK_BUF_TRACK */ 466 #define wlan_cfg80211_vendor_free_skb(skb) \ 467 kfree_skb(skb) 468 469 #define wlan_cfg80211_vendor_event(skb, gfp) \ 470 cfg80211_vendor_event(skb, gfp) 471 472 #define wlan_cfg80211_vendor_cmd_reply(skb) \ 473 cfg80211_vendor_cmd_reply(skb) 474 475 #define wlan_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \ 476 cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) 477 478 #define wlan_cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp) \ 479 cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp) 480 wlan_cfg80211_qal_devcfg_send_response(qdf_nbuf_t skb)481 static inline QDF_STATUS wlan_cfg80211_qal_devcfg_send_response( qdf_nbuf_t skb) 482 { 483 return qal_devcfg_send_response(skb); 484 } 485 #endif /* NBUF_MEMORY_DEBUG && NETLINK_BUF_TRACK */ 486 487 #undef nla_parse 488 #undef nla_parse_nested 489 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) wlan_cfg80211_nla_parse(struct nlattr ** tb,int maxtype,const struct nlattr * head,int len,const struct nla_policy * policy)490 static inline int wlan_cfg80211_nla_parse(struct nlattr **tb, 491 int maxtype, 492 const struct nlattr *head, 493 int len, 494 const struct nla_policy *policy) 495 { 496 return nla_parse(tb, maxtype, head, len, policy); 497 } 498 499 static inline int wlan_cfg80211_nla_parse_nested(struct nlattr * tb[],int maxtype,const struct nlattr * nla,const struct nla_policy * policy)500 wlan_cfg80211_nla_parse_nested(struct nlattr *tb[], 501 int maxtype, 502 const struct nlattr *nla, 503 const struct nla_policy *policy) 504 { 505 return nla_parse_nested(tb, maxtype, nla, policy); 506 } 507 #else wlan_cfg80211_nla_parse(struct nlattr ** tb,int maxtype,const struct nlattr * head,int len,const struct nla_policy * policy)508 static inline int wlan_cfg80211_nla_parse(struct nlattr **tb, 509 int maxtype, 510 const struct nlattr *head, 511 int len, 512 const struct nla_policy *policy) 513 { 514 return nla_parse(tb, maxtype, head, len, policy, NULL); 515 } 516 517 static inline int wlan_cfg80211_nla_parse_nested(struct nlattr * tb[],int maxtype,const struct nlattr * nla,const struct nla_policy * policy)518 wlan_cfg80211_nla_parse_nested(struct nlattr *tb[], 519 int maxtype, 520 const struct nlattr *nla, 521 const struct nla_policy *policy) 522 { 523 return nla_parse_nested(tb, maxtype, nla, policy, NULL); 524 } 525 #endif 526 #define nla_parse(...) (obsolete, use wlan_cfg80211_nla_parse) 527 #define nla_parse_nested(...) (obsolete, use wlan_cfg80211_nla_parse_nested) 528 529 /** 530 * wlan_cfg80211_nla_put_u64() - Add u64 attribute to an skb and align it 531 * @skb: SKB to add attribute(s) to 532 * @attrtype: u64 attribute id 533 * @value: u64 attribute value 534 * 535 * This function adds a u64 attribute, and optionally a pad attribute, to the 536 * skb. If this function adds a pad attribute, that pad attribute is defined 537 * in enum qca_wlan_vendor_attr, so only 64-bit attributes that are defined 538 * in enum qca_wlan_vendor_attr should use this interface. For other u64 539 * attributes, use function wlan_cfg80211_nla_put_u64_64bit() since that 540 * allows the pad attribute to be specified. 541 * 542 * Return: 0 if u64 attribute and optional pad attribute added to skb, 543 * negative errno if operation fails 544 */ 545 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)) 546 static inline int wlan_cfg80211_nla_put_u64(struct sk_buff * skb,int attrtype,u64 value)547 wlan_cfg80211_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value) 548 { 549 return nla_put_u64(skb, attrtype, value); 550 } 551 #else 552 static inline int wlan_cfg80211_nla_put_u64(struct sk_buff * skb,int attrtype,u64 value)553 wlan_cfg80211_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value) 554 { 555 return nla_put_u64_64bit(skb, attrtype, value, NL80211_ATTR_PAD); 556 } 557 #endif 558 559 /** 560 * wlan_cfg80211_nla_put_u64_64bit() - Add u64 attribute to an skb and align it 561 * @skb: SKB to add attribute(s) to 562 * @attrtype: u64 attribute id 563 * @value: u64 attribute value 564 * @padattr: padding attribute id 565 * 566 * This function adds a u64 attribute, and optionally a pad attribute, 567 * to the skb. Unlike wlan_cfg80211_nla_put_u64() which can only be 568 * used with attributes defined in enum qca_wlan_vendor_attr, this 569 * function can be used with attributes defined in any enum, provided 570 * that the enum also defines a pad attribute. 571 * 572 * Return: 0 if u64 attribute and optional pad attribute added to skb, 573 * negative errno if operation fails 574 */ 575 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)) 576 static inline int wlan_cfg80211_nla_put_u64_64bit(struct sk_buff * skb,int attrtype,u64 value,int padattr)577 wlan_cfg80211_nla_put_u64_64bit(struct sk_buff *skb, int attrtype, 578 u64 value, int padattr) 579 { 580 return nla_put_u64(skb, attrtype, value); 581 } 582 #else 583 static inline int wlan_cfg80211_nla_put_u64_64bit(struct sk_buff * skb,int attrtype,u64 value,int padattr)584 wlan_cfg80211_nla_put_u64_64bit(struct sk_buff *skb, int attrtype, 585 u64 value, int padattr) 586 { 587 return nla_put_u64_64bit(skb, attrtype, value, padattr); 588 } 589 #endif 590 591 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0)) 592 static inline ssize_t wlan_cfg80211_nla_strscpy(char * dst,const struct nlattr * nla,size_t dstsize)593 wlan_cfg80211_nla_strscpy(char *dst, const struct nlattr *nla, size_t dstsize) 594 { 595 return nla_strlcpy(dst, nla, dstsize); 596 } 597 #else 598 static inline ssize_t wlan_cfg80211_nla_strscpy(char * dst,const struct nlattr * nla,size_t dstsize)599 wlan_cfg80211_nla_strscpy(char *dst, const struct nlattr *nla, size_t dstsize) 600 { 601 return nla_strscpy(dst, nla, dstsize); 602 } 603 #endif 604 605 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) || \ 606 (defined CFG80211_CHANGE_NETDEV_REGISTRATION_SEMANTICS)) wlan_cfg80211_register_netdevice(struct net_device * dev)607 static inline int wlan_cfg80211_register_netdevice(struct net_device *dev) 608 { 609 return cfg80211_register_netdevice(dev); 610 } 611 #else wlan_cfg80211_register_netdevice(struct net_device * dev)612 static inline int wlan_cfg80211_register_netdevice(struct net_device *dev) 613 { 614 return register_netdevice(dev); 615 } 616 #endif 617 618 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) || \ 619 (defined CFG80211_CHANGE_NETDEV_REGISTRATION_SEMANTICS)) wlan_cfg80211_unregister_netdevice(struct net_device * dev)620 static inline void wlan_cfg80211_unregister_netdevice(struct net_device *dev) 621 { 622 cfg80211_unregister_netdevice(dev); 623 } 624 #else wlan_cfg80211_unregister_netdevice(struct net_device * dev)625 static inline void wlan_cfg80211_unregister_netdevice(struct net_device *dev) 626 { 627 unregister_netdevice(dev); 628 } 629 #endif 630 631 #ifdef CFG80211_SINGLE_NETDEV_MULTI_LINK_SUPPORT 632 #if defined(CFG80211_RU_PUNCT_NOTIFY) || \ 633 defined(CFG80211_PUNCTURING_SINGLE_NETDEV_API) 634 static inline wlan_cfg80211_ch_switch_notify(struct net_device * dev,struct cfg80211_chan_def * chandef,unsigned int link_id,uint16_t puncture_bitmap)635 void wlan_cfg80211_ch_switch_notify(struct net_device *dev, 636 struct cfg80211_chan_def *chandef, 637 unsigned int link_id, 638 uint16_t puncture_bitmap) 639 { 640 cfg80211_ch_switch_notify(dev, chandef, link_id, 641 puncture_bitmap); 642 } 643 #else 644 static inline wlan_cfg80211_ch_switch_notify(struct net_device * dev,struct cfg80211_chan_def * chandef,unsigned int link_id,uint16_t puncture_bitmap)645 void wlan_cfg80211_ch_switch_notify(struct net_device *dev, 646 struct cfg80211_chan_def *chandef, 647 unsigned int link_id, 648 uint16_t puncture_bitmap) 649 { 650 cfg80211_ch_switch_notify(dev, chandef, link_id); 651 } 652 #endif 653 #else 654 static inline wlan_cfg80211_ch_switch_notify(struct net_device * dev,struct cfg80211_chan_def * chandef,unsigned int link_id,uint16_t puncture_bitmap)655 void wlan_cfg80211_ch_switch_notify(struct net_device *dev, 656 struct cfg80211_chan_def *chandef, 657 unsigned int link_id, 658 uint16_t puncture_bitmap) 659 { 660 cfg80211_ch_switch_notify(dev, chandef); 661 } 662 #endif 663 664 #endif 665