odm_HWConfig.c revision f7c92d2cc2beb3367f244480300eaecdd9502932
1f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger/******************************************************************************
2f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger *
3f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger *
5f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * This program is free software; you can redistribute it and/or modify it
6f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * under the terms of version 2 of the GNU General Public License as
7f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * published by the Free Software Foundation.
8f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger *
9f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
10f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * more details.
13f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger *
14f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger ******************************************************************************/
15f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
16f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger/*  */
17f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger/*  include files */
18f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger/*  */
19f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
20f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger#include "odm_precomp.h"
21f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
22f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger#define READ_AND_CONFIG     READ_AND_CONFIG_MP
23f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
24f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger#define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig##txt##ic(pDM_Odm))
25f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger#define READ_AND_CONFIG_TC(ic, txt) (ODM_ReadAndConfig_TC##txt##ic(pDM_Odm))
26f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
27f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerstatic u8 odm_QueryRxPwrPercentage(s8 AntPower)
28f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
29f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if ((AntPower <= -100) || (AntPower >= 20))
30f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		return	0;
31f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	else if (AntPower >= 0)
32f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		return	100;
33f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	else
34f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		return	100 + AntPower;
35f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
36f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
37f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerstatic s32 odm_SignalScaleMapping_92CSeries(struct dm_odm_t *pDM_Odm, s32 CurrSig)
38f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
39f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	s32 RetSig = 0;
40f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
41f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if ((pDM_Odm->SupportInterface  == ODM_ITRF_USB) || (pDM_Odm->SupportInterface  == ODM_ITRF_SDIO)) {
42f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (CurrSig >= 51 && CurrSig <= 100)
43f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RetSig = 100;
44f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else if (CurrSig >= 41 && CurrSig <= 50)
45f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RetSig = 80 + ((CurrSig - 40)*2);
46f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else if (CurrSig >= 31 && CurrSig <= 40)
47f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RetSig = 66 + (CurrSig - 30);
48f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else if (CurrSig >= 21 && CurrSig <= 30)
49f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RetSig = 54 + (CurrSig - 20);
50f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else if (CurrSig >= 10 && CurrSig <= 20)
51f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RetSig = 42 + (((CurrSig - 10) * 2) / 3);
52f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else if (CurrSig >= 5 && CurrSig <= 9)
53f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RetSig = 22 + (((CurrSig - 5) * 3) / 2);
54f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else if (CurrSig >= 1 && CurrSig <= 4)
55f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RetSig = 6 + (((CurrSig - 1) * 3) / 2);
56f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else
57f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RetSig = CurrSig;
58f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	}
59f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	return RetSig;
60f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
61f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
62f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerstatic s32 odm_SignalScaleMapping(struct dm_odm_t *pDM_Odm, s32 CurrSig)
63f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
64f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	return odm_SignalScaleMapping_92CSeries(pDM_Odm, CurrSig);
65f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
66f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
67f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerstatic u8
68f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerodm_EVMdbToPercentage(
69f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	s8 Value
70f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger  )
71f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
72f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	/*  */
73f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	/*  -33dB~0dB to 0%~99% */
74f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	/*  */
75f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	s8 ret_val;
76f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
77f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	ret_val = Value;
78f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
79f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (ret_val >= 0)
80f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		ret_val = 0;
81f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (ret_val <= -33)
82f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		ret_val = -33;
83f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
84f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	ret_val = 0 - ret_val;
85f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	ret_val *= 3;
86f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
87f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (ret_val == 99)
88f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		ret_val = 100;
89f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
90f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	return ret_val;
91f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
92f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
93f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerstatic void odm_RxPhyStatus92CSeries_Parsing(struct dm_odm_t *pDM_Odm,
94f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					     struct odm_phy_info *pPhyInfo,
95f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					     u8 *pPhyStatus,
96f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					     struct odm_packet_info *pPktinfo)
97f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
98f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	struct phy_status_rpt *pPhyStaRpt = (struct phy_status_rpt *)pPhyStatus;
99f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u8 i, Max_spatial_stream;
100f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	s8 rx_pwr[4], rx_pwr_all = 0;
101f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u8 EVM, PWDB_ALL = 0, PWDB_ALL_BT;
102f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u8 RSSI, total_rssi = 0;
103f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u8 isCCKrate = 0;
104f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u8 rf_rx_num = 0;
105f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u8 cck_highpwr = 0;
106f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
107f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	isCCKrate = (pPktinfo->Rate <= DESC92C_RATE11M) ? true : false;
108f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	pPhyInfo->RxMIMOSignalQuality[RF_PATH_A] = -1;
109f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	pPhyInfo->RxMIMOSignalQuality[RF_PATH_B] = -1;
110f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
111f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (isCCKrate) {
112f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		u8 report;
113f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		u8 cck_agc_rpt;
114f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
115f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++;
116f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/*  (1)Hardware does not provide RSSI for CCK */
117f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/*  (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) */
118f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
119f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		cck_highpwr = pDM_Odm->bCckHighPower;
120f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
121f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		cck_agc_rpt =  pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a ;
122f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
123f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/* The RSSI formula should be modified according to the gain table */
124f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (!cck_highpwr) {
125f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			report = (cck_agc_rpt & 0xc0)>>6;
126f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			switch (report) {
127f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/*  Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion */
128f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/*  Note: different RF with the different RNA gain. */
129f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			case 0x3:
130f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				rx_pwr_all = -46 - (cck_agc_rpt & 0x3e);
131f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				break;
132f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			case 0x2:
133f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				rx_pwr_all = -26 - (cck_agc_rpt & 0x3e);
134f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				break;
135f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			case 0x1:
136f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				rx_pwr_all = -12 - (cck_agc_rpt & 0x3e);
137f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				break;
138f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			case 0x0:
139f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				rx_pwr_all = 16 - (cck_agc_rpt & 0x3e);
140f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				break;
141f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			}
142f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		} else {
143f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			report = (cck_agc_rpt & 0x60)>>5;
144f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			switch (report) {
145f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			case 0x3:
146f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f)<<1) ;
147f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				break;
148f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			case 0x2:
149f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f)<<1);
150f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				break;
151f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			case 0x1:
152f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f)<<1) ;
153f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				break;
154f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			case 0x0:
155f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f)<<1) ;
156f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				break;
157f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			}
158f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		}
159f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
160f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);
161f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
162f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/* Modification for ext-LNA board */
163f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) {
164f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if ((cck_agc_rpt>>7) == 0) {
165f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				PWDB_ALL = (PWDB_ALL > 94) ? 100 : (PWDB_ALL+6);
166f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			} else {
167f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				if (PWDB_ALL > 38)
168f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					PWDB_ALL -= 16;
169f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				else
170f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					PWDB_ALL = (PWDB_ALL <= 16) ? (PWDB_ALL>>2) : (PWDB_ALL-12);
171f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			}
172f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
173f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/* CCK modification */
174f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (PWDB_ALL > 25 && PWDB_ALL <= 60)
175f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				PWDB_ALL += 6;
176f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		} else { /* Modification for int-LNA board */
177f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (PWDB_ALL > 99)
178f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				PWDB_ALL -= 8;
179f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			else if (PWDB_ALL > 50 && PWDB_ALL <= 68)
180f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				PWDB_ALL += 4;
181f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		}
182f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pPhyInfo->RxPWDBAll = PWDB_ALL;
183f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pPhyInfo->BTRxRSSIPercentage = PWDB_ALL;
184f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pPhyInfo->RecvSignalPower = rx_pwr_all;
185f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/*  (3) Get Signal Quality (EVM) */
186f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (pPktinfo->bPacketMatchBSSID) {
187f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			u8	SQ, SQ_rpt;
188f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
189f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			SQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all;
190f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
191f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (SQ_rpt > 64)
192f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				SQ = 0;
193f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			else if (SQ_rpt < 20)
194f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				SQ = 100;
195f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			else
196f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				SQ = ((64-SQ_rpt) * 100) / 44;
197f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
198f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pPhyInfo->SignalQuality = SQ;
199f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pPhyInfo->RxMIMOSignalQuality[RF_PATH_A] = SQ;
200f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pPhyInfo->RxMIMOSignalQuality[RF_PATH_B] = -1;
201f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		}
202f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	} else { /* is OFDM rate */
203f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++;
204f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
205f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/*  (1)Get RSSI for HT rate */
206f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
207f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		for (i = RF_PATH_A; i < RF_PATH_MAX; i++) {
208f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/*  2008/01/30 MH we will judge RF RX path now. */
209f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (pDM_Odm->RFPathRxEnable & BIT(i))
210f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				rf_rx_num++;
211f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
212f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain & 0x3F)*2) - 110;
213f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
214f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pPhyInfo->RxPwr[i] = rx_pwr[i];
215f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
216f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/* Translate DBM to percentage. */
217f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]);
218f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			total_rssi += RSSI;
219f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
220f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/* Modification for ext-LNA board */
221f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) {
222f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				if ((pPhyStaRpt->path_agc[i].trsw) == 1)
223f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI = (RSSI > 94) ? 100 : (RSSI+6);
224f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				else
225f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI = (RSSI <= 16) ? (RSSI>>3) : (RSSI-16);
226f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
227f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				if ((RSSI <= 34) && (RSSI >= 4))
228f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI -= 4;
229f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			}
230f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
231f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pPhyInfo->RxMIMOSignalStrength[i] = (u8) RSSI;
232f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
233f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/* Get Rx snr value in DB */
234f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s32)(pPhyStaRpt->path_rxsnr[i]/2);
235f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		}
236f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
237f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/*  (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) */
238f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1) & 0x7f)-110;
239f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
240f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);
241f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		PWDB_ALL_BT = PWDB_ALL;
242f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
243f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pPhyInfo->RxPWDBAll = PWDB_ALL;
244f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT;
245f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pPhyInfo->RxPower = rx_pwr_all;
246f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pPhyInfo->RecvSignalPower = rx_pwr_all;
247f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
248f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/*  (3)EVM of HT rate */
249f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (pPktinfo->Rate >= DESC92C_RATEMCS8 && pPktinfo->Rate <= DESC92C_RATEMCS15)
250f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			Max_spatial_stream = 2; /* both spatial stream make sense */
251f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else
252f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			Max_spatial_stream = 1; /* only spatial stream 1 makes sense */
253f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
254f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		for (i = 0; i < Max_spatial_stream; i++) {
255f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/*  Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment */
256f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/*  fill most significant bit to "zero" when doing shifting operation which may change a negative */
257f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/*  value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore. */
258f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			EVM = odm_EVMdbToPercentage((pPhyStaRpt->stream_rxevm[i]));	/* dbm */
259f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
260f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (pPktinfo->bPacketMatchBSSID) {
261f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				if (i == RF_PATH_A) {
262f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					/*  Fill value in RFD, Get the first spatial stream only */
263f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					pPhyInfo->SignalQuality = (u8)(EVM & 0xff);
264f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				}
265f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				pPhyInfo->RxMIMOSignalQuality[i] = (u8)(EVM & 0xff);
266f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			}
267f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		}
268f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	}
269f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	/* UI BSS List signal strength(in percentage), make it good looking, from 0~100. */
270f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	/* It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). */
271f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (isCCKrate) {
272f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pPhyInfo->SignalStrength = (u8)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));/* PWDB_ALL; */
273f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	} else {
274f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (rf_rx_num != 0)
275f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pPhyInfo->SignalStrength = (u8)(odm_SignalScaleMapping(pDM_Odm, total_rssi /= rf_rx_num));
276f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	}
277f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
278f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
279f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingervoid odm_Init_RSSIForDM23a(struct dm_odm_t *pDM_Odm)
280f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
281f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
282f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
283f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerstatic void odm_Process_RSSIForDM(struct dm_odm_t *pDM_Odm,
284f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				  struct odm_phy_info *pPhyInfo,
285f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				  struct odm_packet_info *pPktinfo)
286f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
287f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	s32 UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK;
288f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	s32 UndecoratedSmoothedOFDM, RSSI_Ave;
289f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u8 isCCKrate = 0;
290f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u8 RSSI_max, RSSI_min, i;
291f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u32 OFDM_pkt = 0;
292f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u32 Weighting = 0;
293f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	struct sta_info *pEntry;
294f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
295f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (pPktinfo->StationID == 0xFF)
296f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		return;
297f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
298f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	pEntry = pDM_Odm->pODM_StaInfo[pPktinfo->StationID];
299f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (!IS_STA_VALID(pEntry))
300f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		return;
301f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if ((!pPktinfo->bPacketMatchBSSID))
302f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		return;
303f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
304f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	isCCKrate = (pPktinfo->Rate <= DESC92C_RATE11M) ? true : false;
305f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
306f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	/* Smart Antenna Debug Message------------------*/
307f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
308f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	UndecoratedSmoothedCCK =  pEntry->rssi_stat.UndecoratedSmoothedCCK;
309f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	UndecoratedSmoothedOFDM = pEntry->rssi_stat.UndecoratedSmoothedOFDM;
310f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	UndecoratedSmoothedPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
311f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
312f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) {
313f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (!isCCKrate) { /* ofdm rate */
314f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (pPhyInfo->RxMIMOSignalStrength[RF_PATH_B] == 0) {
315f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				RSSI_Ave = pPhyInfo->RxMIMOSignalStrength[RF_PATH_A];
316f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			} else {
317f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				if (pPhyInfo->RxMIMOSignalStrength[RF_PATH_A] > pPhyInfo->RxMIMOSignalStrength[RF_PATH_B]) {
318f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI_max = pPhyInfo->RxMIMOSignalStrength[RF_PATH_A];
319f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI_min = pPhyInfo->RxMIMOSignalStrength[RF_PATH_B];
320f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				} else {
321f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI_max = pPhyInfo->RxMIMOSignalStrength[RF_PATH_B];
322f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI_min = pPhyInfo->RxMIMOSignalStrength[RF_PATH_A];
323f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				}
324f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				if ((RSSI_max - RSSI_min) < 3)
325f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI_Ave = RSSI_max;
326f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				else if ((RSSI_max - RSSI_min) < 6)
327f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI_Ave = RSSI_max - 1;
328f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				else if ((RSSI_max - RSSI_min) < 10)
329f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI_Ave = RSSI_max - 2;
330f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				else
331f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					RSSI_Ave = RSSI_max - 3;
332f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			}
333f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
334f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/* 1 Process OFDM RSSI */
335f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (UndecoratedSmoothedOFDM <= 0) {
336f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				/*  initialize */
337f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				UndecoratedSmoothedOFDM = pPhyInfo->RxPWDBAll;
338f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			} else {
339f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				if (pPhyInfo->RxPWDBAll > (u32)UndecoratedSmoothedOFDM) {
340f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					UndecoratedSmoothedOFDM =
341f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger							(((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) +
342f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger							(RSSI_Ave)) / (Rx_Smooth_Factor);
343f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM + 1;
344f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				} else {
345f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					UndecoratedSmoothedOFDM =
346f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger							(((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) +
347f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger							(RSSI_Ave)) / (Rx_Smooth_Factor);
348f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				}
349f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			}
350f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pEntry->rssi_stat.PacketMap = (pEntry->rssi_stat.PacketMap<<1) | BIT0;
351f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		} else {
352f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			RSSI_Ave = pPhyInfo->RxPWDBAll;
353f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
354f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			/* 1 Process CCK RSSI */
355f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (UndecoratedSmoothedCCK <= 0) {
356f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				/*  initialize */
357f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				UndecoratedSmoothedCCK = pPhyInfo->RxPWDBAll;
358f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			} else {
359f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				if (pPhyInfo->RxPWDBAll > (u32)UndecoratedSmoothedCCK) {
360f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					UndecoratedSmoothedCCK =
361f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger							(((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) +
362f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger							(pPhyInfo->RxPWDBAll)) / (Rx_Smooth_Factor);
363f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1;
364f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				} else {
365f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					UndecoratedSmoothedCCK =
366f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger							(((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) +
367f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger							(pPhyInfo->RxPWDBAll)) / (Rx_Smooth_Factor);
368f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				}
369f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			}
370f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pEntry->rssi_stat.PacketMap = pEntry->rssi_stat.PacketMap<<1;
371f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		}
372f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
373f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/* 2011.07.28 LukeLee: modified to prevent unstable CCK RSSI */
374f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (pEntry->rssi_stat.ValidBit >= 64)
375f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pEntry->rssi_stat.ValidBit = 64;
376f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else
377f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			pEntry->rssi_stat.ValidBit++;
378f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
379f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		for (i = 0; i < pEntry->rssi_stat.ValidBit; i++)
380f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			OFDM_pkt += (u8)(pEntry->rssi_stat.PacketMap>>i)&BIT0;
381f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
382f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (pEntry->rssi_stat.ValidBit == 64) {
383f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			Weighting = ((OFDM_pkt<<4) > 64)?64:(OFDM_pkt<<4);
384f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			UndecoratedSmoothedPWDB = (Weighting*UndecoratedSmoothedOFDM+(64-Weighting)*UndecoratedSmoothedCCK)>>6;
385f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		} else {
386f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (pEntry->rssi_stat.ValidBit != 0)
387f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				UndecoratedSmoothedPWDB = (OFDM_pkt*UndecoratedSmoothedOFDM+(pEntry->rssi_stat.ValidBit-OFDM_pkt)*UndecoratedSmoothedCCK)/pEntry->rssi_stat.ValidBit;
388f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			else
389f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				UndecoratedSmoothedPWDB = 0;
390f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		}
391f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pEntry->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK;
392f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pEntry->rssi_stat.UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM;
393f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		pEntry->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;
394f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	}
395f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
396f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
397f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger/*  Endianness before calling this API */
398f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerstatic void ODM_PhyStatusQuery23a_92CSeries(struct dm_odm_t *pDM_Odm,
399f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					 struct odm_phy_info *pPhyInfo,
400f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					 u8 *pPhyStatus,
401f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					 struct odm_packet_info *pPktinfo)
402f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
403f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	odm_RxPhyStatus92CSeries_Parsing(pDM_Odm, pPhyInfo,
404f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					 pPhyStatus, pPktinfo);
405f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (pDM_Odm->RSSI_test) {
406f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		/*  Select the packets to do RSSI checking for antenna switching. */
407f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon)
408f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			ODM_SwAntDivChkPerPktRssi(pDM_Odm, pPktinfo->StationID, pPhyInfo);
409f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	} else {
410f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		odm_Process_RSSIForDM(pDM_Odm, pPhyInfo, pPktinfo);
411f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	}
412f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
413f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
414f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingervoid ODM_PhyStatusQuery23a(struct dm_odm_t *pDM_Odm, struct odm_phy_info *pPhyInfo,
415f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			   u8 *pPhyStatus, struct odm_packet_info *pPktinfo)
416f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
417f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	ODM_PhyStatusQuery23a_92CSeries(pDM_Odm, pPhyInfo, pPhyStatus, pPktinfo);
418f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
419f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
420f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger/*  For future use. */
421f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingervoid ODM_MacStatusQuery23a(struct dm_odm_t *pDM_Odm, u8 *pMacStatus, u8 MacID,
422f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			bool bPacketMatchBSSID, bool bPacketToSelf,
423f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			bool bPacketBeacon)
424f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
425f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	/*  2011/10/19 Driver team will handle in the future. */
426f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
427f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
428f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
429f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerenum hal_status
430f7c92d2cc2beb3367f244480300eaecdd9502932Larry FingerODM_ConfigRFWithHeaderFile23a(
431f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	struct dm_odm_t *pDM_Odm,
432f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	enum RF_RADIO_PATH	Content,
433f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	enum RF_RADIO_PATH	eRFPath
434f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger  )
435f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
436f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD,
437f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		     ("===>ODM_ConfigRFWithHeaderFile23a\n"));
438f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (pDM_Odm->SupportICType == ODM_RTL8723A) {
439f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (eRFPath == RF_PATH_A)
440f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			READ_AND_CONFIG_MP(8723A, _RadioA_1T_);
441f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
442f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD,
443f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			     (" ===> ODM_ConfigRFWithHeaderFile23a() Radio_A:Rtl8723RadioA_1TArray\n"));
444f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD,
445f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			     (" ===> ODM_ConfigRFWithHeaderFile23a() Radio_B:Rtl8723RadioB_1TArray\n"));
446f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	}
447f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
448f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		     ("ODM_ConfigRFWithHeaderFile23a: Radio No %x\n", eRFPath));
449f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	return HAL_STATUS_SUCCESS;
450f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
451f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
452f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerenum hal_status
453f7c92d2cc2beb3367f244480300eaecdd9502932Larry FingerODM_ConfigBBWithHeaderFile23a(
454f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	struct dm_odm_t *pDM_Odm,
455f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	enum odm_bb_config_type		ConfigType
456f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	)
457f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
458f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (pDM_Odm->SupportICType == ODM_RTL8723A) {
459f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (ConfigType == CONFIG_BB_PHY_REG)
460f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			READ_AND_CONFIG_MP(8723A, _PHY_REG_1T_);
461f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		else if (ConfigType == CONFIG_BB_AGC_TAB)
462f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			READ_AND_CONFIG_MP(8723A, _AGC_TAB_1T_);
463f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD,
464f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			     (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8723AGCTAB_1TArray\n"));
465f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD,
466f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			     (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8723PHY_REG_1TArray\n"));
467f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	}
468f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	return HAL_STATUS_SUCCESS;
469f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
470f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
471f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingerenum hal_status
472f7c92d2cc2beb3367f244480300eaecdd9502932Larry FingerODM_ConfigMACWithHeaderFile23a(
473f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	struct dm_odm_t *pDM_Odm
474f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	)
475f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
476f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u8 result = HAL_STATUS_SUCCESS;
477f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
478f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (pDM_Odm->SupportICType == ODM_RTL8723A)
479f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		READ_AND_CONFIG_MP(8723A, _MAC_REG_);
480f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	return result;
481f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
482