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