1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2007 - 2017 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 __HAL_DM_ACS_H__ 16*4882a593Smuzhiyun #define __HAL_DM_ACS_H__ 17*4882a593Smuzhiyun #ifdef CONFIG_RTW_ACS 18*4882a593Smuzhiyun #define RTK_ACS_VERSION 3 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #if (RTK_ACS_VERSION == 3) 21*4882a593Smuzhiyun enum NHM_PID { 22*4882a593Smuzhiyun NHM_PID_ACS, 23*4882a593Smuzhiyun NHM_PID_IEEE_11K_HIGH, 24*4882a593Smuzhiyun NHM_PID_IEEE_11K_LOW, 25*4882a593Smuzhiyun }; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define init_clm_param(clm, app, lv, time) \ 28*4882a593Smuzhiyun do {\ 29*4882a593Smuzhiyun clm.clm_app = app;\ 30*4882a593Smuzhiyun clm.clm_lv = lv;\ 31*4882a593Smuzhiyun clm.mntr_time = time;\ 32*4882a593Smuzhiyun } while (0) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define init_nhm_param(nhm, txon, cca, cnt_opt, app, lv, time) \ 35*4882a593Smuzhiyun do {\ 36*4882a593Smuzhiyun nhm.incld_txon = txon;\ 37*4882a593Smuzhiyun nhm.incld_cca = cca;\ 38*4882a593Smuzhiyun nhm.div_opt = cnt_opt;\ 39*4882a593Smuzhiyun nhm.nhm_app = app;\ 40*4882a593Smuzhiyun nhm.nhm_lv = lv;\ 41*4882a593Smuzhiyun nhm.mntr_time = time;\ 42*4882a593Smuzhiyun } while (0) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define init_acs_clm(clm, time) \ 46*4882a593Smuzhiyun init_clm_param(clm, CLM_ACS, CLM_LV_2, time) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define init_acs_nhm(nhm, time) \ 49*4882a593Smuzhiyun init_nhm_param(nhm, NHM_EXCLUDE_TXON, NHM_EXCLUDE_CCA, NHM_CNT_ALL, NHM_ACS, NHM_LV_2, time) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define init_11K_high_nhm(nhm, time) \ 52*4882a593Smuzhiyun init_nhm_param(nhm, NHM_EXCLUDE_TXON, NHM_EXCLUDE_CCA, NHM_CNT_ALL, IEEE_11K_HIGH, NHM_LV_2, time) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define init_11K_low_nhm(nhm, time) \ 55*4882a593Smuzhiyun init_nhm_param(nhm, NHM_EXCLUDE_TXON, NHM_EXCLUDE_CCA, NHM_CNT_ALL, IEEE_11K_LOW, NHM_LV_2, time) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #endif /*(RTK_ACS_VERSION == 3)*/ 59*4882a593Smuzhiyun void rtw_acs_version_dump(void *sel, _adapter *adapter); 60*4882a593Smuzhiyun extern void phydm_ccx_monitor_trigger(void *p_dm_void, u16 monitor_time); 61*4882a593Smuzhiyun extern void phydm_ccx_monitor_result(void *p_dm_void); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define GET_ACS_STATE(padapter) (ATOMIC_READ(&GET_HAL_DATA(padapter)->acs.state)) 64*4882a593Smuzhiyun #define SET_ACS_STATE(padapter, set_state) (ATOMIC_SET(&GET_HAL_DATA(padapter)->acs.state, set_state)) 65*4882a593Smuzhiyun #define IS_ACS_ENABLE(padapter) ((GET_ACS_STATE(padapter) == ACS_ENABLE) ? _TRUE : _FALSE) 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun enum ACS_STATE { 68*4882a593Smuzhiyun ACS_DISABLE, 69*4882a593Smuzhiyun ACS_ENABLE, 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #define ACS_BW_20M BIT(0) 73*4882a593Smuzhiyun #define ACS_BW_40M BIT(1) 74*4882a593Smuzhiyun #define ACS_BW_80M BIT(2) 75*4882a593Smuzhiyun #define ACS_BW_160M BIT(3) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun struct auto_chan_sel { 78*4882a593Smuzhiyun ATOMIC_T state; 79*4882a593Smuzhiyun u8 trigger_ch; 80*4882a593Smuzhiyun bool triggered; 81*4882a593Smuzhiyun u8 clm_ratio[MAX_CHANNEL_NUM]; 82*4882a593Smuzhiyun u8 nhm_ratio[MAX_CHANNEL_NUM]; 83*4882a593Smuzhiyun s8 env_mntr_rpt[MAX_CHANNEL_NUM]; 84*4882a593Smuzhiyun #if (RTK_ACS_VERSION == 3) 85*4882a593Smuzhiyun u8 nhm[MAX_CHANNEL_NUM][NHM_RPT_NUM]; 86*4882a593Smuzhiyun #endif 87*4882a593Smuzhiyun u8 bss_nums[MAX_CHANNEL_NUM]; 88*4882a593Smuzhiyun u8 interference_time[MAX_CHANNEL_NUM]; 89*4882a593Smuzhiyun u8 cur_ch_clm_ratio; 90*4882a593Smuzhiyun u8 cur_ch_nhm_ratio; 91*4882a593Smuzhiyun u8 best_chan_5g; 92*4882a593Smuzhiyun u8 best_chan_24g; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #if (RTK_ACS_VERSION == 3) 95*4882a593Smuzhiyun u8 trig_rst; 96*4882a593Smuzhiyun struct env_trig_rpt trig_rpt; 97*4882a593Smuzhiyun #endif 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #ifdef CONFIG_RTW_ACS_DBG 100*4882a593Smuzhiyun RT_SCAN_TYPE scan_type; 101*4882a593Smuzhiyun u16 scan_time; 102*4882a593Smuzhiyun u8 igi; 103*4882a593Smuzhiyun u8 bw; 104*4882a593Smuzhiyun #endif 105*4882a593Smuzhiyun }; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun #define rtw_acs_get_best_chan_24g(adapter) (GET_HAL_DATA(adapter)->acs.best_chan_24g) 108*4882a593Smuzhiyun #define rtw_acs_get_best_chan_5g(adapter) (GET_HAL_DATA(adapter)->acs.best_chan_5g) 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #ifdef CONFIG_RTW_ACS_DBG 111*4882a593Smuzhiyun #define rtw_is_acs_passiv_scan(adapter) (((GET_HAL_DATA(adapter)->acs.scan_type) == SCAN_PASSIVE) ? _TRUE : _FALSE) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #define rtw_acs_get_adv_st(adapter) (GET_HAL_DATA(adapter)->acs.scan_time) 114*4882a593Smuzhiyun #define rtw_is_acs_st_valid(adapter) ((GET_HAL_DATA(adapter)->acs.scan_time) ? _TRUE : _FALSE) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define rtw_acs_get_adv_igi(adapter) (GET_HAL_DATA(adapter)->acs.igi) 117*4882a593Smuzhiyun u8 rtw_is_acs_igi_valid(_adapter *adapter); 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #define rtw_acs_get_adv_bw(adapter) (GET_HAL_DATA(adapter)->acs.bw) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun void rtw_acs_adv_setting(_adapter *adapter, RT_SCAN_TYPE scan_type, u16 scan_time, u8 igi, u8 bw); 122*4882a593Smuzhiyun void rtw_acs_adv_reset(_adapter *adapter); 123*4882a593Smuzhiyun #endif 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun u8 rtw_acs_get_clm_ratio_by_ch_num(_adapter *adapter, u8 chan); 126*4882a593Smuzhiyun u8 rtw_acs_get_clm_ratio_by_ch_idx(_adapter *adapter, u8 ch_idx); 127*4882a593Smuzhiyun u8 rtw_acs_get_nhm_ratio_by_ch_num(_adapter *adapter, u8 chan); 128*4882a593Smuzhiyun u8 rtw_acs_get_nhm_noise_pwr_by_ch_idx(_adapter *adapter, u8 ch_idx); 129*4882a593Smuzhiyun u8 rtw_acs_get_num_ratio_by_ch_idx(_adapter *adapter, u8 ch_idx); 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun u8 rtw_phydm_clm_ratio(_adapter *adapter); 132*4882a593Smuzhiyun u8 rtw_phydm_nhm_ratio(_adapter *adapter); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun void rtw_acs_reset(_adapter *adapter); 135*4882a593Smuzhiyun void rtw_acs_trigger(_adapter *adapter, u16 scan_time_ms, u8 scan_chan, enum NHM_PID pid); 136*4882a593Smuzhiyun void rtw_acs_get_rst(_adapter *adapter); 137*4882a593Smuzhiyun void rtw_acs_select_best_chan(_adapter *adapter); 138*4882a593Smuzhiyun void rtw_acs_info_dump(void *sel, _adapter *adapter); 139*4882a593Smuzhiyun void rtw_acs_update_current_info(_adapter *adapter); 140*4882a593Smuzhiyun void rtw_acs_chan_info_dump(void *sel, _adapter *adapter); 141*4882a593Smuzhiyun void rtw_acs_current_info_dump(void *sel, _adapter *adapter); 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun void rtw_acs_start(_adapter *adapter); 144*4882a593Smuzhiyun void rtw_acs_stop(_adapter *adapter); 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #endif /*CONFIG_RTW_ACS*/ 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #ifdef CONFIG_BACKGROUND_NOISE_MONITOR 149*4882a593Smuzhiyun #define RTK_NOISE_MONITOR_VERSION 3 150*4882a593Smuzhiyun #define GET_NM_STATE(padapter) (ATOMIC_READ(&GET_HAL_DATA(padapter)->nm.state)) 151*4882a593Smuzhiyun #define SET_NM_STATE(padapter, set_state) (ATOMIC_SET(&GET_HAL_DATA(padapter)->nm.state, set_state)) 152*4882a593Smuzhiyun #define IS_NM_ENABLE(padapter) ((GET_NM_STATE(padapter) == NM_ENABLE) ? _TRUE : _FALSE) 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun enum NM_STATE { 155*4882a593Smuzhiyun NM_DISABLE, 156*4882a593Smuzhiyun NM_ENABLE, 157*4882a593Smuzhiyun }; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun struct noise_monitor { 160*4882a593Smuzhiyun ATOMIC_T state; 161*4882a593Smuzhiyun s16 noise[MAX_CHANNEL_NUM]; 162*4882a593Smuzhiyun u8 bss_nums[MAX_CHANNEL_NUM]; 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun void rtw_nm_enable(_adapter *adapter); 165*4882a593Smuzhiyun void rtw_nm_disable(_adapter *adapter); 166*4882a593Smuzhiyun void rtw_noise_measure(_adapter *adapter, u8 chan, u8 is_pause_dig, u8 igi_value, u32 max_time); 167*4882a593Smuzhiyun s16 rtw_noise_query_by_chan_num(_adapter *adapter, u8 chan); 168*4882a593Smuzhiyun s16 rtw_noise_query_by_chan_idx(_adapter *adapter, u8 ch_idx); 169*4882a593Smuzhiyun s16 rtw_noise_measure_curchan(_adapter *padapter); 170*4882a593Smuzhiyun void rtw_noise_info_dump(void *sel, _adapter *adapter); 171*4882a593Smuzhiyun #endif 172*4882a593Smuzhiyun #endif /* __HAL_DM_ACS_H__ */ 173