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