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