xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8821cs/hal/hal_dm_acs.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2014 - 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 #include <drv_types.h>
16*4882a593Smuzhiyun #include <hal_data.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #if defined(CONFIG_RTW_ACS) || defined(CONFIG_BACKGROUND_NOISE_MONITOR)
_rtw_bss_nums_count(_adapter * adapter,u8 * pbss_nums)20*4882a593Smuzhiyun static void _rtw_bss_nums_count(_adapter *adapter, u8 *pbss_nums)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun 	struct mlme_priv	*pmlmepriv = &(adapter->mlmepriv);
23*4882a593Smuzhiyun 	_queue *queue = &(pmlmepriv->scanned_queue);
24*4882a593Smuzhiyun 	struct wlan_network *pnetwork = NULL;
25*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	_list	*plist, *phead;
28*4882a593Smuzhiyun 	_irqL irqL;
29*4882a593Smuzhiyun 	int chan_idx = -1;
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 	if (pbss_nums == NULL) {
32*4882a593Smuzhiyun 		RTW_ERR("%s pbss_nums is null pointer\n", __func__);
33*4882a593Smuzhiyun 		return;
34*4882a593Smuzhiyun 	}
35*4882a593Smuzhiyun 	_rtw_memset(pbss_nums, 0, MAX_CHANNEL_NUM);
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
38*4882a593Smuzhiyun 	phead = get_list_head(queue);
39*4882a593Smuzhiyun 	plist = get_next(phead);
40*4882a593Smuzhiyun 	while (1) {
41*4882a593Smuzhiyun 		if (rtw_end_of_queue_search(phead, plist) == _TRUE)
42*4882a593Smuzhiyun 			break;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 		pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
45*4882a593Smuzhiyun 		if (!pnetwork)
46*4882a593Smuzhiyun 			break;
47*4882a593Smuzhiyun 		chan_idx = rtw_chset_search_ch(adapter_to_chset(adapter), pnetwork->network.Configuration.DSConfig);
48*4882a593Smuzhiyun 		if ((chan_idx == -1) || (chan_idx >= MAX_CHANNEL_NUM)) {
49*4882a593Smuzhiyun 			RTW_ERR("%s can't get chan_idx(CH:%d)\n",
50*4882a593Smuzhiyun 				__func__, pnetwork->network.Configuration.DSConfig);
51*4882a593Smuzhiyun 			chan_idx = 0;
52*4882a593Smuzhiyun 		}
53*4882a593Smuzhiyun 		/*if (pnetwork->network.Reserved[0] != BSS_TYPE_PROB_REQ)*/
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 		pbss_nums[chan_idx]++;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 		plist = get_next(plist);
58*4882a593Smuzhiyun 	}
59*4882a593Smuzhiyun 	_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
rtw_get_ch_num_by_idx(_adapter * adapter,u8 idx)62*4882a593Smuzhiyun u8 rtw_get_ch_num_by_idx(_adapter *adapter, u8 idx)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
65*4882a593Smuzhiyun 	RT_CHANNEL_INFO *pch_set = rfctl->channel_set;
66*4882a593Smuzhiyun 	u8 max_chan_nums = rfctl->max_chan_nums;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	if (idx >= max_chan_nums)
69*4882a593Smuzhiyun 		return 0;
70*4882a593Smuzhiyun 	return pch_set[idx].ChannelNum;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun #endif /*defined(CONFIG_RTW_ACS) || defined(CONFIG_BACKGROUND_NOISE_MONITOR)*/
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #ifdef CONFIG_RTW_ACS
rtw_acs_version_dump(void * sel,_adapter * adapter)76*4882a593Smuzhiyun void rtw_acs_version_dump(void *sel, _adapter *adapter)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "RTK_ACS VER_%d\n", RTK_ACS_VERSION);
79*4882a593Smuzhiyun }
rtw_phydm_clm_ratio(_adapter * adapter)80*4882a593Smuzhiyun u8 rtw_phydm_clm_ratio(_adapter *adapter)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun 	struct dm_struct *phydm = adapter_to_phydm(adapter);
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CLM_RATIO);
85*4882a593Smuzhiyun }
rtw_phydm_nhm_ratio(_adapter * adapter)86*4882a593Smuzhiyun u8 rtw_phydm_nhm_ratio(_adapter *adapter)
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun 	struct dm_struct *phydm = adapter_to_phydm(adapter);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_NHM_ENV_RATIO);
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun 
rtw_phydm_nhm_noise_pwr(_adapter * adapter)93*4882a593Smuzhiyun u8 rtw_phydm_nhm_noise_pwr(_adapter *adapter)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun 	struct dm_struct *phydm = adapter_to_phydm(adapter);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_NHM_PWR);
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun 
rtw_acs_reset(_adapter * adapter)100*4882a593Smuzhiyun void rtw_acs_reset(_adapter *adapter)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
103*4882a593Smuzhiyun 	struct auto_chan_sel *pacs = &hal_data->acs;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	_rtw_memset(pacs, 0, sizeof(struct auto_chan_sel));
106*4882a593Smuzhiyun 	#ifdef CONFIG_RTW_ACS_DBG
107*4882a593Smuzhiyun 	rtw_acs_adv_reset(adapter);
108*4882a593Smuzhiyun 	#endif /*CONFIG_RTW_ACS_DBG*/
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun #ifdef CONFIG_RTW_ACS_DBG
rtw_is_acs_igi_valid(_adapter * adapter)112*4882a593Smuzhiyun u8 rtw_is_acs_igi_valid(_adapter *adapter)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
115*4882a593Smuzhiyun 	struct auto_chan_sel *pacs = &hal_data->acs;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	if ((pacs->igi) && ((pacs->igi >= 0x1E) || (pacs->igi < 0x60)))
118*4882a593Smuzhiyun 		return _TRUE;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	return _FALSE;
121*4882a593Smuzhiyun }
rtw_acs_adv_setting(_adapter * adapter,RT_SCAN_TYPE scan_type,u16 scan_time,u8 igi,u8 bw)122*4882a593Smuzhiyun void rtw_acs_adv_setting(_adapter *adapter, RT_SCAN_TYPE scan_type, u16 scan_time, u8 igi, u8 bw)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
125*4882a593Smuzhiyun 	struct auto_chan_sel *pacs = &hal_data->acs;
126*4882a593Smuzhiyun 	struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
127*4882a593Smuzhiyun 	struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	pacs->scan_type = scan_type;
130*4882a593Smuzhiyun 	pacs->scan_time = scan_time;
131*4882a593Smuzhiyun 	pacs->igi = igi;
132*4882a593Smuzhiyun 	pacs->bw = bw;
133*4882a593Smuzhiyun 	RTW_INFO("[ACS] ADV setting - scan_type:%c, ch_ms:%d(ms), igi:0x%02x, bw:%d\n",
134*4882a593Smuzhiyun 		pacs->scan_type ? 'A' : 'P', pacs->scan_time, pacs->igi, pacs->bw);
135*4882a593Smuzhiyun }
rtw_acs_adv_reset(_adapter * adapter)136*4882a593Smuzhiyun void rtw_acs_adv_reset(_adapter *adapter)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun 	rtw_acs_adv_setting(adapter, SCAN_ACTIVE, 0, 0, 0);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun #endif /*CONFIG_RTW_ACS_DBG*/
141*4882a593Smuzhiyun 
rtw_acs_trigger(_adapter * adapter,u16 scan_time_ms,u8 scan_chan,enum NHM_PID pid)142*4882a593Smuzhiyun void rtw_acs_trigger(_adapter *adapter, u16 scan_time_ms, u8 scan_chan, enum NHM_PID pid)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
145*4882a593Smuzhiyun 	struct dm_struct *phydm = adapter_to_phydm(adapter);
146*4882a593Smuzhiyun #if (RTK_ACS_VERSION == 3)
147*4882a593Smuzhiyun 	struct clm_para_info clm_para;
148*4882a593Smuzhiyun 	struct nhm_para_info nhm_para;
149*4882a593Smuzhiyun 	struct env_trig_rpt trig_rpt;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	scan_time_ms -= 10;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	init_acs_clm(clm_para, scan_time_ms);
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	if (pid == NHM_PID_IEEE_11K_HIGH)
156*4882a593Smuzhiyun 		init_11K_high_nhm(nhm_para, scan_time_ms);
157*4882a593Smuzhiyun 	else if (pid == NHM_PID_IEEE_11K_LOW)
158*4882a593Smuzhiyun 		init_11K_low_nhm(nhm_para, scan_time_ms);
159*4882a593Smuzhiyun 	else
160*4882a593Smuzhiyun 		init_acs_nhm(nhm_para, scan_time_ms);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	hal_data->acs.trig_rst = phydm_env_mntr_trigger(phydm, &nhm_para, &clm_para, &trig_rpt);
163*4882a593Smuzhiyun 	if (hal_data->acs.trig_rst == (NHM_SUCCESS | CLM_SUCCESS)) {
164*4882a593Smuzhiyun 		hal_data->acs.trig_rpt.clm_rpt_stamp = trig_rpt.clm_rpt_stamp;
165*4882a593Smuzhiyun 		hal_data->acs.trig_rpt.nhm_rpt_stamp = trig_rpt.nhm_rpt_stamp;
166*4882a593Smuzhiyun 		/*RTW_INFO("[ACS] trigger success (rst = 0x%02x, clm_stamp:%d, nhm_stamp:%d)\n",
167*4882a593Smuzhiyun 			hal_data->acs.trig_rst, hal_data->acs.trig_rpt.clm_rpt_stamp, hal_data->acs.trig_rpt.nhm_rpt_stamp);*/
168*4882a593Smuzhiyun 	} else
169*4882a593Smuzhiyun 		RTW_ERR("[ACS] trigger failed (rst = 0x%02x)\n", hal_data->acs.trig_rst);
170*4882a593Smuzhiyun #else
171*4882a593Smuzhiyun 	phydm_ccx_monitor_trigger(phydm, scan_time_ms);
172*4882a593Smuzhiyun #endif
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	hal_data->acs.trigger_ch = scan_chan;
175*4882a593Smuzhiyun 	hal_data->acs.triggered = _TRUE;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	#ifdef CONFIG_RTW_ACS_DBG
178*4882a593Smuzhiyun 	RTW_INFO("[ACS] Trigger CH:%d, Times:%d\n", hal_data->acs.trigger_ch, scan_time_ms);
179*4882a593Smuzhiyun 	#endif
180*4882a593Smuzhiyun }
rtw_acs_get_rst(_adapter * adapter)181*4882a593Smuzhiyun void rtw_acs_get_rst(_adapter *adapter)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
184*4882a593Smuzhiyun 	struct dm_struct *phydm = adapter_to_phydm(adapter);
185*4882a593Smuzhiyun 	int chan_idx = -1;
186*4882a593Smuzhiyun 	u8 cur_chan = hal_data->acs.trigger_ch;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	if (cur_chan == 0)
189*4882a593Smuzhiyun 		return;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	if (!hal_data->acs.triggered)
192*4882a593Smuzhiyun 		return;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	chan_idx = rtw_chset_search_ch(adapter_to_chset(adapter), cur_chan);
195*4882a593Smuzhiyun 	if ((chan_idx == -1) || (chan_idx >= MAX_CHANNEL_NUM)) {
196*4882a593Smuzhiyun 		RTW_ERR("[ACS] %s can't get chan_idx(CH:%d)\n", __func__, cur_chan);
197*4882a593Smuzhiyun 		return;
198*4882a593Smuzhiyun 	}
199*4882a593Smuzhiyun #if (RTK_ACS_VERSION == 3)
200*4882a593Smuzhiyun 	if (!(hal_data->acs.trig_rst == (NHM_SUCCESS | CLM_SUCCESS))) {
201*4882a593Smuzhiyun 		RTW_ERR("[ACS] get_rst return, due to acs trigger failed\n");
202*4882a593Smuzhiyun 		return;
203*4882a593Smuzhiyun 	}
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	{
206*4882a593Smuzhiyun 		struct env_mntr_rpt rpt = {0};
207*4882a593Smuzhiyun 		u8 rst;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 		rst = phydm_env_mntr_result(phydm, &rpt);
210*4882a593Smuzhiyun 		if ((rst == (NHM_SUCCESS | CLM_SUCCESS)) &&
211*4882a593Smuzhiyun 			(rpt.clm_rpt_stamp == hal_data->acs.trig_rpt.clm_rpt_stamp) &&
212*4882a593Smuzhiyun 			(rpt.nhm_rpt_stamp == hal_data->acs.trig_rpt.nhm_rpt_stamp)){
213*4882a593Smuzhiyun 			hal_data->acs.clm_ratio[chan_idx] = rpt.clm_ratio;
214*4882a593Smuzhiyun 			hal_data->acs.nhm_ratio[chan_idx] =  rpt.nhm_env_ratio;
215*4882a593Smuzhiyun 			hal_data->acs.env_mntr_rpt[chan_idx] = (rpt.nhm_noise_pwr -100);
216*4882a593Smuzhiyun 			_rtw_memcpy(&hal_data->acs.nhm[chan_idx][0], rpt.nhm_result, NHM_RPT_NUM);
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 			/*RTW_INFO("[ACS] get_rst success (rst = 0x%02x, clm_stamp:%d:%d, nhm_stamp:%d:%d)\n",
219*4882a593Smuzhiyun 			rst,
220*4882a593Smuzhiyun 			hal_data->acs.trig_rpt.clm_rpt_stamp, rpt.clm_rpt_stamp,
221*4882a593Smuzhiyun 			hal_data->acs.trig_rpt.nhm_rpt_stamp, rpt.nhm_rpt_stamp);*/
222*4882a593Smuzhiyun 		} else {
223*4882a593Smuzhiyun 			RTW_ERR("[ACS] get_rst failed (rst = 0x%02x, clm_stamp:%d:%d, nhm_stamp:%d:%d)\n",
224*4882a593Smuzhiyun 			rst,
225*4882a593Smuzhiyun 			hal_data->acs.trig_rpt.clm_rpt_stamp, rpt.clm_rpt_stamp,
226*4882a593Smuzhiyun 			hal_data->acs.trig_rpt.nhm_rpt_stamp, rpt.nhm_rpt_stamp);
227*4882a593Smuzhiyun 		}
228*4882a593Smuzhiyun 	}
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun #else
231*4882a593Smuzhiyun 	phydm_ccx_monitor_result(phydm);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	hal_data->acs.clm_ratio[chan_idx] = rtw_phydm_clm_ratio(adapter);
234*4882a593Smuzhiyun 	hal_data->acs.nhm_ratio[chan_idx] = rtw_phydm_nhm_ratio(adapter);
235*4882a593Smuzhiyun #endif
236*4882a593Smuzhiyun 	hal_data->acs.triggered = _FALSE;
237*4882a593Smuzhiyun 	#ifdef CONFIG_RTW_ACS_DBG
238*4882a593Smuzhiyun 	RTW_INFO("[ACS] Result CH:%d, CLM:%d NHM:%d\n",
239*4882a593Smuzhiyun 		cur_chan, hal_data->acs.clm_ratio[chan_idx], hal_data->acs.nhm_ratio[chan_idx]);
240*4882a593Smuzhiyun 	RTW_INFO("[ACS] Result NHM(dBm):%d\n",
241*4882a593Smuzhiyun 		hal_data->acs.env_mntr_rpt[chan_idx] );
242*4882a593Smuzhiyun 	#endif
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun 
_rtw_phydm_acs_select_best_chan(_adapter * adapter)245*4882a593Smuzhiyun void _rtw_phydm_acs_select_best_chan(_adapter *adapter)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
248*4882a593Smuzhiyun 	struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
249*4882a593Smuzhiyun 	u8 ch_idx;
250*4882a593Smuzhiyun 	u8 ch_idx_24g = 0xFF, ch_idx_5g = 0xFF;
251*4882a593Smuzhiyun 	u8 min_itf_24g = 0xFF,  min_itf_5g = 0xFF;
252*4882a593Smuzhiyun 	u8 *pbss_nums = hal_data->acs.bss_nums;
253*4882a593Smuzhiyun 	u8 *pclm_ratio = hal_data->acs.clm_ratio;
254*4882a593Smuzhiyun 	u8 *pnhm_ratio = hal_data->acs.nhm_ratio;
255*4882a593Smuzhiyun 	u8 *pinterference_time = hal_data->acs.interference_time;
256*4882a593Smuzhiyun 	u8 max_chan_nums = rfctl->max_chan_nums;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	for (ch_idx = 0; ch_idx < max_chan_nums; ch_idx++) {
259*4882a593Smuzhiyun 		if (pbss_nums[ch_idx])
260*4882a593Smuzhiyun 			pinterference_time[ch_idx] = (pclm_ratio[ch_idx] / 2) + (pnhm_ratio[ch_idx] / 2);
261*4882a593Smuzhiyun 		else
262*4882a593Smuzhiyun 			pinterference_time[ch_idx] = (pclm_ratio[ch_idx] / 3) + ((pnhm_ratio[ch_idx] * 2) / 3);
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 		if (rtw_get_ch_num_by_idx(adapter, ch_idx) < 14) {
265*4882a593Smuzhiyun 			if (pinterference_time[ch_idx] < min_itf_24g) {
266*4882a593Smuzhiyun 				min_itf_24g = pinterference_time[ch_idx];
267*4882a593Smuzhiyun 				ch_idx_24g = ch_idx;
268*4882a593Smuzhiyun 			}
269*4882a593Smuzhiyun 		} else {
270*4882a593Smuzhiyun 			if (pinterference_time[ch_idx] < min_itf_5g) {
271*4882a593Smuzhiyun 				min_itf_5g = pinterference_time[ch_idx];
272*4882a593Smuzhiyun 				ch_idx_5g = ch_idx;
273*4882a593Smuzhiyun 			}
274*4882a593Smuzhiyun 		}
275*4882a593Smuzhiyun 	}
276*4882a593Smuzhiyun 	if (ch_idx_24g != 0xFF)
277*4882a593Smuzhiyun 		hal_data->acs.best_chan_24g = rtw_get_ch_num_by_idx(adapter, ch_idx_24g);
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	if (ch_idx_5g != 0xFF)
280*4882a593Smuzhiyun 		hal_data->acs.best_chan_5g = rtw_get_ch_num_by_idx(adapter, ch_idx_5g);
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	hal_data->acs.trigger_ch = 0;
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun 
rtw_acs_info_dump(void * sel,_adapter * adapter)285*4882a593Smuzhiyun void rtw_acs_info_dump(void *sel, _adapter *adapter)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
288*4882a593Smuzhiyun 	struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
289*4882a593Smuzhiyun 	u8 max_chan_nums = rfctl->max_chan_nums;
290*4882a593Smuzhiyun 	u8 ch_idx, ch_num;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "========== ACS (VER-%d) ==========\n", RTK_ACS_VERSION);
293*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "Best 24G Channel:%d\n", hal_data->acs.best_chan_24g);
294*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "Best 5G Channel:%d\n\n", hal_data->acs.best_chan_5g);
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun 	#ifdef CONFIG_RTW_ACS_DBG
297*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "Advanced setting - scan_type:%c, ch_ms:%d(ms), igi:0x%02x, bw:%d\n",
298*4882a593Smuzhiyun 		hal_data->acs.scan_type ? 'A' : 'P', hal_data->acs.scan_time, hal_data->acs.igi, hal_data->acs.bw);
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "BW  20MHz\n");
301*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "%5s  %3s  %3s  %3s(%%)  %3s(%%)  %3s\n",
302*4882a593Smuzhiyun 						"Index", "CH", "BSS", "CLM", "NHM", "ITF");
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	for (ch_idx = 0; ch_idx < max_chan_nums; ch_idx++) {
305*4882a593Smuzhiyun 		ch_num = rtw_get_ch_num_by_idx(adapter, ch_idx);
306*4882a593Smuzhiyun 		_RTW_PRINT_SEL(sel, "%5d  %3d  %3d  %6d  %6d  %3d\n",
307*4882a593Smuzhiyun 						ch_idx, ch_num, hal_data->acs.bss_nums[ch_idx],
308*4882a593Smuzhiyun 						hal_data->acs.clm_ratio[ch_idx],
309*4882a593Smuzhiyun 						hal_data->acs.nhm_ratio[ch_idx],
310*4882a593Smuzhiyun 						hal_data->acs.interference_time[ch_idx]);
311*4882a593Smuzhiyun 	}
312*4882a593Smuzhiyun 	#endif
313*4882a593Smuzhiyun }
rtw_acs_select_best_chan(_adapter * adapter)314*4882a593Smuzhiyun void rtw_acs_select_best_chan(_adapter *adapter)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	_rtw_bss_nums_count(adapter, hal_data->acs.bss_nums);
319*4882a593Smuzhiyun 	_rtw_phydm_acs_select_best_chan(adapter);
320*4882a593Smuzhiyun 	rtw_acs_info_dump(RTW_DBGDUMP, adapter);
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun 
rtw_acs_start(_adapter * adapter)323*4882a593Smuzhiyun void rtw_acs_start(_adapter *adapter)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun 	rtw_acs_reset(adapter);
326*4882a593Smuzhiyun 	if (GET_ACS_STATE(adapter) != ACS_ENABLE)
327*4882a593Smuzhiyun 		SET_ACS_STATE(adapter, ACS_ENABLE);
328*4882a593Smuzhiyun }
rtw_acs_stop(_adapter * adapter)329*4882a593Smuzhiyun void rtw_acs_stop(_adapter *adapter)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	SET_ACS_STATE(adapter, ACS_DISABLE);
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 
rtw_acs_get_clm_ratio_by_ch_num(_adapter * adapter,u8 chan)335*4882a593Smuzhiyun u8 rtw_acs_get_clm_ratio_by_ch_num(_adapter *adapter, u8 chan)
336*4882a593Smuzhiyun {
337*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
338*4882a593Smuzhiyun 	int chan_idx = -1;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	chan_idx = rtw_chset_search_ch(adapter_to_chset(adapter), chan);
341*4882a593Smuzhiyun 	if ((chan_idx == -1) || (chan_idx >= MAX_CHANNEL_NUM)) {
342*4882a593Smuzhiyun 		RTW_ERR("[ACS] Get CLM fail, can't get chan_idx(CH:%d)\n", chan);
343*4882a593Smuzhiyun 		return 0;
344*4882a593Smuzhiyun 	}
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun 	return hal_data->acs.clm_ratio[chan_idx];
347*4882a593Smuzhiyun }
rtw_acs_get_clm_ratio_by_ch_idx(_adapter * adapter,u8 ch_idx)348*4882a593Smuzhiyun u8 rtw_acs_get_clm_ratio_by_ch_idx(_adapter *adapter, u8 ch_idx)
349*4882a593Smuzhiyun {
350*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 	if (ch_idx >= MAX_CHANNEL_NUM) {
353*4882a593Smuzhiyun 		RTW_ERR("%s [ACS] ch_idx(%d) is invalid\n", __func__, ch_idx);
354*4882a593Smuzhiyun 		return 0;
355*4882a593Smuzhiyun 	}
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	return hal_data->acs.clm_ratio[ch_idx];
358*4882a593Smuzhiyun }
rtw_acs_get_nhm_ratio_by_ch_num(_adapter * adapter,u8 chan)359*4882a593Smuzhiyun u8 rtw_acs_get_nhm_ratio_by_ch_num(_adapter *adapter, u8 chan)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
362*4882a593Smuzhiyun 	int chan_idx = -1;
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	chan_idx = rtw_chset_search_ch(adapter_to_chset(adapter), chan);
365*4882a593Smuzhiyun 	if ((chan_idx == -1) || (chan_idx >= MAX_CHANNEL_NUM)) {
366*4882a593Smuzhiyun 		RTW_ERR("[ACS] Get NHM fail, can't get chan_idx(CH:%d)\n", chan);
367*4882a593Smuzhiyun 		return 0;
368*4882a593Smuzhiyun 	}
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	return hal_data->acs.nhm_ratio[chan_idx];
371*4882a593Smuzhiyun }
rtw_acs_get_nhm_noise_pwr_by_ch_idx(_adapter * adapter,u8 ch_idx)372*4882a593Smuzhiyun u8 rtw_acs_get_nhm_noise_pwr_by_ch_idx(_adapter *adapter, u8 ch_idx)
373*4882a593Smuzhiyun {
374*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	if (ch_idx >= MAX_CHANNEL_NUM) {
377*4882a593Smuzhiyun 		RTW_ERR("%s [ACS] ch_idx(%d) is invalid\n", __func__, ch_idx);
378*4882a593Smuzhiyun 		return 0;
379*4882a593Smuzhiyun 	}
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	return hal_data->acs.env_mntr_rpt[ch_idx];
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun 
rtw_acs_get_num_ratio_by_ch_idx(_adapter * adapter,u8 ch_idx)384*4882a593Smuzhiyun u8 rtw_acs_get_num_ratio_by_ch_idx(_adapter *adapter, u8 ch_idx)
385*4882a593Smuzhiyun {
386*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	if (ch_idx >= MAX_CHANNEL_NUM) {
389*4882a593Smuzhiyun 		RTW_ERR("%s [ACS] ch_idx(%d) is invalid\n", __func__, ch_idx);
390*4882a593Smuzhiyun 		return 0;
391*4882a593Smuzhiyun 	}
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 	return hal_data->acs.nhm_ratio[ch_idx];
394*4882a593Smuzhiyun }
rtw_acs_chan_info_dump(void * sel,_adapter * adapter)395*4882a593Smuzhiyun void rtw_acs_chan_info_dump(void *sel, _adapter *adapter)
396*4882a593Smuzhiyun {
397*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
398*4882a593Smuzhiyun 	struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
399*4882a593Smuzhiyun 	u8 max_chan_nums = rfctl->max_chan_nums;
400*4882a593Smuzhiyun 	u8 ch_idx, ch_num;
401*4882a593Smuzhiyun 	u8 utilization;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "BW  20MHz\n");
404*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "%5s  %3s  %7s(%%)  %12s(%%)  %11s(%%)  %9s(%%)  %8s(%%)\n",
405*4882a593Smuzhiyun 						"Index", "CH", "Quality", "Availability", "Utilization",
406*4882a593Smuzhiyun 						"WIFI Util", "Interference Util");
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	for (ch_idx = 0; ch_idx < max_chan_nums; ch_idx++) {
409*4882a593Smuzhiyun 		ch_num = rtw_get_ch_num_by_idx(adapter, ch_idx);
410*4882a593Smuzhiyun 		utilization = hal_data->acs.clm_ratio[ch_idx] + hal_data->acs.nhm_ratio[ch_idx];
411*4882a593Smuzhiyun 		_RTW_PRINT_SEL(sel, "%5d  %3d  %7d   %12d   %12d   %12d   %12d\n",
412*4882a593Smuzhiyun 						ch_idx, ch_num,
413*4882a593Smuzhiyun 						(100-hal_data->acs.interference_time[ch_idx]),
414*4882a593Smuzhiyun 						(100-utilization),
415*4882a593Smuzhiyun 						utilization,
416*4882a593Smuzhiyun 						hal_data->acs.clm_ratio[ch_idx],
417*4882a593Smuzhiyun 						hal_data->acs.nhm_ratio[ch_idx]);
418*4882a593Smuzhiyun 	}
419*4882a593Smuzhiyun }
rtw_acs_current_info_dump(void * sel,_adapter * adapter)420*4882a593Smuzhiyun void rtw_acs_current_info_dump(void *sel, _adapter *adapter)
421*4882a593Smuzhiyun {
422*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
423*4882a593Smuzhiyun 	u8 ch, cen_ch, bw, offset;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "========== ACS (VER-%d) ==========\n", RTK_ACS_VERSION);
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	ch = rtw_get_oper_ch(adapter);
428*4882a593Smuzhiyun 	bw = rtw_get_oper_bw(adapter);
429*4882a593Smuzhiyun 	offset = rtw_get_oper_choffset(adapter);
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "Current Channel:%d\n", ch);
432*4882a593Smuzhiyun 	if ((bw == CHANNEL_WIDTH_80) ||(bw == CHANNEL_WIDTH_40)) {
433*4882a593Smuzhiyun 		cen_ch = rtw_get_center_ch(ch, bw, offset);
434*4882a593Smuzhiyun 		_RTW_PRINT_SEL(sel, "Center Channel:%d\n", cen_ch);
435*4882a593Smuzhiyun 	}
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "Current BW %s\n", ch_width_str(bw));
438*4882a593Smuzhiyun 	if (0)
439*4882a593Smuzhiyun 		_RTW_PRINT_SEL(sel, "Current IGI 0x%02x\n", rtw_phydm_get_cur_igi(adapter));
440*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "CLM:%d, NHM:%d\n\n",
441*4882a593Smuzhiyun 		hal_data->acs.cur_ch_clm_ratio, hal_data->acs.cur_ch_nhm_ratio);
442*4882a593Smuzhiyun }
443*4882a593Smuzhiyun 
rtw_acs_update_current_info(_adapter * adapter)444*4882a593Smuzhiyun void rtw_acs_update_current_info(_adapter *adapter)
445*4882a593Smuzhiyun {
446*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 	hal_data->acs.cur_ch_clm_ratio = rtw_phydm_clm_ratio(adapter);
449*4882a593Smuzhiyun 	hal_data->acs.cur_ch_nhm_ratio = rtw_phydm_nhm_ratio(adapter);
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	#ifdef CONFIG_RTW_ACS_DBG
452*4882a593Smuzhiyun 	rtw_acs_current_info_dump(RTW_DBGDUMP, adapter);
453*4882a593Smuzhiyun 	#endif
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun /*
456*4882a593Smuzhiyun rsni
457*4882a593Smuzhiyun para1:rcpi=>RSSI in dbm
458*4882a593Smuzhiyun para2:anpi=>nhm in dbm
459*4882a593Smuzhiyun range:0~255
460*4882a593Smuzhiyun 255: is not available (defined by 802.11k spec)
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun */
rtw_acs_get_rsni(_adapter * adapter,s8 rcpi,u8 ch)463*4882a593Smuzhiyun u8 rtw_acs_get_rsni(_adapter *adapter, s8 rcpi, u8 ch)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun 	struct dm_struct *phydm = adapter_to_phydm(adapter);
466*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
467*4882a593Smuzhiyun 	u8 rsni = 255;
468*4882a593Smuzhiyun 	s8 anpi = 0;
469*4882a593Smuzhiyun 	int chan_idx = -1;
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	if(ch == 0)
472*4882a593Smuzhiyun 		goto exit;
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	chan_idx = rtw_chset_search_ch(adapter_to_chset(adapter), ch);
475*4882a593Smuzhiyun 	if(chan_idx == -1)
476*4882a593Smuzhiyun 		goto exit;
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 	anpi = rtw_acs_get_nhm_noise_pwr_by_ch_idx(adapter, chan_idx);
479*4882a593Smuzhiyun 	if((rcpi != 0) && (anpi != 0))
480*4882a593Smuzhiyun 	 	rsni = phydm_env_mntr_get_802_11_k_rsni(phydm, rcpi, anpi);
481*4882a593Smuzhiyun 	RTW_DBG("[ACS][RSNI]ch=%d chan_idx=%d RSNI=%u RSSI=%d NHM=%d\n", ch, chan_idx, rsni,rcpi, anpi);
482*4882a593Smuzhiyun exit:
483*4882a593Smuzhiyun 	return rsni;
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun #endif /*CONFIG_RTW_ACS*/
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun #ifdef CONFIG_BACKGROUND_NOISE_MONITOR
rtw_noise_monitor_version_dump(void * sel,_adapter * adapter)488*4882a593Smuzhiyun void rtw_noise_monitor_version_dump(void *sel, _adapter *adapter)
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "RTK_NOISE_MONITOR VER_%d\n", RTK_NOISE_MONITOR_VERSION);
491*4882a593Smuzhiyun }
rtw_nm_enable(_adapter * adapter)492*4882a593Smuzhiyun void rtw_nm_enable(_adapter *adapter)
493*4882a593Smuzhiyun {
494*4882a593Smuzhiyun 	SET_NM_STATE(adapter, NM_ENABLE);
495*4882a593Smuzhiyun }
rtw_nm_disable(_adapter * adapter)496*4882a593Smuzhiyun void rtw_nm_disable(_adapter *adapter)
497*4882a593Smuzhiyun {
498*4882a593Smuzhiyun 	SET_NM_STATE(adapter, NM_DISABLE);
499*4882a593Smuzhiyun }
rtw_noise_info_dump(void * sel,_adapter * adapter)500*4882a593Smuzhiyun void rtw_noise_info_dump(void *sel, _adapter *adapter)
501*4882a593Smuzhiyun {
502*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
503*4882a593Smuzhiyun 	struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
504*4882a593Smuzhiyun 	u8 max_chan_nums = rfctl->max_chan_nums;
505*4882a593Smuzhiyun 	u8 ch_idx, ch_num;
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "========== NM (VER-%d) ==========\n", RTK_NOISE_MONITOR_VERSION);
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	_RTW_PRINT_SEL(sel, "%5s  %3s  %3s  %10s", "Index", "CH", "BSS", "Noise(dBm)\n");
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 	_rtw_bss_nums_count(adapter, hal_data->nm.bss_nums);
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 	for (ch_idx = 0; ch_idx < max_chan_nums; ch_idx++) {
514*4882a593Smuzhiyun 		ch_num = rtw_get_ch_num_by_idx(adapter, ch_idx);
515*4882a593Smuzhiyun 		_RTW_PRINT_SEL(sel, "%5d  %3d  %3d  %10d\n",
516*4882a593Smuzhiyun 						ch_idx, ch_num, hal_data->nm.bss_nums[ch_idx],
517*4882a593Smuzhiyun 						hal_data->nm.noise[ch_idx]);
518*4882a593Smuzhiyun 	}
519*4882a593Smuzhiyun }
520*4882a593Smuzhiyun 
rtw_noise_measure(_adapter * adapter,u8 chan,u8 is_pause_dig,u8 igi_value,u32 max_time)521*4882a593Smuzhiyun void rtw_noise_measure(_adapter *adapter, u8 chan, u8 is_pause_dig, u8 igi_value, u32 max_time)
522*4882a593Smuzhiyun {
523*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
524*4882a593Smuzhiyun 	struct dm_struct *phydm = &hal_data->odmpriv;
525*4882a593Smuzhiyun 	int chan_idx = -1;
526*4882a593Smuzhiyun 	s16 noise = 0;
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun 	#ifdef DBG_NOISE_MONITOR
529*4882a593Smuzhiyun 	RTW_INFO("[NM] chan(%d)-PauseDIG:%s,  IGIValue:0x%02x, max_time:%d (ms)\n",
530*4882a593Smuzhiyun 		chan, (is_pause_dig) ? "Y" : "N", igi_value, max_time);
531*4882a593Smuzhiyun 	#endif
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun 	chan_idx = rtw_chset_search_ch(adapter_to_chset(adapter), chan);
534*4882a593Smuzhiyun 	if ((chan_idx == -1) || (chan_idx >= MAX_CHANNEL_NUM)) {
535*4882a593Smuzhiyun 		RTW_ERR("[NM] Get noise fail, can't get chan_idx(CH:%d)\n", chan);
536*4882a593Smuzhiyun 		return;
537*4882a593Smuzhiyun 	}
538*4882a593Smuzhiyun 	noise = odm_inband_noise_monitor(phydm, is_pause_dig, igi_value, max_time); /*dBm*/
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	hal_data->nm.noise[chan_idx] = noise;
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 	#ifdef DBG_NOISE_MONITOR
543*4882a593Smuzhiyun 	RTW_INFO("[NM] %s chan_%d, noise = %d (dBm)\n", __func__, chan, hal_data->nm.noise[chan_idx]);
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun 	RTW_INFO("[NM] noise_a = %d, noise_b = %d  noise_all:%d\n",
546*4882a593Smuzhiyun 			 phydm->noise_level.noise[RF_PATH_A],
547*4882a593Smuzhiyun 			 phydm->noise_level.noise[RF_PATH_B],
548*4882a593Smuzhiyun 			 phydm->noise_level.noise_all);
549*4882a593Smuzhiyun 	#endif /*DBG_NOISE_MONITOR*/
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun 
rtw_noise_query_by_chan_num(_adapter * adapter,u8 chan)552*4882a593Smuzhiyun s16 rtw_noise_query_by_chan_num(_adapter *adapter, u8 chan)
553*4882a593Smuzhiyun {
554*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
555*4882a593Smuzhiyun 	s16 noise = 0;
556*4882a593Smuzhiyun 	int chan_idx = -1;
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	chan_idx = rtw_chset_search_ch(adapter_to_chset(adapter), chan);
559*4882a593Smuzhiyun 	if ((chan_idx == -1) || (chan_idx >= MAX_CHANNEL_NUM)) {
560*4882a593Smuzhiyun 		RTW_ERR("[NM] Get noise fail, can't get chan_idx(CH:%d)\n", chan);
561*4882a593Smuzhiyun 		return noise;
562*4882a593Smuzhiyun 	}
563*4882a593Smuzhiyun 	noise = hal_data->nm.noise[chan_idx];
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun 	#ifdef DBG_NOISE_MONITOR
566*4882a593Smuzhiyun 	RTW_INFO("[NM] %s chan_%d, noise = %d (dBm)\n", __func__, chan, noise);
567*4882a593Smuzhiyun 	#endif/*DBG_NOISE_MONITOR*/
568*4882a593Smuzhiyun 	return noise;
569*4882a593Smuzhiyun }
rtw_noise_query_by_chan_idx(_adapter * adapter,u8 ch_idx)570*4882a593Smuzhiyun s16 rtw_noise_query_by_chan_idx(_adapter *adapter, u8 ch_idx)
571*4882a593Smuzhiyun {
572*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
573*4882a593Smuzhiyun 	s16 noise = 0;
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 	if (ch_idx >= MAX_CHANNEL_NUM) {
576*4882a593Smuzhiyun 		RTW_ERR("[NM] %s ch_idx(%d) is invalid\n", __func__, ch_idx);
577*4882a593Smuzhiyun 		return noise;
578*4882a593Smuzhiyun 	}
579*4882a593Smuzhiyun 	noise = hal_data->nm.noise[ch_idx];
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	#ifdef DBG_NOISE_MONITOR
582*4882a593Smuzhiyun 	RTW_INFO("[NM] %s ch_idx %d, noise = %d (dBm)\n", __func__, ch_idx, noise);
583*4882a593Smuzhiyun 	#endif/*DBG_NOISE_MONITOR*/
584*4882a593Smuzhiyun 	return noise;
585*4882a593Smuzhiyun }
586*4882a593Smuzhiyun 
rtw_noise_measure_curchan(_adapter * padapter)587*4882a593Smuzhiyun s16 rtw_noise_measure_curchan(_adapter *padapter)
588*4882a593Smuzhiyun {
589*4882a593Smuzhiyun 	s16 noise = 0;
590*4882a593Smuzhiyun 	u8 igi_value = 0x1E;
591*4882a593Smuzhiyun 	u32 max_time = 100;/* ms */
592*4882a593Smuzhiyun 	u8 is_pause_dig = _TRUE;
593*4882a593Smuzhiyun 	u8 cur_chan = rtw_get_oper_ch(padapter);
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun 	if (rtw_linked_check(padapter) == _FALSE)
596*4882a593Smuzhiyun 		return noise;
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun 	rtw_ps_deny(padapter, PS_DENY_IOCTL);
599*4882a593Smuzhiyun 	LeaveAllPowerSaveModeDirect(padapter);
600*4882a593Smuzhiyun 	rtw_noise_measure(padapter, cur_chan, is_pause_dig, igi_value, max_time);
601*4882a593Smuzhiyun 	noise = rtw_noise_query_by_chan_num(padapter, cur_chan);
602*4882a593Smuzhiyun 	rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun 	return noise;
605*4882a593Smuzhiyun }
606*4882a593Smuzhiyun #endif /*CONFIG_BACKGROUND_NOISE_MONITOR*/
607*4882a593Smuzhiyun 
608