xref: /wlan-dirver/qca-wifi-host-cmn/os_if/linux/wlan_cfg80211.h (revision 3b7d2086205cc4b82a36a180614a8914e54e8fed)
1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 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  */
189 
190 enum qca_nl80211_vendor_subcmds_index {
191 	QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX = 0,
192 
193 	QCA_NL80211_VENDOR_SUBCMD_NAN_INDEX,
194 
195 #ifdef WLAN_FEATURE_STATS_EXT
196 	QCA_NL80211_VENDOR_SUBCMD_STATS_EXT_INDEX,
197 #endif /* WLAN_FEATURE_STATS_EXT */
198 
199 #ifdef FEATURE_WLAN_EXTSCAN
200 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_START_INDEX,
201 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_STOP_INDEX,
202 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CAPABILITIES_INDEX,
203 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CACHED_RESULTS_INDEX,
204 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_RESULTS_AVAILABLE_INDEX,
205 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_FULL_SCAN_RESULT_INDEX,
206 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_EVENT_INDEX,
207 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_FOUND_INDEX,
208 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_BSSID_HOTLIST_INDEX,
209 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_BSSID_HOTLIST_INDEX,
210 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SIGNIFICANT_CHANGE_INDEX,
211 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SIGNIFICANT_CHANGE_INDEX,
212 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SIGNIFICANT_CHANGE_INDEX,
213 #endif /* FEATURE_WLAN_EXTSCAN */
214 
215 #ifdef WLAN_FEATURE_LINK_LAYER_STATS
216 	QCA_NL80211_VENDOR_SUBCMD_LL_STATS_SET_INDEX,
217 	QCA_NL80211_VENDOR_SUBCMD_LL_STATS_GET_INDEX,
218 	QCA_NL80211_VENDOR_SUBCMD_LL_STATS_CLR_INDEX,
219 	QCA_NL80211_VENDOR_SUBCMD_LL_RADIO_STATS_INDEX,
220 	QCA_NL80211_VENDOR_SUBCMD_LL_IFACE_STATS_INDEX,
221 	QCA_NL80211_VENDOR_SUBCMD_LL_PEER_INFO_STATS_INDEX,
222 	QCA_NL80211_VENDOR_SUBCMD_LL_STATS_EXT_INDEX,
223 #endif /* WLAN_FEATURE_LINK_LAYER_STATS */
224 
225 	QCA_NL80211_VENDOR_SUBCMD_TDLS_STATE_CHANGE_INDEX,
226 	QCA_NL80211_VENDOR_SUBCMD_DO_ACS_INDEX,
227 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
228 	QCA_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH_INDEX,
229 #endif
230 	/* DFS */
231 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_STARTED_INDEX,
232 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_FINISHED_INDEX,
233 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_ABORTED_INDEX,
234 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_NOP_FINISHED_INDEX,
235 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_RADAR_DETECTED_INDEX,
236 #ifdef FEATURE_WLAN_EXTSCAN
237 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_LOST_INDEX,
238 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_NETWORK_FOUND_INDEX,
239 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_PASSPOINT_NETWORK_FOUND_INDEX,
240 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST_INDEX,
241 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST_INDEX,
242 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX,
243 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX,
244 #endif /* FEATURE_WLAN_EXTSCAN */
245 	QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_CONFIGURATION_INDEX,
246 	QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX,
247 #ifdef WLAN_FEATURE_MEMDUMP
248 	QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP_INDEX,
249 #endif /* WLAN_FEATURE_MEMDUMP */
250 	/* OCB events */
251 	QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT_INDEX,
252 	QCA_NL80211_VENDOR_SUBCMD_SCAN_INDEX,
253 	QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE_INDEX,
254 	QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG_INDEX,
255 	QCA_NL80211_VENDOR_SUBCMD_INTEROP_ISSUES_AP_INDEX,
256 #ifdef WLAN_FEATURE_TSF
257 	QCA_NL80211_VENDOR_SUBCMD_TSF_INDEX,
258 #endif
259 	QCA_NL80211_VENDOR_SUBCMD_NDP_INDEX,
260 	QCA_NL80211_VENDOR_SUBCMD_P2P_LO_EVENT_INDEX,
261 	QCA_NL80211_VENDOR_SUBCMD_SAP_CONDITIONAL_CHAN_SWITCH_INDEX,
262 	QCA_NL80211_VENDOR_SUBCMD_UPDATE_EXTERNAL_ACS_CONFIG,
263 	QCA_NL80211_VENDOR_SUBCMD_PWR_SAVE_FAIL_DETECTED_INDEX,
264 	QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_GET_INDEX,
265 	QCA_NL80211_VENDOR_SUBCMD_HANG_REASON_INDEX,
266 	QCA_NL80211_VENDOR_SUBCMD_WLAN_MAC_INFO_INDEX,
267 	QCA_NL80211_VENDOR_SUBCMD_NAN_EXT_INDEX,
268 	QCA_NL80211_VENDOR_SUBCMD_THROUGHPUT_CHANGE_EVENT_INDEX,
269 	QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES_INDEX,
270 	QCA_NL80211_VENDOR_SUBCMD_PEER_STATS_CACHE_FLUSH_INDEX,
271 	QCA_NL80211_VENDOR_SUBCMD_BEACON_REPORTING_INDEX,
272 	QCA_NL80211_VENDOR_SUBCMD_ROAM_INDEX,
273 	QCA_NL80211_VENDOR_SUBCMD_OEM_DATA_INDEX,
274 	QCA_NL80211_VENDOR_SUBCMD_REQUEST_SAR_LIMITS_INDEX,
275 	QCA_NL80211_VENDOR_SUBCMD_UPDATE_STA_INFO_INDEX,
276 	QCA_NL80211_VENDOR_SUBCMD_MEDIUM_ASSESS_INDEX,
277 	QCA_NL80211_VENDOR_SUBCMD_UPDATE_SSID_INDEX,
278 	QCA_NL80211_VENDOR_SUBCMD_WIFI_FW_STATS_INDEX,
279 	QCA_NL80211_VENDOR_SUBCMD_MBSSID_TX_VDEV_STATUS_INDEX,
280 	QCA_NL80211_VENDOR_SUBCMD_THERMAL_INDEX,
281 	QCA_NL80211_VENDOR_SUBCMD_DRIVER_DISCONNECT_REASON_INDEX,
282 #ifdef WLAN_SUPPORT_TWT
283 	QCA_NL80211_VENDOR_SUBCMD_CONFIG_TWT_INDEX,
284 #endif
285 #ifdef WLAN_CFR_ENABLE
286 	QCA_NL80211_VENDOR_SUBCMD_PEER_CFR_CAPTURE_CFG_INDEX,
287 #endif
288 #ifdef WLAN_FEATURE_CONNECTIVITY_LOGGING
289 	QCA_NL80211_VENDOR_SUBCMD_DIAG_EVENT_INDEX,
290 #endif
291 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
292 	QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS_INDEX,
293 #endif
294 	QCA_NL80211_VENDOR_SUBCMD_MCC_QUOTA_INDEX,
295 	QCA_NL80211_VENDOR_SUBCMD_PEER_FLUSH_PENDING_INDEX,
296 	QCA_NL80211_VENDOR_SUBCMD_DRIVER_READY_INDEX,
297 	QCA_NL80211_VENDOR_SUBCMD_PASN_AUTH_STATUS_INDEX,
298 	QCA_NL80211_VENDOR_SUBCMD_SCS_RULE_CONFIG_INDEX,
299 #ifdef WLAN_FEATURE_SR
300 	QCA_NL80211_VENDOR_SUBCMD_SR_INDEX,
301 #endif
302 	QCA_NL80211_VENDOR_SUBCMD_MLO_PEER_PRIM_NETDEV_EVENT_INDEX,
303 #ifdef CONFIG_AFC_SUPPORT
304 	QCA_NL80211_VENDOR_SUBCMD_AFC_EVENT_INDEX,
305 #endif
306 #ifdef WLAN_SUPPORT_GAP_LL_PS_MODE
307 	QCA_NL80211_VENDOR_SUBCMD_DOZED_AP_INDEX,
308 #endif
309 #ifdef WLAN_FEATURE_ROAM_INFO_STATS
310 	QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS_INDEX,
311 #endif
312 	QCA_NL80211_VENDOR_SUBCMD_CONNECTED_CHANNEL_STATS_INDEX,
313 #ifdef WLAN_FEATURE_11BE_MLO
314 	QCA_NL80211_VENDOR_SUBCMD_TID_TO_LINK_MAP_INDEX,
315 #ifdef CONN_MGR_ADV_FEATURE
316 	QCA_NL80211_VENDOR_SUBCMD_LINK_RECONFIG_INDEX,
317 #endif
318 #endif
319 	QCA_NL80211_VENDOR_SUBCMD_AUDIO_TRANSPORT_SWITCH_INDEX,
320 #ifdef WLAN_FEATURE_TX_LATENCY_STATS
321 	QCA_NL80211_VENDOR_SUBCMD_TX_LATENCY_INDEX,
322 #endif
323 };
324 
325 #if !defined(SUPPORT_WDEV_CFG80211_VENDOR_EVENT_ALLOC) && \
326 	(LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) && \
327 	!defined(WITH_BACKPORTS)
328 
329 static inline struct sk_buff *
330 backported_cfg80211_vendor_event_alloc(struct wiphy *wiphy,
331 				       struct wireless_dev *wdev,
332 				       int approxlen,
333 				       int event_idx, gfp_t gfp)
334 {
335 	struct sk_buff *skb;
336 
337 	skb = cfg80211_vendor_event_alloc(wiphy, approxlen, event_idx, gfp);
338 
339 	if (skb && wdev) {
340 		struct nlattr *attr;
341 		u32 ifindex = wdev->netdev->ifindex;
342 
343 		nla_nest_cancel(skb, ((void **)skb->cb)[2]);
344 		if (nla_put_u32(skb, NL80211_ATTR_IFINDEX, ifindex))
345 			goto nla_fail;
346 
347 		attr = nla_nest_start(skb, NL80211_ATTR_VENDOR_DATA);
348 		((void **)skb->cb)[2] = attr;
349 	}
350 
351 	return skb;
352 
353 nla_fail:
354 	kfree_skb(skb);
355 
356 	return NULL;
357 }
358 
359 #define cfg80211_vendor_event_alloc backported_cfg80211_vendor_event_alloc
360 #endif
361 
362 /* For kernel version >= 5.2, driver needs to provide policy */
363 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0))
364 #define vendor_command_policy(__policy, __maxattr) \
365 	.policy = __policy,                        \
366 	.maxattr = __maxattr
367 #define VENDOR_NLA_POLICY_NESTED(__policy) \
368 	NLA_POLICY_NESTED(__policy)
369 #define VENDOR_NLA_POLICY_NESTED_ARRAY(__policy) \
370 	NLA_POLICY_NESTED_ARRAY(__policy)
371 #else
372 #define vendor_command_policy(__policy, __maxattr)
373 #define VENDOR_NLA_POLICY_NESTED(__policy) {.type = NLA_NESTED}
374 #define VENDOR_NLA_POLICY_NESTED_ARRAY(__policy) \
375 	VENDOR_NLA_POLICY_NESTED(__policy)
376 #endif /*End of (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) */
377 
378 /* For kernel version <= 4.20, driver needs to provide policy */
379 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0))
380 #define VENDOR_NLA_POLICY_MAC_ADDR NLA_POLICY_ETH_ADDR
381 #define VENDOR_NLA_POLICY_IPV4_ADDR NLA_POLICY_EXACT_LEN(QDF_IPV4_ADDR_SIZE)
382 #define VENDOR_NLA_POLICY_IPV6_ADDR NLA_POLICY_EXACT_LEN(QDF_IPV6_ADDR_SIZE)
383 #else
384 #define VENDOR_NLA_POLICY_MAC_ADDR \
385 	{.type = NLA_UNSPEC, .len = QDF_MAC_ADDR_SIZE}
386 #define NLA_EXACT_LEN NLA_UNSPEC
387 #define VENDOR_NLA_POLICY_IPV4_ADDR \
388 	{.type = NLA_EXACT_LEN, .len = QDF_IPV4_ADDR_SIZE}
389 #define VENDOR_NLA_POLICY_IPV6_ADDR \
390 	{.type = NLA_EXACT_LEN, .len = QDF_IPV6_ADDR_SIZE}
391 #endif /*End of (LINUX_VERSION_CODE <= KERNEL_VERSION(4, 20, 0) */
392 
393 #if defined(NBUF_MEMORY_DEBUG) && defined(NETLINK_BUF_TRACK)
394 #define wlan_cfg80211_vendor_free_skb(skb) \
395 	qdf_nbuf_free(skb)
396 
397 #define wlan_cfg80211_vendor_event(skb, gfp) \
398 { \
399 	qdf_nbuf_count_dec(skb); \
400 	qdf_net_buf_debug_release_skb(skb); \
401 	cfg80211_vendor_event(skb, gfp); \
402 }
403 
404 #define wlan_cfg80211_vendor_cmd_reply(skb) \
405 { \
406 	qdf_nbuf_count_dec(skb); \
407 	qdf_net_buf_debug_release_skb(skb); \
408 	cfg80211_vendor_cmd_reply(skb); \
409 }
410 
411 static inline QDF_STATUS wlan_cfg80211_qal_devcfg_send_response(qdf_nbuf_t skb)
412 {
413 	qdf_nbuf_count_dec(skb);
414 	qdf_net_buf_debug_release_skb(skb);
415 	return qal_devcfg_send_response(skb);
416 }
417 
418 static inline struct sk_buff *
419 __cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int len,
420 				      const char *func, uint32_t line)
421 {
422 	struct sk_buff *skb;
423 
424 	skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len);
425 	if (skb) {
426 		qdf_nbuf_count_inc(skb);
427 		qdf_net_buf_debug_acquire_skb(skb, func, line);
428 	}
429 	return skb;
430 }
431 #define wlan_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \
432 	__cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len, __func__, __LINE__)
433 
434 static inline struct sk_buff *
435 __cfg80211_vendor_event_alloc(struct wiphy *wiphy,
436 			      struct wireless_dev *wdev,
437 			      int approxlen,
438 			      int event_idx,
439 			      gfp_t gfp,
440 			      const char *func,
441 			      uint32_t line)
442 {
443 	struct sk_buff *skb;
444 
445 	skb = cfg80211_vendor_event_alloc(wiphy, wdev,
446 					  approxlen,
447 					  event_idx,
448 					  gfp);
449 	if (skb) {
450 		qdf_nbuf_count_inc(skb);
451 		qdf_net_buf_debug_acquire_skb(skb, func, line);
452 	}
453 	return skb;
454 }
455 #define wlan_cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp) \
456 	__cfg80211_vendor_event_alloc(wiphy, wdev, len, \
457 				      idx, gfp, \
458 				      __func__, __LINE__)
459 #else /* NBUF_MEMORY_DEBUG && NETLINK_BUF_TRACK */
460 #define wlan_cfg80211_vendor_free_skb(skb) \
461 	kfree_skb(skb)
462 
463 #define wlan_cfg80211_vendor_event(skb, gfp) \
464 	cfg80211_vendor_event(skb, gfp)
465 
466 #define wlan_cfg80211_vendor_cmd_reply(skb) \
467 	cfg80211_vendor_cmd_reply(skb)
468 
469 #define wlan_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \
470 	cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len)
471 
472 #define wlan_cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp) \
473 	cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp)
474 
475 static inline QDF_STATUS wlan_cfg80211_qal_devcfg_send_response( qdf_nbuf_t skb)
476 {
477 	return qal_devcfg_send_response(skb);
478 }
479 #endif /* NBUF_MEMORY_DEBUG && NETLINK_BUF_TRACK */
480 
481 #undef nla_parse
482 #undef nla_parse_nested
483 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
484 static inline int wlan_cfg80211_nla_parse(struct nlattr **tb,
485 					  int maxtype,
486 					  const struct nlattr *head,
487 					  int len,
488 					  const struct nla_policy *policy)
489 {
490 	return nla_parse(tb, maxtype, head, len, policy);
491 }
492 
493 static inline int
494 wlan_cfg80211_nla_parse_nested(struct nlattr *tb[],
495 			       int maxtype,
496 			       const struct nlattr *nla,
497 			       const struct nla_policy *policy)
498 {
499 	return nla_parse_nested(tb, maxtype, nla, policy);
500 }
501 #else
502 static inline int wlan_cfg80211_nla_parse(struct nlattr **tb,
503 					  int maxtype,
504 					  const struct nlattr *head,
505 					  int len,
506 					  const struct nla_policy *policy)
507 {
508 	return nla_parse(tb, maxtype, head, len, policy, NULL);
509 }
510 
511 static inline int
512 wlan_cfg80211_nla_parse_nested(struct nlattr *tb[],
513 			       int maxtype,
514 			       const struct nlattr *nla,
515 			       const struct nla_policy *policy)
516 {
517 	return nla_parse_nested(tb, maxtype, nla, policy, NULL);
518 }
519 #endif
520 #define nla_parse(...) (obsolete, use wlan_cfg80211_nla_parse)
521 #define nla_parse_nested(...) (obsolete, use wlan_cfg80211_nla_parse_nested)
522 
523 /**
524  * wlan_cfg80211_nla_put_u64() - Add u64 attribute to an skb and align it
525  * @skb: SKB to add attribute(s) to
526  * @attrtype: u64 attribute id
527  * @value: u64 attribute value
528  *
529  * This function adds a u64 attribute, and optionally a pad attribute, to the
530  * skb. If this function adds a pad attribute, that pad attribute is defined
531  * in enum qca_wlan_vendor_attr, so only 64-bit attributes that are defined
532  * in enum qca_wlan_vendor_attr should use this interface. For other u64
533  * attributes, use function wlan_cfg80211_nla_put_u64_64bit() since that
534  * allows the pad attribute to be specified.
535  *
536  * Return: 0 if u64 attribute and optional pad attribute added to skb,
537  *         negative errno if operation fails
538  */
539 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0))
540 static inline int
541 wlan_cfg80211_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value)
542 {
543 	return nla_put_u64(skb, attrtype, value);
544 }
545 #else
546 static inline int
547 wlan_cfg80211_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value)
548 {
549 	return nla_put_u64_64bit(skb, attrtype, value, NL80211_ATTR_PAD);
550 }
551 #endif
552 
553 /**
554  * wlan_cfg80211_nla_put_u64_64bit() - Add u64 attribute to an skb and align it
555  * @skb: SKB to add attribute(s) to
556  * @attrtype: u64 attribute id
557  * @value: u64 attribute value
558  * @padattr: padding attribute id
559  *
560  * This function adds a u64 attribute, and optionally a pad attribute,
561  * to the skb. Unlike wlan_cfg80211_nla_put_u64() which can only be
562  * used with attributes defined in enum qca_wlan_vendor_attr, this
563  * function can be used with attributes defined in any enum, provided
564  * that the enum also defines a pad attribute.
565  *
566  * Return: 0 if u64 attribute and optional pad attribute added to skb,
567  *         negative errno if operation fails
568  */
569 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0))
570 static inline int
571 wlan_cfg80211_nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
572 				u64 value, int padattr)
573 {
574 	return nla_put_u64(skb, attrtype, value);
575 }
576 #else
577 static inline int
578 wlan_cfg80211_nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
579 				u64 value, int padattr)
580 {
581 	return nla_put_u64_64bit(skb, attrtype, value, padattr);
582 }
583 #endif
584 
585 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0))
586 static inline ssize_t
587 wlan_cfg80211_nla_strscpy(char *dst, const struct nlattr *nla, size_t dstsize)
588 {
589 	return nla_strlcpy(dst, nla, dstsize);
590 }
591 #else
592 static inline ssize_t
593 wlan_cfg80211_nla_strscpy(char *dst, const struct nlattr *nla, size_t dstsize)
594 {
595 	return nla_strscpy(dst, nla, dstsize);
596 }
597 #endif
598 
599 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) || \
600 	(defined CFG80211_CHANGE_NETDEV_REGISTRATION_SEMANTICS))
601 static inline int wlan_cfg80211_register_netdevice(struct net_device *dev)
602 {
603 	return cfg80211_register_netdevice(dev);
604 }
605 #else
606 static inline int wlan_cfg80211_register_netdevice(struct net_device *dev)
607 {
608 	return register_netdevice(dev);
609 }
610 #endif
611 
612 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) || \
613 	(defined CFG80211_CHANGE_NETDEV_REGISTRATION_SEMANTICS))
614 static inline void wlan_cfg80211_unregister_netdevice(struct net_device *dev)
615 {
616 	cfg80211_unregister_netdevice(dev);
617 }
618 #else
619 static inline void wlan_cfg80211_unregister_netdevice(struct net_device *dev)
620 {
621 	unregister_netdevice(dev);
622 }
623 #endif
624 
625 #ifdef CFG80211_SINGLE_NETDEV_MULTI_LINK_SUPPORT
626 #if defined(CFG80211_RU_PUNCT_NOTIFY) || \
627 	defined(CFG80211_PUNCTURING_SINGLE_NETDEV_API)
628 static inline
629 void wlan_cfg80211_ch_switch_notify(struct net_device *dev,
630 				    struct cfg80211_chan_def *chandef,
631 				    unsigned int link_id,
632 				    uint16_t puncture_bitmap)
633 {
634 	cfg80211_ch_switch_notify(dev, chandef, link_id,
635 				  puncture_bitmap);
636 }
637 #else
638 static inline
639 void wlan_cfg80211_ch_switch_notify(struct net_device *dev,
640 				    struct cfg80211_chan_def *chandef,
641 				    unsigned int link_id,
642 				    uint16_t puncture_bitmap)
643 {
644 	cfg80211_ch_switch_notify(dev, chandef, link_id);
645 }
646 #endif
647 #else
648 static inline
649 void wlan_cfg80211_ch_switch_notify(struct net_device *dev,
650 				    struct cfg80211_chan_def *chandef,
651 				    unsigned int link_id,
652 				    uint16_t puncture_bitmap)
653 {
654 	cfg80211_ch_switch_notify(dev, chandef);
655 }
656 #endif
657 
658 #endif
659