1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2019 - 2020 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 __PHL_SCAN_H__ 16*4882a593Smuzhiyun #define __PHL_SCAN_H__ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* Header file for application to invoke scan service */ 19*4882a593Smuzhiyun #define PHL_SSID_LEN 32 20*4882a593Smuzhiyun struct rtw_phl_ssid { 21*4882a593Smuzhiyun u32 ssid_len; 22*4882a593Smuzhiyun u8 ssid[PHL_SSID_LEN]; 23*4882a593Smuzhiyun }; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun enum phl_scan_mode { 26*4882a593Smuzhiyun NULL_MODE, /* End of Scanning */ 27*4882a593Smuzhiyun NORMAL_SCAN_MODE, /* OFF CHANNEL : non-operation channel*/ 28*4882a593Smuzhiyun BACKOP_MODE, 29*4882a593Smuzhiyun P2P_SCAN_MODE, 30*4882a593Smuzhiyun P2P_LISTEN_MODE, 31*4882a593Smuzhiyun MAX_MODE, 32*4882a593Smuzhiyun }; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Scan type including active and passive scan. */ 35*4882a593Smuzhiyun enum rtw_phl_scan_type { 36*4882a593Smuzhiyun RTW_PHL_SCAN_PASSIVE, 37*4882a593Smuzhiyun RTW_PHL_SCAN_ACTIVE, 38*4882a593Smuzhiyun RTW_PHL_SCAN_MIX, 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun enum phl_ext_act_scan_state { 42*4882a593Smuzhiyun EXT_ACT_SCAN_DISABLE, 43*4882a593Smuzhiyun EXT_ACT_SCAN_ENABLE, 44*4882a593Smuzhiyun EXT_ACT_SCAN_TRIGGER, 45*4882a593Smuzhiyun EXT_ACT_SCAN_DONE, 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct phl_scan_channel { 49*4882a593Smuzhiyun _os_list list; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun enum band_type band; 52*4882a593Smuzhiyun u16 channel; /* channel number */ 53*4882a593Smuzhiyun u16 duration; /* 0: use default, otherwise: channel scan time */ 54*4882a593Smuzhiyun enum channel_width bw; /* 0: use default 20Mhz */ 55*4882a593Smuzhiyun enum chan_offset offset; 56*4882a593Smuzhiyun enum rtw_phl_scan_type type; /* active scan: 1, passive scan: 0 */ 57*4882a593Smuzhiyun u8 scan_mode; /* according to phl_scan_mode */ 58*4882a593Smuzhiyun u8 ext_act_scan; /* according to phl_ext_act_scan_state */ 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun enum scan_result { 62*4882a593Smuzhiyun SCAN_REQ_ABORT, /* abort a non-started(queued) scan */ 63*4882a593Smuzhiyun SCAN_REQ_CANCEL, /* cancel a started scan */ 64*4882a593Smuzhiyun SCAN_REQ_COMPLETE /* scan complete */ 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun enum scan_bkop_mode { 68*4882a593Smuzhiyun SCAN_BKOP_NONE, 69*4882a593Smuzhiyun SCAN_BKOP_CNT, 70*4882a593Smuzhiyun SCAN_BKOP_TIMER 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #define SCAN_SSID_AMOUNT 9 /* for WEXT_CSCAN_AMOUNT 9 */ 74*4882a593Smuzhiyun #define SCAN_CH_AMOUNT (14+37) 75*4882a593Smuzhiyun struct rtw_phl_scan_param { 76*4882a593Smuzhiyun u32 max_scan_time; 77*4882a593Smuzhiyun #ifdef CONFIG_PHL_CMD_SCAN_BKOP_TIME 78*4882a593Smuzhiyun u32 max_listen_time; 79*4882a593Smuzhiyun #endif 80*4882a593Smuzhiyun struct rtw_phl_ssid ssid[SCAN_SSID_AMOUNT]; 81*4882a593Smuzhiyun u8 ssid_num; 82*4882a593Smuzhiyun u8 repeat; /* 255 means scan forever until cancel */ 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun u8 ch_num; 85*4882a593Smuzhiyun struct phl_scan_channel *ch; 86*4882a593Smuzhiyun u32 ch_sz; 87*4882a593Smuzhiyun int ch_idx; /* current scaned cahnnel index, init vaule = (-1) */ 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* back op param */ 90*4882a593Smuzhiyun enum scan_bkop_mode back_op_mode; 91*4882a593Smuzhiyun u8 back_op_ch_cnt; /* every back_op_ch_cnt go back to op ch */ 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* every 'back_op_off_ch_dur_ms' go back to op ch 94*4882a593Smuzhiyun * back_op_off_ch_dur_ms have to large than ch->duration 95*4882a593Smuzhiyun * 0 : not specify 96*4882a593Smuzhiyun */ 97*4882a593Smuzhiyun u16 back_op_ch_dur_ms; /* op ch stay time; 0 : use default value */ 98*4882a593Smuzhiyun u16 back_op_off_ch_dur_ms; 99*4882a593Smuzhiyun u16 back_op_off_ch_ext_dur_ms; /* extend when off_ch_tx (MGNT_TX) */ 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun struct rtw_phl_scan_ops *ops; 102*4882a593Smuzhiyun void *priv; /* ops private */ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct rtw_wifi_role_t *wifi_role; 105*4882a593Smuzhiyun /* scan fsm internal use 106*4882a593Smuzhiyun * represent current scanning channel 107*4882a593Smuzhiyun */ 108*4882a593Smuzhiyun struct phl_scan_channel *scan_ch; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #ifdef CONFIG_PHL_CMD_SCAN 111*4882a593Smuzhiyun struct phl_queue chlist; 112*4882a593Smuzhiyun struct phl_scan_channel back_op_ch[MAX_WIFI_ROLE_NUMBER]; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun _os_timer scan_timer; /* handle in phl_cmd_scan */ 115*4882a593Smuzhiyun u8 fltr_mode; /* backup filter mode before off channel */ 116*4882a593Smuzhiyun u8 state; 117*4882a593Smuzhiyun #endif 118*4882a593Smuzhiyun /* create for computing scan time */ 119*4882a593Smuzhiyun u32 enqueue_time; 120*4882a593Smuzhiyun u32 start_time; 121*4882a593Smuzhiyun u32 end_time; 122*4882a593Smuzhiyun u32 total_scan_time; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun u32 token; /* unique id, generated by rtw_phl_scan_request() */ 125*4882a593Smuzhiyun const char *name; 126*4882a593Smuzhiyun enum scan_result result; 127*4882a593Smuzhiyun u32 ext_act_scan_period; 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun enum PRECEDE { 131*4882a593Smuzhiyun TO_TAIL, /* normal case */ 132*4882a593Smuzhiyun TO_HEAD, /* insert to head */ 133*4882a593Smuzhiyun IMMEDIATE /* cancel previous scan and run immediately */ 134*4882a593Smuzhiyun }; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun struct rtw_phl_scan_ops { 137*4882a593Smuzhiyun int (*scan_issue_pbreq)(void *priv, struct rtw_phl_scan_param *param); 138*4882a593Smuzhiyun u8 (*scan_issue_null_data)(void *priv, u8 ridx, bool ps); 139*4882a593Smuzhiyun int (*scan_start)(void *priv, struct rtw_phl_scan_param *param); 140*4882a593Smuzhiyun int (*scan_ch_ready)(void *priv, struct rtw_phl_scan_param *param); 141*4882a593Smuzhiyun int (*scan_off_ch_tx)(void *priv, 142*4882a593Smuzhiyun struct rtw_phl_scan_param *param, void *data); 143*4882a593Smuzhiyun int (*scan_complete)(void *priv, struct rtw_phl_scan_param *param); 144*4882a593Smuzhiyun }; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_scan_cancel(void *phl); 147*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_scan_request(void *phl, 148*4882a593Smuzhiyun struct rtw_phl_scan_param *pbuf, enum PRECEDE order); 149*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_scan_del_request(void *phl, 150*4882a593Smuzhiyun u32 token); 151*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_scan_pause(void *phl); 152*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_scan_resume(void *phl); 153*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_scan_force_active_scan(void *phl, 154*4882a593Smuzhiyun u16 channel, u16 duration); 155*4882a593Smuzhiyun int rtw_phl_scan_inprogress_req_num(void *phl); 156*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_scan_running_req(void *phl, 157*4882a593Smuzhiyun struct rtw_phl_scan_param **param); 158*4882a593Smuzhiyun bool rtw_phl_scan_scanning_req(void *phl, u32 token, u32 *token_running); 159*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_scan_off_ch_tx(void *phl, void *data, int len); 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* CMD_DISP SCAN*/ 162*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cmd_scan_request(void *phl, 163*4882a593Smuzhiyun struct rtw_phl_scan_param *param, enum PRECEDE order); 164*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cmd_scan_cancel(void *phl, 165*4882a593Smuzhiyun struct rtw_phl_scan_param *param); 166*4882a593Smuzhiyun int rtw_phl_cmd_scan_inprogress(void *phl, u8 band_idx); 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun #endif /* __PHL_SCAN_H__ */ 169*4882a593Smuzhiyun 170