xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852bs/include/rtw_scan.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2007 - 2019 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #ifndef __RTW_SCAN_H_
16*4882a593Smuzhiyun #define __RTW_SCAN_H_
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /*rtw_mlme.h*/
19*4882a593Smuzhiyun void rtw_drv_scan_by_self(_adapter *padapter, u8 reason);
20*4882a593Smuzhiyun void rtw_scan_abort_no_wait(_adapter *adapter);
21*4882a593Smuzhiyun u32 rtw_scan_abort(_adapter *adapter, u32 timeout_ms);
22*4882a593Smuzhiyun void rtw_scan_timeout_handler(void *ctx);
23*4882a593Smuzhiyun void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf);
24*4882a593Smuzhiyun void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf);
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun enum {
27*4882a593Smuzhiyun 	SS_DENY_MP_MODE,
28*4882a593Smuzhiyun 	SS_DENY_RSON_SCANING,
29*4882a593Smuzhiyun 	SS_DENY_BLOCK_SCAN,
30*4882a593Smuzhiyun 	SS_DENY_BY_DRV,
31*4882a593Smuzhiyun 	SS_DENY_SELF_AP_UNDER_WPS,
32*4882a593Smuzhiyun 	SS_DENY_SELF_AP_UNDER_LINKING,
33*4882a593Smuzhiyun 	SS_DENY_SELF_AP_UNDER_SURVEY,
34*4882a593Smuzhiyun 	/*SS_DENY_SELF_STA_UNDER_WPS,*/
35*4882a593Smuzhiyun 	SS_DENY_SELF_STA_UNDER_LINKING,
36*4882a593Smuzhiyun 	SS_DENY_SELF_STA_UNDER_SURVEY,
37*4882a593Smuzhiyun 	SS_DENY_BUDDY_UNDER_LINK_WPS,
38*4882a593Smuzhiyun 	SS_DENY_BUDDY_UNDER_SURVEY,
39*4882a593Smuzhiyun 	SS_DENY_BUSY_TRAFFIC,
40*4882a593Smuzhiyun 	SS_ALLOW,
41*4882a593Smuzhiyun #ifdef DBG_LA_MODE
42*4882a593Smuzhiyun 	SS_DENY_LA_MODE,
43*4882a593Smuzhiyun #endif
44*4882a593Smuzhiyun 	SS_DENY_ADAPTIVITY,
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun u8 _rtw_sitesurvey_condition_check(const char *caller, _adapter *adapter, bool check_sc_interval);
47*4882a593Smuzhiyun #define rtw_sitesurvey_condition_check(adapter, check_sc_interval) _rtw_sitesurvey_condition_check(__func__, adapter, check_sc_interval)
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #ifdef CONFIG_SET_SCAN_DENY_TIMER
50*4882a593Smuzhiyun bool rtw_is_scan_deny(_adapter *adapter);
51*4882a593Smuzhiyun void rtw_clear_scan_deny(_adapter *adapter);
52*4882a593Smuzhiyun void rtw_set_scan_deny_timer_hdl(void *ctx);
53*4882a593Smuzhiyun void rtw_set_scan_deny(_adapter *adapter, u32 ms);
54*4882a593Smuzhiyun #else
55*4882a593Smuzhiyun #define rtw_is_scan_deny(adapter) _FALSE
56*4882a593Smuzhiyun #define rtw_clear_scan_deny(adapter) do {} while (0)
57*4882a593Smuzhiyun #define rtw_set_scan_deny(adapter, ms) do {} while (0)
58*4882a593Smuzhiyun #endif
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #ifdef CONFIG_RTW_ACS
61*4882a593Smuzhiyun u8 rtw_set_acs_sitesurvey(_adapter *adapter);
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /*rtw_mlme_ext.h*/
65*4882a593Smuzhiyun void sitesurvey_set_offch_state(_adapter *adapter, u8 scan_state);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun /*const char *scan_state_str(u8 state);*/
68*4882a593Smuzhiyun #define mlmeext_scan_state(mlmeext) ((mlmeext)->sitesurvey_res.state)
69*4882a593Smuzhiyun /*#define mlmeext_scan_state_str(mlmeext) scan_state_str((mlmeext)->sitesurvey_res.state)*/
70*4882a593Smuzhiyun #define mlmeext_chk_scan_state(mlmeext, _state) ((mlmeext)->sitesurvey_res.state == (_state))
71*4882a593Smuzhiyun #define mlmeext_set_scan_state(mlmeext, _state) \
72*4882a593Smuzhiyun 	do { \
73*4882a593Smuzhiyun 		((mlmeext)->sitesurvey_res.state = (_state)); \
74*4882a593Smuzhiyun 		((mlmeext)->sitesurvey_res.next_state = (_state)); \
75*4882a593Smuzhiyun 		rtw_mi_update_iface_status(&((container_of(mlmeext, _adapter, mlmeextpriv)->mlmepriv)), 0); \
76*4882a593Smuzhiyun 		/* RTW_INFO("set_scan_state:%s\n", scan_state_str(_state)); */ \
77*4882a593Smuzhiyun 		sitesurvey_set_offch_state(container_of(mlmeext, _adapter, mlmeextpriv), _state); \
78*4882a593Smuzhiyun 	} while (0)
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #if 0
81*4882a593Smuzhiyun #define mlmeext_scan_next_state(mlmeext) ((mlmeext)->sitesurvey_res.next_state)
82*4882a593Smuzhiyun #define mlmeext_set_scan_next_state(mlmeext, _state) \
83*4882a593Smuzhiyun 	do { \
84*4882a593Smuzhiyun 		((mlmeext)->sitesurvey_res.next_state = (_state)); \
85*4882a593Smuzhiyun 		/* RTW_INFO("set_scan_next_state:%s\n", scan_state_str(_state)); */ \
86*4882a593Smuzhiyun 	} while (0)
87*4882a593Smuzhiyun #endif
88*4882a593Smuzhiyun #ifdef CONFIG_SCAN_BACKOP
89*4882a593Smuzhiyun #define mlmeext_scan_backop_flags(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags)
90*4882a593Smuzhiyun #define mlmeext_chk_scan_backop_flags(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags & (flags))
91*4882a593Smuzhiyun #define mlmeext_assign_scan_backop_flags(mlmeext, flags) \
92*4882a593Smuzhiyun 	do { \
93*4882a593Smuzhiyun 		((mlmeext)->sitesurvey_res.backop_flags = (flags)); \
94*4882a593Smuzhiyun 		RTW_INFO("assign_scan_backop_flags:0x%02x\n", (mlmeext)->sitesurvey_res.backop_flags); \
95*4882a593Smuzhiyun 	} while (0)
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #define mlmeext_scan_backop_flags_sta(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_sta)
98*4882a593Smuzhiyun #define mlmeext_chk_scan_backop_flags_sta(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_sta & (flags))
99*4882a593Smuzhiyun #define mlmeext_assign_scan_backop_flags_sta(mlmeext, flags) \
100*4882a593Smuzhiyun 	do { \
101*4882a593Smuzhiyun 		((mlmeext)->sitesurvey_res.backop_flags_sta = (flags)); \
102*4882a593Smuzhiyun 	} while (0)
103*4882a593Smuzhiyun #else
104*4882a593Smuzhiyun #define mlmeext_scan_backop_flags(mlmeext) (0)
105*4882a593Smuzhiyun #define mlmeext_chk_scan_backop_flags(mlmeext, flags) (0)
106*4882a593Smuzhiyun #define mlmeext_assign_scan_backop_flags(mlmeext, flags) do {} while (0)
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define mlmeext_scan_backop_flags_sta(mlmeext) (0)
109*4882a593Smuzhiyun #define mlmeext_chk_scan_backop_flags_sta(mlmeext, flags) (0)
110*4882a593Smuzhiyun #define mlmeext_assign_scan_backop_flags_sta(mlmeext, flags) do {} while (0)
111*4882a593Smuzhiyun #endif /* CONFIG_SCAN_BACKOP */
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #if defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_AP_MODE)
114*4882a593Smuzhiyun #define mlmeext_scan_backop_flags_ap(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_ap)
115*4882a593Smuzhiyun #define mlmeext_chk_scan_backop_flags_ap(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_ap & (flags))
116*4882a593Smuzhiyun #define mlmeext_assign_scan_backop_flags_ap(mlmeext, flags) \
117*4882a593Smuzhiyun 	do { \
118*4882a593Smuzhiyun 		((mlmeext)->sitesurvey_res.backop_flags_ap = (flags)); \
119*4882a593Smuzhiyun 	} while (0)
120*4882a593Smuzhiyun #else
121*4882a593Smuzhiyun #define mlmeext_scan_backop_flags_ap(mlmeext) (0)
122*4882a593Smuzhiyun #define mlmeext_chk_scan_backop_flags_ap(mlmeext, flags) (0)
123*4882a593Smuzhiyun #define mlmeext_assign_scan_backop_flags_ap(mlmeext, flags) do {} while (0)
124*4882a593Smuzhiyun #endif /* defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_AP_MODE) */
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun #if defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_RTW_MESH)
127*4882a593Smuzhiyun #define mlmeext_scan_backop_flags_mesh(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_mesh)
128*4882a593Smuzhiyun #define mlmeext_chk_scan_backop_flags_mesh(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_mesh & (flags))
129*4882a593Smuzhiyun #define mlmeext_assign_scan_backop_flags_mesh(mlmeext, flags) \
130*4882a593Smuzhiyun 	do { \
131*4882a593Smuzhiyun 		((mlmeext)->sitesurvey_res.backop_flags_mesh = (flags)); \
132*4882a593Smuzhiyun 	} while (0)
133*4882a593Smuzhiyun #else
134*4882a593Smuzhiyun #define mlmeext_scan_backop_flags_mesh(mlmeext) (0)
135*4882a593Smuzhiyun #define mlmeext_chk_scan_backop_flags_mesh(mlmeext, flags) (0)
136*4882a593Smuzhiyun #define mlmeext_assign_scan_backop_flags_mesh(mlmeext, flags) do {} while (0)
137*4882a593Smuzhiyun #endif /* defined(CONFIG_SCAN_BACKOP) && defined(CONFIG_RTW_MESH) */
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun #if 0
140*4882a593Smuzhiyun void survey_timer_hdl(void *ctx);
141*4882a593Smuzhiyun #define set_survey_timer(mlmeext, ms) \
142*4882a593Smuzhiyun 	do { \
143*4882a593Smuzhiyun 		/*RTW_INFO("%s set_survey_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \
144*4882a593Smuzhiyun 		_set_timer(&(mlmeext)->survey_timer, (ms)); \
145*4882a593Smuzhiyun 	} while (0)
146*4882a593Smuzhiyun #define cancel_survey_timer(mlmeext) \
147*4882a593Smuzhiyun 	do { \
148*4882a593Smuzhiyun 		/*RTW_INFO("%s cancel_survey_timer(%p)\n", __FUNCTION__, (mlmeext));*/ \
149*4882a593Smuzhiyun 		_cancel_timer_ex(&(mlmeext)->survey_timer); \
150*4882a593Smuzhiyun 	} while (0)
151*4882a593Smuzhiyun #endif
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun enum SCAN_STATE {
154*4882a593Smuzhiyun 	SCAN_DISABLE = 0,
155*4882a593Smuzhiyun 	SCAN_START = 1,
156*4882a593Smuzhiyun 	SCAN_PS_ANNC_WAIT = 2,
157*4882a593Smuzhiyun 	SCAN_ENTER = 3,
158*4882a593Smuzhiyun 	SCAN_PROCESS = 4,
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	/* backop */
161*4882a593Smuzhiyun 	SCAN_BACKING_OP = 5,
162*4882a593Smuzhiyun 	SCAN_BACK_OP = 6,
163*4882a593Smuzhiyun 	SCAN_LEAVING_OP = 7,
164*4882a593Smuzhiyun 	SCAN_LEAVE_OP = 8,
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	/* SW antenna diversity (before linked) */
167*4882a593Smuzhiyun 	SCAN_SW_ANTDIV_BL = 9,
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	/* legacy p2p */
170*4882a593Smuzhiyun 	SCAN_TO_P2P_LISTEN = 10,
171*4882a593Smuzhiyun 	SCAN_P2P_LISTEN = 11,
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	SCAN_COMPLETE = 12,
174*4882a593Smuzhiyun 	SCAN_STATE_MAX,
175*4882a593Smuzhiyun };
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun enum ss_backop_flag {
179*4882a593Smuzhiyun 	SS_BACKOP_EN = BIT0, /* backop when linked */
180*4882a593Smuzhiyun 	SS_BACKOP_EN_NL = BIT1, /* backop even when no linked */
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	SS_BACKOP_PS_ANNC = BIT4,
183*4882a593Smuzhiyun 	SS_BACKOP_TX_RESUME = BIT5,
184*4882a593Smuzhiyun };
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun #define RTW_SSID_SCAN_AMOUNT 9 /* for WEXT_CSCAN_AMOUNT 9 */
187*4882a593Smuzhiyun #define RTW_CHANNEL_SCAN_AMOUNT (14+37)
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun struct ss_res {
190*4882a593Smuzhiyun 	u8 state;
191*4882a593Smuzhiyun 	u8 next_state; /* will set to state on next cmd hdl */
192*4882a593Smuzhiyun 	int bss_cnt;
193*4882a593Smuzhiyun 	u8 activate_ch_cnt;
194*4882a593Smuzhiyun 	#ifdef CONFIG_CMD_SCAN
195*4882a593Smuzhiyun 	struct rtw_phl_scan_param *scan_param;
196*4882a593Smuzhiyun 	#endif
197*4882a593Smuzhiyun 	struct submit_ctx sctx;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	u16 scan_ch_ms;
200*4882a593Smuzhiyun 	u32 scan_timeout_ms;
201*4882a593Smuzhiyun 	u8 rx_ampdu_accept;
202*4882a593Smuzhiyun 	u8 rx_ampdu_size;
203*4882a593Smuzhiyun #if 0
204*4882a593Smuzhiyun 	int channel_idx;
205*4882a593Smuzhiyun 	u8 force_ssid_scan;
206*4882a593Smuzhiyun 	int scan_mode;
207*4882a593Smuzhiyun 	u8 igi_scan;
208*4882a593Smuzhiyun 	u8 igi_before_scan; /* used for restoring IGI value without enable DIG & FA_CNT */
209*4882a593Smuzhiyun #endif
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun #ifdef CONFIG_SCAN_BACKOP
212*4882a593Smuzhiyun 	u8 backop_flags_sta; /* policy for station mode*/
213*4882a593Smuzhiyun 	#ifdef CONFIG_AP_MODE
214*4882a593Smuzhiyun 	u8 backop_flags_ap; /* policy for ap mode */
215*4882a593Smuzhiyun 	#endif
216*4882a593Smuzhiyun 	#ifdef CONFIG_RTW_MESH
217*4882a593Smuzhiyun 	u8 backop_flags_mesh; /* policy for mesh mode */
218*4882a593Smuzhiyun 	#endif
219*4882a593Smuzhiyun 	u8 backop_flags; /* per backop runtime decision */
220*4882a593Smuzhiyun 	#if 0
221*4882a593Smuzhiyun 	u8 scan_cnt;
222*4882a593Smuzhiyun 	#endif
223*4882a593Smuzhiyun 	u8 scan_cnt_max;
224*4882a593Smuzhiyun 	systime backop_time; /* the start time of backop */
225*4882a593Smuzhiyun 	u16 backop_ms;
226*4882a593Smuzhiyun #endif
227*4882a593Smuzhiyun #if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL)
228*4882a593Smuzhiyun 	u8 is_sw_antdiv_bl_scan;
229*4882a593Smuzhiyun #endif
230*4882a593Smuzhiyun 	u8 ssid_num;
231*4882a593Smuzhiyun 	u8 ch_num;
232*4882a593Smuzhiyun 	NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
233*4882a593Smuzhiyun 	struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	u32 token; 	/* 0: use to identify caller */
236*4882a593Smuzhiyun 	u16 duration;	/* 0: use default */
237*4882a593Smuzhiyun 	u8 igi;		/* 0: use defalut */
238*4882a593Smuzhiyun 	u8 bw;		/* 0: use default */
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	bool acs; /* aim to trigger channel selection when scan done */
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun enum rtw_scan_type {
244*4882a593Smuzhiyun 	RTW_SCAN_NORMAL,
245*4882a593Smuzhiyun 	RTW_SCAN_P2P,
246*4882a593Smuzhiyun 	RTW_SCAN_RRM
247*4882a593Smuzhiyun };
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun struct sitesurvey_parm {
250*4882a593Smuzhiyun 	enum rtw_phl_scan_type scan_mode;	/* active: 1, passive: 0 */
251*4882a593Smuzhiyun 	/* sint bsslimit;	// 1 ~ 48 */
252*4882a593Smuzhiyun 	u8 ssid_num;
253*4882a593Smuzhiyun 	u8 ch_num;
254*4882a593Smuzhiyun 	NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
255*4882a593Smuzhiyun 	struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	u32 rrm_token;	/* 80211k use it to identify caller */
258*4882a593Smuzhiyun 	u16 duration;	/* 0: use default, otherwise: channel scan time */
259*4882a593Smuzhiyun 	u8 igi;		/* 0: use defalut */
260*4882a593Smuzhiyun 	u8 bw;		/* 0: use default */
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	bool acs; /* aim to trigger channel selection when scan done */
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	enum rtw_scan_type scan_type;
265*4882a593Smuzhiyun };
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun void rtw_init_sitesurvey_parm(_adapter *padapter, struct sitesurvey_parm *pparm);
268*4882a593Smuzhiyun u8 rtw_sitesurvey_cmd(_adapter *padapter, struct sitesurvey_parm *pparm);
269*4882a593Smuzhiyun #ifndef CONFIG_CMD_SCAN
270*4882a593Smuzhiyun u32 rtw_site_survey_fsm(_adapter *padapter, struct cmd_obj *pcmd);
271*4882a593Smuzhiyun #endif
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun #if 1 /*#ifndef CONFIG_PHL_ARCH*/
274*4882a593Smuzhiyun u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf);
275*4882a593Smuzhiyun void rtw_survey_cmd_callback(_adapter  *padapter, struct cmd_obj *pcmd);
276*4882a593Smuzhiyun #endif
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun #ifdef CONFIG_IOCTL_CFG80211
279*4882a593Smuzhiyun u8 rtw_phl_remain_on_ch_cmd(_adapter *padapter, u64 cookie, struct wireless_dev *wdev,
280*4882a593Smuzhiyun 	struct ieee80211_channel *ch, u8 ch_type, unsigned int duration,
281*4882a593Smuzhiyun 	struct back_op_param *bkop_parm, u8 is_p2p);
282*4882a593Smuzhiyun #endif
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun #ifdef CONFIG_STA_CMD_DISPR
285*4882a593Smuzhiyun u8 scan_issu_null_data_cb(void *priv, u8 ridx, bool ps);
286*4882a593Smuzhiyun #endif
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun #endif /* __RTW_SCAN_H_ */
289