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