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 * The full GNU General Public License is included in this distribution in the
15*4882a593Smuzhiyun * file called LICENSE.
16*4882a593Smuzhiyun *
17*4882a593Smuzhiyun * Contact Information:
18*4882a593Smuzhiyun * wlanfae <wlanfae@realtek.com>
19*4882a593Smuzhiyun * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20*4882a593Smuzhiyun * Hsinchu 300, Taiwan.
21*4882a593Smuzhiyun *
22*4882a593Smuzhiyun * Larry Finger <Larry.Finger@lwfinger.net>
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun *****************************************************************************/
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun /*@************************************************************
27*4882a593Smuzhiyun * include files
28*4882a593Smuzhiyun ************************************************************/
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #include "mp_precomp.h"
31*4882a593Smuzhiyun #include "phydm_precomp.h"
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #ifdef PHYDM_COMPILE_MU
phydm_get_gid(struct dm_struct * dm,u8 * phy_status_inf)34*4882a593Smuzhiyun u8 phydm_get_gid(struct dm_struct *dm, u8 *phy_status_inf)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
37*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type1 *rpt_jgr2 = NULL;
38*4882a593Smuzhiyun #endif
39*4882a593Smuzhiyun #ifdef PHYSTS_3RD_TYPE_SUPPORT
40*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type1 *rpt_jgr3 = NULL;
41*4882a593Smuzhiyun #endif
42*4882a593Smuzhiyun u8 gid = 0;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun if (dm->ic_phy_sts_type == PHYDM_PHYSTS_TYPE_1)
45*4882a593Smuzhiyun return 0;
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun if ((*phy_status_inf & 0xf) != 1)
48*4882a593Smuzhiyun return 0;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun switch (dm->ic_phy_sts_type) {
51*4882a593Smuzhiyun #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
52*4882a593Smuzhiyun case PHYDM_PHYSTS_TYPE_2:
53*4882a593Smuzhiyun rpt_jgr2 = (struct phy_sts_rpt_jgr2_type1 *)phy_status_inf;
54*4882a593Smuzhiyun gid = rpt_jgr2->gid;
55*4882a593Smuzhiyun break;
56*4882a593Smuzhiyun #endif
57*4882a593Smuzhiyun #ifdef PHYSTS_3RD_TYPE_SUPPORT
58*4882a593Smuzhiyun case PHYDM_PHYSTS_TYPE_3:
59*4882a593Smuzhiyun rpt_jgr3 = (struct phy_sts_rpt_jgr3_type1 *)phy_status_inf;
60*4882a593Smuzhiyun gid = rpt_jgr3->gid;
61*4882a593Smuzhiyun break;
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun default:
64*4882a593Smuzhiyun break;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun return gid;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun #endif
70*4882a593Smuzhiyun
phydm_rx_statistic_cal(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo)71*4882a593Smuzhiyun void phydm_rx_statistic_cal(struct dm_struct *dm,
72*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
73*4882a593Smuzhiyun u8 *phy_status_inf,
74*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
79*4882a593Smuzhiyun struct phydm_bf_rate_info_jgr3 *bfrateinfo = &dm->bf_rate_info_jgr3;
80*4882a593Smuzhiyun #endif
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun u8 rate = (pktinfo->data_rate & 0x7f);
83*4882a593Smuzhiyun u8 bw_idx = phy_info->band_width;
84*4882a593Smuzhiyun u8 offset = 0;
85*4882a593Smuzhiyun u8 gid = 0;
86*4882a593Smuzhiyun #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT || defined(PHYSTS_3RD_TYPE_SUPPORT))
87*4882a593Smuzhiyun u8 val = 0;
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun #ifdef PHYDM_COMPILE_MU
90*4882a593Smuzhiyun u8 is_mu_pkt = 0;
91*4882a593Smuzhiyun #endif
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun if (rate <= ODM_RATE54M) {
94*4882a593Smuzhiyun dbg_i->num_qry_legacy_pkt[rate]++;
95*4882a593Smuzhiyun } else if (rate <= ODM_RATEMCS31) {
96*4882a593Smuzhiyun dbg_i->ht_pkt_not_zero = true;
97*4882a593Smuzhiyun offset = rate - ODM_RATEMCS0;
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun if (offset > (HT_RATE_NUM - 1))
100*4882a593Smuzhiyun offset = HT_RATE_NUM - 1;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun if (dm->support_ic_type &
103*4882a593Smuzhiyun (PHYSTS_2ND_TYPE_IC | PHYSTS_3RD_TYPE_IC)) {
104*4882a593Smuzhiyun if (bw_idx == *dm->band_width) {
105*4882a593Smuzhiyun dbg_i->num_qry_ht_pkt[offset]++;
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun } else if (bw_idx == CHANNEL_WIDTH_20) {
108*4882a593Smuzhiyun dbg_i->num_qry_pkt_sc_20m[offset]++;
109*4882a593Smuzhiyun dbg_i->low_bw_20_occur = true;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun } else {
112*4882a593Smuzhiyun dbg_i->num_qry_ht_pkt[offset]++;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun #if (ODM_IC_11AC_SERIES_SUPPORT || defined(PHYSTS_3RD_TYPE_SUPPORT))
116*4882a593Smuzhiyun else if (rate <= ODM_RATEVHTSS4MCS9) {
117*4882a593Smuzhiyun offset = rate - ODM_RATEVHTSS1MCS0;
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun if (offset > (VHT_RATE_NUM - 1))
120*4882a593Smuzhiyun offset = VHT_RATE_NUM - 1;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun #ifdef PHYDM_COMPILE_MU
123*4882a593Smuzhiyun gid = phydm_get_gid(dm, phy_status_inf);
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun if (gid != 0 && gid != 63)
126*4882a593Smuzhiyun is_mu_pkt = true;
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun if (is_mu_pkt) {
129*4882a593Smuzhiyun #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT ||\
130*4882a593Smuzhiyun (defined(PHYSTS_3RD_TYPE_SUPPORT)))
131*4882a593Smuzhiyun dbg_i->num_mu_vht_pkt[offset]++;
132*4882a593Smuzhiyun #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
133*4882a593Smuzhiyun bfrateinfo->num_mu_vht_pkt[offset]++;
134*4882a593Smuzhiyun #endif
135*4882a593Smuzhiyun #else
136*4882a593Smuzhiyun dbg_i->num_qry_vht_pkt[offset]++; /*@for debug*/
137*4882a593Smuzhiyun #endif
138*4882a593Smuzhiyun } else
139*4882a593Smuzhiyun #endif
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun dbg_i->vht_pkt_not_zero = true;
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun if (dm->support_ic_type &
144*4882a593Smuzhiyun (PHYSTS_2ND_TYPE_IC | PHYSTS_3RD_TYPE_IC)) {
145*4882a593Smuzhiyun if (bw_idx == *dm->band_width) {
146*4882a593Smuzhiyun dbg_i->num_qry_vht_pkt[offset]++;
147*4882a593Smuzhiyun #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
148*4882a593Smuzhiyun bfrateinfo->num_qry_vht_pkt[offset]++;
149*4882a593Smuzhiyun #endif
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun } else if (bw_idx == CHANNEL_WIDTH_20) {
152*4882a593Smuzhiyun dbg_i->num_qry_pkt_sc_20m[offset]++;
153*4882a593Smuzhiyun dbg_i->low_bw_20_occur = true;
154*4882a593Smuzhiyun } else {/*@if (bw_idx == CHANNEL_WIDTH_40)*/
155*4882a593Smuzhiyun dbg_i->num_qry_pkt_sc_40m[offset]++;
156*4882a593Smuzhiyun dbg_i->low_bw_40_occur = true;
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun } else {
159*4882a593Smuzhiyun dbg_i->num_qry_vht_pkt[offset]++;
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT ||\
164*4882a593Smuzhiyun (defined(PHYSTS_3RD_TYPE_SUPPORT)))
165*4882a593Smuzhiyun if (pktinfo->ppdu_cnt < 4) {
166*4882a593Smuzhiyun val = rate;
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun #ifdef PHYDM_COMPILE_MU
169*4882a593Smuzhiyun if (is_mu_pkt)
170*4882a593Smuzhiyun val |= BIT(7);
171*4882a593Smuzhiyun #endif
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun dbg_i->num_of_ppdu[pktinfo->ppdu_cnt] = val;
174*4882a593Smuzhiyun dbg_i->gid_num[pktinfo->ppdu_cnt] = gid;
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun #endif
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun #endif
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
phydm_reset_phystatus_avg(struct dm_struct * dm)181*4882a593Smuzhiyun void phydm_reset_phystatus_avg(struct dm_struct *dm)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun struct phydm_phystatus_avg *dbg_avg = NULL;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun dbg_avg = &dm->phy_dbg_info.phystatus_statistic_avg;
186*4882a593Smuzhiyun odm_memory_set(dm, &dbg_avg->rssi_cck_avg, 0,
187*4882a593Smuzhiyun sizeof(struct phydm_phystatus_avg));
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun
phydm_reset_phystatus_statistic(struct dm_struct * dm)190*4882a593Smuzhiyun void phydm_reset_phystatus_statistic(struct dm_struct *dm)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun struct phydm_phystatus_statistic *dbg_s = NULL;
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun dbg_s = &dm->phy_dbg_info.physts_statistic_info;
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun odm_memory_set(dm, &dbg_s->rssi_cck_sum, 0,
197*4882a593Smuzhiyun sizeof(struct phydm_phystatus_statistic));
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun
phydm_reset_phy_info(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info)200*4882a593Smuzhiyun void phydm_reset_phy_info(struct dm_struct *dm,
201*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun u8 i = 0;
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun odm_memory_set(dm, &phy_info->physts_rpt_valid, 0,
206*4882a593Smuzhiyun sizeof(struct phydm_phyinfo_struct));
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun phy_info->rx_power = -110;
209*4882a593Smuzhiyun phy_info->recv_signal_power = -110;
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun for (i = 0; i < dm->num_rf_path; i++)
212*4882a593Smuzhiyun phy_info->rx_pwr[i] = -110;
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun
phydm_avg_rssi_evm_snr(void * dm_void,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)215*4882a593Smuzhiyun void phydm_avg_rssi_evm_snr(void *dm_void,
216*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
217*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
220*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
221*4882a593Smuzhiyun struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;
222*4882a593Smuzhiyun u8 *rssi = phy_info->rx_mimo_signal_strength;
223*4882a593Smuzhiyun u8 *evm = phy_info->rx_mimo_evm_dbm;
224*4882a593Smuzhiyun s8 *snr = phy_info->rx_snr;
225*4882a593Smuzhiyun u32 size = PHYSTS_PATH_NUM; /*size of path=4*/
226*4882a593Smuzhiyun u16 size_th = PHY_HIST_SIZE - 1; /*size of threshold*/
227*4882a593Smuzhiyun u16 val = 0, intvl = 0;
228*4882a593Smuzhiyun u8 i = 0;
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun if (pktinfo->is_packet_beacon) {
231*4882a593Smuzhiyun for (i = 0; i < dm->num_rf_path; i++)
232*4882a593Smuzhiyun dbg_s->rssi_beacon_sum[i] += rssi[i];
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun dbg_s->rssi_beacon_cnt++;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun if (pktinfo->data_rate <= ODM_RATE11M) {
238*4882a593Smuzhiyun /*RSSI*/
239*4882a593Smuzhiyun dbg_s->rssi_cck_sum += rssi[0];
240*4882a593Smuzhiyun #if (defined(PHYSTS_3RD_TYPE_SUPPORT) && defined(PHYDM_COMPILE_ABOVE_2SS))
241*4882a593Smuzhiyun if (dm->support_ic_type & PHYSTS_3RD_TYPE_IC) {
242*4882a593Smuzhiyun for (i = 1; i < dm->num_rf_path; i++)
243*4882a593Smuzhiyun dbg_s->rssi_cck_sum_abv_2ss[i - 1] += rssi[i];
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun #endif
246*4882a593Smuzhiyun dbg_s->rssi_cck_cnt++;
247*4882a593Smuzhiyun } else if (pktinfo->data_rate <= ODM_RATE54M) {
248*4882a593Smuzhiyun for (i = 0; i < dm->num_rf_path; i++) {
249*4882a593Smuzhiyun /*SNR & RSSI*/
250*4882a593Smuzhiyun dbg_s->snr_ofdm_sum[i] += snr[i];
251*4882a593Smuzhiyun dbg_s->rssi_ofdm_sum[i] += rssi[i];
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun /*@evm*/
254*4882a593Smuzhiyun dbg_s->evm_ofdm_sum += evm[0];
255*4882a593Smuzhiyun dbg_s->rssi_ofdm_cnt++;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun val = (u16)evm[0];
258*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->evm_hist_th, size_th);
259*4882a593Smuzhiyun dbg_s->evm_ofdm_hist[intvl]++;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun val = (u16)snr[0];
262*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->snr_hist_th, size_th);
263*4882a593Smuzhiyun dbg_s->snr_ofdm_hist[intvl]++;
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun } else if (pktinfo->rate_ss == 1) {
266*4882a593Smuzhiyun /*@===[1-SS]==================================================================*/
267*4882a593Smuzhiyun for (i = 0; i < dm->num_rf_path; i++) {
268*4882a593Smuzhiyun /*SNR & RSSI*/
269*4882a593Smuzhiyun dbg_s->snr_1ss_sum[i] += snr[i];
270*4882a593Smuzhiyun dbg_s->rssi_1ss_sum[i] += rssi[i];
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun /*@evm*/
274*4882a593Smuzhiyun dbg_s->evm_1ss_sum += evm[0];
275*4882a593Smuzhiyun /*@EVM Histogram*/
276*4882a593Smuzhiyun val = (u16)evm[0];
277*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->evm_hist_th, size_th);
278*4882a593Smuzhiyun dbg_s->evm_1ss_hist[intvl]++;
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun /*SNR Histogram*/
281*4882a593Smuzhiyun val = (u16)snr[0];
282*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->snr_hist_th, size_th);
283*4882a593Smuzhiyun dbg_s->snr_1ss_hist[intvl]++;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun dbg_s->rssi_1ss_cnt++;
286*4882a593Smuzhiyun } else if (pktinfo->rate_ss == 2) {
287*4882a593Smuzhiyun /*@===[2-SS]==================================================================*/
288*4882a593Smuzhiyun #if (defined(PHYDM_COMPILE_ABOVE_2SS))
289*4882a593Smuzhiyun for (i = 0; i < dm->num_rf_path; i++) {
290*4882a593Smuzhiyun /*SNR & RSSI*/
291*4882a593Smuzhiyun dbg_s->snr_2ss_sum[i] += snr[i];
292*4882a593Smuzhiyun dbg_s->rssi_2ss_sum[i] += rssi[i];
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun for (i = 0; i < pktinfo->rate_ss; i++) {
296*4882a593Smuzhiyun /*@evm*/
297*4882a593Smuzhiyun dbg_s->evm_2ss_sum[i] += evm[i];
298*4882a593Smuzhiyun /*@EVM Histogram*/
299*4882a593Smuzhiyun val = (u16)evm[i];
300*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->evm_hist_th,
301*4882a593Smuzhiyun size_th);
302*4882a593Smuzhiyun dbg_s->evm_2ss_hist[i][intvl]++;
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun /*SNR Histogram*/
305*4882a593Smuzhiyun val = (u16)snr[i];
306*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->snr_hist_th,
307*4882a593Smuzhiyun size_th);
308*4882a593Smuzhiyun dbg_s->snr_2ss_hist[i][intvl]++;
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun dbg_s->rssi_2ss_cnt++;
311*4882a593Smuzhiyun #endif
312*4882a593Smuzhiyun } else if (pktinfo->rate_ss == 3) {
313*4882a593Smuzhiyun /*@===[3-SS]==================================================================*/
314*4882a593Smuzhiyun #if (defined(PHYDM_COMPILE_ABOVE_3SS))
315*4882a593Smuzhiyun for (i = 0; i < dm->num_rf_path; i++) {
316*4882a593Smuzhiyun /*SNR & RSSI*/
317*4882a593Smuzhiyun dbg_s->snr_3ss_sum[i] += snr[i];
318*4882a593Smuzhiyun dbg_s->rssi_3ss_sum[i] += rssi[i];
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun for (i = 0; i < pktinfo->rate_ss; i++) {
322*4882a593Smuzhiyun /*@evm*/
323*4882a593Smuzhiyun dbg_s->evm_3ss_sum[i] += evm[i];
324*4882a593Smuzhiyun /*@EVM Histogram*/
325*4882a593Smuzhiyun val = (u16)evm[i];
326*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->evm_hist_th,
327*4882a593Smuzhiyun size_th);
328*4882a593Smuzhiyun dbg_s->evm_3ss_hist[i][intvl]++;
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun /*SNR Histogram*/
331*4882a593Smuzhiyun val = (u16)snr[i];
332*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->snr_hist_th,
333*4882a593Smuzhiyun size_th);
334*4882a593Smuzhiyun dbg_s->snr_3ss_hist[i][intvl]++;
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun dbg_s->rssi_3ss_cnt++;
337*4882a593Smuzhiyun #endif
338*4882a593Smuzhiyun } else if (pktinfo->rate_ss == 4) {
339*4882a593Smuzhiyun /*@===[4-SS]==================================================================*/
340*4882a593Smuzhiyun #if (defined(PHYDM_COMPILE_ABOVE_4SS))
341*4882a593Smuzhiyun for (i = 0; i < dm->num_rf_path; i++) {
342*4882a593Smuzhiyun /*SNR & RSSI*/
343*4882a593Smuzhiyun dbg_s->snr_4ss_sum[i] += snr[i];
344*4882a593Smuzhiyun dbg_s->rssi_4ss_sum[i] += rssi[i];
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun for (i = 0; i < pktinfo->rate_ss; i++) {
348*4882a593Smuzhiyun /*@evm*/
349*4882a593Smuzhiyun dbg_s->evm_4ss_sum[i] += evm[i];
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun /*@EVM Histogram*/
352*4882a593Smuzhiyun val = (u16)evm[i];
353*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->evm_hist_th,
354*4882a593Smuzhiyun size_th);
355*4882a593Smuzhiyun dbg_s->evm_4ss_hist[i][intvl]++;
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun /*SNR Histogram*/
358*4882a593Smuzhiyun val = (u16)snr[i];
359*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->snr_hist_th,
360*4882a593Smuzhiyun size_th);
361*4882a593Smuzhiyun dbg_s->snr_4ss_hist[i][intvl]++;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun dbg_s->rssi_4ss_cnt++;
364*4882a593Smuzhiyun #endif
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
phydm_avg_phystatus_init(void * dm_void)368*4882a593Smuzhiyun void phydm_avg_phystatus_init(void *dm_void)
369*4882a593Smuzhiyun {
370*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
371*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
372*4882a593Smuzhiyun u16 snr_hist_th[PHY_HIST_TH_SIZE] = {5, 8, 11, 14, 17, 20, 23, 26,
373*4882a593Smuzhiyun 29, 32, 35};
374*4882a593Smuzhiyun u16 evm_hist_th[PHY_HIST_TH_SIZE] = {5, 8, 11, 14, 17, 20, 23, 26,
375*4882a593Smuzhiyun 29, 32, 35};
376*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
377*4882a593Smuzhiyun u16 cn_hist_th[PHY_HIST_TH_SIZE] = {2, 3, 4, 5, 6, 8, 10,
378*4882a593Smuzhiyun 12, 14, 16, 18};
379*4882a593Smuzhiyun #endif
380*4882a593Smuzhiyun u32 size = PHY_HIST_TH_SIZE * 2;
381*4882a593Smuzhiyun u8 i = 0;
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun odm_move_memory(dm, dbg_i->snr_hist_th, snr_hist_th, size);
384*4882a593Smuzhiyun odm_move_memory(dm, dbg_i->evm_hist_th, evm_hist_th, size);
385*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
386*4882a593Smuzhiyun dm->pkt_proc_struct.physts_auto_swch_en = false;
387*4882a593Smuzhiyun for (i = 0; i < PHY_HIST_TH_SIZE; i++)
388*4882a593Smuzhiyun dbg_i->cn_hist_th[i] = cn_hist_th[i] << 1;
389*4882a593Smuzhiyun #endif
390*4882a593Smuzhiyun }
391*4882a593Smuzhiyun
phydm_get_signal_quality(struct phydm_phyinfo_struct * phy_info,struct dm_struct * dm,struct phy_status_rpt_8192cd * phy_sts)392*4882a593Smuzhiyun u8 phydm_get_signal_quality(struct phydm_phyinfo_struct *phy_info,
393*4882a593Smuzhiyun struct dm_struct *dm,
394*4882a593Smuzhiyun struct phy_status_rpt_8192cd *phy_sts)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun u8 sq_rpt;
397*4882a593Smuzhiyun u8 result = 0;
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun if (phy_info->rx_pwdb_all > 40 && !dm->is_in_hct_test) {
400*4882a593Smuzhiyun result = 100;
401*4882a593Smuzhiyun } else {
402*4882a593Smuzhiyun sq_rpt = phy_sts->cck_sig_qual_ofdm_pwdb_all;
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun if (sq_rpt > 64)
405*4882a593Smuzhiyun result = 0;
406*4882a593Smuzhiyun else if (sq_rpt < 20)
407*4882a593Smuzhiyun result = 100;
408*4882a593Smuzhiyun else
409*4882a593Smuzhiyun result = ((64 - sq_rpt) * 100) / 44;
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun return result;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun
phydm_pw_2_percent(s8 ant_power)415*4882a593Smuzhiyun u8 phydm_pw_2_percent(s8 ant_power)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun if ((ant_power <= -100) || ant_power >= 20)
418*4882a593Smuzhiyun return 0;
419*4882a593Smuzhiyun else if (ant_power >= 0)
420*4882a593Smuzhiyun return 100;
421*4882a593Smuzhiyun else
422*4882a593Smuzhiyun return 100 + ant_power;
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
phydm_process_signal_strength(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)426*4882a593Smuzhiyun void phydm_process_signal_strength(struct dm_struct *dm,
427*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
428*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun boolean is_cck_rate = 0;
431*4882a593Smuzhiyun u8 avg_rssi = 0, tmp_rssi = 0, best_rssi = 0, second_rssi = 0;
432*4882a593Smuzhiyun u8 ss = 0; /*signal strenth after scale mapping*/
433*4882a593Smuzhiyun u8 pwdb = phy_info->rx_pwdb_all;
434*4882a593Smuzhiyun u8 i;
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun is_cck_rate = (pktinfo->data_rate <= ODM_RATE11M) ? true : false;
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun /*use the best two RSSI only*/
439*4882a593Smuzhiyun for (i = RF_PATH_A; i < PHYDM_MAX_RF_PATH; i++) {
440*4882a593Smuzhiyun tmp_rssi = phy_info->rx_mimo_signal_strength[i];
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun /*@Get the best two RSSI*/
443*4882a593Smuzhiyun if (tmp_rssi > best_rssi && tmp_rssi > second_rssi) {
444*4882a593Smuzhiyun second_rssi = best_rssi;
445*4882a593Smuzhiyun best_rssi = tmp_rssi;
446*4882a593Smuzhiyun } else if (tmp_rssi > second_rssi && tmp_rssi <= best_rssi) {
447*4882a593Smuzhiyun second_rssi = tmp_rssi;
448*4882a593Smuzhiyun }
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun if (best_rssi == 0)
452*4882a593Smuzhiyun return;
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun if (pktinfo->rate_ss == 1)
455*4882a593Smuzhiyun avg_rssi = best_rssi;
456*4882a593Smuzhiyun else
457*4882a593Smuzhiyun avg_rssi = (best_rssi + second_rssi) >> 1;
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun /* Update signal strength to UI,
460*4882a593Smuzhiyun * and phy_info->rx_pwdb_all is the maximum RSSI of all path
461*4882a593Smuzhiyun */
462*4882a593Smuzhiyun if (dm->support_ic_type & (PHYSTS_3RD_TYPE_IC | PHYSTS_2ND_TYPE_IC))
463*4882a593Smuzhiyun ss = SignalScaleProc(dm->adapter, pwdb, false, false);
464*4882a593Smuzhiyun else
465*4882a593Smuzhiyun ss = SignalScaleProc(dm->adapter, pwdb, true, is_cck_rate);
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun phy_info->signal_strength = ss;
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun
phydm_sq_patch_lenovo(struct dm_struct * dm,u8 is_cck_rate,u8 pwdb_all,u8 path,u8 RSSI)470*4882a593Smuzhiyun static u8 phydm_sq_patch_lenovo(
471*4882a593Smuzhiyun struct dm_struct *dm,
472*4882a593Smuzhiyun u8 is_cck_rate,
473*4882a593Smuzhiyun u8 pwdb_all,
474*4882a593Smuzhiyun u8 path,
475*4882a593Smuzhiyun u8 RSSI)
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun u8 sq = 0;
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun if (is_cck_rate) {
480*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8192E) {
481*4882a593Smuzhiyun /*@
482*4882a593Smuzhiyun * <Roger_Notes>
483*4882a593Smuzhiyun * Expected signal strength and bars indication at Lenovo lab. 2013.04.11
484*4882a593Smuzhiyun * 802.11n, 802.11b, 802.11g only at channel 6
485*4882a593Smuzhiyun *
486*4882a593Smuzhiyun * Attenuation (dB) OS Signal Bars RSSI by Xirrus (dBm)
487*4882a593Smuzhiyun * 50 5 -49
488*4882a593Smuzhiyun * 55 5 -49
489*4882a593Smuzhiyun * 60 5 -50
490*4882a593Smuzhiyun * 65 5 -51
491*4882a593Smuzhiyun * 70 5 -52
492*4882a593Smuzhiyun * 75 5 -54
493*4882a593Smuzhiyun * 80 5 -55
494*4882a593Smuzhiyun * 85 4 -60
495*4882a593Smuzhiyun * 90 3 -63
496*4882a593Smuzhiyun * 95 3 -65
497*4882a593Smuzhiyun * 100 2 -67
498*4882a593Smuzhiyun * 102 2 -67
499*4882a593Smuzhiyun * 104 1 -70
500*4882a593Smuzhiyun */
501*4882a593Smuzhiyun if (pwdb_all >= 50)
502*4882a593Smuzhiyun sq = 100;
503*4882a593Smuzhiyun else if (pwdb_all >= 35 && pwdb_all < 50)
504*4882a593Smuzhiyun sq = 80;
505*4882a593Smuzhiyun else if (pwdb_all >= 31 && pwdb_all < 35)
506*4882a593Smuzhiyun sq = 60;
507*4882a593Smuzhiyun else if (pwdb_all >= 22 && pwdb_all < 31)
508*4882a593Smuzhiyun sq = 40;
509*4882a593Smuzhiyun else if (pwdb_all >= 18 && pwdb_all < 22)
510*4882a593Smuzhiyun sq = 20;
511*4882a593Smuzhiyun else
512*4882a593Smuzhiyun sq = 10;
513*4882a593Smuzhiyun } else {
514*4882a593Smuzhiyun if (pwdb_all >= 50)
515*4882a593Smuzhiyun sq = 100;
516*4882a593Smuzhiyun else if (pwdb_all >= 35 && pwdb_all < 50)
517*4882a593Smuzhiyun sq = 80;
518*4882a593Smuzhiyun else if (pwdb_all >= 22 && pwdb_all < 35)
519*4882a593Smuzhiyun sq = 60;
520*4882a593Smuzhiyun else if (pwdb_all >= 18 && pwdb_all < 22)
521*4882a593Smuzhiyun sq = 40;
522*4882a593Smuzhiyun else
523*4882a593Smuzhiyun sq = 10;
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun } else {
527*4882a593Smuzhiyun /* OFDM rate */
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8192E) {
530*4882a593Smuzhiyun if (RSSI >= 45)
531*4882a593Smuzhiyun sq = 100;
532*4882a593Smuzhiyun else if (RSSI >= 22 && RSSI < 45)
533*4882a593Smuzhiyun sq = 80;
534*4882a593Smuzhiyun else if (RSSI >= 18 && RSSI < 22)
535*4882a593Smuzhiyun sq = 40;
536*4882a593Smuzhiyun else
537*4882a593Smuzhiyun sq = 20;
538*4882a593Smuzhiyun } else {
539*4882a593Smuzhiyun if (RSSI >= 45)
540*4882a593Smuzhiyun sq = 100;
541*4882a593Smuzhiyun else if (RSSI >= 22 && RSSI < 45)
542*4882a593Smuzhiyun sq = 80;
543*4882a593Smuzhiyun else if (RSSI >= 18 && RSSI < 22)
544*4882a593Smuzhiyun sq = 40;
545*4882a593Smuzhiyun else
546*4882a593Smuzhiyun sq = 20;
547*4882a593Smuzhiyun }
548*4882a593Smuzhiyun }
549*4882a593Smuzhiyun return sq;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun
phydm_sq_patch_rt_cid_819x_acer(struct dm_struct * dm,u8 is_cck_rate,u8 pwdb_all,u8 path,u8 RSSI)552*4882a593Smuzhiyun static u8 phydm_sq_patch_rt_cid_819x_acer(
553*4882a593Smuzhiyun struct dm_struct *dm,
554*4882a593Smuzhiyun u8 is_cck_rate,
555*4882a593Smuzhiyun u8 pwdb_all,
556*4882a593Smuzhiyun u8 path,
557*4882a593Smuzhiyun u8 RSSI)
558*4882a593Smuzhiyun {
559*4882a593Smuzhiyun u8 sq = 0;
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun if (is_cck_rate) {
562*4882a593Smuzhiyun #if OS_WIN_FROM_WIN8(OS_VERSION)
563*4882a593Smuzhiyun if (pwdb_all >= 50)
564*4882a593Smuzhiyun sq = 100;
565*4882a593Smuzhiyun else if (pwdb_all >= 35 && pwdb_all < 50)
566*4882a593Smuzhiyun sq = 80;
567*4882a593Smuzhiyun else if (pwdb_all >= 30 && pwdb_all < 35)
568*4882a593Smuzhiyun sq = 60;
569*4882a593Smuzhiyun else if (pwdb_all >= 25 && pwdb_all < 30)
570*4882a593Smuzhiyun sq = 40;
571*4882a593Smuzhiyun else if (pwdb_all >= 20 && pwdb_all < 25)
572*4882a593Smuzhiyun sq = 20;
573*4882a593Smuzhiyun else
574*4882a593Smuzhiyun sq = 10;
575*4882a593Smuzhiyun #else
576*4882a593Smuzhiyun if (pwdb_all >= 50)
577*4882a593Smuzhiyun sq = 100;
578*4882a593Smuzhiyun else if (pwdb_all >= 35 && pwdb_all < 50)
579*4882a593Smuzhiyun sq = 80;
580*4882a593Smuzhiyun else if (pwdb_all >= 30 && pwdb_all < 35)
581*4882a593Smuzhiyun sq = 60;
582*4882a593Smuzhiyun else if (pwdb_all >= 25 && pwdb_all < 30)
583*4882a593Smuzhiyun sq = 40;
584*4882a593Smuzhiyun else if (pwdb_all >= 20 && pwdb_all < 25)
585*4882a593Smuzhiyun sq = 20;
586*4882a593Smuzhiyun else
587*4882a593Smuzhiyun sq = 10;
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun /* @Abnormal case, do not indicate the value above 20 on Win7 */
590*4882a593Smuzhiyun if (pwdb_all == 0)
591*4882a593Smuzhiyun sq = 20;
592*4882a593Smuzhiyun #endif
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun } else {
595*4882a593Smuzhiyun /* OFDM rate */
596*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8192E) {
597*4882a593Smuzhiyun if (RSSI >= 45)
598*4882a593Smuzhiyun sq = 100;
599*4882a593Smuzhiyun else if (RSSI >= 22 && RSSI < 45)
600*4882a593Smuzhiyun sq = 80;
601*4882a593Smuzhiyun else if (RSSI >= 18 && RSSI < 22)
602*4882a593Smuzhiyun sq = 40;
603*4882a593Smuzhiyun else
604*4882a593Smuzhiyun sq = 20;
605*4882a593Smuzhiyun } else {
606*4882a593Smuzhiyun if (RSSI >= 35)
607*4882a593Smuzhiyun sq = 100;
608*4882a593Smuzhiyun else if (RSSI >= 30 && RSSI < 35)
609*4882a593Smuzhiyun sq = 80;
610*4882a593Smuzhiyun else if (RSSI >= 25 && RSSI < 30)
611*4882a593Smuzhiyun sq = 40;
612*4882a593Smuzhiyun else
613*4882a593Smuzhiyun sq = 20;
614*4882a593Smuzhiyun }
615*4882a593Smuzhiyun }
616*4882a593Smuzhiyun return sq;
617*4882a593Smuzhiyun }
618*4882a593Smuzhiyun #endif
619*4882a593Smuzhiyun
620*4882a593Smuzhiyun static u8
phydm_evm_2_percent(s8 value)621*4882a593Smuzhiyun phydm_evm_2_percent(s8 value)
622*4882a593Smuzhiyun {
623*4882a593Smuzhiyun /* @-33dB~0dB to 0%~99% */
624*4882a593Smuzhiyun s8 ret_val;
625*4882a593Smuzhiyun
626*4882a593Smuzhiyun ret_val = value;
627*4882a593Smuzhiyun ret_val /= 2;
628*4882a593Smuzhiyun
629*4882a593Smuzhiyun /*@dbg_print("value=%d\n", value);*/
630*4882a593Smuzhiyun #ifdef ODM_EVM_ENHANCE_ANTDIV
631*4882a593Smuzhiyun if (ret_val >= 0)
632*4882a593Smuzhiyun ret_val = 0;
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun if (ret_val <= -40)
635*4882a593Smuzhiyun ret_val = -40;
636*4882a593Smuzhiyun
637*4882a593Smuzhiyun ret_val = 0 - ret_val;
638*4882a593Smuzhiyun ret_val *= 3;
639*4882a593Smuzhiyun #else
640*4882a593Smuzhiyun if (ret_val >= 0)
641*4882a593Smuzhiyun ret_val = 0;
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun if (ret_val <= -33)
644*4882a593Smuzhiyun ret_val = -33;
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun ret_val = 0 - ret_val;
647*4882a593Smuzhiyun ret_val *= 3;
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun if (ret_val == 99)
650*4882a593Smuzhiyun ret_val = 100;
651*4882a593Smuzhiyun #endif
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun return (u8)ret_val;
654*4882a593Smuzhiyun }
655*4882a593Smuzhiyun
phydm_cck_rssi_convert(struct dm_struct * dm,u16 lna_idx,u8 vga_idx)656*4882a593Smuzhiyun s8 phydm_cck_rssi_convert(struct dm_struct *dm, u16 lna_idx, u8 vga_idx)
657*4882a593Smuzhiyun {
658*4882a593Smuzhiyun /*@phydm_get_cck_rssi_table_from_reg*/
659*4882a593Smuzhiyun return (dm->cck_lna_gain_table[lna_idx] - (vga_idx << 1));
660*4882a593Smuzhiyun }
661*4882a593Smuzhiyun
phydm_get_cck_rssi_table_from_reg(struct dm_struct * dm)662*4882a593Smuzhiyun void phydm_get_cck_rssi_table_from_reg(struct dm_struct *dm)
663*4882a593Smuzhiyun {
664*4882a593Smuzhiyun u8 used_lna_idx_tmp;
665*4882a593Smuzhiyun u32 reg_0xa80 = 0x7431, reg_0xabc = 0xcbe5edfd;
666*4882a593Smuzhiyun u32 val = 0;
667*4882a593Smuzhiyun u8 i;
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun /*@example: {-53, -43, -33, -27, -19, -13, -3, 1}*/
670*4882a593Smuzhiyun /*@{0xCB, 0xD5, 0xDF, 0xE5, 0xED, 0xF3, 0xFD, 0x2}*/
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun PHYDM_DBG(dm, ODM_COMP_INIT, "CCK LNA Gain table init\n");
673*4882a593Smuzhiyun
674*4882a593Smuzhiyun if (!(dm->support_ic_type & ODM_RTL8197F))
675*4882a593Smuzhiyun return;
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun reg_0xa80 = odm_get_bb_reg(dm, R_0xa80, 0xFFFF);
678*4882a593Smuzhiyun reg_0xabc = odm_get_bb_reg(dm, R_0xabc, MASKDWORD);
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun PHYDM_DBG(dm, ODM_COMP_INIT, "reg_0xa80 = 0x%x\n", reg_0xa80);
681*4882a593Smuzhiyun PHYDM_DBG(dm, ODM_COMP_INIT, "reg_0xabc = 0x%x\n", reg_0xabc);
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun for (i = 0; i <= 3; i++) {
684*4882a593Smuzhiyun used_lna_idx_tmp = (u8)((reg_0xa80 >> (4 * i)) & 0x7);
685*4882a593Smuzhiyun val = (reg_0xabc >> (8 * i)) & 0xff;
686*4882a593Smuzhiyun dm->cck_lna_gain_table[used_lna_idx_tmp] = (s8)val;
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun PHYDM_DBG(dm, ODM_COMP_INIT,
690*4882a593Smuzhiyun "cck_lna_gain_table = {%d,%d,%d,%d,%d,%d,%d,%d}\n",
691*4882a593Smuzhiyun dm->cck_lna_gain_table[0], dm->cck_lna_gain_table[1],
692*4882a593Smuzhiyun dm->cck_lna_gain_table[2], dm->cck_lna_gain_table[3],
693*4882a593Smuzhiyun dm->cck_lna_gain_table[4], dm->cck_lna_gain_table[5],
694*4882a593Smuzhiyun dm->cck_lna_gain_table[6], dm->cck_lna_gain_table[7]);
695*4882a593Smuzhiyun }
696*4882a593Smuzhiyun
phydm_get_cck_rssi(void * dm_void,u8 lna_idx,u8 vga_idx)697*4882a593Smuzhiyun s8 phydm_get_cck_rssi(void *dm_void, u8 lna_idx, u8 vga_idx)
698*4882a593Smuzhiyun {
699*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
700*4882a593Smuzhiyun s8 rx_pow = 0;
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun switch (dm->support_ic_type) {
703*4882a593Smuzhiyun #if (RTL8197F_SUPPORT)
704*4882a593Smuzhiyun case ODM_RTL8197F:
705*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_convert(dm, lna_idx, vga_idx);
706*4882a593Smuzhiyun break;
707*4882a593Smuzhiyun #endif
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun #if (RTL8723D_SUPPORT)
710*4882a593Smuzhiyun case ODM_RTL8723D:
711*4882a593Smuzhiyun rx_pow = phydm_cckrssi_8723d(dm, lna_idx, vga_idx);
712*4882a593Smuzhiyun break;
713*4882a593Smuzhiyun #endif
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun #if (RTL8710B_SUPPORT)
716*4882a593Smuzhiyun case ODM_RTL8710B:
717*4882a593Smuzhiyun rx_pow = phydm_cckrssi_8710b(dm, lna_idx, vga_idx);
718*4882a593Smuzhiyun break;
719*4882a593Smuzhiyun #endif
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
722*4882a593Smuzhiyun case ODM_RTL8721D:
723*4882a593Smuzhiyun rx_pow = phydm_cckrssi_8721d(dm, lna_idx, vga_idx);
724*4882a593Smuzhiyun break;
725*4882a593Smuzhiyun #endif
726*4882a593Smuzhiyun
727*4882a593Smuzhiyun #if (RTL8710C_SUPPORT)
728*4882a593Smuzhiyun case ODM_RTL8710C:
729*4882a593Smuzhiyun rx_pow = phydm_cckrssi_8710c(dm, lna_idx, vga_idx);
730*4882a593Smuzhiyun break;
731*4882a593Smuzhiyun #endif
732*4882a593Smuzhiyun
733*4882a593Smuzhiyun #if (RTL8192F_SUPPORT)
734*4882a593Smuzhiyun case ODM_RTL8192F:
735*4882a593Smuzhiyun rx_pow = phydm_cckrssi_8192f(dm, lna_idx, vga_idx);
736*4882a593Smuzhiyun break;
737*4882a593Smuzhiyun #endif
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun #if (RTL8821C_SUPPORT)
740*4882a593Smuzhiyun case ODM_RTL8821C:
741*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8821c(dm, lna_idx, vga_idx);
742*4882a593Smuzhiyun break;
743*4882a593Smuzhiyun #endif
744*4882a593Smuzhiyun
745*4882a593Smuzhiyun #if (RTL8195B_SUPPORT)
746*4882a593Smuzhiyun case ODM_RTL8195B:
747*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8195B(dm, lna_idx, vga_idx);
748*4882a593Smuzhiyun break;
749*4882a593Smuzhiyun #endif
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun #if (RTL8188E_SUPPORT)
752*4882a593Smuzhiyun case ODM_RTL8188E:
753*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8188e(dm, lna_idx, vga_idx);
754*4882a593Smuzhiyun break;
755*4882a593Smuzhiyun #endif
756*4882a593Smuzhiyun
757*4882a593Smuzhiyun #if (RTL8192E_SUPPORT)
758*4882a593Smuzhiyun case ODM_RTL8192E:
759*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8192e(dm, lna_idx, vga_idx);
760*4882a593Smuzhiyun break;
761*4882a593Smuzhiyun #endif
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun #if (RTL8723B_SUPPORT)
764*4882a593Smuzhiyun case ODM_RTL8723B:
765*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8723b(dm, lna_idx, vga_idx);
766*4882a593Smuzhiyun break;
767*4882a593Smuzhiyun #endif
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun #if (RTL8703B_SUPPORT)
770*4882a593Smuzhiyun case ODM_RTL8703B:
771*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8703b(dm, lna_idx, vga_idx);
772*4882a593Smuzhiyun break;
773*4882a593Smuzhiyun #endif
774*4882a593Smuzhiyun
775*4882a593Smuzhiyun #if (RTL8188F_SUPPORT)
776*4882a593Smuzhiyun case ODM_RTL8188F:
777*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8188f(dm, lna_idx, vga_idx);
778*4882a593Smuzhiyun break;
779*4882a593Smuzhiyun #endif
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun #if (RTL8195A_SUPPORT)
782*4882a593Smuzhiyun case ODM_RTL8195A:
783*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8195a(dm, lna_idx, vga_idx);
784*4882a593Smuzhiyun break;
785*4882a593Smuzhiyun #endif
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun #if (RTL8812A_SUPPORT)
788*4882a593Smuzhiyun case ODM_RTL8812:
789*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8812a(dm, lna_idx, vga_idx);
790*4882a593Smuzhiyun break;
791*4882a593Smuzhiyun #endif
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun #if (RTL8821A_SUPPORT || RTL8881A_SUPPORT)
794*4882a593Smuzhiyun case ODM_RTL8821:
795*4882a593Smuzhiyun case ODM_RTL8881A:
796*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8821a(dm, lna_idx, vga_idx);
797*4882a593Smuzhiyun break;
798*4882a593Smuzhiyun #endif
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun #if (RTL8814A_SUPPORT)
801*4882a593Smuzhiyun case ODM_RTL8814A:
802*4882a593Smuzhiyun rx_pow = phydm_cck_rssi_8814a(dm, lna_idx, vga_idx);
803*4882a593Smuzhiyun break;
804*4882a593Smuzhiyun #endif
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun default:
807*4882a593Smuzhiyun break;
808*4882a593Smuzhiyun }
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun return rx_pow;
811*4882a593Smuzhiyun }
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun #if (ODM_IC_11N_SERIES_SUPPORT)
phydm_phy_sts_n_parsing(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo)814*4882a593Smuzhiyun void phydm_phy_sts_n_parsing(struct dm_struct *dm,
815*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
816*4882a593Smuzhiyun u8 *phy_status_inf,
817*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
818*4882a593Smuzhiyun {
819*4882a593Smuzhiyun u8 i = 0;
820*4882a593Smuzhiyun s8 rx_pwr[4], rx_pwr_all = 0;
821*4882a593Smuzhiyun u8 EVM, pwdb_all = 0, pwdb_all_bt = 0;
822*4882a593Smuzhiyun u8 RSSI, total_rssi = 0;
823*4882a593Smuzhiyun u8 rf_rx_num = 0;
824*4882a593Smuzhiyun u8 lna_idx = 0;
825*4882a593Smuzhiyun u8 vga_idx = 0;
826*4882a593Smuzhiyun u8 cck_agc_rpt;
827*4882a593Smuzhiyun s8 evm_tmp = 0;
828*4882a593Smuzhiyun u8 sq = 0;
829*4882a593Smuzhiyun u8 val_tmp = 0;
830*4882a593Smuzhiyun s8 val_s8 = 0;
831*4882a593Smuzhiyun struct phy_status_rpt_8192cd *phy_sts = NULL;
832*4882a593Smuzhiyun
833*4882a593Smuzhiyun phy_sts = (struct phy_status_rpt_8192cd *)phy_status_inf;
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun if (pktinfo->is_cck_rate) {
836*4882a593Smuzhiyun cck_agc_rpt = phy_sts->cck_agc_rpt_ofdm_cfosho_a;
837*4882a593Smuzhiyun
838*4882a593Smuzhiyun /*@3 bit LNA*/
839*4882a593Smuzhiyun lna_idx = ((cck_agc_rpt & 0xE0) >> 5);
840*4882a593Smuzhiyun vga_idx = (cck_agc_rpt & 0x1F);
841*4882a593Smuzhiyun
842*4882a593Smuzhiyun #if (RTL8703B_SUPPORT)
843*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8703B) &&
844*4882a593Smuzhiyun dm->cck_agc_report_type == 1) {
845*4882a593Smuzhiyun /*@4 bit LNA*/
846*4882a593Smuzhiyun if (phy_sts->cck_rpt_b_ofdm_cfosho_b & BIT(7))
847*4882a593Smuzhiyun val_tmp = 1;
848*4882a593Smuzhiyun else
849*4882a593Smuzhiyun val_tmp = 0;
850*4882a593Smuzhiyun lna_idx = (val_tmp << 3) | lna_idx;
851*4882a593Smuzhiyun }
852*4882a593Smuzhiyun #endif
853*4882a593Smuzhiyun
854*4882a593Smuzhiyun rx_pwr_all = phydm_get_cck_rssi(dm, lna_idx, vga_idx);
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR,
857*4882a593Smuzhiyun "ext_lna_gain (( %d )), lna_idx: (( 0x%x )), vga_idx: (( 0x%x )), rx_pwr_all: (( %d ))\n",
858*4882a593Smuzhiyun dm->ext_lna_gain, lna_idx, vga_idx, rx_pwr_all);
859*4882a593Smuzhiyun
860*4882a593Smuzhiyun if (dm->board_type & ODM_BOARD_EXT_LNA)
861*4882a593Smuzhiyun rx_pwr_all -= dm->ext_lna_gain;
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun pwdb_all = phydm_pw_2_percent(rx_pwr_all);
864*4882a593Smuzhiyun
865*4882a593Smuzhiyun if (pktinfo->is_to_self) {
866*4882a593Smuzhiyun dm->cck_lna_idx = lna_idx;
867*4882a593Smuzhiyun dm->cck_vga_idx = vga_idx;
868*4882a593Smuzhiyun }
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun phy_info->rx_pwdb_all = pwdb_all;
871*4882a593Smuzhiyun phy_info->bt_rx_rssi_percentage = pwdb_all;
872*4882a593Smuzhiyun phy_info->recv_signal_power = rx_pwr_all;
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun /* @(3) Get Signal Quality (EVM) */
875*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
876*4882a593Smuzhiyun if (dm->iot_table.win_patch_id == RT_CID_819X_LENOVO)
877*4882a593Smuzhiyun sq = phydm_sq_patch_lenovo(dm, pktinfo->is_cck_rate, pwdb_all, 0, 0);
878*4882a593Smuzhiyun else if (dm->iot_table.win_patch_id == RT_CID_819X_ACER)
879*4882a593Smuzhiyun sq = phydm_sq_patch_rt_cid_819x_acer(dm, pktinfo->is_cck_rate, pwdb_all, 0, 0);
880*4882a593Smuzhiyun else
881*4882a593Smuzhiyun #endif
882*4882a593Smuzhiyun sq = phydm_get_signal_quality(phy_info, dm, phy_sts);
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun /* @dbg_print("cck sq = %d\n", sq); */
885*4882a593Smuzhiyun
886*4882a593Smuzhiyun phy_info->signal_quality = sq;
887*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[RF_PATH_A] = sq;
888*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[RF_PATH_B] = -1;
889*4882a593Smuzhiyun
890*4882a593Smuzhiyun for (i = RF_PATH_A; i < PHYDM_MAX_RF_PATH; i++) {
891*4882a593Smuzhiyun if (i == 0)
892*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[0] = pwdb_all;
893*4882a593Smuzhiyun else
894*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = 0;
895*4882a593Smuzhiyun }
896*4882a593Smuzhiyun } else { /* @2 is OFDM rate */
897*4882a593Smuzhiyun
898*4882a593Smuzhiyun /* @(1)Get RSSI for HT rate */
899*4882a593Smuzhiyun
900*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
901*4882a593Smuzhiyun if (dm->rf_path_rx_enable & BIT(i))
902*4882a593Smuzhiyun rf_rx_num++;
903*4882a593Smuzhiyun
904*4882a593Smuzhiyun val_s8 = phy_sts->path_agc[i].gain & 0x3F;
905*4882a593Smuzhiyun rx_pwr[i] = (val_s8 * 2) - 110;
906*4882a593Smuzhiyun
907*4882a593Smuzhiyun if (pktinfo->is_to_self)
908*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = val_s8;
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun phy_info->rx_pwr[i] = rx_pwr[i];
911*4882a593Smuzhiyun RSSI = phydm_pw_2_percent(rx_pwr[i]);
912*4882a593Smuzhiyun total_rssi += RSSI;
913*4882a593Smuzhiyun
914*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = (u8)RSSI;
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun /* @Get Rx snr value in DB */
917*4882a593Smuzhiyun val_s8 = (s8)(phy_sts->path_rxsnr[i] / 2);
918*4882a593Smuzhiyun phy_info->rx_snr[i] = val_s8;
919*4882a593Smuzhiyun
920*4882a593Smuzhiyun /* Record Signal Strength for next packet */
921*4882a593Smuzhiyun
922*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
923*4882a593Smuzhiyun if (i == RF_PATH_A) {
924*4882a593Smuzhiyun if (dm->iot_table.win_patch_id == RT_CID_819X_LENOVO) {
925*4882a593Smuzhiyun phy_info->signal_quality = phydm_sq_patch_lenovo(dm, pktinfo->is_cck_rate, pwdb_all, i, RSSI);
926*4882a593Smuzhiyun } else if (dm->iot_table.win_patch_id == RT_CID_819X_ACER)
927*4882a593Smuzhiyun phy_info->signal_quality = phydm_sq_patch_rt_cid_819x_acer(dm, pktinfo->is_cck_rate, pwdb_all, 0, RSSI);
928*4882a593Smuzhiyun }
929*4882a593Smuzhiyun #endif
930*4882a593Smuzhiyun }
931*4882a593Smuzhiyun
932*4882a593Smuzhiyun /* @(2)PWDB, Average PWDB calculated by hardware (for RA) */
933*4882a593Smuzhiyun val_s8 = phy_sts->cck_sig_qual_ofdm_pwdb_all >> 1;
934*4882a593Smuzhiyun rx_pwr_all = (val_s8 & 0x7f) - 110;
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun pwdb_all = phydm_pw_2_percent(rx_pwr_all);
937*4882a593Smuzhiyun pwdb_all_bt = pwdb_all;
938*4882a593Smuzhiyun
939*4882a593Smuzhiyun phy_info->rx_pwdb_all = pwdb_all;
940*4882a593Smuzhiyun phy_info->bt_rx_rssi_percentage = pwdb_all_bt;
941*4882a593Smuzhiyun phy_info->rx_power = rx_pwr_all;
942*4882a593Smuzhiyun phy_info->recv_signal_power = rx_pwr_all;
943*4882a593Smuzhiyun
944*4882a593Smuzhiyun /* @(3)EVM of HT rate */
945*4882a593Smuzhiyun for (i = 0; i < pktinfo->rate_ss; i++) {
946*4882a593Smuzhiyun /* @Do not use shift operation like "rx_evmX >>= 1"
947*4882a593Smuzhiyun * because the compilor of free build environment
948*4882a593Smuzhiyun * fill most significant bit to "zero" when doing shifting
949*4882a593Smuzhiyun * operation which may change a negative
950*4882a593Smuzhiyun * value to positive one, then the dbm value
951*4882a593Smuzhiyun * (which is supposed to be negative) is not correct anymore.
952*4882a593Smuzhiyun */
953*4882a593Smuzhiyun if (i >= PHYDM_MAX_RF_PATH_N)
954*4882a593Smuzhiyun break;
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun EVM = phydm_evm_2_percent(phy_sts->stream_rxevm[i]);
957*4882a593Smuzhiyun
958*4882a593Smuzhiyun /*@Fill value in RFD, Get the 1st spatial stream only*/
959*4882a593Smuzhiyun if (i == RF_PATH_A)
960*4882a593Smuzhiyun phy_info->signal_quality = (u8)(EVM & 0xff);
961*4882a593Smuzhiyun
962*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = (u8)(EVM & 0xff);
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun if (phy_sts->stream_rxevm[i] < 0)
965*4882a593Smuzhiyun evm_tmp = 0 - phy_sts->stream_rxevm[i];
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun if (evm_tmp == 64)
968*4882a593Smuzhiyun evm_tmp = 0;
969*4882a593Smuzhiyun
970*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = (u8)evm_tmp;
971*4882a593Smuzhiyun }
972*4882a593Smuzhiyun phydm_parsing_cfo(dm, pktinfo,
973*4882a593Smuzhiyun phy_sts->path_cfotail, pktinfo->rate_ss);
974*4882a593Smuzhiyun }
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
977*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->ant_sel;
978*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->ant_sel_b;
979*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antsel_rx_keep_2;
980*4882a593Smuzhiyun #endif
981*4882a593Smuzhiyun }
982*4882a593Smuzhiyun #endif
983*4882a593Smuzhiyun
984*4882a593Smuzhiyun #if ODM_IC_11AC_SERIES_SUPPORT
985*4882a593Smuzhiyun static s16
phydm_cfo(s8 value)986*4882a593Smuzhiyun phydm_cfo(s8 value)
987*4882a593Smuzhiyun {
988*4882a593Smuzhiyun s16 ret_val;
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun if (value < 0) {
991*4882a593Smuzhiyun ret_val = 0 - value;
992*4882a593Smuzhiyun ret_val = (ret_val << 1) + (ret_val >> 1); /*@2.5~=312.5/2^7 */
993*4882a593Smuzhiyun ret_val = ret_val | BIT(12); /*set bit12 as 1 for negative cfo*/
994*4882a593Smuzhiyun } else {
995*4882a593Smuzhiyun ret_val = value;
996*4882a593Smuzhiyun ret_val = (ret_val << 1) + (ret_val >> 1); /* @*2.5~=312.5/2^7*/
997*4882a593Smuzhiyun }
998*4882a593Smuzhiyun return ret_val;
999*4882a593Smuzhiyun }
1000*4882a593Smuzhiyun
1001*4882a593Smuzhiyun static u8
phydm_evm_dbm(s8 value)1002*4882a593Smuzhiyun phydm_evm_dbm(s8 value)
1003*4882a593Smuzhiyun {
1004*4882a593Smuzhiyun s8 ret_val = value;
1005*4882a593Smuzhiyun
1006*4882a593Smuzhiyun /* @-33dB~0dB to 33dB ~ 0dB */
1007*4882a593Smuzhiyun if (ret_val == -128)
1008*4882a593Smuzhiyun ret_val = 127;
1009*4882a593Smuzhiyun else if (ret_val < 0)
1010*4882a593Smuzhiyun ret_val = 0 - ret_val;
1011*4882a593Smuzhiyun
1012*4882a593Smuzhiyun ret_val = ret_val >> 1;
1013*4882a593Smuzhiyun return (u8)ret_val;
1014*4882a593Smuzhiyun }
1015*4882a593Smuzhiyun
phydm_rx_physts_bw_parsing(struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo,struct phy_status_rpt_8812 * phy_sts)1016*4882a593Smuzhiyun void phydm_rx_physts_bw_parsing(struct phydm_phyinfo_struct *phy_info,
1017*4882a593Smuzhiyun struct phydm_perpkt_info_struct *
1018*4882a593Smuzhiyun pktinfo,
1019*4882a593Smuzhiyun struct phy_status_rpt_8812 *
1020*4882a593Smuzhiyun phy_sts)
1021*4882a593Smuzhiyun {
1022*4882a593Smuzhiyun if (pktinfo->data_rate > ODM_RATE54M) {
1023*4882a593Smuzhiyun switch (phy_sts->r_RFMOD) {
1024*4882a593Smuzhiyun case 1:
1025*4882a593Smuzhiyun if (phy_sts->sub_chnl == 0)
1026*4882a593Smuzhiyun phy_info->band_width = 1;
1027*4882a593Smuzhiyun else
1028*4882a593Smuzhiyun phy_info->band_width = 0;
1029*4882a593Smuzhiyun break;
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun case 2:
1032*4882a593Smuzhiyun if (phy_sts->sub_chnl == 0)
1033*4882a593Smuzhiyun phy_info->band_width = 2;
1034*4882a593Smuzhiyun else if (phy_sts->sub_chnl == 9 ||
1035*4882a593Smuzhiyun phy_sts->sub_chnl == 10)
1036*4882a593Smuzhiyun phy_info->band_width = 1;
1037*4882a593Smuzhiyun else
1038*4882a593Smuzhiyun phy_info->band_width = 0;
1039*4882a593Smuzhiyun break;
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun default:
1042*4882a593Smuzhiyun case 0:
1043*4882a593Smuzhiyun phy_info->band_width = 0;
1044*4882a593Smuzhiyun break;
1045*4882a593Smuzhiyun }
1046*4882a593Smuzhiyun }
1047*4882a593Smuzhiyun }
1048*4882a593Smuzhiyun
phydm_get_sq(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,u8 is_cck_rate)1049*4882a593Smuzhiyun void phydm_get_sq(struct dm_struct *dm, struct phydm_phyinfo_struct *phy_info,
1050*4882a593Smuzhiyun u8 is_cck_rate)
1051*4882a593Smuzhiyun {
1052*4882a593Smuzhiyun u8 sq = 0;
1053*4882a593Smuzhiyun u8 pwdb_all = phy_info->rx_pwdb_all; /*precentage*/
1054*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1055*4882a593Smuzhiyun u8 rssi = phy_info->rx_mimo_signal_strength[0];
1056*4882a593Smuzhiyun #endif
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1059*4882a593Smuzhiyun if (dm->iot_table.win_patch_id == RT_CID_819X_LENOVO) {
1060*4882a593Smuzhiyun if (is_cck_rate)
1061*4882a593Smuzhiyun sq = phydm_sq_patch_lenovo(dm, 1, pwdb_all, 0, 0);
1062*4882a593Smuzhiyun else
1063*4882a593Smuzhiyun sq = phydm_sq_patch_lenovo(dm, 0, pwdb_all, 0, rssi);
1064*4882a593Smuzhiyun } else
1065*4882a593Smuzhiyun #endif
1066*4882a593Smuzhiyun {
1067*4882a593Smuzhiyun if (is_cck_rate) {
1068*4882a593Smuzhiyun if (pwdb_all > 40 && !dm->is_in_hct_test) {
1069*4882a593Smuzhiyun sq = 100;
1070*4882a593Smuzhiyun } else {
1071*4882a593Smuzhiyun if (pwdb_all > 64)
1072*4882a593Smuzhiyun sq = 0;
1073*4882a593Smuzhiyun else if (pwdb_all < 20)
1074*4882a593Smuzhiyun sq = 100;
1075*4882a593Smuzhiyun else
1076*4882a593Smuzhiyun sq = ((64 - pwdb_all) * 100) / 44;
1077*4882a593Smuzhiyun }
1078*4882a593Smuzhiyun } else {
1079*4882a593Smuzhiyun sq = phy_info->rx_mimo_signal_quality[0];
1080*4882a593Smuzhiyun }
1081*4882a593Smuzhiyun }
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun #if 0
1084*4882a593Smuzhiyun /* @dbg_print("cck sq = %d\n", sq); */
1085*4882a593Smuzhiyun #endif
1086*4882a593Smuzhiyun phy_info->signal_quality = sq;
1087*4882a593Smuzhiyun }
1088*4882a593Smuzhiyun
phydm_rx_physts_1st_type(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo)1089*4882a593Smuzhiyun void phydm_rx_physts_1st_type(struct dm_struct *dm,
1090*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
1091*4882a593Smuzhiyun u8 *phy_status_inf,
1092*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
1093*4882a593Smuzhiyun {
1094*4882a593Smuzhiyun u8 i = 0;
1095*4882a593Smuzhiyun s8 rx_pwr_db = 0;
1096*4882a593Smuzhiyun u8 val = 0; /*tmp value*/
1097*4882a593Smuzhiyun s8 val_s8 = 0; /*tmp value*/
1098*4882a593Smuzhiyun u8 rssi = 0; /*pre path RSSI*/
1099*4882a593Smuzhiyun u8 rf_rx_num = 0;
1100*4882a593Smuzhiyun u8 lna_idx = 0, vga_idx = 0;
1101*4882a593Smuzhiyun u8 cck_agc_rpt = 0;
1102*4882a593Smuzhiyun struct phy_status_rpt_8812 *phy_sts = NULL;
1103*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1104*4882a593Smuzhiyun struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1105*4882a593Smuzhiyun #endif
1106*4882a593Smuzhiyun
1107*4882a593Smuzhiyun phy_sts = (struct phy_status_rpt_8812 *)phy_status_inf;
1108*4882a593Smuzhiyun phydm_rx_physts_bw_parsing(phy_info, pktinfo, phy_sts);
1109*4882a593Smuzhiyun
1110*4882a593Smuzhiyun /* @== [CCK rate] ====================================================*/
1111*4882a593Smuzhiyun if (pktinfo->is_cck_rate) {
1112*4882a593Smuzhiyun cck_agc_rpt = phy_sts->cfosho[0];
1113*4882a593Smuzhiyun lna_idx = (cck_agc_rpt & 0xE0) >> 5;
1114*4882a593Smuzhiyun vga_idx = cck_agc_rpt & 0x1F;
1115*4882a593Smuzhiyun
1116*4882a593Smuzhiyun rx_pwr_db = phydm_get_cck_rssi(dm, lna_idx, vga_idx);
1117*4882a593Smuzhiyun rssi = phydm_pw_2_percent(rx_pwr_db);
1118*4882a593Smuzhiyun
1119*4882a593Smuzhiyun if (dm->support_ic_type == ODM_RTL8812 &&
1120*4882a593Smuzhiyun !dm->is_cck_high_power) {
1121*4882a593Smuzhiyun if (rssi >= 80) {
1122*4882a593Smuzhiyun rssi = ((rssi - 80) << 1) +
1123*4882a593Smuzhiyun ((rssi - 80) >> 1) + 80;
1124*4882a593Smuzhiyun } else if ((rssi <= 78) && (rssi >= 20)) {
1125*4882a593Smuzhiyun rssi += 3;
1126*4882a593Smuzhiyun }
1127*4882a593Smuzhiyun }
1128*4882a593Smuzhiyun dm->cck_lna_idx = lna_idx;
1129*4882a593Smuzhiyun dm->cck_vga_idx = vga_idx;
1130*4882a593Smuzhiyun
1131*4882a593Smuzhiyun phy_info->rx_pwdb_all = rssi;
1132*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[0] = rssi;
1133*4882a593Smuzhiyun } else {
1134*4882a593Smuzhiyun /* @== [OFDM rate] ===================================================*/
1135*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
1136*4882a593Smuzhiyun /*@[RSSI]*/
1137*4882a593Smuzhiyun if (dm->rf_path_rx_enable & BIT(i))
1138*4882a593Smuzhiyun rf_rx_num++;
1139*4882a593Smuzhiyun
1140*4882a593Smuzhiyun if (i < RF_PATH_C)
1141*4882a593Smuzhiyun val = phy_sts->gain_trsw[i];
1142*4882a593Smuzhiyun else
1143*4882a593Smuzhiyun val = phy_sts->gain_trsw_cd[i - 2];
1144*4882a593Smuzhiyun
1145*4882a593Smuzhiyun phy_info->rx_pwr[i] = (val & 0x7F) - 110;
1146*4882a593Smuzhiyun rssi = phydm_pw_2_percent(phy_info->rx_pwr[i]);
1147*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = rssi;
1148*4882a593Smuzhiyun
1149*4882a593Smuzhiyun /*@[SNR]*/
1150*4882a593Smuzhiyun if (i < RF_PATH_C)
1151*4882a593Smuzhiyun val_s8 = phy_sts->rxsnr[i];
1152*4882a593Smuzhiyun else if (dm->support_ic_type & (ODM_RTL8814A))
1153*4882a593Smuzhiyun val_s8 = (s8)phy_sts->csi_current[i - 2];
1154*4882a593Smuzhiyun
1155*4882a593Smuzhiyun phy_info->rx_snr[i] = val_s8 >> 1;
1156*4882a593Smuzhiyun
1157*4882a593Smuzhiyun /*@[CFO_short & CFO_tail]*/
1158*4882a593Smuzhiyun if (i < RF_PATH_C) {
1159*4882a593Smuzhiyun val_s8 = phy_sts->cfosho[i];
1160*4882a593Smuzhiyun phy_info->cfo_short[i] = phydm_cfo(val_s8);
1161*4882a593Smuzhiyun val_s8 = phy_sts->cfotail[i];
1162*4882a593Smuzhiyun phy_info->cfo_tail[i] = phydm_cfo(val_s8);
1163*4882a593Smuzhiyun }
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun if (i < RF_PATH_C && pktinfo->is_to_self)
1166*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = phy_sts->gain_trsw[i];
1167*4882a593Smuzhiyun }
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun /* @== [PWDB] ========================================================*/
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun /*@(Avg PWDB calculated by hardware*/
1172*4882a593Smuzhiyun if (!dm->is_mp_chip) /*@8812, 8821*/
1173*4882a593Smuzhiyun val = phy_sts->pwdb_all;
1174*4882a593Smuzhiyun else
1175*4882a593Smuzhiyun val = phy_sts->pwdb_all >> 1; /*old fomula*/
1176*4882a593Smuzhiyun
1177*4882a593Smuzhiyun rx_pwr_db = (val & 0x7f) - 110;
1178*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_pwr_db);
1179*4882a593Smuzhiyun
1180*4882a593Smuzhiyun /*@(4)EVM of OFDM rate*/
1181*4882a593Smuzhiyun for (i = 0; i < pktinfo->rate_ss; i++) {
1182*4882a593Smuzhiyun if (!pktinfo->is_cck_rate &&
1183*4882a593Smuzhiyun pktinfo->data_rate <= ODM_RATE54M) {
1184*4882a593Smuzhiyun val_s8 = phy_sts->sigevm;
1185*4882a593Smuzhiyun } else if (i < RF_PATH_C) {
1186*4882a593Smuzhiyun if (phy_sts->rxevm[i] == -128)
1187*4882a593Smuzhiyun phy_sts->rxevm[i] = -25;
1188*4882a593Smuzhiyun
1189*4882a593Smuzhiyun val_s8 = phy_sts->rxevm[i];
1190*4882a593Smuzhiyun } else {
1191*4882a593Smuzhiyun if (phy_sts->rxevm_cd[i - 2] == -128)
1192*4882a593Smuzhiyun phy_sts->rxevm_cd[i - 2] = -25;
1193*4882a593Smuzhiyun
1194*4882a593Smuzhiyun val_s8 = phy_sts->rxevm_cd[i - 2];
1195*4882a593Smuzhiyun }
1196*4882a593Smuzhiyun /*@[EVM to 0~100%]*/
1197*4882a593Smuzhiyun val = phydm_evm_2_percent(val_s8);
1198*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = val;
1199*4882a593Smuzhiyun /*@[EVM dBm]*/
1200*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = phydm_evm_dbm(val_s8);
1201*4882a593Smuzhiyun }
1202*4882a593Smuzhiyun phydm_parsing_cfo(dm, pktinfo,
1203*4882a593Smuzhiyun phy_sts->cfotail, pktinfo->rate_ss);
1204*4882a593Smuzhiyun }
1205*4882a593Smuzhiyun
1206*4882a593Smuzhiyun /* @== [General Info] ================================================*/
1207*4882a593Smuzhiyun
1208*4882a593Smuzhiyun phy_info->rx_power = rx_pwr_db;
1209*4882a593Smuzhiyun phy_info->bt_rx_rssi_percentage = phy_info->rx_pwdb_all;
1210*4882a593Smuzhiyun phy_info->recv_signal_power = phy_info->rx_power;
1211*4882a593Smuzhiyun phydm_get_sq(dm, phy_info, pktinfo->is_cck_rate);
1212*4882a593Smuzhiyun
1213*4882a593Smuzhiyun dm->rx_pwdb_ave = dm->rx_pwdb_ave + phy_info->rx_pwdb_all;
1214*4882a593Smuzhiyun
1215*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1216*4882a593Smuzhiyun fat_tab->hw_antsw_occur = phy_sts->hw_antsw_occur;
1217*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_anta;
1218*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_antb;
1219*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_antc;
1220*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_antd;
1221*4882a593Smuzhiyun #endif
1222*4882a593Smuzhiyun }
1223*4882a593Smuzhiyun
1224*4882a593Smuzhiyun #endif
1225*4882a593Smuzhiyun
phydm_reset_rssi_for_dm(struct dm_struct * dm,u8 station_id)1226*4882a593Smuzhiyun void phydm_reset_rssi_for_dm(struct dm_struct *dm, u8 station_id)
1227*4882a593Smuzhiyun {
1228*4882a593Smuzhiyun struct cmn_sta_info *sta;
1229*4882a593Smuzhiyun
1230*4882a593Smuzhiyun sta = dm->phydm_sta_info[station_id];
1231*4882a593Smuzhiyun
1232*4882a593Smuzhiyun if (!is_sta_active(sta))
1233*4882a593Smuzhiyun return;
1234*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "Reset RSSI for macid = (( %d ))\n",
1235*4882a593Smuzhiyun station_id);
1236*4882a593Smuzhiyun
1237*4882a593Smuzhiyun sta->rssi_stat.rssi_cck = -1;
1238*4882a593Smuzhiyun sta->rssi_stat.rssi_ofdm = -1;
1239*4882a593Smuzhiyun sta->rssi_stat.rssi = -1;
1240*4882a593Smuzhiyun sta->rssi_stat.ofdm_pkt_cnt = 0;
1241*4882a593Smuzhiyun sta->rssi_stat.cck_pkt_cnt = 0;
1242*4882a593Smuzhiyun sta->rssi_stat.cck_sum_power = 0;
1243*4882a593Smuzhiyun sta->rssi_stat.is_send_rssi = RA_RSSI_STATE_INIT;
1244*4882a593Smuzhiyun sta->rssi_stat.packet_map = 0;
1245*4882a593Smuzhiyun sta->rssi_stat.valid_bit = 0;
1246*4882a593Smuzhiyun }
1247*4882a593Smuzhiyun
1248*4882a593Smuzhiyun #if (ODM_IC_11N_SERIES_SUPPORT || ODM_IC_11AC_SERIES_SUPPORT)
1249*4882a593Smuzhiyun
phydm_get_rssi_8814_ofdm(struct dm_struct * dm,u8 * rssi_in)1250*4882a593Smuzhiyun s32 phydm_get_rssi_8814_ofdm(struct dm_struct *dm, u8 *rssi_in)
1251*4882a593Smuzhiyun {
1252*4882a593Smuzhiyun s32 rssi_avg;
1253*4882a593Smuzhiyun u8 rx_count = 0;
1254*4882a593Smuzhiyun u64 rssi_linear = 0;
1255*4882a593Smuzhiyun
1256*4882a593Smuzhiyun if (dm->rx_ant_status & BB_PATH_A) {
1257*4882a593Smuzhiyun rx_count++;
1258*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_in[RF_PATH_A]);
1259*4882a593Smuzhiyun }
1260*4882a593Smuzhiyun
1261*4882a593Smuzhiyun if (dm->rx_ant_status & BB_PATH_B) {
1262*4882a593Smuzhiyun rx_count++;
1263*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_in[RF_PATH_B]);
1264*4882a593Smuzhiyun }
1265*4882a593Smuzhiyun
1266*4882a593Smuzhiyun if (dm->rx_ant_status & BB_PATH_C) {
1267*4882a593Smuzhiyun rx_count++;
1268*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_in[RF_PATH_C]);
1269*4882a593Smuzhiyun }
1270*4882a593Smuzhiyun
1271*4882a593Smuzhiyun if (dm->rx_ant_status & BB_PATH_D) {
1272*4882a593Smuzhiyun rx_count++;
1273*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_in[RF_PATH_D]);
1274*4882a593Smuzhiyun }
1275*4882a593Smuzhiyun
1276*4882a593Smuzhiyun /* @Rounding and removing fractional bits */
1277*4882a593Smuzhiyun rssi_linear = (rssi_linear + (1 << (FRAC_BITS - 1))) >> FRAC_BITS;
1278*4882a593Smuzhiyun
1279*4882a593Smuzhiyun /* @Calculate average RSSI */
1280*4882a593Smuzhiyun switch (rx_count) {
1281*4882a593Smuzhiyun case 2:
1282*4882a593Smuzhiyun rssi_linear = DIVIDED_2(rssi_linear);
1283*4882a593Smuzhiyun break;
1284*4882a593Smuzhiyun case 3:
1285*4882a593Smuzhiyun rssi_linear = DIVIDED_3(rssi_linear);
1286*4882a593Smuzhiyun break;
1287*4882a593Smuzhiyun case 4:
1288*4882a593Smuzhiyun rssi_linear = DIVIDED_4(rssi_linear);
1289*4882a593Smuzhiyun break;
1290*4882a593Smuzhiyun }
1291*4882a593Smuzhiyun rssi_avg = odm_convert_to_db(rssi_linear);
1292*4882a593Smuzhiyun
1293*4882a593Smuzhiyun return rssi_avg;
1294*4882a593Smuzhiyun }
1295*4882a593Smuzhiyun
phydm_process_rssi_for_dm(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)1296*4882a593Smuzhiyun void phydm_process_rssi_for_dm(struct dm_struct *dm,
1297*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
1298*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
1299*4882a593Smuzhiyun {
1300*4882a593Smuzhiyun s32 rssi_ave = 0; /*@average among all paths*/
1301*4882a593Smuzhiyun s8 rssi_all = 0; /*@average value of CCK & OFDM*/
1302*4882a593Smuzhiyun s8 rssi_cck_tmp = 0, rssi_ofdm_tmp = 0;
1303*4882a593Smuzhiyun u8 i = 0;
1304*4882a593Smuzhiyun u8 rssi_max = 0, rssi_min = 0;
1305*4882a593Smuzhiyun u32 w1 = 0, w2 = 0; /*weighting*/
1306*4882a593Smuzhiyun u8 send_rssi_2_fw = 0;
1307*4882a593Smuzhiyun u8 *rssi_tmp = NULL;
1308*4882a593Smuzhiyun struct cmn_sta_info *sta = NULL;
1309*4882a593Smuzhiyun struct rssi_info *rssi_t = NULL;
1310*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1311*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
1312*4882a593Smuzhiyun struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1313*4882a593Smuzhiyun #endif
1314*4882a593Smuzhiyun #endif
1315*4882a593Smuzhiyun
1316*4882a593Smuzhiyun if (pktinfo->station_id >= ODM_ASSOCIATE_ENTRY_NUM)
1317*4882a593Smuzhiyun return;
1318*4882a593Smuzhiyun
1319*4882a593Smuzhiyun #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
1320*4882a593Smuzhiyun odm_s0s1_sw_ant_div_by_ctrl_frame_process_rssi(dm, phy_info, pktinfo);
1321*4882a593Smuzhiyun #endif
1322*4882a593Smuzhiyun
1323*4882a593Smuzhiyun sta = dm->phydm_sta_info[pktinfo->station_id];
1324*4882a593Smuzhiyun
1325*4882a593Smuzhiyun if (!is_sta_active(sta))
1326*4882a593Smuzhiyun return;
1327*4882a593Smuzhiyun
1328*4882a593Smuzhiyun rssi_t = &sta->rssi_stat;
1329*4882a593Smuzhiyun
1330*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1331*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
1332*4882a593Smuzhiyun if ((dm->support_ability & ODM_BB_ANT_DIV) &&
1333*4882a593Smuzhiyun fat_tab->enable_ctrl_frame_antdiv) {
1334*4882a593Smuzhiyun if (pktinfo->is_packet_match_bssid)
1335*4882a593Smuzhiyun dm->data_frame_num++;
1336*4882a593Smuzhiyun
1337*4882a593Smuzhiyun if (fat_tab->use_ctrl_frame_antdiv) {
1338*4882a593Smuzhiyun if (!pktinfo->is_to_self) /*@data frame + CTRL frame*/
1339*4882a593Smuzhiyun return;
1340*4882a593Smuzhiyun } else {
1341*4882a593Smuzhiyun /*@data frame only*/
1342*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
1343*4882a593Smuzhiyun return;
1344*4882a593Smuzhiyun }
1345*4882a593Smuzhiyun } else
1346*4882a593Smuzhiyun #endif
1347*4882a593Smuzhiyun #endif
1348*4882a593Smuzhiyun {
1349*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid) /*@data frame only*/
1350*4882a593Smuzhiyun return;
1351*4882a593Smuzhiyun }
1352*4882a593Smuzhiyun
1353*4882a593Smuzhiyun if (pktinfo->is_packet_beacon) {
1354*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_beacon_pkt++;
1355*4882a593Smuzhiyun dm->phy_dbg_info.beacon_phy_rate = pktinfo->data_rate;
1356*4882a593Smuzhiyun }
1357*4882a593Smuzhiyun
1358*4882a593Smuzhiyun /* @--------------Statistic for antenna/path diversity--------------- */
1359*4882a593Smuzhiyun #ifdef ODM_EVM_ENHANCE_ANTDIV
1360*4882a593Smuzhiyun if (dm->antdiv_evm_en)
1361*4882a593Smuzhiyun phydm_rx_rate_for_antdiv(dm, pktinfo);
1362*4882a593Smuzhiyun #endif
1363*4882a593Smuzhiyun
1364*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
1365*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_ANT_DIV)
1366*4882a593Smuzhiyun odm_process_rssi_for_ant_div(dm, phy_info, pktinfo);
1367*4882a593Smuzhiyun #endif
1368*4882a593Smuzhiyun
1369*4882a593Smuzhiyun #if (defined(CONFIG_PATH_DIVERSITY))
1370*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_PATH_DIV)
1371*4882a593Smuzhiyun phydm_process_rssi_for_path_div(dm, phy_info, pktinfo);
1372*4882a593Smuzhiyun #endif
1373*4882a593Smuzhiyun /* @----------------------------------------------------------------- */
1374*4882a593Smuzhiyun
1375*4882a593Smuzhiyun rssi_cck_tmp = rssi_t->rssi_cck;
1376*4882a593Smuzhiyun rssi_ofdm_tmp = rssi_t->rssi_ofdm;
1377*4882a593Smuzhiyun rssi_all = rssi_t->rssi;
1378*4882a593Smuzhiyun
1379*4882a593Smuzhiyun if (!(pktinfo->is_packet_to_self || pktinfo->is_packet_beacon))
1380*4882a593Smuzhiyun return;
1381*4882a593Smuzhiyun
1382*4882a593Smuzhiyun if (!pktinfo->is_cck_rate) {
1383*4882a593Smuzhiyun /* @=== [ofdm RSSI] ======================================================== */
1384*4882a593Smuzhiyun rssi_tmp = phy_info->rx_mimo_signal_strength;
1385*4882a593Smuzhiyun
1386*4882a593Smuzhiyun #if (RTL8814A_SUPPORT == 1)
1387*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8814A)) {
1388*4882a593Smuzhiyun rssi_ave = phydm_get_rssi_8814_ofdm(dm, rssi_tmp);
1389*4882a593Smuzhiyun } else
1390*4882a593Smuzhiyun #endif
1391*4882a593Smuzhiyun {
1392*4882a593Smuzhiyun if (rssi_tmp[RF_PATH_B] == 0) {
1393*4882a593Smuzhiyun rssi_ave = rssi_tmp[RF_PATH_A];
1394*4882a593Smuzhiyun } else {
1395*4882a593Smuzhiyun if (rssi_tmp[RF_PATH_A] > rssi_tmp[RF_PATH_B]) {
1396*4882a593Smuzhiyun rssi_max = rssi_tmp[RF_PATH_A];
1397*4882a593Smuzhiyun rssi_min = rssi_tmp[RF_PATH_B];
1398*4882a593Smuzhiyun } else {
1399*4882a593Smuzhiyun rssi_max = rssi_tmp[RF_PATH_B];
1400*4882a593Smuzhiyun rssi_min = rssi_tmp[RF_PATH_A];
1401*4882a593Smuzhiyun }
1402*4882a593Smuzhiyun if ((rssi_max - rssi_min) < 3)
1403*4882a593Smuzhiyun rssi_ave = rssi_max;
1404*4882a593Smuzhiyun else if ((rssi_max - rssi_min) < 6)
1405*4882a593Smuzhiyun rssi_ave = rssi_max - 1;
1406*4882a593Smuzhiyun else if ((rssi_max - rssi_min) < 10)
1407*4882a593Smuzhiyun rssi_ave = rssi_max - 2;
1408*4882a593Smuzhiyun else
1409*4882a593Smuzhiyun rssi_ave = rssi_max - 3;
1410*4882a593Smuzhiyun }
1411*4882a593Smuzhiyun }
1412*4882a593Smuzhiyun
1413*4882a593Smuzhiyun /* OFDM MA RSSI */
1414*4882a593Smuzhiyun if (rssi_ofdm_tmp <= 0) { /* @initialize */
1415*4882a593Smuzhiyun rssi_ofdm_tmp = (s8)phy_info->rx_pwdb_all;
1416*4882a593Smuzhiyun } else {
1417*4882a593Smuzhiyun rssi_ofdm_tmp = (s8)WEIGHTING_AVG(rssi_ofdm_tmp,
1418*4882a593Smuzhiyun (1 << RSSI_MA) - 1,
1419*4882a593Smuzhiyun rssi_ave, 1);
1420*4882a593Smuzhiyun if (phy_info->rx_pwdb_all > (u32)rssi_ofdm_tmp)
1421*4882a593Smuzhiyun rssi_ofdm_tmp++;
1422*4882a593Smuzhiyun }
1423*4882a593Smuzhiyun
1424*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "rssi_ofdm=%d\n", rssi_ofdm_tmp);
1425*4882a593Smuzhiyun } else {
1426*4882a593Smuzhiyun /* @=== [cck RSSI] ========================================================= */
1427*4882a593Smuzhiyun rssi_ave = phy_info->rx_pwdb_all;
1428*4882a593Smuzhiyun
1429*4882a593Smuzhiyun if (rssi_t->cck_pkt_cnt <= 63)
1430*4882a593Smuzhiyun rssi_t->cck_pkt_cnt++;
1431*4882a593Smuzhiyun
1432*4882a593Smuzhiyun /* @1 Process CCK RSSI */
1433*4882a593Smuzhiyun if (rssi_cck_tmp <= 0) { /* @initialize */
1434*4882a593Smuzhiyun rssi_cck_tmp = (s8)phy_info->rx_pwdb_all;
1435*4882a593Smuzhiyun rssi_t->cck_sum_power = (u16)phy_info->rx_pwdb_all;
1436*4882a593Smuzhiyun rssi_t->cck_pkt_cnt = 1; /*reset*/
1437*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "[1]CCK_INIT\n");
1438*4882a593Smuzhiyun } else if (rssi_t->cck_pkt_cnt <= CCK_RSSI_INIT_COUNT) {
1439*4882a593Smuzhiyun rssi_t->cck_sum_power = rssi_t->cck_sum_power +
1440*4882a593Smuzhiyun (u16)phy_info->rx_pwdb_all;
1441*4882a593Smuzhiyun
1442*4882a593Smuzhiyun rssi_cck_tmp = rssi_t->cck_sum_power /
1443*4882a593Smuzhiyun rssi_t->cck_pkt_cnt;
1444*4882a593Smuzhiyun
1445*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR,
1446*4882a593Smuzhiyun "[2]SumPow=%d, cck_pkt=%d\n",
1447*4882a593Smuzhiyun rssi_t->cck_sum_power, rssi_t->cck_pkt_cnt);
1448*4882a593Smuzhiyun } else {
1449*4882a593Smuzhiyun rssi_cck_tmp = (s8)WEIGHTING_AVG(rssi_cck_tmp,
1450*4882a593Smuzhiyun (1 << RSSI_MA) - 1,
1451*4882a593Smuzhiyun phy_info->rx_pwdb_all,
1452*4882a593Smuzhiyun 1);
1453*4882a593Smuzhiyun if (phy_info->rx_pwdb_all > (u32)rssi_cck_tmp)
1454*4882a593Smuzhiyun rssi_cck_tmp++;
1455*4882a593Smuzhiyun }
1456*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "rssi_cck=%d\n", rssi_cck_tmp);
1457*4882a593Smuzhiyun }
1458*4882a593Smuzhiyun
1459*4882a593Smuzhiyun /* @=== [ofdm + cck weighting RSSI] ========================================= */
1460*4882a593Smuzhiyun if (!pktinfo->is_cck_rate) {
1461*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt < 8 && !(rssi_t->packet_map & BIT(7)))
1462*4882a593Smuzhiyun rssi_t->ofdm_pkt_cnt++; /*OFDM packet cnt in bitmap*/
1463*4882a593Smuzhiyun
1464*4882a593Smuzhiyun rssi_t->packet_map = (rssi_t->packet_map << 1) | BIT(0);
1465*4882a593Smuzhiyun } else {
1466*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt > 0 && rssi_t->packet_map & BIT(7))
1467*4882a593Smuzhiyun rssi_t->ofdm_pkt_cnt--;
1468*4882a593Smuzhiyun
1469*4882a593Smuzhiyun rssi_t->packet_map = rssi_t->packet_map << 1;
1470*4882a593Smuzhiyun }
1471*4882a593Smuzhiyun
1472*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt == 8) {
1473*4882a593Smuzhiyun rssi_all = rssi_ofdm_tmp;
1474*4882a593Smuzhiyun } else {
1475*4882a593Smuzhiyun if (rssi_t->valid_bit < 8)
1476*4882a593Smuzhiyun rssi_t->valid_bit++;
1477*4882a593Smuzhiyun
1478*4882a593Smuzhiyun if (rssi_t->valid_bit == 8) {
1479*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt > 4)
1480*4882a593Smuzhiyun w1 = 64;
1481*4882a593Smuzhiyun else
1482*4882a593Smuzhiyun w1 = (u32)(rssi_t->ofdm_pkt_cnt << 4);
1483*4882a593Smuzhiyun
1484*4882a593Smuzhiyun w2 = 64 - w1;
1485*4882a593Smuzhiyun
1486*4882a593Smuzhiyun rssi_all = (s8)((w1 * (u32)rssi_ofdm_tmp +
1487*4882a593Smuzhiyun w2 * (u32)rssi_cck_tmp) >> 6);
1488*4882a593Smuzhiyun } else if (rssi_t->valid_bit != 0) { /*@(valid_bit > 8)*/
1489*4882a593Smuzhiyun w1 = (u32)rssi_t->ofdm_pkt_cnt;
1490*4882a593Smuzhiyun w2 = (u32)(rssi_t->valid_bit - rssi_t->ofdm_pkt_cnt);
1491*4882a593Smuzhiyun rssi_all = (s8)WEIGHTING_AVG((u32)rssi_ofdm_tmp, w1,
1492*4882a593Smuzhiyun (u32)rssi_cck_tmp, w2);
1493*4882a593Smuzhiyun } else {
1494*4882a593Smuzhiyun rssi_all = 0;
1495*4882a593Smuzhiyun }
1496*4882a593Smuzhiyun }
1497*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "rssi=%d,w1=%d,w2=%d\n", rssi_all, w1, w2);
1498*4882a593Smuzhiyun
1499*4882a593Smuzhiyun if ((rssi_t->ofdm_pkt_cnt >= 1 || rssi_t->cck_pkt_cnt >= 5) &&
1500*4882a593Smuzhiyun rssi_t->is_send_rssi == RA_RSSI_STATE_INIT) {
1501*4882a593Smuzhiyun send_rssi_2_fw = 1;
1502*4882a593Smuzhiyun rssi_t->is_send_rssi = RA_RSSI_STATE_SEND;
1503*4882a593Smuzhiyun }
1504*4882a593Smuzhiyun
1505*4882a593Smuzhiyun rssi_t->rssi_cck = rssi_cck_tmp;
1506*4882a593Smuzhiyun rssi_t->rssi_ofdm = rssi_ofdm_tmp;
1507*4882a593Smuzhiyun rssi_t->rssi = rssi_all;
1508*4882a593Smuzhiyun
1509*4882a593Smuzhiyun if (send_rssi_2_fw) { /* Trigger init rate by RSSI */
1510*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt != 0)
1511*4882a593Smuzhiyun rssi_t->rssi = rssi_ofdm_tmp;
1512*4882a593Smuzhiyun
1513*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR,
1514*4882a593Smuzhiyun "[Send to FW] PWDB=%d, ofdm_pkt=%d, cck_pkt=%d\n",
1515*4882a593Smuzhiyun rssi_all, rssi_t->ofdm_pkt_cnt, rssi_t->cck_pkt_cnt);
1516*4882a593Smuzhiyun }
1517*4882a593Smuzhiyun
1518*4882a593Smuzhiyun #if 0
1519*4882a593Smuzhiyun /* @dbg_print("ofdm_pkt=%d, weighting=%d\n", ofdm_pkt_cnt, weighting);*/
1520*4882a593Smuzhiyun /* @dbg_print("rssi_ofdm_tmp=%d, rssi_all=%d, rssi_cck_tmp=%d\n", */
1521*4882a593Smuzhiyun /* rssi_ofdm_tmp, rssi_all, rssi_cck_tmp); */
1522*4882a593Smuzhiyun #endif
1523*4882a593Smuzhiyun }
1524*4882a593Smuzhiyun #endif
1525*4882a593Smuzhiyun
1526*4882a593Smuzhiyun #ifdef PHYSTS_3RD_TYPE_SUPPORT
1527*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
phydm_physts_auto_switch_jgr3_reset(void * dm_void)1528*4882a593Smuzhiyun void phydm_physts_auto_switch_jgr3_reset(void *dm_void)
1529*4882a593Smuzhiyun {
1530*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1531*4882a593Smuzhiyun struct pkt_process_info *pkt_proc = &dm->pkt_proc_struct;
1532*4882a593Smuzhiyun
1533*4882a593Smuzhiyun pkt_proc->phy_ppdu_cnt = 0xff;
1534*4882a593Smuzhiyun pkt_proc->mac_ppdu_cnt = 0xff;
1535*4882a593Smuzhiyun pkt_proc->page_bitmap_record = 0;
1536*4882a593Smuzhiyun }
1537*4882a593Smuzhiyun
phydm_physts_auto_switch_jgr3(void * dm_void,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo)1538*4882a593Smuzhiyun boolean phydm_physts_auto_switch_jgr3(void *dm_void, u8 *phy_sts,
1539*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
1540*4882a593Smuzhiyun {
1541*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1542*4882a593Smuzhiyun struct pkt_process_info *pkt_proc = &dm->pkt_proc_struct;
1543*4882a593Smuzhiyun boolean is_skip_physts_parsing = false;
1544*4882a593Smuzhiyun u8 phy_sts_byte0 = (*phy_sts & 0xff);
1545*4882a593Smuzhiyun u8 phy_ppdu_cnt_pre = 0, mac_ppdu_cnt_pre = 0;
1546*4882a593Smuzhiyun u8 ppdu_phy_rate_pre = 0, ppdu_macid_pre = 0;
1547*4882a593Smuzhiyun u8 page = phy_sts_byte0 & 0xf;
1548*4882a593Smuzhiyun
1549*4882a593Smuzhiyun if (!pkt_proc->physts_auto_swch_en)
1550*4882a593Smuzhiyun return is_skip_physts_parsing;
1551*4882a593Smuzhiyun
1552*4882a593Smuzhiyun phy_ppdu_cnt_pre = pkt_proc->phy_ppdu_cnt;
1553*4882a593Smuzhiyun mac_ppdu_cnt_pre = pkt_proc->mac_ppdu_cnt;
1554*4882a593Smuzhiyun ppdu_phy_rate_pre = pkt_proc->ppdu_phy_rate;
1555*4882a593Smuzhiyun ppdu_macid_pre = pkt_proc->ppdu_macid;
1556*4882a593Smuzhiyun
1557*4882a593Smuzhiyun pkt_proc->phy_ppdu_cnt = (phy_sts_byte0 & 0x30) >> 4;
1558*4882a593Smuzhiyun pkt_proc->mac_ppdu_cnt = pktinfo->ppdu_cnt;
1559*4882a593Smuzhiyun pkt_proc->ppdu_phy_rate = pktinfo->data_rate;
1560*4882a593Smuzhiyun pkt_proc->ppdu_macid = pktinfo->station_id;
1561*4882a593Smuzhiyun
1562*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
1563*4882a593Smuzhiyun "[rate:0x%x] PPDU mac{pre, curr}= {%d, %d}, phy{pre, curr}= {%d, %d}\n",
1564*4882a593Smuzhiyun pktinfo->data_rate, mac_ppdu_cnt_pre, pkt_proc->mac_ppdu_cnt,
1565*4882a593Smuzhiyun phy_ppdu_cnt_pre, pkt_proc->phy_ppdu_cnt);
1566*4882a593Smuzhiyun
1567*4882a593Smuzhiyun if (pktinfo->data_rate < ODM_RATEMCS0) {
1568*4882a593Smuzhiyun pkt_proc->page_bitmap_record = 0;
1569*4882a593Smuzhiyun return is_skip_physts_parsing;
1570*4882a593Smuzhiyun }
1571*4882a593Smuzhiyun
1572*4882a593Smuzhiyun if (ppdu_macid_pre == pkt_proc->ppdu_macid &&
1573*4882a593Smuzhiyun ppdu_phy_rate_pre == pkt_proc->ppdu_phy_rate &&
1574*4882a593Smuzhiyun phy_ppdu_cnt_pre == pkt_proc->phy_ppdu_cnt &&
1575*4882a593Smuzhiyun mac_ppdu_cnt_pre == pkt_proc->mac_ppdu_cnt) {
1576*4882a593Smuzhiyun if (pkt_proc->page_bitmap_record & BIT(page)) {
1577*4882a593Smuzhiyun /*@PHYDM_DBG(dm, DBG_PHY_STATUS, "collect page-%d enough\n", page);*/
1578*4882a593Smuzhiyun is_skip_physts_parsing = true;
1579*4882a593Smuzhiyun } else if (pkt_proc->page_bitmap_record ==
1580*4882a593Smuzhiyun pkt_proc->page_bitmap_target) {
1581*4882a593Smuzhiyun /*@PHYDM_DBG(dm, DBG_PHY_STATUS, "collect all enough\n");*/
1582*4882a593Smuzhiyun is_skip_physts_parsing = true;
1583*4882a593Smuzhiyun } else {
1584*4882a593Smuzhiyun /*@PHYDM_DBG(dm, DBG_PHY_STATUS, "update page-%d\n", page);*/
1585*4882a593Smuzhiyun pkt_proc->page_bitmap_record |= BIT(page);
1586*4882a593Smuzhiyun }
1587*4882a593Smuzhiyun pkt_proc->is_1st_mpdu = false;
1588*4882a593Smuzhiyun } else {
1589*4882a593Smuzhiyun /*@PHYDM_DBG(dm, DBG_PHY_STATUS, "[New Pkt] update page-%d\n", page);*/
1590*4882a593Smuzhiyun pkt_proc->page_bitmap_record = BIT(page);
1591*4882a593Smuzhiyun pkt_proc->is_1st_mpdu = true;
1592*4882a593Smuzhiyun }
1593*4882a593Smuzhiyun
1594*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
1595*4882a593Smuzhiyun "bitmap{record, target}= {0x%x, 0x%x}\n",
1596*4882a593Smuzhiyun pkt_proc->page_bitmap_record,
1597*4882a593Smuzhiyun pkt_proc->page_bitmap_target);
1598*4882a593Smuzhiyun
1599*4882a593Smuzhiyun return is_skip_physts_parsing;
1600*4882a593Smuzhiyun }
1601*4882a593Smuzhiyun
phydm_physts_auto_switch_jgr3_set(void * dm_void,boolean enable,u8 bitmap_en)1602*4882a593Smuzhiyun void phydm_physts_auto_switch_jgr3_set(void *dm_void, boolean enable,
1603*4882a593Smuzhiyun u8 bitmap_en)
1604*4882a593Smuzhiyun {
1605*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1606*4882a593Smuzhiyun struct pkt_process_info *pkt_proc = &dm->pkt_proc_struct;
1607*4882a593Smuzhiyun u16 en_page_num = 1;
1608*4882a593Smuzhiyun
1609*4882a593Smuzhiyun if (!(dm->support_ic_type & PHYSTS_AUTO_SWITCH_IC))
1610*4882a593Smuzhiyun return;
1611*4882a593Smuzhiyun #if 0
1612*4882a593Smuzhiyun if (!(dm->support_ic_type & PHYSTS_3RD_TYPE_IC))
1613*4882a593Smuzhiyun return;
1614*4882a593Smuzhiyun #endif
1615*4882a593Smuzhiyun pkt_proc->physts_auto_swch_en = enable;
1616*4882a593Smuzhiyun pkt_proc->page_bitmap_target = bitmap_en;
1617*4882a593Smuzhiyun phydm_physts_auto_switch_jgr3_reset(dm);
1618*4882a593Smuzhiyun en_page_num = phydm_ones_num_in_bitmap((u64)bitmap_en, 8);
1619*4882a593Smuzhiyun
1620*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_CMN, "[%s]en=%d, bitmap_en=%d, en_page_num=%d\n",
1621*4882a593Smuzhiyun __func__, enable, bitmap_en, en_page_num);
1622*4882a593Smuzhiyun
1623*4882a593Smuzhiyun if (enable) {
1624*4882a593Smuzhiyun /*@per MPDU latch & update phy-staatus*/
1625*4882a593Smuzhiyun odm_set_mac_reg(dm, R_0x60c, BIT(31), 1);
1626*4882a593Smuzhiyun /*@Update Period (OFDM Symbol)*/
1627*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c0, 0xfc000, 3);
1628*4882a593Smuzhiyun /*@switchin bitmap*/
1629*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c4, 0x7f80000, bitmap_en);
1630*4882a593Smuzhiyun /*@mode 3*/
1631*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c4, (BIT(28) | BIT(27)), 3);
1632*4882a593Smuzhiyun } else {
1633*4882a593Smuzhiyun odm_set_mac_reg(dm, R_0x60c, BIT(31), 0);
1634*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c0, 0xfc000, 0x1);
1635*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c4, 0x7f80000, 0x2);
1636*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c4, (BIT(28) | BIT(27)), 0);
1637*4882a593Smuzhiyun }
1638*4882a593Smuzhiyun }
1639*4882a593Smuzhiyun
phydm_avg_condi_num(void * dm_void,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)1640*4882a593Smuzhiyun void phydm_avg_condi_num(void *dm_void,
1641*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
1642*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
1643*4882a593Smuzhiyun {
1644*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1645*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
1646*4882a593Smuzhiyun struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;
1647*4882a593Smuzhiyun u16 size_th = PHY_HIST_SIZE - 1; /*size of threshold*/
1648*4882a593Smuzhiyun u16 val = 0, intvl = 0;
1649*4882a593Smuzhiyun u8 arry_idx = 0;
1650*4882a593Smuzhiyun
1651*4882a593Smuzhiyun if (pktinfo->rate_ss == 1)
1652*4882a593Smuzhiyun return;
1653*4882a593Smuzhiyun
1654*4882a593Smuzhiyun arry_idx = pktinfo->rate_ss - 1;
1655*4882a593Smuzhiyun
1656*4882a593Smuzhiyun dbg_s->p4_cnt[arry_idx]++;
1657*4882a593Smuzhiyun dbg_s->cn_sum[arry_idx] += dbg_i->condition_num_seg0;
1658*4882a593Smuzhiyun
1659*4882a593Smuzhiyun /*CN Histogram*/
1660*4882a593Smuzhiyun val = (u16)dbg_i->condition_num_seg0;
1661*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->cn_hist_th, size_th);
1662*4882a593Smuzhiyun dbg_s->cn_hist[arry_idx][intvl]++;
1663*4882a593Smuzhiyun
1664*4882a593Smuzhiyun dbg_i->condi_num = (u32)dbg_i->condition_num_seg0; /*will remove*/
1665*4882a593Smuzhiyun }
1666*4882a593Smuzhiyun #endif
1667*4882a593Smuzhiyun
phydm_print_phystat_jgr3(struct dm_struct * dm,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)1668*4882a593Smuzhiyun void phydm_print_phystat_jgr3(struct dm_struct *dm, u8 *phy_sts,
1669*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
1670*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
1671*4882a593Smuzhiyun {
1672*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type0 *rpt0 = NULL;
1673*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type1 *rpt1 = NULL;
1674*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type2_3 *rpt2 = NULL;
1675*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type4 *rpt3 = NULL;
1676*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type5 *rpt4 = NULL;
1677*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type6 *rpt5 = NULL;
1678*4882a593Smuzhiyun
1679*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
1680*4882a593Smuzhiyun u8 phy_status_page_num = (*phy_sts & 0xf);
1681*4882a593Smuzhiyun u32 *phy_status_tmp = NULL;
1682*4882a593Smuzhiyun u8 i = 0;
1683*4882a593Smuzhiyun /*u32 size = PHY_STATUS_JRGUAR3_DW_LEN << 2;*/
1684*4882a593Smuzhiyun
1685*4882a593Smuzhiyun if (!(dm->debug_components & DBG_PHY_STATUS))
1686*4882a593Smuzhiyun return;
1687*4882a593Smuzhiyun
1688*4882a593Smuzhiyun rpt0 = (struct phy_sts_rpt_jgr3_type0 *)phy_sts;
1689*4882a593Smuzhiyun rpt1 = (struct phy_sts_rpt_jgr3_type1 *)phy_sts;
1690*4882a593Smuzhiyun rpt2 = (struct phy_sts_rpt_jgr3_type2_3 *)phy_sts;
1691*4882a593Smuzhiyun rpt3 = (struct phy_sts_rpt_jgr3_type4 *)phy_sts;
1692*4882a593Smuzhiyun rpt4 = (struct phy_sts_rpt_jgr3_type5 *)phy_sts;
1693*4882a593Smuzhiyun
1694*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8723F) {
1695*4882a593Smuzhiyun rpt5 = (struct phy_sts_rpt_jgr3_type6 *)phy_sts;
1696*4882a593Smuzhiyun
1697*4882a593Smuzhiyun if (pktinfo->is_cck_rate)
1698*4882a593Smuzhiyun phy_status_page_num = 0;
1699*4882a593Smuzhiyun }
1700*4882a593Smuzhiyun
1701*4882a593Smuzhiyun phy_status_tmp = (u32 *)phy_sts;
1702*4882a593Smuzhiyun
1703*4882a593Smuzhiyun if (dbg->show_phy_sts_all_pkt == 0) {
1704*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
1705*4882a593Smuzhiyun return;
1706*4882a593Smuzhiyun }
1707*4882a593Smuzhiyun
1708*4882a593Smuzhiyun dbg->show_phy_sts_cnt++;
1709*4882a593Smuzhiyun
1710*4882a593Smuzhiyun if (dbg->show_phy_sts_max_cnt != SHOW_PHY_STATUS_UNLIMITED) {
1711*4882a593Smuzhiyun if (dbg->show_phy_sts_cnt > dbg->show_phy_sts_max_cnt)
1712*4882a593Smuzhiyun return;
1713*4882a593Smuzhiyun }
1714*4882a593Smuzhiyun
1715*4882a593Smuzhiyun if (phy_status_page_num == 0)
1716*4882a593Smuzhiyun pr_debug("Phy Status Rpt: CCK\n");
1717*4882a593Smuzhiyun else
1718*4882a593Smuzhiyun pr_debug("Phy Status Rpt: OFDM_%d\n", phy_status_page_num);
1719*4882a593Smuzhiyun
1720*4882a593Smuzhiyun pr_debug("StaID=%d, RxRate = 0x%x match_bssid=%d, ppdu_cnt=%d\n",
1721*4882a593Smuzhiyun pktinfo->station_id, pktinfo->data_rate,
1722*4882a593Smuzhiyun pktinfo->is_packet_match_bssid, pktinfo->ppdu_cnt);
1723*4882a593Smuzhiyun
1724*4882a593Smuzhiyun for (i = 0; i < PHY_STATUS_JRGUAR3_DW_LEN; i++)
1725*4882a593Smuzhiyun pr_debug("Offset[%d:%d] = 0x%x\n",
1726*4882a593Smuzhiyun ((4 * i) + 3), (4 * i), phy_status_tmp[i]);
1727*4882a593Smuzhiyun
1728*4882a593Smuzhiyun if (phy_status_page_num == 0) { /* @CCK(default) */
1729*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8723F) {
1730*4882a593Smuzhiyun #if (RTL8723F_SUPPORT)
1731*4882a593Smuzhiyun pr_debug("[0] Pop_idx=%d, Pkt_cnt=%d, Channel_msb=%d, AGC_table_path0=%d, TRSW_mux_keep=%d, HW_AntSW_occur_keep_cck=%d, Gnt_BT_keep_cnt=%d,Rssi_msb=%d\n",
1732*4882a593Smuzhiyun rpt5->pop_idx, rpt5->pkt_cnt,
1733*4882a593Smuzhiyun rpt5->channel_msb, rpt5->agc_table_a,
1734*4882a593Smuzhiyun rpt5->trsw, rpt5->hw_antsw_occur_keep_cck,
1735*4882a593Smuzhiyun rpt5->gnt_bt_keep_cck, rpt5->rssi_msb);
1736*4882a593Smuzhiyun pr_debug("[4] Channel=%d, Antidx_CCK_keep=%d, Cck_mp_gain_idx_keep=%d\n",
1737*4882a593Smuzhiyun rpt5->channel, rpt5->antidx_a,
1738*4882a593Smuzhiyun rpt5->mp_gain_idx_a);
1739*4882a593Smuzhiyun pr_debug("[8] Rssi=%d\n",rpt5->rssi);
1740*4882a593Smuzhiyun pr_debug("[12] Avg_cfo=%d\n",rpt5->avg_cfo);
1741*4882a593Smuzhiyun pr_debug("[16] Coarse_cfo=%d, Coarse_cfo_msb=%d, Avg_cfo_msb=%d, Evm_hdr=%d\n",
1742*4882a593Smuzhiyun rpt5->coarse_cfo, rpt5->coarse_cfo_msb,
1743*4882a593Smuzhiyun rpt5->avg_cfo_msb, rpt5->evm_hdr);
1744*4882a593Smuzhiyun pr_debug("[20] Evm_pld=%d\n",rpt5->evm_pld);
1745*4882a593Smuzhiyun #endif
1746*4882a593Smuzhiyun } else {
1747*4882a593Smuzhiyun pr_debug("[0] Pkt_cnt=%d, Channel_msb=%d, Pwdb_a=%d, Gain_a=%d, TRSW=%d, AGC_table_b=%d, AGC_table_c=%d,\n",
1748*4882a593Smuzhiyun rpt0->pkt_cnt, rpt0->channel_msb, rpt0->pwdb_a,
1749*4882a593Smuzhiyun rpt0->gain_a, rpt0->trsw, rpt0->agc_table_b,
1750*4882a593Smuzhiyun rpt0->agc_table_c);
1751*4882a593Smuzhiyun pr_debug("[4] Path_Sel_o=%d, Gnt_BT_keep_cnt=%d, HW_AntSW_occur_keep_cck=%d,\n Band=%d, Channel=%d, AGC_table_a=%d, l_RXSC=%d, AGC_table_d=%d\n",
1752*4882a593Smuzhiyun rpt0->path_sel_o, rpt0->gnt_bt_keep_cck,
1753*4882a593Smuzhiyun rpt0->hw_antsw_occur_keep_cck, rpt0->band,
1754*4882a593Smuzhiyun rpt0->channel, rpt0->agc_table_a, rpt0->l_rxsc,
1755*4882a593Smuzhiyun rpt0->agc_table_d);
1756*4882a593Smuzhiyun pr_debug("[8] AntIdx={%d, %d, %d, %d}, Length=%d\n",
1757*4882a593Smuzhiyun rpt0->antidx_d, rpt0->antidx_c, rpt0->antidx_b,
1758*4882a593Smuzhiyun rpt0->antidx_a, rpt0->length);
1759*4882a593Smuzhiyun pr_debug("[12] MF_off=%d, SQloss=%d, lockbit=%d, raterr=%d, rxrate=%d, lna_h_a=%d, CCK_BB_power_a=%d, lna_l_a=%d, vga_a=%d, sq=%d\n",
1760*4882a593Smuzhiyun rpt0->mf_off, rpt0->sqloss, rpt0->lockbit,
1761*4882a593Smuzhiyun rpt0->raterr, rpt0->rxrate, rpt0->lna_h_a,
1762*4882a593Smuzhiyun rpt0->bb_power_a, rpt0->lna_l_a, rpt0->vga_a,
1763*4882a593Smuzhiyun rpt0->signal_quality);
1764*4882a593Smuzhiyun pr_debug("[16] Gain_b=%d, lna_h_b=%d, CCK_BB_power_b=%d, lna_l_b=%d, vga_b=%d, Pwdb_b=%d\n",
1765*4882a593Smuzhiyun rpt0->gain_b, rpt0->lna_h_b, rpt0->bb_power_b,
1766*4882a593Smuzhiyun rpt0->lna_l_b, rpt0->vga_b, rpt0->pwdb_b);
1767*4882a593Smuzhiyun pr_debug("[20] Gain_c=%d, lna_h_c=%d, CCK_BB_power_c=%d, lna_l_c=%d, vga_c=%d, Pwdb_c=%d\n",
1768*4882a593Smuzhiyun rpt0->gain_c, rpt0->lna_h_c, rpt0->bb_power_c,
1769*4882a593Smuzhiyun rpt0->lna_l_c, rpt0->vga_c, rpt0->pwdb_c);
1770*4882a593Smuzhiyun pr_debug("[24] Gain_d=%d, lna_h_d=%d, CCK_BB_power_d=%d, lna_l_d=%d, vga_d=%d, Pwdb_d=%d\n",
1771*4882a593Smuzhiyun rpt0->gain_c, rpt0->lna_h_c, rpt0->bb_power_c,
1772*4882a593Smuzhiyun rpt0->lna_l_c, rpt0->vga_c, rpt0->pwdb_c);
1773*4882a593Smuzhiyun }
1774*4882a593Smuzhiyun } else if (phy_status_page_num == 1) {
1775*4882a593Smuzhiyun pr_debug("[0] pwdb[C:A]={%d, %d, %d}, Channel_pri_msb=%d, Pkt_cnt=%d,\n",
1776*4882a593Smuzhiyun rpt1->pwdb_c, rpt1->pwdb_b, rpt1->pwdb_a,
1777*4882a593Smuzhiyun rpt1->channel_pri_msb, rpt1->pkt_cnt);
1778*4882a593Smuzhiyun pr_debug("[4] BF: %d, stbc=%d, ldpc=%d, gnt_bt=%d, band=%d, Ch_pri_lsb=%d, rxsc[ht, l]={%d, %d}, pwdb[D]=%d\n",
1779*4882a593Smuzhiyun rpt1->beamformed, rpt1->stbc, rpt1->ldpc, rpt1->gnt_bt,
1780*4882a593Smuzhiyun rpt1->band, rpt1->channel_pri_lsb, rpt1->ht_rxsc,
1781*4882a593Smuzhiyun rpt1->l_rxsc, rpt1->pwdb_d);
1782*4882a593Smuzhiyun pr_debug("[8] AntIdx[D:A]={%d, %d, %d, %d}, HW_AntSW_occur[D:A]={%d, %d, %d, %d}, Channel_sec[msb,lsb]={%d, %d}\n",
1783*4882a593Smuzhiyun rpt1->antidx_d, rpt1->antidx_c,
1784*4882a593Smuzhiyun rpt1->antidx_b, rpt1->antidx_a,
1785*4882a593Smuzhiyun rpt1->hw_antsw_occur_d, rpt1->hw_antsw_occur_c,
1786*4882a593Smuzhiyun rpt1->hw_antsw_occur_b, rpt1->hw_antsw_occur_a,
1787*4882a593Smuzhiyun rpt1->channel_sec_msb, rpt1->channel_sec_lsb);
1788*4882a593Smuzhiyun pr_debug("[12] GID=%d, PAID[msb,lsb]={%d,%d}\n",
1789*4882a593Smuzhiyun rpt1->gid, rpt1->paid_msb, rpt1->paid);
1790*4882a593Smuzhiyun pr_debug("[16] RX_EVM[D:A]={%d, %d, %d, %d}\n",
1791*4882a593Smuzhiyun rpt1->rxevm[3], rpt1->rxevm[2],
1792*4882a593Smuzhiyun rpt1->rxevm[1], rpt1->rxevm[0]);
1793*4882a593Smuzhiyun pr_debug("[20] CFO_tail[D:A]={%d, %d, %d, %d}\n",
1794*4882a593Smuzhiyun rpt1->cfo_tail[3], rpt1->cfo_tail[2],
1795*4882a593Smuzhiyun rpt1->cfo_tail[1], rpt1->cfo_tail[0]);
1796*4882a593Smuzhiyun pr_debug("[24] RX_SNR[D:A]={%d, %d, %d, %d}\n\n",
1797*4882a593Smuzhiyun rpt1->rxsnr[3], rpt1->rxsnr[2],
1798*4882a593Smuzhiyun rpt1->rxsnr[1], rpt1->rxsnr[0]);
1799*4882a593Smuzhiyun } else if (phy_status_page_num == 2 || phy_status_page_num == 3) {
1800*4882a593Smuzhiyun pr_debug("[0] pwdb[C:A]={%d, %d, %d}, Channel_mdb=%d, Pkt_cnt=%d\n",
1801*4882a593Smuzhiyun rpt2->pwdb[2], rpt2->pwdb[1], rpt2->pwdb[0],
1802*4882a593Smuzhiyun rpt2->channel_msb, rpt2->pkt_cnt);
1803*4882a593Smuzhiyun pr_debug("[4] BF=%d, STBC=%d, LDPC=%d, Gnt_BT=%d, band=%d, CH_lsb=%d, rxsc[ht, l]={%d, %d}, pwdb_D=%d\n",
1804*4882a593Smuzhiyun rpt2->beamformed, rpt2->stbc, rpt2->ldpc, rpt2->gnt_bt,
1805*4882a593Smuzhiyun rpt2->band, rpt2->channel_lsb,
1806*4882a593Smuzhiyun rpt2->ht_rxsc, rpt2->l_rxsc, rpt2->pwdb[3]);
1807*4882a593Smuzhiyun pr_debug("[8] AgcTab[D:A]={%d, %d, %d, %d}, pwed_th=%d, shift_l_map=%d\n",
1808*4882a593Smuzhiyun rpt2->agc_table_d, rpt2->agc_table_c,
1809*4882a593Smuzhiyun rpt2->agc_table_b, rpt2->agc_table_a,
1810*4882a593Smuzhiyun rpt2->pwed_th, rpt2->shift_l_map);
1811*4882a593Smuzhiyun pr_debug("[12] AvgNoisePowerdB=%d, mp_gain_c[msb, lsb]={%d, %d}, mp_gain_b[msb, lsb]={%d, %d}, mp_gain_a=%d, cnt_cca2agc_rdy=%d\n",
1812*4882a593Smuzhiyun rpt2->avg_noise_pwr_lsb, rpt2->mp_gain_c_msb,
1813*4882a593Smuzhiyun rpt2->mp_gain_c_lsb, rpt2->mp_gain_b_msb,
1814*4882a593Smuzhiyun rpt2->mp_gain_b_lsb, rpt2->mp_gain_a,
1815*4882a593Smuzhiyun rpt2->cnt_cca2agc_rdy);
1816*4882a593Smuzhiyun pr_debug("[16] HT AAGC gain[B:A]={%d, %d}, AAGC step[D:A]={%d, %d, %d, %d}, IsFreqSelectFadimg=%d, mp_gain_d=%d\n",
1817*4882a593Smuzhiyun rpt2->ht_aagc_gain[1], rpt2->ht_aagc_gain[0],
1818*4882a593Smuzhiyun rpt2->aagc_step_d, rpt2->aagc_step_c,
1819*4882a593Smuzhiyun rpt2->aagc_step_b, rpt2->aagc_step_a,
1820*4882a593Smuzhiyun rpt2->is_freq_select_fading, rpt2->mp_gain_d);
1821*4882a593Smuzhiyun pr_debug("[20] DAGC gain ant[B:A]={%d, %d}, HT AAGC gain[D:C]={%d, %d}\n",
1822*4882a593Smuzhiyun rpt2->dagc_gain[1], rpt2->dagc_gain[0],
1823*4882a593Smuzhiyun rpt2->ht_aagc_gain[3], rpt2->ht_aagc_gain[2]);
1824*4882a593Smuzhiyun pr_debug("[24] AvgNoisePwerdB=%d, syn_count[msb, lsb]={%d, %d}, counter=%d, DAGC gain ant[D:C]={%d, %d}\n",
1825*4882a593Smuzhiyun rpt2->avg_noise_pwr_msb, rpt2->syn_count_msb,
1826*4882a593Smuzhiyun rpt2->syn_count_lsb, rpt2->counter,
1827*4882a593Smuzhiyun rpt2->dagc_gain[3], rpt2->dagc_gain[2]);
1828*4882a593Smuzhiyun } else if (phy_status_page_num == 4) { /*type 4*/
1829*4882a593Smuzhiyun pr_debug("[0] pwdb[C:A]={%d, %d, %d}, Channel_mdb=%d, Pkt_cnt=%d\n",
1830*4882a593Smuzhiyun rpt3->pwdb[2], rpt3->pwdb[1], rpt3->pwdb[0],
1831*4882a593Smuzhiyun rpt3->channel_msb, rpt3->pkt_cnt);
1832*4882a593Smuzhiyun pr_debug("[4] BF=%d, STBC=%d, LDPC=%d, GNT_BT=%d, band=%d, CH_pri=%d, rxsc[ht, l]={%d, %d}, pwdb_D=%d\n",
1833*4882a593Smuzhiyun rpt3->beamformed, rpt3->stbc, rpt3->ldpc, rpt3->gnt_bt,
1834*4882a593Smuzhiyun rpt3->band, rpt3->channel_lsb, rpt3->ht_rxsc,
1835*4882a593Smuzhiyun rpt3->l_rxsc, rpt3->pwdb[3]);
1836*4882a593Smuzhiyun pr_debug("[8] AntIdx[D:A]={%d, %d, %d, %d}, HW_AntSW_occur[D:A]={%d, %d, %d, %d}, Training_done[D:A]={%d, %d, %d, %d},\n BadToneCnt_CN_excess_0=%d, BadToneCnt_min_eign_0=%d\n",
1837*4882a593Smuzhiyun rpt3->antidx_d, rpt3->antidx_c,
1838*4882a593Smuzhiyun rpt3->antidx_b, rpt3->antidx_a,
1839*4882a593Smuzhiyun rpt3->hw_antsw_occur_d, rpt3->hw_antsw_occur_c,
1840*4882a593Smuzhiyun rpt3->hw_antsw_occur_b, rpt3->hw_antsw_occur_a,
1841*4882a593Smuzhiyun rpt3->training_done_d, rpt3->training_done_c,
1842*4882a593Smuzhiyun rpt3->training_done_b, rpt3->training_done_a,
1843*4882a593Smuzhiyun rpt3->bad_tone_cnt_cn_excess_0,
1844*4882a593Smuzhiyun rpt3->bad_tone_cnt_min_eign_0);
1845*4882a593Smuzhiyun pr_debug("[12] avg_cond_num_1=%d, avg_cond_num_0=%d, bad_tone_cnt_cn_excess_1=%d,\n bad_tone_cnt_min_eign_1=%d, Tx_pkt_cnt=%d\n",
1846*4882a593Smuzhiyun ((rpt3->avg_cond_num_1_msb << 1) |
1847*4882a593Smuzhiyun rpt3->avg_cond_num_1_lsb),
1848*4882a593Smuzhiyun rpt3->avg_cond_num_0, rpt3->bad_tone_cnt_cn_excess_1,
1849*4882a593Smuzhiyun rpt3->bad_tone_cnt_min_eign_1, rpt3->tx_pkt_cnt);
1850*4882a593Smuzhiyun pr_debug("[16] Stream RXEVM[D:A]={%d, %d, %d, %d}\n",
1851*4882a593Smuzhiyun rpt3->rxevm[3], rpt3->rxevm[2],
1852*4882a593Smuzhiyun rpt3->rxevm[1], rpt3->rxevm[0]);
1853*4882a593Smuzhiyun pr_debug("[20] Eigenvalue[D:A]={%d, %d, %d, %d}\n",
1854*4882a593Smuzhiyun rpt3->eigenvalue[3], rpt3->eigenvalue[2],
1855*4882a593Smuzhiyun rpt3->eigenvalue[1], rpt3->eigenvalue[0]);
1856*4882a593Smuzhiyun pr_debug("[24] RX SNR[D:A]={%d, %d, %d, %d}\n",
1857*4882a593Smuzhiyun rpt3->rxsnr[3], rpt3->rxsnr[2],
1858*4882a593Smuzhiyun rpt3->rxsnr[1], rpt3->rxsnr[0]);
1859*4882a593Smuzhiyun } else if (phy_status_page_num == 5) { /*type 5*/
1860*4882a593Smuzhiyun pr_debug("[0] pwdb[C:A]={%d, %d, %d}, Channel_mdb=%d, Pkt_cnt=%d\n",
1861*4882a593Smuzhiyun rpt4->pwdb[2], rpt4->pwdb[1], rpt4->pwdb[0],
1862*4882a593Smuzhiyun rpt4->channel_msb, rpt4->pkt_cnt);
1863*4882a593Smuzhiyun pr_debug("[4] BF=%d, STBC=%d, LDPC=%d, GNT_BT=%d, band=%d, CH_pri=%d, rxsc[ht, l]={%d, %d}, pwdb_D=%d\n",
1864*4882a593Smuzhiyun rpt4->beamformed, rpt4->stbc, rpt4->ldpc, rpt4->gnt_bt,
1865*4882a593Smuzhiyun rpt4->band, rpt4->channel_lsb, rpt4->ht_rxsc,
1866*4882a593Smuzhiyun rpt4->l_rxsc, rpt4->pwdb[3]);
1867*4882a593Smuzhiyun pr_debug("[8] AntIdx[D:A]={%d, %d, %d, %d}, HW_AntSW_occur[D:A]={%d, %d, %d, %d}\n",
1868*4882a593Smuzhiyun rpt4->antidx_d, rpt4->antidx_c,
1869*4882a593Smuzhiyun rpt4->antidx_b, rpt4->antidx_a,
1870*4882a593Smuzhiyun rpt4->hw_antsw_occur_d, rpt4->hw_antsw_occur_c,
1871*4882a593Smuzhiyun rpt4->hw_antsw_occur_b, rpt4->hw_antsw_occur_a);
1872*4882a593Smuzhiyun pr_debug("[12] Inf_posD[1,0]={%d, %d}, Inf_posC[1,0]={%d, %d}, Inf_posB[1,0]={%d, %d}, Inf_posA[1,0]={%d, %d}, Tx_pkt_cnt=%d\n",
1873*4882a593Smuzhiyun rpt4->inf_pos_1_D_flg, rpt4->inf_pos_0_D_flg,
1874*4882a593Smuzhiyun rpt4->inf_pos_1_C_flg, rpt4->inf_pos_0_C_flg,
1875*4882a593Smuzhiyun rpt4->inf_pos_1_B_flg, rpt4->inf_pos_0_B_flg,
1876*4882a593Smuzhiyun rpt4->inf_pos_1_A_flg, rpt4->inf_pos_0_A_flg,
1877*4882a593Smuzhiyun rpt4->tx_pkt_cnt);
1878*4882a593Smuzhiyun pr_debug("[16] Inf_pos_B[1,0]={%d, %d}, Inf_pos_A[1,0]={%d, %d}\n",
1879*4882a593Smuzhiyun rpt4->inf_pos_1_b, rpt4->inf_pos_0_b,
1880*4882a593Smuzhiyun rpt4->inf_pos_1_a, rpt4->inf_pos_0_a);
1881*4882a593Smuzhiyun pr_debug("[20] Inf_pos_D[1,0]={%d, %d}, Inf_pos_C[1,0]={%d, %d}\n",
1882*4882a593Smuzhiyun rpt4->inf_pos_1_d, rpt4->inf_pos_0_d,
1883*4882a593Smuzhiyun rpt4->inf_pos_1_c, rpt4->inf_pos_0_c);
1884*4882a593Smuzhiyun }
1885*4882a593Smuzhiyun }
1886*4882a593Smuzhiyun
phydm_reset_phy_info_jgr3(struct dm_struct * phydm,struct phydm_phyinfo_struct * phy_info)1887*4882a593Smuzhiyun void phydm_reset_phy_info_jgr3(struct dm_struct *phydm,
1888*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
1889*4882a593Smuzhiyun {
1890*4882a593Smuzhiyun u8 i;
1891*4882a593Smuzhiyun
1892*4882a593Smuzhiyun phy_info->rx_pwdb_all = 0;
1893*4882a593Smuzhiyun phy_info->signal_quality = 0;
1894*4882a593Smuzhiyun phy_info->band_width = 0;
1895*4882a593Smuzhiyun phy_info->rx_count = 0;
1896*4882a593Smuzhiyun phy_info->rx_power = -110;
1897*4882a593Smuzhiyun phy_info->recv_signal_power = -110;
1898*4882a593Smuzhiyun phy_info->bt_rx_rssi_percentage = 0;
1899*4882a593Smuzhiyun phy_info->signal_strength = 0;
1900*4882a593Smuzhiyun phy_info->channel = 0;
1901*4882a593Smuzhiyun phy_info->is_mu_packet = 0;
1902*4882a593Smuzhiyun phy_info->is_beamformed = 0;
1903*4882a593Smuzhiyun phy_info->rxsc = 0;
1904*4882a593Smuzhiyun
1905*4882a593Smuzhiyun for (i = 0; i < 4; i++) {
1906*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = 0;
1907*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = 0;
1908*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = 0;
1909*4882a593Smuzhiyun phy_info->cfo_short[i] = 0;
1910*4882a593Smuzhiyun phy_info->cfo_tail[i] = 0;
1911*4882a593Smuzhiyun phy_info->rx_pwr[i] = -110;
1912*4882a593Smuzhiyun phy_info->rx_snr[i] = 0;
1913*4882a593Smuzhiyun }
1914*4882a593Smuzhiyun }
1915*4882a593Smuzhiyun
1916*4882a593Smuzhiyun #if 0
1917*4882a593Smuzhiyun void phydm_per_path_info_3rd(u8 rx_path, s8 pwr, s8 rx_evm, s8 cfo_tail,
1918*4882a593Smuzhiyun s8 rx_snr, struct phydm_phyinfo_struct *phy_info)
1919*4882a593Smuzhiyun {
1920*4882a593Smuzhiyun u8 evm_dbm = 0;
1921*4882a593Smuzhiyun u8 evm_percentage = 0;
1922*4882a593Smuzhiyun
1923*4882a593Smuzhiyun /* SNR is S(8,1), EVM is S(8,1), CFO is S(8,7) */
1924*4882a593Smuzhiyun
1925*4882a593Smuzhiyun evm_dbm = (rx_evm == -128) ? 0 : ((u8)(0 - rx_evm) >> 1);
1926*4882a593Smuzhiyun evm_percentage = (evm_dbm >= 34) ? 100 : evm_dbm * 3;
1927*4882a593Smuzhiyun
1928*4882a593Smuzhiyun phy_info->rx_pwr[rx_path] = pwr;
1929*4882a593Smuzhiyun
1930*4882a593Smuzhiyun /*@CFO(kHz) = CFO_tail * 312.5(kHz) / 2^7 ~= CFO tail * 5/2 (kHz)*/
1931*4882a593Smuzhiyun phy_info->cfo_tail[rx_path] = (cfo_tail * 5) >> 1;
1932*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[rx_path] = evm_dbm;
1933*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[rx_path] = phydm_pw_2_percent(pwr);
1934*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[rx_path] = evm_percentage;
1935*4882a593Smuzhiyun phy_info->rx_snr[rx_path] = rx_snr >> 1;
1936*4882a593Smuzhiyun }
1937*4882a593Smuzhiyun
1938*4882a593Smuzhiyun void phydm_common_phy_info_jgr3(s8 rx_power, u8 channel, boolean is_beamformed,
1939*4882a593Smuzhiyun boolean is_mu_packet, u8 bandwidth,
1940*4882a593Smuzhiyun u8 signal_quality, u8 rxsc,
1941*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
1942*4882a593Smuzhiyun {
1943*4882a593Smuzhiyun phy_info->rx_power = rx_power; /* RSSI in dB */
1944*4882a593Smuzhiyun phy_info->recv_signal_power = rx_power; /* RSSI in dB */
1945*4882a593Smuzhiyun phy_info->channel = channel; /* @channel number */
1946*4882a593Smuzhiyun phy_info->is_beamformed = is_beamformed; /* @apply BF */
1947*4882a593Smuzhiyun phy_info->is_mu_packet = is_mu_packet; /* @MU packet */
1948*4882a593Smuzhiyun phy_info->rxsc = rxsc;
1949*4882a593Smuzhiyun
1950*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_power); /*percentage */
1951*4882a593Smuzhiyun phy_info->signal_quality = signal_quality; /* signal quality */
1952*4882a593Smuzhiyun phy_info->band_width = bandwidth; /* @bandwidth */
1953*4882a593Smuzhiyun }
1954*4882a593Smuzhiyun #endif
1955*4882a593Smuzhiyun
phydm_get_physts_0_jgr3(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)1956*4882a593Smuzhiyun void phydm_get_physts_0_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
1957*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
1958*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
1959*4882a593Smuzhiyun {
1960*4882a593Smuzhiyun /* type 0 is used for cck packet */
1961*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type0 *phy_sts = NULL;
1962*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
1963*4882a593Smuzhiyun u8 sq = 0, i, rx_cnt = 0;
1964*4882a593Smuzhiyun s8 rx_power[4], pwdb;
1965*4882a593Smuzhiyun s8 rx_pwr_db_max = -120;
1966*4882a593Smuzhiyun
1967*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr3_type0 *)phy_status_inf;
1968*4882a593Smuzhiyun
1969*4882a593Smuzhiyun #if (RTL8197G_SUPPORT)
1970*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8197G) {
1971*4882a593Smuzhiyun if (dm->rx_ant_status == BB_PATH_B) {
1972*4882a593Smuzhiyun phy_sts->pwdb_b = phy_sts->pwdb_a;
1973*4882a593Smuzhiyun phy_sts->gain_b = phy_sts->gain_a;
1974*4882a593Smuzhiyun phy_sts->pwdb_a = 0;
1975*4882a593Smuzhiyun phy_sts->gain_a = 0;
1976*4882a593Smuzhiyun }
1977*4882a593Smuzhiyun }
1978*4882a593Smuzhiyun #endif
1979*4882a593Smuzhiyun
1980*4882a593Smuzhiyun rx_power[0] = phy_sts->pwdb_a;
1981*4882a593Smuzhiyun rx_power[1] = phy_sts->pwdb_b;
1982*4882a593Smuzhiyun rx_power[2] = phy_sts->pwdb_c;
1983*4882a593Smuzhiyun rx_power[3] = phy_sts->pwdb_d;
1984*4882a593Smuzhiyun
1985*4882a593Smuzhiyun #if (RTL8822C_SUPPORT || RTL8197G_SUPPORT)
1986*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8197G)) {
1987*4882a593Smuzhiyun struct phydm_physts *physts_table = &dm->dm_physts_table;
1988*4882a593Smuzhiyun if (phy_sts->gain_a < physts_table->cck_gi_l_bnd)
1989*4882a593Smuzhiyun rx_power[0] += ((physts_table->cck_gi_l_bnd -
1990*4882a593Smuzhiyun phy_sts->gain_a) << 1);
1991*4882a593Smuzhiyun else if (phy_sts->gain_a > physts_table->cck_gi_u_bnd)
1992*4882a593Smuzhiyun rx_power[0] -= ((phy_sts->gain_a -
1993*4882a593Smuzhiyun physts_table->cck_gi_u_bnd) << 1);
1994*4882a593Smuzhiyun
1995*4882a593Smuzhiyun if (phy_sts->gain_b < physts_table->cck_gi_l_bnd)
1996*4882a593Smuzhiyun rx_power[1] += ((physts_table->cck_gi_l_bnd -
1997*4882a593Smuzhiyun phy_sts->gain_b) << 1);
1998*4882a593Smuzhiyun else if (phy_sts->gain_b > physts_table->cck_gi_u_bnd)
1999*4882a593Smuzhiyun rx_power[1] -= ((phy_sts->gain_b -
2000*4882a593Smuzhiyun physts_table->cck_gi_u_bnd) << 1);
2001*4882a593Smuzhiyun }
2002*4882a593Smuzhiyun #endif
2003*4882a593Smuzhiyun
2004*4882a593Smuzhiyun /* @Update per-path information */
2005*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
2006*4882a593Smuzhiyun if ((dm->rx_ant_status & BIT(i)) == 0)
2007*4882a593Smuzhiyun continue;
2008*4882a593Smuzhiyun
2009*4882a593Smuzhiyun rx_cnt++; /* @check the number of the ant */
2010*4882a593Smuzhiyun
2011*4882a593Smuzhiyun if (rx_cnt > dm->num_rf_path)
2012*4882a593Smuzhiyun break;
2013*4882a593Smuzhiyun
2014*4882a593Smuzhiyun if (pktinfo->is_to_self)
2015*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = rx_power[i];
2016*4882a593Smuzhiyun
2017*4882a593Smuzhiyun /* @Setting the RX power: agc_idx -110 dBm*/
2018*4882a593Smuzhiyun pwdb = rx_power[i] - 110;
2019*4882a593Smuzhiyun
2020*4882a593Smuzhiyun phy_info->rx_pwr[i] = pwdb;
2021*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = phydm_pw_2_percent(pwdb);
2022*4882a593Smuzhiyun
2023*4882a593Smuzhiyun /* search maximum pwdb */
2024*4882a593Smuzhiyun if (pwdb > rx_pwr_db_max)
2025*4882a593Smuzhiyun rx_pwr_db_max = pwdb;
2026*4882a593Smuzhiyun }
2027*4882a593Smuzhiyun
2028*4882a593Smuzhiyun /* @Calculate Signal Quality*/
2029*4882a593Smuzhiyun if (phy_sts->signal_quality >= 64) {
2030*4882a593Smuzhiyun sq = 0;
2031*4882a593Smuzhiyun } else if (phy_sts->signal_quality <= 20) {
2032*4882a593Smuzhiyun sq = 100;
2033*4882a593Smuzhiyun } else {
2034*4882a593Smuzhiyun /* @mapping to 2~99% */
2035*4882a593Smuzhiyun sq = 64 - phy_sts->signal_quality;
2036*4882a593Smuzhiyun sq = ((sq << 3) + sq) >> 2;
2037*4882a593Smuzhiyun }
2038*4882a593Smuzhiyun
2039*4882a593Smuzhiyun /* @Modify CCK PWDB if old AGC */
2040*4882a593Smuzhiyun if (!dm->cck_new_agc) {
2041*4882a593Smuzhiyun u8 lna_idx[4], vga_idx[4];
2042*4882a593Smuzhiyun
2043*4882a593Smuzhiyun lna_idx[0] = ((phy_sts->lna_h_a << 3) | phy_sts->lna_l_a);
2044*4882a593Smuzhiyun vga_idx[0] = phy_sts->vga_a;
2045*4882a593Smuzhiyun lna_idx[1] = ((phy_sts->lna_h_b << 3) | phy_sts->lna_l_b);
2046*4882a593Smuzhiyun vga_idx[1] = phy_sts->vga_b;
2047*4882a593Smuzhiyun lna_idx[2] = ((phy_sts->lna_h_c << 3) | phy_sts->lna_l_c);
2048*4882a593Smuzhiyun vga_idx[2] = phy_sts->vga_c;
2049*4882a593Smuzhiyun lna_idx[3] = ((phy_sts->lna_h_d << 3) | phy_sts->lna_l_d);
2050*4882a593Smuzhiyun vga_idx[3] = phy_sts->vga_d;
2051*4882a593Smuzhiyun }
2052*4882a593Smuzhiyun
2053*4882a593Smuzhiyun /*@CCK no STBC and LDPC*/
2054*4882a593Smuzhiyun dbg_i->is_ldpc_pkt = false;
2055*4882a593Smuzhiyun dbg_i->is_stbc_pkt = false;
2056*4882a593Smuzhiyun
2057*4882a593Smuzhiyun /*cck channel has hw bug, [WLANBB-1429]*/
2058*4882a593Smuzhiyun phy_info->rx_count = (rx_cnt > 0) ? rx_cnt - 1 : 0; /*from 1~4 to 0~3 */
2059*4882a593Smuzhiyun phy_info->channel = 0;
2060*4882a593Smuzhiyun phy_info->rx_power = rx_pwr_db_max;
2061*4882a593Smuzhiyun phy_info->recv_signal_power = rx_pwr_db_max;
2062*4882a593Smuzhiyun phy_info->is_beamformed = false;
2063*4882a593Smuzhiyun phy_info->is_mu_packet = false;
2064*4882a593Smuzhiyun phy_info->rxsc = phy_sts->l_rxsc;
2065*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_pwr_db_max);
2066*4882a593Smuzhiyun phy_info->signal_quality = sq;
2067*4882a593Smuzhiyun phy_info->band_width = CHANNEL_WIDTH_20;
2068*4882a593Smuzhiyun
2069*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
2070*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2071*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2072*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2073*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2074*4882a593Smuzhiyun #endif
2075*4882a593Smuzhiyun }
2076*4882a593Smuzhiyun
phydm_get_physts_1_others_jgr3(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2077*4882a593Smuzhiyun void phydm_get_physts_1_others_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2078*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2079*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2080*4882a593Smuzhiyun {
2081*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type1 *phy_sts = NULL;
2082*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
2083*4882a593Smuzhiyun s8 evm = 0;
2084*4882a593Smuzhiyun u8 i;
2085*4882a593Smuzhiyun s8 sq = 0;
2086*4882a593Smuzhiyun
2087*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr3_type1 *)phy_status_inf;
2088*4882a593Smuzhiyun
2089*4882a593Smuzhiyun /* SNR: S(8,1), EVM: S(8,1), CFO: S(8,7) */
2090*4882a593Smuzhiyun
2091*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
2092*4882a593Smuzhiyun if ((dm->rx_ant_status & BIT(i)) == 0)
2093*4882a593Smuzhiyun continue;
2094*4882a593Smuzhiyun
2095*4882a593Smuzhiyun evm = phy_sts->rxevm[i];
2096*4882a593Smuzhiyun evm = (evm == -128) ? 0 : ((0 - evm) >> 1);
2097*4882a593Smuzhiyun sq = (evm >= 34) ? 100 : evm * 3; /* @Convert EVM to 0~100%*/
2098*4882a593Smuzhiyun
2099*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = (u8)evm;
2100*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = sq;
2101*4882a593Smuzhiyun phy_info->rx_snr[i] = phy_sts->rxsnr[i] >> 1;
2102*4882a593Smuzhiyun /*@CFO(kHz) = CFO_tail*312.5(kHz)/2^7 ~= CFO tail * 5/2 (kHz)*/
2103*4882a593Smuzhiyun phy_info->cfo_tail[i] = (phy_sts->cfo_tail[i] * 5) >> 1;
2104*4882a593Smuzhiyun dbg_i->cfo_tail[i] = (phy_sts->cfo_tail[i] * 5) >> 1;
2105*4882a593Smuzhiyun }
2106*4882a593Smuzhiyun phy_info->signal_quality = phy_info->rx_mimo_signal_quality[0];
2107*4882a593Smuzhiyun
2108*4882a593Smuzhiyun if (phy_sts->gid != 0 && phy_sts->gid != 63) {
2109*4882a593Smuzhiyun phy_info->is_mu_packet = true;
2110*4882a593Smuzhiyun dbg_i->num_qry_mu_pkt++;
2111*4882a593Smuzhiyun } else {
2112*4882a593Smuzhiyun phy_info->is_mu_packet = false;
2113*4882a593Smuzhiyun }
2114*4882a593Smuzhiyun
2115*4882a593Smuzhiyun phydm_parsing_cfo(dm, pktinfo, phy_sts->cfo_tail, pktinfo->rate_ss);
2116*4882a593Smuzhiyun
2117*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2118*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2119*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2120*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2121*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2122*4882a593Smuzhiyun #endif
2123*4882a593Smuzhiyun }
2124*4882a593Smuzhiyun
phydm_get_physts_2_others_jgr3(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2125*4882a593Smuzhiyun void phydm_get_physts_2_others_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2126*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2127*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2128*4882a593Smuzhiyun {
2129*4882a593Smuzhiyun /* type 2 & 3 is used for ofdm packet */
2130*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type2_3 *phy_sts = NULL;
2131*4882a593Smuzhiyun }
2132*4882a593Smuzhiyun
phydm_get_physts_4_others_jgr3(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2133*4882a593Smuzhiyun void phydm_get_physts_4_others_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2134*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2135*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2136*4882a593Smuzhiyun {
2137*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type4 *phy_sts = NULL;
2138*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
2139*4882a593Smuzhiyun s8 evm = 0;
2140*4882a593Smuzhiyun u8 i;
2141*4882a593Smuzhiyun s8 sq = 0;
2142*4882a593Smuzhiyun
2143*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr3_type4 *)phy_status_inf;
2144*4882a593Smuzhiyun
2145*4882a593Smuzhiyun /* SNR: S(8,1), EVM: S(8,1), CFO: S(8,7) */
2146*4882a593Smuzhiyun
2147*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
2148*4882a593Smuzhiyun if ((dm->rx_ant_status & BIT(i)) == 0)
2149*4882a593Smuzhiyun continue;
2150*4882a593Smuzhiyun
2151*4882a593Smuzhiyun evm = phy_sts->rxevm[i];
2152*4882a593Smuzhiyun evm = (evm == -128) ? 0 : ((0 - evm) >> 1);
2153*4882a593Smuzhiyun sq = (evm >= 34) ? 100 : evm * 3; /* @Convert EVM to 0~100%*/
2154*4882a593Smuzhiyun
2155*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = (u8)evm;
2156*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = sq;
2157*4882a593Smuzhiyun phy_info->rx_snr[i] = phy_sts->rxsnr[i] >> 1;
2158*4882a593Smuzhiyun }
2159*4882a593Smuzhiyun phy_info->signal_quality = phy_info->rx_mimo_signal_quality[0];
2160*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2161*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2162*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2163*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2164*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2165*4882a593Smuzhiyun #endif
2166*4882a593Smuzhiyun odm_move_memory(dm, dbg_i->eigen_val, phy_sts->eigenvalue, 4);
2167*4882a593Smuzhiyun dbg_i->condition_num_seg0 = phy_sts->avg_cond_num_0;
2168*4882a593Smuzhiyun }
2169*4882a593Smuzhiyun
phydm_get_physts_5_others_jgr3(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2170*4882a593Smuzhiyun void phydm_get_physts_5_others_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2171*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2172*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2173*4882a593Smuzhiyun {
2174*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type5 *phy_sts = NULL;
2175*4882a593Smuzhiyun
2176*4882a593Smuzhiyun }
2177*4882a593Smuzhiyun #if (RTL8723F_SUPPORT)
phydm_get_physts_6_jgr3(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2178*4882a593Smuzhiyun void phydm_get_physts_6_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2179*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2180*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2181*4882a593Smuzhiyun {
2182*4882a593Smuzhiyun /* type 0 is used for cck packet */
2183*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type6 *phy_sts = NULL;
2184*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
2185*4882a593Smuzhiyun u8 sq = 0, i, rx_cnt = 0;
2186*4882a593Smuzhiyun s8 rx_power[4], pwdb;
2187*4882a593Smuzhiyun s8 rx_pwr_db_max = -120;
2188*4882a593Smuzhiyun u8 evm = 0;
2189*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr3_type6 *)phy_status_inf;
2190*4882a593Smuzhiyun /* judy_add_8723F_0512 */
2191*4882a593Smuzhiyun /* rssi S(11,3) */
2192*4882a593Smuzhiyun rx_power[0] = (s8)((phy_sts->rssi_msb << 5) + (phy_sts->rssi >> 3));
2193*4882a593Smuzhiyun /* @Update per-path information */
2194*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
2195*4882a593Smuzhiyun if ((dm->rx_ant_status & BIT(i)) == 0)
2196*4882a593Smuzhiyun continue;
2197*4882a593Smuzhiyun
2198*4882a593Smuzhiyun rx_cnt++; /* @check the number of the ant */
2199*4882a593Smuzhiyun
2200*4882a593Smuzhiyun if (rx_cnt > dm->num_rf_path)
2201*4882a593Smuzhiyun break;
2202*4882a593Smuzhiyun
2203*4882a593Smuzhiyun if (pktinfo->is_to_self)
2204*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = rx_power[i]+110;
2205*4882a593Smuzhiyun
2206*4882a593Smuzhiyun /* @Setting the RX power: agc_idx dBm*/
2207*4882a593Smuzhiyun pwdb = rx_power[i];
2208*4882a593Smuzhiyun
2209*4882a593Smuzhiyun phy_info->rx_pwr[i] = pwdb;
2210*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = phydm_pw_2_percent(pwdb);
2211*4882a593Smuzhiyun
2212*4882a593Smuzhiyun /* search maximum pwdb */
2213*4882a593Smuzhiyun if (pwdb > rx_pwr_db_max)
2214*4882a593Smuzhiyun rx_pwr_db_max = pwdb;
2215*4882a593Smuzhiyun }
2216*4882a593Smuzhiyun
2217*4882a593Smuzhiyun /* @Calculate EVM U(8,2)*/
2218*4882a593Smuzhiyun evm = phy_sts->evm_pld >> 2;
2219*4882a593Smuzhiyun if (pktinfo->data_rate > ODM_RATE2M)
2220*4882a593Smuzhiyun phy_info->rx_cck_evm = (u8)(evm - 10);/* @5_5M/11M*/
2221*4882a593Smuzhiyun else
2222*4882a593Smuzhiyun phy_info->rx_cck_evm = (u8)(evm - 12);/* @1M/2M*/
2223*4882a593Smuzhiyun
2224*4882a593Smuzhiyun sq = (phy_info->rx_cck_evm >= 34) ? 100 : phy_info->rx_cck_evm * 3;
2225*4882a593Smuzhiyun phy_info->signal_quality = sq;
2226*4882a593Smuzhiyun /*@CCK no STBC and LDPC*/
2227*4882a593Smuzhiyun dbg_i->is_ldpc_pkt = false;
2228*4882a593Smuzhiyun dbg_i->is_stbc_pkt = false;
2229*4882a593Smuzhiyun
2230*4882a593Smuzhiyun /*cck channel has hw bug, [WLANBB-1429]*/
2231*4882a593Smuzhiyun phy_info->rx_count = (rx_cnt > 0) ? rx_cnt - 1 : 0; /*from 1~4 to 0~3 */
2232*4882a593Smuzhiyun phy_info->channel = 0;
2233*4882a593Smuzhiyun phy_info->rx_power = rx_pwr_db_max;
2234*4882a593Smuzhiyun phy_info->recv_signal_power = rx_pwr_db_max;
2235*4882a593Smuzhiyun phy_info->is_beamformed = false;
2236*4882a593Smuzhiyun phy_info->is_mu_packet = false;
2237*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_pwr_db_max);
2238*4882a593Smuzhiyun phy_info->band_width = CHANNEL_WIDTH_20;
2239*4882a593Smuzhiyun
2240*4882a593Smuzhiyun //phydm_parsing_cfo(dm, pktinfo, phy_sts->avg_cfo, pktinfo->rate_ss);
2241*4882a593Smuzhiyun
2242*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
2243*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2244*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = 0;
2245*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = 0;
2246*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = 0;
2247*4882a593Smuzhiyun #endif
2248*4882a593Smuzhiyun }
2249*4882a593Smuzhiyun #endif
phydm_get_physts_ofdm_cmn_jgr3(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2250*4882a593Smuzhiyun void phydm_get_physts_ofdm_cmn_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2251*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2252*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2253*4882a593Smuzhiyun {
2254*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_ofdm_cmn *phy_sts = NULL;
2255*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
2256*4882a593Smuzhiyun s8 rx_pwr_db_max = -120;
2257*4882a593Smuzhiyun s8 pwdb = 0;
2258*4882a593Smuzhiyun u8 i, rx_cnt = 0;
2259*4882a593Smuzhiyun
2260*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr3_ofdm_cmn *)phy_status_inf;
2261*4882a593Smuzhiyun
2262*4882a593Smuzhiyun /* Parsing Offset0 & 4*/
2263*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
2264*4882a593Smuzhiyun if ((dm->rx_ant_status & BIT(i)) == 0)
2265*4882a593Smuzhiyun continue;
2266*4882a593Smuzhiyun
2267*4882a593Smuzhiyun rx_cnt++; /* @check the number of the ant */
2268*4882a593Smuzhiyun
2269*4882a593Smuzhiyun pwdb = (s8)phy_sts->pwdb[i] - 110; /*@dB*/
2270*4882a593Smuzhiyun
2271*4882a593Smuzhiyun if (pktinfo->is_to_self)
2272*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = phy_sts->pwdb[i];
2273*4882a593Smuzhiyun
2274*4882a593Smuzhiyun /* search maximum pwdb */
2275*4882a593Smuzhiyun if (pwdb > rx_pwr_db_max)
2276*4882a593Smuzhiyun rx_pwr_db_max = pwdb;
2277*4882a593Smuzhiyun
2278*4882a593Smuzhiyun phy_info->rx_pwr[i] = pwdb;
2279*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = phydm_pw_2_percent(pwdb);
2280*4882a593Smuzhiyun }
2281*4882a593Smuzhiyun
2282*4882a593Smuzhiyun phy_info->rx_count = (rx_cnt > 0) ? rx_cnt - 1 : 0; /*from 1~4 to 0~3 */
2283*4882a593Smuzhiyun phy_info->rx_power = rx_pwr_db_max;
2284*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_pwr_db_max);
2285*4882a593Smuzhiyun phy_info->recv_signal_power = rx_pwr_db_max;
2286*4882a593Smuzhiyun phy_info->channel = phy_sts->channel_lsb;
2287*4882a593Smuzhiyun phy_info->is_beamformed = (boolean)phy_sts->beamformed;
2288*4882a593Smuzhiyun phy_info->rxsc = (PHYDM_IS_LEGACY_RATE(pktinfo->data_rate)) ?
2289*4882a593Smuzhiyun phy_sts->l_rxsc : phy_sts->ht_rxsc;
2290*4882a593Smuzhiyun phy_info->band_width = phydm_rxsc_2_bw(dm, phy_info->rxsc);
2291*4882a593Smuzhiyun
2292*4882a593Smuzhiyun dbg_i->is_ldpc_pkt = phy_sts->ldpc;
2293*4882a593Smuzhiyun dbg_i->is_stbc_pkt = phy_sts->stbc;
2294*4882a593Smuzhiyun dbg_i->num_qry_bf_pkt += phy_sts->beamformed;
2295*4882a593Smuzhiyun }
2296*4882a593Smuzhiyun
phydm_process_dm_rssi_jgr3(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)2297*4882a593Smuzhiyun void phydm_process_dm_rssi_jgr3(struct dm_struct *dm,
2298*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
2299*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
2300*4882a593Smuzhiyun {
2301*4882a593Smuzhiyun struct cmn_sta_info *sta = NULL;
2302*4882a593Smuzhiyun struct rssi_info *rssi_t = NULL;
2303*4882a593Smuzhiyun u8 rssi_tmp = 0;
2304*4882a593Smuzhiyun u64 rssi_linear = 0;
2305*4882a593Smuzhiyun s16 rssi_db = 0;
2306*4882a593Smuzhiyun u8 i = 0;
2307*4882a593Smuzhiyun u8 rx_count = 0;
2308*4882a593Smuzhiyun
2309*4882a593Smuzhiyun #if (defined(PHYDM_CCK_RX_PATHDIV_SUPPORT))
2310*4882a593Smuzhiyun struct phydm_cck_rx_pathdiv *cckrx_t = &dm->dm_cck_rx_pathdiv_table;
2311*4882a593Smuzhiyun #endif
2312*4882a593Smuzhiyun
2313*4882a593Smuzhiyun /*@[Step4]*/
2314*4882a593Smuzhiyun if (pktinfo->station_id >= ODM_ASSOCIATE_ENTRY_NUM)
2315*4882a593Smuzhiyun return;
2316*4882a593Smuzhiyun
2317*4882a593Smuzhiyun sta = dm->phydm_sta_info[pktinfo->station_id];
2318*4882a593Smuzhiyun
2319*4882a593Smuzhiyun if (!is_sta_active(sta))
2320*4882a593Smuzhiyun return;
2321*4882a593Smuzhiyun
2322*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid) /*@data frame only*/
2323*4882a593Smuzhiyun return;
2324*4882a593Smuzhiyun
2325*4882a593Smuzhiyun if (!(pktinfo->is_packet_to_self) && !(pktinfo->is_packet_beacon))
2326*4882a593Smuzhiyun return;
2327*4882a593Smuzhiyun
2328*4882a593Smuzhiyun if (pktinfo->is_packet_beacon) {
2329*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_beacon_pkt++;
2330*4882a593Smuzhiyun dm->phy_dbg_info.beacon_phy_rate = pktinfo->data_rate;
2331*4882a593Smuzhiyun }
2332*4882a593Smuzhiyun
2333*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2334*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_ANT_DIV)
2335*4882a593Smuzhiyun odm_process_rssi_for_ant_div(dm, phy_info, pktinfo);
2336*4882a593Smuzhiyun #endif
2337*4882a593Smuzhiyun
2338*4882a593Smuzhiyun #ifdef ODM_EVM_ENHANCE_ANTDIV
2339*4882a593Smuzhiyun phydm_rx_rate_for_antdiv(dm, pktinfo);
2340*4882a593Smuzhiyun #endif
2341*4882a593Smuzhiyun
2342*4882a593Smuzhiyun #if (defined(CONFIG_PATH_DIVERSITY))
2343*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_PATH_DIV)
2344*4882a593Smuzhiyun phydm_process_rssi_for_path_div(dm, phy_info, pktinfo);
2345*4882a593Smuzhiyun #endif
2346*4882a593Smuzhiyun
2347*4882a593Smuzhiyun #if (defined(PHYDM_CCK_RX_PATHDIV_SUPPORT))
2348*4882a593Smuzhiyun if (cckrx_t->en_cck_rx_pathdiv)
2349*4882a593Smuzhiyun phydm_process_rssi_for_cck_rx_pathdiv(dm, phy_info, pktinfo);
2350*4882a593Smuzhiyun #endif
2351*4882a593Smuzhiyun
2352*4882a593Smuzhiyun rssi_t = &sta->rssi_stat;
2353*4882a593Smuzhiyun
2354*4882a593Smuzhiyun for (i = 0; i < dm->num_rf_path; i++) {
2355*4882a593Smuzhiyun rssi_tmp = phy_info->rx_mimo_signal_strength[i];
2356*4882a593Smuzhiyun if (rssi_tmp != 0) {
2357*4882a593Smuzhiyun rx_count++;
2358*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_tmp);
2359*4882a593Smuzhiyun }
2360*4882a593Smuzhiyun }
2361*4882a593Smuzhiyun /* @Rounding and removing fractional bits */
2362*4882a593Smuzhiyun rssi_linear = (rssi_linear + (1 << (FRAC_BITS - 1))) >> FRAC_BITS;
2363*4882a593Smuzhiyun
2364*4882a593Smuzhiyun switch (rx_count) {
2365*4882a593Smuzhiyun case 2:
2366*4882a593Smuzhiyun rssi_linear = DIVIDED_2(rssi_linear);
2367*4882a593Smuzhiyun break;
2368*4882a593Smuzhiyun case 3:
2369*4882a593Smuzhiyun rssi_linear = DIVIDED_3(rssi_linear);
2370*4882a593Smuzhiyun break;
2371*4882a593Smuzhiyun case 4:
2372*4882a593Smuzhiyun rssi_linear = DIVIDED_4(rssi_linear);
2373*4882a593Smuzhiyun break;
2374*4882a593Smuzhiyun }
2375*4882a593Smuzhiyun
2376*4882a593Smuzhiyun rssi_db = (s16)odm_convert_to_db(rssi_linear);
2377*4882a593Smuzhiyun
2378*4882a593Smuzhiyun if (rssi_t->rssi_acc == 0) {
2379*4882a593Smuzhiyun rssi_t->rssi_acc = (s16)(rssi_db << RSSI_MA);
2380*4882a593Smuzhiyun rssi_t->rssi = (s8)(rssi_db);
2381*4882a593Smuzhiyun } else {
2382*4882a593Smuzhiyun rssi_t->rssi_acc = MA_ACC(rssi_t->rssi_acc, rssi_db, RSSI_MA);
2383*4882a593Smuzhiyun rssi_t->rssi = (s8)GET_MA_VAL(rssi_t->rssi_acc, RSSI_MA);
2384*4882a593Smuzhiyun }
2385*4882a593Smuzhiyun
2386*4882a593Smuzhiyun if (pktinfo->is_cck_rate)
2387*4882a593Smuzhiyun rssi_t->rssi_cck = (s8)rssi_db;
2388*4882a593Smuzhiyun else
2389*4882a593Smuzhiyun rssi_t->rssi_ofdm = (s8)rssi_db;
2390*4882a593Smuzhiyun }
2391*4882a593Smuzhiyun
phydm_rx_physts_jgr3(void * dm_void,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2392*4882a593Smuzhiyun void phydm_rx_physts_jgr3(void *dm_void, u8 *phy_sts,
2393*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2394*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2395*4882a593Smuzhiyun {
2396*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
2397*4882a593Smuzhiyun u8 phy_status_type = (*phy_sts & 0xf);
2398*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8723F) {
2399*4882a593Smuzhiyun if (pktinfo->data_rate <= ODM_RATE11M)
2400*4882a593Smuzhiyun phy_status_type = 6;
2401*4882a593Smuzhiyun }
2402*4882a593Smuzhiyun /*@[Step 2]*/
2403*4882a593Smuzhiyun /*phydm_reset_phy_info_jgr3(dm, phy_info);*/ /* @Memory reset */
2404*4882a593Smuzhiyun
2405*4882a593Smuzhiyun /* Phy status parsing */
2406*4882a593Smuzhiyun switch (phy_status_type) {
2407*4882a593Smuzhiyun case 0: /*@CCK*/
2408*4882a593Smuzhiyun phydm_get_physts_0_jgr3(dm, phy_sts, pktinfo, phy_info);
2409*4882a593Smuzhiyun break;
2410*4882a593Smuzhiyun case 1:
2411*4882a593Smuzhiyun phydm_get_physts_ofdm_cmn_jgr3(dm, phy_sts, pktinfo, phy_info);
2412*4882a593Smuzhiyun phydm_get_physts_1_others_jgr3(dm, phy_sts, pktinfo, phy_info);
2413*4882a593Smuzhiyun break;
2414*4882a593Smuzhiyun case 2:
2415*4882a593Smuzhiyun case 3:
2416*4882a593Smuzhiyun phydm_get_physts_ofdm_cmn_jgr3(dm, phy_sts, pktinfo, phy_info);
2417*4882a593Smuzhiyun phydm_get_physts_2_others_jgr3(dm, phy_sts, pktinfo, phy_info);
2418*4882a593Smuzhiyun break;
2419*4882a593Smuzhiyun case 4:
2420*4882a593Smuzhiyun phydm_get_physts_ofdm_cmn_jgr3(dm, phy_sts, pktinfo, phy_info);
2421*4882a593Smuzhiyun phydm_get_physts_4_others_jgr3(dm, phy_sts, pktinfo, phy_info);
2422*4882a593Smuzhiyun break;
2423*4882a593Smuzhiyun case 5:
2424*4882a593Smuzhiyun phydm_get_physts_ofdm_cmn_jgr3(dm, phy_sts, pktinfo, phy_info);
2425*4882a593Smuzhiyun phydm_get_physts_5_others_jgr3(dm, phy_sts, pktinfo, phy_info);
2426*4882a593Smuzhiyun break;
2427*4882a593Smuzhiyun #if (RTL8723F_SUPPORT)
2428*4882a593Smuzhiyun case 6:
2429*4882a593Smuzhiyun phydm_get_physts_6_jgr3(dm, phy_sts, pktinfo, phy_info);
2430*4882a593Smuzhiyun break;
2431*4882a593Smuzhiyun #endif
2432*4882a593Smuzhiyun default:
2433*4882a593Smuzhiyun break;
2434*4882a593Smuzhiyun }
2435*4882a593Smuzhiyun
2436*4882a593Smuzhiyun #if 0
2437*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "RSSI: {%d, %d}\n",
2438*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[0],
2439*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[1]);
2440*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "rxdb: {%d, %d}\n",
2441*4882a593Smuzhiyun phy_info->rx_pwr[0], phy_info->rx_pwr[1]);
2442*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "EVM: {%d, %d}\n",
2443*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[0], phy_info->rx_mimo_evm_dbm[1]);
2444*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "SQ: {%d, %d}\n",
2445*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[0],
2446*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[1]);
2447*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "SNR: {%d, %d}\n",
2448*4882a593Smuzhiyun phy_info->rx_snr[0], phy_info->rx_snr[1]);
2449*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "CFO: {%d, %d}\n",
2450*4882a593Smuzhiyun phy_info->cfo_tail[0], phy_info->cfo_tail[1]);
2451*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
2452*4882a593Smuzhiyun "rx_pwdb_all = %d, rx_power = %d, recv_signal_power = %d\n",
2453*4882a593Smuzhiyun phy_info->rx_pwdb_all, phy_info->rx_power,
2454*4882a593Smuzhiyun phy_info->recv_signal_power);
2455*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "signal_quality = %d\n",
2456*4882a593Smuzhiyun phy_info->signal_quality);
2457*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
2458*4882a593Smuzhiyun "is_beamformed = %d, is_mu_packet = %d, rx_count = %d\n",
2459*4882a593Smuzhiyun phy_info->is_beamformed, phy_info->is_mu_packet,
2460*4882a593Smuzhiyun phy_info->rx_count);
2461*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
2462*4882a593Smuzhiyun "channel = %d, rxsc = %d, band_width = %d\n",
2463*4882a593Smuzhiyun phy_info->channel, phy_info->rxsc, phy_info->band_width);
2464*4882a593Smuzhiyun #endif
2465*4882a593Smuzhiyun
2466*4882a593Smuzhiyun /*@[Step 1]*/
2467*4882a593Smuzhiyun phydm_print_phystat_jgr3(dm, phy_sts, pktinfo, phy_info);
2468*4882a593Smuzhiyun }
2469*4882a593Smuzhiyun
2470*4882a593Smuzhiyun #endif
2471*4882a593Smuzhiyun
2472*4882a593Smuzhiyun #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
2473*4882a593Smuzhiyun /* @For 8822B only!! need to move to FW finally */
2474*4882a593Smuzhiyun /*@==============================================*/
2475*4882a593Smuzhiyun
2476*4882a593Smuzhiyun boolean
phydm_query_is_mu_api(struct dm_struct * phydm,u8 ppdu_idx,u8 * p_data_rate,u8 * p_gid)2477*4882a593Smuzhiyun phydm_query_is_mu_api(struct dm_struct *phydm, u8 ppdu_idx, u8 *p_data_rate,
2478*4882a593Smuzhiyun u8 *p_gid)
2479*4882a593Smuzhiyun {
2480*4882a593Smuzhiyun u8 data_rate = 0, gid = 0;
2481*4882a593Smuzhiyun boolean is_mu = false;
2482*4882a593Smuzhiyun
2483*4882a593Smuzhiyun data_rate = phydm->phy_dbg_info.num_of_ppdu[ppdu_idx];
2484*4882a593Smuzhiyun gid = phydm->phy_dbg_info.gid_num[ppdu_idx];
2485*4882a593Smuzhiyun
2486*4882a593Smuzhiyun if (data_rate & BIT(7)) {
2487*4882a593Smuzhiyun is_mu = true;
2488*4882a593Smuzhiyun data_rate = data_rate & ~(BIT(7));
2489*4882a593Smuzhiyun } else {
2490*4882a593Smuzhiyun is_mu = false;
2491*4882a593Smuzhiyun }
2492*4882a593Smuzhiyun
2493*4882a593Smuzhiyun *p_data_rate = data_rate;
2494*4882a593Smuzhiyun *p_gid = gid;
2495*4882a593Smuzhiyun
2496*4882a593Smuzhiyun return is_mu;
2497*4882a593Smuzhiyun }
2498*4882a593Smuzhiyun
phydm_print_phy_sts_jgr2(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2499*4882a593Smuzhiyun void phydm_print_phy_sts_jgr2(struct dm_struct *dm, u8 *phy_status_inf,
2500*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2501*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2502*4882a593Smuzhiyun {
2503*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type0 *rpt0 = NULL;
2504*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type1 *rpt = NULL;
2505*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type2 *rpt2 = NULL;
2506*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
2507*4882a593Smuzhiyun u8 phy_status_page_num = (*phy_status_inf & 0xf);
2508*4882a593Smuzhiyun u32 phy_status[PHY_STATUS_JRGUAR2_DW_LEN] = {0};
2509*4882a593Smuzhiyun u8 i;
2510*4882a593Smuzhiyun u32 size = PHY_STATUS_JRGUAR2_DW_LEN << 2;
2511*4882a593Smuzhiyun
2512*4882a593Smuzhiyun rpt0 = (struct phy_sts_rpt_jgr2_type0 *)phy_status_inf;
2513*4882a593Smuzhiyun rpt = (struct phy_sts_rpt_jgr2_type1 *)phy_status_inf;
2514*4882a593Smuzhiyun rpt2 = (struct phy_sts_rpt_jgr2_type2 *)phy_status_inf;
2515*4882a593Smuzhiyun
2516*4882a593Smuzhiyun odm_move_memory(dm, phy_status, phy_status_inf, size);
2517*4882a593Smuzhiyun
2518*4882a593Smuzhiyun if (!(dm->debug_components & DBG_PHY_STATUS))
2519*4882a593Smuzhiyun return;
2520*4882a593Smuzhiyun
2521*4882a593Smuzhiyun if (dbg->show_phy_sts_all_pkt == 0) {
2522*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
2523*4882a593Smuzhiyun return;
2524*4882a593Smuzhiyun }
2525*4882a593Smuzhiyun
2526*4882a593Smuzhiyun dbg->show_phy_sts_cnt++;
2527*4882a593Smuzhiyun #if 0
2528*4882a593Smuzhiyun dbg_print("cnt=%d, max=%d\n",
2529*4882a593Smuzhiyun dbg->show_phy_sts_cnt, dbg->show_phy_sts_max_cnt);
2530*4882a593Smuzhiyun #endif
2531*4882a593Smuzhiyun
2532*4882a593Smuzhiyun if (dbg->show_phy_sts_max_cnt != SHOW_PHY_STATUS_UNLIMITED) {
2533*4882a593Smuzhiyun if (dbg->show_phy_sts_cnt > dbg->show_phy_sts_max_cnt)
2534*4882a593Smuzhiyun return;
2535*4882a593Smuzhiyun }
2536*4882a593Smuzhiyun
2537*4882a593Smuzhiyun pr_debug("Phy Status Rpt: OFDM_%d\n", phy_status_page_num);
2538*4882a593Smuzhiyun pr_debug("StaID=%d, RxRate = 0x%x match_bssid=%d\n",
2539*4882a593Smuzhiyun pktinfo->station_id, pktinfo->data_rate,
2540*4882a593Smuzhiyun pktinfo->is_packet_match_bssid);
2541*4882a593Smuzhiyun
2542*4882a593Smuzhiyun for (i = 0; i < PHY_STATUS_JRGUAR2_DW_LEN; i++)
2543*4882a593Smuzhiyun pr_debug("Offset[%d:%d] = 0x%x\n",
2544*4882a593Smuzhiyun ((4 * i) + 3), (4 * i), phy_status[i]);
2545*4882a593Smuzhiyun
2546*4882a593Smuzhiyun if (phy_status_page_num == 0) {
2547*4882a593Smuzhiyun pr_debug("[0] TRSW=%d, MP_gain_idx=%d, pwdb=%d\n",
2548*4882a593Smuzhiyun rpt0->trsw, rpt0->gain, rpt0->pwdb);
2549*4882a593Smuzhiyun pr_debug("[4] band=%d, CH=%d, agc_table = %d, rxsc = %d\n",
2550*4882a593Smuzhiyun rpt0->band, rpt0->channel,
2551*4882a593Smuzhiyun rpt0->agc_table, rpt0->rxsc);
2552*4882a593Smuzhiyun pr_debug("[8] AntIdx[D:A]={%d, %d, %d, %d}, LSIG_len=%d\n",
2553*4882a593Smuzhiyun rpt0->antidx_d, rpt0->antidx_c, rpt0->antidx_b,
2554*4882a593Smuzhiyun rpt0->antidx_a, rpt0->length);
2555*4882a593Smuzhiyun pr_debug("[12] lna_h=%d, bb_pwr=%d, lna_l=%d, vga=%d, sq=%d\n",
2556*4882a593Smuzhiyun rpt0->lna_h, rpt0->bb_power, rpt0->lna_l,
2557*4882a593Smuzhiyun rpt0->vga, rpt0->signal_quality);
2558*4882a593Smuzhiyun
2559*4882a593Smuzhiyun } else if (phy_status_page_num == 1) {
2560*4882a593Smuzhiyun pr_debug("[0] pwdb[D:A]={%d, %d, %d, %d}\n",
2561*4882a593Smuzhiyun rpt->pwdb[3], rpt->pwdb[2],
2562*4882a593Smuzhiyun rpt->pwdb[1], rpt->pwdb[0]);
2563*4882a593Smuzhiyun pr_debug("[4] BF: %d, ldpc=%d, stbc=%d, g_bt=%d, antsw=%d, band=%d, CH=%d, rxsc[ht, l]={%d, %d}\n",
2564*4882a593Smuzhiyun rpt->beamformed, rpt->ldpc, rpt->stbc, rpt->gnt_bt,
2565*4882a593Smuzhiyun rpt->hw_antsw_occu, rpt->band, rpt->channel,
2566*4882a593Smuzhiyun rpt->ht_rxsc, rpt->l_rxsc);
2567*4882a593Smuzhiyun pr_debug("[8] AntIdx[D:A]={%d, %d, %d, %d}, LSIG_len=%d\n",
2568*4882a593Smuzhiyun rpt->antidx_d, rpt->antidx_c, rpt->antidx_b,
2569*4882a593Smuzhiyun rpt->antidx_a, rpt->lsig_length);
2570*4882a593Smuzhiyun pr_debug("[12] rf_mode=%d, NBI=%d, Intf_pos=%d, GID=%d, PAID=%d\n",
2571*4882a593Smuzhiyun rpt->rf_mode, rpt->nb_intf_flag,
2572*4882a593Smuzhiyun (rpt->intf_pos + (rpt->intf_pos_msb << 8)), rpt->gid,
2573*4882a593Smuzhiyun (rpt->paid + (rpt->paid_msb << 8)));
2574*4882a593Smuzhiyun pr_debug("[16] EVM[D:A]={%d, %d, %d, %d}\n",
2575*4882a593Smuzhiyun rpt->rxevm[3], rpt->rxevm[2],
2576*4882a593Smuzhiyun rpt->rxevm[1], rpt->rxevm[0]);
2577*4882a593Smuzhiyun pr_debug("[20] CFO[D:A]={%d, %d, %d, %d}\n",
2578*4882a593Smuzhiyun rpt->cfo_tail[3], rpt->cfo_tail[2], rpt->cfo_tail[1],
2579*4882a593Smuzhiyun rpt->cfo_tail[0]);
2580*4882a593Smuzhiyun pr_debug("[24] SNR[D:A]={%d, %d, %d, %d}\n\n",
2581*4882a593Smuzhiyun rpt->rxsnr[3], rpt->rxsnr[2], rpt->rxsnr[1],
2582*4882a593Smuzhiyun rpt->rxsnr[0]);
2583*4882a593Smuzhiyun
2584*4882a593Smuzhiyun } else if (phy_status_page_num == 2) {
2585*4882a593Smuzhiyun pr_debug("[0] pwdb[D:A]={%d, %d, %d, %d}\n",
2586*4882a593Smuzhiyun rpt2->pwdb[3], rpt2->pwdb[2], rpt2->pwdb[1],
2587*4882a593Smuzhiyun rpt2->pwdb[0]);
2588*4882a593Smuzhiyun pr_debug("[4] BF: %d, ldpc=%d, stbc=%d, g_bt=%d, antsw=%d, band=%d, CH=%d, rxsc[ht,l]={%d, %d}\n",
2589*4882a593Smuzhiyun rpt2->beamformed, rpt2->ldpc, rpt2->stbc, rpt2->gnt_bt,
2590*4882a593Smuzhiyun rpt2->hw_antsw_occu, rpt2->band, rpt2->channel,
2591*4882a593Smuzhiyun rpt2->ht_rxsc, rpt2->l_rxsc);
2592*4882a593Smuzhiyun pr_debug("[8] AgcTab[D:A]={%d, %d, %d, %d}, cnt_pw2cca=%d, shift_l_map=%d\n",
2593*4882a593Smuzhiyun rpt2->agc_table_d, rpt2->agc_table_c,
2594*4882a593Smuzhiyun rpt2->agc_table_b, rpt2->agc_table_a,
2595*4882a593Smuzhiyun rpt2->cnt_pw2cca, rpt2->shift_l_map);
2596*4882a593Smuzhiyun pr_debug("[12] (TRSW|Gain)[D:A]={%d %d, %d %d, %d %d, %d %d}, cnt_cca2agc_rdy=%d\n",
2597*4882a593Smuzhiyun rpt2->trsw_d, rpt2->gain_d, rpt2->trsw_c, rpt2->gain_c,
2598*4882a593Smuzhiyun rpt2->trsw_b, rpt2->gain_b, rpt2->trsw_a,
2599*4882a593Smuzhiyun rpt2->gain_a, rpt2->cnt_cca2agc_rdy);
2600*4882a593Smuzhiyun pr_debug("[16] AAGC step[D:A]={%d, %d, %d, %d} HT AAGC gain[D:A]={%d, %d, %d, %d}\n",
2601*4882a593Smuzhiyun rpt2->aagc_step_d, rpt2->aagc_step_c,
2602*4882a593Smuzhiyun rpt2->aagc_step_b, rpt2->aagc_step_a,
2603*4882a593Smuzhiyun rpt2->ht_aagc_gain[3], rpt2->ht_aagc_gain[2],
2604*4882a593Smuzhiyun rpt2->ht_aagc_gain[1], rpt2->ht_aagc_gain[0]);
2605*4882a593Smuzhiyun pr_debug("[20] DAGC gain[D:A]={%d, %d, %d, %d}\n",
2606*4882a593Smuzhiyun rpt2->dagc_gain[3],
2607*4882a593Smuzhiyun rpt2->dagc_gain[2], rpt2->dagc_gain[1],
2608*4882a593Smuzhiyun rpt2->dagc_gain[0]);
2609*4882a593Smuzhiyun pr_debug("[24] syn_cnt: %d, Cnt=%d\n\n",
2610*4882a593Smuzhiyun rpt2->syn_count, rpt2->counter);
2611*4882a593Smuzhiyun }
2612*4882a593Smuzhiyun }
2613*4882a593Smuzhiyun
phydm_set_per_path_phy_info(u8 rx_path,s8 pwr,s8 rx_evm,s8 cfo_tail,s8 rx_snr,u8 ant_idx,struct phydm_phyinfo_struct * phy_info)2614*4882a593Smuzhiyun void phydm_set_per_path_phy_info(u8 rx_path, s8 pwr, s8 rx_evm, s8 cfo_tail,
2615*4882a593Smuzhiyun s8 rx_snr, u8 ant_idx,
2616*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2617*4882a593Smuzhiyun {
2618*4882a593Smuzhiyun u8 evm_dbm = 0;
2619*4882a593Smuzhiyun u8 evm_percentage = 0;
2620*4882a593Smuzhiyun
2621*4882a593Smuzhiyun /* SNR is S(8,1), EVM is S(8,1), CFO is S(8,7) */
2622*4882a593Smuzhiyun
2623*4882a593Smuzhiyun if (rx_evm < 0) {
2624*4882a593Smuzhiyun /* @Calculate EVM in dBm */
2625*4882a593Smuzhiyun evm_dbm = ((u8)(0 - rx_evm) >> 1);
2626*4882a593Smuzhiyun
2627*4882a593Smuzhiyun if (evm_dbm == 64)
2628*4882a593Smuzhiyun evm_dbm = 0; /*@if 1SS rate, evm_dbm [2nd stream] =64*/
2629*4882a593Smuzhiyun
2630*4882a593Smuzhiyun if (evm_dbm != 0) {
2631*4882a593Smuzhiyun /* @Convert EVM to 0%~100% percentage */
2632*4882a593Smuzhiyun if (evm_dbm >= 34)
2633*4882a593Smuzhiyun evm_percentage = 100;
2634*4882a593Smuzhiyun else
2635*4882a593Smuzhiyun evm_percentage = (evm_dbm << 1) + (evm_dbm);
2636*4882a593Smuzhiyun }
2637*4882a593Smuzhiyun }
2638*4882a593Smuzhiyun
2639*4882a593Smuzhiyun phy_info->rx_pwr[rx_path] = pwr;
2640*4882a593Smuzhiyun
2641*4882a593Smuzhiyun /*@CFO(kHz) = CFO_tail * 312.5(kHz) / 2^7 ~= CFO tail * 5/2 (kHz)*/
2642*4882a593Smuzhiyun phy_info->cfo_tail[rx_path] = (cfo_tail * 5) >> 1;
2643*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[rx_path] = evm_dbm;
2644*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[rx_path] = phydm_pw_2_percent(pwr);
2645*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[rx_path] = evm_percentage;
2646*4882a593Smuzhiyun phy_info->rx_snr[rx_path] = rx_snr >> 1;
2647*4882a593Smuzhiyun phy_info->ant_idx[rx_path] = ant_idx;
2648*4882a593Smuzhiyun
2649*4882a593Smuzhiyun #if 0
2650*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
2651*4882a593Smuzhiyun return;
2652*4882a593Smuzhiyun
2653*4882a593Smuzhiyun dbg_print("path (%d)--------\n", rx_path);
2654*4882a593Smuzhiyun dbg_print("rx_pwr = %d, Signal strength = %d\n",
2655*4882a593Smuzhiyun phy_info->rx_pwr[rx_path],
2656*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[rx_path]);
2657*4882a593Smuzhiyun dbg_print("evm_dbm = %d, Signal quality = %d\n",
2658*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[rx_path],
2659*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[rx_path]);
2660*4882a593Smuzhiyun dbg_print("CFO = %d, SNR = %d\n",
2661*4882a593Smuzhiyun phy_info->cfo_tail[rx_path], phy_info->rx_snr[rx_path]);
2662*4882a593Smuzhiyun
2663*4882a593Smuzhiyun #endif
2664*4882a593Smuzhiyun }
2665*4882a593Smuzhiyun
phydm_set_common_phy_info(s8 rx_power,u8 channel,boolean is_beamformed,boolean is_mu_packet,u8 bandwidth,u8 signal_quality,u8 rxsc,struct phydm_phyinfo_struct * phy_info)2666*4882a593Smuzhiyun void phydm_set_common_phy_info(s8 rx_power, u8 channel, boolean is_beamformed,
2667*4882a593Smuzhiyun boolean is_mu_packet, u8 bandwidth,
2668*4882a593Smuzhiyun u8 signal_quality, u8 rxsc,
2669*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2670*4882a593Smuzhiyun {
2671*4882a593Smuzhiyun phy_info->rx_power = rx_power; /* RSSI in dB */
2672*4882a593Smuzhiyun phy_info->recv_signal_power = rx_power; /* RSSI in dB */
2673*4882a593Smuzhiyun phy_info->channel = channel; /* @channel number */
2674*4882a593Smuzhiyun phy_info->is_beamformed = is_beamformed; /* @apply BF */
2675*4882a593Smuzhiyun phy_info->is_mu_packet = is_mu_packet; /* @MU packet */
2676*4882a593Smuzhiyun phy_info->rxsc = rxsc;
2677*4882a593Smuzhiyun
2678*4882a593Smuzhiyun /* RSSI in percentage */
2679*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_power);
2680*4882a593Smuzhiyun phy_info->signal_quality = signal_quality; /* signal quality */
2681*4882a593Smuzhiyun phy_info->band_width = bandwidth; /* @bandwidth */
2682*4882a593Smuzhiyun
2683*4882a593Smuzhiyun #if 0
2684*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
2685*4882a593Smuzhiyun return;
2686*4882a593Smuzhiyun
2687*4882a593Smuzhiyun dbg_print("rx_pwdb_all = %d, rx_power = %d, recv_signal_power = %d\n",
2688*4882a593Smuzhiyun phy_info->rx_pwdb_all, phy_info->rx_power,
2689*4882a593Smuzhiyun phy_info->recv_signal_power);
2690*4882a593Smuzhiyun dbg_print("signal_quality = %d\n", phy_info->signal_quality);
2691*4882a593Smuzhiyun dbg_print("is_beamformed = %d, is_mu_packet = %d, rx_count = %d\n",
2692*4882a593Smuzhiyun phy_info->is_beamformed, phy_info->is_mu_packet,
2693*4882a593Smuzhiyun phy_info->rx_count + 1);
2694*4882a593Smuzhiyun dbg_print("channel = %d, rxsc = %d, band_width = %d\n", channel,
2695*4882a593Smuzhiyun rxsc, bandwidth);
2696*4882a593Smuzhiyun
2697*4882a593Smuzhiyun #endif
2698*4882a593Smuzhiyun }
2699*4882a593Smuzhiyun
phydm_get_phy_sts_type0(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2700*4882a593Smuzhiyun void phydm_get_phy_sts_type0(struct dm_struct *dm, u8 *phy_status_inf,
2701*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2702*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2703*4882a593Smuzhiyun {
2704*4882a593Smuzhiyun /* type 0 is used for cck packet */
2705*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type0 *phy_sts = NULL;
2706*4882a593Smuzhiyun u8 sq = 0;
2707*4882a593Smuzhiyun s8 rx_pow = 0;
2708*4882a593Smuzhiyun u8 lna_idx = 0, vga_idx = 0;
2709*4882a593Smuzhiyun u8 ant_idx;
2710*4882a593Smuzhiyun
2711*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr2_type0 *)phy_status_inf;
2712*4882a593Smuzhiyun rx_pow = phy_sts->pwdb - 110;
2713*4882a593Smuzhiyun
2714*4882a593Smuzhiyun /* Fill in per-path antenna index */
2715*4882a593Smuzhiyun ant_idx = phy_sts->antidx_a;
2716*4882a593Smuzhiyun
2717*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8723D) {
2718*4882a593Smuzhiyun #if (RTL8723D_SUPPORT)
2719*4882a593Smuzhiyun rx_pow = phy_sts->pwdb - 97;
2720*4882a593Smuzhiyun #endif
2721*4882a593Smuzhiyun }
2722*4882a593Smuzhiyun #if (RTL8821C_SUPPORT)
2723*4882a593Smuzhiyun else if (dm->support_ic_type & ODM_RTL8821C) {
2724*4882a593Smuzhiyun if (phy_sts->pwdb >= -57)
2725*4882a593Smuzhiyun rx_pow = phy_sts->pwdb - 100;
2726*4882a593Smuzhiyun else
2727*4882a593Smuzhiyun rx_pow = phy_sts->pwdb - 102;
2728*4882a593Smuzhiyun }
2729*4882a593Smuzhiyun #endif
2730*4882a593Smuzhiyun
2731*4882a593Smuzhiyun if (pktinfo->is_to_self) {
2732*4882a593Smuzhiyun dm->ofdm_agc_idx[0] = phy_sts->pwdb;
2733*4882a593Smuzhiyun dm->ofdm_agc_idx[1] = 0;
2734*4882a593Smuzhiyun dm->ofdm_agc_idx[2] = 0;
2735*4882a593Smuzhiyun dm->ofdm_agc_idx[3] = 0;
2736*4882a593Smuzhiyun }
2737*4882a593Smuzhiyun
2738*4882a593Smuzhiyun /* @Calculate Signal Quality*/
2739*4882a593Smuzhiyun if (phy_sts->signal_quality >= 64) {
2740*4882a593Smuzhiyun sq = 0;
2741*4882a593Smuzhiyun } else if (phy_sts->signal_quality <= 20) {
2742*4882a593Smuzhiyun sq = 100;
2743*4882a593Smuzhiyun } else {
2744*4882a593Smuzhiyun /* @mapping to 2~99% */
2745*4882a593Smuzhiyun sq = 64 - phy_sts->signal_quality;
2746*4882a593Smuzhiyun sq = ((sq << 3) + sq) >> 2;
2747*4882a593Smuzhiyun }
2748*4882a593Smuzhiyun
2749*4882a593Smuzhiyun /* @Get RSSI for old CCK AGC */
2750*4882a593Smuzhiyun if (!dm->cck_new_agc) {
2751*4882a593Smuzhiyun vga_idx = phy_sts->vga;
2752*4882a593Smuzhiyun
2753*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8197F) {
2754*4882a593Smuzhiyun /*@3bit LNA*/
2755*4882a593Smuzhiyun lna_idx = phy_sts->lna_l;
2756*4882a593Smuzhiyun } else {
2757*4882a593Smuzhiyun /*@4bit LNA*/
2758*4882a593Smuzhiyun lna_idx = (phy_sts->lna_h << 3) | phy_sts->lna_l;
2759*4882a593Smuzhiyun }
2760*4882a593Smuzhiyun rx_pow = phydm_get_cck_rssi(dm, lna_idx, vga_idx);
2761*4882a593Smuzhiyun }
2762*4882a593Smuzhiyun
2763*4882a593Smuzhiyun /* @Confirm CCK RSSI */
2764*4882a593Smuzhiyun #if (RTL8197F_SUPPORT)
2765*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8197F) {
2766*4882a593Smuzhiyun u8 bb_pwr_th_l = 5; /* round( 31*0.15 ) */
2767*4882a593Smuzhiyun u8 bb_pwr_th_h = 27; /* round( 31*0.85 ) */
2768*4882a593Smuzhiyun
2769*4882a593Smuzhiyun if (phy_sts->bb_power < bb_pwr_th_l ||
2770*4882a593Smuzhiyun phy_sts->bb_power > bb_pwr_th_h)
2771*4882a593Smuzhiyun rx_pow = 0; /* @Error RSSI for CCK ; set 100*/
2772*4882a593Smuzhiyun }
2773*4882a593Smuzhiyun #endif
2774*4882a593Smuzhiyun
2775*4882a593Smuzhiyun /*@CCK no STBC and LDPC*/
2776*4882a593Smuzhiyun dm->phy_dbg_info.is_ldpc_pkt = false;
2777*4882a593Smuzhiyun dm->phy_dbg_info.is_stbc_pkt = false;
2778*4882a593Smuzhiyun
2779*4882a593Smuzhiyun /* Update Common information */
2780*4882a593Smuzhiyun phydm_set_common_phy_info(rx_pow, phy_sts->channel, false,
2781*4882a593Smuzhiyun false, CHANNEL_WIDTH_20, sq,
2782*4882a593Smuzhiyun phy_sts->rxsc, phy_info);
2783*4882a593Smuzhiyun /* Update CCK pwdb */
2784*4882a593Smuzhiyun phydm_set_per_path_phy_info(RF_PATH_A, rx_pow, 0, 0, 0, ant_idx,
2785*4882a593Smuzhiyun phy_info);
2786*4882a593Smuzhiyun
2787*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
2788*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2789*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2790*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2791*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2792*4882a593Smuzhiyun #endif
2793*4882a593Smuzhiyun }
2794*4882a593Smuzhiyun
phydm_get_phy_sts_type1(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2795*4882a593Smuzhiyun void phydm_get_phy_sts_type1(struct dm_struct *dm, u8 *phy_status_inf,
2796*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2797*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2798*4882a593Smuzhiyun {
2799*4882a593Smuzhiyun /* type 1 is used for ofdm packet */
2800*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type1 *phy_sts = NULL;
2801*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
2802*4882a593Smuzhiyun s8 rx_pwr_db = -120;
2803*4882a593Smuzhiyun s8 rx_pwr = 0;
2804*4882a593Smuzhiyun u8 i, rxsc, bw = CHANNEL_WIDTH_20, rx_count = 0;
2805*4882a593Smuzhiyun boolean is_mu;
2806*4882a593Smuzhiyun u8 ant_idx[4];
2807*4882a593Smuzhiyun
2808*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr2_type1 *)phy_status_inf;
2809*4882a593Smuzhiyun
2810*4882a593Smuzhiyun /* Fill in per-path antenna index */
2811*4882a593Smuzhiyun ant_idx[0] = phy_sts->antidx_a;
2812*4882a593Smuzhiyun ant_idx[1] = phy_sts->antidx_b;
2813*4882a593Smuzhiyun ant_idx[2] = phy_sts->antidx_c;
2814*4882a593Smuzhiyun ant_idx[3] = phy_sts->antidx_d;
2815*4882a593Smuzhiyun
2816*4882a593Smuzhiyun /* Update per-path information */
2817*4882a593Smuzhiyun for (i = RF_PATH_A; i < PHYDM_MAX_RF_PATH; i++) {
2818*4882a593Smuzhiyun if (!(dm->rx_ant_status & BIT(i)))
2819*4882a593Smuzhiyun continue;
2820*4882a593Smuzhiyun rx_count++;
2821*4882a593Smuzhiyun
2822*4882a593Smuzhiyun if (rx_count > dm->num_rf_path)
2823*4882a593Smuzhiyun break;
2824*4882a593Smuzhiyun
2825*4882a593Smuzhiyun /* Update per-path information
2826*4882a593Smuzhiyun * (RSSI_dB RSSI_percentage EVM SNR CFO sq)
2827*4882a593Smuzhiyun */
2828*4882a593Smuzhiyun /* @EVM report is reported by stream, not path */
2829*4882a593Smuzhiyun rx_pwr = phy_sts->pwdb[i] - 110; /* per-path pwdb(dB)*/
2830*4882a593Smuzhiyun
2831*4882a593Smuzhiyun if (pktinfo->is_to_self)
2832*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = phy_sts->pwdb[i];
2833*4882a593Smuzhiyun
2834*4882a593Smuzhiyun phydm_set_per_path_phy_info(i, rx_pwr,
2835*4882a593Smuzhiyun phy_sts->rxevm[rx_count - 1],
2836*4882a593Smuzhiyun phy_sts->cfo_tail[i],
2837*4882a593Smuzhiyun phy_sts->rxsnr[i],
2838*4882a593Smuzhiyun ant_idx[i], phy_info);
2839*4882a593Smuzhiyun /* search maximum pwdb */
2840*4882a593Smuzhiyun if (rx_pwr > rx_pwr_db)
2841*4882a593Smuzhiyun rx_pwr_db = rx_pwr;
2842*4882a593Smuzhiyun }
2843*4882a593Smuzhiyun
2844*4882a593Smuzhiyun /* @mapping RX counter from 1~4 to 0~3 */
2845*4882a593Smuzhiyun if (rx_count > 0)
2846*4882a593Smuzhiyun phy_info->rx_count = rx_count - 1;
2847*4882a593Smuzhiyun
2848*4882a593Smuzhiyun /* @Check if MU packet or not */
2849*4882a593Smuzhiyun if (phy_sts->gid != 0 && phy_sts->gid != 63) {
2850*4882a593Smuzhiyun is_mu = true;
2851*4882a593Smuzhiyun dbg_i->num_qry_mu_pkt++;
2852*4882a593Smuzhiyun } else {
2853*4882a593Smuzhiyun is_mu = false;
2854*4882a593Smuzhiyun }
2855*4882a593Smuzhiyun
2856*4882a593Smuzhiyun /* @count BF packet */
2857*4882a593Smuzhiyun dbg_i->num_qry_bf_pkt = dbg_i->num_qry_bf_pkt + phy_sts->beamformed;
2858*4882a593Smuzhiyun
2859*4882a593Smuzhiyun /*STBC or LDPC pkt*/
2860*4882a593Smuzhiyun dbg_i->is_ldpc_pkt = phy_sts->ldpc;
2861*4882a593Smuzhiyun dbg_i->is_stbc_pkt = phy_sts->stbc;
2862*4882a593Smuzhiyun
2863*4882a593Smuzhiyun /* @Check sub-channel */
2864*4882a593Smuzhiyun if (pktinfo->data_rate > ODM_RATE11M &&
2865*4882a593Smuzhiyun pktinfo->data_rate < ODM_RATEMCS0)
2866*4882a593Smuzhiyun rxsc = phy_sts->l_rxsc;
2867*4882a593Smuzhiyun else
2868*4882a593Smuzhiyun rxsc = phy_sts->ht_rxsc;
2869*4882a593Smuzhiyun
2870*4882a593Smuzhiyun /* @Check RX bandwidth */
2871*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
2872*4882a593Smuzhiyun if (rxsc >= 1 && rxsc <= 8)
2873*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2874*4882a593Smuzhiyun else if ((rxsc >= 9) && (rxsc <= 12))
2875*4882a593Smuzhiyun bw = CHANNEL_WIDTH_40;
2876*4882a593Smuzhiyun else if (rxsc >= 13)
2877*4882a593Smuzhiyun bw = CHANNEL_WIDTH_80;
2878*4882a593Smuzhiyun else
2879*4882a593Smuzhiyun bw = phy_sts->rf_mode;
2880*4882a593Smuzhiyun
2881*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
2882*4882a593Smuzhiyun if (phy_sts->rf_mode == 0)
2883*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2884*4882a593Smuzhiyun else if ((rxsc == 1) || (rxsc == 2))
2885*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2886*4882a593Smuzhiyun else
2887*4882a593Smuzhiyun bw = CHANNEL_WIDTH_40;
2888*4882a593Smuzhiyun }
2889*4882a593Smuzhiyun
2890*4882a593Smuzhiyun /* Update packet information */
2891*4882a593Smuzhiyun phydm_set_common_phy_info(rx_pwr_db, phy_sts->channel,
2892*4882a593Smuzhiyun (boolean)phy_sts->beamformed, is_mu, bw,
2893*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[0],
2894*4882a593Smuzhiyun rxsc, phy_info);
2895*4882a593Smuzhiyun
2896*4882a593Smuzhiyun phydm_parsing_cfo(dm, pktinfo, phy_sts->cfo_tail, pktinfo->rate_ss);
2897*4882a593Smuzhiyun #ifdef PHYDM_LNA_SAT_CHK_TYPE2
2898*4882a593Smuzhiyun phydm_parsing_snr(dm, pktinfo, phy_sts->rxsnr);
2899*4882a593Smuzhiyun #endif
2900*4882a593Smuzhiyun
2901*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2902*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2903*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2904*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2905*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2906*4882a593Smuzhiyun #endif
2907*4882a593Smuzhiyun }
2908*4882a593Smuzhiyun
phydm_get_phy_sts_type2(struct dm_struct * dm,u8 * phy_status_inf,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2909*4882a593Smuzhiyun void phydm_get_phy_sts_type2(struct dm_struct *dm, u8 *phy_status_inf,
2910*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2911*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2912*4882a593Smuzhiyun {
2913*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type2 *phy_sts = NULL;
2914*4882a593Smuzhiyun s8 rx_pwr_db_max = -120;
2915*4882a593Smuzhiyun s8 rx_pwr = 0;
2916*4882a593Smuzhiyun u8 i, rxsc, bw = CHANNEL_WIDTH_20, rx_count = 0;
2917*4882a593Smuzhiyun
2918*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr2_type2 *)phy_status_inf;
2919*4882a593Smuzhiyun
2920*4882a593Smuzhiyun for (i = RF_PATH_A; i < PHYDM_MAX_RF_PATH; i++) {
2921*4882a593Smuzhiyun if (!(dm->rx_ant_status & BIT(i)))
2922*4882a593Smuzhiyun continue;
2923*4882a593Smuzhiyun rx_count++;
2924*4882a593Smuzhiyun
2925*4882a593Smuzhiyun if (rx_count > dm->num_rf_path)
2926*4882a593Smuzhiyun break;
2927*4882a593Smuzhiyun
2928*4882a593Smuzhiyun /* Update per-path information*/
2929*4882a593Smuzhiyun /* RSSI_dB, RSSI_percentage, EVM, SNR, CFO, sq */
2930*4882a593Smuzhiyun #if (RTL8197F_SUPPORT)
2931*4882a593Smuzhiyun if ((dm->support_ic_type & ODM_RTL8197F) &&
2932*4882a593Smuzhiyun phy_sts->pwdb[i] == 0x7f) { /*@97f workaround*/
2933*4882a593Smuzhiyun
2934*4882a593Smuzhiyun if (i == RF_PATH_A) {
2935*4882a593Smuzhiyun rx_pwr = (phy_sts->gain_a) << 1;
2936*4882a593Smuzhiyun rx_pwr = rx_pwr - 110;
2937*4882a593Smuzhiyun } else if (i == RF_PATH_B) {
2938*4882a593Smuzhiyun rx_pwr = (phy_sts->gain_b) << 1;
2939*4882a593Smuzhiyun rx_pwr = rx_pwr - 110;
2940*4882a593Smuzhiyun } else {
2941*4882a593Smuzhiyun rx_pwr = 0;
2942*4882a593Smuzhiyun }
2943*4882a593Smuzhiyun } else
2944*4882a593Smuzhiyun #endif
2945*4882a593Smuzhiyun rx_pwr = phy_sts->pwdb[i] - 110; /*@dBm*/
2946*4882a593Smuzhiyun
2947*4882a593Smuzhiyun phydm_set_per_path_phy_info(i, rx_pwr, 0, 0, 0, 0, phy_info);
2948*4882a593Smuzhiyun
2949*4882a593Smuzhiyun if (rx_pwr > rx_pwr_db_max) /* search max pwdb */
2950*4882a593Smuzhiyun rx_pwr_db_max = rx_pwr;
2951*4882a593Smuzhiyun }
2952*4882a593Smuzhiyun
2953*4882a593Smuzhiyun /* @mapping RX counter from 1~4 to 0~3 */
2954*4882a593Smuzhiyun if (rx_count > 0)
2955*4882a593Smuzhiyun phy_info->rx_count = rx_count - 1;
2956*4882a593Smuzhiyun
2957*4882a593Smuzhiyun /* @Check RX sub-channel */
2958*4882a593Smuzhiyun if (pktinfo->data_rate > ODM_RATE11M &&
2959*4882a593Smuzhiyun pktinfo->data_rate < ODM_RATEMCS0)
2960*4882a593Smuzhiyun rxsc = phy_sts->l_rxsc;
2961*4882a593Smuzhiyun else
2962*4882a593Smuzhiyun rxsc = phy_sts->ht_rxsc;
2963*4882a593Smuzhiyun
2964*4882a593Smuzhiyun /*STBC or LDPC pkt*/
2965*4882a593Smuzhiyun dm->phy_dbg_info.is_ldpc_pkt = phy_sts->ldpc;
2966*4882a593Smuzhiyun dm->phy_dbg_info.is_stbc_pkt = phy_sts->stbc;
2967*4882a593Smuzhiyun
2968*4882a593Smuzhiyun /* @Check RX bandwidth */
2969*4882a593Smuzhiyun /* @BW information of sc=0 is useless,
2970*4882a593Smuzhiyun *because there is no information of RF mode
2971*4882a593Smuzhiyun */
2972*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
2973*4882a593Smuzhiyun if (rxsc >= 1 && rxsc <= 8)
2974*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2975*4882a593Smuzhiyun else if ((rxsc >= 9) && (rxsc <= 12))
2976*4882a593Smuzhiyun bw = CHANNEL_WIDTH_40;
2977*4882a593Smuzhiyun else if (rxsc >= 13)
2978*4882a593Smuzhiyun bw = CHANNEL_WIDTH_80;
2979*4882a593Smuzhiyun
2980*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
2981*4882a593Smuzhiyun if (rxsc == 3)
2982*4882a593Smuzhiyun bw = CHANNEL_WIDTH_40;
2983*4882a593Smuzhiyun else if ((rxsc == 1) || (rxsc == 2))
2984*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2985*4882a593Smuzhiyun }
2986*4882a593Smuzhiyun
2987*4882a593Smuzhiyun /* Update packet information */
2988*4882a593Smuzhiyun phydm_set_common_phy_info(rx_pwr_db_max, phy_sts->channel,
2989*4882a593Smuzhiyun (boolean)phy_sts->beamformed,
2990*4882a593Smuzhiyun false, bw, 0, rxsc, phy_info);
2991*4882a593Smuzhiyun }
2992*4882a593Smuzhiyun
phydm_process_rssi_for_dm_2nd_type(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)2993*4882a593Smuzhiyun void phydm_process_rssi_for_dm_2nd_type(struct dm_struct *dm,
2994*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
2995*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo
2996*4882a593Smuzhiyun )
2997*4882a593Smuzhiyun {
2998*4882a593Smuzhiyun struct cmn_sta_info *sta = NULL;
2999*4882a593Smuzhiyun struct rssi_info *rssi_t = NULL;
3000*4882a593Smuzhiyun u8 rssi_tmp = 0;
3001*4882a593Smuzhiyun u64 rssi_linear = 0;
3002*4882a593Smuzhiyun s16 rssi_db = 0;
3003*4882a593Smuzhiyun u8 i = 0;
3004*4882a593Smuzhiyun
3005*4882a593Smuzhiyun if (pktinfo->station_id >= ODM_ASSOCIATE_ENTRY_NUM)
3006*4882a593Smuzhiyun return;
3007*4882a593Smuzhiyun
3008*4882a593Smuzhiyun sta = dm->phydm_sta_info[pktinfo->station_id];
3009*4882a593Smuzhiyun
3010*4882a593Smuzhiyun if (!is_sta_active(sta))
3011*4882a593Smuzhiyun return;
3012*4882a593Smuzhiyun
3013*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid) /*@data frame only*/
3014*4882a593Smuzhiyun return;
3015*4882a593Smuzhiyun
3016*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
3017*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_ANT_DIV)
3018*4882a593Smuzhiyun odm_process_rssi_for_ant_div(dm, phy_info, pktinfo);
3019*4882a593Smuzhiyun #endif
3020*4882a593Smuzhiyun
3021*4882a593Smuzhiyun #if (defined(CONFIG_PATH_DIVERSITY))
3022*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_PATH_DIV)
3023*4882a593Smuzhiyun phydm_process_rssi_for_path_div(dm, phy_info, pktinfo);
3024*4882a593Smuzhiyun #endif
3025*4882a593Smuzhiyun
3026*4882a593Smuzhiyun #ifdef CONFIG_ADAPTIVE_SOML
3027*4882a593Smuzhiyun phydm_rx_qam_for_soml(dm, pktinfo);
3028*4882a593Smuzhiyun phydm_rx_rate_for_soml(dm, pktinfo);
3029*4882a593Smuzhiyun #endif
3030*4882a593Smuzhiyun
3031*4882a593Smuzhiyun if (!(pktinfo->is_packet_to_self) && !(pktinfo->is_packet_beacon))
3032*4882a593Smuzhiyun return;
3033*4882a593Smuzhiyun
3034*4882a593Smuzhiyun if (pktinfo->is_packet_beacon) {
3035*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_beacon_pkt++;
3036*4882a593Smuzhiyun dm->phy_dbg_info.beacon_phy_rate = pktinfo->data_rate;
3037*4882a593Smuzhiyun }
3038*4882a593Smuzhiyun
3039*4882a593Smuzhiyun rssi_t = &sta->rssi_stat;
3040*4882a593Smuzhiyun
3041*4882a593Smuzhiyun for (i = RF_PATH_A; i < PHYDM_MAX_RF_PATH; i++) {
3042*4882a593Smuzhiyun rssi_tmp = phy_info->rx_mimo_signal_strength[i];
3043*4882a593Smuzhiyun if (rssi_tmp != 0)
3044*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_tmp);
3045*4882a593Smuzhiyun }
3046*4882a593Smuzhiyun /* @Rounding and removing fractional bits */
3047*4882a593Smuzhiyun rssi_linear = (rssi_linear + (1 << (FRAC_BITS - 1))) >> FRAC_BITS;
3048*4882a593Smuzhiyun
3049*4882a593Smuzhiyun switch (phy_info->rx_count + 1) {
3050*4882a593Smuzhiyun case 2:
3051*4882a593Smuzhiyun rssi_linear = DIVIDED_2(rssi_linear);
3052*4882a593Smuzhiyun break;
3053*4882a593Smuzhiyun case 3:
3054*4882a593Smuzhiyun rssi_linear = DIVIDED_3(rssi_linear);
3055*4882a593Smuzhiyun break;
3056*4882a593Smuzhiyun case 4:
3057*4882a593Smuzhiyun rssi_linear = DIVIDED_4(rssi_linear);
3058*4882a593Smuzhiyun break;
3059*4882a593Smuzhiyun }
3060*4882a593Smuzhiyun
3061*4882a593Smuzhiyun rssi_db = (s16)odm_convert_to_db(rssi_linear);
3062*4882a593Smuzhiyun
3063*4882a593Smuzhiyun if (rssi_t->rssi_acc == 0) {
3064*4882a593Smuzhiyun rssi_t->rssi_acc = (s16)(rssi_db << RSSI_MA);
3065*4882a593Smuzhiyun rssi_t->rssi = (s8)(rssi_db);
3066*4882a593Smuzhiyun } else {
3067*4882a593Smuzhiyun rssi_t->rssi_acc = MA_ACC(rssi_t->rssi_acc, rssi_db, RSSI_MA);
3068*4882a593Smuzhiyun rssi_t->rssi = (s8)GET_MA_VAL(rssi_t->rssi_acc, RSSI_MA);
3069*4882a593Smuzhiyun }
3070*4882a593Smuzhiyun
3071*4882a593Smuzhiyun if (pktinfo->is_cck_rate)
3072*4882a593Smuzhiyun rssi_t->rssi_cck = (s8)rssi_db;
3073*4882a593Smuzhiyun else
3074*4882a593Smuzhiyun rssi_t->rssi_ofdm = (s8)rssi_db;
3075*4882a593Smuzhiyun }
3076*4882a593Smuzhiyun
phydm_rx_physts_2nd_type(void * dm_void,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)3077*4882a593Smuzhiyun void phydm_rx_physts_2nd_type(void *dm_void, u8 *phy_sts,
3078*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
3079*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
3080*4882a593Smuzhiyun {
3081*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
3082*4882a593Smuzhiyun u8 page = (*phy_sts & 0xf);
3083*4882a593Smuzhiyun
3084*4882a593Smuzhiyun /* Phy status parsing */
3085*4882a593Smuzhiyun switch (page) {
3086*4882a593Smuzhiyun case 0: /*@CCK*/
3087*4882a593Smuzhiyun phydm_get_phy_sts_type0(dm, phy_sts, pktinfo, phy_info);
3088*4882a593Smuzhiyun break;
3089*4882a593Smuzhiyun case 1:
3090*4882a593Smuzhiyun phydm_get_phy_sts_type1(dm, phy_sts, pktinfo, phy_info);
3091*4882a593Smuzhiyun break;
3092*4882a593Smuzhiyun case 2:
3093*4882a593Smuzhiyun phydm_get_phy_sts_type2(dm, phy_sts, pktinfo, phy_info);
3094*4882a593Smuzhiyun break;
3095*4882a593Smuzhiyun default:
3096*4882a593Smuzhiyun break;
3097*4882a593Smuzhiyun }
3098*4882a593Smuzhiyun
3099*4882a593Smuzhiyun #if (RTL8822B_SUPPORT || RTL8821C_SUPPORT || RTL8195B_SUPPORT)
3100*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8195B))
3101*4882a593Smuzhiyun phydm_print_phy_sts_jgr2(dm, phy_sts, pktinfo, phy_info);
3102*4882a593Smuzhiyun #endif
3103*4882a593Smuzhiyun }
3104*4882a593Smuzhiyun
3105*4882a593Smuzhiyun /*@==============================================*/
3106*4882a593Smuzhiyun #endif
3107*4882a593Smuzhiyun
odm_phy_status_query(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo)3108*4882a593Smuzhiyun boolean odm_phy_status_query(struct dm_struct *dm,
3109*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
3110*4882a593Smuzhiyun u8 *phy_sts,
3111*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
3112*4882a593Smuzhiyun {
3113*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3114*4882a593Smuzhiyun struct pkt_process_info *pkt_proc = &dm->pkt_proc_struct;
3115*4882a593Smuzhiyun boolean auto_swch_en = dm->pkt_proc_struct.physts_auto_swch_en;
3116*4882a593Smuzhiyun #endif
3117*4882a593Smuzhiyun u8 rate = pktinfo->data_rate;
3118*4882a593Smuzhiyun u8 page = (*phy_sts & 0xf);
3119*4882a593Smuzhiyun
3120*4882a593Smuzhiyun pktinfo->is_cck_rate = PHYDM_IS_CCK_RATE(rate);
3121*4882a593Smuzhiyun pktinfo->rate_ss = phydm_rate_to_num_ss(dm, rate);
3122*4882a593Smuzhiyun dm->rate_ss = pktinfo->rate_ss; /*@For AP EVM SW antenna diversity use*/
3123*4882a593Smuzhiyun
3124*4882a593Smuzhiyun if (pktinfo->is_cck_rate)
3125*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_phy_status_cck++;
3126*4882a593Smuzhiyun else
3127*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_phy_status_ofdm++;
3128*4882a593Smuzhiyun
3129*4882a593Smuzhiyun /*Reset phy_info*/
3130*4882a593Smuzhiyun phydm_reset_phy_info(dm, phy_info);
3131*4882a593Smuzhiyun
3132*4882a593Smuzhiyun if (dm->support_ic_type & PHYSTS_3RD_TYPE_IC) {
3133*4882a593Smuzhiyun #ifdef PHYSTS_3RD_TYPE_SUPPORT
3134*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3135*4882a593Smuzhiyun if (phydm_physts_auto_switch_jgr3(dm, phy_sts, pktinfo)) {
3136*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "SKIP parsing\n");
3137*4882a593Smuzhiyun phy_info->physts_rpt_valid = false;
3138*4882a593Smuzhiyun return false;
3139*4882a593Smuzhiyun }
3140*4882a593Smuzhiyun #endif
3141*4882a593Smuzhiyun phydm_rx_physts_jgr3(dm, phy_sts, pktinfo, phy_info);
3142*4882a593Smuzhiyun phydm_process_dm_rssi_jgr3(dm, phy_info, pktinfo);
3143*4882a593Smuzhiyun #endif
3144*4882a593Smuzhiyun } else if (dm->support_ic_type & PHYSTS_2ND_TYPE_IC) {
3145*4882a593Smuzhiyun #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
3146*4882a593Smuzhiyun phydm_rx_physts_2nd_type(dm, phy_sts, pktinfo, phy_info);
3147*4882a593Smuzhiyun phydm_process_rssi_for_dm_2nd_type(dm, phy_info, pktinfo);
3148*4882a593Smuzhiyun #endif
3149*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
3150*4882a593Smuzhiyun #if ODM_IC_11AC_SERIES_SUPPORT
3151*4882a593Smuzhiyun phydm_rx_physts_1st_type(dm, phy_info, phy_sts, pktinfo);
3152*4882a593Smuzhiyun phydm_process_rssi_for_dm(dm, phy_info, pktinfo);
3153*4882a593Smuzhiyun #endif
3154*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
3155*4882a593Smuzhiyun #if ODM_IC_11N_SERIES_SUPPORT
3156*4882a593Smuzhiyun phydm_phy_sts_n_parsing(dm, phy_info, phy_sts, pktinfo);
3157*4882a593Smuzhiyun phydm_process_rssi_for_dm(dm, phy_info, pktinfo);
3158*4882a593Smuzhiyun #endif
3159*4882a593Smuzhiyun }
3160*4882a593Smuzhiyun phy_info->signal_strength = phy_info->rx_pwdb_all;
3161*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
3162*4882a593Smuzhiyun phydm_process_signal_strength(dm, phy_info, pktinfo);
3163*4882a593Smuzhiyun #endif
3164*4882a593Smuzhiyun
3165*4882a593Smuzhiyun /*For basic debug message*/
3166*4882a593Smuzhiyun if (pktinfo->is_packet_match_bssid || *dm->mp_mode) {
3167*4882a593Smuzhiyun dm->curr_station_id = pktinfo->station_id;
3168*4882a593Smuzhiyun dm->rx_rate = rate;
3169*4882a593Smuzhiyun dm->rssi_a = phy_info->rx_mimo_signal_strength[RF_PATH_A];
3170*4882a593Smuzhiyun dm->rssi_b = phy_info->rx_mimo_signal_strength[RF_PATH_B];
3171*4882a593Smuzhiyun dm->rssi_c = phy_info->rx_mimo_signal_strength[RF_PATH_C];
3172*4882a593Smuzhiyun dm->rssi_d = phy_info->rx_mimo_signal_strength[RF_PATH_D];
3173*4882a593Smuzhiyun
3174*4882a593Smuzhiyun if (rate >= ODM_RATE6M && rate <= ODM_RATE54M)
3175*4882a593Smuzhiyun dm->rxsc_l = (s8)phy_info->rxsc;
3176*4882a593Smuzhiyun else if (phy_info->band_width == CHANNEL_WIDTH_20)
3177*4882a593Smuzhiyun dm->rxsc_20 = (s8)phy_info->rxsc;
3178*4882a593Smuzhiyun else if (phy_info->band_width == CHANNEL_WIDTH_40)
3179*4882a593Smuzhiyun dm->rxsc_40 = (s8)phy_info->rxsc;
3180*4882a593Smuzhiyun else if (phy_info->band_width == CHANNEL_WIDTH_80)
3181*4882a593Smuzhiyun dm->rxsc_80 = (s8)phy_info->rxsc;
3182*4882a593Smuzhiyun
3183*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3184*4882a593Smuzhiyun if (auto_swch_en && page == 4 && pktinfo->rate_ss > 1)
3185*4882a593Smuzhiyun phydm_avg_condi_num(dm, phy_info, pktinfo);
3186*4882a593Smuzhiyun
3187*4882a593Smuzhiyun if (!auto_swch_en ||
3188*4882a593Smuzhiyun (pkt_proc->is_1st_mpdu || PHYDM_IS_LEGACY_RATE(rate)))
3189*4882a593Smuzhiyun #endif
3190*4882a593Smuzhiyun {
3191*4882a593Smuzhiyun phydm_avg_rssi_evm_snr(dm, phy_info, pktinfo);
3192*4882a593Smuzhiyun phydm_rx_statistic_cal(dm, phy_info, phy_sts, pktinfo);
3193*4882a593Smuzhiyun }
3194*4882a593Smuzhiyun }
3195*4882a593Smuzhiyun
3196*4882a593Smuzhiyun phy_info->physts_rpt_valid = true;
3197*4882a593Smuzhiyun return true;
3198*4882a593Smuzhiyun }
3199*4882a593Smuzhiyun
phydm_rx_phy_status_init(void * dm_void)3200*4882a593Smuzhiyun void phydm_rx_phy_status_init(void *dm_void)
3201*4882a593Smuzhiyun {
3202*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
3203*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
3204*4882a593Smuzhiyun
3205*4882a593Smuzhiyun dbg->show_phy_sts_all_pkt = 0;
3206*4882a593Smuzhiyun dbg->show_phy_sts_max_cnt = 1;
3207*4882a593Smuzhiyun dbg->show_phy_sts_cnt = 0;
3208*4882a593Smuzhiyun
3209*4882a593Smuzhiyun phydm_avg_phystatus_init(dm);
3210*4882a593Smuzhiyun
3211*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3212*4882a593Smuzhiyun dm->pkt_proc_struct.physts_auto_swch_en = false;
3213*4882a593Smuzhiyun #endif
3214*4882a593Smuzhiyun }
3215*4882a593Smuzhiyun
phydm_physts_dbg(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len)3216*4882a593Smuzhiyun void phydm_physts_dbg(void *dm_void, char input[][16], u32 *_used,
3217*4882a593Smuzhiyun char *output, u32 *_out_len)
3218*4882a593Smuzhiyun {
3219*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
3220*4882a593Smuzhiyun char help[] = "-h";
3221*4882a593Smuzhiyun boolean enable;
3222*4882a593Smuzhiyun u32 var[10] = {0};
3223*4882a593Smuzhiyun u32 used = *_used;
3224*4882a593Smuzhiyun u32 out_len = *_out_len;
3225*4882a593Smuzhiyun u8 i = 0;
3226*4882a593Smuzhiyun
3227*4882a593Smuzhiyun for (i = 0; i < 3; i++) {
3228*4882a593Smuzhiyun PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var[i]);
3229*4882a593Smuzhiyun }
3230*4882a593Smuzhiyun
3231*4882a593Smuzhiyun if ((strcmp(input[1], help) == 0)) {
3232*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
3233*4882a593Smuzhiyun "Page Auto Switching: swh {en} {bitmap(hex)}\n");
3234*4882a593Smuzhiyun } else if ((strcmp(input[1], "swh") == 0)) {
3235*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3236*4882a593Smuzhiyun PHYDM_SSCANF(input[3], DCMD_HEX, &var[2]);
3237*4882a593Smuzhiyun enable = (boolean)var[1];
3238*4882a593Smuzhiyun phydm_physts_auto_switch_jgr3_set(dm, enable, (u8)var[2]);
3239*4882a593Smuzhiyun
3240*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
3241*4882a593Smuzhiyun "Page Auto Switching: en=%d, bitmap=0x%x\n",
3242*4882a593Smuzhiyun enable, var[2]);
3243*4882a593Smuzhiyun #endif
3244*4882a593Smuzhiyun }
3245*4882a593Smuzhiyun *_used = used;
3246*4882a593Smuzhiyun *_out_len = out_len;
3247*4882a593Smuzhiyun }
3248