1*5113495bSYour Name /*
2*5113495bSYour Name * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name *
5*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name * above copyright notice and this permission notice appear in all
8*5113495bSYour Name * copies.
9*5113495bSYour Name *
10*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name */
19*5113495bSYour Name
20*5113495bSYour Name /**
21*5113495bSYour Name * DOC: wlan_hdd_scan.h
22*5113495bSYour Name *
23*5113495bSYour Name * WLAN Host Device Driver scan related implementation
24*5113495bSYour Name *
25*5113495bSYour Name */
26*5113495bSYour Name
27*5113495bSYour Name #if !defined(WLAN_HDD_SCAN_H)
28*5113495bSYour Name #define WLAN_HDD_SCAN_H
29*5113495bSYour Name
30*5113495bSYour Name #include "wlan_hdd_main.h"
31*5113495bSYour Name #include "csr_inside_api.h"
32*5113495bSYour Name #include <wlan_cfg80211_scan.h>
33*5113495bSYour Name #include "qca_vendor.h"
34*5113495bSYour Name
35*5113495bSYour Name extern const struct nla_policy scan_policy[
36*5113495bSYour Name QCA_WLAN_VENDOR_ATTR_SCAN_MAX + 1];
37*5113495bSYour Name
38*5113495bSYour Name #define FEATURE_TRIGGER_SCAN_VENDOR_COMMANDS \
39*5113495bSYour Name { \
40*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
41*5113495bSYour Name .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_TRIGGER_SCAN, \
42*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
43*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | \
44*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_RUNNING, \
45*5113495bSYour Name .doit = wlan_hdd_cfg80211_vendor_scan, \
46*5113495bSYour Name vendor_command_policy(scan_policy, \
47*5113495bSYour Name QCA_WLAN_VENDOR_ATTR_SCAN_MAX) \
48*5113495bSYour Name },
49*5113495bSYour Name
50*5113495bSYour Name #define EXTSCAN_PARAM_MAX QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX
51*5113495bSYour Name
52*5113495bSYour Name int hdd_scan_context_init(struct hdd_context *hdd_ctx);
53*5113495bSYour Name void hdd_scan_context_destroy(struct hdd_context *hdd_ctx);
54*5113495bSYour Name
55*5113495bSYour Name int wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
56*5113495bSYour Name struct cfg80211_scan_request *request);
57*5113495bSYour Name
58*5113495bSYour Name #ifdef FEATURE_WLAN_SCAN_PNO
59*5113495bSYour Name int wlan_hdd_cfg80211_sched_scan_start(struct wiphy *wiphy,
60*5113495bSYour Name struct net_device *dev,
61*5113495bSYour Name struct cfg80211_sched_scan_request
62*5113495bSYour Name *request);
63*5113495bSYour Name
64*5113495bSYour Name #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
65*5113495bSYour Name /**
66*5113495bSYour Name * wlan_hdd_cfg80211_sched_scan_stop() - stop cfg80211 scheduled (PNO) scan
67*5113495bSYour Name * @wiphy: Pointer to wiphy
68*5113495bSYour Name * @dev: Pointer network device
69*5113495bSYour Name *
70*5113495bSYour Name * Note, this returns success if the driver is recovering or unloading to
71*5113495bSYour Name * prevent race conditions between PLD initiating an unload and kernel
72*5113495bSYour Name * initiating a scheduled scan stop via cfg80211. Unload is expected to stop
73*5113495bSYour Name * any pending scheduled scans in this case.
74*5113495bSYour Name *
75*5113495bSYour Name * Return: 0 for success, non zero for failure
76*5113495bSYour Name */
77*5113495bSYour Name int wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy,
78*5113495bSYour Name struct net_device *dev);
79*5113495bSYour Name #else
80*5113495bSYour Name int wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy,
81*5113495bSYour Name struct net_device *dev,
82*5113495bSYour Name uint64_t reqid);
83*5113495bSYour Name
84*5113495bSYour Name #endif /* KERNEL_VERSION(4, 12, 0) */
85*5113495bSYour Name
86*5113495bSYour Name /**
87*5113495bSYour Name * wlan_hdd_sched_scan_stop() - stop scheduled (PNO) scans
88*5113495bSYour Name * @dev: Pointer network device
89*5113495bSYour Name *
90*5113495bSYour Name * Return: 0 for success, non zero for failure
91*5113495bSYour Name */
92*5113495bSYour Name int wlan_hdd_sched_scan_stop(struct net_device *dev);
93*5113495bSYour Name #else
wlan_hdd_sched_scan_stop(struct net_device * dev)94*5113495bSYour Name static inline int wlan_hdd_sched_scan_stop(struct net_device *dev)
95*5113495bSYour Name {
96*5113495bSYour Name return 0;
97*5113495bSYour Name }
98*5113495bSYour Name #endif /* End of FEATURE_WLAN_SCAN_PNO */
99*5113495bSYour Name
100*5113495bSYour Name int wlan_hdd_cfg80211_vendor_scan(struct wiphy *wiphy,
101*5113495bSYour Name struct wireless_dev *wdev, const void *data,
102*5113495bSYour Name int data_len);
103*5113495bSYour Name
104*5113495bSYour Name /**
105*5113495bSYour Name * wlan_hdd_vendor_abort_scan() - API to process vendor command for
106*5113495bSYour Name * abort scan
107*5113495bSYour Name * @wiphy: Pointer to wiphy
108*5113495bSYour Name * @wdev: Pointer to net device
109*5113495bSYour Name * @data : Pointer to the data
110*5113495bSYour Name * @data_len : length of the data
111*5113495bSYour Name *
112*5113495bSYour Name * This is called from supplicant to abort scan
113*5113495bSYour Name *
114*5113495bSYour Name * Return: zero for success and non zero for failure.
115*5113495bSYour Name */
116*5113495bSYour Name int wlan_hdd_vendor_abort_scan(
117*5113495bSYour Name struct wiphy *wiphy, struct wireless_dev *wdev,
118*5113495bSYour Name const void *data, int data_len);
119*5113495bSYour Name
120*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)) || \
121*5113495bSYour Name defined(CFG80211_ABORT_SCAN)
122*5113495bSYour Name void wlan_hdd_cfg80211_abort_scan(struct wiphy *wiphy,
123*5113495bSYour Name struct wireless_dev *wdev);
124*5113495bSYour Name #endif
125*5113495bSYour Name
126*5113495bSYour Name /**
127*5113495bSYour Name * hdd_init_scan_reject_params() - init scan reject params
128*5113495bSYour Name * @hdd_ctx: hdd contxt
129*5113495bSYour Name *
130*5113495bSYour Name * Return: None
131*5113495bSYour Name */
132*5113495bSYour Name void hdd_init_scan_reject_params(struct hdd_context *hdd_ctx);
133*5113495bSYour Name
134*5113495bSYour Name /**
135*5113495bSYour Name * wlan_hdd_cfg80211_scan_block() - scan block handler
136*5113495bSYour Name * @adapter: HDD adapter to work against
137*5113495bSYour Name *
138*5113495bSYour Name * Return: none
139*5113495bSYour Name */
140*5113495bSYour Name void wlan_hdd_cfg80211_scan_block(struct hdd_adapter *adapter);
141*5113495bSYour Name
142*5113495bSYour Name #ifdef FEATURE_WLAN_EXTSCAN
143*5113495bSYour Name extern const struct nla_policy
144*5113495bSYour Name wlan_hdd_extscan_config_policy[EXTSCAN_PARAM_MAX + 1];
145*5113495bSYour Name extern const struct nla_policy
146*5113495bSYour Name wlan_hdd_pno_config_policy[QCA_WLAN_VENDOR_ATTR_PNO_MAX + 1];
147*5113495bSYour Name
148*5113495bSYour Name #define FEATURE_EXTSCAN_VENDOR_COMMANDS \
149*5113495bSYour Name { \
150*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
151*5113495bSYour Name .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_START, \
152*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
153*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
154*5113495bSYour Name .doit = wlan_hdd_cfg80211_extscan_start, \
155*5113495bSYour Name vendor_command_policy(wlan_hdd_extscan_config_policy, \
156*5113495bSYour Name EXTSCAN_PARAM_MAX) \
157*5113495bSYour Name }, \
158*5113495bSYour Name { \
159*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
160*5113495bSYour Name .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_STOP, \
161*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
162*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
163*5113495bSYour Name .doit = wlan_hdd_cfg80211_extscan_stop, \
164*5113495bSYour Name vendor_command_policy(wlan_hdd_extscan_config_policy, \
165*5113495bSYour Name EXTSCAN_PARAM_MAX) \
166*5113495bSYour Name }, \
167*5113495bSYour Name { \
168*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
169*5113495bSYour Name .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CAPABILITIES, \
170*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
171*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
172*5113495bSYour Name .doit = wlan_hdd_cfg80211_extscan_get_capabilities, \
173*5113495bSYour Name vendor_command_policy(wlan_hdd_extscan_config_policy, \
174*5113495bSYour Name EXTSCAN_PARAM_MAX) \
175*5113495bSYour Name }, \
176*5113495bSYour Name { \
177*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
178*5113495bSYour Name .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CACHED_RESULTS, \
179*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
180*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
181*5113495bSYour Name .doit = wlan_hdd_cfg80211_extscan_get_cached_results, \
182*5113495bSYour Name vendor_command_policy(wlan_hdd_extscan_config_policy, \
183*5113495bSYour Name EXTSCAN_PARAM_MAX) \
184*5113495bSYour Name }, \
185*5113495bSYour Name { \
186*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
187*5113495bSYour Name .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_BSSID_HOTLIST, \
188*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
189*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
190*5113495bSYour Name .doit = wlan_hdd_cfg80211_extscan_set_bssid_hotlist, \
191*5113495bSYour Name vendor_command_policy(wlan_hdd_extscan_config_policy, \
192*5113495bSYour Name EXTSCAN_PARAM_MAX) \
193*5113495bSYour Name }, \
194*5113495bSYour Name { \
195*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
196*5113495bSYour Name .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_BSSID_HOTLIST, \
197*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
198*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
199*5113495bSYour Name .doit = wlan_hdd_cfg80211_extscan_reset_bssid_hotlist, \
200*5113495bSYour Name vendor_command_policy(wlan_hdd_extscan_config_policy, \
201*5113495bSYour Name EXTSCAN_PARAM_MAX) \
202*5113495bSYour Name }, \
203*5113495bSYour Name { \
204*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
205*5113495bSYour Name .info.subcmd = \
206*5113495bSYour Name QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SIGNIFICANT_CHANGE, \
207*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
208*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
209*5113495bSYour Name .doit = wlan_hdd_cfg80211_extscan_set_significant_change, \
210*5113495bSYour Name vendor_command_policy(wlan_hdd_extscan_config_policy, \
211*5113495bSYour Name EXTSCAN_PARAM_MAX) \
212*5113495bSYour Name }, \
213*5113495bSYour Name { \
214*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
215*5113495bSYour Name .info.subcmd = \
216*5113495bSYour Name QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SIGNIFICANT_CHANGE, \
217*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
218*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
219*5113495bSYour Name .doit = wlan_hdd_cfg80211_extscan_reset_significant_change, \
220*5113495bSYour Name vendor_command_policy(wlan_hdd_extscan_config_policy, \
221*5113495bSYour Name EXTSCAN_PARAM_MAX) \
222*5113495bSYour Name }, \
223*5113495bSYour Name { \
224*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
225*5113495bSYour Name .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_SET_LIST, \
226*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
227*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
228*5113495bSYour Name .doit = wlan_hdd_cfg80211_set_epno_list, \
229*5113495bSYour Name vendor_command_policy(wlan_hdd_pno_config_policy, \
230*5113495bSYour Name QCA_WLAN_VENDOR_ATTR_PNO_MAX) \
231*5113495bSYour Name }, \
232*5113495bSYour Name { \
233*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
234*5113495bSYour Name .info.subcmd = \
235*5113495bSYour Name QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_SET_PASSPOINT_LIST, \
236*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
237*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
238*5113495bSYour Name .doit = wlan_hdd_cfg80211_set_passpoint_list, \
239*5113495bSYour Name vendor_command_policy(wlan_hdd_pno_config_policy, \
240*5113495bSYour Name QCA_WLAN_VENDOR_ATTR_PNO_MAX) \
241*5113495bSYour Name }, \
242*5113495bSYour Name { \
243*5113495bSYour Name .info.vendor_id = QCA_NL80211_VENDOR_ID, \
244*5113495bSYour Name .info.subcmd = \
245*5113495bSYour Name QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_RESET_PASSPOINT_LIST, \
246*5113495bSYour Name .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
247*5113495bSYour Name WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, \
248*5113495bSYour Name .doit = wlan_hdd_cfg80211_reset_passpoint_list, \
249*5113495bSYour Name vendor_command_policy(wlan_hdd_pno_config_policy, \
250*5113495bSYour Name QCA_WLAN_VENDOR_ATTR_PNO_MAX) \
251*5113495bSYour Name },
252*5113495bSYour Name #else
253*5113495bSYour Name #define FEATURE_EXTSCAN_VENDOR_COMMANDS
254*5113495bSYour Name #endif /* FEATURE_WLAN_EXTSCAN */
255*5113495bSYour Name
256*5113495bSYour Name #endif /* end #if !defined(WLAN_HDD_SCAN_H) */
257*5113495bSYour Name
258