1 /******************************************************************************
3 * Copyright(c) 2007 - 2017 Realtek Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 *****************************************************************************/
16 /*============================================================
18 *============================================================
20 #include "mp_precomp.h"
21 #include "phydm_precomp.h"
23 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
31 /*for (i = sizeof(n) * 8 - 2; i > -1; i = i - 2) {*/
32 for (i = 8 * 8 - 2; i > -1; i = i - 2) {
33 q = (q << 2) | ((n & (3 << i)) >> i);
34 if (q >= ((ans << 2) | 1))
36 q = q - ((ans << 2) | 1);
42 DbgPrint("ans=0x%x\n", ans);
54 u64 mid = (i + j) / 2;
69 u32 halrf_get_psd_data(
73 struct _hal_rf_ *rf = &(dm->rf_table);
74 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
75 u32 psd_val = 0, psd_reg, psd_report, psd_point, psd_start, i, delay_time;
77 #if (DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)
78 if (psd->average == 0)
83 if (psd->average == 0)
89 if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C)) {
97 if (dm->support_ic_type & ODM_RTL8710B) {
98 psd_point = 0xeffffc00;
99 psd_start = 0x10000000;
101 psd_point = 0xffbffc00;
102 psd_start = 0x00400000;
105 psd_val = odm_get_bb_reg(dm, psd_reg, MASKDWORD);
107 psd_val &= psd_point;
110 odm_set_bb_reg(dm, psd_reg, MASKDWORD, psd_val);
112 psd_val |= psd_start;
114 odm_set_bb_reg(dm, psd_reg, MASKDWORD, psd_val);
116 for (i = 0; i < delay_time; i++)
119 psd_val = odm_get_bb_reg(dm, psd_report, MASKDWORD);
121 if (dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8710B)) {
122 psd_val &= MASKL3BYTES;
123 psd_val = psd_val / 32;
125 psd_val &= MASKLWORD;
132 struct dm_struct *dm,
138 struct _hal_rf_ *rf = &(dm->rf_table);
139 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
141 u32 i = 0, j = 0, k = 0;
142 u32 psd_reg, avg_org, point_temp, average_tmp;
143 u64 data_tatal = 0, data_temp[64] = {0};
150 average_tmp = average;
152 if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
158 dbg_print("[PSD]point=%d, start_point=%d, stop_point=%d, average=%d, average_tmp=%d, buf_size=%d\n",
159 point, start_point, stop_point, average, average_tmp, psd->buf_size);
162 for (i = 0; i < psd->buf_size; i++)
163 psd->psd_data[i] = 0;
165 if (dm->support_ic_type & ODM_RTL8710B)
166 avg_org = odm_get_bb_reg(dm, psd_reg, 0x30000);
168 avg_org = odm_get_bb_reg(dm, psd_reg, 0x3000);
171 if (dm->support_ic_type & ODM_RTL8710B)
172 odm_set_bb_reg(dm, psd_reg, 0x30000, 0x1);
174 odm_set_bb_reg(dm, psd_reg, 0x3000, 0x1);
180 else if (avg_temp == 1)
182 else if (avg_temp == 2)
184 else if (avg_temp == 3)
189 while (i < stop_point) {
193 point_temp = i - point;
197 for (k = 0; k < average_tmp; k++) {
198 data_temp[k] = halrf_get_psd_data(dm, point_temp);
199 data_tatal = data_tatal + (data_temp[k] * data_temp[k]);
205 dbg_print("0x%x ", data_temp[k]);
210 data_tatal = ((data_tatal * 100) / average_tmp);
211 psd->psd_data[j] = (u32)_sqrt(data_tatal);
218 for (i = 0; i < psd->buf_size; i++) {
222 dbg_print("0x%x ", psd->psd_data[i]);
227 if (dm->support_ic_type & ODM_RTL8710B)
228 odm_set_bb_reg(dm, psd_reg, 0x30000, avg_org);
230 odm_set_bb_reg(dm, psd_reg, 0x3000, avg_org);
235 struct dm_struct *dm)
237 enum rt_status ret_status = RT_STATUS_SUCCESS;
238 struct _hal_rf_ *rf = &(dm->rf_table);
239 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
241 if (psd->psd_progress) {
242 ret_status = RT_STATUS_PENDING;
244 psd->psd_progress = 1;
245 halrf_psd(dm, psd->point, psd->start_point, psd->stop_point, psd->average);
246 psd->psd_progress = 0;
254 struct dm_struct *dm,
258 enum rt_status ret_status = RT_STATUS_SUCCESS;
259 struct _hal_rf_ *rf = &(dm->rf_table);
260 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
262 if (psd->psd_progress)
263 ret_status = RT_STATUS_PENDING;
265 PlatformMoveMemory(outbuf, psd->psd_data, 0x400);
271 halrf_psd_init_query(
272 struct dm_struct *dm,
280 enum rt_status ret_status = RT_STATUS_SUCCESS;
281 struct _hal_rf_ *rf = &(dm->rf_table);
282 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
285 psd->start_point = start_point;
286 psd->stop_point = stop_point;
287 psd->average = average;
289 if (psd->psd_progress) {
290 ret_status = RT_STATUS_PENDING;
292 psd->psd_progress = 1;
293 halrf_psd(dm, psd->point, psd->start_point, psd->stop_point, psd->average);
294 PlatformMoveMemory(outbuf, psd->psd_data, 0x400);
295 psd->psd_progress = 0;
301 #endif /*#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)*/