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