xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8723ds/hal/rtl8723d/rtl8723d_phycfg.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 _RTL8723D_PHYCFG_C_
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <rtl8723d_hal.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /*---------------------------Define Local Constant---------------------------*/
21*4882a593Smuzhiyun /* Channel switch:The size of command tables for switch channel*/
22*4882a593Smuzhiyun #define MAX_PRECMD_CNT 16
23*4882a593Smuzhiyun #define MAX_RFDEPENDCMD_CNT 16
24*4882a593Smuzhiyun #define MAX_POSTCMD_CNT 16
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define MAX_DOZE_WAITING_TIMES_9x 64
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*---------------------------Define Local Constant---------------------------*/
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /*------------------------Define global variable-----------------------------*/
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /*------------------------Define local variable------------------------------*/
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /*--------------------Define export function prototype-----------------------*/
37*4882a593Smuzhiyun /* Please refer to header file
38*4882a593Smuzhiyun  *--------------------Define export function prototype-----------------------*/
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /*----------------------------Function Body----------------------------------*/
41*4882a593Smuzhiyun /*
42*4882a593Smuzhiyun  * 1. BB register R/W API
43*4882a593Smuzhiyun  *   */
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /**
46*4882a593Smuzhiyun * Function:	phy_CalculateBitShift
47*4882a593Smuzhiyun *
48*4882a593Smuzhiyun * OverView:	Get shifted position of the BitMask
49*4882a593Smuzhiyun *
50*4882a593Smuzhiyun * Input:
51*4882a593Smuzhiyun *			u32		BitMask,
52*4882a593Smuzhiyun *
53*4882a593Smuzhiyun * Output:	none
54*4882a593Smuzhiyun * Return:		u32		Return the shift bit bit position of the mask
55*4882a593Smuzhiyun */
56*4882a593Smuzhiyun static	u32
phy_CalculateBitShift(u32 BitMask)57*4882a593Smuzhiyun phy_CalculateBitShift(
58*4882a593Smuzhiyun 	u32 BitMask
59*4882a593Smuzhiyun )
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun 	u32 i;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	for (i = 0; i <= 31; i++) {
64*4882a593Smuzhiyun 		if (((BitMask >> i) &  0x1) == 1)
65*4882a593Smuzhiyun 			break;
66*4882a593Smuzhiyun 	}
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	return i;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /**
73*4882a593Smuzhiyun * Function:	PHY_QueryBBReg
74*4882a593Smuzhiyun *
75*4882a593Smuzhiyun * OverView:	Read "sepcific bits" from BB register
76*4882a593Smuzhiyun *
77*4882a593Smuzhiyun * Input:
78*4882a593Smuzhiyun *			PADAPTER		Adapter,
79*4882a593Smuzhiyun *			u32			RegAddr,
80*4882a593Smuzhiyun *			u32			BitMask
81*4882a593Smuzhiyun *
82*4882a593Smuzhiyun * Output:	None
83*4882a593Smuzhiyun * Return:		u32			Data
84*4882a593Smuzhiyun * Note:		This function is equal to "GetRegSetting" in PHY programming guide
85*4882a593Smuzhiyun */
86*4882a593Smuzhiyun u32
PHY_QueryBBReg_8723D(PADAPTER Adapter,u32 RegAddr,u32 BitMask)87*4882a593Smuzhiyun PHY_QueryBBReg_8723D(
88*4882a593Smuzhiyun 		PADAPTER	Adapter,
89*4882a593Smuzhiyun 		u32		RegAddr,
90*4882a593Smuzhiyun 		u32		BitMask
91*4882a593Smuzhiyun )
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	u32	ReturnValue = 0, OriginalValue, BitShift;
94*4882a593Smuzhiyun 	u16	BBWaitCounter = 0;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun #if (DISABLE_BB_RF == 1)
97*4882a593Smuzhiyun 	return 0;
98*4882a593Smuzhiyun #endif
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	OriginalValue = rtw_read32(Adapter, RegAddr);
102*4882a593Smuzhiyun 	BitShift = phy_CalculateBitShift(BitMask);
103*4882a593Smuzhiyun 	ReturnValue = (OriginalValue & BitMask) >> BitShift;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	return ReturnValue;
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /**
111*4882a593Smuzhiyun * Function:	PHY_SetBBReg
112*4882a593Smuzhiyun *
113*4882a593Smuzhiyun * OverView:	Write "Specific bits" to BB register (page 8~)
114*4882a593Smuzhiyun *
115*4882a593Smuzhiyun * Input:
116*4882a593Smuzhiyun *			PADAPTER		Adapter,
117*4882a593Smuzhiyun *			u32			RegAddr,
118*4882a593Smuzhiyun *			u32			BitMask
119*4882a593Smuzhiyun *
120*4882a593Smuzhiyun *			u32			Data
121*4882a593Smuzhiyun *
122*4882a593Smuzhiyun *
123*4882a593Smuzhiyun * Output:	None
124*4882a593Smuzhiyun * Return:		None
125*4882a593Smuzhiyun * Note:		This function is equal to "PutRegSetting" in PHY programming guide
126*4882a593Smuzhiyun */
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun void
PHY_SetBBReg_8723D(PADAPTER Adapter,u32 RegAddr,u32 BitMask,u32 Data)129*4882a593Smuzhiyun PHY_SetBBReg_8723D(
130*4882a593Smuzhiyun 		PADAPTER	Adapter,
131*4882a593Smuzhiyun 		u32		RegAddr,
132*4882a593Smuzhiyun 		u32		BitMask,
133*4882a593Smuzhiyun 		u32		Data
134*4882a593Smuzhiyun )
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData		= GET_HAL_DATA(Adapter);
137*4882a593Smuzhiyun 	/* u16			BBWaitCounter	= 0; */
138*4882a593Smuzhiyun 	u32			OriginalValue, BitShift;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun #if (DISABLE_BB_RF == 1)
141*4882a593Smuzhiyun 	return;
142*4882a593Smuzhiyun #endif
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	if (BitMask != bMaskDWord) { /* if not "double word" write */
146*4882a593Smuzhiyun 		OriginalValue = rtw_read32(Adapter, RegAddr);
147*4882a593Smuzhiyun 		BitShift = phy_CalculateBitShift(BitMask);
148*4882a593Smuzhiyun 		Data = ((OriginalValue & (~BitMask)) | ((Data << BitShift) & BitMask));
149*4882a593Smuzhiyun 	}
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	rtw_write32(Adapter, RegAddr, Data);
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun /*
157*4882a593Smuzhiyun  * 2. RF register R/W API
158*4882a593Smuzhiyun  *   */
159*4882a593Smuzhiyun static	u32
phy_RFSerialRead_8723D(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset)160*4882a593Smuzhiyun phy_RFSerialRead_8723D(
161*4882a593Smuzhiyun 		PADAPTER			Adapter,
162*4882a593Smuzhiyun 		enum rf_path			eRFPath,
163*4882a593Smuzhiyun 		u32				Offset
164*4882a593Smuzhiyun )
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun 	u32						retValue = 0;
167*4882a593Smuzhiyun 	HAL_DATA_TYPE				*pHalData = GET_HAL_DATA(Adapter);
168*4882a593Smuzhiyun 	BB_REGISTER_DEFINITION_T	*pPhyReg = &pHalData->PHYRegDef[eRFPath];
169*4882a593Smuzhiyun 	u32						NewOffset;
170*4882a593Smuzhiyun 	u32						tmplong, tmplong2;
171*4882a593Smuzhiyun 	u8					RfPiEnable = 0;
172*4882a593Smuzhiyun 	u32						MaskforPhySet = 0;
173*4882a593Smuzhiyun 	int i = 0;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	_enter_critical_mutex(&(adapter_to_dvobj(Adapter)->rf_read_reg_mutex) , NULL);
176*4882a593Smuzhiyun 	/* */
177*4882a593Smuzhiyun 	/* Make sure RF register offset is correct */
178*4882a593Smuzhiyun 	/* */
179*4882a593Smuzhiyun 	Offset &= 0xff;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	NewOffset = Offset;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	if (eRFPath == RF_PATH_A) {
184*4882a593Smuzhiyun 		tmplong2 = phy_query_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord);
185*4882a593Smuzhiyun 		tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset << 23) | bLSSIReadEdge;	/* T65 RF */
186*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
187*4882a593Smuzhiyun 	} else {
188*4882a593Smuzhiyun 		tmplong2 = phy_query_bb_reg(Adapter, rFPGA0_XB_HSSIParameter2 | MaskforPhySet, bMaskDWord);
189*4882a593Smuzhiyun 		tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset << 23) | bLSSIReadEdge;	/* T65 RF */
190*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_XB_HSSIParameter2 | MaskforPhySet, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
191*4882a593Smuzhiyun 	}
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	tmplong2 = phy_query_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord);
194*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
195*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord, tmplong2 | bLSSIReadEdge);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	rtw_udelay_os(10);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	for (i = 0; i < 2; i++)
200*4882a593Smuzhiyun 		rtw_udelay_os(MAX_STALL_TIME);
201*4882a593Smuzhiyun 	rtw_udelay_os(10);
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	if (eRFPath == RF_PATH_A)
204*4882a593Smuzhiyun 		RfPiEnable = (u8)phy_query_bb_reg(Adapter, rFPGA0_XA_HSSIParameter1 | MaskforPhySet, BIT(8));
205*4882a593Smuzhiyun 	else if (eRFPath == RF_PATH_B)
206*4882a593Smuzhiyun 		RfPiEnable = (u8)phy_query_bb_reg(Adapter, rFPGA0_XB_HSSIParameter1 | MaskforPhySet, BIT(8));
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	if (RfPiEnable) {
209*4882a593Smuzhiyun 		/* Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF */
210*4882a593Smuzhiyun 		retValue = phy_query_bb_reg(Adapter, pPhyReg->rfLSSIReadBackPi | MaskforPhySet, bLSSIReadBackData);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 		/* RT_DISP(FINIT, INIT_RF, ("Readback from RF-PI : 0x%x\n", retValue)); */
213*4882a593Smuzhiyun 	} else {
214*4882a593Smuzhiyun 		/* Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF */
215*4882a593Smuzhiyun 		retValue = phy_query_bb_reg(Adapter, pPhyReg->rfLSSIReadBack | MaskforPhySet, bLSSIReadBackData);
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 		/* RT_DISP(FINIT, INIT_RF,("Readback from RF-SI : 0x%x\n", retValue)); */
218*4882a593Smuzhiyun 	}
219*4882a593Smuzhiyun 	_exit_critical_mutex(&(adapter_to_dvobj(Adapter)->rf_read_reg_mutex) , NULL);
220*4882a593Smuzhiyun 	return retValue;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun /**
225*4882a593Smuzhiyun * Function:	phy_RFSerialWrite_8723D
226*4882a593Smuzhiyun *
227*4882a593Smuzhiyun * OverView:	Write data to RF register (page 8~)
228*4882a593Smuzhiyun *
229*4882a593Smuzhiyun * Input:
230*4882a593Smuzhiyun *			PADAPTER		Adapter,
231*4882a593Smuzhiyun 			enum rf_path		eRFPath,
232*4882a593Smuzhiyun *			u32			Offset,
233*4882a593Smuzhiyun *			u32			Data
234*4882a593Smuzhiyun *
235*4882a593Smuzhiyun *
236*4882a593Smuzhiyun * Output:	None
237*4882a593Smuzhiyun * Return:		None
238*4882a593Smuzhiyun * Note:		Threre are three types of serial operations:
239*4882a593Smuzhiyun *			1. Software serial write
240*4882a593Smuzhiyun *			2. Hardware LSSI-Low Speed Serial Interface
241*4882a593Smuzhiyun *			3. Hardware HSSI-High speed
242*4882a593Smuzhiyun *			serial write. Driver need to implement (1) and (2).
243*4882a593Smuzhiyun *			This function is equal to the combination of RF_ReadReg() and  RFLSSIRead()
244*4882a593Smuzhiyun  *
245*4882a593Smuzhiyun  * Note:		  For RF8256 only
246*4882a593Smuzhiyun  *			 The total count of RTL8256(Zebra4) register is around 36 bit it only employs
247*4882a593Smuzhiyun  *			 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10])
248*4882a593Smuzhiyun  *			 to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration
249*4882a593Smuzhiyun  *			 programming guide" for more details.
250*4882a593Smuzhiyun  *			 Thus, we define a sub-finction for RTL8526 register address conversion
251*4882a593Smuzhiyun  *		       ===========================================================
252*4882a593Smuzhiyun  *			 Register Mode		RegCTL[1]		RegCTL[0]		Note
253*4882a593Smuzhiyun  *								(Reg00[12])		(Reg00[10])
254*4882a593Smuzhiyun  *		       ===========================================================
255*4882a593Smuzhiyun  *			 Reg_Mode0				0				x			Reg 0 ~15(0x0 ~ 0xf)
256*4882a593Smuzhiyun  *		       ------------------------------------------------------------------
257*4882a593Smuzhiyun  *			 Reg_Mode1				1				0			Reg 16 ~30(0x1 ~ 0xf)
258*4882a593Smuzhiyun  *		       ------------------------------------------------------------------
259*4882a593Smuzhiyun  *			 Reg_Mode2				1				1			Reg 31 ~ 45(0x1 ~ 0xf)
260*4882a593Smuzhiyun  *		       ------------------------------------------------------------------
261*4882a593Smuzhiyun  *
262*4882a593Smuzhiyun  *	2008/09/02	MH	Add 92S RF definition
263*4882a593Smuzhiyun  *
264*4882a593Smuzhiyun  *
265*4882a593Smuzhiyun  *
266*4882a593Smuzhiyun */
267*4882a593Smuzhiyun static	void
phy_RFSerialWrite_8723D(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset,u32 Data)268*4882a593Smuzhiyun phy_RFSerialWrite_8723D(
269*4882a593Smuzhiyun 		PADAPTER			Adapter,
270*4882a593Smuzhiyun 		enum rf_path			eRFPath,
271*4882a593Smuzhiyun 		u32				Offset,
272*4882a593Smuzhiyun 		u32				Data
273*4882a593Smuzhiyun )
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun 	u32						DataAndAddr = 0;
276*4882a593Smuzhiyun 	HAL_DATA_TYPE				*pHalData = GET_HAL_DATA(Adapter);
277*4882a593Smuzhiyun 	BB_REGISTER_DEFINITION_T	*pPhyReg = &pHalData->PHYRegDef[eRFPath];
278*4882a593Smuzhiyun 	u32						NewOffset;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	Offset &= 0xff;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	/* */
283*4882a593Smuzhiyun 	/* Shadow Update */
284*4882a593Smuzhiyun 	/* */
285*4882a593Smuzhiyun 	/* PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); */
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	/* */
288*4882a593Smuzhiyun 	/* Switch page for 8256 RF IC */
289*4882a593Smuzhiyun 	/* */
290*4882a593Smuzhiyun 	NewOffset = Offset;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	/* */
293*4882a593Smuzhiyun 	/* Put write addr in [5:0]  and write data in [31:16] */
294*4882a593Smuzhiyun 	/* */
295*4882a593Smuzhiyun 	/* DataAndAddr = (Data<<16) | (NewOffset&0x3f); */
296*4882a593Smuzhiyun 	DataAndAddr = ((NewOffset << 20) | (Data & 0x000fffff)) & 0x0fffffff;	/* T65 RF */
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	/* */
299*4882a593Smuzhiyun 	/* Write Operation */
300*4882a593Smuzhiyun 	/* */
301*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
302*4882a593Smuzhiyun 	/* RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr)); */
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun /**
308*4882a593Smuzhiyun * Function:	PHY_QueryRFReg
309*4882a593Smuzhiyun *
310*4882a593Smuzhiyun * OverView:	Query "Specific bits" to RF register (page 8~)
311*4882a593Smuzhiyun *
312*4882a593Smuzhiyun * Input:
313*4882a593Smuzhiyun *			PADAPTER		Adapter,
314*4882a593Smuzhiyun 			enum rf_path			eRFPath,
315*4882a593Smuzhiyun *			u32			RegAddr,
316*4882a593Smuzhiyun *			u32			BitMask
317*4882a593Smuzhiyun *
318*4882a593Smuzhiyun *
319*4882a593Smuzhiyun * Output:	None
320*4882a593Smuzhiyun * Return:		u32			Readback value
321*4882a593Smuzhiyun * Note:		This function is equal to "GetRFRegSetting" in PHY programming guide
322*4882a593Smuzhiyun */
323*4882a593Smuzhiyun u32
PHY_QueryRFReg_8723D(PADAPTER Adapter,enum rf_path eRFPath,u32 RegAddr,u32 BitMask)324*4882a593Smuzhiyun PHY_QueryRFReg_8723D(
325*4882a593Smuzhiyun 		PADAPTER			Adapter,
326*4882a593Smuzhiyun 		enum rf_path			eRFPath,
327*4882a593Smuzhiyun 		u32				RegAddr,
328*4882a593Smuzhiyun 		u32				BitMask
329*4882a593Smuzhiyun )
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	u32 Original_Value, Readback_Value, BitShift;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun #if (DISABLE_BB_RF == 1)
334*4882a593Smuzhiyun 	return 0;
335*4882a593Smuzhiyun #endif
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 	Original_Value = phy_RFSerialRead_8723D(Adapter, eRFPath, RegAddr);
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	BitShift =  phy_CalculateBitShift(BitMask);
340*4882a593Smuzhiyun 	Readback_Value = (Original_Value & BitMask) >> BitShift;
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	return Readback_Value;
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun /**
346*4882a593Smuzhiyun * Function:	PHY_SetRFReg
347*4882a593Smuzhiyun *
348*4882a593Smuzhiyun * OverView:	Write "Specific bits" to RF register (page 8~)
349*4882a593Smuzhiyun *
350*4882a593Smuzhiyun * Input:
351*4882a593Smuzhiyun *			PADAPTER		Adapter,
352*4882a593Smuzhiyun *			RF_PATH			eRFPath,
353*4882a593Smuzhiyun *			u32			RegAddr,
354*4882a593Smuzhiyun *			u32			BitMask
355*4882a593Smuzhiyun *
356*4882a593Smuzhiyun *			u32			Data
357*4882a593Smuzhiyun *
358*4882a593Smuzhiyun *
359*4882a593Smuzhiyun * Output:	None
360*4882a593Smuzhiyun * Return:		None
361*4882a593Smuzhiyun * Note:		This function is equal to "PutRFRegSetting" in PHY programming guide
362*4882a593Smuzhiyun */
363*4882a593Smuzhiyun void
PHY_SetRFReg_8723D(PADAPTER Adapter,enum rf_path eRFPath,u32 RegAddr,u32 BitMask,u32 Data)364*4882a593Smuzhiyun PHY_SetRFReg_8723D(
365*4882a593Smuzhiyun 		PADAPTER			Adapter,
366*4882a593Smuzhiyun 		enum rf_path			eRFPath,
367*4882a593Smuzhiyun 		u32				RegAddr,
368*4882a593Smuzhiyun 		u32				BitMask,
369*4882a593Smuzhiyun 		u32				Data
370*4882a593Smuzhiyun )
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun 	u32		Original_Value, BitShift;
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun #if (DISABLE_BB_RF == 1)
375*4882a593Smuzhiyun 	return;
376*4882a593Smuzhiyun #endif
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	/* RF data is 12 bits only */
379*4882a593Smuzhiyun 	if (BitMask != bRFRegOffsetMask) {
380*4882a593Smuzhiyun 		Original_Value = phy_RFSerialRead_8723D(Adapter, eRFPath, RegAddr);
381*4882a593Smuzhiyun 		BitShift =  phy_CalculateBitShift(BitMask);
382*4882a593Smuzhiyun 		Data = ((Original_Value & (~BitMask)) | (Data << BitShift));
383*4882a593Smuzhiyun 	}
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	phy_RFSerialWrite_8723D(Adapter, eRFPath, RegAddr, Data);
386*4882a593Smuzhiyun }
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun /*
390*4882a593Smuzhiyun  * 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt.
391*4882a593Smuzhiyun  *   */
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun /*-----------------------------------------------------------------------------
395*4882a593Smuzhiyun  * Function:    PHY_MACConfig8192C
396*4882a593Smuzhiyun  *
397*4882a593Smuzhiyun  * Overview:	Condig MAC by header file or parameter file.
398*4882a593Smuzhiyun  *
399*4882a593Smuzhiyun  * Input:       NONE
400*4882a593Smuzhiyun  *
401*4882a593Smuzhiyun  * Output:      NONE
402*4882a593Smuzhiyun  *
403*4882a593Smuzhiyun  * Return:      NONE
404*4882a593Smuzhiyun  *
405*4882a593Smuzhiyun  * Revised History:
406*4882a593Smuzhiyun  *  When		Who		Remark
407*4882a593Smuzhiyun  *  08/12/2008	MHC		Create Version 0.
408*4882a593Smuzhiyun  *
409*4882a593Smuzhiyun  *---------------------------------------------------------------------------*/
PHY_MACConfig8723D(PADAPTER Adapter)410*4882a593Smuzhiyun s32 PHY_MACConfig8723D(PADAPTER Adapter)
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun 	int		rtStatus = _SUCCESS;
413*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(Adapter);
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	/* */
416*4882a593Smuzhiyun 	/* Config MAC */
417*4882a593Smuzhiyun 	/* */
418*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
419*4882a593Smuzhiyun 	rtStatus = phy_ConfigMACWithParaFile(Adapter, PHY_FILE_MAC_REG);
420*4882a593Smuzhiyun 	if (rtStatus == _FAIL)
421*4882a593Smuzhiyun #endif
422*4882a593Smuzhiyun 	{
423*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
424*4882a593Smuzhiyun 		odm_config_mac_with_header_file(&pHalData->odmpriv);
425*4882a593Smuzhiyun 		rtStatus = _SUCCESS;
426*4882a593Smuzhiyun #endif/* CONFIG_EMBEDDED_FWIMG */
427*4882a593Smuzhiyun 	}
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 	return rtStatus;
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun /**
433*4882a593Smuzhiyun * Function:	phy_InitBBRFRegisterDefinition
434*4882a593Smuzhiyun *
435*4882a593Smuzhiyun * OverView:	Initialize Register definition offset for Radio Path A/B/C/D
436*4882a593Smuzhiyun *
437*4882a593Smuzhiyun * Input:
438*4882a593Smuzhiyun *			PADAPTER		Adapter,
439*4882a593Smuzhiyun *
440*4882a593Smuzhiyun * Output:	None
441*4882a593Smuzhiyun * Return:		None
442*4882a593Smuzhiyun * Note:		The initialization value is constant and it should never be changes
443*4882a593Smuzhiyun */
444*4882a593Smuzhiyun static	void
phy_InitBBRFRegisterDefinition(PADAPTER Adapter)445*4882a593Smuzhiyun phy_InitBBRFRegisterDefinition(
446*4882a593Smuzhiyun 		PADAPTER		Adapter
447*4882a593Smuzhiyun )
448*4882a593Smuzhiyun {
449*4882a593Smuzhiyun 	HAL_DATA_TYPE		*pHalData = GET_HAL_DATA(Adapter);
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	/* RF Interface Sowrtware Control */
452*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 LSBs if read 32-bit from 0x870 */
453*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	/* RF Interface Output (and Enable) */
456*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x860 */
457*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x864 */
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 	/* RF Interface (Output and)  Enable */
460*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */
461*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; /* LSSI Parameter */
464*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;  /* wire control parameter2 */
467*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;  /* wire control parameter2 */
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun 	/* Tranceiver Readback LSSI/HSPI mode */
470*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
471*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
472*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
473*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun static	int
phy_BB8723d_Config_ParaFile(PADAPTER Adapter)478*4882a593Smuzhiyun phy_BB8723d_Config_ParaFile(
479*4882a593Smuzhiyun 		PADAPTER	Adapter
480*4882a593Smuzhiyun )
481*4882a593Smuzhiyun {
482*4882a593Smuzhiyun 	HAL_DATA_TYPE		*pHalData = GET_HAL_DATA(Adapter);
483*4882a593Smuzhiyun 	int			rtStatus = _SUCCESS;
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 	/* */
486*4882a593Smuzhiyun 	/* 1. Read PHY_REG.TXT BB INIT!! */
487*4882a593Smuzhiyun 	/* */
488*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
489*4882a593Smuzhiyun 	if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_PHY_REG, CONFIG_BB_PHY_REG) == _FAIL)
490*4882a593Smuzhiyun #endif
491*4882a593Smuzhiyun 	{
492*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
493*4882a593Smuzhiyun 		if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG))
494*4882a593Smuzhiyun 			rtStatus = _FAIL;
495*4882a593Smuzhiyun #endif
496*4882a593Smuzhiyun 	}
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	if (rtStatus != _SUCCESS) {
499*4882a593Smuzhiyun 		RTW_INFO("%s():Write BB Reg Fail!!", __func__);
500*4882a593Smuzhiyun 		goto phy_BB8190_Config_ParaFile_Fail;
501*4882a593Smuzhiyun 	}
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun #if MP_DRIVER == 1
504*4882a593Smuzhiyun 	if (Adapter->registrypriv.mp_mode == 1) {
505*4882a593Smuzhiyun 		/*20160504, Suggested by jessica_wang. To Fix CCK ACPR issue*/
506*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, 0xCE0, BIT1|BIT0, 0);/*RXHP=low corner*/
507*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, 0xC3C, 0xFF, 0xCC);/*make sure low rate sensitivity*/
508*4882a593Smuzhiyun 	}
509*4882a593Smuzhiyun #endif	/*  #if (MP_DRIVER == 1) */
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 	/* */
512*4882a593Smuzhiyun 	/* 2. Read BB AGC table Initialization */
513*4882a593Smuzhiyun 	/* */
514*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
515*4882a593Smuzhiyun 	if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_AGC_TAB, CONFIG_BB_AGC_TAB) == _FAIL)
516*4882a593Smuzhiyun #endif
517*4882a593Smuzhiyun 	{
518*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
519*4882a593Smuzhiyun 		if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_AGC_TAB))
520*4882a593Smuzhiyun 			rtStatus = _FAIL;
521*4882a593Smuzhiyun #endif
522*4882a593Smuzhiyun 	}
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	if (rtStatus != _SUCCESS) {
525*4882a593Smuzhiyun 		RTW_INFO("%s():AGC Table Fail\n", __func__);
526*4882a593Smuzhiyun 		goto phy_BB8190_Config_ParaFile_Fail;
527*4882a593Smuzhiyun 	}
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun phy_BB8190_Config_ParaFile_Fail:
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	return rtStatus;
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun int
PHY_BBConfig8723D(PADAPTER Adapter)536*4882a593Smuzhiyun PHY_BBConfig8723D(
537*4882a593Smuzhiyun 		PADAPTER Adapter
538*4882a593Smuzhiyun )
539*4882a593Smuzhiyun {
540*4882a593Smuzhiyun 	int	rtStatus = _SUCCESS;
541*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(Adapter);
542*4882a593Smuzhiyun 	u16	RegVal;
543*4882a593Smuzhiyun 	u8	TmpU1B = 0;
544*4882a593Smuzhiyun 	u8	value8;
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun 	phy_InitBBRFRegisterDefinition(Adapter);
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 	/* Enable BB and RF */
549*4882a593Smuzhiyun 	RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN);
550*4882a593Smuzhiyun 	RegVal |= FEN_EN_25_1 | FEN_BB_GLB_RSTn | FEN_BBRSTB;
551*4882a593Smuzhiyun 	rtw_write16(Adapter, REG_SYS_FUNC_EN, RegVal);
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	rtw_write8(Adapter, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun #if defined(CONFIG_PCI_HCI)
556*4882a593Smuzhiyun 	rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE | FEN_BB_GLB_RSTn | FEN_BBRSTB);
557*4882a593Smuzhiyun #endif
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
560*4882a593Smuzhiyun 	/* To Fix MAC loopback mode fail. Suggested by SD4 Johnny. 2010.03.23. */
561*4882a593Smuzhiyun 	PlatformEFIOWrite1Byte(Adapter, REG_LDOHCI12_CTRL, 0x0f);
562*4882a593Smuzhiyun 	PlatformEFIOWrite1Byte(Adapter, 0x15, 0xe9);
563*4882a593Smuzhiyun #endif
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun 	rtw_write8(Adapter, REG_AFE_XTAL_CTRL + 1, 0x80);
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun 	/*
568*4882a593Smuzhiyun 	 * Config BB and AGC
569*4882a593Smuzhiyun 	 */
570*4882a593Smuzhiyun 	rtStatus = phy_BB8723d_Config_ParaFile(Adapter);
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun 	if (rtw_phydm_set_crystal_cap(Adapter, pHalData->crystal_cap) == _FALSE) {
573*4882a593Smuzhiyun 		RTW_ERR("Init crystal_cap failed\n");
574*4882a593Smuzhiyun 		rtw_warn_on(1);
575*4882a593Smuzhiyun 		rtStatus = _FAIL;
576*4882a593Smuzhiyun 	}
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun 	return rtStatus;
579*4882a593Smuzhiyun }
580*4882a593Smuzhiyun #if 0
581*4882a593Smuzhiyun /* Block & Path enable */
582*4882a593Smuzhiyun #define		rOFDMCCKEN_Jaguar		0x808 /* OFDM/CCK block enable */
583*4882a593Smuzhiyun #define		bOFDMEN_Jaguar			0x20000000
584*4882a593Smuzhiyun #define		bCCKEN_Jaguar			0x10000000
585*4882a593Smuzhiyun #define		rRxPath_Jaguar			0x808	/* Rx antenna */
586*4882a593Smuzhiyun #define		bRxPath_Jaguar			0xff
587*4882a593Smuzhiyun #define		rTxPath_Jaguar			0x80c	/* Tx antenna */
588*4882a593Smuzhiyun #define		bTxPath_Jaguar			0x0fffffff
589*4882a593Smuzhiyun #define		rCCK_RX_Jaguar			0xa04	/* for cck rx path selection */
590*4882a593Smuzhiyun #define		bCCK_RX_Jaguar			0x0c000000
591*4882a593Smuzhiyun #define		rVhtlen_Use_Lsig_Jaguar	0x8c3	/* Use LSIG for VHT length */
592*4882a593Smuzhiyun void
593*4882a593Smuzhiyun PHY_BB8723D_Config_1T(
594*4882a593Smuzhiyun 		PADAPTER Adapter
595*4882a593Smuzhiyun )
596*4882a593Smuzhiyun {
597*4882a593Smuzhiyun 	/* BB OFDM RX Path_A */
598*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rRxPath_Jaguar, bRxPath_Jaguar, 0x11);
599*4882a593Smuzhiyun 	/* BB OFDM TX Path_A */
600*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rTxPath_Jaguar, bMaskLWord, 0x1111);
601*4882a593Smuzhiyun 	/* BB CCK R/Rx Path_A */
602*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0);
603*4882a593Smuzhiyun 	/* MCS support */
604*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0x8bc, 0xc0000060, 0x4);
605*4882a593Smuzhiyun 	/* RF Path_B HSSI OFF */
606*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0xe00, 0xf, 0x4);
607*4882a593Smuzhiyun 	/* RF Path_B Power Down */
608*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0xe90, bMaskDWord, 0);
609*4882a593Smuzhiyun 	/* ADDA Path_B OFF */
610*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0);
611*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0xe64, bMaskDWord, 0);
612*4882a593Smuzhiyun }
613*4882a593Smuzhiyun #endif
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun int
PHY_RFConfig8723D(PADAPTER Adapter)616*4882a593Smuzhiyun PHY_RFConfig8723D(
617*4882a593Smuzhiyun 		PADAPTER	Adapter
618*4882a593Smuzhiyun )
619*4882a593Smuzhiyun {
620*4882a593Smuzhiyun 	int		rtStatus = _SUCCESS;
621*4882a593Smuzhiyun 	int cnt;
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	/* */
624*4882a593Smuzhiyun 	/* RF config */
625*4882a593Smuzhiyun 	/* */
626*4882a593Smuzhiyun 	rtStatus = PHY_RF6052_Config8723D(Adapter);
627*4882a593Smuzhiyun 	/* 20151207 LCK done at RadioA table */
628*4882a593Smuzhiyun 	/* PHY_BB8723D_Config_1T(Adapter); */
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 	/* poll LCK triggered by Radio A table */
631*4882a593Smuzhiyun 	for (cnt = 0; cnt < 100; cnt++) {
632*4882a593Smuzhiyun 		if (phy_query_rf_reg(Adapter, RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)
633*4882a593Smuzhiyun 			break;
634*4882a593Smuzhiyun 		rtw_mdelay_os(10);
635*4882a593Smuzhiyun 	}
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun 	if (cnt == 100)
638*4882a593Smuzhiyun 		RTW_WARN("LCK timeout\n");
639*4882a593Smuzhiyun 	RTW_INFO("LCK cnt=%d\n", cnt);
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun 	return rtStatus;
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun /*-----------------------------------------------------------------------------
645*4882a593Smuzhiyun  * Function:    PHY_ConfigRFWithParaFile()
646*4882a593Smuzhiyun  *
647*4882a593Smuzhiyun  * Overview:    This function read RF parameters from general file format, and do RF 3-wire
648*4882a593Smuzhiyun  *
649*4882a593Smuzhiyun  * Input:	PADAPTER			Adapter
650*4882a593Smuzhiyun  *			ps1Byte				pFileName
651*4882a593Smuzhiyun  *			enum rf_path				eRFPath
652*4882a593Smuzhiyun  *
653*4882a593Smuzhiyun  * Output:      NONE
654*4882a593Smuzhiyun  *
655*4882a593Smuzhiyun  * Return:      RT_STATUS_SUCCESS: configuration file exist
656*4882a593Smuzhiyun  *
657*4882a593Smuzhiyun  * Note:		Delay may be required for RF configuration
658*4882a593Smuzhiyun  *---------------------------------------------------------------------------*/
659*4882a593Smuzhiyun int
PHY_ConfigRFWithParaFile_8723D(PADAPTER Adapter,u8 * pFileName,enum rf_path eRFPath)660*4882a593Smuzhiyun PHY_ConfigRFWithParaFile_8723D(
661*4882a593Smuzhiyun 		PADAPTER			Adapter,
662*4882a593Smuzhiyun 		u8					*pFileName,
663*4882a593Smuzhiyun 	enum rf_path				eRFPath
664*4882a593Smuzhiyun )
665*4882a593Smuzhiyun {
666*4882a593Smuzhiyun 	return _SUCCESS;
667*4882a593Smuzhiyun }
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun /**************************************************************************************************************
670*4882a593Smuzhiyun  *   Description:
671*4882a593Smuzhiyun  *       The low-level interface to set TxAGC , called by both MP and Normal Driver.
672*4882a593Smuzhiyun  *
673*4882a593Smuzhiyun  *                                                                                    <20120830, Kordan>
674*4882a593Smuzhiyun  **************************************************************************************************************/
675*4882a593Smuzhiyun 
676*4882a593Smuzhiyun void
PHY_SetTxPowerIndex_8723D(PADAPTER Adapter,u32 PowerIndex,enum rf_path RFPath,u8 Rate)677*4882a593Smuzhiyun PHY_SetTxPowerIndex_8723D(
678*4882a593Smuzhiyun 		PADAPTER			Adapter,
679*4882a593Smuzhiyun 		u32					PowerIndex,
680*4882a593Smuzhiyun 		enum rf_path			RFPath,
681*4882a593Smuzhiyun 		u8					Rate
682*4882a593Smuzhiyun )
683*4882a593Smuzhiyun {
684*4882a593Smuzhiyun 	if (RFPath == RF_PATH_A || RFPath == RF_PATH_B) {
685*4882a593Smuzhiyun 		switch (Rate) {
686*4882a593Smuzhiyun 		case MGN_1M:
687*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_CCK1_Mcs32,      bMaskByte1, PowerIndex);
688*4882a593Smuzhiyun 			break;
689*4882a593Smuzhiyun 		case MGN_2M:
690*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte1, PowerIndex);
691*4882a593Smuzhiyun 			break;
692*4882a593Smuzhiyun 		case MGN_5_5M:
693*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte2, PowerIndex);
694*4882a593Smuzhiyun 			break;
695*4882a593Smuzhiyun 		case MGN_11M:
696*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte3, PowerIndex);
697*4882a593Smuzhiyun 			break;
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun 		case MGN_6M:
700*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte0, PowerIndex);
701*4882a593Smuzhiyun 			break;
702*4882a593Smuzhiyun 		case MGN_9M:
703*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte1, PowerIndex);
704*4882a593Smuzhiyun 			break;
705*4882a593Smuzhiyun 		case MGN_12M:
706*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte2, PowerIndex);
707*4882a593Smuzhiyun 			break;
708*4882a593Smuzhiyun 		case MGN_18M:
709*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte3, PowerIndex);
710*4882a593Smuzhiyun 			break;
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun 		case MGN_24M:
713*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte0, PowerIndex);
714*4882a593Smuzhiyun 			break;
715*4882a593Smuzhiyun 		case MGN_36M:
716*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte1, PowerIndex);
717*4882a593Smuzhiyun 			break;
718*4882a593Smuzhiyun 		case MGN_48M:
719*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte2, PowerIndex);
720*4882a593Smuzhiyun 			break;
721*4882a593Smuzhiyun 		case MGN_54M:
722*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte3, PowerIndex);
723*4882a593Smuzhiyun 			break;
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun 		case MGN_MCS0:
726*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte0, PowerIndex);
727*4882a593Smuzhiyun 			break;
728*4882a593Smuzhiyun 		case MGN_MCS1:
729*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte1, PowerIndex);
730*4882a593Smuzhiyun 			break;
731*4882a593Smuzhiyun 		case MGN_MCS2:
732*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte2, PowerIndex);
733*4882a593Smuzhiyun 			break;
734*4882a593Smuzhiyun 		case MGN_MCS3:
735*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte3, PowerIndex);
736*4882a593Smuzhiyun 			break;
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun 		case MGN_MCS4:
739*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte0, PowerIndex);
740*4882a593Smuzhiyun 			break;
741*4882a593Smuzhiyun 		case MGN_MCS5:
742*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte1, PowerIndex);
743*4882a593Smuzhiyun 			break;
744*4882a593Smuzhiyun 		case MGN_MCS6:
745*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte2, PowerIndex);
746*4882a593Smuzhiyun 			break;
747*4882a593Smuzhiyun 		case MGN_MCS7:
748*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte3, PowerIndex);
749*4882a593Smuzhiyun 			break;
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun 		default:
752*4882a593Smuzhiyun 			RTW_INFO("Invalid Rate!!\n");
753*4882a593Smuzhiyun 			break;
754*4882a593Smuzhiyun 		}
755*4882a593Smuzhiyun 	}
756*4882a593Smuzhiyun }
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun void
PHY_SetTxPowerLevel8723D(PADAPTER Adapter,u8 Channel)759*4882a593Smuzhiyun PHY_SetTxPowerLevel8723D(
760*4882a593Smuzhiyun 		PADAPTER		Adapter,
761*4882a593Smuzhiyun 		u8				Channel
762*4882a593Smuzhiyun )
763*4882a593Smuzhiyun {
764*4882a593Smuzhiyun 	PHAL_DATA_TYPE	pHalData = GET_HAL_DATA(Adapter);
765*4882a593Smuzhiyun 	u8				cur_antenna;
766*4882a593Smuzhiyun 	enum rf_path		RFPath = RF_PATH_A;
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun #ifdef CONFIG_ANTENNA_DIVERSITY
769*4882a593Smuzhiyun 	rtw_hal_get_odm_var(Adapter, HAL_ODM_ANTDIV_SELECT, &cur_antenna, NULL);
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun 	if (pHalData->AntDivCfg)  /* antenna diversity Enable */
772*4882a593Smuzhiyun 		RFPath = ((cur_antenna == MAIN_ANT) ? RF_PATH_A : RF_PATH_B);
773*4882a593Smuzhiyun 	else   /* antenna diversity disable */
774*4882a593Smuzhiyun #endif
775*4882a593Smuzhiyun 		RFPath = pHalData->ant_path;
776*4882a593Smuzhiyun 
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 	phy_set_tx_power_level_by_path(Adapter, Channel, RFPath);
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun }
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun /* <20160217, Jessica> A workaround to eliminate the 2472MHz & 2484MHz spur of 8723D. */
784*4882a593Smuzhiyun void
phy_SpurCalibration_8723D(PADAPTER pAdapter,u8 ToChannel,u8 threshold)785*4882a593Smuzhiyun phy_SpurCalibration_8723D(
786*4882a593Smuzhiyun 		PADAPTER					pAdapter,
787*4882a593Smuzhiyun 		u8						ToChannel,
788*4882a593Smuzhiyun 		u8						threshold
789*4882a593Smuzhiyun )
790*4882a593Smuzhiyun {
791*4882a593Smuzhiyun 	u32		freq[2] = {0xFCCD, 0xFF9A}; /* {chnl 13, 14} */
792*4882a593Smuzhiyun 	u8		idx = 0xFF;
793*4882a593Smuzhiyun 	u8		b_doNotch = FALSE;
794*4882a593Smuzhiyun 	u8		initial_gain;
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun 	/* add for notch */
797*4882a593Smuzhiyun 	u32				wlan_channel, CurrentChannel;
798*4882a593Smuzhiyun 	HAL_DATA_TYPE		*pHalData	= GET_HAL_DATA(pAdapter);
799*4882a593Smuzhiyun 	struct dm_struct		*pDM_Odm = &(pHalData->odmpriv);
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	/* check threshold */
802*4882a593Smuzhiyun 	if (threshold <= 0x0)
803*4882a593Smuzhiyun 		threshold = 0x16;
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 	RTW_DBG("===>phy_SpurCalibration_8723D: Channel = %d\n", ToChannel);
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun 	if (ToChannel == 13)
808*4882a593Smuzhiyun 		idx = 0;
809*4882a593Smuzhiyun 	else if (ToChannel == 14)
810*4882a593Smuzhiyun 		idx = 1;
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	/* If current channel=13,14 */
813*4882a593Smuzhiyun 	if (idx < 0xFF) {
814*4882a593Smuzhiyun 		initial_gain = (u8)(odm_get_bb_reg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0) & 0x7f);
815*4882a593Smuzhiyun 		odm_pause_dig(pDM_Odm, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_1, 0x30);
816*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccf000c0);		/* disable 3-wire */
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, freq[idx]);				/* Setup PSD */
819*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, 0x400000 | freq[idx]); /* Start PSD	 */
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 		rtw_msleep_os(30);
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun 		if (phy_query_bb_reg(pAdapter, rFPGA0_PSDReport, bMaskDWord) >= threshold)
824*4882a593Smuzhiyun 			b_doNotch = TRUE;
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, freq[idx]); /* turn off PSD */
827*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccc000c0);	/* enable 3-wire */
828*4882a593Smuzhiyun 		odm_pause_dig(pDM_Odm, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_1, NONE);
829*4882a593Smuzhiyun 	}
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun 	/* --- Notch Filter --- Asked by Rock	 */
832*4882a593Smuzhiyun 	if (b_doNotch) {
833*4882a593Smuzhiyun 		CurrentChannel = odm_get_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
834*4882a593Smuzhiyun 		wlan_channel   = CurrentChannel & 0x0f;						    /* Get center frequency */
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun 		switch (wlan_channel) {											/* Set notch filter				 */
837*4882a593Smuzhiyun 		case 13:
838*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24), 0xB);
839*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT(9), 0x1);                    /* enable notch filter */
840*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x04000000);
841*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
842*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
843*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
844*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT(28), 0x1);                   /* enable CSI mask */
845*4882a593Smuzhiyun 			break;
846*4882a593Smuzhiyun 		case 14:
847*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24), 0x5);
848*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT(9), 0x1);                   /* enable notch filter */
849*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
850*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
851*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
852*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00080000);
853*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT(28), 0x1);                   /* enable CSI mask */
854*4882a593Smuzhiyun 			break;
855*4882a593Smuzhiyun 		default:
856*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT(9), 0x0);						/* disable notch filter */
857*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT(28), 0x0);                   /* disable CSI mask	function */
858*4882a593Smuzhiyun 			break;
859*4882a593Smuzhiyun 		} /* switch(wlan_channel)	 */
860*4882a593Smuzhiyun 		return;
861*4882a593Smuzhiyun 	}
862*4882a593Smuzhiyun 
863*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xC40, BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24), 0x1f);
864*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xC40, BIT(9), 0x0);                     /* disable notch filter */
865*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
866*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
867*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
868*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
869*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xD2C, BIT(28), 0x0);                    /* disable CSI mask */
870*4882a593Smuzhiyun }
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun void
phy_SetRegBW_8723D(PADAPTER Adapter,enum channel_width CurrentBW)873*4882a593Smuzhiyun phy_SetRegBW_8723D(
874*4882a593Smuzhiyun 		PADAPTER		Adapter,
875*4882a593Smuzhiyun 	enum channel_width	CurrentBW
876*4882a593Smuzhiyun )
877*4882a593Smuzhiyun {
878*4882a593Smuzhiyun 	u16	RegRfMod_BW, u2tmp = 0;
879*4882a593Smuzhiyun 
880*4882a593Smuzhiyun 	RegRfMod_BW = rtw_read16(Adapter, REG_TRXPTCL_CTL_8723D);
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun 	switch (CurrentBW) {
883*4882a593Smuzhiyun 	case CHANNEL_WIDTH_20:
884*4882a593Smuzhiyun 		rtw_write16(Adapter, REG_TRXPTCL_CTL_8723D, (RegRfMod_BW & 0xFE7F)); /* BIT 7 = 0, BIT 8 = 0 */
885*4882a593Smuzhiyun 		break;
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun 	case CHANNEL_WIDTH_40:
888*4882a593Smuzhiyun 		u2tmp = RegRfMod_BW | BIT(7);
889*4882a593Smuzhiyun 		rtw_write16(Adapter, REG_TRXPTCL_CTL_8723D, (u2tmp & 0xFEFF)); /* BIT 7 = 1, BIT 8 = 0 */
890*4882a593Smuzhiyun 		break;
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun 	case CHANNEL_WIDTH_80:
893*4882a593Smuzhiyun 		u2tmp = RegRfMod_BW | BIT(8);
894*4882a593Smuzhiyun 		rtw_write16(Adapter, REG_TRXPTCL_CTL_8723D, (u2tmp & 0xFF7F)); /* BIT 7 = 0, BIT 8 = 1 */
895*4882a593Smuzhiyun 		break;
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun 	default:
898*4882a593Smuzhiyun 		RTW_INFO("phy_PostSetBWMode8723D():	unknown Bandwidth: %#X\n", CurrentBW);
899*4882a593Smuzhiyun 		break;
900*4882a593Smuzhiyun 	}
901*4882a593Smuzhiyun }
902*4882a593Smuzhiyun 
903*4882a593Smuzhiyun u8
phy_GetSecondaryChnl_8723D(PADAPTER Adapter)904*4882a593Smuzhiyun phy_GetSecondaryChnl_8723D(
905*4882a593Smuzhiyun 		PADAPTER	Adapter
906*4882a593Smuzhiyun )
907*4882a593Smuzhiyun {
908*4882a593Smuzhiyun 	u8	SCSettingOf40 = 0, SCSettingOf20 = 0;
909*4882a593Smuzhiyun 	PHAL_DATA_TYPE	pHalData = GET_HAL_DATA(Adapter);
910*4882a593Smuzhiyun 
911*4882a593Smuzhiyun 	if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) {
912*4882a593Smuzhiyun 		if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
913*4882a593Smuzhiyun 			SCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
914*4882a593Smuzhiyun 		else if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
915*4882a593Smuzhiyun 			SCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
916*4882a593Smuzhiyun 
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun 		if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
919*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
920*4882a593Smuzhiyun 		else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
921*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
922*4882a593Smuzhiyun 		else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
923*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
924*4882a593Smuzhiyun 		else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
925*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun 	} else if (pHalData->current_channel_bw == CHANNEL_WIDTH_40) {
928*4882a593Smuzhiyun 
929*4882a593Smuzhiyun 		if (pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
930*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
931*4882a593Smuzhiyun 		else if (pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
932*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun 	}
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun 	return (SCSettingOf40 << 4) | SCSettingOf20;
937*4882a593Smuzhiyun }
938*4882a593Smuzhiyun 
939*4882a593Smuzhiyun void
phy_PostSetBwMode8723D(PADAPTER padapter)940*4882a593Smuzhiyun phy_PostSetBwMode8723D(
941*4882a593Smuzhiyun 		PADAPTER padapter
942*4882a593Smuzhiyun )
943*4882a593Smuzhiyun {
944*4882a593Smuzhiyun 	u8 SubChnlNum = 0;
945*4882a593Smuzhiyun 	HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun 	/* 2 Set Reg668 Reg440 BW */
948*4882a593Smuzhiyun 	phy_SetRegBW_8723D(padapter, pHalData->current_channel_bw);
949*4882a593Smuzhiyun 
950*4882a593Smuzhiyun 	/* 3 Set Reg483 */
951*4882a593Smuzhiyun 	SubChnlNum = phy_GetSecondaryChnl_8723D(padapter);
952*4882a593Smuzhiyun 	rtw_write8(padapter, REG_DATA_SC_8723D, SubChnlNum);
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun 	switch (pHalData->current_channel_bw) {
955*4882a593Smuzhiyun 	/* 20 MHz channel*/
956*4882a593Smuzhiyun 	case CHANNEL_WIDTH_20:
957*4882a593Smuzhiyun 		/*
958*4882a593Smuzhiyun 		0x800[0]=1'b0
959*4882a593Smuzhiyun 		0x900[0]=1'b0
960*4882a593Smuzhiyun 		0x954[19]=1'b1
961*4882a593Smuzhiyun 		0x954[27:24]= 10
962*4882a593Smuzhiyun 		*/
963*4882a593Smuzhiyun 		phy_set_bb_reg(padapter, rFPGA0_RFMOD, bRFMOD, 0x0);
964*4882a593Smuzhiyun 		phy_set_bb_reg(padapter, rFPGA1_RFMOD, bRFMOD, 0x0);
965*4882a593Smuzhiyun 		phy_set_bb_reg(padapter, rBBrx_DFIR, BIT(19), 1);
966*4882a593Smuzhiyun 		phy_set_bb_reg(padapter, rBBrx_DFIR,
967*4882a593Smuzhiyun 			     (BIT(27) | BIT(26) | BIT(25) | BIT(24)), 0xa);
968*4882a593Smuzhiyun 		break;
969*4882a593Smuzhiyun 	/* 40 MHz channel*/
970*4882a593Smuzhiyun 	case CHANNEL_WIDTH_40:
971*4882a593Smuzhiyun 		/*
972*4882a593Smuzhiyun 		0x800[0]=1'b1
973*4882a593Smuzhiyun 		0x900[0]=1'b1
974*4882a593Smuzhiyun 		0x954[19]=1'b0
975*4882a593Smuzhiyun 		0x954[23:20]=2'b11(For ACPR)
976*4882a593Smuzhiyun 		0xa00[4]=1/0
977*4882a593Smuzhiyun 		*/
978*4882a593Smuzhiyun 		phy_set_bb_reg(padapter, rFPGA0_RFMOD, bRFMOD, 0x1);
979*4882a593Smuzhiyun 		phy_set_bb_reg(padapter, rFPGA1_RFMOD, bRFMOD, 0x1);
980*4882a593Smuzhiyun 		phy_set_bb_reg(padapter, rBBrx_DFIR, BIT(19), 0);
981*4882a593Smuzhiyun 		phy_set_bb_reg(padapter, rCCK0_System, bCCKSideBand,
982*4882a593Smuzhiyun 			     (pHalData->nCur40MhzPrimeSC >> 1));
983*4882a593Smuzhiyun 
984*4882a593Smuzhiyun 		break;
985*4882a593Smuzhiyun 	default:
986*4882a593Smuzhiyun 		break;
987*4882a593Smuzhiyun 	}
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun 	/*3<3>Set RF related register */
990*4882a593Smuzhiyun 	PHY_RF6052SetBandwidth8723D(padapter, pHalData->current_channel_bw);
991*4882a593Smuzhiyun }
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun void
phy_SwChnl8723D(PADAPTER pAdapter)994*4882a593Smuzhiyun phy_SwChnl8723D(
995*4882a593Smuzhiyun 		PADAPTER					pAdapter
996*4882a593Smuzhiyun )
997*4882a593Smuzhiyun {
998*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(pAdapter);
999*4882a593Smuzhiyun 	u8		channelToSW = pHalData->current_channel;
1000*4882a593Smuzhiyun 	u8		i = 0;
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun 	if (pHalData->rf_chip == RF_PSEUDO_11N) {
1003*4882a593Smuzhiyun 		RTW_WARN("phy_SwChnl8723D: return for PSEUDO\n");
1004*4882a593Smuzhiyun 		return;
1005*4882a593Smuzhiyun 	}
1006*4882a593Smuzhiyun 
1007*4882a593Smuzhiyun 	pHalData->RfRegChnlVal[0] =
1008*4882a593Smuzhiyun 		((pHalData->RfRegChnlVal[0] & 0xfffff00) | channelToSW);
1009*4882a593Smuzhiyun 	phy_set_rf_reg(pAdapter, RF_PATH_A, RF_CHNLBW,
1010*4882a593Smuzhiyun 		     0x3FF, pHalData->RfRegChnlVal[0]);
1011*4882a593Smuzhiyun 	phy_set_rf_reg(pAdapter, RF_PATH_B, RF_CHNLBW,
1012*4882a593Smuzhiyun 		     0x3FF, pHalData->RfRegChnlVal[0]);
1013*4882a593Smuzhiyun 
1014*4882a593Smuzhiyun 	phy_SpurCalibration_8723D(pAdapter, channelToSW, 0x16);
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun 	/* 2.4G CCK TX DFIR */
1017*4882a593Smuzhiyun 	/* 2016.01.20 Suggest from RS BB mingzhi*/
1018*4882a593Smuzhiyun 	if (channelToSW >= 1 && channelToSW <= 13) {
1019*4882a593Smuzhiyun 		if (pHalData->need_restore == _TRUE) {
1020*4882a593Smuzhiyun 			for (i = 0 ; i < 3 ; i++) {
1021*4882a593Smuzhiyun 				phy_set_bb_reg(pAdapter,
1022*4882a593Smuzhiyun 					     pHalData->RegForRecover[i].offset,
1023*4882a593Smuzhiyun 					     bMaskDWord,
1024*4882a593Smuzhiyun 					     pHalData->RegForRecover[i].value);
1025*4882a593Smuzhiyun 			}
1026*4882a593Smuzhiyun 			pHalData->need_restore = _FALSE;
1027*4882a593Smuzhiyun 		}
1028*4882a593Smuzhiyun 	} else if (channelToSW == 14) {
1029*4882a593Smuzhiyun 		pHalData->need_restore = _TRUE;
1030*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x0000B81C);
1031*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000000);
1032*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, 0xAAC, bMaskDWord, 0x00003667);
1033*4882a593Smuzhiyun 	}
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 	RTW_DBG("===>phy_SwChnl8723D: Channel = %d\n", channelToSW);
1036*4882a593Smuzhiyun }
1037*4882a593Smuzhiyun 
1038*4882a593Smuzhiyun void
phy_SwChnlAndSetBwMode8723D(PADAPTER Adapter)1039*4882a593Smuzhiyun phy_SwChnlAndSetBwMode8723D(
1040*4882a593Smuzhiyun 		PADAPTER		Adapter
1041*4882a593Smuzhiyun )
1042*4882a593Smuzhiyun {
1043*4882a593Smuzhiyun 	HAL_DATA_TYPE		*pHalData = GET_HAL_DATA(Adapter);
1044*4882a593Smuzhiyun 
1045*4882a593Smuzhiyun 	if (Adapter->bNotifyChannelChange) {
1046*4882a593Smuzhiyun 		RTW_INFO("[%s] bSwChnl=%d, ch=%d, bSetChnlBW=%d, bw=%d\n",
1047*4882a593Smuzhiyun 			 __func__,
1048*4882a593Smuzhiyun 			 pHalData->bSwChnl,
1049*4882a593Smuzhiyun 			 pHalData->current_channel,
1050*4882a593Smuzhiyun 			 pHalData->bSetChnlBW,
1051*4882a593Smuzhiyun 			 pHalData->current_channel_bw);
1052*4882a593Smuzhiyun 	}
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun 	if (RTW_CANNOT_RUN(Adapter))
1055*4882a593Smuzhiyun 		return;
1056*4882a593Smuzhiyun 
1057*4882a593Smuzhiyun 	if (pHalData->bSwChnl) {
1058*4882a593Smuzhiyun 		phy_SwChnl8723D(Adapter);
1059*4882a593Smuzhiyun 		pHalData->bSwChnl = _FALSE;
1060*4882a593Smuzhiyun 	}
1061*4882a593Smuzhiyun 
1062*4882a593Smuzhiyun 	if (pHalData->bSetChnlBW) {
1063*4882a593Smuzhiyun 		phy_PostSetBwMode8723D(Adapter);
1064*4882a593Smuzhiyun 		pHalData->bSetChnlBW = _FALSE;
1065*4882a593Smuzhiyun 	}
1066*4882a593Smuzhiyun 
1067*4882a593Smuzhiyun 	if (pHalData->bNeedIQK == _TRUE) {
1068*4882a593Smuzhiyun 		if (pHalData->neediqk_24g == _TRUE) {
1069*4882a593Smuzhiyun 
1070*4882a593Smuzhiyun 			halrf_iqk_trigger(&pHalData->odmpriv, _FALSE);
1071*4882a593Smuzhiyun 			pHalData->bIQKInitialized = _TRUE;
1072*4882a593Smuzhiyun 			pHalData->neediqk_24g = _FALSE;
1073*4882a593Smuzhiyun 		}
1074*4882a593Smuzhiyun 		pHalData->bNeedIQK = _FALSE;
1075*4882a593Smuzhiyun 	}
1076*4882a593Smuzhiyun 
1077*4882a593Smuzhiyun 	rtw_hal_set_tx_power_level(Adapter, pHalData->current_channel);
1078*4882a593Smuzhiyun }
1079*4882a593Smuzhiyun 
1080*4882a593Smuzhiyun void
PHY_HandleSwChnlAndSetBW8723D(PADAPTER Adapter,BOOLEAN bSwitchChannel,BOOLEAN bSetBandWidth,u8 ChannelNum,enum channel_width ChnlWidth,EXTCHNL_OFFSET ExtChnlOffsetOf40MHz,EXTCHNL_OFFSET ExtChnlOffsetOf80MHz,u8 CenterFrequencyIndex1)1081*4882a593Smuzhiyun PHY_HandleSwChnlAndSetBW8723D(
1082*4882a593Smuzhiyun 		PADAPTER			Adapter,
1083*4882a593Smuzhiyun 		BOOLEAN				bSwitchChannel,
1084*4882a593Smuzhiyun 		BOOLEAN				bSetBandWidth,
1085*4882a593Smuzhiyun 		u8					ChannelNum,
1086*4882a593Smuzhiyun 		enum channel_width	ChnlWidth,
1087*4882a593Smuzhiyun 		EXTCHNL_OFFSET	ExtChnlOffsetOf40MHz,
1088*4882a593Smuzhiyun 		EXTCHNL_OFFSET	ExtChnlOffsetOf80MHz,
1089*4882a593Smuzhiyun 		u8					CenterFrequencyIndex1
1090*4882a593Smuzhiyun )
1091*4882a593Smuzhiyun {
1092*4882a593Smuzhiyun 	/* static BOOLEAN		bInitialzed = _FALSE; */
1093*4882a593Smuzhiyun 	PHAL_DATA_TYPE		pHalData = GET_HAL_DATA(Adapter);
1094*4882a593Smuzhiyun 	u8					tmpChannel = pHalData->current_channel;
1095*4882a593Smuzhiyun 	enum channel_width	tmpBW = pHalData->current_channel_bw;
1096*4882a593Smuzhiyun 	u8					tmpnCur40MhzPrimeSC = pHalData->nCur40MhzPrimeSC;
1097*4882a593Smuzhiyun 	u8					tmpnCur80MhzPrimeSC = pHalData->nCur80MhzPrimeSC;
1098*4882a593Smuzhiyun 	u8					tmpCenterFrequencyIndex1 = pHalData->CurrentCenterFrequencyIndex1;
1099*4882a593Smuzhiyun 	struct mlme_ext_priv	*pmlmeext = &Adapter->mlmeextpriv;
1100*4882a593Smuzhiyun 
1101*4882a593Smuzhiyun 	/* RTW_INFO("=> PHY_HandleSwChnlAndSetBW8812: bSwitchChannel %d, bSetBandWidth %d\n",bSwitchChannel,bSetBandWidth); */
1102*4882a593Smuzhiyun 
1103*4882a593Smuzhiyun 	/* check is swchnl or setbw */
1104*4882a593Smuzhiyun 	if (!bSwitchChannel && !bSetBandWidth) {
1105*4882a593Smuzhiyun 		RTW_INFO("PHY_HandleSwChnlAndSetBW8812:  not switch channel and not set bandwidth\n");
1106*4882a593Smuzhiyun 		return;
1107*4882a593Smuzhiyun 	}
1108*4882a593Smuzhiyun 
1109*4882a593Smuzhiyun 	/* skip change for channel or bandwidth is the same */
1110*4882a593Smuzhiyun 	if (bSwitchChannel) {
1111*4882a593Smuzhiyun 		/* if(pHalData->current_channel != ChannelNum) */
1112*4882a593Smuzhiyun 		{
1113*4882a593Smuzhiyun 			if (HAL_IsLegalChannel(Adapter, ChannelNum))
1114*4882a593Smuzhiyun 				pHalData->bSwChnl = _TRUE;
1115*4882a593Smuzhiyun 		}
1116*4882a593Smuzhiyun 	}
1117*4882a593Smuzhiyun 
1118*4882a593Smuzhiyun 	if (bSetBandWidth) {
1119*4882a593Smuzhiyun #if 0
1120*4882a593Smuzhiyun 		if (bInitialzed == _FALSE) {
1121*4882a593Smuzhiyun 			bInitialzed = _TRUE;
1122*4882a593Smuzhiyun 			pHalData->bSetChnlBW = _TRUE;
1123*4882a593Smuzhiyun 		} else if ((pHalData->current_channel_bw != ChnlWidth) || (pHalData->nCur40MhzPrimeSC != ExtChnlOffsetOf40MHz) || (pHalData->CurrentCenterFrequencyIndex1 != CenterFrequencyIndex1))
1124*4882a593Smuzhiyun 			pHalData->bSetChnlBW = _TRUE;
1125*4882a593Smuzhiyun #else
1126*4882a593Smuzhiyun 		pHalData->bSetChnlBW = _TRUE;
1127*4882a593Smuzhiyun #endif
1128*4882a593Smuzhiyun 	}
1129*4882a593Smuzhiyun 
1130*4882a593Smuzhiyun 	if (!pHalData->bSetChnlBW && !pHalData->bSwChnl) {
1131*4882a593Smuzhiyun 		/* RTW_INFO("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d\n",pHalData->bSwChnl,pHalData->bSetChnlBW); */
1132*4882a593Smuzhiyun 		return;
1133*4882a593Smuzhiyun 	}
1134*4882a593Smuzhiyun 
1135*4882a593Smuzhiyun 
1136*4882a593Smuzhiyun 	if (pHalData->bSwChnl) {
1137*4882a593Smuzhiyun 		pHalData->current_channel = ChannelNum;
1138*4882a593Smuzhiyun 		pHalData->CurrentCenterFrequencyIndex1 = ChannelNum;
1139*4882a593Smuzhiyun 	}
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun 
1142*4882a593Smuzhiyun 	if (pHalData->bSetChnlBW) {
1143*4882a593Smuzhiyun 		pHalData->current_channel_bw = ChnlWidth;
1144*4882a593Smuzhiyun #if 0
1145*4882a593Smuzhiyun 		if (ExtChnlOffsetOf40MHz == EXTCHNL_OFFSET_LOWER)
1146*4882a593Smuzhiyun 			pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
1147*4882a593Smuzhiyun 		else if (ExtChnlOffsetOf40MHz == EXTCHNL_OFFSET_UPPER)
1148*4882a593Smuzhiyun 			pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
1149*4882a593Smuzhiyun 		else
1150*4882a593Smuzhiyun 			pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1151*4882a593Smuzhiyun 
1152*4882a593Smuzhiyun 		if (ExtChnlOffsetOf80MHz == EXTCHNL_OFFSET_LOWER)
1153*4882a593Smuzhiyun 			pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
1154*4882a593Smuzhiyun 		else if (ExtChnlOffsetOf80MHz == EXTCHNL_OFFSET_UPPER)
1155*4882a593Smuzhiyun 			pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
1156*4882a593Smuzhiyun 		else
1157*4882a593Smuzhiyun 			pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1158*4882a593Smuzhiyun #else
1159*4882a593Smuzhiyun 		pHalData->nCur40MhzPrimeSC = ExtChnlOffsetOf40MHz;
1160*4882a593Smuzhiyun 		pHalData->nCur80MhzPrimeSC = ExtChnlOffsetOf80MHz;
1161*4882a593Smuzhiyun #endif
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun 		pHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1;
1164*4882a593Smuzhiyun 	}
1165*4882a593Smuzhiyun 
1166*4882a593Smuzhiyun 	/* Switch workitem or set timer to do switch channel or setbandwidth operation */
1167*4882a593Smuzhiyun 	if (!RTW_CANNOT_RUN(Adapter))
1168*4882a593Smuzhiyun 		phy_SwChnlAndSetBwMode8723D(Adapter);
1169*4882a593Smuzhiyun 	else {
1170*4882a593Smuzhiyun 		if (pHalData->bSwChnl) {
1171*4882a593Smuzhiyun 			pHalData->current_channel = tmpChannel;
1172*4882a593Smuzhiyun 			pHalData->CurrentCenterFrequencyIndex1 = tmpChannel;
1173*4882a593Smuzhiyun 		}
1174*4882a593Smuzhiyun 		if (pHalData->bSetChnlBW) {
1175*4882a593Smuzhiyun 			pHalData->current_channel_bw = tmpBW;
1176*4882a593Smuzhiyun 			pHalData->nCur40MhzPrimeSC = tmpnCur40MhzPrimeSC;
1177*4882a593Smuzhiyun 			pHalData->nCur80MhzPrimeSC = tmpnCur80MhzPrimeSC;
1178*4882a593Smuzhiyun 			pHalData->CurrentCenterFrequencyIndex1 = tmpCenterFrequencyIndex1;
1179*4882a593Smuzhiyun 		}
1180*4882a593Smuzhiyun 	}
1181*4882a593Smuzhiyun 
1182*4882a593Smuzhiyun 	/* RTW_INFO("Channel %d ChannelBW %d ",pHalData->current_channel, pHalData->current_channel_bw); */
1183*4882a593Smuzhiyun 	/* RTW_INFO("40MhzPrimeSC %d 80MhzPrimeSC %d ",pHalData->nCur40MhzPrimeSC, pHalData->nCur80MhzPrimeSC); */
1184*4882a593Smuzhiyun 	/* RTW_INFO("CenterFrequencyIndex1 %d\n",pHalData->CurrentCenterFrequencyIndex1); */
1185*4882a593Smuzhiyun 
1186*4882a593Smuzhiyun 	/* RTW_INFO("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d\n",pHalData->bSwChnl,pHalData->bSetChnlBW); */
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun }
1189*4882a593Smuzhiyun 
1190*4882a593Smuzhiyun void
PHY_SetSwChnlBWMode8723D(PADAPTER Adapter,u8 channel,enum channel_width Bandwidth,u8 Offset40,u8 Offset80)1191*4882a593Smuzhiyun PHY_SetSwChnlBWMode8723D(
1192*4882a593Smuzhiyun 		PADAPTER			Adapter,
1193*4882a593Smuzhiyun 		u8					channel,
1194*4882a593Smuzhiyun 		enum channel_width	Bandwidth,
1195*4882a593Smuzhiyun 		u8					Offset40,
1196*4882a593Smuzhiyun 		u8					Offset80
1197*4882a593Smuzhiyun )
1198*4882a593Smuzhiyun {
1199*4882a593Smuzhiyun 	/* RTW_INFO("%s()===>\n",__FUNCTION__); */
1200*4882a593Smuzhiyun 
1201*4882a593Smuzhiyun 	PHY_HandleSwChnlAndSetBW8723D(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel);
1202*4882a593Smuzhiyun 
1203*4882a593Smuzhiyun 	/* RTW_INFO("<==%s()\n",__FUNCTION__); */
1204*4882a593Smuzhiyun }
1205*4882a593Smuzhiyun