xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8189fs/hal/hal_phy.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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  *****************************************************************************/
15*4882a593Smuzhiyun #define _HAL_PHY_C_
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <drv_types.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /**
20*4882a593Smuzhiyun * Function:	PHY_CalculateBitShift
21*4882a593Smuzhiyun *
22*4882a593Smuzhiyun * OverView:	Get shifted position of the BitMask
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * Input:
25*4882a593Smuzhiyun *			u32		BitMask,
26*4882a593Smuzhiyun *
27*4882a593Smuzhiyun * Output:	none
28*4882a593Smuzhiyun * Return:		u32		Return the shift bit bit position of the mask
29*4882a593Smuzhiyun */
30*4882a593Smuzhiyun u32
PHY_CalculateBitShift(u32 BitMask)31*4882a593Smuzhiyun PHY_CalculateBitShift(
32*4882a593Smuzhiyun 	u32 BitMask
33*4882a593Smuzhiyun )
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun 	u32 i;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	for (i = 0; i <= 31; i++) {
38*4882a593Smuzhiyun 		if (((BitMask >> i) &  0x1) == 1)
39*4882a593Smuzhiyun 			break;
40*4882a593Smuzhiyun 	}
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	return i;
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #ifdef CONFIG_RF_SHADOW_RW
47*4882a593Smuzhiyun /* ********************************************************************************
48*4882a593Smuzhiyun  *	Constant.
49*4882a593Smuzhiyun  * ********************************************************************************
50*4882a593Smuzhiyun  * 2008/11/20 MH For Debug only, RF */
51*4882a593Smuzhiyun static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG];
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /*
54*4882a593Smuzhiyun  * ==> RF shadow Operation API Code Section!!!
55*4882a593Smuzhiyun  *
56*4882a593Smuzhiyun  *-----------------------------------------------------------------------------
57*4882a593Smuzhiyun  * Function:	PHY_RFShadowRead
58*4882a593Smuzhiyun  *				PHY_RFShadowWrite
59*4882a593Smuzhiyun  *				PHY_RFShadowCompare
60*4882a593Smuzhiyun  *				PHY_RFShadowRecorver
61*4882a593Smuzhiyun  *				PHY_RFShadowCompareAll
62*4882a593Smuzhiyun  *				PHY_RFShadowRecorverAll
63*4882a593Smuzhiyun  *				PHY_RFShadowCompareFlagSet
64*4882a593Smuzhiyun  *				PHY_RFShadowRecorverFlagSet
65*4882a593Smuzhiyun  *
66*4882a593Smuzhiyun  * Overview:	When we set RF register, we must write shadow at first.
67*4882a593Smuzhiyun  *			When we are running, we must compare shadow abd locate error addr.
68*4882a593Smuzhiyun  *			Decide to recorver or not.
69*4882a593Smuzhiyun  *
70*4882a593Smuzhiyun  * Input:       NONE
71*4882a593Smuzhiyun  *
72*4882a593Smuzhiyun  * Output:      NONE
73*4882a593Smuzhiyun  *
74*4882a593Smuzhiyun  * Return:      NONE
75*4882a593Smuzhiyun  *
76*4882a593Smuzhiyun  * Revised History:
77*4882a593Smuzhiyun  * When			Who		Remark
78*4882a593Smuzhiyun  * 11/20/2008	MHC		Create Version 0.
79*4882a593Smuzhiyun  *
80*4882a593Smuzhiyun  *---------------------------------------------------------------------------*/
81*4882a593Smuzhiyun u32
PHY_RFShadowRead(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset)82*4882a593Smuzhiyun PHY_RFShadowRead(
83*4882a593Smuzhiyun 		PADAPTER		Adapter,
84*4882a593Smuzhiyun 		enum rf_path		eRFPath,
85*4882a593Smuzhiyun 		u32				Offset)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun 	return	RF_Shadow[eRFPath][Offset].Value;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun }	/* PHY_RFShadowRead */
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun void
PHY_RFShadowWrite(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset,u32 Data)93*4882a593Smuzhiyun PHY_RFShadowWrite(
94*4882a593Smuzhiyun 		PADAPTER		Adapter,
95*4882a593Smuzhiyun 		enum rf_path		eRFPath,
96*4882a593Smuzhiyun 		u32				Offset,
97*4882a593Smuzhiyun 		u32				Data)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun 	RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask);
100*4882a593Smuzhiyun 	RF_Shadow[eRFPath][Offset].Driver_Write = _TRUE;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun }	/* PHY_RFShadowWrite */
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun BOOLEAN
PHY_RFShadowCompare(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset)106*4882a593Smuzhiyun PHY_RFShadowCompare(
107*4882a593Smuzhiyun 		PADAPTER		Adapter,
108*4882a593Smuzhiyun 		enum rf_path		eRFPath,
109*4882a593Smuzhiyun 		u32				Offset)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun 	u32	reg;
112*4882a593Smuzhiyun 	/* Check if we need to check the register */
113*4882a593Smuzhiyun 	if (RF_Shadow[eRFPath][Offset].Compare == _TRUE) {
114*4882a593Smuzhiyun 		reg = rtw_hal_read_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask);
115*4882a593Smuzhiyun 		/* Compare shadow and real rf register for 20bits!! */
116*4882a593Smuzhiyun 		if (RF_Shadow[eRFPath][Offset].Value != reg) {
117*4882a593Smuzhiyun 			/* Locate error position. */
118*4882a593Smuzhiyun 			RF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE;
119*4882a593Smuzhiyun 		}
120*4882a593Smuzhiyun 		return RF_Shadow[eRFPath][Offset].ErrorOrNot ;
121*4882a593Smuzhiyun 	}
122*4882a593Smuzhiyun 	return _FALSE;
123*4882a593Smuzhiyun }	/* PHY_RFShadowCompare */
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun void
PHY_RFShadowRecorver(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset)127*4882a593Smuzhiyun PHY_RFShadowRecorver(
128*4882a593Smuzhiyun 		PADAPTER		Adapter,
129*4882a593Smuzhiyun 		enum rf_path		eRFPath,
130*4882a593Smuzhiyun 		u32				Offset)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun 	/* Check if the address is error */
133*4882a593Smuzhiyun 	if (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE) {
134*4882a593Smuzhiyun 		/* Check if we need to recorver the register. */
135*4882a593Smuzhiyun 		if (RF_Shadow[eRFPath][Offset].Recorver == _TRUE) {
136*4882a593Smuzhiyun 			rtw_hal_write_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask,
137*4882a593Smuzhiyun 					    RF_Shadow[eRFPath][Offset].Value);
138*4882a593Smuzhiyun 		}
139*4882a593Smuzhiyun 	}
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun }	/* PHY_RFShadowRecorver */
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun void
PHY_RFShadowCompareAll(PADAPTER Adapter)145*4882a593Smuzhiyun PHY_RFShadowCompareAll(
146*4882a593Smuzhiyun 		PADAPTER			Adapter)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun 	enum rf_path	eRFPath = RF_PATH_A;
149*4882a593Smuzhiyun 	u32		Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
152*4882a593Smuzhiyun 		for (Offset = 0; Offset < maxReg; Offset++)
153*4882a593Smuzhiyun 			PHY_RFShadowCompare(Adapter, eRFPath, Offset);
154*4882a593Smuzhiyun 	}
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun }	/* PHY_RFShadowCompareAll */
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun void
PHY_RFShadowRecorverAll(PADAPTER Adapter)160*4882a593Smuzhiyun PHY_RFShadowRecorverAll(
161*4882a593Smuzhiyun 		PADAPTER			Adapter)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun 	enum rf_path		eRFPath = RF_PATH_A;
164*4882a593Smuzhiyun 	u32		Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
167*4882a593Smuzhiyun 		for (Offset = 0; Offset < maxReg; Offset++)
168*4882a593Smuzhiyun 			PHY_RFShadowRecorver(Adapter, eRFPath, Offset);
169*4882a593Smuzhiyun 	}
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun }	/* PHY_RFShadowRecorverAll */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun void
PHY_RFShadowCompareFlagSet(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset,u8 Type)175*4882a593Smuzhiyun PHY_RFShadowCompareFlagSet(
176*4882a593Smuzhiyun 		PADAPTER		Adapter,
177*4882a593Smuzhiyun 		enum rf_path		eRFPath,
178*4882a593Smuzhiyun 		u32				Offset,
179*4882a593Smuzhiyun 		u8				Type)
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun 	/* Set True or False!!! */
182*4882a593Smuzhiyun 	RF_Shadow[eRFPath][Offset].Compare = Type;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun }	/* PHY_RFShadowCompareFlagSet */
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun void
PHY_RFShadowRecorverFlagSet(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset,u8 Type)188*4882a593Smuzhiyun PHY_RFShadowRecorverFlagSet(
189*4882a593Smuzhiyun 		PADAPTER		Adapter,
190*4882a593Smuzhiyun 		enum rf_path		eRFPath,
191*4882a593Smuzhiyun 		u32				Offset,
192*4882a593Smuzhiyun 		u8				Type)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun 	/* Set True or False!!! */
195*4882a593Smuzhiyun 	RF_Shadow[eRFPath][Offset].Recorver = Type;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun }	/* PHY_RFShadowRecorverFlagSet */
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun void
PHY_RFShadowCompareFlagSetAll(PADAPTER Adapter)201*4882a593Smuzhiyun PHY_RFShadowCompareFlagSetAll(
202*4882a593Smuzhiyun 		PADAPTER			Adapter)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun 	enum rf_path	eRFPath = RF_PATH_A;
205*4882a593Smuzhiyun 	u32		Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
208*4882a593Smuzhiyun 		for (Offset = 0; Offset < maxReg; Offset++) {
209*4882a593Smuzhiyun 			/* 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! */
210*4882a593Smuzhiyun 			if (Offset != 0x26 && Offset != 0x27)
211*4882a593Smuzhiyun 				PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, _FALSE);
212*4882a593Smuzhiyun 			else
213*4882a593Smuzhiyun 				PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, _TRUE);
214*4882a593Smuzhiyun 		}
215*4882a593Smuzhiyun 	}
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun }	/* PHY_RFShadowCompareFlagSetAll */
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun void
PHY_RFShadowRecorverFlagSetAll(PADAPTER Adapter)221*4882a593Smuzhiyun PHY_RFShadowRecorverFlagSetAll(
222*4882a593Smuzhiyun 		PADAPTER			Adapter)
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun 	enum rf_path		eRFPath = RF_PATH_A;
225*4882a593Smuzhiyun 	u32		Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
228*4882a593Smuzhiyun 		for (Offset = 0; Offset < maxReg; Offset++) {
229*4882a593Smuzhiyun 			/* 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! */
230*4882a593Smuzhiyun 			if (Offset != 0x26 && Offset != 0x27)
231*4882a593Smuzhiyun 				PHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, _FALSE);
232*4882a593Smuzhiyun 			else
233*4882a593Smuzhiyun 				PHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, _TRUE);
234*4882a593Smuzhiyun 		}
235*4882a593Smuzhiyun 	}
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun }	/* PHY_RFShadowCompareFlagSetAll */
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun void
PHY_RFShadowRefresh(PADAPTER Adapter)240*4882a593Smuzhiyun PHY_RFShadowRefresh(
241*4882a593Smuzhiyun 		PADAPTER			Adapter)
242*4882a593Smuzhiyun {
243*4882a593Smuzhiyun 	enum rf_path		eRFPath = RF_PATH_A;
244*4882a593Smuzhiyun 	u32		Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {
247*4882a593Smuzhiyun 		for (Offset = 0; Offset < maxReg; Offset++) {
248*4882a593Smuzhiyun 			RF_Shadow[eRFPath][Offset].Value = 0;
249*4882a593Smuzhiyun 			RF_Shadow[eRFPath][Offset].Compare = _FALSE;
250*4882a593Smuzhiyun 			RF_Shadow[eRFPath][Offset].Recorver  = _FALSE;
251*4882a593Smuzhiyun 			RF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE;
252*4882a593Smuzhiyun 			RF_Shadow[eRFPath][Offset].Driver_Write = _FALSE;
253*4882a593Smuzhiyun 		}
254*4882a593Smuzhiyun 	}
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun }	/* PHY_RFShadowRead */
257*4882a593Smuzhiyun #endif /*CONFIG_RF_SHADOW_RW*/
258