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