xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8822cs/hal/hal_dm_acs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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]; /*unit:dbm*/
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 u8 rtw_phydm_nhm_noise_pwr(_adapter *adapter);
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun void rtw_acs_reset(_adapter *adapter);
136*4882a593Smuzhiyun void rtw_acs_trigger(_adapter *adapter, u16 scan_time_ms, u8 scan_chan, enum NHM_PID pid);
137*4882a593Smuzhiyun void rtw_acs_get_rst(_adapter *adapter);
138*4882a593Smuzhiyun void rtw_acs_select_best_chan(_adapter *adapter);
139*4882a593Smuzhiyun void rtw_acs_info_dump(void *sel, _adapter *adapter);
140*4882a593Smuzhiyun void rtw_acs_update_current_info(_adapter *adapter);
141*4882a593Smuzhiyun void rtw_acs_chan_info_dump(void *sel, _adapter *adapter);
142*4882a593Smuzhiyun void rtw_acs_current_info_dump(void *sel, _adapter *adapter);
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun void rtw_acs_start(_adapter *adapter);
145*4882a593Smuzhiyun void rtw_acs_stop(_adapter *adapter);
146*4882a593Smuzhiyun u8 rtw_acs_get_rsni(_adapter *adapter, s8 rcpi, u8 ch);
147*4882a593Smuzhiyun #endif /*CONFIG_RTW_ACS*/
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun #ifdef CONFIG_BACKGROUND_NOISE_MONITOR
150*4882a593Smuzhiyun #define RTK_NOISE_MONITOR_VERSION	3
151*4882a593Smuzhiyun #define GET_NM_STATE(padapter)					(ATOMIC_READ(&GET_HAL_DATA(padapter)->nm.state))
152*4882a593Smuzhiyun #define SET_NM_STATE(padapter, set_state)			(ATOMIC_SET(&GET_HAL_DATA(padapter)->nm.state, set_state))
153*4882a593Smuzhiyun #define IS_NM_ENABLE(padapter)					((GET_NM_STATE(padapter) == NM_ENABLE) ? _TRUE : _FALSE)
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun enum NM_STATE {
156*4882a593Smuzhiyun 	NM_DISABLE,
157*4882a593Smuzhiyun 	NM_ENABLE,
158*4882a593Smuzhiyun };
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun struct noise_monitor {
161*4882a593Smuzhiyun 	ATOMIC_T state;
162*4882a593Smuzhiyun 	s16 noise[MAX_CHANNEL_NUM];
163*4882a593Smuzhiyun 	u8 bss_nums[MAX_CHANNEL_NUM];
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun void rtw_nm_enable(_adapter *adapter);
166*4882a593Smuzhiyun void rtw_nm_disable(_adapter *adapter);
167*4882a593Smuzhiyun void rtw_noise_measure(_adapter *adapter, u8 chan, u8 is_pause_dig, u8 igi_value, u32 max_time);
168*4882a593Smuzhiyun s16 rtw_noise_query_by_chan_num(_adapter *adapter, u8 chan);
169*4882a593Smuzhiyun s16 rtw_noise_query_by_chan_idx(_adapter *adapter, u8 ch_idx);
170*4882a593Smuzhiyun s16 rtw_noise_measure_curchan(_adapter *padapter);
171*4882a593Smuzhiyun void rtw_noise_info_dump(void *sel, _adapter *adapter);
172*4882a593Smuzhiyun #endif
173*4882a593Smuzhiyun #endif /* __HAL_DM_ACS_H__ */
174