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 #ifdef PHYSTS_3RD_TYPE_SUPPORT
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 EVM = phydm_evm_2_percent(phy_sts->stream_rxevm[i]);
954*4882a593Smuzhiyun
955*4882a593Smuzhiyun /*@Fill value in RFD, Get the 1st spatial stream only*/
956*4882a593Smuzhiyun if (i == RF_PATH_A)
957*4882a593Smuzhiyun phy_info->signal_quality = (u8)(EVM & 0xff);
958*4882a593Smuzhiyun
959*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = (u8)(EVM & 0xff);
960*4882a593Smuzhiyun
961*4882a593Smuzhiyun if (phy_sts->stream_rxevm[i] < 0)
962*4882a593Smuzhiyun evm_tmp = 0 - phy_sts->stream_rxevm[i];
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun if (evm_tmp == 64)
965*4882a593Smuzhiyun evm_tmp = 0;
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = (u8)evm_tmp;
968*4882a593Smuzhiyun }
969*4882a593Smuzhiyun phydm_parsing_cfo(dm, pktinfo,
970*4882a593Smuzhiyun phy_sts->path_cfotail, pktinfo->rate_ss);
971*4882a593Smuzhiyun }
972*4882a593Smuzhiyun
973*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
974*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->ant_sel;
975*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->ant_sel_b;
976*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antsel_rx_keep_2;
977*4882a593Smuzhiyun #endif
978*4882a593Smuzhiyun }
979*4882a593Smuzhiyun #endif
980*4882a593Smuzhiyun
981*4882a593Smuzhiyun #if ODM_IC_11AC_SERIES_SUPPORT
982*4882a593Smuzhiyun static s16
phydm_cfo(s8 value)983*4882a593Smuzhiyun phydm_cfo(s8 value)
984*4882a593Smuzhiyun {
985*4882a593Smuzhiyun s16 ret_val;
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun if (value < 0) {
988*4882a593Smuzhiyun ret_val = 0 - value;
989*4882a593Smuzhiyun ret_val = (ret_val << 1) + (ret_val >> 1); /*@2.5~=312.5/2^7 */
990*4882a593Smuzhiyun ret_val = ret_val | BIT(12); /*set bit12 as 1 for negative cfo*/
991*4882a593Smuzhiyun } else {
992*4882a593Smuzhiyun ret_val = value;
993*4882a593Smuzhiyun ret_val = (ret_val << 1) + (ret_val >> 1); /* @*2.5~=312.5/2^7*/
994*4882a593Smuzhiyun }
995*4882a593Smuzhiyun return ret_val;
996*4882a593Smuzhiyun }
997*4882a593Smuzhiyun
998*4882a593Smuzhiyun static u8
phydm_evm_dbm(s8 value)999*4882a593Smuzhiyun phydm_evm_dbm(s8 value)
1000*4882a593Smuzhiyun {
1001*4882a593Smuzhiyun s8 ret_val = value;
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun /* @-33dB~0dB to 33dB ~ 0dB */
1004*4882a593Smuzhiyun if (ret_val == -128)
1005*4882a593Smuzhiyun ret_val = 127;
1006*4882a593Smuzhiyun else if (ret_val < 0)
1007*4882a593Smuzhiyun ret_val = 0 - ret_val;
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun ret_val = ret_val >> 1;
1010*4882a593Smuzhiyun return (u8)ret_val;
1011*4882a593Smuzhiyun }
1012*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)1013*4882a593Smuzhiyun void phydm_rx_physts_bw_parsing(struct phydm_phyinfo_struct *phy_info,
1014*4882a593Smuzhiyun struct phydm_perpkt_info_struct *
1015*4882a593Smuzhiyun pktinfo,
1016*4882a593Smuzhiyun struct phy_status_rpt_8812 *
1017*4882a593Smuzhiyun phy_sts)
1018*4882a593Smuzhiyun {
1019*4882a593Smuzhiyun if (pktinfo->data_rate > ODM_RATE54M) {
1020*4882a593Smuzhiyun switch (phy_sts->r_RFMOD) {
1021*4882a593Smuzhiyun case 1:
1022*4882a593Smuzhiyun if (phy_sts->sub_chnl == 0)
1023*4882a593Smuzhiyun phy_info->band_width = 1;
1024*4882a593Smuzhiyun else
1025*4882a593Smuzhiyun phy_info->band_width = 0;
1026*4882a593Smuzhiyun break;
1027*4882a593Smuzhiyun
1028*4882a593Smuzhiyun case 2:
1029*4882a593Smuzhiyun if (phy_sts->sub_chnl == 0)
1030*4882a593Smuzhiyun phy_info->band_width = 2;
1031*4882a593Smuzhiyun else if (phy_sts->sub_chnl == 9 ||
1032*4882a593Smuzhiyun phy_sts->sub_chnl == 10)
1033*4882a593Smuzhiyun phy_info->band_width = 1;
1034*4882a593Smuzhiyun else
1035*4882a593Smuzhiyun phy_info->band_width = 0;
1036*4882a593Smuzhiyun break;
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun default:
1039*4882a593Smuzhiyun case 0:
1040*4882a593Smuzhiyun phy_info->band_width = 0;
1041*4882a593Smuzhiyun break;
1042*4882a593Smuzhiyun }
1043*4882a593Smuzhiyun }
1044*4882a593Smuzhiyun }
1045*4882a593Smuzhiyun
phydm_get_sq(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,u8 is_cck_rate)1046*4882a593Smuzhiyun void phydm_get_sq(struct dm_struct *dm, struct phydm_phyinfo_struct *phy_info,
1047*4882a593Smuzhiyun u8 is_cck_rate)
1048*4882a593Smuzhiyun {
1049*4882a593Smuzhiyun u8 sq = 0;
1050*4882a593Smuzhiyun u8 pwdb_all = phy_info->rx_pwdb_all; /*precentage*/
1051*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1052*4882a593Smuzhiyun u8 rssi = phy_info->rx_mimo_signal_strength[0];
1053*4882a593Smuzhiyun #endif
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1056*4882a593Smuzhiyun if (dm->iot_table.win_patch_id == RT_CID_819X_LENOVO) {
1057*4882a593Smuzhiyun if (is_cck_rate)
1058*4882a593Smuzhiyun sq = phydm_sq_patch_lenovo(dm, 1, pwdb_all, 0, 0);
1059*4882a593Smuzhiyun else
1060*4882a593Smuzhiyun sq = phydm_sq_patch_lenovo(dm, 0, pwdb_all, 0, rssi);
1061*4882a593Smuzhiyun } else
1062*4882a593Smuzhiyun #endif
1063*4882a593Smuzhiyun {
1064*4882a593Smuzhiyun if (is_cck_rate) {
1065*4882a593Smuzhiyun if (pwdb_all > 40 && !dm->is_in_hct_test) {
1066*4882a593Smuzhiyun sq = 100;
1067*4882a593Smuzhiyun } else {
1068*4882a593Smuzhiyun if (pwdb_all > 64)
1069*4882a593Smuzhiyun sq = 0;
1070*4882a593Smuzhiyun else if (pwdb_all < 20)
1071*4882a593Smuzhiyun sq = 100;
1072*4882a593Smuzhiyun else
1073*4882a593Smuzhiyun sq = ((64 - pwdb_all) * 100) / 44;
1074*4882a593Smuzhiyun }
1075*4882a593Smuzhiyun } else {
1076*4882a593Smuzhiyun sq = phy_info->rx_mimo_signal_quality[0];
1077*4882a593Smuzhiyun }
1078*4882a593Smuzhiyun }
1079*4882a593Smuzhiyun
1080*4882a593Smuzhiyun #if 0
1081*4882a593Smuzhiyun /* @dbg_print("cck sq = %d\n", sq); */
1082*4882a593Smuzhiyun #endif
1083*4882a593Smuzhiyun phy_info->signal_quality = sq;
1084*4882a593Smuzhiyun }
1085*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)1086*4882a593Smuzhiyun void phydm_rx_physts_1st_type(struct dm_struct *dm,
1087*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
1088*4882a593Smuzhiyun u8 *phy_status_inf,
1089*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
1090*4882a593Smuzhiyun {
1091*4882a593Smuzhiyun u8 i = 0;
1092*4882a593Smuzhiyun s8 rx_pwr_db = 0;
1093*4882a593Smuzhiyun u8 val = 0; /*tmp value*/
1094*4882a593Smuzhiyun s8 val_s8 = 0; /*tmp value*/
1095*4882a593Smuzhiyun u8 rssi = 0; /*pre path RSSI*/
1096*4882a593Smuzhiyun u8 rf_rx_num = 0;
1097*4882a593Smuzhiyun u8 lna_idx = 0, vga_idx = 0;
1098*4882a593Smuzhiyun u8 cck_agc_rpt = 0;
1099*4882a593Smuzhiyun struct phy_status_rpt_8812 *phy_sts = NULL;
1100*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1101*4882a593Smuzhiyun struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1102*4882a593Smuzhiyun #endif
1103*4882a593Smuzhiyun
1104*4882a593Smuzhiyun phy_sts = (struct phy_status_rpt_8812 *)phy_status_inf;
1105*4882a593Smuzhiyun phydm_rx_physts_bw_parsing(phy_info, pktinfo, phy_sts);
1106*4882a593Smuzhiyun
1107*4882a593Smuzhiyun /* @== [CCK rate] ====================================================*/
1108*4882a593Smuzhiyun if (pktinfo->is_cck_rate) {
1109*4882a593Smuzhiyun cck_agc_rpt = phy_sts->cfosho[0];
1110*4882a593Smuzhiyun lna_idx = (cck_agc_rpt & 0xE0) >> 5;
1111*4882a593Smuzhiyun vga_idx = cck_agc_rpt & 0x1F;
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun rx_pwr_db = phydm_get_cck_rssi(dm, lna_idx, vga_idx);
1114*4882a593Smuzhiyun rssi = phydm_pw_2_percent(rx_pwr_db);
1115*4882a593Smuzhiyun
1116*4882a593Smuzhiyun if (dm->support_ic_type == ODM_RTL8812 &&
1117*4882a593Smuzhiyun !dm->is_cck_high_power) {
1118*4882a593Smuzhiyun if (rssi >= 80) {
1119*4882a593Smuzhiyun rssi = ((rssi - 80) << 1) +
1120*4882a593Smuzhiyun ((rssi - 80) >> 1) + 80;
1121*4882a593Smuzhiyun } else if ((rssi <= 78) && (rssi >= 20)) {
1122*4882a593Smuzhiyun rssi += 3;
1123*4882a593Smuzhiyun }
1124*4882a593Smuzhiyun }
1125*4882a593Smuzhiyun dm->cck_lna_idx = lna_idx;
1126*4882a593Smuzhiyun dm->cck_vga_idx = vga_idx;
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun phy_info->rx_pwdb_all = rssi;
1129*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[0] = rssi;
1130*4882a593Smuzhiyun } else {
1131*4882a593Smuzhiyun /* @== [OFDM rate] ===================================================*/
1132*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
1133*4882a593Smuzhiyun /*@[RSSI]*/
1134*4882a593Smuzhiyun if (dm->rf_path_rx_enable & BIT(i))
1135*4882a593Smuzhiyun rf_rx_num++;
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun if (i < RF_PATH_C)
1138*4882a593Smuzhiyun val = phy_sts->gain_trsw[i];
1139*4882a593Smuzhiyun else
1140*4882a593Smuzhiyun val = phy_sts->gain_trsw_cd[i - 2];
1141*4882a593Smuzhiyun
1142*4882a593Smuzhiyun phy_info->rx_pwr[i] = (val & 0x7F) - 110;
1143*4882a593Smuzhiyun rssi = phydm_pw_2_percent(phy_info->rx_pwr[i]);
1144*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = rssi;
1145*4882a593Smuzhiyun
1146*4882a593Smuzhiyun /*@[SNR]*/
1147*4882a593Smuzhiyun if (i < RF_PATH_C)
1148*4882a593Smuzhiyun val_s8 = phy_sts->rxsnr[i];
1149*4882a593Smuzhiyun else if (dm->support_ic_type & (ODM_RTL8814A))
1150*4882a593Smuzhiyun val_s8 = (s8)phy_sts->csi_current[i - 2];
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun phy_info->rx_snr[i] = val_s8 >> 1;
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun /*@[CFO_short & CFO_tail]*/
1155*4882a593Smuzhiyun if (i < RF_PATH_C) {
1156*4882a593Smuzhiyun val_s8 = phy_sts->cfosho[i];
1157*4882a593Smuzhiyun phy_info->cfo_short[i] = phydm_cfo(val_s8);
1158*4882a593Smuzhiyun val_s8 = phy_sts->cfotail[i];
1159*4882a593Smuzhiyun phy_info->cfo_tail[i] = phydm_cfo(val_s8);
1160*4882a593Smuzhiyun }
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun if (i < RF_PATH_C && pktinfo->is_to_self)
1163*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = phy_sts->gain_trsw[i];
1164*4882a593Smuzhiyun }
1165*4882a593Smuzhiyun
1166*4882a593Smuzhiyun /* @== [PWDB] ========================================================*/
1167*4882a593Smuzhiyun
1168*4882a593Smuzhiyun /*@(Avg PWDB calculated by hardware*/
1169*4882a593Smuzhiyun if (!dm->is_mp_chip) /*@8812, 8821*/
1170*4882a593Smuzhiyun val = phy_sts->pwdb_all;
1171*4882a593Smuzhiyun else
1172*4882a593Smuzhiyun val = phy_sts->pwdb_all >> 1; /*old fomula*/
1173*4882a593Smuzhiyun
1174*4882a593Smuzhiyun rx_pwr_db = (val & 0x7f) - 110;
1175*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_pwr_db);
1176*4882a593Smuzhiyun
1177*4882a593Smuzhiyun /*@(4)EVM of OFDM rate*/
1178*4882a593Smuzhiyun for (i = 0; i < pktinfo->rate_ss; i++) {
1179*4882a593Smuzhiyun if (!pktinfo->is_cck_rate &&
1180*4882a593Smuzhiyun pktinfo->data_rate <= ODM_RATE54M) {
1181*4882a593Smuzhiyun val_s8 = phy_sts->sigevm;
1182*4882a593Smuzhiyun } else if (i < RF_PATH_C) {
1183*4882a593Smuzhiyun if (phy_sts->rxevm[i] == -128)
1184*4882a593Smuzhiyun phy_sts->rxevm[i] = -25;
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun val_s8 = phy_sts->rxevm[i];
1187*4882a593Smuzhiyun } else {
1188*4882a593Smuzhiyun if (phy_sts->rxevm_cd[i - 2] == -128)
1189*4882a593Smuzhiyun phy_sts->rxevm_cd[i - 2] = -25;
1190*4882a593Smuzhiyun
1191*4882a593Smuzhiyun val_s8 = phy_sts->rxevm_cd[i - 2];
1192*4882a593Smuzhiyun }
1193*4882a593Smuzhiyun /*@[EVM to 0~100%]*/
1194*4882a593Smuzhiyun val = phydm_evm_2_percent(val_s8);
1195*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = val;
1196*4882a593Smuzhiyun /*@[EVM dBm]*/
1197*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = phydm_evm_dbm(val_s8);
1198*4882a593Smuzhiyun }
1199*4882a593Smuzhiyun phydm_parsing_cfo(dm, pktinfo,
1200*4882a593Smuzhiyun phy_sts->cfotail, pktinfo->rate_ss);
1201*4882a593Smuzhiyun }
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun /* @== [General Info] ================================================*/
1204*4882a593Smuzhiyun
1205*4882a593Smuzhiyun phy_info->rx_power = rx_pwr_db;
1206*4882a593Smuzhiyun phy_info->bt_rx_rssi_percentage = phy_info->rx_pwdb_all;
1207*4882a593Smuzhiyun phy_info->recv_signal_power = phy_info->rx_power;
1208*4882a593Smuzhiyun phydm_get_sq(dm, phy_info, pktinfo->is_cck_rate);
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun dm->rx_pwdb_ave = dm->rx_pwdb_ave + phy_info->rx_pwdb_all;
1211*4882a593Smuzhiyun
1212*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1213*4882a593Smuzhiyun fat_tab->hw_antsw_occur = phy_sts->hw_antsw_occur;
1214*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_anta;
1215*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_antb;
1216*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_antc;
1217*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_antd;
1218*4882a593Smuzhiyun #endif
1219*4882a593Smuzhiyun }
1220*4882a593Smuzhiyun
1221*4882a593Smuzhiyun #endif
1222*4882a593Smuzhiyun
phydm_reset_rssi_for_dm(struct dm_struct * dm,u8 station_id)1223*4882a593Smuzhiyun void phydm_reset_rssi_for_dm(struct dm_struct *dm, u8 station_id)
1224*4882a593Smuzhiyun {
1225*4882a593Smuzhiyun struct cmn_sta_info *sta;
1226*4882a593Smuzhiyun
1227*4882a593Smuzhiyun sta = dm->phydm_sta_info[station_id];
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun if (!is_sta_active(sta))
1230*4882a593Smuzhiyun return;
1231*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "Reset RSSI for macid = (( %d ))\n",
1232*4882a593Smuzhiyun station_id);
1233*4882a593Smuzhiyun
1234*4882a593Smuzhiyun sta->rssi_stat.rssi_cck = -1;
1235*4882a593Smuzhiyun sta->rssi_stat.rssi_ofdm = -1;
1236*4882a593Smuzhiyun sta->rssi_stat.rssi = -1;
1237*4882a593Smuzhiyun sta->rssi_stat.ofdm_pkt_cnt = 0;
1238*4882a593Smuzhiyun sta->rssi_stat.cck_pkt_cnt = 0;
1239*4882a593Smuzhiyun sta->rssi_stat.cck_sum_power = 0;
1240*4882a593Smuzhiyun sta->rssi_stat.is_send_rssi = RA_RSSI_STATE_INIT;
1241*4882a593Smuzhiyun sta->rssi_stat.packet_map = 0;
1242*4882a593Smuzhiyun sta->rssi_stat.valid_bit = 0;
1243*4882a593Smuzhiyun }
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun #if (ODM_IC_11N_SERIES_SUPPORT || ODM_IC_11AC_SERIES_SUPPORT)
1246*4882a593Smuzhiyun
phydm_get_rssi_8814_ofdm(struct dm_struct * dm,u8 * rssi_in)1247*4882a593Smuzhiyun s32 phydm_get_rssi_8814_ofdm(struct dm_struct *dm, u8 *rssi_in)
1248*4882a593Smuzhiyun {
1249*4882a593Smuzhiyun s32 rssi_avg;
1250*4882a593Smuzhiyun u8 rx_count = 0;
1251*4882a593Smuzhiyun u64 rssi_linear = 0;
1252*4882a593Smuzhiyun
1253*4882a593Smuzhiyun if (dm->rx_ant_status & BB_PATH_A) {
1254*4882a593Smuzhiyun rx_count++;
1255*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_in[RF_PATH_A]);
1256*4882a593Smuzhiyun }
1257*4882a593Smuzhiyun
1258*4882a593Smuzhiyun if (dm->rx_ant_status & BB_PATH_B) {
1259*4882a593Smuzhiyun rx_count++;
1260*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_in[RF_PATH_B]);
1261*4882a593Smuzhiyun }
1262*4882a593Smuzhiyun
1263*4882a593Smuzhiyun if (dm->rx_ant_status & BB_PATH_C) {
1264*4882a593Smuzhiyun rx_count++;
1265*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_in[RF_PATH_C]);
1266*4882a593Smuzhiyun }
1267*4882a593Smuzhiyun
1268*4882a593Smuzhiyun if (dm->rx_ant_status & BB_PATH_D) {
1269*4882a593Smuzhiyun rx_count++;
1270*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_in[RF_PATH_D]);
1271*4882a593Smuzhiyun }
1272*4882a593Smuzhiyun
1273*4882a593Smuzhiyun /* @Rounding and removing fractional bits */
1274*4882a593Smuzhiyun rssi_linear = (rssi_linear + (1 << (FRAC_BITS - 1))) >> FRAC_BITS;
1275*4882a593Smuzhiyun
1276*4882a593Smuzhiyun /* @Calculate average RSSI */
1277*4882a593Smuzhiyun switch (rx_count) {
1278*4882a593Smuzhiyun case 2:
1279*4882a593Smuzhiyun rssi_linear = DIVIDED_2(rssi_linear);
1280*4882a593Smuzhiyun break;
1281*4882a593Smuzhiyun case 3:
1282*4882a593Smuzhiyun rssi_linear = DIVIDED_3(rssi_linear);
1283*4882a593Smuzhiyun break;
1284*4882a593Smuzhiyun case 4:
1285*4882a593Smuzhiyun rssi_linear = DIVIDED_4(rssi_linear);
1286*4882a593Smuzhiyun break;
1287*4882a593Smuzhiyun }
1288*4882a593Smuzhiyun rssi_avg = odm_convert_to_db(rssi_linear);
1289*4882a593Smuzhiyun
1290*4882a593Smuzhiyun return rssi_avg;
1291*4882a593Smuzhiyun }
1292*4882a593Smuzhiyun
phydm_process_rssi_for_dm(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)1293*4882a593Smuzhiyun void phydm_process_rssi_for_dm(struct dm_struct *dm,
1294*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
1295*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
1296*4882a593Smuzhiyun {
1297*4882a593Smuzhiyun s32 rssi_ave = 0; /*@average among all paths*/
1298*4882a593Smuzhiyun s8 rssi_all = 0; /*@average value of CCK & OFDM*/
1299*4882a593Smuzhiyun s8 rssi_cck_tmp = 0, rssi_ofdm_tmp = 0;
1300*4882a593Smuzhiyun u8 i = 0;
1301*4882a593Smuzhiyun u8 rssi_max = 0, rssi_min = 0;
1302*4882a593Smuzhiyun u32 w1 = 0, w2 = 0; /*weighting*/
1303*4882a593Smuzhiyun u8 send_rssi_2_fw = 0;
1304*4882a593Smuzhiyun u8 *rssi_tmp = NULL;
1305*4882a593Smuzhiyun struct cmn_sta_info *sta = NULL;
1306*4882a593Smuzhiyun struct rssi_info *rssi_t = NULL;
1307*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1308*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
1309*4882a593Smuzhiyun struct phydm_fat_struct *fat_tab = &dm->dm_fat_table;
1310*4882a593Smuzhiyun #endif
1311*4882a593Smuzhiyun #endif
1312*4882a593Smuzhiyun
1313*4882a593Smuzhiyun if (pktinfo->station_id >= ODM_ASSOCIATE_ENTRY_NUM)
1314*4882a593Smuzhiyun return;
1315*4882a593Smuzhiyun
1316*4882a593Smuzhiyun #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
1317*4882a593Smuzhiyun odm_s0s1_sw_ant_div_by_ctrl_frame_process_rssi(dm, phy_info, pktinfo);
1318*4882a593Smuzhiyun #endif
1319*4882a593Smuzhiyun
1320*4882a593Smuzhiyun sta = dm->phydm_sta_info[pktinfo->station_id];
1321*4882a593Smuzhiyun
1322*4882a593Smuzhiyun if (!is_sta_active(sta))
1323*4882a593Smuzhiyun return;
1324*4882a593Smuzhiyun
1325*4882a593Smuzhiyun rssi_t = &sta->rssi_stat;
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
1328*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
1329*4882a593Smuzhiyun if ((dm->support_ability & ODM_BB_ANT_DIV) &&
1330*4882a593Smuzhiyun fat_tab->enable_ctrl_frame_antdiv) {
1331*4882a593Smuzhiyun if (pktinfo->is_packet_match_bssid)
1332*4882a593Smuzhiyun dm->data_frame_num++;
1333*4882a593Smuzhiyun
1334*4882a593Smuzhiyun if (fat_tab->use_ctrl_frame_antdiv) {
1335*4882a593Smuzhiyun if (!pktinfo->is_to_self) /*@data frame + CTRL frame*/
1336*4882a593Smuzhiyun return;
1337*4882a593Smuzhiyun } else {
1338*4882a593Smuzhiyun /*@data frame only*/
1339*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
1340*4882a593Smuzhiyun return;
1341*4882a593Smuzhiyun }
1342*4882a593Smuzhiyun } else
1343*4882a593Smuzhiyun #endif
1344*4882a593Smuzhiyun #endif
1345*4882a593Smuzhiyun {
1346*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid) /*@data frame only*/
1347*4882a593Smuzhiyun return;
1348*4882a593Smuzhiyun }
1349*4882a593Smuzhiyun
1350*4882a593Smuzhiyun if (pktinfo->is_packet_beacon) {
1351*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_beacon_pkt++;
1352*4882a593Smuzhiyun dm->phy_dbg_info.beacon_phy_rate = pktinfo->data_rate;
1353*4882a593Smuzhiyun }
1354*4882a593Smuzhiyun
1355*4882a593Smuzhiyun /* @--------------Statistic for antenna/path diversity--------------- */
1356*4882a593Smuzhiyun #ifdef ODM_EVM_ENHANCE_ANTDIV
1357*4882a593Smuzhiyun if (dm->antdiv_evm_en)
1358*4882a593Smuzhiyun phydm_rx_rate_for_antdiv(dm, pktinfo);
1359*4882a593Smuzhiyun #endif
1360*4882a593Smuzhiyun
1361*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
1362*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_ANT_DIV)
1363*4882a593Smuzhiyun odm_process_rssi_for_ant_div(dm, phy_info, pktinfo);
1364*4882a593Smuzhiyun #endif
1365*4882a593Smuzhiyun
1366*4882a593Smuzhiyun #if (defined(CONFIG_PATH_DIVERSITY))
1367*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_PATH_DIV)
1368*4882a593Smuzhiyun phydm_process_rssi_for_path_div(dm, phy_info, pktinfo);
1369*4882a593Smuzhiyun #endif
1370*4882a593Smuzhiyun /* @----------------------------------------------------------------- */
1371*4882a593Smuzhiyun
1372*4882a593Smuzhiyun rssi_cck_tmp = rssi_t->rssi_cck;
1373*4882a593Smuzhiyun rssi_ofdm_tmp = rssi_t->rssi_ofdm;
1374*4882a593Smuzhiyun rssi_all = rssi_t->rssi;
1375*4882a593Smuzhiyun
1376*4882a593Smuzhiyun if (!(pktinfo->is_packet_to_self || pktinfo->is_packet_beacon))
1377*4882a593Smuzhiyun return;
1378*4882a593Smuzhiyun
1379*4882a593Smuzhiyun if (!pktinfo->is_cck_rate) {
1380*4882a593Smuzhiyun /* @=== [ofdm RSSI] ======================================================== */
1381*4882a593Smuzhiyun rssi_tmp = phy_info->rx_mimo_signal_strength;
1382*4882a593Smuzhiyun
1383*4882a593Smuzhiyun #if (RTL8814A_SUPPORT == 1)
1384*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8814A)) {
1385*4882a593Smuzhiyun rssi_ave = phydm_get_rssi_8814_ofdm(dm, rssi_tmp);
1386*4882a593Smuzhiyun } else
1387*4882a593Smuzhiyun #endif
1388*4882a593Smuzhiyun {
1389*4882a593Smuzhiyun if (rssi_tmp[RF_PATH_B] == 0) {
1390*4882a593Smuzhiyun rssi_ave = rssi_tmp[RF_PATH_A];
1391*4882a593Smuzhiyun } else {
1392*4882a593Smuzhiyun if (rssi_tmp[RF_PATH_A] > rssi_tmp[RF_PATH_B]) {
1393*4882a593Smuzhiyun rssi_max = rssi_tmp[RF_PATH_A];
1394*4882a593Smuzhiyun rssi_min = rssi_tmp[RF_PATH_B];
1395*4882a593Smuzhiyun } else {
1396*4882a593Smuzhiyun rssi_max = rssi_tmp[RF_PATH_B];
1397*4882a593Smuzhiyun rssi_min = rssi_tmp[RF_PATH_A];
1398*4882a593Smuzhiyun }
1399*4882a593Smuzhiyun if ((rssi_max - rssi_min) < 3)
1400*4882a593Smuzhiyun rssi_ave = rssi_max;
1401*4882a593Smuzhiyun else if ((rssi_max - rssi_min) < 6)
1402*4882a593Smuzhiyun rssi_ave = rssi_max - 1;
1403*4882a593Smuzhiyun else if ((rssi_max - rssi_min) < 10)
1404*4882a593Smuzhiyun rssi_ave = rssi_max - 2;
1405*4882a593Smuzhiyun else
1406*4882a593Smuzhiyun rssi_ave = rssi_max - 3;
1407*4882a593Smuzhiyun }
1408*4882a593Smuzhiyun }
1409*4882a593Smuzhiyun
1410*4882a593Smuzhiyun /* OFDM MA RSSI */
1411*4882a593Smuzhiyun if (rssi_ofdm_tmp <= 0) { /* @initialize */
1412*4882a593Smuzhiyun rssi_ofdm_tmp = (s8)phy_info->rx_pwdb_all;
1413*4882a593Smuzhiyun } else {
1414*4882a593Smuzhiyun rssi_ofdm_tmp = (s8)WEIGHTING_AVG(rssi_ofdm_tmp,
1415*4882a593Smuzhiyun (1 << RSSI_MA) - 1,
1416*4882a593Smuzhiyun rssi_ave, 1);
1417*4882a593Smuzhiyun if (phy_info->rx_pwdb_all > (u32)rssi_ofdm_tmp)
1418*4882a593Smuzhiyun rssi_ofdm_tmp++;
1419*4882a593Smuzhiyun }
1420*4882a593Smuzhiyun
1421*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "rssi_ofdm=%d\n", rssi_ofdm_tmp);
1422*4882a593Smuzhiyun } else {
1423*4882a593Smuzhiyun /* @=== [cck RSSI] ========================================================= */
1424*4882a593Smuzhiyun rssi_ave = phy_info->rx_pwdb_all;
1425*4882a593Smuzhiyun
1426*4882a593Smuzhiyun if (rssi_t->cck_pkt_cnt <= 63)
1427*4882a593Smuzhiyun rssi_t->cck_pkt_cnt++;
1428*4882a593Smuzhiyun
1429*4882a593Smuzhiyun /* @1 Process CCK RSSI */
1430*4882a593Smuzhiyun if (rssi_cck_tmp <= 0) { /* @initialize */
1431*4882a593Smuzhiyun rssi_cck_tmp = (s8)phy_info->rx_pwdb_all;
1432*4882a593Smuzhiyun rssi_t->cck_sum_power = (u16)phy_info->rx_pwdb_all;
1433*4882a593Smuzhiyun rssi_t->cck_pkt_cnt = 1; /*reset*/
1434*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "[1]CCK_INIT\n");
1435*4882a593Smuzhiyun } else if (rssi_t->cck_pkt_cnt <= CCK_RSSI_INIT_COUNT) {
1436*4882a593Smuzhiyun rssi_t->cck_sum_power = rssi_t->cck_sum_power +
1437*4882a593Smuzhiyun (u16)phy_info->rx_pwdb_all;
1438*4882a593Smuzhiyun
1439*4882a593Smuzhiyun rssi_cck_tmp = rssi_t->cck_sum_power /
1440*4882a593Smuzhiyun rssi_t->cck_pkt_cnt;
1441*4882a593Smuzhiyun
1442*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR,
1443*4882a593Smuzhiyun "[2]SumPow=%d, cck_pkt=%d\n",
1444*4882a593Smuzhiyun rssi_t->cck_sum_power, rssi_t->cck_pkt_cnt);
1445*4882a593Smuzhiyun } else {
1446*4882a593Smuzhiyun rssi_cck_tmp = (s8)WEIGHTING_AVG(rssi_cck_tmp,
1447*4882a593Smuzhiyun (1 << RSSI_MA) - 1,
1448*4882a593Smuzhiyun phy_info->rx_pwdb_all,
1449*4882a593Smuzhiyun 1);
1450*4882a593Smuzhiyun if (phy_info->rx_pwdb_all > (u32)rssi_cck_tmp)
1451*4882a593Smuzhiyun rssi_cck_tmp++;
1452*4882a593Smuzhiyun }
1453*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "rssi_cck=%d\n", rssi_cck_tmp);
1454*4882a593Smuzhiyun }
1455*4882a593Smuzhiyun
1456*4882a593Smuzhiyun /* @=== [ofdm + cck weighting RSSI] ========================================= */
1457*4882a593Smuzhiyun if (!pktinfo->is_cck_rate) {
1458*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt < 8 && !(rssi_t->packet_map & BIT(7)))
1459*4882a593Smuzhiyun rssi_t->ofdm_pkt_cnt++; /*OFDM packet cnt in bitmap*/
1460*4882a593Smuzhiyun
1461*4882a593Smuzhiyun rssi_t->packet_map = (rssi_t->packet_map << 1) | BIT(0);
1462*4882a593Smuzhiyun } else {
1463*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt > 0 && rssi_t->packet_map & BIT(7))
1464*4882a593Smuzhiyun rssi_t->ofdm_pkt_cnt--;
1465*4882a593Smuzhiyun
1466*4882a593Smuzhiyun rssi_t->packet_map = rssi_t->packet_map << 1;
1467*4882a593Smuzhiyun }
1468*4882a593Smuzhiyun
1469*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt == 8) {
1470*4882a593Smuzhiyun rssi_all = rssi_ofdm_tmp;
1471*4882a593Smuzhiyun } else {
1472*4882a593Smuzhiyun if (rssi_t->valid_bit < 8)
1473*4882a593Smuzhiyun rssi_t->valid_bit++;
1474*4882a593Smuzhiyun
1475*4882a593Smuzhiyun if (rssi_t->valid_bit == 8) {
1476*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt > 4)
1477*4882a593Smuzhiyun w1 = 64;
1478*4882a593Smuzhiyun else
1479*4882a593Smuzhiyun w1 = (u32)(rssi_t->ofdm_pkt_cnt << 4);
1480*4882a593Smuzhiyun
1481*4882a593Smuzhiyun w2 = 64 - w1;
1482*4882a593Smuzhiyun
1483*4882a593Smuzhiyun rssi_all = (s8)((w1 * (u32)rssi_ofdm_tmp +
1484*4882a593Smuzhiyun w2 * (u32)rssi_cck_tmp) >> 6);
1485*4882a593Smuzhiyun } else if (rssi_t->valid_bit != 0) { /*@(valid_bit > 8)*/
1486*4882a593Smuzhiyun w1 = (u32)rssi_t->ofdm_pkt_cnt;
1487*4882a593Smuzhiyun w2 = (u32)(rssi_t->valid_bit - rssi_t->ofdm_pkt_cnt);
1488*4882a593Smuzhiyun rssi_all = (s8)WEIGHTING_AVG((u32)rssi_ofdm_tmp, w1,
1489*4882a593Smuzhiyun (u32)rssi_cck_tmp, w2);
1490*4882a593Smuzhiyun } else {
1491*4882a593Smuzhiyun rssi_all = 0;
1492*4882a593Smuzhiyun }
1493*4882a593Smuzhiyun }
1494*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR, "rssi=%d,w1=%d,w2=%d\n", rssi_all, w1, w2);
1495*4882a593Smuzhiyun
1496*4882a593Smuzhiyun if ((rssi_t->ofdm_pkt_cnt >= 1 || rssi_t->cck_pkt_cnt >= 5) &&
1497*4882a593Smuzhiyun rssi_t->is_send_rssi == RA_RSSI_STATE_INIT) {
1498*4882a593Smuzhiyun send_rssi_2_fw = 1;
1499*4882a593Smuzhiyun rssi_t->is_send_rssi = RA_RSSI_STATE_SEND;
1500*4882a593Smuzhiyun }
1501*4882a593Smuzhiyun
1502*4882a593Smuzhiyun rssi_t->rssi_cck = rssi_cck_tmp;
1503*4882a593Smuzhiyun rssi_t->rssi_ofdm = rssi_ofdm_tmp;
1504*4882a593Smuzhiyun rssi_t->rssi = rssi_all;
1505*4882a593Smuzhiyun
1506*4882a593Smuzhiyun if (send_rssi_2_fw) { /* Trigger init rate by RSSI */
1507*4882a593Smuzhiyun if (rssi_t->ofdm_pkt_cnt != 0)
1508*4882a593Smuzhiyun rssi_t->rssi = rssi_ofdm_tmp;
1509*4882a593Smuzhiyun
1510*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_RSSI_MNTR,
1511*4882a593Smuzhiyun "[Send to FW] PWDB=%d, ofdm_pkt=%d, cck_pkt=%d\n",
1512*4882a593Smuzhiyun rssi_all, rssi_t->ofdm_pkt_cnt, rssi_t->cck_pkt_cnt);
1513*4882a593Smuzhiyun }
1514*4882a593Smuzhiyun
1515*4882a593Smuzhiyun #if 0
1516*4882a593Smuzhiyun /* @dbg_print("ofdm_pkt=%d, weighting=%d\n", ofdm_pkt_cnt, weighting);*/
1517*4882a593Smuzhiyun /* @dbg_print("rssi_ofdm_tmp=%d, rssi_all=%d, rssi_cck_tmp=%d\n", */
1518*4882a593Smuzhiyun /* rssi_ofdm_tmp, rssi_all, rssi_cck_tmp); */
1519*4882a593Smuzhiyun #endif
1520*4882a593Smuzhiyun }
1521*4882a593Smuzhiyun #endif
1522*4882a593Smuzhiyun
1523*4882a593Smuzhiyun #ifdef PHYSTS_3RD_TYPE_SUPPORT
1524*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
phydm_physts_auto_switch_jgr3_reset(void * dm_void)1525*4882a593Smuzhiyun void phydm_physts_auto_switch_jgr3_reset(void *dm_void)
1526*4882a593Smuzhiyun {
1527*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1528*4882a593Smuzhiyun struct pkt_process_info *pkt_proc = &dm->pkt_proc_struct;
1529*4882a593Smuzhiyun
1530*4882a593Smuzhiyun pkt_proc->phy_ppdu_cnt = 0xff;
1531*4882a593Smuzhiyun pkt_proc->mac_ppdu_cnt = 0xff;
1532*4882a593Smuzhiyun pkt_proc->page_bitmap_record = 0;
1533*4882a593Smuzhiyun }
1534*4882a593Smuzhiyun
phydm_physts_auto_switch_jgr3(void * dm_void,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo)1535*4882a593Smuzhiyun boolean phydm_physts_auto_switch_jgr3(void *dm_void, u8 *phy_sts,
1536*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
1537*4882a593Smuzhiyun {
1538*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1539*4882a593Smuzhiyun struct pkt_process_info *pkt_proc = &dm->pkt_proc_struct;
1540*4882a593Smuzhiyun boolean is_skip_physts_parsing = false;
1541*4882a593Smuzhiyun u8 phy_sts_byte0 = (*phy_sts & 0xff);
1542*4882a593Smuzhiyun u8 phy_ppdu_cnt_pre = 0, mac_ppdu_cnt_pre = 0;
1543*4882a593Smuzhiyun u8 ppdu_phy_rate_pre = 0, ppdu_macid_pre = 0;
1544*4882a593Smuzhiyun u8 page = phy_sts_byte0 & 0xf;
1545*4882a593Smuzhiyun
1546*4882a593Smuzhiyun if (!pkt_proc->physts_auto_swch_en)
1547*4882a593Smuzhiyun return is_skip_physts_parsing;
1548*4882a593Smuzhiyun
1549*4882a593Smuzhiyun phy_ppdu_cnt_pre = pkt_proc->phy_ppdu_cnt;
1550*4882a593Smuzhiyun mac_ppdu_cnt_pre = pkt_proc->mac_ppdu_cnt;
1551*4882a593Smuzhiyun ppdu_phy_rate_pre = pkt_proc->ppdu_phy_rate;
1552*4882a593Smuzhiyun ppdu_macid_pre = pkt_proc->ppdu_macid;
1553*4882a593Smuzhiyun
1554*4882a593Smuzhiyun pkt_proc->phy_ppdu_cnt = (phy_sts_byte0 & 0x30) >> 4;
1555*4882a593Smuzhiyun pkt_proc->mac_ppdu_cnt = pktinfo->ppdu_cnt;
1556*4882a593Smuzhiyun pkt_proc->ppdu_phy_rate = pktinfo->data_rate;
1557*4882a593Smuzhiyun pkt_proc->ppdu_macid = pktinfo->station_id;
1558*4882a593Smuzhiyun
1559*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
1560*4882a593Smuzhiyun "[rate:0x%x] PPDU mac{pre, curr}= {%d, %d}, phy{pre, curr}= {%d, %d}\n",
1561*4882a593Smuzhiyun pktinfo->data_rate, mac_ppdu_cnt_pre, pkt_proc->mac_ppdu_cnt,
1562*4882a593Smuzhiyun phy_ppdu_cnt_pre, pkt_proc->phy_ppdu_cnt);
1563*4882a593Smuzhiyun
1564*4882a593Smuzhiyun if (pktinfo->data_rate < ODM_RATEMCS0) {
1565*4882a593Smuzhiyun pkt_proc->page_bitmap_record = 0;
1566*4882a593Smuzhiyun return is_skip_physts_parsing;
1567*4882a593Smuzhiyun }
1568*4882a593Smuzhiyun
1569*4882a593Smuzhiyun if (ppdu_macid_pre == pkt_proc->ppdu_macid &&
1570*4882a593Smuzhiyun ppdu_phy_rate_pre == pkt_proc->ppdu_phy_rate &&
1571*4882a593Smuzhiyun phy_ppdu_cnt_pre == pkt_proc->phy_ppdu_cnt &&
1572*4882a593Smuzhiyun mac_ppdu_cnt_pre == pkt_proc->mac_ppdu_cnt) {
1573*4882a593Smuzhiyun if (pkt_proc->page_bitmap_record & BIT(page)) {
1574*4882a593Smuzhiyun /*@PHYDM_DBG(dm, DBG_PHY_STATUS, "collect page-%d enough\n", page);*/
1575*4882a593Smuzhiyun is_skip_physts_parsing = true;
1576*4882a593Smuzhiyun } else if (pkt_proc->page_bitmap_record ==
1577*4882a593Smuzhiyun pkt_proc->page_bitmap_target) {
1578*4882a593Smuzhiyun /*@PHYDM_DBG(dm, DBG_PHY_STATUS, "collect all enough\n");*/
1579*4882a593Smuzhiyun is_skip_physts_parsing = true;
1580*4882a593Smuzhiyun } else {
1581*4882a593Smuzhiyun /*@PHYDM_DBG(dm, DBG_PHY_STATUS, "update page-%d\n", page);*/
1582*4882a593Smuzhiyun pkt_proc->page_bitmap_record |= BIT(page);
1583*4882a593Smuzhiyun }
1584*4882a593Smuzhiyun pkt_proc->is_1st_mpdu = false;
1585*4882a593Smuzhiyun } else {
1586*4882a593Smuzhiyun /*@PHYDM_DBG(dm, DBG_PHY_STATUS, "[New Pkt] update page-%d\n", page);*/
1587*4882a593Smuzhiyun pkt_proc->page_bitmap_record = BIT(page);
1588*4882a593Smuzhiyun pkt_proc->is_1st_mpdu = true;
1589*4882a593Smuzhiyun }
1590*4882a593Smuzhiyun
1591*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
1592*4882a593Smuzhiyun "bitmap{record, target}= {0x%x, 0x%x}\n",
1593*4882a593Smuzhiyun pkt_proc->page_bitmap_record,
1594*4882a593Smuzhiyun pkt_proc->page_bitmap_target);
1595*4882a593Smuzhiyun
1596*4882a593Smuzhiyun return is_skip_physts_parsing;
1597*4882a593Smuzhiyun }
1598*4882a593Smuzhiyun
phydm_physts_auto_switch_jgr3_set(void * dm_void,boolean enable,u8 bitmap_en)1599*4882a593Smuzhiyun void phydm_physts_auto_switch_jgr3_set(void *dm_void, boolean enable,
1600*4882a593Smuzhiyun u8 bitmap_en)
1601*4882a593Smuzhiyun {
1602*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1603*4882a593Smuzhiyun struct pkt_process_info *pkt_proc = &dm->pkt_proc_struct;
1604*4882a593Smuzhiyun u16 en_page_num = 1;
1605*4882a593Smuzhiyun
1606*4882a593Smuzhiyun if (!(dm->support_ic_type & PHYSTS_AUTO_SWITCH_IC))
1607*4882a593Smuzhiyun return;
1608*4882a593Smuzhiyun #if 0
1609*4882a593Smuzhiyun if (!(dm->support_ic_type & PHYSTS_3RD_TYPE_IC))
1610*4882a593Smuzhiyun return;
1611*4882a593Smuzhiyun #endif
1612*4882a593Smuzhiyun pkt_proc->physts_auto_swch_en = enable;
1613*4882a593Smuzhiyun pkt_proc->page_bitmap_target = bitmap_en;
1614*4882a593Smuzhiyun phydm_physts_auto_switch_jgr3_reset(dm);
1615*4882a593Smuzhiyun en_page_num = phydm_ones_num_in_bitmap((u64)bitmap_en, 8);
1616*4882a593Smuzhiyun
1617*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_CMN, "[%s]en=%d, bitmap_en=%d, en_page_num=%d\n",
1618*4882a593Smuzhiyun __func__, enable, bitmap_en, en_page_num);
1619*4882a593Smuzhiyun
1620*4882a593Smuzhiyun if (enable) {
1621*4882a593Smuzhiyun /*@per MPDU latch & update phy-staatus*/
1622*4882a593Smuzhiyun odm_set_mac_reg(dm, R_0x60c, BIT(31), 1);
1623*4882a593Smuzhiyun /*@Update Period (OFDM Symbol)*/
1624*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c0, 0xfc000, 3);
1625*4882a593Smuzhiyun /*@switchin bitmap*/
1626*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c4, 0x7f80000, bitmap_en);
1627*4882a593Smuzhiyun /*@mode 3*/
1628*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c4, (BIT(28) | BIT(27)), 3);
1629*4882a593Smuzhiyun } else {
1630*4882a593Smuzhiyun odm_set_mac_reg(dm, R_0x60c, BIT(31), 0);
1631*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c0, 0xfc000, 0x1);
1632*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c4, 0x7f80000, 0x2);
1633*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x8c4, (BIT(28) | BIT(27)), 0);
1634*4882a593Smuzhiyun }
1635*4882a593Smuzhiyun }
1636*4882a593Smuzhiyun
phydm_avg_condi_num(void * dm_void,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)1637*4882a593Smuzhiyun void phydm_avg_condi_num(void *dm_void,
1638*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
1639*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
1640*4882a593Smuzhiyun {
1641*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1642*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
1643*4882a593Smuzhiyun struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;
1644*4882a593Smuzhiyun u16 size_th = PHY_HIST_SIZE - 1; /*size of threshold*/
1645*4882a593Smuzhiyun u16 val = 0, intvl = 0;
1646*4882a593Smuzhiyun u8 arry_idx = 0;
1647*4882a593Smuzhiyun
1648*4882a593Smuzhiyun if (pktinfo->rate_ss == 1)
1649*4882a593Smuzhiyun return;
1650*4882a593Smuzhiyun
1651*4882a593Smuzhiyun arry_idx = pktinfo->rate_ss - 1;
1652*4882a593Smuzhiyun
1653*4882a593Smuzhiyun dbg_s->p4_cnt[arry_idx]++;
1654*4882a593Smuzhiyun dbg_s->cn_sum[arry_idx] += dbg_i->condition_num_seg0;
1655*4882a593Smuzhiyun
1656*4882a593Smuzhiyun /*CN Histogram*/
1657*4882a593Smuzhiyun val = (u16)dbg_i->condition_num_seg0;
1658*4882a593Smuzhiyun intvl = phydm_find_intrvl(dm, val, dbg_i->cn_hist_th, size_th);
1659*4882a593Smuzhiyun dbg_s->cn_hist[arry_idx][intvl]++;
1660*4882a593Smuzhiyun
1661*4882a593Smuzhiyun dbg_i->condi_num = (u32)dbg_i->condition_num_seg0; /*will remove*/
1662*4882a593Smuzhiyun }
1663*4882a593Smuzhiyun #endif
1664*4882a593Smuzhiyun
phydm_print_phystat_jgr3(struct dm_struct * dm,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)1665*4882a593Smuzhiyun void phydm_print_phystat_jgr3(struct dm_struct *dm, u8 *phy_sts,
1666*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
1667*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
1668*4882a593Smuzhiyun {
1669*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type0 *rpt0 = NULL;
1670*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type1 *rpt1 = NULL;
1671*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type2_3 *rpt2 = NULL;
1672*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type4 *rpt3 = NULL;
1673*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type5 *rpt4 = NULL;
1674*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
1675*4882a593Smuzhiyun u8 phy_status_page_num = (*phy_sts & 0xf);
1676*4882a593Smuzhiyun u32 *phy_status_tmp = NULL;
1677*4882a593Smuzhiyun u8 i = 0;
1678*4882a593Smuzhiyun /*u32 size = PHY_STATUS_JRGUAR3_DW_LEN << 2;*/
1679*4882a593Smuzhiyun
1680*4882a593Smuzhiyun if (!(dm->debug_components & DBG_PHY_STATUS))
1681*4882a593Smuzhiyun return;
1682*4882a593Smuzhiyun
1683*4882a593Smuzhiyun rpt0 = (struct phy_sts_rpt_jgr3_type0 *)phy_sts;
1684*4882a593Smuzhiyun rpt1 = (struct phy_sts_rpt_jgr3_type1 *)phy_sts;
1685*4882a593Smuzhiyun rpt2 = (struct phy_sts_rpt_jgr3_type2_3 *)phy_sts;
1686*4882a593Smuzhiyun rpt3 = (struct phy_sts_rpt_jgr3_type4 *)phy_sts;
1687*4882a593Smuzhiyun rpt4 = (struct phy_sts_rpt_jgr3_type5 *)phy_sts;
1688*4882a593Smuzhiyun
1689*4882a593Smuzhiyun phy_status_tmp = (u32 *)phy_sts;
1690*4882a593Smuzhiyun
1691*4882a593Smuzhiyun if (dbg->show_phy_sts_all_pkt == 0) {
1692*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
1693*4882a593Smuzhiyun return;
1694*4882a593Smuzhiyun }
1695*4882a593Smuzhiyun
1696*4882a593Smuzhiyun dbg->show_phy_sts_cnt++;
1697*4882a593Smuzhiyun
1698*4882a593Smuzhiyun if (dbg->show_phy_sts_max_cnt != SHOW_PHY_STATUS_UNLIMITED) {
1699*4882a593Smuzhiyun if (dbg->show_phy_sts_cnt > dbg->show_phy_sts_max_cnt)
1700*4882a593Smuzhiyun return;
1701*4882a593Smuzhiyun }
1702*4882a593Smuzhiyun
1703*4882a593Smuzhiyun if (phy_status_page_num == 0)
1704*4882a593Smuzhiyun pr_debug("Phy Status Rpt: CCK\n");
1705*4882a593Smuzhiyun else
1706*4882a593Smuzhiyun pr_debug("Phy Status Rpt: OFDM_%d\n", phy_status_page_num);
1707*4882a593Smuzhiyun
1708*4882a593Smuzhiyun pr_debug("StaID=%d, RxRate = 0x%x match_bssid=%d, ppdu_cnt=%d\n",
1709*4882a593Smuzhiyun pktinfo->station_id, pktinfo->data_rate,
1710*4882a593Smuzhiyun pktinfo->is_packet_match_bssid, pktinfo->ppdu_cnt);
1711*4882a593Smuzhiyun
1712*4882a593Smuzhiyun for (i = 0; i < PHY_STATUS_JRGUAR3_DW_LEN; i++)
1713*4882a593Smuzhiyun pr_debug("Offset[%d:%d] = 0x%x\n",
1714*4882a593Smuzhiyun ((4 * i) + 3), (4 * i), phy_status_tmp[i]);
1715*4882a593Smuzhiyun
1716*4882a593Smuzhiyun if (phy_status_page_num == 0) { /* @CCK(default) */
1717*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",
1718*4882a593Smuzhiyun rpt0->pkt_cnt, rpt0->channel_msb, rpt0->pwdb_a,
1719*4882a593Smuzhiyun rpt0->gain_a, rpt0->trsw, rpt0->agc_table_b,
1720*4882a593Smuzhiyun rpt0->agc_table_c);
1721*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",
1722*4882a593Smuzhiyun rpt0->path_sel_o, rpt0->gnt_bt_keep_cck,
1723*4882a593Smuzhiyun rpt0->hw_antsw_occur_keep_cck, rpt0->band,
1724*4882a593Smuzhiyun rpt0->channel, rpt0->agc_table_a, rpt0->l_rxsc,
1725*4882a593Smuzhiyun rpt0->agc_table_d);
1726*4882a593Smuzhiyun pr_debug("[8] AntIdx={%d, %d, %d, %d}, Length=%d\n",
1727*4882a593Smuzhiyun rpt0->antidx_d, rpt0->antidx_c, rpt0->antidx_b,
1728*4882a593Smuzhiyun rpt0->antidx_a, rpt0->length);
1729*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",
1730*4882a593Smuzhiyun rpt0->mf_off, rpt0->sqloss, rpt0->lockbit,
1731*4882a593Smuzhiyun rpt0->raterr, rpt0->rxrate, rpt0->lna_h_a,
1732*4882a593Smuzhiyun rpt0->bb_power_a, rpt0->lna_l_a, rpt0->vga_a,
1733*4882a593Smuzhiyun rpt0->signal_quality);
1734*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",
1735*4882a593Smuzhiyun rpt0->gain_b, rpt0->lna_h_b, rpt0->bb_power_b,
1736*4882a593Smuzhiyun rpt0->lna_l_b, rpt0->vga_b, rpt0->pwdb_b);
1737*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",
1738*4882a593Smuzhiyun rpt0->gain_c, rpt0->lna_h_c, rpt0->bb_power_c,
1739*4882a593Smuzhiyun rpt0->lna_l_c, rpt0->vga_c, rpt0->pwdb_c);
1740*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",
1741*4882a593Smuzhiyun rpt0->gain_c, rpt0->lna_h_c, rpt0->bb_power_c,
1742*4882a593Smuzhiyun rpt0->lna_l_c, rpt0->vga_c, rpt0->pwdb_c);
1743*4882a593Smuzhiyun } else if (phy_status_page_num == 1) {
1744*4882a593Smuzhiyun pr_debug("[0] pwdb[C:A]={%d, %d, %d}, Channel_pri_msb=%d, Pkt_cnt=%d,\n",
1745*4882a593Smuzhiyun rpt1->pwdb_c, rpt1->pwdb_b, rpt1->pwdb_a,
1746*4882a593Smuzhiyun rpt1->channel_pri_msb, rpt1->pkt_cnt);
1747*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",
1748*4882a593Smuzhiyun rpt1->beamformed, rpt1->stbc, rpt1->ldpc, rpt1->gnt_bt,
1749*4882a593Smuzhiyun rpt1->band, rpt1->channel_pri_lsb, rpt1->ht_rxsc,
1750*4882a593Smuzhiyun rpt1->l_rxsc, rpt1->pwdb_d);
1751*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",
1752*4882a593Smuzhiyun rpt1->antidx_d, rpt1->antidx_c,
1753*4882a593Smuzhiyun rpt1->antidx_b, rpt1->antidx_a,
1754*4882a593Smuzhiyun rpt1->hw_antsw_occur_d, rpt1->hw_antsw_occur_c,
1755*4882a593Smuzhiyun rpt1->hw_antsw_occur_b, rpt1->hw_antsw_occur_a,
1756*4882a593Smuzhiyun rpt1->channel_sec_msb, rpt1->channel_sec_lsb);
1757*4882a593Smuzhiyun pr_debug("[12] GID=%d, PAID[msb,lsb]={%d,%d}\n",
1758*4882a593Smuzhiyun rpt1->gid, rpt1->paid_msb, rpt1->paid);
1759*4882a593Smuzhiyun pr_debug("[16] RX_EVM[D:A]={%d, %d, %d, %d}\n",
1760*4882a593Smuzhiyun rpt1->rxevm[3], rpt1->rxevm[2],
1761*4882a593Smuzhiyun rpt1->rxevm[1], rpt1->rxevm[0]);
1762*4882a593Smuzhiyun pr_debug("[20] CFO_tail[D:A]={%d, %d, %d, %d}\n",
1763*4882a593Smuzhiyun rpt1->cfo_tail[3], rpt1->cfo_tail[2],
1764*4882a593Smuzhiyun rpt1->cfo_tail[1], rpt1->cfo_tail[0]);
1765*4882a593Smuzhiyun pr_debug("[24] RX_SNR[D:A]={%d, %d, %d, %d}\n\n",
1766*4882a593Smuzhiyun rpt1->rxsnr[3], rpt1->rxsnr[2],
1767*4882a593Smuzhiyun rpt1->rxsnr[1], rpt1->rxsnr[0]);
1768*4882a593Smuzhiyun } else if (phy_status_page_num == 2 || phy_status_page_num == 3) {
1769*4882a593Smuzhiyun pr_debug("[0] pwdb[C:A]={%d, %d, %d}, Channel_mdb=%d, Pkt_cnt=%d\n",
1770*4882a593Smuzhiyun rpt2->pwdb[2], rpt2->pwdb[1], rpt2->pwdb[0],
1771*4882a593Smuzhiyun rpt2->channel_msb, rpt2->pkt_cnt);
1772*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",
1773*4882a593Smuzhiyun rpt2->beamformed, rpt2->stbc, rpt2->ldpc, rpt2->gnt_bt,
1774*4882a593Smuzhiyun rpt2->band, rpt2->channel_lsb,
1775*4882a593Smuzhiyun rpt2->ht_rxsc, rpt2->l_rxsc, rpt2->pwdb[3]);
1776*4882a593Smuzhiyun pr_debug("[8] AgcTab[D:A]={%d, %d, %d, %d}, pwed_th=%d, shift_l_map=%d\n",
1777*4882a593Smuzhiyun rpt2->agc_table_d, rpt2->agc_table_c,
1778*4882a593Smuzhiyun rpt2->agc_table_b, rpt2->agc_table_a,
1779*4882a593Smuzhiyun rpt2->pwed_th, rpt2->shift_l_map);
1780*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",
1781*4882a593Smuzhiyun rpt2->avg_noise_pwr_lsb, rpt2->mp_gain_c_msb,
1782*4882a593Smuzhiyun rpt2->mp_gain_c_lsb, rpt2->mp_gain_b_msb,
1783*4882a593Smuzhiyun rpt2->mp_gain_b_lsb, rpt2->mp_gain_a,
1784*4882a593Smuzhiyun rpt2->cnt_cca2agc_rdy);
1785*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",
1786*4882a593Smuzhiyun rpt2->ht_aagc_gain[1], rpt2->ht_aagc_gain[0],
1787*4882a593Smuzhiyun rpt2->aagc_step_d, rpt2->aagc_step_c,
1788*4882a593Smuzhiyun rpt2->aagc_step_b, rpt2->aagc_step_a,
1789*4882a593Smuzhiyun rpt2->is_freq_select_fading, rpt2->mp_gain_d);
1790*4882a593Smuzhiyun pr_debug("[20] DAGC gain ant[B:A]={%d, %d}, HT AAGC gain[D:C]={%d, %d}\n",
1791*4882a593Smuzhiyun rpt2->dagc_gain[1], rpt2->dagc_gain[0],
1792*4882a593Smuzhiyun rpt2->ht_aagc_gain[3], rpt2->ht_aagc_gain[2]);
1793*4882a593Smuzhiyun pr_debug("[24] AvgNoisePwerdB=%d, syn_count[msb, lsb]={%d, %d}, counter=%d, DAGC gain ant[D:C]={%d, %d}\n",
1794*4882a593Smuzhiyun rpt2->avg_noise_pwr_msb, rpt2->syn_count_msb,
1795*4882a593Smuzhiyun rpt2->syn_count_lsb, rpt2->counter,
1796*4882a593Smuzhiyun rpt2->dagc_gain[3], rpt2->dagc_gain[2]);
1797*4882a593Smuzhiyun } else if (phy_status_page_num == 4) { /*type 4*/
1798*4882a593Smuzhiyun pr_debug("[0] pwdb[C:A]={%d, %d, %d}, Channel_mdb=%d, Pkt_cnt=%d\n",
1799*4882a593Smuzhiyun rpt3->pwdb[2], rpt3->pwdb[1], rpt3->pwdb[0],
1800*4882a593Smuzhiyun rpt3->channel_msb, rpt3->pkt_cnt);
1801*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",
1802*4882a593Smuzhiyun rpt3->beamformed, rpt3->stbc, rpt3->ldpc, rpt3->gnt_bt,
1803*4882a593Smuzhiyun rpt3->band, rpt3->channel_lsb, rpt3->ht_rxsc,
1804*4882a593Smuzhiyun rpt3->l_rxsc, rpt3->pwdb[3]);
1805*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",
1806*4882a593Smuzhiyun rpt3->antidx_d, rpt3->antidx_c,
1807*4882a593Smuzhiyun rpt3->antidx_b, rpt3->antidx_a,
1808*4882a593Smuzhiyun rpt3->hw_antsw_occur_d, rpt3->hw_antsw_occur_c,
1809*4882a593Smuzhiyun rpt3->hw_antsw_occur_b, rpt3->hw_antsw_occur_a,
1810*4882a593Smuzhiyun rpt3->training_done_d, rpt3->training_done_c,
1811*4882a593Smuzhiyun rpt3->training_done_b, rpt3->training_done_a,
1812*4882a593Smuzhiyun rpt3->bad_tone_cnt_cn_excess_0,
1813*4882a593Smuzhiyun rpt3->bad_tone_cnt_min_eign_0);
1814*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",
1815*4882a593Smuzhiyun ((rpt3->avg_cond_num_1_msb << 1) |
1816*4882a593Smuzhiyun rpt3->avg_cond_num_1_lsb),
1817*4882a593Smuzhiyun rpt3->avg_cond_num_0, rpt3->bad_tone_cnt_cn_excess_1,
1818*4882a593Smuzhiyun rpt3->bad_tone_cnt_min_eign_1, rpt3->tx_pkt_cnt);
1819*4882a593Smuzhiyun pr_debug("[16] Stream RXEVM[D:A]={%d, %d, %d, %d}\n",
1820*4882a593Smuzhiyun rpt3->rxevm[3], rpt3->rxevm[2],
1821*4882a593Smuzhiyun rpt3->rxevm[1], rpt3->rxevm[0]);
1822*4882a593Smuzhiyun pr_debug("[20] Eigenvalue[D:A]={%d, %d, %d, %d}\n",
1823*4882a593Smuzhiyun rpt3->eigenvalue[3], rpt3->eigenvalue[2],
1824*4882a593Smuzhiyun rpt3->eigenvalue[1], rpt3->eigenvalue[0]);
1825*4882a593Smuzhiyun pr_debug("[24] RX SNR[D:A]={%d, %d, %d, %d}\n",
1826*4882a593Smuzhiyun rpt3->rxsnr[3], rpt3->rxsnr[2],
1827*4882a593Smuzhiyun rpt3->rxsnr[1], rpt3->rxsnr[0]);
1828*4882a593Smuzhiyun } else if (phy_status_page_num == 5) { /*type 5*/
1829*4882a593Smuzhiyun pr_debug("[0] pwdb[C:A]={%d, %d, %d}, Channel_mdb=%d, Pkt_cnt=%d\n",
1830*4882a593Smuzhiyun rpt4->pwdb[2], rpt4->pwdb[1], rpt4->pwdb[0],
1831*4882a593Smuzhiyun rpt4->channel_msb, rpt4->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 rpt4->beamformed, rpt4->stbc, rpt4->ldpc, rpt4->gnt_bt,
1834*4882a593Smuzhiyun rpt4->band, rpt4->channel_lsb, rpt4->ht_rxsc,
1835*4882a593Smuzhiyun rpt4->l_rxsc, rpt4->pwdb[3]);
1836*4882a593Smuzhiyun pr_debug("[8] AntIdx[D:A]={%d, %d, %d, %d}, HW_AntSW_occur[D:A]={%d, %d, %d, %d}\n",
1837*4882a593Smuzhiyun rpt4->antidx_d, rpt4->antidx_c,
1838*4882a593Smuzhiyun rpt4->antidx_b, rpt4->antidx_a,
1839*4882a593Smuzhiyun rpt4->hw_antsw_occur_d, rpt4->hw_antsw_occur_c,
1840*4882a593Smuzhiyun rpt4->hw_antsw_occur_b, rpt4->hw_antsw_occur_a);
1841*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",
1842*4882a593Smuzhiyun rpt4->inf_pos_1_D_flg, rpt4->inf_pos_0_D_flg,
1843*4882a593Smuzhiyun rpt4->inf_pos_1_C_flg, rpt4->inf_pos_0_C_flg,
1844*4882a593Smuzhiyun rpt4->inf_pos_1_B_flg, rpt4->inf_pos_0_B_flg,
1845*4882a593Smuzhiyun rpt4->inf_pos_1_A_flg, rpt4->inf_pos_0_A_flg,
1846*4882a593Smuzhiyun rpt4->tx_pkt_cnt);
1847*4882a593Smuzhiyun pr_debug("[16] Inf_pos_B[1,0]={%d, %d}, Inf_pos_A[1,0]={%d, %d}\n",
1848*4882a593Smuzhiyun rpt4->inf_pos_1_b, rpt4->inf_pos_0_b,
1849*4882a593Smuzhiyun rpt4->inf_pos_1_a, rpt4->inf_pos_0_a);
1850*4882a593Smuzhiyun pr_debug("[20] Inf_pos_D[1,0]={%d, %d}, Inf_pos_C[1,0]={%d, %d}\n",
1851*4882a593Smuzhiyun rpt4->inf_pos_1_d, rpt4->inf_pos_0_d,
1852*4882a593Smuzhiyun rpt4->inf_pos_1_c, rpt4->inf_pos_0_c);
1853*4882a593Smuzhiyun }
1854*4882a593Smuzhiyun }
1855*4882a593Smuzhiyun
phydm_reset_phy_info_jgr3(struct dm_struct * phydm,struct phydm_phyinfo_struct * phy_info)1856*4882a593Smuzhiyun void phydm_reset_phy_info_jgr3(struct dm_struct *phydm,
1857*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
1858*4882a593Smuzhiyun {
1859*4882a593Smuzhiyun u8 i;
1860*4882a593Smuzhiyun
1861*4882a593Smuzhiyun phy_info->rx_pwdb_all = 0;
1862*4882a593Smuzhiyun phy_info->signal_quality = 0;
1863*4882a593Smuzhiyun phy_info->band_width = 0;
1864*4882a593Smuzhiyun phy_info->rx_count = 0;
1865*4882a593Smuzhiyun phy_info->rx_power = -110;
1866*4882a593Smuzhiyun phy_info->recv_signal_power = -110;
1867*4882a593Smuzhiyun phy_info->bt_rx_rssi_percentage = 0;
1868*4882a593Smuzhiyun phy_info->signal_strength = 0;
1869*4882a593Smuzhiyun phy_info->channel = 0;
1870*4882a593Smuzhiyun phy_info->is_mu_packet = 0;
1871*4882a593Smuzhiyun phy_info->is_beamformed = 0;
1872*4882a593Smuzhiyun phy_info->rxsc = 0;
1873*4882a593Smuzhiyun
1874*4882a593Smuzhiyun for (i = 0; i < 4; i++) {
1875*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = 0;
1876*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = 0;
1877*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = 0;
1878*4882a593Smuzhiyun phy_info->cfo_short[i] = 0;
1879*4882a593Smuzhiyun phy_info->cfo_tail[i] = 0;
1880*4882a593Smuzhiyun phy_info->rx_pwr[i] = -110;
1881*4882a593Smuzhiyun phy_info->rx_snr[i] = 0;
1882*4882a593Smuzhiyun }
1883*4882a593Smuzhiyun }
1884*4882a593Smuzhiyun
1885*4882a593Smuzhiyun #if 0
1886*4882a593Smuzhiyun void phydm_per_path_info_3rd(u8 rx_path, s8 pwr, s8 rx_evm, s8 cfo_tail,
1887*4882a593Smuzhiyun s8 rx_snr, struct phydm_phyinfo_struct *phy_info)
1888*4882a593Smuzhiyun {
1889*4882a593Smuzhiyun u8 evm_dbm = 0;
1890*4882a593Smuzhiyun u8 evm_percentage = 0;
1891*4882a593Smuzhiyun
1892*4882a593Smuzhiyun /* SNR is S(8,1), EVM is S(8,1), CFO is S(8,7) */
1893*4882a593Smuzhiyun
1894*4882a593Smuzhiyun evm_dbm = (rx_evm == -128) ? 0 : ((u8)(0 - rx_evm) >> 1);
1895*4882a593Smuzhiyun evm_percentage = (evm_dbm >= 34) ? 100 : evm_dbm * 3;
1896*4882a593Smuzhiyun
1897*4882a593Smuzhiyun phy_info->rx_pwr[rx_path] = pwr;
1898*4882a593Smuzhiyun
1899*4882a593Smuzhiyun /*@CFO(kHz) = CFO_tail * 312.5(kHz) / 2^7 ~= CFO tail * 5/2 (kHz)*/
1900*4882a593Smuzhiyun phy_info->cfo_tail[rx_path] = (cfo_tail * 5) >> 1;
1901*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[rx_path] = evm_dbm;
1902*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[rx_path] = phydm_pw_2_percent(pwr);
1903*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[rx_path] = evm_percentage;
1904*4882a593Smuzhiyun phy_info->rx_snr[rx_path] = rx_snr >> 1;
1905*4882a593Smuzhiyun }
1906*4882a593Smuzhiyun
1907*4882a593Smuzhiyun void phydm_common_phy_info_jgr3(s8 rx_power, u8 channel, boolean is_beamformed,
1908*4882a593Smuzhiyun boolean is_mu_packet, u8 bandwidth,
1909*4882a593Smuzhiyun u8 signal_quality, u8 rxsc,
1910*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
1911*4882a593Smuzhiyun {
1912*4882a593Smuzhiyun phy_info->rx_power = rx_power; /* RSSI in dB */
1913*4882a593Smuzhiyun phy_info->recv_signal_power = rx_power; /* RSSI in dB */
1914*4882a593Smuzhiyun phy_info->channel = channel; /* @channel number */
1915*4882a593Smuzhiyun phy_info->is_beamformed = is_beamformed; /* @apply BF */
1916*4882a593Smuzhiyun phy_info->is_mu_packet = is_mu_packet; /* @MU packet */
1917*4882a593Smuzhiyun phy_info->rxsc = rxsc;
1918*4882a593Smuzhiyun
1919*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_power); /*percentage */
1920*4882a593Smuzhiyun phy_info->signal_quality = signal_quality; /* signal quality */
1921*4882a593Smuzhiyun phy_info->band_width = bandwidth; /* @bandwidth */
1922*4882a593Smuzhiyun }
1923*4882a593Smuzhiyun #endif
1924*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)1925*4882a593Smuzhiyun void phydm_get_physts_0_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
1926*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
1927*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
1928*4882a593Smuzhiyun {
1929*4882a593Smuzhiyun /* type 0 is used for cck packet */
1930*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type0 *phy_sts = NULL;
1931*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
1932*4882a593Smuzhiyun u8 sq = 0, i, rx_cnt = 0;
1933*4882a593Smuzhiyun s8 rx_power[4], pwdb;
1934*4882a593Smuzhiyun s8 rx_pwr_db_max = -120;
1935*4882a593Smuzhiyun
1936*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr3_type0 *)phy_status_inf;
1937*4882a593Smuzhiyun
1938*4882a593Smuzhiyun #if (RTL8197G_SUPPORT)
1939*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8197G) {
1940*4882a593Smuzhiyun if (dm->rx_ant_status == BB_PATH_B) {
1941*4882a593Smuzhiyun phy_sts->pwdb_b = phy_sts->pwdb_a;
1942*4882a593Smuzhiyun phy_sts->gain_b = phy_sts->gain_a;
1943*4882a593Smuzhiyun phy_sts->pwdb_a = 0;
1944*4882a593Smuzhiyun phy_sts->gain_a = 0;
1945*4882a593Smuzhiyun }
1946*4882a593Smuzhiyun }
1947*4882a593Smuzhiyun #endif
1948*4882a593Smuzhiyun
1949*4882a593Smuzhiyun rx_power[0] = phy_sts->pwdb_a;
1950*4882a593Smuzhiyun rx_power[1] = phy_sts->pwdb_b;
1951*4882a593Smuzhiyun rx_power[2] = phy_sts->pwdb_c;
1952*4882a593Smuzhiyun rx_power[3] = phy_sts->pwdb_d;
1953*4882a593Smuzhiyun
1954*4882a593Smuzhiyun #if (RTL8822C_SUPPORT || RTL8197G_SUPPORT)
1955*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8197G)) {
1956*4882a593Smuzhiyun struct phydm_physts *physts_table = &dm->dm_physts_table;
1957*4882a593Smuzhiyun if (phy_sts->gain_a < physts_table->cck_gi_l_bnd)
1958*4882a593Smuzhiyun rx_power[0] += ((physts_table->cck_gi_l_bnd -
1959*4882a593Smuzhiyun phy_sts->gain_a) << 1);
1960*4882a593Smuzhiyun else if (phy_sts->gain_a > physts_table->cck_gi_u_bnd)
1961*4882a593Smuzhiyun rx_power[0] -= ((phy_sts->gain_a -
1962*4882a593Smuzhiyun physts_table->cck_gi_u_bnd) << 1);
1963*4882a593Smuzhiyun
1964*4882a593Smuzhiyun if (phy_sts->gain_b < physts_table->cck_gi_l_bnd)
1965*4882a593Smuzhiyun rx_power[1] += ((physts_table->cck_gi_l_bnd -
1966*4882a593Smuzhiyun phy_sts->gain_b) << 1);
1967*4882a593Smuzhiyun else if (phy_sts->gain_b > physts_table->cck_gi_u_bnd)
1968*4882a593Smuzhiyun rx_power[1] -= ((phy_sts->gain_b -
1969*4882a593Smuzhiyun physts_table->cck_gi_u_bnd) << 1);
1970*4882a593Smuzhiyun }
1971*4882a593Smuzhiyun #endif
1972*4882a593Smuzhiyun
1973*4882a593Smuzhiyun /* @Update per-path information */
1974*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
1975*4882a593Smuzhiyun if ((dm->rx_ant_status & BIT(i)) == 0)
1976*4882a593Smuzhiyun continue;
1977*4882a593Smuzhiyun
1978*4882a593Smuzhiyun rx_cnt++; /* @check the number of the ant */
1979*4882a593Smuzhiyun
1980*4882a593Smuzhiyun if (rx_cnt > dm->num_rf_path)
1981*4882a593Smuzhiyun break;
1982*4882a593Smuzhiyun
1983*4882a593Smuzhiyun if (pktinfo->is_to_self)
1984*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = rx_power[i];
1985*4882a593Smuzhiyun
1986*4882a593Smuzhiyun /* @Setting the RX power: agc_idx -110 dBm*/
1987*4882a593Smuzhiyun pwdb = rx_power[i] - 110;
1988*4882a593Smuzhiyun
1989*4882a593Smuzhiyun phy_info->rx_pwr[i] = pwdb;
1990*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = phydm_pw_2_percent(pwdb);
1991*4882a593Smuzhiyun
1992*4882a593Smuzhiyun /* search maximum pwdb */
1993*4882a593Smuzhiyun if (pwdb > rx_pwr_db_max)
1994*4882a593Smuzhiyun rx_pwr_db_max = pwdb;
1995*4882a593Smuzhiyun }
1996*4882a593Smuzhiyun
1997*4882a593Smuzhiyun /* @Calculate Signal Quality*/
1998*4882a593Smuzhiyun if (phy_sts->signal_quality >= 64) {
1999*4882a593Smuzhiyun sq = 0;
2000*4882a593Smuzhiyun } else if (phy_sts->signal_quality <= 20) {
2001*4882a593Smuzhiyun sq = 100;
2002*4882a593Smuzhiyun } else {
2003*4882a593Smuzhiyun /* @mapping to 2~99% */
2004*4882a593Smuzhiyun sq = 64 - phy_sts->signal_quality;
2005*4882a593Smuzhiyun sq = ((sq << 3) + sq) >> 2;
2006*4882a593Smuzhiyun }
2007*4882a593Smuzhiyun
2008*4882a593Smuzhiyun /* @Modify CCK PWDB if old AGC */
2009*4882a593Smuzhiyun if (!dm->cck_new_agc) {
2010*4882a593Smuzhiyun u8 lna_idx[4], vga_idx[4];
2011*4882a593Smuzhiyun
2012*4882a593Smuzhiyun lna_idx[0] = ((phy_sts->lna_h_a << 3) | phy_sts->lna_l_a);
2013*4882a593Smuzhiyun vga_idx[0] = phy_sts->vga_a;
2014*4882a593Smuzhiyun lna_idx[1] = ((phy_sts->lna_h_b << 3) | phy_sts->lna_l_b);
2015*4882a593Smuzhiyun vga_idx[1] = phy_sts->vga_b;
2016*4882a593Smuzhiyun lna_idx[2] = ((phy_sts->lna_h_c << 3) | phy_sts->lna_l_c);
2017*4882a593Smuzhiyun vga_idx[2] = phy_sts->vga_c;
2018*4882a593Smuzhiyun lna_idx[3] = ((phy_sts->lna_h_d << 3) | phy_sts->lna_l_d);
2019*4882a593Smuzhiyun vga_idx[3] = phy_sts->vga_d;
2020*4882a593Smuzhiyun }
2021*4882a593Smuzhiyun
2022*4882a593Smuzhiyun /*@CCK no STBC and LDPC*/
2023*4882a593Smuzhiyun dbg_i->is_ldpc_pkt = false;
2024*4882a593Smuzhiyun dbg_i->is_stbc_pkt = false;
2025*4882a593Smuzhiyun
2026*4882a593Smuzhiyun /*cck channel has hw bug, [WLANBB-1429]*/
2027*4882a593Smuzhiyun phy_info->channel = 0;
2028*4882a593Smuzhiyun phy_info->rx_power = rx_pwr_db_max;
2029*4882a593Smuzhiyun phy_info->recv_signal_power = rx_pwr_db_max;
2030*4882a593Smuzhiyun phy_info->is_beamformed = false;
2031*4882a593Smuzhiyun phy_info->is_mu_packet = false;
2032*4882a593Smuzhiyun phy_info->rxsc = phy_sts->l_rxsc;
2033*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_pwr_db_max);
2034*4882a593Smuzhiyun phy_info->signal_quality = sq;
2035*4882a593Smuzhiyun phy_info->band_width = CHANNEL_WIDTH_20;
2036*4882a593Smuzhiyun
2037*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
2038*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2039*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2040*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2041*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2042*4882a593Smuzhiyun #endif
2043*4882a593Smuzhiyun }
2044*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)2045*4882a593Smuzhiyun void phydm_get_physts_1_others_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2046*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2047*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2048*4882a593Smuzhiyun {
2049*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type1 *phy_sts = NULL;
2050*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
2051*4882a593Smuzhiyun s8 evm = 0;
2052*4882a593Smuzhiyun u8 i;
2053*4882a593Smuzhiyun s8 sq = 0;
2054*4882a593Smuzhiyun
2055*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr3_type1 *)phy_status_inf;
2056*4882a593Smuzhiyun
2057*4882a593Smuzhiyun /* SNR: S(8,1), EVM: S(8,1), CFO: S(8,7) */
2058*4882a593Smuzhiyun
2059*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
2060*4882a593Smuzhiyun if ((dm->rx_ant_status & BIT(i)) == 0)
2061*4882a593Smuzhiyun continue;
2062*4882a593Smuzhiyun
2063*4882a593Smuzhiyun evm = phy_sts->rxevm[i];
2064*4882a593Smuzhiyun evm = (evm == -128) ? 0 : ((0 - evm) >> 1);
2065*4882a593Smuzhiyun sq = (evm >= 34) ? 100 : evm * 3; /* @Convert EVM to 0~100%*/
2066*4882a593Smuzhiyun
2067*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = (u8)evm;
2068*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = sq;
2069*4882a593Smuzhiyun phy_info->rx_snr[i] = phy_sts->rxsnr[i] >> 1;
2070*4882a593Smuzhiyun /*@CFO(kHz) = CFO_tail*312.5(kHz)/2^7 ~= CFO tail * 5/2 (kHz)*/
2071*4882a593Smuzhiyun phy_info->cfo_tail[i] = (phy_sts->cfo_tail[i] * 5) >> 1;
2072*4882a593Smuzhiyun dbg_i->cfo_tail[i] = (phy_sts->cfo_tail[i] * 5) >> 1;
2073*4882a593Smuzhiyun }
2074*4882a593Smuzhiyun phy_info->signal_quality = phy_info->rx_mimo_signal_quality[0];
2075*4882a593Smuzhiyun
2076*4882a593Smuzhiyun if (phy_sts->gid != 0 && phy_sts->gid != 63) {
2077*4882a593Smuzhiyun phy_info->is_mu_packet = true;
2078*4882a593Smuzhiyun dbg_i->num_qry_mu_pkt++;
2079*4882a593Smuzhiyun } else {
2080*4882a593Smuzhiyun phy_info->is_mu_packet = false;
2081*4882a593Smuzhiyun }
2082*4882a593Smuzhiyun
2083*4882a593Smuzhiyun phydm_parsing_cfo(dm, pktinfo, phy_sts->cfo_tail, pktinfo->rate_ss);
2084*4882a593Smuzhiyun
2085*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2086*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2087*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2088*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2089*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2090*4882a593Smuzhiyun #endif
2091*4882a593Smuzhiyun }
2092*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)2093*4882a593Smuzhiyun void phydm_get_physts_2_others_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2094*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2095*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2096*4882a593Smuzhiyun {
2097*4882a593Smuzhiyun /* type 2 & 3 is used for ofdm packet */
2098*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type2_3 *phy_sts = NULL;
2099*4882a593Smuzhiyun }
2100*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)2101*4882a593Smuzhiyun void phydm_get_physts_4_others_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2102*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2103*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2104*4882a593Smuzhiyun {
2105*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type4 *phy_sts = NULL;
2106*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
2107*4882a593Smuzhiyun s8 evm = 0;
2108*4882a593Smuzhiyun u8 i;
2109*4882a593Smuzhiyun s8 sq = 0;
2110*4882a593Smuzhiyun
2111*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr3_type4 *)phy_status_inf;
2112*4882a593Smuzhiyun
2113*4882a593Smuzhiyun /* SNR: S(8,1), EVM: S(8,1), CFO: S(8,7) */
2114*4882a593Smuzhiyun
2115*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
2116*4882a593Smuzhiyun if ((dm->rx_ant_status & BIT(i)) == 0)
2117*4882a593Smuzhiyun continue;
2118*4882a593Smuzhiyun
2119*4882a593Smuzhiyun evm = phy_sts->rxevm[i];
2120*4882a593Smuzhiyun evm = (evm == -128) ? 0 : ((0 - evm) >> 1);
2121*4882a593Smuzhiyun sq = (evm >= 34) ? 100 : evm * 3; /* @Convert EVM to 0~100%*/
2122*4882a593Smuzhiyun
2123*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[i] = (u8)evm;
2124*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[i] = sq;
2125*4882a593Smuzhiyun phy_info->rx_snr[i] = phy_sts->rxsnr[i] >> 1;
2126*4882a593Smuzhiyun }
2127*4882a593Smuzhiyun phy_info->signal_quality = phy_info->rx_mimo_signal_quality[0];
2128*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2129*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2130*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2131*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2132*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2133*4882a593Smuzhiyun #endif
2134*4882a593Smuzhiyun odm_move_memory(dm, dbg_i->eigen_val, phy_sts->eigenvalue, 4);
2135*4882a593Smuzhiyun dbg_i->condition_num_seg0 = phy_sts->avg_cond_num_0;
2136*4882a593Smuzhiyun }
2137*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)2138*4882a593Smuzhiyun void phydm_get_physts_5_others_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2139*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2140*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2141*4882a593Smuzhiyun {
2142*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_type5 *phy_sts = NULL;
2143*4882a593Smuzhiyun
2144*4882a593Smuzhiyun }
2145*4882a593Smuzhiyun
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)2146*4882a593Smuzhiyun void phydm_get_physts_ofdm_cmn_jgr3(struct dm_struct *dm, u8 *phy_status_inf,
2147*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2148*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2149*4882a593Smuzhiyun {
2150*4882a593Smuzhiyun struct phy_sts_rpt_jgr3_ofdm_cmn *phy_sts = NULL;
2151*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
2152*4882a593Smuzhiyun s8 rx_pwr_db_max = -120;
2153*4882a593Smuzhiyun s8 pwdb = 0;
2154*4882a593Smuzhiyun u8 i, rx_cnt = 0;
2155*4882a593Smuzhiyun
2156*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr3_ofdm_cmn *)phy_status_inf;
2157*4882a593Smuzhiyun
2158*4882a593Smuzhiyun /* Parsing Offset0 & 4*/
2159*4882a593Smuzhiyun for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
2160*4882a593Smuzhiyun if ((dm->rx_ant_status & BIT(i)) == 0)
2161*4882a593Smuzhiyun continue;
2162*4882a593Smuzhiyun
2163*4882a593Smuzhiyun rx_cnt++; /* @check the number of the ant */
2164*4882a593Smuzhiyun
2165*4882a593Smuzhiyun pwdb = (s8)phy_sts->pwdb[i] - 110; /*@dB*/
2166*4882a593Smuzhiyun
2167*4882a593Smuzhiyun if (pktinfo->is_to_self)
2168*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = phy_sts->pwdb[i];
2169*4882a593Smuzhiyun
2170*4882a593Smuzhiyun /* search maximum pwdb */
2171*4882a593Smuzhiyun if (pwdb > rx_pwr_db_max)
2172*4882a593Smuzhiyun rx_pwr_db_max = pwdb;
2173*4882a593Smuzhiyun
2174*4882a593Smuzhiyun phy_info->rx_pwr[i] = pwdb;
2175*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[i] = phydm_pw_2_percent(pwdb);
2176*4882a593Smuzhiyun }
2177*4882a593Smuzhiyun
2178*4882a593Smuzhiyun phy_info->rx_count = (rx_cnt > 0) ? rx_cnt - 1 : 0; /*from 1~4 to 0~3 */
2179*4882a593Smuzhiyun phy_info->rx_power = rx_pwr_db_max;
2180*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_pwr_db_max);
2181*4882a593Smuzhiyun phy_info->recv_signal_power = rx_pwr_db_max;
2182*4882a593Smuzhiyun phy_info->channel = phy_sts->channel_lsb;
2183*4882a593Smuzhiyun phy_info->is_beamformed = (boolean)phy_sts->beamformed;
2184*4882a593Smuzhiyun phy_info->rxsc = (PHYDM_IS_LEGACY_RATE(pktinfo->data_rate)) ?
2185*4882a593Smuzhiyun phy_sts->l_rxsc : phy_sts->ht_rxsc;
2186*4882a593Smuzhiyun phy_info->band_width = phydm_rxsc_2_bw(dm, phy_info->rxsc);
2187*4882a593Smuzhiyun
2188*4882a593Smuzhiyun dbg_i->is_ldpc_pkt = phy_sts->ldpc;
2189*4882a593Smuzhiyun dbg_i->is_stbc_pkt = phy_sts->stbc;
2190*4882a593Smuzhiyun dbg_i->num_qry_bf_pkt += phy_sts->beamformed;
2191*4882a593Smuzhiyun }
2192*4882a593Smuzhiyun
phydm_process_dm_rssi_jgr3(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)2193*4882a593Smuzhiyun void phydm_process_dm_rssi_jgr3(struct dm_struct *dm,
2194*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
2195*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
2196*4882a593Smuzhiyun {
2197*4882a593Smuzhiyun struct cmn_sta_info *sta = NULL;
2198*4882a593Smuzhiyun struct rssi_info *rssi_t = NULL;
2199*4882a593Smuzhiyun u8 rssi_tmp = 0;
2200*4882a593Smuzhiyun u64 rssi_linear = 0;
2201*4882a593Smuzhiyun s16 rssi_db = 0;
2202*4882a593Smuzhiyun u8 i = 0;
2203*4882a593Smuzhiyun u8 rx_count = 0;
2204*4882a593Smuzhiyun
2205*4882a593Smuzhiyun #if (defined(PHYDM_CCK_RX_PATHDIV_SUPPORT))
2206*4882a593Smuzhiyun struct phydm_cck_rx_pathdiv *cckrx_t = &dm->dm_cck_rx_pathdiv_table;
2207*4882a593Smuzhiyun #endif
2208*4882a593Smuzhiyun
2209*4882a593Smuzhiyun /*@[Step4]*/
2210*4882a593Smuzhiyun if (pktinfo->station_id >= ODM_ASSOCIATE_ENTRY_NUM)
2211*4882a593Smuzhiyun return;
2212*4882a593Smuzhiyun
2213*4882a593Smuzhiyun sta = dm->phydm_sta_info[pktinfo->station_id];
2214*4882a593Smuzhiyun
2215*4882a593Smuzhiyun if (!is_sta_active(sta))
2216*4882a593Smuzhiyun return;
2217*4882a593Smuzhiyun
2218*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid) /*@data frame only*/
2219*4882a593Smuzhiyun return;
2220*4882a593Smuzhiyun
2221*4882a593Smuzhiyun if (!(pktinfo->is_packet_to_self) && !(pktinfo->is_packet_beacon))
2222*4882a593Smuzhiyun return;
2223*4882a593Smuzhiyun
2224*4882a593Smuzhiyun if (pktinfo->is_packet_beacon) {
2225*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_beacon_pkt++;
2226*4882a593Smuzhiyun dm->phy_dbg_info.beacon_phy_rate = pktinfo->data_rate;
2227*4882a593Smuzhiyun }
2228*4882a593Smuzhiyun
2229*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2230*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_ANT_DIV)
2231*4882a593Smuzhiyun odm_process_rssi_for_ant_div(dm, phy_info, pktinfo);
2232*4882a593Smuzhiyun #endif
2233*4882a593Smuzhiyun
2234*4882a593Smuzhiyun #ifdef ODM_EVM_ENHANCE_ANTDIV
2235*4882a593Smuzhiyun phydm_rx_rate_for_antdiv(dm, pktinfo);
2236*4882a593Smuzhiyun #endif
2237*4882a593Smuzhiyun
2238*4882a593Smuzhiyun #if (defined(CONFIG_PATH_DIVERSITY))
2239*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_PATH_DIV)
2240*4882a593Smuzhiyun phydm_process_rssi_for_path_div(dm, phy_info, pktinfo);
2241*4882a593Smuzhiyun #endif
2242*4882a593Smuzhiyun
2243*4882a593Smuzhiyun #if (defined(PHYDM_CCK_RX_PATHDIV_SUPPORT))
2244*4882a593Smuzhiyun if (cckrx_t->en_cck_rx_pathdiv)
2245*4882a593Smuzhiyun phydm_process_rssi_for_cck_rx_pathdiv(dm, phy_info, pktinfo);
2246*4882a593Smuzhiyun #endif
2247*4882a593Smuzhiyun
2248*4882a593Smuzhiyun rssi_t = &sta->rssi_stat;
2249*4882a593Smuzhiyun
2250*4882a593Smuzhiyun for (i = 0; i < dm->num_rf_path; i++) {
2251*4882a593Smuzhiyun rssi_tmp = phy_info->rx_mimo_signal_strength[i];
2252*4882a593Smuzhiyun if (rssi_tmp != 0) {
2253*4882a593Smuzhiyun rx_count++;
2254*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_tmp);
2255*4882a593Smuzhiyun }
2256*4882a593Smuzhiyun }
2257*4882a593Smuzhiyun /* @Rounding and removing fractional bits */
2258*4882a593Smuzhiyun rssi_linear = (rssi_linear + (1 << (FRAC_BITS - 1))) >> FRAC_BITS;
2259*4882a593Smuzhiyun
2260*4882a593Smuzhiyun switch (rx_count) {
2261*4882a593Smuzhiyun case 2:
2262*4882a593Smuzhiyun rssi_linear = DIVIDED_2(rssi_linear);
2263*4882a593Smuzhiyun break;
2264*4882a593Smuzhiyun case 3:
2265*4882a593Smuzhiyun rssi_linear = DIVIDED_3(rssi_linear);
2266*4882a593Smuzhiyun break;
2267*4882a593Smuzhiyun case 4:
2268*4882a593Smuzhiyun rssi_linear = DIVIDED_4(rssi_linear);
2269*4882a593Smuzhiyun break;
2270*4882a593Smuzhiyun }
2271*4882a593Smuzhiyun
2272*4882a593Smuzhiyun rssi_db = (s16)odm_convert_to_db(rssi_linear);
2273*4882a593Smuzhiyun
2274*4882a593Smuzhiyun if (rssi_t->rssi_acc == 0) {
2275*4882a593Smuzhiyun rssi_t->rssi_acc = (s16)(rssi_db << RSSI_MA);
2276*4882a593Smuzhiyun rssi_t->rssi = (s8)(rssi_db);
2277*4882a593Smuzhiyun } else {
2278*4882a593Smuzhiyun rssi_t->rssi_acc = MA_ACC(rssi_t->rssi_acc, rssi_db, RSSI_MA);
2279*4882a593Smuzhiyun rssi_t->rssi = (s8)GET_MA_VAL(rssi_t->rssi_acc, RSSI_MA);
2280*4882a593Smuzhiyun }
2281*4882a593Smuzhiyun
2282*4882a593Smuzhiyun if (pktinfo->is_cck_rate)
2283*4882a593Smuzhiyun rssi_t->rssi_cck = (s8)rssi_db;
2284*4882a593Smuzhiyun else
2285*4882a593Smuzhiyun rssi_t->rssi_ofdm = (s8)rssi_db;
2286*4882a593Smuzhiyun }
2287*4882a593Smuzhiyun
phydm_rx_physts_jgr3(void * dm_void,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2288*4882a593Smuzhiyun void phydm_rx_physts_jgr3(void *dm_void, u8 *phy_sts,
2289*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2290*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2291*4882a593Smuzhiyun {
2292*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
2293*4882a593Smuzhiyun u8 phy_status_type = (*phy_sts & 0xf);
2294*4882a593Smuzhiyun
2295*4882a593Smuzhiyun /*@[Step 2]*/
2296*4882a593Smuzhiyun /*phydm_reset_phy_info_jgr3(dm, phy_info);*/ /* @Memory reset */
2297*4882a593Smuzhiyun
2298*4882a593Smuzhiyun /* Phy status parsing */
2299*4882a593Smuzhiyun switch (phy_status_type) {
2300*4882a593Smuzhiyun case 0: /*@CCK*/
2301*4882a593Smuzhiyun phydm_get_physts_0_jgr3(dm, phy_sts, pktinfo, phy_info);
2302*4882a593Smuzhiyun break;
2303*4882a593Smuzhiyun case 1:
2304*4882a593Smuzhiyun phydm_get_physts_ofdm_cmn_jgr3(dm, phy_sts, pktinfo, phy_info);
2305*4882a593Smuzhiyun phydm_get_physts_1_others_jgr3(dm, phy_sts, pktinfo, phy_info);
2306*4882a593Smuzhiyun break;
2307*4882a593Smuzhiyun case 2:
2308*4882a593Smuzhiyun case 3:
2309*4882a593Smuzhiyun phydm_get_physts_ofdm_cmn_jgr3(dm, phy_sts, pktinfo, phy_info);
2310*4882a593Smuzhiyun phydm_get_physts_2_others_jgr3(dm, phy_sts, pktinfo, phy_info);
2311*4882a593Smuzhiyun break;
2312*4882a593Smuzhiyun case 4:
2313*4882a593Smuzhiyun phydm_get_physts_ofdm_cmn_jgr3(dm, phy_sts, pktinfo, phy_info);
2314*4882a593Smuzhiyun phydm_get_physts_4_others_jgr3(dm, phy_sts, pktinfo, phy_info);
2315*4882a593Smuzhiyun case 5:
2316*4882a593Smuzhiyun phydm_get_physts_ofdm_cmn_jgr3(dm, phy_sts, pktinfo, phy_info);
2317*4882a593Smuzhiyun phydm_get_physts_5_others_jgr3(dm, phy_sts, pktinfo, phy_info);
2318*4882a593Smuzhiyun break;
2319*4882a593Smuzhiyun default:
2320*4882a593Smuzhiyun break;
2321*4882a593Smuzhiyun }
2322*4882a593Smuzhiyun
2323*4882a593Smuzhiyun #if 0
2324*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "RSSI: {%d, %d}\n",
2325*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[0],
2326*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[1]);
2327*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "rxdb: {%d, %d}\n",
2328*4882a593Smuzhiyun phy_info->rx_pwr[0], phy_info->rx_pwr[1]);
2329*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "EVM: {%d, %d}\n",
2330*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[0], phy_info->rx_mimo_evm_dbm[1]);
2331*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "SQ: {%d, %d}\n",
2332*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[0],
2333*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[1]);
2334*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "SNR: {%d, %d}\n",
2335*4882a593Smuzhiyun phy_info->rx_snr[0], phy_info->rx_snr[1]);
2336*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "CFO: {%d, %d}\n",
2337*4882a593Smuzhiyun phy_info->cfo_tail[0], phy_info->cfo_tail[1]);
2338*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
2339*4882a593Smuzhiyun "rx_pwdb_all = %d, rx_power = %d, recv_signal_power = %d\n",
2340*4882a593Smuzhiyun phy_info->rx_pwdb_all, phy_info->rx_power,
2341*4882a593Smuzhiyun phy_info->recv_signal_power);
2342*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "signal_quality = %d\n",
2343*4882a593Smuzhiyun phy_info->signal_quality);
2344*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
2345*4882a593Smuzhiyun "is_beamformed = %d, is_mu_packet = %d, rx_count = %d\n",
2346*4882a593Smuzhiyun phy_info->is_beamformed, phy_info->is_mu_packet,
2347*4882a593Smuzhiyun phy_info->rx_count);
2348*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS,
2349*4882a593Smuzhiyun "channel = %d, rxsc = %d, band_width = %d\n",
2350*4882a593Smuzhiyun phy_info->channel, phy_info->rxsc, phy_info->band_width);
2351*4882a593Smuzhiyun #endif
2352*4882a593Smuzhiyun
2353*4882a593Smuzhiyun /*@[Step 1]*/
2354*4882a593Smuzhiyun phydm_print_phystat_jgr3(dm, phy_sts, pktinfo, phy_info);
2355*4882a593Smuzhiyun }
2356*4882a593Smuzhiyun
2357*4882a593Smuzhiyun #endif
2358*4882a593Smuzhiyun
2359*4882a593Smuzhiyun #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
2360*4882a593Smuzhiyun /* @For 8822B only!! need to move to FW finally */
2361*4882a593Smuzhiyun /*@==============================================*/
2362*4882a593Smuzhiyun
2363*4882a593Smuzhiyun boolean
phydm_query_is_mu_api(struct dm_struct * phydm,u8 ppdu_idx,u8 * p_data_rate,u8 * p_gid)2364*4882a593Smuzhiyun phydm_query_is_mu_api(struct dm_struct *phydm, u8 ppdu_idx, u8 *p_data_rate,
2365*4882a593Smuzhiyun u8 *p_gid)
2366*4882a593Smuzhiyun {
2367*4882a593Smuzhiyun u8 data_rate = 0, gid = 0;
2368*4882a593Smuzhiyun boolean is_mu = false;
2369*4882a593Smuzhiyun
2370*4882a593Smuzhiyun data_rate = phydm->phy_dbg_info.num_of_ppdu[ppdu_idx];
2371*4882a593Smuzhiyun gid = phydm->phy_dbg_info.gid_num[ppdu_idx];
2372*4882a593Smuzhiyun
2373*4882a593Smuzhiyun if (data_rate & BIT(7)) {
2374*4882a593Smuzhiyun is_mu = true;
2375*4882a593Smuzhiyun data_rate = data_rate & ~(BIT(7));
2376*4882a593Smuzhiyun } else {
2377*4882a593Smuzhiyun is_mu = false;
2378*4882a593Smuzhiyun }
2379*4882a593Smuzhiyun
2380*4882a593Smuzhiyun *p_data_rate = data_rate;
2381*4882a593Smuzhiyun *p_gid = gid;
2382*4882a593Smuzhiyun
2383*4882a593Smuzhiyun return is_mu;
2384*4882a593Smuzhiyun }
2385*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)2386*4882a593Smuzhiyun void phydm_print_phy_sts_jgr2(struct dm_struct *dm, u8 *phy_status_inf,
2387*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2388*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2389*4882a593Smuzhiyun {
2390*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type0 *rpt0 = NULL;
2391*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type1 *rpt = NULL;
2392*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type2 *rpt2 = NULL;
2393*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
2394*4882a593Smuzhiyun u8 phy_status_page_num = (*phy_status_inf & 0xf);
2395*4882a593Smuzhiyun u32 phy_status[PHY_STATUS_JRGUAR2_DW_LEN] = {0};
2396*4882a593Smuzhiyun u8 i;
2397*4882a593Smuzhiyun u32 size = PHY_STATUS_JRGUAR2_DW_LEN << 2;
2398*4882a593Smuzhiyun
2399*4882a593Smuzhiyun rpt0 = (struct phy_sts_rpt_jgr2_type0 *)phy_status_inf;
2400*4882a593Smuzhiyun rpt = (struct phy_sts_rpt_jgr2_type1 *)phy_status_inf;
2401*4882a593Smuzhiyun rpt2 = (struct phy_sts_rpt_jgr2_type2 *)phy_status_inf;
2402*4882a593Smuzhiyun
2403*4882a593Smuzhiyun odm_move_memory(dm, phy_status, phy_status_inf, size);
2404*4882a593Smuzhiyun
2405*4882a593Smuzhiyun if (!(dm->debug_components & DBG_PHY_STATUS))
2406*4882a593Smuzhiyun return;
2407*4882a593Smuzhiyun
2408*4882a593Smuzhiyun if (dbg->show_phy_sts_all_pkt == 0) {
2409*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
2410*4882a593Smuzhiyun return;
2411*4882a593Smuzhiyun }
2412*4882a593Smuzhiyun
2413*4882a593Smuzhiyun dbg->show_phy_sts_cnt++;
2414*4882a593Smuzhiyun #if 0
2415*4882a593Smuzhiyun dbg_print("cnt=%d, max=%d\n",
2416*4882a593Smuzhiyun dbg->show_phy_sts_cnt, dbg->show_phy_sts_max_cnt);
2417*4882a593Smuzhiyun #endif
2418*4882a593Smuzhiyun
2419*4882a593Smuzhiyun if (dbg->show_phy_sts_max_cnt != SHOW_PHY_STATUS_UNLIMITED) {
2420*4882a593Smuzhiyun if (dbg->show_phy_sts_cnt > dbg->show_phy_sts_max_cnt)
2421*4882a593Smuzhiyun return;
2422*4882a593Smuzhiyun }
2423*4882a593Smuzhiyun
2424*4882a593Smuzhiyun pr_debug("Phy Status Rpt: OFDM_%d\n", phy_status_page_num);
2425*4882a593Smuzhiyun pr_debug("StaID=%d, RxRate = 0x%x match_bssid=%d\n",
2426*4882a593Smuzhiyun pktinfo->station_id, pktinfo->data_rate,
2427*4882a593Smuzhiyun pktinfo->is_packet_match_bssid);
2428*4882a593Smuzhiyun
2429*4882a593Smuzhiyun for (i = 0; i < PHY_STATUS_JRGUAR2_DW_LEN; i++)
2430*4882a593Smuzhiyun pr_debug("Offset[%d:%d] = 0x%x\n",
2431*4882a593Smuzhiyun ((4 * i) + 3), (4 * i), phy_status[i]);
2432*4882a593Smuzhiyun
2433*4882a593Smuzhiyun if (phy_status_page_num == 0) {
2434*4882a593Smuzhiyun pr_debug("[0] TRSW=%d, MP_gain_idx=%d, pwdb=%d\n",
2435*4882a593Smuzhiyun rpt0->trsw, rpt0->gain, rpt0->pwdb);
2436*4882a593Smuzhiyun pr_debug("[4] band=%d, CH=%d, agc_table = %d, rxsc = %d\n",
2437*4882a593Smuzhiyun rpt0->band, rpt0->channel,
2438*4882a593Smuzhiyun rpt0->agc_table, rpt0->rxsc);
2439*4882a593Smuzhiyun pr_debug("[8] AntIdx[D:A]={%d, %d, %d, %d}, LSIG_len=%d\n",
2440*4882a593Smuzhiyun rpt0->antidx_d, rpt0->antidx_c, rpt0->antidx_b,
2441*4882a593Smuzhiyun rpt0->antidx_a, rpt0->length);
2442*4882a593Smuzhiyun pr_debug("[12] lna_h=%d, bb_pwr=%d, lna_l=%d, vga=%d, sq=%d\n",
2443*4882a593Smuzhiyun rpt0->lna_h, rpt0->bb_power, rpt0->lna_l,
2444*4882a593Smuzhiyun rpt0->vga, rpt0->signal_quality);
2445*4882a593Smuzhiyun
2446*4882a593Smuzhiyun } else if (phy_status_page_num == 1) {
2447*4882a593Smuzhiyun pr_debug("[0] pwdb[D:A]={%d, %d, %d, %d}\n",
2448*4882a593Smuzhiyun rpt->pwdb[3], rpt->pwdb[2],
2449*4882a593Smuzhiyun rpt->pwdb[1], rpt->pwdb[0]);
2450*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",
2451*4882a593Smuzhiyun rpt->beamformed, rpt->ldpc, rpt->stbc, rpt->gnt_bt,
2452*4882a593Smuzhiyun rpt->hw_antsw_occu, rpt->band, rpt->channel,
2453*4882a593Smuzhiyun rpt->ht_rxsc, rpt->l_rxsc);
2454*4882a593Smuzhiyun pr_debug("[8] AntIdx[D:A]={%d, %d, %d, %d}, LSIG_len=%d\n",
2455*4882a593Smuzhiyun rpt->antidx_d, rpt->antidx_c, rpt->antidx_b,
2456*4882a593Smuzhiyun rpt->antidx_a, rpt->lsig_length);
2457*4882a593Smuzhiyun pr_debug("[12] rf_mode=%d, NBI=%d, Intf_pos=%d, GID=%d, PAID=%d\n",
2458*4882a593Smuzhiyun rpt->rf_mode, rpt->nb_intf_flag,
2459*4882a593Smuzhiyun (rpt->intf_pos + (rpt->intf_pos_msb << 8)), rpt->gid,
2460*4882a593Smuzhiyun (rpt->paid + (rpt->paid_msb << 8)));
2461*4882a593Smuzhiyun pr_debug("[16] EVM[D:A]={%d, %d, %d, %d}\n",
2462*4882a593Smuzhiyun rpt->rxevm[3], rpt->rxevm[2],
2463*4882a593Smuzhiyun rpt->rxevm[1], rpt->rxevm[0]);
2464*4882a593Smuzhiyun pr_debug("[20] CFO[D:A]={%d, %d, %d, %d}\n",
2465*4882a593Smuzhiyun rpt->cfo_tail[3], rpt->cfo_tail[2], rpt->cfo_tail[1],
2466*4882a593Smuzhiyun rpt->cfo_tail[0]);
2467*4882a593Smuzhiyun pr_debug("[24] SNR[D:A]={%d, %d, %d, %d}\n\n",
2468*4882a593Smuzhiyun rpt->rxsnr[3], rpt->rxsnr[2], rpt->rxsnr[1],
2469*4882a593Smuzhiyun rpt->rxsnr[0]);
2470*4882a593Smuzhiyun
2471*4882a593Smuzhiyun } else if (phy_status_page_num == 2) {
2472*4882a593Smuzhiyun pr_debug("[0] pwdb[D:A]={%d, %d, %d, %d}\n",
2473*4882a593Smuzhiyun rpt2->pwdb[3], rpt2->pwdb[2], rpt2->pwdb[1],
2474*4882a593Smuzhiyun rpt2->pwdb[0]);
2475*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",
2476*4882a593Smuzhiyun rpt2->beamformed, rpt2->ldpc, rpt2->stbc, rpt2->gnt_bt,
2477*4882a593Smuzhiyun rpt2->hw_antsw_occu, rpt2->band, rpt2->channel,
2478*4882a593Smuzhiyun rpt2->ht_rxsc, rpt2->l_rxsc);
2479*4882a593Smuzhiyun pr_debug("[8] AgcTab[D:A]={%d, %d, %d, %d}, cnt_pw2cca=%d, shift_l_map=%d\n",
2480*4882a593Smuzhiyun rpt2->agc_table_d, rpt2->agc_table_c,
2481*4882a593Smuzhiyun rpt2->agc_table_b, rpt2->agc_table_a,
2482*4882a593Smuzhiyun rpt2->cnt_pw2cca, rpt2->shift_l_map);
2483*4882a593Smuzhiyun pr_debug("[12] (TRSW|Gain)[D:A]={%d %d, %d %d, %d %d, %d %d}, cnt_cca2agc_rdy=%d\n",
2484*4882a593Smuzhiyun rpt2->trsw_d, rpt2->gain_d, rpt2->trsw_c, rpt2->gain_c,
2485*4882a593Smuzhiyun rpt2->trsw_b, rpt2->gain_b, rpt2->trsw_a,
2486*4882a593Smuzhiyun rpt2->gain_a, rpt2->cnt_cca2agc_rdy);
2487*4882a593Smuzhiyun pr_debug("[16] AAGC step[D:A]={%d, %d, %d, %d} HT AAGC gain[D:A]={%d, %d, %d, %d}\n",
2488*4882a593Smuzhiyun rpt2->aagc_step_d, rpt2->aagc_step_c,
2489*4882a593Smuzhiyun rpt2->aagc_step_b, rpt2->aagc_step_a,
2490*4882a593Smuzhiyun rpt2->ht_aagc_gain[3], rpt2->ht_aagc_gain[2],
2491*4882a593Smuzhiyun rpt2->ht_aagc_gain[1], rpt2->ht_aagc_gain[0]);
2492*4882a593Smuzhiyun pr_debug("[20] DAGC gain[D:A]={%d, %d, %d, %d}\n",
2493*4882a593Smuzhiyun rpt2->dagc_gain[3],
2494*4882a593Smuzhiyun rpt2->dagc_gain[2], rpt2->dagc_gain[1],
2495*4882a593Smuzhiyun rpt2->dagc_gain[0]);
2496*4882a593Smuzhiyun pr_debug("[24] syn_cnt: %d, Cnt=%d\n\n",
2497*4882a593Smuzhiyun rpt2->syn_count, rpt2->counter);
2498*4882a593Smuzhiyun }
2499*4882a593Smuzhiyun }
2500*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)2501*4882a593Smuzhiyun void phydm_set_per_path_phy_info(u8 rx_path, s8 pwr, s8 rx_evm, s8 cfo_tail,
2502*4882a593Smuzhiyun s8 rx_snr, u8 ant_idx,
2503*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2504*4882a593Smuzhiyun {
2505*4882a593Smuzhiyun u8 evm_dbm = 0;
2506*4882a593Smuzhiyun u8 evm_percentage = 0;
2507*4882a593Smuzhiyun
2508*4882a593Smuzhiyun /* SNR is S(8,1), EVM is S(8,1), CFO is S(8,7) */
2509*4882a593Smuzhiyun
2510*4882a593Smuzhiyun if (rx_evm < 0) {
2511*4882a593Smuzhiyun /* @Calculate EVM in dBm */
2512*4882a593Smuzhiyun evm_dbm = ((u8)(0 - rx_evm) >> 1);
2513*4882a593Smuzhiyun
2514*4882a593Smuzhiyun if (evm_dbm == 64)
2515*4882a593Smuzhiyun evm_dbm = 0; /*@if 1SS rate, evm_dbm [2nd stream] =64*/
2516*4882a593Smuzhiyun
2517*4882a593Smuzhiyun if (evm_dbm != 0) {
2518*4882a593Smuzhiyun /* @Convert EVM to 0%~100% percentage */
2519*4882a593Smuzhiyun if (evm_dbm >= 34)
2520*4882a593Smuzhiyun evm_percentage = 100;
2521*4882a593Smuzhiyun else
2522*4882a593Smuzhiyun evm_percentage = (evm_dbm << 1) + (evm_dbm);
2523*4882a593Smuzhiyun }
2524*4882a593Smuzhiyun }
2525*4882a593Smuzhiyun
2526*4882a593Smuzhiyun phy_info->rx_pwr[rx_path] = pwr;
2527*4882a593Smuzhiyun
2528*4882a593Smuzhiyun /*@CFO(kHz) = CFO_tail * 312.5(kHz) / 2^7 ~= CFO tail * 5/2 (kHz)*/
2529*4882a593Smuzhiyun phy_info->cfo_tail[rx_path] = (cfo_tail * 5) >> 1;
2530*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[rx_path] = evm_dbm;
2531*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[rx_path] = phydm_pw_2_percent(pwr);
2532*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[rx_path] = evm_percentage;
2533*4882a593Smuzhiyun phy_info->rx_snr[rx_path] = rx_snr >> 1;
2534*4882a593Smuzhiyun phy_info->ant_idx[rx_path] = ant_idx;
2535*4882a593Smuzhiyun
2536*4882a593Smuzhiyun #if 0
2537*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
2538*4882a593Smuzhiyun return;
2539*4882a593Smuzhiyun
2540*4882a593Smuzhiyun dbg_print("path (%d)--------\n", rx_path);
2541*4882a593Smuzhiyun dbg_print("rx_pwr = %d, Signal strength = %d\n",
2542*4882a593Smuzhiyun phy_info->rx_pwr[rx_path],
2543*4882a593Smuzhiyun phy_info->rx_mimo_signal_strength[rx_path]);
2544*4882a593Smuzhiyun dbg_print("evm_dbm = %d, Signal quality = %d\n",
2545*4882a593Smuzhiyun phy_info->rx_mimo_evm_dbm[rx_path],
2546*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[rx_path]);
2547*4882a593Smuzhiyun dbg_print("CFO = %d, SNR = %d\n",
2548*4882a593Smuzhiyun phy_info->cfo_tail[rx_path], phy_info->rx_snr[rx_path]);
2549*4882a593Smuzhiyun
2550*4882a593Smuzhiyun #endif
2551*4882a593Smuzhiyun }
2552*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)2553*4882a593Smuzhiyun void phydm_set_common_phy_info(s8 rx_power, u8 channel, boolean is_beamformed,
2554*4882a593Smuzhiyun boolean is_mu_packet, u8 bandwidth,
2555*4882a593Smuzhiyun u8 signal_quality, u8 rxsc,
2556*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2557*4882a593Smuzhiyun {
2558*4882a593Smuzhiyun phy_info->rx_power = rx_power; /* RSSI in dB */
2559*4882a593Smuzhiyun phy_info->recv_signal_power = rx_power; /* RSSI in dB */
2560*4882a593Smuzhiyun phy_info->channel = channel; /* @channel number */
2561*4882a593Smuzhiyun phy_info->is_beamformed = is_beamformed; /* @apply BF */
2562*4882a593Smuzhiyun phy_info->is_mu_packet = is_mu_packet; /* @MU packet */
2563*4882a593Smuzhiyun phy_info->rxsc = rxsc;
2564*4882a593Smuzhiyun
2565*4882a593Smuzhiyun /* RSSI in percentage */
2566*4882a593Smuzhiyun phy_info->rx_pwdb_all = phydm_pw_2_percent(rx_power);
2567*4882a593Smuzhiyun phy_info->signal_quality = signal_quality; /* signal quality */
2568*4882a593Smuzhiyun phy_info->band_width = bandwidth; /* @bandwidth */
2569*4882a593Smuzhiyun
2570*4882a593Smuzhiyun #if 0
2571*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid)
2572*4882a593Smuzhiyun return;
2573*4882a593Smuzhiyun
2574*4882a593Smuzhiyun dbg_print("rx_pwdb_all = %d, rx_power = %d, recv_signal_power = %d\n",
2575*4882a593Smuzhiyun phy_info->rx_pwdb_all, phy_info->rx_power,
2576*4882a593Smuzhiyun phy_info->recv_signal_power);
2577*4882a593Smuzhiyun dbg_print("signal_quality = %d\n", phy_info->signal_quality);
2578*4882a593Smuzhiyun dbg_print("is_beamformed = %d, is_mu_packet = %d, rx_count = %d\n",
2579*4882a593Smuzhiyun phy_info->is_beamformed, phy_info->is_mu_packet,
2580*4882a593Smuzhiyun phy_info->rx_count + 1);
2581*4882a593Smuzhiyun dbg_print("channel = %d, rxsc = %d, band_width = %d\n", channel,
2582*4882a593Smuzhiyun rxsc, bandwidth);
2583*4882a593Smuzhiyun
2584*4882a593Smuzhiyun #endif
2585*4882a593Smuzhiyun }
2586*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)2587*4882a593Smuzhiyun void phydm_get_phy_sts_type0(struct dm_struct *dm, u8 *phy_status_inf,
2588*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2589*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2590*4882a593Smuzhiyun {
2591*4882a593Smuzhiyun /* type 0 is used for cck packet */
2592*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type0 *phy_sts = NULL;
2593*4882a593Smuzhiyun u8 sq = 0;
2594*4882a593Smuzhiyun s8 rx_pow = 0;
2595*4882a593Smuzhiyun u8 lna_idx = 0, vga_idx = 0;
2596*4882a593Smuzhiyun u8 ant_idx;
2597*4882a593Smuzhiyun
2598*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr2_type0 *)phy_status_inf;
2599*4882a593Smuzhiyun rx_pow = phy_sts->pwdb - 110;
2600*4882a593Smuzhiyun
2601*4882a593Smuzhiyun /* Fill in per-path antenna index */
2602*4882a593Smuzhiyun ant_idx = phy_sts->antidx_a;
2603*4882a593Smuzhiyun
2604*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8723D) {
2605*4882a593Smuzhiyun #if (RTL8723D_SUPPORT)
2606*4882a593Smuzhiyun rx_pow = phy_sts->pwdb - 97;
2607*4882a593Smuzhiyun #endif
2608*4882a593Smuzhiyun }
2609*4882a593Smuzhiyun #if (RTL8821C_SUPPORT)
2610*4882a593Smuzhiyun else if (dm->support_ic_type & ODM_RTL8821C) {
2611*4882a593Smuzhiyun if (phy_sts->pwdb >= -57)
2612*4882a593Smuzhiyun rx_pow = phy_sts->pwdb - 100;
2613*4882a593Smuzhiyun else
2614*4882a593Smuzhiyun rx_pow = phy_sts->pwdb - 102;
2615*4882a593Smuzhiyun }
2616*4882a593Smuzhiyun #endif
2617*4882a593Smuzhiyun
2618*4882a593Smuzhiyun if (pktinfo->is_to_self) {
2619*4882a593Smuzhiyun dm->ofdm_agc_idx[0] = phy_sts->pwdb;
2620*4882a593Smuzhiyun dm->ofdm_agc_idx[1] = 0;
2621*4882a593Smuzhiyun dm->ofdm_agc_idx[2] = 0;
2622*4882a593Smuzhiyun dm->ofdm_agc_idx[3] = 0;
2623*4882a593Smuzhiyun }
2624*4882a593Smuzhiyun
2625*4882a593Smuzhiyun /* @Calculate Signal Quality*/
2626*4882a593Smuzhiyun if (phy_sts->signal_quality >= 64) {
2627*4882a593Smuzhiyun sq = 0;
2628*4882a593Smuzhiyun } else if (phy_sts->signal_quality <= 20) {
2629*4882a593Smuzhiyun sq = 100;
2630*4882a593Smuzhiyun } else {
2631*4882a593Smuzhiyun /* @mapping to 2~99% */
2632*4882a593Smuzhiyun sq = 64 - phy_sts->signal_quality;
2633*4882a593Smuzhiyun sq = ((sq << 3) + sq) >> 2;
2634*4882a593Smuzhiyun }
2635*4882a593Smuzhiyun
2636*4882a593Smuzhiyun /* @Get RSSI for old CCK AGC */
2637*4882a593Smuzhiyun if (!dm->cck_new_agc) {
2638*4882a593Smuzhiyun vga_idx = phy_sts->vga;
2639*4882a593Smuzhiyun
2640*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8197F) {
2641*4882a593Smuzhiyun /*@3bit LNA*/
2642*4882a593Smuzhiyun lna_idx = phy_sts->lna_l;
2643*4882a593Smuzhiyun } else {
2644*4882a593Smuzhiyun /*@4bit LNA*/
2645*4882a593Smuzhiyun lna_idx = (phy_sts->lna_h << 3) | phy_sts->lna_l;
2646*4882a593Smuzhiyun }
2647*4882a593Smuzhiyun rx_pow = phydm_get_cck_rssi(dm, lna_idx, vga_idx);
2648*4882a593Smuzhiyun }
2649*4882a593Smuzhiyun
2650*4882a593Smuzhiyun /* @Confirm CCK RSSI */
2651*4882a593Smuzhiyun #if (RTL8197F_SUPPORT)
2652*4882a593Smuzhiyun if (dm->support_ic_type & ODM_RTL8197F) {
2653*4882a593Smuzhiyun u8 bb_pwr_th_l = 5; /* round( 31*0.15 ) */
2654*4882a593Smuzhiyun u8 bb_pwr_th_h = 27; /* round( 31*0.85 ) */
2655*4882a593Smuzhiyun
2656*4882a593Smuzhiyun if (phy_sts->bb_power < bb_pwr_th_l ||
2657*4882a593Smuzhiyun phy_sts->bb_power > bb_pwr_th_h)
2658*4882a593Smuzhiyun rx_pow = 0; /* @Error RSSI for CCK ; set 100*/
2659*4882a593Smuzhiyun }
2660*4882a593Smuzhiyun #endif
2661*4882a593Smuzhiyun
2662*4882a593Smuzhiyun /*@CCK no STBC and LDPC*/
2663*4882a593Smuzhiyun dm->phy_dbg_info.is_ldpc_pkt = false;
2664*4882a593Smuzhiyun dm->phy_dbg_info.is_stbc_pkt = false;
2665*4882a593Smuzhiyun
2666*4882a593Smuzhiyun /* Update Common information */
2667*4882a593Smuzhiyun phydm_set_common_phy_info(rx_pow, phy_sts->channel, false,
2668*4882a593Smuzhiyun false, CHANNEL_WIDTH_20, sq,
2669*4882a593Smuzhiyun phy_sts->rxsc, phy_info);
2670*4882a593Smuzhiyun /* Update CCK pwdb */
2671*4882a593Smuzhiyun phydm_set_per_path_phy_info(RF_PATH_A, rx_pow, 0, 0, 0, ant_idx,
2672*4882a593Smuzhiyun phy_info);
2673*4882a593Smuzhiyun
2674*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
2675*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2676*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2677*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2678*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2679*4882a593Smuzhiyun #endif
2680*4882a593Smuzhiyun }
2681*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)2682*4882a593Smuzhiyun void phydm_get_phy_sts_type1(struct dm_struct *dm, u8 *phy_status_inf,
2683*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2684*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2685*4882a593Smuzhiyun {
2686*4882a593Smuzhiyun /* type 1 is used for ofdm packet */
2687*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type1 *phy_sts = NULL;
2688*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
2689*4882a593Smuzhiyun s8 rx_pwr_db = -120;
2690*4882a593Smuzhiyun s8 rx_pwr = 0;
2691*4882a593Smuzhiyun u8 i, rxsc, bw = CHANNEL_WIDTH_20, rx_count = 0;
2692*4882a593Smuzhiyun boolean is_mu;
2693*4882a593Smuzhiyun u8 ant_idx[4];
2694*4882a593Smuzhiyun
2695*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr2_type1 *)phy_status_inf;
2696*4882a593Smuzhiyun
2697*4882a593Smuzhiyun /* Fill in per-path antenna index */
2698*4882a593Smuzhiyun ant_idx[0] = phy_sts->antidx_a;
2699*4882a593Smuzhiyun ant_idx[1] = phy_sts->antidx_b;
2700*4882a593Smuzhiyun ant_idx[2] = phy_sts->antidx_c;
2701*4882a593Smuzhiyun ant_idx[3] = phy_sts->antidx_d;
2702*4882a593Smuzhiyun
2703*4882a593Smuzhiyun /* Update per-path information */
2704*4882a593Smuzhiyun for (i = RF_PATH_A; i < PHYDM_MAX_RF_PATH; i++) {
2705*4882a593Smuzhiyun if (!(dm->rx_ant_status & BIT(i)))
2706*4882a593Smuzhiyun continue;
2707*4882a593Smuzhiyun rx_count++;
2708*4882a593Smuzhiyun
2709*4882a593Smuzhiyun if (rx_count > dm->num_rf_path)
2710*4882a593Smuzhiyun break;
2711*4882a593Smuzhiyun
2712*4882a593Smuzhiyun /* Update per-path information
2713*4882a593Smuzhiyun * (RSSI_dB RSSI_percentage EVM SNR CFO sq)
2714*4882a593Smuzhiyun */
2715*4882a593Smuzhiyun /* @EVM report is reported by stream, not path */
2716*4882a593Smuzhiyun rx_pwr = phy_sts->pwdb[i] - 110; /* per-path pwdb(dB)*/
2717*4882a593Smuzhiyun
2718*4882a593Smuzhiyun if (pktinfo->is_to_self)
2719*4882a593Smuzhiyun dm->ofdm_agc_idx[i] = phy_sts->pwdb[i];
2720*4882a593Smuzhiyun
2721*4882a593Smuzhiyun phydm_set_per_path_phy_info(i, rx_pwr,
2722*4882a593Smuzhiyun phy_sts->rxevm[rx_count - 1],
2723*4882a593Smuzhiyun phy_sts->cfo_tail[i],
2724*4882a593Smuzhiyun phy_sts->rxsnr[i],
2725*4882a593Smuzhiyun ant_idx[i], phy_info);
2726*4882a593Smuzhiyun /* search maximum pwdb */
2727*4882a593Smuzhiyun if (rx_pwr > rx_pwr_db)
2728*4882a593Smuzhiyun rx_pwr_db = rx_pwr;
2729*4882a593Smuzhiyun }
2730*4882a593Smuzhiyun
2731*4882a593Smuzhiyun /* @mapping RX counter from 1~4 to 0~3 */
2732*4882a593Smuzhiyun if (rx_count > 0)
2733*4882a593Smuzhiyun phy_info->rx_count = rx_count - 1;
2734*4882a593Smuzhiyun
2735*4882a593Smuzhiyun /* @Check if MU packet or not */
2736*4882a593Smuzhiyun if (phy_sts->gid != 0 && phy_sts->gid != 63) {
2737*4882a593Smuzhiyun is_mu = true;
2738*4882a593Smuzhiyun dbg_i->num_qry_mu_pkt++;
2739*4882a593Smuzhiyun } else {
2740*4882a593Smuzhiyun is_mu = false;
2741*4882a593Smuzhiyun }
2742*4882a593Smuzhiyun
2743*4882a593Smuzhiyun /* @count BF packet */
2744*4882a593Smuzhiyun dbg_i->num_qry_bf_pkt = dbg_i->num_qry_bf_pkt + phy_sts->beamformed;
2745*4882a593Smuzhiyun
2746*4882a593Smuzhiyun /*STBC or LDPC pkt*/
2747*4882a593Smuzhiyun dbg_i->is_ldpc_pkt = phy_sts->ldpc;
2748*4882a593Smuzhiyun dbg_i->is_stbc_pkt = phy_sts->stbc;
2749*4882a593Smuzhiyun
2750*4882a593Smuzhiyun /* @Check sub-channel */
2751*4882a593Smuzhiyun if (pktinfo->data_rate > ODM_RATE11M &&
2752*4882a593Smuzhiyun pktinfo->data_rate < ODM_RATEMCS0)
2753*4882a593Smuzhiyun rxsc = phy_sts->l_rxsc;
2754*4882a593Smuzhiyun else
2755*4882a593Smuzhiyun rxsc = phy_sts->ht_rxsc;
2756*4882a593Smuzhiyun
2757*4882a593Smuzhiyun /* @Check RX bandwidth */
2758*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
2759*4882a593Smuzhiyun if (rxsc >= 1 && rxsc <= 8)
2760*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2761*4882a593Smuzhiyun else if ((rxsc >= 9) && (rxsc <= 12))
2762*4882a593Smuzhiyun bw = CHANNEL_WIDTH_40;
2763*4882a593Smuzhiyun else if (rxsc >= 13)
2764*4882a593Smuzhiyun bw = CHANNEL_WIDTH_80;
2765*4882a593Smuzhiyun else
2766*4882a593Smuzhiyun bw = phy_sts->rf_mode;
2767*4882a593Smuzhiyun
2768*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
2769*4882a593Smuzhiyun if (phy_sts->rf_mode == 0)
2770*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2771*4882a593Smuzhiyun else if ((rxsc == 1) || (rxsc == 2))
2772*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2773*4882a593Smuzhiyun else
2774*4882a593Smuzhiyun bw = CHANNEL_WIDTH_40;
2775*4882a593Smuzhiyun }
2776*4882a593Smuzhiyun
2777*4882a593Smuzhiyun /* Update packet information */
2778*4882a593Smuzhiyun phydm_set_common_phy_info(rx_pwr_db, phy_sts->channel,
2779*4882a593Smuzhiyun (boolean)phy_sts->beamformed, is_mu, bw,
2780*4882a593Smuzhiyun phy_info->rx_mimo_signal_quality[0],
2781*4882a593Smuzhiyun rxsc, phy_info);
2782*4882a593Smuzhiyun
2783*4882a593Smuzhiyun phydm_parsing_cfo(dm, pktinfo, phy_sts->cfo_tail, pktinfo->rate_ss);
2784*4882a593Smuzhiyun #ifdef PHYDM_LNA_SAT_CHK_TYPE2
2785*4882a593Smuzhiyun phydm_parsing_snr(dm, pktinfo, phy_sts->rxsnr);
2786*4882a593Smuzhiyun #endif
2787*4882a593Smuzhiyun
2788*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2789*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_0 = phy_sts->antidx_a;
2790*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_1 = phy_sts->antidx_b;
2791*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_2 = phy_sts->antidx_c;
2792*4882a593Smuzhiyun dm->dm_fat_table.antsel_rx_keep_3 = phy_sts->antidx_d;
2793*4882a593Smuzhiyun #endif
2794*4882a593Smuzhiyun }
2795*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)2796*4882a593Smuzhiyun void phydm_get_phy_sts_type2(struct dm_struct *dm, u8 *phy_status_inf,
2797*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2798*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2799*4882a593Smuzhiyun {
2800*4882a593Smuzhiyun struct phy_sts_rpt_jgr2_type2 *phy_sts = NULL;
2801*4882a593Smuzhiyun s8 rx_pwr_db_max = -120;
2802*4882a593Smuzhiyun s8 rx_pwr = 0;
2803*4882a593Smuzhiyun u8 i, rxsc, bw = CHANNEL_WIDTH_20, rx_count = 0;
2804*4882a593Smuzhiyun
2805*4882a593Smuzhiyun phy_sts = (struct phy_sts_rpt_jgr2_type2 *)phy_status_inf;
2806*4882a593Smuzhiyun
2807*4882a593Smuzhiyun for (i = RF_PATH_A; i < PHYDM_MAX_RF_PATH; i++) {
2808*4882a593Smuzhiyun if (!(dm->rx_ant_status & BIT(i)))
2809*4882a593Smuzhiyun continue;
2810*4882a593Smuzhiyun rx_count++;
2811*4882a593Smuzhiyun
2812*4882a593Smuzhiyun if (rx_count > dm->num_rf_path)
2813*4882a593Smuzhiyun break;
2814*4882a593Smuzhiyun
2815*4882a593Smuzhiyun /* Update per-path information*/
2816*4882a593Smuzhiyun /* RSSI_dB, RSSI_percentage, EVM, SNR, CFO, sq */
2817*4882a593Smuzhiyun #if (RTL8197F_SUPPORT)
2818*4882a593Smuzhiyun if ((dm->support_ic_type & ODM_RTL8197F) &&
2819*4882a593Smuzhiyun phy_sts->pwdb[i] == 0x7f) { /*@97f workaround*/
2820*4882a593Smuzhiyun
2821*4882a593Smuzhiyun if (i == RF_PATH_A) {
2822*4882a593Smuzhiyun rx_pwr = (phy_sts->gain_a) << 1;
2823*4882a593Smuzhiyun rx_pwr = rx_pwr - 110;
2824*4882a593Smuzhiyun } else if (i == RF_PATH_B) {
2825*4882a593Smuzhiyun rx_pwr = (phy_sts->gain_b) << 1;
2826*4882a593Smuzhiyun rx_pwr = rx_pwr - 110;
2827*4882a593Smuzhiyun } else {
2828*4882a593Smuzhiyun rx_pwr = 0;
2829*4882a593Smuzhiyun }
2830*4882a593Smuzhiyun } else
2831*4882a593Smuzhiyun #endif
2832*4882a593Smuzhiyun rx_pwr = phy_sts->pwdb[i] - 110; /*@dBm*/
2833*4882a593Smuzhiyun
2834*4882a593Smuzhiyun phydm_set_per_path_phy_info(i, rx_pwr, 0, 0, 0, 0, phy_info);
2835*4882a593Smuzhiyun
2836*4882a593Smuzhiyun if (rx_pwr > rx_pwr_db_max) /* search max pwdb */
2837*4882a593Smuzhiyun rx_pwr_db_max = rx_pwr;
2838*4882a593Smuzhiyun }
2839*4882a593Smuzhiyun
2840*4882a593Smuzhiyun /* @mapping RX counter from 1~4 to 0~3 */
2841*4882a593Smuzhiyun if (rx_count > 0)
2842*4882a593Smuzhiyun phy_info->rx_count = rx_count - 1;
2843*4882a593Smuzhiyun
2844*4882a593Smuzhiyun /* @Check RX sub-channel */
2845*4882a593Smuzhiyun if (pktinfo->data_rate > ODM_RATE11M &&
2846*4882a593Smuzhiyun pktinfo->data_rate < ODM_RATEMCS0)
2847*4882a593Smuzhiyun rxsc = phy_sts->l_rxsc;
2848*4882a593Smuzhiyun else
2849*4882a593Smuzhiyun rxsc = phy_sts->ht_rxsc;
2850*4882a593Smuzhiyun
2851*4882a593Smuzhiyun /*STBC or LDPC pkt*/
2852*4882a593Smuzhiyun dm->phy_dbg_info.is_ldpc_pkt = phy_sts->ldpc;
2853*4882a593Smuzhiyun dm->phy_dbg_info.is_stbc_pkt = phy_sts->stbc;
2854*4882a593Smuzhiyun
2855*4882a593Smuzhiyun /* @Check RX bandwidth */
2856*4882a593Smuzhiyun /* @BW information of sc=0 is useless,
2857*4882a593Smuzhiyun *because there is no information of RF mode
2858*4882a593Smuzhiyun */
2859*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
2860*4882a593Smuzhiyun if (rxsc >= 1 && rxsc <= 8)
2861*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2862*4882a593Smuzhiyun else if ((rxsc >= 9) && (rxsc <= 12))
2863*4882a593Smuzhiyun bw = CHANNEL_WIDTH_40;
2864*4882a593Smuzhiyun else if (rxsc >= 13)
2865*4882a593Smuzhiyun bw = CHANNEL_WIDTH_80;
2866*4882a593Smuzhiyun
2867*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
2868*4882a593Smuzhiyun if (rxsc == 3)
2869*4882a593Smuzhiyun bw = CHANNEL_WIDTH_40;
2870*4882a593Smuzhiyun else if ((rxsc == 1) || (rxsc == 2))
2871*4882a593Smuzhiyun bw = CHANNEL_WIDTH_20;
2872*4882a593Smuzhiyun }
2873*4882a593Smuzhiyun
2874*4882a593Smuzhiyun /* Update packet information */
2875*4882a593Smuzhiyun phydm_set_common_phy_info(rx_pwr_db_max, phy_sts->channel,
2876*4882a593Smuzhiyun (boolean)phy_sts->beamformed,
2877*4882a593Smuzhiyun false, bw, 0, rxsc, phy_info);
2878*4882a593Smuzhiyun }
2879*4882a593Smuzhiyun
phydm_process_rssi_for_dm_2nd_type(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,struct phydm_perpkt_info_struct * pktinfo)2880*4882a593Smuzhiyun void phydm_process_rssi_for_dm_2nd_type(struct dm_struct *dm,
2881*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
2882*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo
2883*4882a593Smuzhiyun )
2884*4882a593Smuzhiyun {
2885*4882a593Smuzhiyun struct cmn_sta_info *sta = NULL;
2886*4882a593Smuzhiyun struct rssi_info *rssi_t = NULL;
2887*4882a593Smuzhiyun u8 rssi_tmp = 0;
2888*4882a593Smuzhiyun u64 rssi_linear = 0;
2889*4882a593Smuzhiyun s16 rssi_db = 0;
2890*4882a593Smuzhiyun u8 i = 0;
2891*4882a593Smuzhiyun
2892*4882a593Smuzhiyun if (pktinfo->station_id >= ODM_ASSOCIATE_ENTRY_NUM)
2893*4882a593Smuzhiyun return;
2894*4882a593Smuzhiyun
2895*4882a593Smuzhiyun sta = dm->phydm_sta_info[pktinfo->station_id];
2896*4882a593Smuzhiyun
2897*4882a593Smuzhiyun if (!is_sta_active(sta))
2898*4882a593Smuzhiyun return;
2899*4882a593Smuzhiyun
2900*4882a593Smuzhiyun if (!pktinfo->is_packet_match_bssid) /*@data frame only*/
2901*4882a593Smuzhiyun return;
2902*4882a593Smuzhiyun
2903*4882a593Smuzhiyun #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
2904*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_ANT_DIV)
2905*4882a593Smuzhiyun odm_process_rssi_for_ant_div(dm, phy_info, pktinfo);
2906*4882a593Smuzhiyun #endif
2907*4882a593Smuzhiyun
2908*4882a593Smuzhiyun #if (defined(CONFIG_PATH_DIVERSITY))
2909*4882a593Smuzhiyun if (dm->support_ability & ODM_BB_PATH_DIV)
2910*4882a593Smuzhiyun phydm_process_rssi_for_path_div(dm, phy_info, pktinfo);
2911*4882a593Smuzhiyun #endif
2912*4882a593Smuzhiyun
2913*4882a593Smuzhiyun #ifdef CONFIG_ADAPTIVE_SOML
2914*4882a593Smuzhiyun phydm_rx_qam_for_soml(dm, pktinfo);
2915*4882a593Smuzhiyun phydm_rx_rate_for_soml(dm, pktinfo);
2916*4882a593Smuzhiyun #endif
2917*4882a593Smuzhiyun
2918*4882a593Smuzhiyun if (!(pktinfo->is_packet_to_self) && !(pktinfo->is_packet_beacon))
2919*4882a593Smuzhiyun return;
2920*4882a593Smuzhiyun
2921*4882a593Smuzhiyun if (pktinfo->is_packet_beacon) {
2922*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_beacon_pkt++;
2923*4882a593Smuzhiyun dm->phy_dbg_info.beacon_phy_rate = pktinfo->data_rate;
2924*4882a593Smuzhiyun }
2925*4882a593Smuzhiyun
2926*4882a593Smuzhiyun rssi_t = &sta->rssi_stat;
2927*4882a593Smuzhiyun
2928*4882a593Smuzhiyun for (i = RF_PATH_A; i < PHYDM_MAX_RF_PATH; i++) {
2929*4882a593Smuzhiyun rssi_tmp = phy_info->rx_mimo_signal_strength[i];
2930*4882a593Smuzhiyun if (rssi_tmp != 0)
2931*4882a593Smuzhiyun rssi_linear += phydm_db_2_linear(rssi_tmp);
2932*4882a593Smuzhiyun }
2933*4882a593Smuzhiyun /* @Rounding and removing fractional bits */
2934*4882a593Smuzhiyun rssi_linear = (rssi_linear + (1 << (FRAC_BITS - 1))) >> FRAC_BITS;
2935*4882a593Smuzhiyun
2936*4882a593Smuzhiyun switch (phy_info->rx_count + 1) {
2937*4882a593Smuzhiyun case 2:
2938*4882a593Smuzhiyun rssi_linear = DIVIDED_2(rssi_linear);
2939*4882a593Smuzhiyun break;
2940*4882a593Smuzhiyun case 3:
2941*4882a593Smuzhiyun rssi_linear = DIVIDED_3(rssi_linear);
2942*4882a593Smuzhiyun break;
2943*4882a593Smuzhiyun case 4:
2944*4882a593Smuzhiyun rssi_linear = DIVIDED_4(rssi_linear);
2945*4882a593Smuzhiyun break;
2946*4882a593Smuzhiyun }
2947*4882a593Smuzhiyun
2948*4882a593Smuzhiyun rssi_db = (s16)odm_convert_to_db(rssi_linear);
2949*4882a593Smuzhiyun
2950*4882a593Smuzhiyun if (rssi_t->rssi_acc == 0) {
2951*4882a593Smuzhiyun rssi_t->rssi_acc = (s16)(rssi_db << RSSI_MA);
2952*4882a593Smuzhiyun rssi_t->rssi = (s8)(rssi_db);
2953*4882a593Smuzhiyun } else {
2954*4882a593Smuzhiyun rssi_t->rssi_acc = MA_ACC(rssi_t->rssi_acc, rssi_db, RSSI_MA);
2955*4882a593Smuzhiyun rssi_t->rssi = (s8)GET_MA_VAL(rssi_t->rssi_acc, RSSI_MA);
2956*4882a593Smuzhiyun }
2957*4882a593Smuzhiyun
2958*4882a593Smuzhiyun if (pktinfo->is_cck_rate)
2959*4882a593Smuzhiyun rssi_t->rssi_cck = (s8)rssi_db;
2960*4882a593Smuzhiyun else
2961*4882a593Smuzhiyun rssi_t->rssi_ofdm = (s8)rssi_db;
2962*4882a593Smuzhiyun }
2963*4882a593Smuzhiyun
phydm_rx_physts_2nd_type(void * dm_void,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo,struct phydm_phyinfo_struct * phy_info)2964*4882a593Smuzhiyun void phydm_rx_physts_2nd_type(void *dm_void, u8 *phy_sts,
2965*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo,
2966*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info)
2967*4882a593Smuzhiyun {
2968*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
2969*4882a593Smuzhiyun u8 page = (*phy_sts & 0xf);
2970*4882a593Smuzhiyun
2971*4882a593Smuzhiyun /* Phy status parsing */
2972*4882a593Smuzhiyun switch (page) {
2973*4882a593Smuzhiyun case 0: /*@CCK*/
2974*4882a593Smuzhiyun phydm_get_phy_sts_type0(dm, phy_sts, pktinfo, phy_info);
2975*4882a593Smuzhiyun break;
2976*4882a593Smuzhiyun case 1:
2977*4882a593Smuzhiyun phydm_get_phy_sts_type1(dm, phy_sts, pktinfo, phy_info);
2978*4882a593Smuzhiyun break;
2979*4882a593Smuzhiyun case 2:
2980*4882a593Smuzhiyun phydm_get_phy_sts_type2(dm, phy_sts, pktinfo, phy_info);
2981*4882a593Smuzhiyun break;
2982*4882a593Smuzhiyun default:
2983*4882a593Smuzhiyun break;
2984*4882a593Smuzhiyun }
2985*4882a593Smuzhiyun
2986*4882a593Smuzhiyun #if (RTL8822B_SUPPORT || RTL8821C_SUPPORT || RTL8195B_SUPPORT)
2987*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8195B))
2988*4882a593Smuzhiyun phydm_print_phy_sts_jgr2(dm, phy_sts, pktinfo, phy_info);
2989*4882a593Smuzhiyun #endif
2990*4882a593Smuzhiyun }
2991*4882a593Smuzhiyun
2992*4882a593Smuzhiyun /*@==============================================*/
2993*4882a593Smuzhiyun #endif
2994*4882a593Smuzhiyun
odm_phy_status_query(struct dm_struct * dm,struct phydm_phyinfo_struct * phy_info,u8 * phy_sts,struct phydm_perpkt_info_struct * pktinfo)2995*4882a593Smuzhiyun boolean odm_phy_status_query(struct dm_struct *dm,
2996*4882a593Smuzhiyun struct phydm_phyinfo_struct *phy_info,
2997*4882a593Smuzhiyun u8 *phy_sts,
2998*4882a593Smuzhiyun struct phydm_perpkt_info_struct *pktinfo)
2999*4882a593Smuzhiyun {
3000*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3001*4882a593Smuzhiyun struct pkt_process_info *pkt_proc = &dm->pkt_proc_struct;
3002*4882a593Smuzhiyun boolean auto_swch_en = dm->pkt_proc_struct.physts_auto_swch_en;
3003*4882a593Smuzhiyun #endif
3004*4882a593Smuzhiyun u8 rate = pktinfo->data_rate;
3005*4882a593Smuzhiyun u8 page = (*phy_sts & 0xf);
3006*4882a593Smuzhiyun
3007*4882a593Smuzhiyun pktinfo->is_cck_rate = PHYDM_IS_CCK_RATE(rate);
3008*4882a593Smuzhiyun pktinfo->rate_ss = phydm_rate_to_num_ss(dm, rate);
3009*4882a593Smuzhiyun dm->rate_ss = pktinfo->rate_ss; /*@For AP EVM SW antenna diversity use*/
3010*4882a593Smuzhiyun
3011*4882a593Smuzhiyun if (pktinfo->is_cck_rate)
3012*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_phy_status_cck++;
3013*4882a593Smuzhiyun else
3014*4882a593Smuzhiyun dm->phy_dbg_info.num_qry_phy_status_ofdm++;
3015*4882a593Smuzhiyun
3016*4882a593Smuzhiyun /*Reset phy_info*/
3017*4882a593Smuzhiyun phydm_reset_phy_info(dm, phy_info);
3018*4882a593Smuzhiyun
3019*4882a593Smuzhiyun if (dm->support_ic_type & PHYSTS_3RD_TYPE_IC) {
3020*4882a593Smuzhiyun #ifdef PHYSTS_3RD_TYPE_SUPPORT
3021*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3022*4882a593Smuzhiyun if (phydm_physts_auto_switch_jgr3(dm, phy_sts, pktinfo)) {
3023*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_PHY_STATUS, "SKIP parsing\n");
3024*4882a593Smuzhiyun phy_info->physts_rpt_valid = false;
3025*4882a593Smuzhiyun return false;
3026*4882a593Smuzhiyun }
3027*4882a593Smuzhiyun #endif
3028*4882a593Smuzhiyun phydm_rx_physts_jgr3(dm, phy_sts, pktinfo, phy_info);
3029*4882a593Smuzhiyun phydm_process_dm_rssi_jgr3(dm, phy_info, pktinfo);
3030*4882a593Smuzhiyun #endif
3031*4882a593Smuzhiyun } else if (dm->support_ic_type & PHYSTS_2ND_TYPE_IC) {
3032*4882a593Smuzhiyun #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
3033*4882a593Smuzhiyun phydm_rx_physts_2nd_type(dm, phy_sts, pktinfo, phy_info);
3034*4882a593Smuzhiyun phydm_process_rssi_for_dm_2nd_type(dm, phy_info, pktinfo);
3035*4882a593Smuzhiyun #endif
3036*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
3037*4882a593Smuzhiyun #if ODM_IC_11AC_SERIES_SUPPORT
3038*4882a593Smuzhiyun phydm_rx_physts_1st_type(dm, phy_info, phy_sts, pktinfo);
3039*4882a593Smuzhiyun phydm_process_rssi_for_dm(dm, phy_info, pktinfo);
3040*4882a593Smuzhiyun #endif
3041*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
3042*4882a593Smuzhiyun #if ODM_IC_11N_SERIES_SUPPORT
3043*4882a593Smuzhiyun phydm_phy_sts_n_parsing(dm, phy_info, phy_sts, pktinfo);
3044*4882a593Smuzhiyun phydm_process_rssi_for_dm(dm, phy_info, pktinfo);
3045*4882a593Smuzhiyun #endif
3046*4882a593Smuzhiyun }
3047*4882a593Smuzhiyun phy_info->signal_strength = phy_info->rx_pwdb_all;
3048*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
3049*4882a593Smuzhiyun phydm_process_signal_strength(dm, phy_info, pktinfo);
3050*4882a593Smuzhiyun #endif
3051*4882a593Smuzhiyun
3052*4882a593Smuzhiyun /*For basic debug message*/
3053*4882a593Smuzhiyun if (pktinfo->is_packet_match_bssid || *dm->mp_mode) {
3054*4882a593Smuzhiyun dm->curr_station_id = pktinfo->station_id;
3055*4882a593Smuzhiyun dm->rx_rate = rate;
3056*4882a593Smuzhiyun dm->rssi_a = phy_info->rx_mimo_signal_strength[RF_PATH_A];
3057*4882a593Smuzhiyun dm->rssi_b = phy_info->rx_mimo_signal_strength[RF_PATH_B];
3058*4882a593Smuzhiyun dm->rssi_c = phy_info->rx_mimo_signal_strength[RF_PATH_C];
3059*4882a593Smuzhiyun dm->rssi_d = phy_info->rx_mimo_signal_strength[RF_PATH_D];
3060*4882a593Smuzhiyun
3061*4882a593Smuzhiyun if (rate >= ODM_RATE6M && rate <= ODM_RATE54M)
3062*4882a593Smuzhiyun dm->rxsc_l = (s8)phy_info->rxsc;
3063*4882a593Smuzhiyun else if (phy_info->band_width == CHANNEL_WIDTH_20)
3064*4882a593Smuzhiyun dm->rxsc_20 = (s8)phy_info->rxsc;
3065*4882a593Smuzhiyun else if (phy_info->band_width == CHANNEL_WIDTH_40)
3066*4882a593Smuzhiyun dm->rxsc_40 = (s8)phy_info->rxsc;
3067*4882a593Smuzhiyun else if (phy_info->band_width == CHANNEL_WIDTH_80)
3068*4882a593Smuzhiyun dm->rxsc_80 = (s8)phy_info->rxsc;
3069*4882a593Smuzhiyun
3070*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3071*4882a593Smuzhiyun if (auto_swch_en && page == 4 && pktinfo->rate_ss > 1)
3072*4882a593Smuzhiyun phydm_avg_condi_num(dm, phy_info, pktinfo);
3073*4882a593Smuzhiyun
3074*4882a593Smuzhiyun if (!auto_swch_en ||
3075*4882a593Smuzhiyun (pkt_proc->is_1st_mpdu || PHYDM_IS_LEGACY_RATE(rate)))
3076*4882a593Smuzhiyun #endif
3077*4882a593Smuzhiyun {
3078*4882a593Smuzhiyun phydm_avg_rssi_evm_snr(dm, phy_info, pktinfo);
3079*4882a593Smuzhiyun phydm_rx_statistic_cal(dm, phy_info, phy_sts, pktinfo);
3080*4882a593Smuzhiyun }
3081*4882a593Smuzhiyun }
3082*4882a593Smuzhiyun
3083*4882a593Smuzhiyun phy_info->physts_rpt_valid = true;
3084*4882a593Smuzhiyun return true;
3085*4882a593Smuzhiyun }
3086*4882a593Smuzhiyun
phydm_rx_phy_status_init(void * dm_void)3087*4882a593Smuzhiyun void phydm_rx_phy_status_init(void *dm_void)
3088*4882a593Smuzhiyun {
3089*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
3090*4882a593Smuzhiyun struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
3091*4882a593Smuzhiyun
3092*4882a593Smuzhiyun dbg->show_phy_sts_all_pkt = 0;
3093*4882a593Smuzhiyun dbg->show_phy_sts_max_cnt = 1;
3094*4882a593Smuzhiyun dbg->show_phy_sts_cnt = 0;
3095*4882a593Smuzhiyun
3096*4882a593Smuzhiyun phydm_avg_phystatus_init(dm);
3097*4882a593Smuzhiyun
3098*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3099*4882a593Smuzhiyun dm->pkt_proc_struct.physts_auto_swch_en = false;
3100*4882a593Smuzhiyun #endif
3101*4882a593Smuzhiyun }
3102*4882a593Smuzhiyun
phydm_physts_dbg(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len)3103*4882a593Smuzhiyun void phydm_physts_dbg(void *dm_void, char input[][16], u32 *_used,
3104*4882a593Smuzhiyun char *output, u32 *_out_len)
3105*4882a593Smuzhiyun {
3106*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
3107*4882a593Smuzhiyun char help[] = "-h";
3108*4882a593Smuzhiyun boolean enable;
3109*4882a593Smuzhiyun u32 var[10] = {0};
3110*4882a593Smuzhiyun u32 used = *_used;
3111*4882a593Smuzhiyun u32 out_len = *_out_len;
3112*4882a593Smuzhiyun u8 i = 0;
3113*4882a593Smuzhiyun
3114*4882a593Smuzhiyun for (i = 0; i < 3; i++) {
3115*4882a593Smuzhiyun if (input[i + 1])
3116*4882a593Smuzhiyun PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var[i]);
3117*4882a593Smuzhiyun }
3118*4882a593Smuzhiyun
3119*4882a593Smuzhiyun if ((strcmp(input[1], help) == 0)) {
3120*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
3121*4882a593Smuzhiyun "Page Auto Switching: swh {en} {bitmap(hex)}\n");
3122*4882a593Smuzhiyun } else if ((strcmp(input[1], "swh") == 0)) {
3123*4882a593Smuzhiyun #ifdef PHYDM_PHYSTAUS_AUTO_SWITCH
3124*4882a593Smuzhiyun PHYDM_SSCANF(input[3], DCMD_HEX, &var[2]);
3125*4882a593Smuzhiyun enable = (boolean)var[1];
3126*4882a593Smuzhiyun phydm_physts_auto_switch_jgr3_set(dm, enable, (u8)var[2]);
3127*4882a593Smuzhiyun
3128*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
3129*4882a593Smuzhiyun "Page Auto Switching: en=%d, bitmap=0x%x\n",
3130*4882a593Smuzhiyun enable, var[2]);
3131*4882a593Smuzhiyun #endif
3132*4882a593Smuzhiyun }
3133*4882a593Smuzhiyun *_used = used;
3134*4882a593Smuzhiyun *_out_len = out_len;
3135*4882a593Smuzhiyun }
3136