xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8188fu/hal/rtl8188f/rtl8188f_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 _RTL8188F_PHYCFG_C_
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <rtl8188f_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,		The target address to be readback
80*4882a593Smuzhiyun *			u32			BitMask			The target bit position in the target address
81*4882a593Smuzhiyun *											to be readback
82*4882a593Smuzhiyun * Output:	None
83*4882a593Smuzhiyun * Return:		u32			Data		The readback register value
84*4882a593Smuzhiyun * Note:		This function is equal to "GetRegSetting" in PHY programming guide
85*4882a593Smuzhiyun */
86*4882a593Smuzhiyun u32
PHY_QueryBBReg_8188F(PADAPTER Adapter,u32 RegAddr,u32 BitMask)87*4882a593Smuzhiyun PHY_QueryBBReg_8188F(
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,		The target address to be modified
118*4882a593Smuzhiyun  *			u32			BitMask			The target bit position in the target address
119*4882a593Smuzhiyun  *											to be modified
120*4882a593Smuzhiyun  *			u32			Data			The new register value in the target bit position
121*4882a593Smuzhiyun  *											of the target address
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_8188F(PADAPTER Adapter,u32 RegAddr,u32 BitMask,u32 Data)129*4882a593Smuzhiyun PHY_SetBBReg_8188F(
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 /* 2. RF register R/W API */
157*4882a593Smuzhiyun /* */
158*4882a593Smuzhiyun static	u32
phy_RFSerialRead_8188F(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset)159*4882a593Smuzhiyun phy_RFSerialRead_8188F(
160*4882a593Smuzhiyun 		PADAPTER			Adapter,
161*4882a593Smuzhiyun 		enum rf_path			eRFPath,
162*4882a593Smuzhiyun 		u32				Offset
163*4882a593Smuzhiyun )
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun 	u32						retValue = 0;
166*4882a593Smuzhiyun 	HAL_DATA_TYPE				*pHalData = GET_HAL_DATA(Adapter);
167*4882a593Smuzhiyun 	BB_REGISTER_DEFINITION_T	*pPhyReg = &pHalData->PHYRegDef[eRFPath];
168*4882a593Smuzhiyun 	u32						NewOffset;
169*4882a593Smuzhiyun 	u32						tmplong, tmplong2;
170*4882a593Smuzhiyun 	u8					RfPiEnable = 0;
171*4882a593Smuzhiyun 	u32						MaskforPhySet = 0;
172*4882a593Smuzhiyun 	int i = 0;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	_enter_critical_mutex(&(adapter_to_dvobj(Adapter)->rf_read_reg_mutex) , NULL);
175*4882a593Smuzhiyun 	/* */
176*4882a593Smuzhiyun 	/* Make sure RF register offset is correct */
177*4882a593Smuzhiyun 	/* */
178*4882a593Smuzhiyun 	Offset &= 0xff;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	NewOffset = Offset;
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	if (eRFPath == RF_PATH_A) {
183*4882a593Smuzhiyun 		tmplong2 = phy_query_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord);
184*4882a593Smuzhiyun 		tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset << 23) | bLSSIReadEdge;	/*T65 RF */
185*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
186*4882a593Smuzhiyun 	} else {
187*4882a593Smuzhiyun 		tmplong2 = phy_query_bb_reg(Adapter, rFPGA0_XB_HSSIParameter2 | MaskforPhySet, bMaskDWord);
188*4882a593Smuzhiyun 		tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset << 23) | bLSSIReadEdge;	/*T65 RF */
189*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_XB_HSSIParameter2 | MaskforPhySet, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
190*4882a593Smuzhiyun 	}
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	tmplong2 = phy_query_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord);
193*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
194*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rFPGA0_XA_HSSIParameter2 | MaskforPhySet, bMaskDWord, tmplong2 | bLSSIReadEdge);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	rtw_udelay_os(10);
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 	for (i = 0; i < 2; i++)
199*4882a593Smuzhiyun 		rtw_udelay_os(MAX_STALL_TIME);
200*4882a593Smuzhiyun 	rtw_udelay_os(10);
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	if (eRFPath == RF_PATH_A)
203*4882a593Smuzhiyun 		RfPiEnable = (u8)phy_query_bb_reg(Adapter, rFPGA0_XA_HSSIParameter1 | MaskforPhySet, BIT8);
204*4882a593Smuzhiyun 	else if (eRFPath == RF_PATH_B)
205*4882a593Smuzhiyun 		RfPiEnable = (u8)phy_query_bb_reg(Adapter, rFPGA0_XB_HSSIParameter1 | MaskforPhySet, BIT8);
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	if (RfPiEnable) {
208*4882a593Smuzhiyun 		/* Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF */
209*4882a593Smuzhiyun 		retValue = phy_query_bb_reg(Adapter, pPhyReg->rfLSSIReadBackPi | MaskforPhySet, bLSSIReadBackData);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 		/*RT_DISP(FINIT, INIT_RF, ("Readback from RF-PI : 0x%x\n", retValue)); */
212*4882a593Smuzhiyun 	} else {
213*4882a593Smuzhiyun 		/*Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF */
214*4882a593Smuzhiyun 		retValue = phy_query_bb_reg(Adapter, pPhyReg->rfLSSIReadBack | MaskforPhySet, bLSSIReadBackData);
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 		/*RT_DISP(FINIT, INIT_RF,("Readback from RF-SI : 0x%x\n", retValue)); */
217*4882a593Smuzhiyun 	}
218*4882a593Smuzhiyun 	_exit_critical_mutex(&(adapter_to_dvobj(Adapter)->rf_read_reg_mutex) , NULL);
219*4882a593Smuzhiyun 	return retValue;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /**
224*4882a593Smuzhiyun  * Function:	phy_RFSerialWrite_8188F
225*4882a593Smuzhiyun  *
226*4882a593Smuzhiyun  * OverView:	Write data to RF register (page 8~)
227*4882a593Smuzhiyun  *
228*4882a593Smuzhiyun  * Input:
229*4882a593Smuzhiyun  *		PADAPTER		Adapter,
230*4882a593Smuzhiyun 			enum rf_path		RFPath,				Radio path of A/B/C/D
231*4882a593Smuzhiyun  *			u32			Offset,			The target address to be read
232*4882a593Smuzhiyun  *			u32			Data			The new register Data in the target bit position
233*4882a593Smuzhiyun  *											of the target to be read
234*4882a593Smuzhiyun  *
235*4882a593Smuzhiyun  * Output:	None
236*4882a593Smuzhiyun  * Return:		None
237*4882a593Smuzhiyun  * Note:		Threre are three types of serial operations:
238*4882a593Smuzhiyun  *			1. Software serial write
239*4882a593Smuzhiyun  *			2. Hardware LSSI-Low Speed Serial Interface
240*4882a593Smuzhiyun  *			3. Hardware HSSI-High speed
241*4882a593Smuzhiyun  *			serial write. Driver need to implement (1) and (2).
242*4882a593Smuzhiyun  *			This function is equal to the combination of RF_ReadReg() and  RFLSSIRead()
243*4882a593Smuzhiyun  *
244*4882a593Smuzhiyun  * Note:		  For RF8256 only
245*4882a593Smuzhiyun  *			 The total count of RTL8256(Zebra4) register is around 36 bit it only employs
246*4882a593Smuzhiyun  *			 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10])
247*4882a593Smuzhiyun  *			 to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration
248*4882a593Smuzhiyun  *			 programming guide" for more details.
249*4882a593Smuzhiyun  *			 Thus, we define a sub-finction for RTL8526 register address conversion
250*4882a593Smuzhiyun  *		       ===========================================================
251*4882a593Smuzhiyun  *			 Register Mode		RegCTL[1]		RegCTL[0]		Note
252*4882a593Smuzhiyun  *								(Reg00[12])		(Reg00[10])
253*4882a593Smuzhiyun  *		       ===========================================================
254*4882a593Smuzhiyun  *			 Reg_Mode0				0				x			Reg 0 ~15(0x0 ~ 0xf)
255*4882a593Smuzhiyun  *		       ------------------------------------------------------------------
256*4882a593Smuzhiyun  *			 Reg_Mode1				1				0			Reg 16 ~30(0x1 ~ 0xf)
257*4882a593Smuzhiyun  *		       ------------------------------------------------------------------
258*4882a593Smuzhiyun  *			 Reg_Mode2				1				1			Reg 31 ~ 45(0x1 ~ 0xf)
259*4882a593Smuzhiyun  *		       ------------------------------------------------------------------
260*4882a593Smuzhiyun  *
261*4882a593Smuzhiyun  *	2008/09/02	MH	Add 92S RF definition
262*4882a593Smuzhiyun  *
263*4882a593Smuzhiyun  *
264*4882a593Smuzhiyun  *
265*4882a593Smuzhiyun */
266*4882a593Smuzhiyun static	void
phy_RFSerialWrite_8188F(PADAPTER Adapter,enum rf_path eRFPath,u32 Offset,u32 Data)267*4882a593Smuzhiyun phy_RFSerialWrite_8188F(
268*4882a593Smuzhiyun 		PADAPTER			Adapter,
269*4882a593Smuzhiyun 		enum rf_path			eRFPath,
270*4882a593Smuzhiyun 		u32				Offset,
271*4882a593Smuzhiyun 		u32				Data
272*4882a593Smuzhiyun )
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun 	u32						DataAndAddr = 0;
275*4882a593Smuzhiyun 	HAL_DATA_TYPE				*pHalData = GET_HAL_DATA(Adapter);
276*4882a593Smuzhiyun 	BB_REGISTER_DEFINITION_T	*pPhyReg = &pHalData->PHYRegDef[eRFPath];
277*4882a593Smuzhiyun 	u32						NewOffset;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	Offset &= 0xff;
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 	/* */
282*4882a593Smuzhiyun 	/* Shadow Update */
283*4882a593Smuzhiyun 	/* */
284*4882a593Smuzhiyun 	/*PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); */
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	/* */
287*4882a593Smuzhiyun 	/* Switch page for 8256 RF IC */
288*4882a593Smuzhiyun 	/* */
289*4882a593Smuzhiyun 	NewOffset = Offset;
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	/* */
292*4882a593Smuzhiyun 	/* Put write addr in [5:0]  and write data in [31:16] */
293*4882a593Smuzhiyun 	/* */
294*4882a593Smuzhiyun 	/*DataAndAddr = (Data<<16) | (NewOffset&0x3f); */
295*4882a593Smuzhiyun 	DataAndAddr = ((NewOffset << 20) | (Data & 0x000fffff)) & 0x0fffffff;	/* T65 RF */
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	/* */
298*4882a593Smuzhiyun 	/* Write Operation */
299*4882a593Smuzhiyun 	/* */
300*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
301*4882a593Smuzhiyun 	/*RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr)); */
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /**
307*4882a593Smuzhiyun  * Function:	PHY_QueryRFReg
308*4882a593Smuzhiyun  *
309*4882a593Smuzhiyun  * OverView:	Query "Specific bits" to RF register (page 8~)
310*4882a593Smuzhiyun  *
311*4882a593Smuzhiyun  * Input:
312*4882a593Smuzhiyun  *		PADAPTER	Adapter,
313*4882a593Smuzhiyun 		enum rf_path	eRFPath,		Radio path of A/B/C/D
314*4882a593Smuzhiyun  *		u32	RegAddr,		The target address to be read
315*4882a593Smuzhiyun  *		u32	BitMask			The target bit position in the target address
316*4882a593Smuzhiyun  *										to be read
317*4882a593Smuzhiyun  *
318*4882a593Smuzhiyun  * Output:	None
319*4882a593Smuzhiyun  * Return:		u32			Readback value
320*4882a593Smuzhiyun  * Note:		This function is equal to "GetRFRegSetting" in PHY programming guide
321*4882a593Smuzhiyun  */
322*4882a593Smuzhiyun u32
PHY_QueryRFReg_8188F(PADAPTER Adapter,enum rf_path eRFPath,u32 RegAddr,u32 BitMask)323*4882a593Smuzhiyun PHY_QueryRFReg_8188F(
324*4882a593Smuzhiyun 		PADAPTER			Adapter,
325*4882a593Smuzhiyun 		enum rf_path			eRFPath,
326*4882a593Smuzhiyun 		u32				RegAddr,
327*4882a593Smuzhiyun 		u32				BitMask
328*4882a593Smuzhiyun )
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun 	u32 Original_Value, Readback_Value, BitShift;
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun #if (DISABLE_BB_RF == 1)
333*4882a593Smuzhiyun 	return 0;
334*4882a593Smuzhiyun #endif
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	Original_Value = phy_RFSerialRead_8188F(Adapter, eRFPath, RegAddr);
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	BitShift =  phy_CalculateBitShift(BitMask);
339*4882a593Smuzhiyun 	Readback_Value = (Original_Value & BitMask) >> BitShift;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	return Readback_Value;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun /**
345*4882a593Smuzhiyun * Function:	PHY_SetRFReg
346*4882a593Smuzhiyun *
347*4882a593Smuzhiyun * OverView:	Write "Specific bits" to RF register (page 8~)
348*4882a593Smuzhiyun *
349*4882a593Smuzhiyun * Input:
350*4882a593Smuzhiyun *			PADAPTER		Adapter,
351*4882a593Smuzhiyun 			enum rf_path			eRFPath,		Radio path of A/B/C/D
352*4882a593Smuzhiyun *			u32			RegAddr,		The target address to be modified
353*4882a593Smuzhiyun *			u32			BitMask			The target bit position in the target address
354*4882a593Smuzhiyun *											to be modified
355*4882a593Smuzhiyun *			u32			Data			The new register Data in the target bit position
356*4882a593Smuzhiyun *											of the target address
357*4882a593Smuzhiyun *
358*4882a593Smuzhiyun * Output:	None
359*4882a593Smuzhiyun * Return:		None
360*4882a593Smuzhiyun * Note:		This function is equal to "PutRFRegSetting" in PHY programming guide
361*4882a593Smuzhiyun */
362*4882a593Smuzhiyun void
PHY_SetRFReg_8188F(PADAPTER Adapter,enum rf_path eRFPath,u32 RegAddr,u32 BitMask,u32 Data)363*4882a593Smuzhiyun PHY_SetRFReg_8188F(
364*4882a593Smuzhiyun 		PADAPTER			Adapter,
365*4882a593Smuzhiyun 		enum rf_path				eRFPath,
366*4882a593Smuzhiyun 		u32				RegAddr,
367*4882a593Smuzhiyun 		u32				BitMask,
368*4882a593Smuzhiyun 		u32				Data
369*4882a593Smuzhiyun )
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun 	u32		Original_Value, BitShift;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun #if (DISABLE_BB_RF == 1)
374*4882a593Smuzhiyun 	return;
375*4882a593Smuzhiyun #endif
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun 	/* RF data is 12 bits only */
378*4882a593Smuzhiyun 	if (BitMask != bRFRegOffsetMask) {
379*4882a593Smuzhiyun 		Original_Value = phy_RFSerialRead_8188F(Adapter, eRFPath, RegAddr);
380*4882a593Smuzhiyun 		BitShift =  phy_CalculateBitShift(BitMask);
381*4882a593Smuzhiyun 		Data = ((Original_Value & (~BitMask)) | (Data << BitShift));
382*4882a593Smuzhiyun 	}
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun 	phy_RFSerialWrite_8188F(Adapter, eRFPath, RegAddr, Data);
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun /* */
389*4882a593Smuzhiyun /* 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. */
390*4882a593Smuzhiyun /* */
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun /*-----------------------------------------------------------------------------
394*4882a593Smuzhiyun  * Function:    PHY_MACConfig8192C
395*4882a593Smuzhiyun  *
396*4882a593Smuzhiyun  * Overview:	Condig MAC by header file or parameter file.
397*4882a593Smuzhiyun  *
398*4882a593Smuzhiyun  * Input:       NONE
399*4882a593Smuzhiyun  *
400*4882a593Smuzhiyun  * Output:      NONE
401*4882a593Smuzhiyun  *
402*4882a593Smuzhiyun  * Return:      NONE
403*4882a593Smuzhiyun  *
404*4882a593Smuzhiyun  * Revised History:
405*4882a593Smuzhiyun  *  When		Who		Remark
406*4882a593Smuzhiyun  *  08/12/2008	MHC		Create Version 0.
407*4882a593Smuzhiyun  *
408*4882a593Smuzhiyun  *---------------------------------------------------------------------------*/
PHY_MACConfig8188F(PADAPTER Adapter)409*4882a593Smuzhiyun s32 PHY_MACConfig8188F(PADAPTER Adapter)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun 	int		rtStatus = _SUCCESS;
412*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(Adapter);
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	/* */
415*4882a593Smuzhiyun 	/* Config MAC */
416*4882a593Smuzhiyun 	/* */
417*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
418*4882a593Smuzhiyun 	rtStatus = phy_ConfigMACWithParaFile(Adapter, PHY_FILE_MAC_REG);
419*4882a593Smuzhiyun 	if (rtStatus == _FAIL)
420*4882a593Smuzhiyun #endif
421*4882a593Smuzhiyun 	{
422*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
423*4882a593Smuzhiyun 		odm_config_mac_with_header_file(&pHalData->odmpriv);
424*4882a593Smuzhiyun 		rtStatus = _SUCCESS;
425*4882a593Smuzhiyun #endif/*CONFIG_EMBEDDED_FWIMG */
426*4882a593Smuzhiyun 	}
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	return rtStatus;
429*4882a593Smuzhiyun }
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun /**
432*4882a593Smuzhiyun * Function:	phy_InitBBRFRegisterDefinition
433*4882a593Smuzhiyun *
434*4882a593Smuzhiyun * OverView:	Initialize Register definition offset for Radio Path A/B/C/D
435*4882a593Smuzhiyun *
436*4882a593Smuzhiyun * Input:
437*4882a593Smuzhiyun *			PADAPTER		Adapter,
438*4882a593Smuzhiyun *
439*4882a593Smuzhiyun * Output:	None
440*4882a593Smuzhiyun * Return:		None
441*4882a593Smuzhiyun * Note:		The initialization value is constant and it should never be changes
442*4882a593Smuzhiyun */
443*4882a593Smuzhiyun static	void
phy_InitBBRFRegisterDefinition(PADAPTER Adapter)444*4882a593Smuzhiyun phy_InitBBRFRegisterDefinition(
445*4882a593Smuzhiyun 		PADAPTER		Adapter
446*4882a593Smuzhiyun )
447*4882a593Smuzhiyun {
448*4882a593Smuzhiyun 	HAL_DATA_TYPE		*pHalData = GET_HAL_DATA(Adapter);
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 	/* RF Interface Sowrtware Control */
451*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 LSBs if read 32-bit from 0x870 */
452*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 	/* RF Interface Output (and Enable) */
455*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x860 */
456*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x864 */
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	/* RF Interface (Output and)  Enable */
459*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */
460*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; /*LSSI Parameter */
463*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;  /*wire control parameter2 */
466*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;  /*wire control parameter2 */
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	/* Tranceiver Readback LSSI/HSPI mode */
469*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
470*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
471*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
472*4882a593Smuzhiyun 	pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun }
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun static	int
phy_BB8188f_Config_ParaFile(PADAPTER Adapter)477*4882a593Smuzhiyun phy_BB8188f_Config_ParaFile(
478*4882a593Smuzhiyun 		PADAPTER	Adapter
479*4882a593Smuzhiyun )
480*4882a593Smuzhiyun {
481*4882a593Smuzhiyun 	HAL_DATA_TYPE		*pHalData = GET_HAL_DATA(Adapter);
482*4882a593Smuzhiyun 	int			rtStatus = _SUCCESS;
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun 	/* */
485*4882a593Smuzhiyun 	/* 1. Read PHY_REG.TXT BB INIT!! */
486*4882a593Smuzhiyun 	/* */
487*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
488*4882a593Smuzhiyun 	if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_PHY_REG, CONFIG_BB_PHY_REG) == _FAIL)
489*4882a593Smuzhiyun #endif
490*4882a593Smuzhiyun 	{
491*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
492*4882a593Smuzhiyun 		if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG))
493*4882a593Smuzhiyun 			rtStatus = _FAIL;
494*4882a593Smuzhiyun #endif
495*4882a593Smuzhiyun 	}
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	if (rtStatus != _SUCCESS) {
498*4882a593Smuzhiyun 		RTW_INFO("%s():Write BB Reg Fail!!", __func__);
499*4882a593Smuzhiyun 		goto phy_BB8190_Config_ParaFile_Fail;
500*4882a593Smuzhiyun 	}
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun #if MP_DRIVER == 1
503*4882a593Smuzhiyun 	if (Adapter->registrypriv.mp_mode == 1) {
504*4882a593Smuzhiyun 		/* */
505*4882a593Smuzhiyun 		/* 1.1 Read PHY_REG_MP.TXT BB INIT!! */
506*4882a593Smuzhiyun 		/* */
507*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
508*4882a593Smuzhiyun 		if (phy_ConfigBBWithMpParaFile(Adapter, PHY_FILE_PHY_REG_MP) == _FAIL)
509*4882a593Smuzhiyun #endif
510*4882a593Smuzhiyun 		{
511*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
512*4882a593Smuzhiyun 			if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG_MP))
513*4882a593Smuzhiyun 				rtStatus = _FAIL;
514*4882a593Smuzhiyun #endif
515*4882a593Smuzhiyun 		}
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 		if (rtStatus != _SUCCESS) {
518*4882a593Smuzhiyun 			RTW_INFO("%s():Write BB Reg MP Fail!!", __func__);
519*4882a593Smuzhiyun 			goto phy_BB8190_Config_ParaFile_Fail;
520*4882a593Smuzhiyun 		}
521*4882a593Smuzhiyun 	}
522*4882a593Smuzhiyun #endif	/* #if (MP_DRIVER == 1) */
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	/* */
525*4882a593Smuzhiyun 	/* 2. Read BB AGC table Initialization */
526*4882a593Smuzhiyun 	/* */
527*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
528*4882a593Smuzhiyun 	if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_AGC_TAB, CONFIG_BB_AGC_TAB) == _FAIL)
529*4882a593Smuzhiyun #endif
530*4882a593Smuzhiyun 	{
531*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
532*4882a593Smuzhiyun 		if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_AGC_TAB))
533*4882a593Smuzhiyun 			rtStatus = _FAIL;
534*4882a593Smuzhiyun #endif
535*4882a593Smuzhiyun 	}
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	if (rtStatus != _SUCCESS) {
538*4882a593Smuzhiyun 		RTW_INFO("%s():AGC Table Fail\n", __func__);
539*4882a593Smuzhiyun 		goto phy_BB8190_Config_ParaFile_Fail;
540*4882a593Smuzhiyun 	}
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun phy_BB8190_Config_ParaFile_Fail:
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun 	return rtStatus;
545*4882a593Smuzhiyun }
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun int
PHY_BBConfig8188F(PADAPTER Adapter)549*4882a593Smuzhiyun PHY_BBConfig8188F(
550*4882a593Smuzhiyun 		PADAPTER	Adapter
551*4882a593Smuzhiyun )
552*4882a593Smuzhiyun {
553*4882a593Smuzhiyun 	int	rtStatus = _SUCCESS;
554*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(Adapter);
555*4882a593Smuzhiyun 	u16	RegVal;
556*4882a593Smuzhiyun 	u8	TmpU1B = 0;
557*4882a593Smuzhiyun 	u8	value8;
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun 	phy_InitBBRFRegisterDefinition(Adapter);
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	/* Enable BB and RF */
562*4882a593Smuzhiyun 	RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN);
563*4882a593Smuzhiyun 	RegVal |= BIT13 | FEN_BB_GLB_RSTn | FEN_BBRSTB;
564*4882a593Smuzhiyun 	rtw_write16(Adapter, REG_SYS_FUNC_EN, RegVal);
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun #if 0   /* TODO: [BB]. reg 948 is only use for bt_coex */
567*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
568*4882a593Smuzhiyun 	rtw_write32(Adapter, 0x948, 0x0);	/* USB use Antenna S0 */
569*4882a593Smuzhiyun #else
570*4882a593Smuzhiyun 	if (pHalData->ant_path == RF_PATH_A)
571*4882a593Smuzhiyun 		rtw_write32(Adapter, 0x948, 0x280);
572*4882a593Smuzhiyun 	else
573*4882a593Smuzhiyun 		rtw_write32(Adapter, 0x948, 0x0);
574*4882a593Smuzhiyun #endif
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun #endif
577*4882a593Smuzhiyun 	rtw_write8(Adapter, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	rtw_usleep_os(10);
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	phy_set_rf_reg(Adapter, RF_PATH_A, 0x1, 0xfffff, 0x780);
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun #if 0
584*4882a593Smuzhiyun 	/* 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF. */
585*4882a593Smuzhiyun 	rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83);
586*4882a593Smuzhiyun 	rtw_write8(Adapter, REG_AFE_PLL_CTRL + 1, 0xdb);
587*4882a593Smuzhiyun #endif
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun 	/* Config BB and AGC */
590*4882a593Smuzhiyun 	rtStatus = phy_BB8188f_Config_ParaFile(Adapter);
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	if (rtw_phydm_set_crystal_cap(Adapter, pHalData->crystal_cap) == _FALSE) {
593*4882a593Smuzhiyun 		RTW_ERR("Init crystal_cap failed\n");
594*4882a593Smuzhiyun 		rtw_warn_on(1);
595*4882a593Smuzhiyun 		rtStatus = _FAIL;
596*4882a593Smuzhiyun 	}
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun 	return rtStatus;
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun #if 0
602*4882a593Smuzhiyun /* Block & Path enable */
603*4882a593Smuzhiyun #define		rOFDMCCKEN_Jaguar		0x808 /* OFDM/CCK block enable */
604*4882a593Smuzhiyun #define		bOFDMEN_Jaguar			0x20000000
605*4882a593Smuzhiyun #define		bCCKEN_Jaguar			0x10000000
606*4882a593Smuzhiyun #define		rRxPath_Jaguar			0x808	/* Rx antenna */
607*4882a593Smuzhiyun #define		bRxPath_Jaguar			0xff
608*4882a593Smuzhiyun #define		rTxPath_Jaguar			0x80c	/* Tx antenna */
609*4882a593Smuzhiyun #define		bTxPath_Jaguar			0x0fffffff
610*4882a593Smuzhiyun #define		rCCK_RX_Jaguar			0xa04	/* for cck rx path selection */
611*4882a593Smuzhiyun #define		bCCK_RX_Jaguar			0x0c000000
612*4882a593Smuzhiyun #define		rVhtlen_Use_Lsig_Jaguar	0x8c3	/* Use LSIG for VHT length */
613*4882a593Smuzhiyun void
614*4882a593Smuzhiyun PHY_BB8188F_Config_1T(
615*4882a593Smuzhiyun 	PADAPTER Adapter
616*4882a593Smuzhiyun )
617*4882a593Smuzhiyun {
618*4882a593Smuzhiyun 	/* BB OFDM RX Path_A */
619*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rRxPath_Jaguar, bRxPath_Jaguar, 0x11);
620*4882a593Smuzhiyun 	/* BB OFDM TX Path_A */
621*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rTxPath_Jaguar, bMaskLWord, 0x1111);
622*4882a593Smuzhiyun 	/* BB CCK R/Rx Path_A */
623*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0);
624*4882a593Smuzhiyun 	/* MCS support */
625*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0x8bc, 0xc0000060, 0x4);
626*4882a593Smuzhiyun 	/* RF Path_B HSSI OFF */
627*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0xe00, 0xf, 0x4);
628*4882a593Smuzhiyun 	/* RF Path_B Power Down */
629*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0xe90, bMaskDWord, 0);
630*4882a593Smuzhiyun 	/* ADDA Path_B OFF */
631*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0);
632*4882a593Smuzhiyun 	phy_set_bb_reg(Adapter, 0xe64, bMaskDWord, 0);
633*4882a593Smuzhiyun }
634*4882a593Smuzhiyun #endif
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun int
PHY_RFConfig8188F(PADAPTER Adapter)637*4882a593Smuzhiyun PHY_RFConfig8188F(
638*4882a593Smuzhiyun 		PADAPTER	Adapter
639*4882a593Smuzhiyun )
640*4882a593Smuzhiyun {
641*4882a593Smuzhiyun 	int		rtStatus = _SUCCESS;
642*4882a593Smuzhiyun 
643*4882a593Smuzhiyun 	/* */
644*4882a593Smuzhiyun 	/* RF config */
645*4882a593Smuzhiyun 	/* */
646*4882a593Smuzhiyun 	rtStatus = PHY_RF6052_Config8188F(Adapter);
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun 	/*PHY_BB8188F_Config_1T(Adapter); */
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun 	return rtStatus;
651*4882a593Smuzhiyun }
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun /*-----------------------------------------------------------------------------
654*4882a593Smuzhiyun  * Function:    PHY_ConfigRFWithParaFile()
655*4882a593Smuzhiyun  *
656*4882a593Smuzhiyun  * Overview:    This function read RF parameters from general file format, and do RF 3-wire
657*4882a593Smuzhiyun  *
658*4882a593Smuzhiyun  * Input:	PADAPTER			Adapter
659*4882a593Smuzhiyun  *			ps1Byte				pFileName
660*4882a593Smuzhiyun  *			enum rf_path				eRFPath
661*4882a593Smuzhiyun  *
662*4882a593Smuzhiyun  * Output:      NONE
663*4882a593Smuzhiyun  *
664*4882a593Smuzhiyun  * Return:      RT_STATUS_SUCCESS: configuration file exist
665*4882a593Smuzhiyun  *
666*4882a593Smuzhiyun  * Note:		Delay may be required for RF configuration
667*4882a593Smuzhiyun  *---------------------------------------------------------------------------*/
668*4882a593Smuzhiyun int
PHY_ConfigRFWithParaFile_8188F(PADAPTER Adapter,u8 * pFileName,enum rf_path eRFPath)669*4882a593Smuzhiyun PHY_ConfigRFWithParaFile_8188F(
670*4882a593Smuzhiyun 		PADAPTER		Adapter,
671*4882a593Smuzhiyun 		u8				*pFileName,
672*4882a593Smuzhiyun 	enum rf_path				eRFPath
673*4882a593Smuzhiyun )
674*4882a593Smuzhiyun {
675*4882a593Smuzhiyun 	return _SUCCESS;
676*4882a593Smuzhiyun }
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun #ifdef CONFIG_FW_OFFLOAD_SET_TXPWR_IDX
phy_set_txpwr_idx_offload(_adapter * adapter)679*4882a593Smuzhiyun bool phy_set_txpwr_idx_offload(_adapter *adapter)
680*4882a593Smuzhiyun {
681*4882a593Smuzhiyun 	return GET_HAL_DATA(adapter)->intf_start
682*4882a593Smuzhiyun 		#ifdef CONFIG_MP_INCLUDED
683*4882a593Smuzhiyun 		&& !rtw_mp_mode_check(adapter)
684*4882a593Smuzhiyun 		#endif
685*4882a593Smuzhiyun 		;
686*4882a593Smuzhiyun }
687*4882a593Smuzhiyun 
rtw_hal_h2c_txpwr_idx_offload(_adapter * adapter)688*4882a593Smuzhiyun s32 rtw_hal_h2c_txpwr_idx_offload(_adapter *adapter)
689*4882a593Smuzhiyun {
690*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
691*4882a593Smuzhiyun 	u8 data[H2C_TXPWR_IDX_OFFLOAD_LEN] = {0};
692*4882a593Smuzhiyun 	s32 ret;
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 	_rtw_memcpy(data, hal_data->txpwr_idx_offload_buf, 3);
695*4882a593Smuzhiyun 	SET_H2CCMD_TXPWR_IDX_EN(data, 1);
696*4882a593Smuzhiyun 
697*4882a593Smuzhiyun 	ret = rtw_hal_fill_h2c_cmd(adapter, H2C_TXPWR_IDX_OFFLOAD, H2C_TXPWR_IDX_OFFLOAD_LEN, data);
698*4882a593Smuzhiyun 	if (ret != _SUCCESS)
699*4882a593Smuzhiyun 		RTW_WARN("%s fail\n", __func__);
700*4882a593Smuzhiyun 
701*4882a593Smuzhiyun 	return ret;
702*4882a593Smuzhiyun }
703*4882a593Smuzhiyun 
phy_set_txpwr_offload_8188f(_adapter * adapter)704*4882a593Smuzhiyun s32 phy_set_txpwr_offload_8188f(_adapter *adapter)
705*4882a593Smuzhiyun {
706*4882a593Smuzhiyun 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
707*4882a593Smuzhiyun 	struct submit_ctx *sctx = &hal_data->txpwr_idx_offload_sctx;
708*4882a593Smuzhiyun 	s32 ret = _SUCCESS;
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun 	rtw_sctx_init(sctx, 500);
711*4882a593Smuzhiyun 	ret = rtw_hal_h2c_txpwr_idx_offload(adapter);
712*4882a593Smuzhiyun 	if (ret != _SUCCESS)
713*4882a593Smuzhiyun 		goto exit;
714*4882a593Smuzhiyun 
715*4882a593Smuzhiyun 	/* wait till rpt done or timeout */
716*4882a593Smuzhiyun 	ret = c2h_txpwr_idx_offload_wait(adapter);
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun exit:
719*4882a593Smuzhiyun 	return ret;
720*4882a593Smuzhiyun }
721*4882a593Smuzhiyun #endif /* CONFIG_FW_OFFLOAD_SET_TXPWR_IDX */
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun /**************************************************************************************************************
724*4882a593Smuzhiyun  *   Description:
725*4882a593Smuzhiyun  *       The low-level interface to set TxAGC , called by both MP and Normal Driver.
726*4882a593Smuzhiyun  *
727*4882a593Smuzhiyun  *                                                                                    <20120830, Kordan>
728*4882a593Smuzhiyun  **************************************************************************************************************/
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun void
PHY_SetTxPowerIndex_8188F(PADAPTER Adapter,u32 PowerIndex,enum rf_path RFPath,u8 Rate)731*4882a593Smuzhiyun PHY_SetTxPowerIndex_8188F(
732*4882a593Smuzhiyun 		PADAPTER			Adapter,
733*4882a593Smuzhiyun 		u32					PowerIndex,
734*4882a593Smuzhiyun 		enum rf_path			RFPath,
735*4882a593Smuzhiyun 		u8					Rate
736*4882a593Smuzhiyun )
737*4882a593Smuzhiyun {
738*4882a593Smuzhiyun #ifdef CONFIG_FW_OFFLOAD_SET_TXPWR_IDX
739*4882a593Smuzhiyun 	if (phy_set_txpwr_idx_offload(Adapter)) {
740*4882a593Smuzhiyun 		HAL_DATA_TYPE *hal_data = GET_HAL_DATA(Adapter);
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun 		if (Rate == MGN_11M)
743*4882a593Smuzhiyun 			hal_data->txpwr_idx_offload_buf[CCK] = PowerIndex;
744*4882a593Smuzhiyun 		else if (Rate == MGN_54M)
745*4882a593Smuzhiyun 			hal_data->txpwr_idx_offload_buf[OFDM] = PowerIndex;
746*4882a593Smuzhiyun 		else if (Rate == MGN_MCS7)
747*4882a593Smuzhiyun 			hal_data->txpwr_idx_offload_buf[HT_1SS] = PowerIndex;
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun 		return;
750*4882a593Smuzhiyun 	}
751*4882a593Smuzhiyun #endif
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun 	if (RFPath == RF_PATH_A || RFPath == RF_PATH_B) {
754*4882a593Smuzhiyun 		switch (Rate) {
755*4882a593Smuzhiyun 		case MGN_1M:
756*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_CCK1_Mcs32,      bMaskByte1, PowerIndex);
757*4882a593Smuzhiyun 			break;
758*4882a593Smuzhiyun 		case MGN_2M:
759*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte1, PowerIndex);
760*4882a593Smuzhiyun 			break;
761*4882a593Smuzhiyun 		case MGN_5_5M:
762*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte2, PowerIndex);
763*4882a593Smuzhiyun 			break;
764*4882a593Smuzhiyun 		case MGN_11M:
765*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte3, PowerIndex);
766*4882a593Smuzhiyun 			break;
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun 		case MGN_6M:
769*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte0, PowerIndex);
770*4882a593Smuzhiyun 			break;
771*4882a593Smuzhiyun 		case MGN_9M:
772*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte1, PowerIndex);
773*4882a593Smuzhiyun 			break;
774*4882a593Smuzhiyun 		case MGN_12M:
775*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte2, PowerIndex);
776*4882a593Smuzhiyun 			break;
777*4882a593Smuzhiyun 		case MGN_18M:
778*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte3, PowerIndex);
779*4882a593Smuzhiyun 			break;
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun 		case MGN_24M:
782*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte0, PowerIndex);
783*4882a593Smuzhiyun 			break;
784*4882a593Smuzhiyun 		case MGN_36M:
785*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte1, PowerIndex);
786*4882a593Smuzhiyun 			break;
787*4882a593Smuzhiyun 		case MGN_48M:
788*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte2, PowerIndex);
789*4882a593Smuzhiyun 			break;
790*4882a593Smuzhiyun 		case MGN_54M:
791*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte3, PowerIndex);
792*4882a593Smuzhiyun 			break;
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 		case MGN_MCS0:
795*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte0, PowerIndex);
796*4882a593Smuzhiyun 			break;
797*4882a593Smuzhiyun 		case MGN_MCS1:
798*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte1, PowerIndex);
799*4882a593Smuzhiyun 			break;
800*4882a593Smuzhiyun 		case MGN_MCS2:
801*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte2, PowerIndex);
802*4882a593Smuzhiyun 			break;
803*4882a593Smuzhiyun 		case MGN_MCS3:
804*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte3, PowerIndex);
805*4882a593Smuzhiyun 			break;
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun 		case MGN_MCS4:
808*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte0, PowerIndex);
809*4882a593Smuzhiyun 			break;
810*4882a593Smuzhiyun 		case MGN_MCS5:
811*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte1, PowerIndex);
812*4882a593Smuzhiyun 			break;
813*4882a593Smuzhiyun 		case MGN_MCS6:
814*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte2, PowerIndex);
815*4882a593Smuzhiyun 			break;
816*4882a593Smuzhiyun 		case MGN_MCS7:
817*4882a593Smuzhiyun 			phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte3, PowerIndex);
818*4882a593Smuzhiyun 			break;
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun 		default:
821*4882a593Smuzhiyun 			RTW_INFO("Invalid Rate!!\n");
822*4882a593Smuzhiyun 			break;
823*4882a593Smuzhiyun 		}
824*4882a593Smuzhiyun 	}
825*4882a593Smuzhiyun }
826*4882a593Smuzhiyun 
827*4882a593Smuzhiyun void
PHY_SetTxPowerLevel8188F(PADAPTER Adapter,u8 Channel)828*4882a593Smuzhiyun PHY_SetTxPowerLevel8188F(
829*4882a593Smuzhiyun 		PADAPTER		Adapter,
830*4882a593Smuzhiyun 		u8				Channel
831*4882a593Smuzhiyun )
832*4882a593Smuzhiyun {
833*4882a593Smuzhiyun 	phy_set_tx_power_level_by_path(Adapter, Channel, RF_PATH_A);
834*4882a593Smuzhiyun }
835*4882a593Smuzhiyun 
rtl8188f_set_txpwr_done(_adapter * adapter)836*4882a593Smuzhiyun void rtl8188f_set_txpwr_done(_adapter *adapter)
837*4882a593Smuzhiyun {
838*4882a593Smuzhiyun 	/* TODO: for not offload case */
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun #ifdef CONFIG_FW_OFFLOAD_SET_TXPWR_IDX
841*4882a593Smuzhiyun 	if (phy_set_txpwr_idx_offload(adapter))
842*4882a593Smuzhiyun 		phy_set_txpwr_offload_8188f(adapter);
843*4882a593Smuzhiyun #endif
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun 
846*4882a593Smuzhiyun /* A workaround to eliminate the 2400MHz, 2440MHz, 2480MHz spur of 8188F. (Asked by David.) */
847*4882a593Smuzhiyun void
phy_SpurCalibration_8188F(PADAPTER pAdapter,u8 ToChannel,u8 threshold)848*4882a593Smuzhiyun phy_SpurCalibration_8188F(
849*4882a593Smuzhiyun 		PADAPTER					pAdapter,
850*4882a593Smuzhiyun 		u8						ToChannel,
851*4882a593Smuzhiyun 		u8						threshold
852*4882a593Smuzhiyun )
853*4882a593Smuzhiyun {
854*4882a593Smuzhiyun 	u32		freq[7] = {0xFCCD, 0xFC4D, 0xFFCD, 0xFF4D, 0xFCCD, 0xFF9A, 0xFDCD}; /* {chnl 5, 6, 7, 8, 13, 14 , 11} */
855*4882a593Smuzhiyun 	u8		idx = 0;
856*4882a593Smuzhiyun 	u8		b_doNotch = FALSE;
857*4882a593Smuzhiyun 	u8		initial_gain;
858*4882a593Smuzhiyun 	BOOLEAN		bHW_Ctrl = FALSE, bSW_Ctrl = FALSE, bHW_Ctrl_S1 = FALSE, bSW_Ctrl_S1 = FALSE;
859*4882a593Smuzhiyun 	u32		reg948;
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun 	/* add for notch */
862*4882a593Smuzhiyun 	u32				wlan_channel, CurrentChannel, Is40MHz;
863*4882a593Smuzhiyun 	HAL_DATA_TYPE		*pHalData	= GET_HAL_DATA(pAdapter);
864*4882a593Smuzhiyun 	struct dm_struct		*pDM_Odm = &(pHalData->odmpriv);
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun #ifdef CONFIG_AUTO_NOTCH_FILTER
867*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x1F);
868*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1);				/*enable notch filter */
869*4882a593Smuzhiyun #endif
870*4882a593Smuzhiyun 
871*4882a593Smuzhiyun 	/* check threshold */
872*4882a593Smuzhiyun 	if (threshold <= 0x0)
873*4882a593Smuzhiyun 		threshold = 0x16;
874*4882a593Smuzhiyun 
875*4882a593Smuzhiyun 	/* RTW_INFO("===> phy_SpurCalibration_8188F: Channel = %d\n", ToChannel); */
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 	if (ToChannel == 5)
878*4882a593Smuzhiyun 		idx = 0;
879*4882a593Smuzhiyun 	else if (ToChannel == 6)
880*4882a593Smuzhiyun 		idx = 1;
881*4882a593Smuzhiyun 	else if (ToChannel == 7)
882*4882a593Smuzhiyun 		idx = 2;
883*4882a593Smuzhiyun 	else if (ToChannel == 8)
884*4882a593Smuzhiyun 		idx = 3;
885*4882a593Smuzhiyun 	else if (ToChannel == 13)
886*4882a593Smuzhiyun 		idx = 4;
887*4882a593Smuzhiyun 	else if (ToChannel == 14)
888*4882a593Smuzhiyun 		idx = 5;
889*4882a593Smuzhiyun 	else if (ToChannel == 11)
890*4882a593Smuzhiyun 		idx = 6;
891*4882a593Smuzhiyun 	else
892*4882a593Smuzhiyun 		idx = 10;
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun 	reg948 = phy_query_bb_reg(pAdapter, rS0S1_PathSwitch, bMaskDWord);
895*4882a593Smuzhiyun 	if ((reg948 & BIT6) == 0x0)
896*4882a593Smuzhiyun 		bSW_Ctrl = TRUE;
897*4882a593Smuzhiyun 	else
898*4882a593Smuzhiyun 		bHW_Ctrl = TRUE;
899*4882a593Smuzhiyun 
900*4882a593Smuzhiyun 	if (bHW_Ctrl)
901*4882a593Smuzhiyun 		bHW_Ctrl_S1 = (phy_query_bb_reg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5 | BIT4 | BIT3) == 0x1) ? TRUE : FALSE;
902*4882a593Smuzhiyun 	else if (bSW_Ctrl)
903*4882a593Smuzhiyun 		bSW_Ctrl_S1 = ((reg948 & BIT9) == 0x0) ? TRUE : FALSE;
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 	/* If wlan at S1 (both HW control & SW control) and current channel=5,6,7,8,13,14 */
906*4882a593Smuzhiyun 	if ((bHW_Ctrl_S1 || bSW_Ctrl_S1) && (idx <= 6)) {
907*4882a593Smuzhiyun 		initial_gain = (u8)(odm_get_bb_reg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0) & 0x7f);
908*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_RFMOD, BIT24, 0); /* Disable CCK block */
909*4882a593Smuzhiyun 		odm_write_dig(pDM_Odm, 0x30);
910*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccf000c0);		/* disable 3-wire */
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, freq[idx]);				/* Setup PSD */
913*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, 0x400000 | freq[idx]); /* Start PSD */
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun 		rtw_msleep_os(30);
916*4882a593Smuzhiyun 
917*4882a593Smuzhiyun 		if (phy_query_bb_reg(pAdapter, rFPGA0_PSDReport, bMaskDWord) >= threshold)
918*4882a593Smuzhiyun 			b_doNotch = TRUE;
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, freq[idx]); /* turn off PSD */
921*4882a593Smuzhiyun 
922*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccc000c0);	/* enable 3-wire */
923*4882a593Smuzhiyun 		phy_set_bb_reg(pAdapter, rFPGA0_RFMOD, BIT24, 1); /* Enable CCK block */
924*4882a593Smuzhiyun 		odm_write_dig(pDM_Odm, initial_gain);
925*4882a593Smuzhiyun 	}
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun 	/* --- Notch Filter --- Asked by Rock */
928*4882a593Smuzhiyun 	if (b_doNotch) {
929*4882a593Smuzhiyun 		CurrentChannel = odm_get_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
930*4882a593Smuzhiyun 		wlan_channel   = CurrentChannel & 0x0f;							/*Get center frequency */
931*4882a593Smuzhiyun 
932*4882a593Smuzhiyun 		switch (wlan_channel) {											/*Set notch filter */
933*4882a593Smuzhiyun 		case 5:
934*4882a593Smuzhiyun 		case 13:
935*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
936*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0xB);
937*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1);				/*enable notch filter */
938*4882a593Smuzhiyun #endif
939*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x06000000);
940*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
941*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
942*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
943*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1);				/*enable CSI mask */
944*4882a593Smuzhiyun 			break;
945*4882a593Smuzhiyun 		case 6:
946*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
947*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x4);
948*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1);				/*enable notch filter */
949*4882a593Smuzhiyun #endif
950*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000600);
951*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
952*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
953*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
954*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1);				/*enable CSI mask */
955*4882a593Smuzhiyun 			break;
956*4882a593Smuzhiyun 		case 7:
957*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
958*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x3);
959*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1);				/*enable notch filter */
960*4882a593Smuzhiyun #endif
961*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
962*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
963*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
964*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x06000000);
965*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1);				/*enable CSI mask */
966*4882a593Smuzhiyun 			break;
967*4882a593Smuzhiyun 		case 8:
968*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
969*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0xA);
970*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1);				/*enable notch filter */
971*4882a593Smuzhiyun #endif
972*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
973*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
974*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
975*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000380);
976*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1);				/*enable CSI mask */
977*4882a593Smuzhiyun 			break;
978*4882a593Smuzhiyun 		case 11:
979*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
980*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT28|BIT27|BIT26|BIT25|BIT24, 0x19);
981*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1);						/*enable notch filter*/
982*4882a593Smuzhiyun #endif
983*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
984*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x04000000);
985*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
986*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
987*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1);                    /*enable CSI mask*/
988*4882a593Smuzhiyun 			break;
989*4882a593Smuzhiyun 		case 14:
990*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
991*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x5);
992*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1);				/*enable notch filter */
993*4882a593Smuzhiyun #endif
994*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
995*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
996*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
997*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00180000);
998*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1);				/*enable CSI mask */
999*4882a593Smuzhiyun 			break;
1000*4882a593Smuzhiyun 		default:
1001*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
1002*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x0);				/*disable notch filter */
1003*4882a593Smuzhiyun #endif
1004*4882a593Smuzhiyun 			odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x0);				/*disable CSI mask	function */
1005*4882a593Smuzhiyun 			break;
1006*4882a593Smuzhiyun 		} /*switch(wlan_channel) */
1007*4882a593Smuzhiyun 		return;
1008*4882a593Smuzhiyun 	}
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
1011*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x0);                     /*disable notch filter */
1012*4882a593Smuzhiyun #endif
1013*4882a593Smuzhiyun 	odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x0);                    /*disable CSI mask */
1014*4882a593Smuzhiyun 
1015*4882a593Smuzhiyun }
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun void
phy_SetRegBW_8188F(PADAPTER Adapter,enum channel_width CurrentBW)1018*4882a593Smuzhiyun phy_SetRegBW_8188F(
1019*4882a593Smuzhiyun 		PADAPTER		Adapter,
1020*4882a593Smuzhiyun 	enum channel_width	CurrentBW
1021*4882a593Smuzhiyun )
1022*4882a593Smuzhiyun {
1023*4882a593Smuzhiyun 	u16	RegRfMod_BW, u2tmp = 0;
1024*4882a593Smuzhiyun 	RegRfMod_BW = rtw_read16(Adapter, REG_TRXPTCL_CTL_8188F);
1025*4882a593Smuzhiyun 
1026*4882a593Smuzhiyun 	switch (CurrentBW) {
1027*4882a593Smuzhiyun 	case CHANNEL_WIDTH_20:
1028*4882a593Smuzhiyun 		rtw_write16(Adapter, REG_TRXPTCL_CTL_8188F, (RegRfMod_BW & 0xFE7F)); /* BIT 7 = 0, BIT 8 = 0 */
1029*4882a593Smuzhiyun 		break;
1030*4882a593Smuzhiyun 
1031*4882a593Smuzhiyun 	case CHANNEL_WIDTH_40:
1032*4882a593Smuzhiyun 		u2tmp = RegRfMod_BW | BIT7;
1033*4882a593Smuzhiyun 		rtw_write16(Adapter, REG_TRXPTCL_CTL_8188F, (u2tmp & 0xFEFF)); /* BIT 7 = 1, BIT 8 = 0 */
1034*4882a593Smuzhiyun 		break;
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun 	case CHANNEL_WIDTH_80:
1037*4882a593Smuzhiyun 		u2tmp = RegRfMod_BW | BIT8;
1038*4882a593Smuzhiyun 		rtw_write16(Adapter, REG_TRXPTCL_CTL_8188F, (u2tmp & 0xFF7F)); /* BIT 7 = 0, BIT 8 = 1 */
1039*4882a593Smuzhiyun 		break;
1040*4882a593Smuzhiyun 
1041*4882a593Smuzhiyun 	default:
1042*4882a593Smuzhiyun 		RTW_INFO("phy_PostSetBWMode8188F():	unknown Bandwidth: %#X\n", CurrentBW);
1043*4882a593Smuzhiyun 		break;
1044*4882a593Smuzhiyun 	}
1045*4882a593Smuzhiyun }
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun u8
phy_GetSecondaryChnl_8188F(PADAPTER Adapter)1048*4882a593Smuzhiyun phy_GetSecondaryChnl_8188F(
1049*4882a593Smuzhiyun 		PADAPTER	Adapter
1050*4882a593Smuzhiyun )
1051*4882a593Smuzhiyun {
1052*4882a593Smuzhiyun 	u8	SCSettingOf40 = 0, SCSettingOf20 = 0;
1053*4882a593Smuzhiyun 	PHAL_DATA_TYPE	pHalData = GET_HAL_DATA(Adapter);
1054*4882a593Smuzhiyun 
1055*4882a593Smuzhiyun 	if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) {
1056*4882a593Smuzhiyun 		if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
1057*4882a593Smuzhiyun 			SCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
1058*4882a593Smuzhiyun 		else if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
1059*4882a593Smuzhiyun 			SCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
1060*4882a593Smuzhiyun 
1061*4882a593Smuzhiyun 
1062*4882a593Smuzhiyun 		if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
1063*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
1064*4882a593Smuzhiyun 		else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
1065*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
1066*4882a593Smuzhiyun 		else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
1067*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
1068*4882a593Smuzhiyun 		else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
1069*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
1070*4882a593Smuzhiyun 
1071*4882a593Smuzhiyun 	} else if (pHalData->current_channel_bw == CHANNEL_WIDTH_40) {
1072*4882a593Smuzhiyun 
1073*4882a593Smuzhiyun 		if (pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
1074*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
1075*4882a593Smuzhiyun 		else if (pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
1076*4882a593Smuzhiyun 			SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun 	}
1079*4882a593Smuzhiyun 
1080*4882a593Smuzhiyun 	return (SCSettingOf40 << 4) | SCSettingOf20;
1081*4882a593Smuzhiyun }
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun void
phy_PostSetBwMode8188F(PADAPTER Adapter)1084*4882a593Smuzhiyun phy_PostSetBwMode8188F(
1085*4882a593Smuzhiyun 		PADAPTER	Adapter
1086*4882a593Smuzhiyun )
1087*4882a593Smuzhiyun {
1088*4882a593Smuzhiyun 	u8			SubChnlNum = 0;
1089*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(Adapter);
1090*4882a593Smuzhiyun 
1091*4882a593Smuzhiyun 	/* RTW_INFO("===>%s: current_channel_bw = %s Mhz\n", __func__, pHalData->current_channel_bw?"40":"20"); */
1092*4882a593Smuzhiyun 
1093*4882a593Smuzhiyun 	switch (pHalData->current_channel_bw) {
1094*4882a593Smuzhiyun 	case CHANNEL_WIDTH_20:
1095*4882a593Smuzhiyun 		/*
1096*4882a593Smuzhiyun 		0x800[0]=1'b0
1097*4882a593Smuzhiyun 		0x900[0]=1'b0
1098*4882a593Smuzhiyun 		0x800[10:8]=3'b111(80M)
1099*4882a593Smuzhiyun 		0x800[14:12]=3'b101(80M)
1100*4882a593Smuzhiyun 		0xCE4[31:30]=2'b00
1101*4882a593Smuzhiyun 		0xCE4[29:28]=2'b01
1102*4882a593Smuzhiyun 		0xc10[29:28]=1
1103*4882a593Smuzhiyun 		0x954[19]=1'b0
1104*4882a593Smuzhiyun 		0x954[23:20]=3
1105*4882a593Smuzhiyun 		*/
1106*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT0, 0x0);
1107*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA1_RFMOD, BIT0, 0x0);
1108*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT10 | BIT9 | BIT8, 0x7);			/* RXADC CLK */
1109*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT14 | BIT13 | BIT12, 0x5);		/* TXDAC CLK */
1110*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rOFDM0_TxPseudoNoiseWgt, BIT31 | BIT30, 0x0);		/* small BW */
1111*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rOFDM0_TxPseudoNoiseWgt, BIT29 | BIT28, 0x1);		/* adc buffer clk(TBD) */
1112*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rOFDM0_XARxAFE, BIT29 | BIT28, 0x1);				/* adc buffer clk(TBD) */
1113*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, BBrx_DFIR, BIT19, 0x0);							/* OFDM RX DFIR */
1114*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, BBrx_DFIR, BIT23 | BIT22 | BIT21 | BIT20, 0x3);	/* OFDM RX DFIR */
1115*4882a593Smuzhiyun 		break;
1116*4882a593Smuzhiyun 
1117*4882a593Smuzhiyun 	case CHANNEL_WIDTH_40:
1118*4882a593Smuzhiyun 		/*
1119*4882a593Smuzhiyun 		0x800[0]=1'b1
1120*4882a593Smuzhiyun 		0x900[0]=1'b1
1121*4882a593Smuzhiyun 		0x800[10:8]=3'b111(80M)
1122*4882a593Smuzhiyun 		0x800[14:12]=3'b101(80M)
1123*4882a593Smuzhiyun 		0xCE4[31:30]=2'b00
1124*4882a593Smuzhiyun 		0xCE4[29:28]=2'b01
1125*4882a593Smuzhiyun 		0xc10[29:28]: 1
1126*4882a593Smuzhiyun 		0x954[19]=1'b0
1127*4882a593Smuzhiyun 		0x954[23:20]=0x6(For ACPR)
1128*4882a593Smuzhiyun 
1129*4882a593Smuzhiyun 		0xa00[4]=1/0
1130*4882a593Smuzhiyun 
1131*4882a593Smuzhiyun 		0x483[3:0]=1/2
1132*4882a593Smuzhiyun 		0x440[22:21]=2'b00
1133*4882a593Smuzhiyun 		*/
1134*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT0, 0x1);
1135*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA1_RFMOD, BIT0, 0x1);
1136*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT10 | BIT9 | BIT8, 0x7);			/* RXADC CLK */
1137*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT14 | BIT13 | BIT12, 0x5);		/* TXDAC CLK */
1138*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rOFDM0_TxPseudoNoiseWgt, BIT31 | BIT30, 0x0);		/* small BW */
1139*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rOFDM0_TxPseudoNoiseWgt, BIT29 | BIT28, 0x1);		/* adc buffer clk(TBD) */
1140*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rOFDM0_XARxAFE, BIT29 | BIT28, 0x1);				/* adc buffer clk(TBD) */
1141*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, BBrx_DFIR, BIT19, 0x0);							/* OFDM RX DFIR */
1142*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, BBrx_DFIR, BIT23 | BIT22 | BIT21 | BIT20, 0x6);	/* OFDM RX DFIR */
1143*4882a593Smuzhiyun 
1144*4882a593Smuzhiyun 		phy_set_bb_reg(Adapter, rCCK0_System, BIT4, (pHalData->nCur40MhzPrimeSC >> 1)); /* primary channel (CCK RXSC) */
1145*4882a593Smuzhiyun 
1146*4882a593Smuzhiyun 		SubChnlNum = phy_GetSecondaryChnl_8188F(Adapter);
1147*4882a593Smuzhiyun 		phy_set_mac_reg(Adapter, REG_DATA_SC_8188F, BIT3 | BIT2 | BIT1 | BIT0, SubChnlNum);	/* txsc_20 */
1148*4882a593Smuzhiyun 		phy_set_mac_reg(Adapter, REG_RRSR_8188F, BIT22 | BIT21, 0x0);							/* RRSR_RSC */
1149*4882a593Smuzhiyun 
1150*4882a593Smuzhiyun 		if (0)
1151*4882a593Smuzhiyun 			RTW_INFO("%s: REG_DATA_SC_8188F(%d) nCur40MhzPrimeSC(%d)\n", __func__, SubChnlNum, pHalData->nCur40MhzPrimeSC);
1152*4882a593Smuzhiyun 		break;
1153*4882a593Smuzhiyun 
1154*4882a593Smuzhiyun 	default:
1155*4882a593Smuzhiyun 		break;
1156*4882a593Smuzhiyun 	}
1157*4882a593Smuzhiyun 
1158*4882a593Smuzhiyun 	/*3<3>Set RF related register */
1159*4882a593Smuzhiyun 	PHY_RF6052SetBandwidth8188F(Adapter, pHalData->current_channel_bw);
1160*4882a593Smuzhiyun }
1161*4882a593Smuzhiyun 
1162*4882a593Smuzhiyun void
phy_SwChnl8188F(PADAPTER pAdapter)1163*4882a593Smuzhiyun phy_SwChnl8188F(
1164*4882a593Smuzhiyun 		PADAPTER					pAdapter
1165*4882a593Smuzhiyun )
1166*4882a593Smuzhiyun {
1167*4882a593Smuzhiyun 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(pAdapter);
1168*4882a593Smuzhiyun 	u8				channelToSW = pHalData->current_channel;
1169*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1170*4882a593Smuzhiyun 	struct dm_struct		*pDM_Odm = &pHalData->DM_OutSrc;
1171*4882a593Smuzhiyun #else  /* (DM_ODM_SUPPORT_TYPE == ODM_CE) */
1172*4882a593Smuzhiyun 	struct dm_struct		*pDM_Odm = &pHalData->odmpriv;
1173*4882a593Smuzhiyun #endif
1174*4882a593Smuzhiyun 
1175*4882a593Smuzhiyun 	if (pHalData->rf_chip == RF_PSEUDO_11N) {
1176*4882a593Smuzhiyun 		return;
1177*4882a593Smuzhiyun 	}
1178*4882a593Smuzhiyun 
1179*4882a593Smuzhiyun 	pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff00) | channelToSW);
1180*4882a593Smuzhiyun 	phy_set_rf_reg(pAdapter, RF_PATH_A, RF_CHNLBW, 0x3FF, pHalData->RfRegChnlVal[0]);
1181*4882a593Smuzhiyun 	/* phy_set_rf_reg(pAdapter, RF_PATH_B, RF_CHNLBW, 0x3FF, pHalData->RfRegChnlVal[0] ); */
1182*4882a593Smuzhiyun 
1183*4882a593Smuzhiyun 	/* RTW_INFO("===>phy_SwChnl8188F: Channel = %d\n", channelToSW); */
1184*4882a593Smuzhiyun 
1185*4882a593Smuzhiyun 	phy_SpurCalibration_8188F(pAdapter, channelToSW, 0x16);
1186*4882a593Smuzhiyun }
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun void
PHY_HandleSwChnlAndSetBW8188F(PADAPTER Adapter,BOOLEAN bSwitchChannel,BOOLEAN bSetBandWidth,u8 ChannelNum,enum channel_width ChnlWidth,EXTCHNL_OFFSET ExtChnlOffsetOf40MHz,EXTCHNL_OFFSET ExtChnlOffsetOf80MHz,u8 CenterFrequencyIndex1)1189*4882a593Smuzhiyun PHY_HandleSwChnlAndSetBW8188F(
1190*4882a593Smuzhiyun 		PADAPTER			Adapter,
1191*4882a593Smuzhiyun 		BOOLEAN				bSwitchChannel,
1192*4882a593Smuzhiyun 		BOOLEAN				bSetBandWidth,
1193*4882a593Smuzhiyun 		u8					ChannelNum,
1194*4882a593Smuzhiyun 		enum channel_width	ChnlWidth,
1195*4882a593Smuzhiyun 		EXTCHNL_OFFSET	ExtChnlOffsetOf40MHz,
1196*4882a593Smuzhiyun 		EXTCHNL_OFFSET	ExtChnlOffsetOf80MHz,
1197*4882a593Smuzhiyun 		u8					CenterFrequencyIndex1
1198*4882a593Smuzhiyun )
1199*4882a593Smuzhiyun {
1200*4882a593Smuzhiyun 	PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
1201*4882a593Smuzhiyun 
1202*4882a593Smuzhiyun 	/*check is swchnl or setbw */
1203*4882a593Smuzhiyun 	if (!bSwitchChannel && !bSetBandWidth) {
1204*4882a593Smuzhiyun 		RTW_INFO("PHY_HandleSwChnlAndSetBW8188F:  not switch channel and not set bandwidth\n");
1205*4882a593Smuzhiyun 		return;
1206*4882a593Smuzhiyun 	}
1207*4882a593Smuzhiyun 
1208*4882a593Smuzhiyun 	if (RTW_CANNOT_RUN(Adapter))
1209*4882a593Smuzhiyun 		return;
1210*4882a593Smuzhiyun 
1211*4882a593Smuzhiyun 	/*skip change for channel or bandwidth is the same */
1212*4882a593Smuzhiyun 	if (bSwitchChannel) {
1213*4882a593Smuzhiyun 		if (pHalData->current_channel != ChannelNum) {
1214*4882a593Smuzhiyun 			if (HAL_IsLegalChannel(Adapter, ChannelNum))
1215*4882a593Smuzhiyun 				pHalData->bSwChnl = _TRUE;
1216*4882a593Smuzhiyun 		}
1217*4882a593Smuzhiyun 	}
1218*4882a593Smuzhiyun 
1219*4882a593Smuzhiyun 	if (bSetBandWidth) {
1220*4882a593Smuzhiyun 		if ((pHalData->current_channel_bw != ChnlWidth) || (pHalData->nCur40MhzPrimeSC != ExtChnlOffsetOf40MHz) || (pHalData->CurrentCenterFrequencyIndex1 != CenterFrequencyIndex1))
1221*4882a593Smuzhiyun 			pHalData->bSetChnlBW = _TRUE;
1222*4882a593Smuzhiyun 	}
1223*4882a593Smuzhiyun 
1224*4882a593Smuzhiyun 	if (Adapter->bNotifyChannelChange)
1225*4882a593Smuzhiyun 		RTW_INFO("[%s] bSwChnl=%d, ch=%d, bSetChnlBW=%d, bw=%d\n", __func__,
1226*4882a593Smuzhiyun 			 pHalData->bSwChnl, ChannelNum, pHalData->bSetChnlBW, ChnlWidth);
1227*4882a593Smuzhiyun 
1228*4882a593Smuzhiyun 	if (!pHalData->bSetChnlBW && !pHalData->bSwChnl)
1229*4882a593Smuzhiyun 		goto exit_iqk;
1230*4882a593Smuzhiyun 
1231*4882a593Smuzhiyun 	pHalData->bSwChnl = _TRUE;
1232*4882a593Smuzhiyun 	pHalData->bSetChnlBW = _TRUE;
1233*4882a593Smuzhiyun 
1234*4882a593Smuzhiyun 	pHalData->current_channel = ChannelNum;
1235*4882a593Smuzhiyun 	pHalData->CurrentCenterFrequencyIndex1 = ChannelNum;
1236*4882a593Smuzhiyun 
1237*4882a593Smuzhiyun 	pHalData->current_channel_bw = ChnlWidth;
1238*4882a593Smuzhiyun 	pHalData->nCur40MhzPrimeSC = ExtChnlOffsetOf40MHz;
1239*4882a593Smuzhiyun 	pHalData->nCur80MhzPrimeSC = ExtChnlOffsetOf80MHz;
1240*4882a593Smuzhiyun 	pHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1;
1241*4882a593Smuzhiyun 
1242*4882a593Smuzhiyun 	phy_SwChnl8188F(Adapter);
1243*4882a593Smuzhiyun 	pHalData->bSwChnl = _FALSE;
1244*4882a593Smuzhiyun 
1245*4882a593Smuzhiyun 	phy_PostSetBwMode8188F(Adapter);
1246*4882a593Smuzhiyun 	pHalData->bSetChnlBW = _FALSE;
1247*4882a593Smuzhiyun 
1248*4882a593Smuzhiyun 	rtw_hal_set_tx_power_level(Adapter, pHalData->current_channel);
1249*4882a593Smuzhiyun 
1250*4882a593Smuzhiyun exit_iqk:
1251*4882a593Smuzhiyun 	if (pHalData->bNeedIQK == _TRUE) {
1252*4882a593Smuzhiyun 		if (pHalData->neediqk_24g == _TRUE) {
1253*4882a593Smuzhiyun 			halrf_iqk_trigger(&pHalData->odmpriv, _FALSE);
1254*4882a593Smuzhiyun 			pHalData->bIQKInitialized = _TRUE;
1255*4882a593Smuzhiyun 			pHalData->neediqk_24g = _FALSE;
1256*4882a593Smuzhiyun 		}
1257*4882a593Smuzhiyun 		pHalData->bNeedIQK = _FALSE;
1258*4882a593Smuzhiyun 	}
1259*4882a593Smuzhiyun }
1260*4882a593Smuzhiyun 
1261*4882a593Smuzhiyun void
PHY_SetSwChnlBWMode8188F(PADAPTER Adapter,u8 channel,enum channel_width Bandwidth,u8 Offset40,u8 Offset80)1262*4882a593Smuzhiyun PHY_SetSwChnlBWMode8188F(
1263*4882a593Smuzhiyun 		PADAPTER			Adapter,
1264*4882a593Smuzhiyun 		u8					channel,
1265*4882a593Smuzhiyun 		enum channel_width	Bandwidth,
1266*4882a593Smuzhiyun 		u8					Offset40,
1267*4882a593Smuzhiyun 		u8					Offset80
1268*4882a593Smuzhiyun )
1269*4882a593Smuzhiyun {
1270*4882a593Smuzhiyun 	/*RTW_INFO("%s()===>\n",__func__); */
1271*4882a593Smuzhiyun 
1272*4882a593Smuzhiyun 	PHY_HandleSwChnlAndSetBW8188F(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel);
1273*4882a593Smuzhiyun 
1274*4882a593Smuzhiyun 	/*RTW_INFO("<==%s()\n",__func__); */
1275*4882a593Smuzhiyun }
1276*4882a593Smuzhiyun 
1277*4882a593Smuzhiyun /* Set CCK and OFDM Block "ON" */
BBTurnOnBlock_8188F(_adapter * adapter)1278*4882a593Smuzhiyun void BBTurnOnBlock_8188F(_adapter *adapter)
1279*4882a593Smuzhiyun {
1280*4882a593Smuzhiyun #if (DISABLE_BB_RF)
1281*4882a593Smuzhiyun 	return;
1282*4882a593Smuzhiyun #endif
1283*4882a593Smuzhiyun 
1284*4882a593Smuzhiyun 	phy_set_bb_reg(adapter, rFPGA0_RFMOD, bCCKEn, 0x1);
1285*4882a593Smuzhiyun 	phy_set_bb_reg(adapter, rFPGA0_RFMOD, bOFDMEn, 0x1);
1286*4882a593Smuzhiyun }
1287*4882a593Smuzhiyun 
1288