xref: /OK3568_Linux_fs/external/rkwifibt/drivers/infineon/wl_cfgp2p.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Linux cfgp2p driver
3  *
4  * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation
5  *
6  * Copyright (C) 1999-2017, Broadcom Corporation
7  *
8  *      Unless you and Broadcom execute a separate written software license
9  * agreement governing use of this software, this software is licensed to you
10  * under the terms of the GNU General Public License version 2 (the "GPL"),
11  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
12  * following added to such license:
13  *
14  *      As a special exception, the copyright holders of this software give you
15  * permission to link this software with independent modules, and to copy and
16  * distribute the resulting executable under terms of your choice, provided that
17  * you also meet, for each linked independent module, the terms and conditions of
18  * the license of that module.  An independent module is a module which is not
19  * derived from this software.  The special exception does not apply to any
20  * modifications of the software.
21  *
22  *      Notwithstanding the above, under no circumstances may you combine this
23  * software in any way with any other Broadcom software provided under a license
24  * other than the GPL, without Broadcom's express prior written consent.
25  *
26  *
27  * <<Broadcom-WL-IPTag/Open:>>
28  *
29  * $Id: wl_cfgp2p.h 794110 2018-12-12 05:03:21Z $
30  */
31 #ifndef _wl_cfgp2p_h_
32 #define _wl_cfgp2p_h_
33 #include <802.11.h>
34 #include <p2p.h>
35 
36 struct bcm_cfg80211;
37 extern u32 wl_dbg_level;
38 
39 typedef struct wifi_p2p_ie wifi_wfd_ie_t;
40 /* Enumeration of the usages of the BSSCFGs used by the P2P Library.  Do not
41  * confuse this with a bsscfg index.  This value is an index into the
42  * saved_ie[] array of structures which in turn contains a bsscfg index field.
43  */
44 typedef enum {
45 	P2PAPI_BSSCFG_PRIMARY, /**< maps to driver's primary bsscfg */
46 	P2PAPI_BSSCFG_DEVICE, /**< maps to driver's P2P device discovery bsscfg */
47 	P2PAPI_BSSCFG_CONNECTION1, /**< maps to driver's P2P connection bsscfg */
48 	P2PAPI_BSSCFG_CONNECTION2,
49 	P2PAPI_BSSCFG_MAX
50 } p2p_bsscfg_type_t;
51 
52 typedef enum {
53 	P2P_SCAN_PURPOSE_MIN,
54 	P2P_SCAN_SOCIAL_CHANNEL, /**< scan for social channel */
55 	P2P_SCAN_AFX_PEER_NORMAL, /**< scan for action frame search */
56 	P2P_SCAN_AFX_PEER_REDUCED, /**< scan for action frame search with short time */
57 	P2P_SCAN_DURING_CONNECTED, /**< scan during connected status */
58 	P2P_SCAN_CONNECT_TRY, /**< scan for connecting */
59 	P2P_SCAN_NORMAL, /**< scan during not-connected status */
60 	P2P_SCAN_PURPOSE_MAX
61 } p2p_scan_purpose_t;
62 
63 /** vendor ies max buffer length for probe response or beacon */
64 #define VNDR_IES_MAX_BUF_LEN	1400
65 /** normal vendor ies buffer length */
66 #define VNDR_IES_BUF_LEN 		512
67 
68 struct p2p_bss {
69 	s32 bssidx;
70 	struct net_device *dev;
71 	void *private_data;
72 	struct ether_addr mac_addr;
73 };
74 
75 struct p2p_info {
76 	bool on;    /**< p2p on/off switch */
77 	bool scan;
78 	int16 search_state;
79 	s8 vir_ifname[IFNAMSIZ];
80 	unsigned long status;
81 	struct p2p_bss bss[P2PAPI_BSSCFG_MAX];
82 	timer_list_compat_t listen_timer;
83 	wl_p2p_sched_t noa;
84 	wl_p2p_ops_t ops;
85 	wlc_ssid_t ssid;
86 	s8 p2p_go_count;
87 };
88 
89 #define MAX_VNDR_IE_NUMBER	10
90 
91 struct parsed_vndr_ie_info {
92 	const char *ie_ptr;
93 	u32 ie_len;	/**< total length including id & length field */
94 	vndr_ie_t vndrie;
95 };
96 
97 struct parsed_vndr_ies {
98 	u32 count;
99 	struct parsed_vndr_ie_info ie_info[MAX_VNDR_IE_NUMBER];
100 };
101 
102 /* dongle status */
103 enum wl_cfgp2p_status {
104 	WLP2P_STATUS_DISCOVERY_ON = 0,
105 	WLP2P_STATUS_SEARCH_ENABLED,
106 	WLP2P_STATUS_IF_ADDING,
107 	WLP2P_STATUS_IF_DELETING,
108 	WLP2P_STATUS_IF_CHANGING,
109 	WLP2P_STATUS_IF_CHANGED,
110 	WLP2P_STATUS_LISTEN_EXPIRED,
111 	WLP2P_STATUS_ACTION_TX_COMPLETED,
112 	WLP2P_STATUS_ACTION_TX_NOACK,
113 	WLP2P_STATUS_SCANNING,
114 	WLP2P_STATUS_GO_NEG_PHASE,
115 	WLP2P_STATUS_DISC_IN_PROGRESS
116 };
117 
118 #define wl_to_p2p_bss_ndev(cfg, type)		((cfg)->p2p->bss[type].dev)
119 #define wl_to_p2p_bss_bssidx(cfg, type)		((cfg)->p2p->bss[type].bssidx)
120 #define wl_to_p2p_bss_macaddr(cfg, type)     &((cfg)->p2p->bss[type].mac_addr)
121 #define wl_to_p2p_bss_saved_ie(cfg, type)	((cfg)->p2p->bss[type].saved_ie)
122 #define wl_to_p2p_bss_private(cfg, type)		((cfg)->p2p->bss[type].private_data)
123 #define wl_to_p2p_bss(cfg, type)			((cfg)->p2p->bss[type])
124 #define wl_get_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
125 		test_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
126 #define wl_set_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
127 		set_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
128 #define wl_clr_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
129 		clear_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
130 #define wl_chg_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
131 	change_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
132 #define p2p_on(cfg) ((cfg)->p2p->on)
133 #define p2p_scan(cfg) ((cfg)->p2p->scan)
134 #define p2p_is_on(cfg) ((cfg)->p2p && (cfg)->p2p->on)
135 
136 /* dword align allocation */
137 #define WLC_IOCTL_MAXLEN 8192
138 
139 #ifdef CUSTOMER_HW4_DEBUG
140 #define CFGP2P_ERROR_TEXT		"CFGP2P-INFO2) "
141 #else
142 #define CFGP2P_ERROR_TEXT		"CFGP2P-ERROR) "
143 #endif /* CUSTOMER_HW4_DEBUG */
144 
145 #ifdef DHD_LOG_DUMP
146 #define CFGP2P_ERR(args)									\
147 	do {										\
148 		if (wl_dbg_level & WL_DBG_ERR) {				\
149 			printk(KERN_INFO CFGP2P_ERROR_TEXT "%s : ", __func__);	\
150 			printk args;						\
151 			DHD_LOG_DUMP_WRITE("[%s] %s: ",	\
152 			dhd_log_dump_get_timestamp(), __func__);	\
153 			DHD_LOG_DUMP_WRITE args;	\
154 		}									\
155 	} while (0)
156 #define	CFGP2P_INFO(args)									\
157 	do {										\
158 		if (wl_dbg_level & WL_DBG_INFO) {				\
159 			printk(KERN_INFO "CFGP2P-INFO) %s : ", __func__);	\
160 			printk args;						\
161 			DHD_LOG_DUMP_WRITE("[%s] %s: ",	\
162 			dhd_log_dump_get_timestamp(), __func__);	\
163 			DHD_LOG_DUMP_WRITE args;	\
164 		}									\
165 	} while (0)
166 #define	CFGP2P_ACTION(args)								\
167 	do {									\
168 		if (wl_dbg_level & WL_DBG_P2P_ACTION) {			\
169 			printk(KERN_INFO "CFGP2P-ACTION) %s :", __func__);	\
170 			printk args;							\
171 			DHD_LOG_DUMP_WRITE("[%s] %s: ",	\
172 			dhd_log_dump_get_timestamp(), __func__);	\
173 			DHD_LOG_DUMP_WRITE args;	\
174 		}									\
175 	} while (0)
176 #else
177 #define CFGP2P_ERR(args)									\
178 	do {										\
179 		if (wl_dbg_level & WL_DBG_ERR) {				\
180 			printk(KERN_INFO CFGP2P_ERROR_TEXT "%s : ", __func__);	\
181 			printk args;						\
182 		}									\
183 	} while (0)
184 #define	CFGP2P_INFO(args)									\
185 	do {										\
186 		if (wl_dbg_level & WL_DBG_INFO) {				\
187 			printk(KERN_INFO "CFGP2P-INFO) %s : ", __func__);	\
188 			printk args;						\
189 		}									\
190 	} while (0)
191 #define	CFGP2P_ACTION(args)								\
192 	do {									\
193 		if (wl_dbg_level & WL_DBG_P2P_ACTION) {			\
194 			printk(KERN_INFO "CFGP2P-ACTION) %s :", __func__);	\
195 			printk args;							\
196 		}									\
197 	} while (0)
198 #endif /* DHD_LOG_DUMP */
199 
200 #define	CFGP2P_DBG(args)								\
201 	do {									\
202 		if (wl_dbg_level & WL_DBG_DBG) {			\
203 			printk(KERN_INFO "CFGP2P-DEBUG) %s :", __func__);	\
204 			printk args;							\
205 		}									\
206 	} while (0)
207 
208 #define INIT_TIMER(timer, func, duration, extra_delay)	\
209 	do {				   \
210 		init_timer_compat(timer, func, cfg); \
211 		timer_expires(timer) = jiffies + msecs_to_jiffies(duration + extra_delay); \
212 		add_timer(timer); \
213 	} while (0);
214 
215 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) && !defined(WL_CFG80211_P2P_DEV_IF)
216 #define WL_CFG80211_P2P_DEV_IF
217 
218 #ifdef WL_ENABLE_P2P_IF
219 #undef WL_ENABLE_P2P_IF
220 #endif // endif
221 
222 #ifdef WL_SUPPORT_BACKPORTED_KPATCHES
223 #undef WL_SUPPORT_BACKPORTED_KPATCHES
224 #endif // endif
225 #else
226 #ifdef WLP2P
227 #ifndef WL_ENABLE_P2P_IF
228 /* Enable P2P network Interface if P2P support is enabled */
229 #define WL_ENABLE_P2P_IF
230 #endif /* WL_ENABLE_P2P_IF */
231 #endif /* WLP2P */
232 #endif /* (LINUX_VERSION >= VERSION(3, 8, 0)) */
233 
234 #ifndef WL_CFG80211_P2P_DEV_IF
235 #ifdef WL_NEWCFG_PRIVCMD_SUPPORT
236 #undef WL_NEWCFG_PRIVCMD_SUPPORT
237 #endif // endif
238 #endif /* WL_CFG80211_P2P_DEV_IF */
239 
240 #if defined(WL_ENABLE_P2P_IF) && (defined(WL_CFG80211_P2P_DEV_IF) || \
241 	(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)))
242 #error Disable 'WL_ENABLE_P2P_IF', if 'WL_CFG80211_P2P_DEV_IF' is enabled \
243 	or kernel version is 3.8.0 or above
244 #endif /* WL_ENABLE_P2P_IF && (WL_CFG80211_P2P_DEV_IF || (LINUX_VERSION >= VERSION(3, 8, 0))) */
245 
246 #if !defined(WLP2P) && (defined(WL_ENABLE_P2P_IF) || defined(WL_CFG80211_P2P_DEV_IF))
247 #error WLP2P not defined
248 #endif /* !WLP2P && (WL_ENABLE_P2P_IF || WL_CFG80211_P2P_DEV_IF) */
249 
250 #if defined(WL_CFG80211_P2P_DEV_IF)
251 #define bcm_struct_cfgdev	struct wireless_dev
252 #else
253 #define bcm_struct_cfgdev	struct net_device
254 #endif /* WL_CFG80211_P2P_DEV_IF */
255 
256 #define P2P_ECSA_CNT 50
257 
258 extern void
259 wl_cfgp2p_listen_expired(unsigned long data);
260 extern bool
261 wl_cfgp2p_is_pub_action(void *frame, u32 frame_len);
262 extern bool
263 wl_cfgp2p_is_p2p_action(void *frame, u32 frame_len);
264 extern bool
265 wl_cfgp2p_is_gas_action(void *frame, u32 frame_len);
266 extern bool
267 wl_cfgp2p_find_gas_subtype(u8 subtype, u8* data, u32 len);
268 extern bool
269 wl_cfgp2p_is_p2p_gas_action(void *frame, u32 frame_len);
270 extern void
271 wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len, u32 channel);
272 extern s32
273 wl_cfgp2p_init_priv(struct bcm_cfg80211 *cfg);
274 extern void
275 wl_cfgp2p_deinit_priv(struct bcm_cfg80211 *cfg);
276 extern s32
277 wl_cfgp2p_set_firm_p2p(struct bcm_cfg80211 *cfg);
278 extern s32
279 wl_cfgp2p_set_p2p_mode(struct bcm_cfg80211 *cfg, u8 mode,
280             u32 channel, u16 listen_ms, int bssidx);
281 extern s32
282 wl_cfgp2p_ifadd(struct bcm_cfg80211 *cfg, struct ether_addr *mac, u8 if_type,
283             chanspec_t chspec);
284 extern s32
285 wl_cfgp2p_ifdisable(struct bcm_cfg80211 *cfg, struct ether_addr *mac);
286 extern s32
287 wl_cfgp2p_ifdel(struct bcm_cfg80211 *cfg, struct ether_addr *mac);
288 extern s32
289 wl_cfgp2p_ifchange(struct bcm_cfg80211 *cfg, struct ether_addr *mac, u8 if_type,
290 	chanspec_t chspec, s32 conn_idx);
291 
292 extern s32
293 wl_cfgp2p_ifidx(struct bcm_cfg80211 *cfg, struct ether_addr *mac, s32 *index);
294 
295 extern s32
296 wl_cfgp2p_init_discovery(struct bcm_cfg80211 *cfg);
297 extern s32
298 wl_cfgp2p_enable_discovery(struct bcm_cfg80211 *cfg, struct net_device *dev, const u8 *ie,
299 	u32 ie_len);
300 extern s32
301 wl_cfgp2p_disable_discovery(struct bcm_cfg80211 *cfg);
302 extern s32
303 wl_cfgp2p_escan(struct bcm_cfg80211 *cfg, struct net_device *dev, u16 active, u32 num_chans,
304 	u16 *channels,
305 	s32 search_state, u16 action, u32 bssidx, struct ether_addr *tx_dst_addr,
306 	p2p_scan_purpose_t p2p_scan_purpose);
307 
308 extern s32
309 wl_cfgp2p_act_frm_search(struct bcm_cfg80211 *cfg, struct net_device *ndev,
310 	s32 bssidx, s32 channel, struct ether_addr *tx_dst_addr);
311 
312 extern const wpa_ie_fixed_t *
313 wl_cfgp2p_find_wpaie(const u8 *parse, u32 len);
314 
315 extern const wpa_ie_fixed_t *
316 wl_cfgp2p_find_wpsie(const u8 *parse, u32 len);
317 
318 extern wifi_p2p_ie_t *
319 wl_cfgp2p_find_p2pie(const u8 *parse, u32 len);
320 
321 extern const wifi_wfd_ie_t *
322 wl_cfgp2p_find_wfdie(const u8 *parse, u32 len);
323 extern s32
324 wl_cfgp2p_set_management_ie(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bssidx,
325             s32 pktflag, const u8 *vndr_ie, u32 vndr_ie_len);
326 extern s32
327 wl_cfgp2p_clear_management_ie(struct bcm_cfg80211 *cfg, s32 bssidx);
328 
329 extern struct net_device *
330 wl_cfgp2p_find_ndev(struct bcm_cfg80211 *cfg, s32 bssidx);
331 extern s32
332 wl_cfgp2p_find_type(struct bcm_cfg80211 *cfg, s32 bssidx, s32 *type);
333 
334 extern s32
335 wl_cfgp2p_listen_complete(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
336 	const wl_event_msg_t *e, void *data);
337 extern s32
338 wl_cfgp2p_discover_listen(struct bcm_cfg80211 *cfg, s32 channel, u32 duration_ms);
339 
340 extern s32
341 wl_cfgp2p_discover_enable_search(struct bcm_cfg80211 *cfg, u8 enable);
342 
343 extern s32
344 wl_cfgp2p_action_tx_complete(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
345 	const wl_event_msg_t *e, void *data);
346 
347 extern s32
348 wl_cfgp2p_tx_action_frame(struct bcm_cfg80211 *cfg, struct net_device *dev,
349 	wl_af_params_t *af_params, s32 bssidx);
350 
351 extern void
352 wl_cfgp2p_generate_bss_mac(struct bcm_cfg80211 *cfg, struct ether_addr *primary_addr);
353 
354 extern void
355 wl_cfg80211_change_ifaddr(u8* buf, struct ether_addr *p2p_int_addr, u8 element_id);
356 
357 extern s32
358 wl_cfgp2p_supported(struct bcm_cfg80211 *cfg, struct net_device *ndev);
359 
360 extern s32
361 wl_cfgp2p_down(struct bcm_cfg80211 *cfg);
362 
363 extern s32
364 wl_cfgp2p_set_p2p_noa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
365 
366 extern s32
367 wl_cfgp2p_get_p2p_noa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
368 
369 extern s32
370 wl_cfgp2p_set_p2p_ps(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
371 
372 extern s32
373 wl_cfgp2p_set_p2p_ecsa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
374 
375 extern s32
376 wl_cfgp2p_increase_p2p_bw(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
377 
378 extern const u8 *
379 wl_cfgp2p_retreive_p2pattrib(const void *buf, u8 element_id);
380 
381 extern const u8*
382 wl_cfgp2p_find_attrib_in_all_p2p_Ies(const u8 *parse, u32 len, u32 attrib);
383 
384 extern const u8 *
385 wl_cfgp2p_retreive_p2p_dev_addr(wl_bss_info_t *bi, u32 bi_length);
386 
387 extern s32
388 wl_cfgp2p_register_ndev(struct bcm_cfg80211 *cfg);
389 
390 extern s32
391 wl_cfgp2p_unregister_ndev(struct bcm_cfg80211 *cfg);
392 
393 extern bool
394 wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops);
395 
396 extern u32
397 wl_cfgp2p_vndr_ie(struct bcm_cfg80211 *cfg, u8 *iebuf, s32 pktflag,
398                   s8 *oui, s32 ie_id, const s8 *data, s32 datalen, const s8* add_del_cmd);
399 
400 extern int wl_cfgp2p_get_conn_idx(struct bcm_cfg80211 *cfg);
401 
402 extern
403 int wl_cfg_multip2p_operational(struct bcm_cfg80211 *cfg);
404 
405 extern
406 int wl_cfgp2p_vif_created(struct bcm_cfg80211 *cfg);
407 
408 #if defined(WL_CFG80211_P2P_DEV_IF)
409 extern struct wireless_dev *
410 wl_cfgp2p_add_p2p_disc_if(struct bcm_cfg80211 *cfg);
411 
412 extern int
413 wl_cfgp2p_start_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev);
414 
415 extern void
416 wl_cfgp2p_stop_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev);
417 
418 extern int
419 wl_cfgp2p_del_p2p_disc_if(struct wireless_dev *wdev, struct bcm_cfg80211 *cfg);
420 
421 #endif /* WL_CFG80211_P2P_DEV_IF */
422 
423 extern void
424 wl_cfgp2p_need_wait_actfrmae(struct bcm_cfg80211 *cfg, void *frame, u32 frame_len, bool tx);
425 
426 extern int
427 wl_cfgp2p_is_p2p_specific_scan(struct cfg80211_scan_request *request);
428 
429 /* WiFi Direct */
430 #define SOCIAL_CHAN_1 1
431 #define SOCIAL_CHAN_2 6
432 #define SOCIAL_CHAN_3 11
433 #define IS_P2P_SOCIAL_CHANNEL(channel) ((channel == SOCIAL_CHAN_1) || \
434 					(channel == SOCIAL_CHAN_2) || \
435 					(channel == SOCIAL_CHAN_3))
436 #define SOCIAL_CHAN_CNT 3
437 #define AF_PEER_SEARCH_CNT 2
438 #define WL_P2P_WILDCARD_SSID "DIRECT-"
439 #define WL_P2P_WILDCARD_SSID_LEN 7
440 #define WL_P2P_INTERFACE_PREFIX "p2p"
441 #define WL_P2P_TEMP_CHAN 11
442 #define WL_P2P_TEMP_CHAN_5G 36
443 #define WL_P2P_AF_STATUS_OFFSET 9
444 
445 /* If the provision discovery is for JOIN operations,
446  * or the device discoverablity frame is destined to GO
447  * then we need not do an internal scan to find GO.
448  */
449 #define IS_ACTPUB_WITHOUT_GROUP_ID(p2p_ie, len) \
450 	(wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_GROUP_ID) == NULL)
451 
452 #define IS_GAS_REQ(frame, len) (wl_cfgp2p_is_gas_action(frame, len) && \
453 					((frame->action == P2PSD_ACTION_ID_GAS_IREQ) || \
454 					(frame->action == P2PSD_ACTION_ID_GAS_CREQ)))
455 
456 #define IS_P2P_PUB_ACT_RSP_SUBTYPE(subtype) ((subtype == P2P_PAF_GON_RSP) || \
457 							((subtype == P2P_PAF_GON_CONF) || \
458 							(subtype == P2P_PAF_INVITE_RSP) || \
459 							(subtype == P2P_PAF_PROVDIS_RSP)))
460 #define IS_P2P_SOCIAL(ch) ((ch == SOCIAL_CHAN_1) || (ch == SOCIAL_CHAN_2) || (ch == SOCIAL_CHAN_3))
461 #define IS_P2P_SSID(ssid, len) (!memcmp(ssid, WL_P2P_WILDCARD_SSID, WL_P2P_WILDCARD_SSID_LEN) && \
462 					(len == WL_P2P_WILDCARD_SSID_LEN))
463 #endif				/* _wl_cfgp2p_h_ */
464