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 #ifdef RTW_SIFS_INIT_BY_CORE
429*4882a593Smuzhiyun /* Set Spec SIFS (used in NAV) */
430*4882a593Smuzhiyun rtw_write16(Adapter, REG_SPEC_SIFS, 0x100a);
431*4882a593Smuzhiyun rtw_write16(Adapter, REG_MAC_SPEC_SIFS, 0x100a);
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun /* Set SIFS for CCK */
434*4882a593Smuzhiyun rtw_write16(Adapter, REG_SIFS_CTX, 0x100a);
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun /* Set SIFS for OFDM */
437*4882a593Smuzhiyun rtw_write16(Adapter, REG_SIFS_TRX, 0x100a);
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun /* RESP_SIFS for CCK */
440*4882a593Smuzhiyun rtw_write8(Adapter, REG_RESP_SIFS_CCK, 0x08); /* SIFS_T2T_CCK (0x08) */
441*4882a593Smuzhiyun rtw_write8(Adapter, REG_RESP_SIFS_CCK + 1, 0x08); /*SIFS_R2T_CCK(0x08) */
442*4882a593Smuzhiyun /* RESP_SIFS for OFDM */
443*4882a593Smuzhiyun rtw_write8(Adapter, REG_RESP_SIFS_OFDM, 0x0a); /* SIFS_T2T_OFDM (0x0a) */
444*4882a593Smuzhiyun rtw_write8(Adapter, REG_RESP_SIFS_OFDM + 1, 0x0a); /* SIFS_R2T_OFDM(0x0a) */
445*4882a593Smuzhiyun #endif
446*4882a593Smuzhiyun
447*4882a593Smuzhiyun rtw_hal_init_sifs_backup(Adapter);
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun return rtStatus;
450*4882a593Smuzhiyun }
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun /**
453*4882a593Smuzhiyun * Function: phy_InitBBRFRegisterDefinition
454*4882a593Smuzhiyun *
455*4882a593Smuzhiyun * OverView: Initialize Register definition offset for Radio Path A/B/C/D
456*4882a593Smuzhiyun *
457*4882a593Smuzhiyun * Input:
458*4882a593Smuzhiyun * PADAPTER Adapter,
459*4882a593Smuzhiyun *
460*4882a593Smuzhiyun * Output: None
461*4882a593Smuzhiyun * Return: None
462*4882a593Smuzhiyun * Note: The initialization value is constant and it should never be changes
463*4882a593Smuzhiyun */
464*4882a593Smuzhiyun static void
phy_InitBBRFRegisterDefinition(PADAPTER Adapter)465*4882a593Smuzhiyun phy_InitBBRFRegisterDefinition(
466*4882a593Smuzhiyun PADAPTER Adapter
467*4882a593Smuzhiyun )
468*4882a593Smuzhiyun {
469*4882a593Smuzhiyun HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun /* RF Interface Sowrtware Control */
472*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 LSBs if read 32-bit from 0x870 */
473*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun /* RF Interface Output (and Enable) */
476*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x860 */
477*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x864 */
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun /* RF Interface (Output and) Enable */
480*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */
481*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; /*LSSI Parameter */
484*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; /*wire control parameter2 */
487*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; /*wire control parameter2 */
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun /* Tranceiver Readback LSSI/HSPI mode */
490*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
491*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
492*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
493*4882a593Smuzhiyun pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun }
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun static int
phy_BB8188f_Config_ParaFile(PADAPTER Adapter)498*4882a593Smuzhiyun phy_BB8188f_Config_ParaFile(
499*4882a593Smuzhiyun PADAPTER Adapter
500*4882a593Smuzhiyun )
501*4882a593Smuzhiyun {
502*4882a593Smuzhiyun HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
503*4882a593Smuzhiyun int rtStatus = _SUCCESS;
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun /* */
506*4882a593Smuzhiyun /* 1. Read PHY_REG.TXT BB INIT!! */
507*4882a593Smuzhiyun /* */
508*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
509*4882a593Smuzhiyun if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_PHY_REG, CONFIG_BB_PHY_REG) == _FAIL)
510*4882a593Smuzhiyun #endif
511*4882a593Smuzhiyun {
512*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
513*4882a593Smuzhiyun if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG))
514*4882a593Smuzhiyun rtStatus = _FAIL;
515*4882a593Smuzhiyun #endif
516*4882a593Smuzhiyun }
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun if (rtStatus != _SUCCESS) {
519*4882a593Smuzhiyun RTW_INFO("%s():Write BB Reg Fail!!", __func__);
520*4882a593Smuzhiyun goto phy_BB8190_Config_ParaFile_Fail;
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun #if MP_DRIVER == 1
524*4882a593Smuzhiyun if (Adapter->registrypriv.mp_mode == 1) {
525*4882a593Smuzhiyun /* */
526*4882a593Smuzhiyun /* 1.1 Read PHY_REG_MP.TXT BB INIT!! */
527*4882a593Smuzhiyun /* */
528*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
529*4882a593Smuzhiyun if (phy_ConfigBBWithMpParaFile(Adapter, PHY_FILE_PHY_REG_MP) == _FAIL)
530*4882a593Smuzhiyun #endif
531*4882a593Smuzhiyun {
532*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
533*4882a593Smuzhiyun if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG_MP))
534*4882a593Smuzhiyun rtStatus = _FAIL;
535*4882a593Smuzhiyun #endif
536*4882a593Smuzhiyun }
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun if (rtStatus != _SUCCESS) {
539*4882a593Smuzhiyun RTW_INFO("%s():Write BB Reg MP Fail!!", __func__);
540*4882a593Smuzhiyun goto phy_BB8190_Config_ParaFile_Fail;
541*4882a593Smuzhiyun }
542*4882a593Smuzhiyun }
543*4882a593Smuzhiyun #endif /* #if (MP_DRIVER == 1) */
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun /* */
546*4882a593Smuzhiyun /* 2. Read BB AGC table Initialization */
547*4882a593Smuzhiyun /* */
548*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
549*4882a593Smuzhiyun if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_AGC_TAB, CONFIG_BB_AGC_TAB) == _FAIL)
550*4882a593Smuzhiyun #endif
551*4882a593Smuzhiyun {
552*4882a593Smuzhiyun #ifdef CONFIG_EMBEDDED_FWIMG
553*4882a593Smuzhiyun if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_AGC_TAB))
554*4882a593Smuzhiyun rtStatus = _FAIL;
555*4882a593Smuzhiyun #endif
556*4882a593Smuzhiyun }
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun if (rtStatus != _SUCCESS) {
559*4882a593Smuzhiyun RTW_INFO("%s():AGC Table Fail\n", __func__);
560*4882a593Smuzhiyun goto phy_BB8190_Config_ParaFile_Fail;
561*4882a593Smuzhiyun }
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun phy_BB8190_Config_ParaFile_Fail:
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun return rtStatus;
566*4882a593Smuzhiyun }
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun int
PHY_BBConfig8188F(PADAPTER Adapter)570*4882a593Smuzhiyun PHY_BBConfig8188F(
571*4882a593Smuzhiyun PADAPTER Adapter
572*4882a593Smuzhiyun )
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun int rtStatus = _SUCCESS;
575*4882a593Smuzhiyun HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
576*4882a593Smuzhiyun u16 RegVal;
577*4882a593Smuzhiyun u8 TmpU1B = 0;
578*4882a593Smuzhiyun u8 value8;
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun phy_InitBBRFRegisterDefinition(Adapter);
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun /* Enable BB and RF */
583*4882a593Smuzhiyun RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN);
584*4882a593Smuzhiyun RegVal |= BIT13 | FEN_BB_GLB_RSTn | FEN_BBRSTB;
585*4882a593Smuzhiyun rtw_write16(Adapter, REG_SYS_FUNC_EN, RegVal);
586*4882a593Smuzhiyun
587*4882a593Smuzhiyun #if 0 /* TODO: [BB]. reg 948 is only use for bt_coex */
588*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
589*4882a593Smuzhiyun rtw_write32(Adapter, 0x948, 0x0); /* USB use Antenna S0 */
590*4882a593Smuzhiyun #else
591*4882a593Smuzhiyun if (pHalData->ant_path == RF_PATH_A)
592*4882a593Smuzhiyun rtw_write32(Adapter, 0x948, 0x280);
593*4882a593Smuzhiyun else
594*4882a593Smuzhiyun rtw_write32(Adapter, 0x948, 0x0);
595*4882a593Smuzhiyun #endif
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun #endif
598*4882a593Smuzhiyun rtw_write8(Adapter, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun rtw_usleep_os(10);
601*4882a593Smuzhiyun
602*4882a593Smuzhiyun phy_set_rf_reg(Adapter, RF_PATH_A, 0x1, 0xfffff, 0x780);
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun #if 0
605*4882a593Smuzhiyun /* 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF. */
606*4882a593Smuzhiyun rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83);
607*4882a593Smuzhiyun rtw_write8(Adapter, REG_AFE_PLL_CTRL + 1, 0xdb);
608*4882a593Smuzhiyun #endif
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun /* Config BB and AGC */
611*4882a593Smuzhiyun rtStatus = phy_BB8188f_Config_ParaFile(Adapter);
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun if (rtw_phydm_set_crystal_cap(Adapter, pHalData->crystal_cap) == _FALSE) {
614*4882a593Smuzhiyun RTW_ERR("Init crystal_cap failed\n");
615*4882a593Smuzhiyun rtw_warn_on(1);
616*4882a593Smuzhiyun rtStatus = _FAIL;
617*4882a593Smuzhiyun }
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun return rtStatus;
620*4882a593Smuzhiyun }
621*4882a593Smuzhiyun
622*4882a593Smuzhiyun #if 0
623*4882a593Smuzhiyun /* Block & Path enable */
624*4882a593Smuzhiyun #define rOFDMCCKEN_Jaguar 0x808 /* OFDM/CCK block enable */
625*4882a593Smuzhiyun #define bOFDMEN_Jaguar 0x20000000
626*4882a593Smuzhiyun #define bCCKEN_Jaguar 0x10000000
627*4882a593Smuzhiyun #define rRxPath_Jaguar 0x808 /* Rx antenna */
628*4882a593Smuzhiyun #define bRxPath_Jaguar 0xff
629*4882a593Smuzhiyun #define rTxPath_Jaguar 0x80c /* Tx antenna */
630*4882a593Smuzhiyun #define bTxPath_Jaguar 0x0fffffff
631*4882a593Smuzhiyun #define rCCK_RX_Jaguar 0xa04 /* for cck rx path selection */
632*4882a593Smuzhiyun #define bCCK_RX_Jaguar 0x0c000000
633*4882a593Smuzhiyun #define rVhtlen_Use_Lsig_Jaguar 0x8c3 /* Use LSIG for VHT length */
634*4882a593Smuzhiyun void
635*4882a593Smuzhiyun PHY_BB8188F_Config_1T(
636*4882a593Smuzhiyun PADAPTER Adapter
637*4882a593Smuzhiyun )
638*4882a593Smuzhiyun {
639*4882a593Smuzhiyun /* BB OFDM RX Path_A */
640*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rRxPath_Jaguar, bRxPath_Jaguar, 0x11);
641*4882a593Smuzhiyun /* BB OFDM TX Path_A */
642*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxPath_Jaguar, bMaskLWord, 0x1111);
643*4882a593Smuzhiyun /* BB CCK R/Rx Path_A */
644*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0);
645*4882a593Smuzhiyun /* MCS support */
646*4882a593Smuzhiyun phy_set_bb_reg(Adapter, 0x8bc, 0xc0000060, 0x4);
647*4882a593Smuzhiyun /* RF Path_B HSSI OFF */
648*4882a593Smuzhiyun phy_set_bb_reg(Adapter, 0xe00, 0xf, 0x4);
649*4882a593Smuzhiyun /* RF Path_B Power Down */
650*4882a593Smuzhiyun phy_set_bb_reg(Adapter, 0xe90, bMaskDWord, 0);
651*4882a593Smuzhiyun /* ADDA Path_B OFF */
652*4882a593Smuzhiyun phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0);
653*4882a593Smuzhiyun phy_set_bb_reg(Adapter, 0xe64, bMaskDWord, 0);
654*4882a593Smuzhiyun }
655*4882a593Smuzhiyun #endif
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun int
PHY_RFConfig8188F(PADAPTER Adapter)658*4882a593Smuzhiyun PHY_RFConfig8188F(
659*4882a593Smuzhiyun PADAPTER Adapter
660*4882a593Smuzhiyun )
661*4882a593Smuzhiyun {
662*4882a593Smuzhiyun int rtStatus = _SUCCESS;
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun /* */
665*4882a593Smuzhiyun /* RF config */
666*4882a593Smuzhiyun /* */
667*4882a593Smuzhiyun rtStatus = PHY_RF6052_Config8188F(Adapter);
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun /*PHY_BB8188F_Config_1T(Adapter); */
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun return rtStatus;
672*4882a593Smuzhiyun }
673*4882a593Smuzhiyun
674*4882a593Smuzhiyun /*-----------------------------------------------------------------------------
675*4882a593Smuzhiyun * Function: PHY_ConfigRFWithParaFile()
676*4882a593Smuzhiyun *
677*4882a593Smuzhiyun * Overview: This function read RF parameters from general file format, and do RF 3-wire
678*4882a593Smuzhiyun *
679*4882a593Smuzhiyun * Input: PADAPTER Adapter
680*4882a593Smuzhiyun * ps1Byte pFileName
681*4882a593Smuzhiyun * enum rf_path eRFPath
682*4882a593Smuzhiyun *
683*4882a593Smuzhiyun * Output: NONE
684*4882a593Smuzhiyun *
685*4882a593Smuzhiyun * Return: RT_STATUS_SUCCESS: configuration file exist
686*4882a593Smuzhiyun *
687*4882a593Smuzhiyun * Note: Delay may be required for RF configuration
688*4882a593Smuzhiyun *---------------------------------------------------------------------------*/
689*4882a593Smuzhiyun int
PHY_ConfigRFWithParaFile_8188F(PADAPTER Adapter,u8 * pFileName,enum rf_path eRFPath)690*4882a593Smuzhiyun PHY_ConfigRFWithParaFile_8188F(
691*4882a593Smuzhiyun PADAPTER Adapter,
692*4882a593Smuzhiyun u8 *pFileName,
693*4882a593Smuzhiyun enum rf_path eRFPath
694*4882a593Smuzhiyun )
695*4882a593Smuzhiyun {
696*4882a593Smuzhiyun return _SUCCESS;
697*4882a593Smuzhiyun }
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun #ifdef CONFIG_FW_OFFLOAD_SET_TXPWR_IDX
phy_set_txpwr_idx_offload(_adapter * adapter)700*4882a593Smuzhiyun bool phy_set_txpwr_idx_offload(_adapter *adapter)
701*4882a593Smuzhiyun {
702*4882a593Smuzhiyun return GET_HAL_DATA(adapter)->intf_start
703*4882a593Smuzhiyun #ifdef CONFIG_MP_INCLUDED
704*4882a593Smuzhiyun && !rtw_mp_mode_check(adapter)
705*4882a593Smuzhiyun #endif
706*4882a593Smuzhiyun ;
707*4882a593Smuzhiyun }
708*4882a593Smuzhiyun
rtw_hal_h2c_txpwr_idx_offload(_adapter * adapter)709*4882a593Smuzhiyun s32 rtw_hal_h2c_txpwr_idx_offload(_adapter *adapter)
710*4882a593Smuzhiyun {
711*4882a593Smuzhiyun HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
712*4882a593Smuzhiyun u8 data[H2C_TXPWR_IDX_OFFLOAD_LEN] = {0};
713*4882a593Smuzhiyun s32 ret;
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun _rtw_memcpy(data, hal_data->txpwr_idx_offload_buf, 3);
716*4882a593Smuzhiyun SET_H2CCMD_TXPWR_IDX_EN(data, 1);
717*4882a593Smuzhiyun
718*4882a593Smuzhiyun ret = rtw_hal_fill_h2c_cmd(adapter, H2C_TXPWR_IDX_OFFLOAD, H2C_TXPWR_IDX_OFFLOAD_LEN, data);
719*4882a593Smuzhiyun if (ret != _SUCCESS)
720*4882a593Smuzhiyun RTW_WARN("%s fail\n", __func__);
721*4882a593Smuzhiyun
722*4882a593Smuzhiyun return ret;
723*4882a593Smuzhiyun }
724*4882a593Smuzhiyun
phy_set_txpwr_offload_8188f(_adapter * adapter)725*4882a593Smuzhiyun s32 phy_set_txpwr_offload_8188f(_adapter *adapter)
726*4882a593Smuzhiyun {
727*4882a593Smuzhiyun HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
728*4882a593Smuzhiyun struct submit_ctx *sctx = &hal_data->txpwr_idx_offload_sctx;
729*4882a593Smuzhiyun s32 ret = _SUCCESS;
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun rtw_sctx_init(sctx, 500);
732*4882a593Smuzhiyun ret = rtw_hal_h2c_txpwr_idx_offload(adapter);
733*4882a593Smuzhiyun if (ret != _SUCCESS)
734*4882a593Smuzhiyun goto exit;
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun /* wait till rpt done or timeout */
737*4882a593Smuzhiyun ret = c2h_txpwr_idx_offload_wait(adapter);
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun exit:
740*4882a593Smuzhiyun return ret;
741*4882a593Smuzhiyun }
742*4882a593Smuzhiyun #endif /* CONFIG_FW_OFFLOAD_SET_TXPWR_IDX */
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun /**************************************************************************************************************
745*4882a593Smuzhiyun * Description:
746*4882a593Smuzhiyun * The low-level interface to set TxAGC , called by both MP and Normal Driver.
747*4882a593Smuzhiyun *
748*4882a593Smuzhiyun * <20120830, Kordan>
749*4882a593Smuzhiyun **************************************************************************************************************/
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun void
PHY_SetTxPowerIndex_8188F(PADAPTER Adapter,u32 PowerIndex,enum rf_path RFPath,u8 Rate)752*4882a593Smuzhiyun PHY_SetTxPowerIndex_8188F(
753*4882a593Smuzhiyun PADAPTER Adapter,
754*4882a593Smuzhiyun u32 PowerIndex,
755*4882a593Smuzhiyun enum rf_path RFPath,
756*4882a593Smuzhiyun u8 Rate
757*4882a593Smuzhiyun )
758*4882a593Smuzhiyun {
759*4882a593Smuzhiyun #ifdef CONFIG_FW_OFFLOAD_SET_TXPWR_IDX
760*4882a593Smuzhiyun if (phy_set_txpwr_idx_offload(Adapter)) {
761*4882a593Smuzhiyun HAL_DATA_TYPE *hal_data = GET_HAL_DATA(Adapter);
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun if (Rate == MGN_11M)
764*4882a593Smuzhiyun hal_data->txpwr_idx_offload_buf[CCK] = PowerIndex;
765*4882a593Smuzhiyun else if (Rate == MGN_54M)
766*4882a593Smuzhiyun hal_data->txpwr_idx_offload_buf[OFDM] = PowerIndex;
767*4882a593Smuzhiyun else if (Rate == MGN_MCS7)
768*4882a593Smuzhiyun hal_data->txpwr_idx_offload_buf[HT_1SS] = PowerIndex;
769*4882a593Smuzhiyun
770*4882a593Smuzhiyun return;
771*4882a593Smuzhiyun }
772*4882a593Smuzhiyun #endif
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun if (RFPath == RF_PATH_A || RFPath == RF_PATH_B) {
775*4882a593Smuzhiyun switch (Rate) {
776*4882a593Smuzhiyun case MGN_1M:
777*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, PowerIndex);
778*4882a593Smuzhiyun break;
779*4882a593Smuzhiyun case MGN_2M:
780*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte1, PowerIndex);
781*4882a593Smuzhiyun break;
782*4882a593Smuzhiyun case MGN_5_5M:
783*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte2, PowerIndex);
784*4882a593Smuzhiyun break;
785*4882a593Smuzhiyun case MGN_11M:
786*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte3, PowerIndex);
787*4882a593Smuzhiyun break;
788*4882a593Smuzhiyun
789*4882a593Smuzhiyun case MGN_6M:
790*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte0, PowerIndex);
791*4882a593Smuzhiyun break;
792*4882a593Smuzhiyun case MGN_9M:
793*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte1, PowerIndex);
794*4882a593Smuzhiyun break;
795*4882a593Smuzhiyun case MGN_12M:
796*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte2, PowerIndex);
797*4882a593Smuzhiyun break;
798*4882a593Smuzhiyun case MGN_18M:
799*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Rate18_06, bMaskByte3, PowerIndex);
800*4882a593Smuzhiyun break;
801*4882a593Smuzhiyun
802*4882a593Smuzhiyun case MGN_24M:
803*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte0, PowerIndex);
804*4882a593Smuzhiyun break;
805*4882a593Smuzhiyun case MGN_36M:
806*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte1, PowerIndex);
807*4882a593Smuzhiyun break;
808*4882a593Smuzhiyun case MGN_48M:
809*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte2, PowerIndex);
810*4882a593Smuzhiyun break;
811*4882a593Smuzhiyun case MGN_54M:
812*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Rate54_24, bMaskByte3, PowerIndex);
813*4882a593Smuzhiyun break;
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun case MGN_MCS0:
816*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte0, PowerIndex);
817*4882a593Smuzhiyun break;
818*4882a593Smuzhiyun case MGN_MCS1:
819*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte1, PowerIndex);
820*4882a593Smuzhiyun break;
821*4882a593Smuzhiyun case MGN_MCS2:
822*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte2, PowerIndex);
823*4882a593Smuzhiyun break;
824*4882a593Smuzhiyun case MGN_MCS3:
825*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte3, PowerIndex);
826*4882a593Smuzhiyun break;
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun case MGN_MCS4:
829*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte0, PowerIndex);
830*4882a593Smuzhiyun break;
831*4882a593Smuzhiyun case MGN_MCS5:
832*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte1, PowerIndex);
833*4882a593Smuzhiyun break;
834*4882a593Smuzhiyun case MGN_MCS6:
835*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte2, PowerIndex);
836*4882a593Smuzhiyun break;
837*4882a593Smuzhiyun case MGN_MCS7:
838*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte3, PowerIndex);
839*4882a593Smuzhiyun break;
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun default:
842*4882a593Smuzhiyun RTW_INFO("Invalid Rate!!\n");
843*4882a593Smuzhiyun break;
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun }
846*4882a593Smuzhiyun }
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun void
PHY_SetTxPowerLevel8188F(PADAPTER Adapter,u8 Channel)849*4882a593Smuzhiyun PHY_SetTxPowerLevel8188F(
850*4882a593Smuzhiyun PADAPTER Adapter,
851*4882a593Smuzhiyun u8 Channel
852*4882a593Smuzhiyun )
853*4882a593Smuzhiyun {
854*4882a593Smuzhiyun phy_set_tx_power_level_by_path(Adapter, Channel, RF_PATH_A);
855*4882a593Smuzhiyun }
856*4882a593Smuzhiyun
rtl8188f_set_txpwr_done(_adapter * adapter)857*4882a593Smuzhiyun void rtl8188f_set_txpwr_done(_adapter *adapter)
858*4882a593Smuzhiyun {
859*4882a593Smuzhiyun /* TODO: for not offload case */
860*4882a593Smuzhiyun
861*4882a593Smuzhiyun #ifdef CONFIG_FW_OFFLOAD_SET_TXPWR_IDX
862*4882a593Smuzhiyun if (phy_set_txpwr_idx_offload(adapter))
863*4882a593Smuzhiyun phy_set_txpwr_offload_8188f(adapter);
864*4882a593Smuzhiyun #endif
865*4882a593Smuzhiyun }
866*4882a593Smuzhiyun
867*4882a593Smuzhiyun /* A workaround to eliminate the 2400MHz, 2440MHz, 2480MHz spur of 8188F. (Asked by David.) */
868*4882a593Smuzhiyun void
phy_SpurCalibration_8188F(PADAPTER pAdapter,u8 ToChannel,u8 threshold)869*4882a593Smuzhiyun phy_SpurCalibration_8188F(
870*4882a593Smuzhiyun PADAPTER pAdapter,
871*4882a593Smuzhiyun u8 ToChannel,
872*4882a593Smuzhiyun u8 threshold
873*4882a593Smuzhiyun )
874*4882a593Smuzhiyun {
875*4882a593Smuzhiyun u32 freq[7] = {0xFCCD, 0xFC4D, 0xFFCD, 0xFF4D, 0xFCCD, 0xFF9A, 0xFDCD}; /* {chnl 5, 6, 7, 8, 13, 14 , 11} */
876*4882a593Smuzhiyun u8 idx = 0;
877*4882a593Smuzhiyun u8 b_doNotch = FALSE;
878*4882a593Smuzhiyun u8 initial_gain;
879*4882a593Smuzhiyun BOOLEAN bHW_Ctrl = FALSE, bSW_Ctrl = FALSE, bHW_Ctrl_S1 = FALSE, bSW_Ctrl_S1 = FALSE;
880*4882a593Smuzhiyun u32 reg948;
881*4882a593Smuzhiyun
882*4882a593Smuzhiyun /* add for notch */
883*4882a593Smuzhiyun u32 wlan_channel, CurrentChannel, Is40MHz;
884*4882a593Smuzhiyun HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
885*4882a593Smuzhiyun struct dm_struct *pDM_Odm = &(pHalData->odmpriv);
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun #ifdef CONFIG_AUTO_NOTCH_FILTER
888*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x1F);
889*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */
890*4882a593Smuzhiyun #endif
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun /* check threshold */
893*4882a593Smuzhiyun if (threshold <= 0x0)
894*4882a593Smuzhiyun threshold = 0x16;
895*4882a593Smuzhiyun
896*4882a593Smuzhiyun /* RTW_INFO("===> phy_SpurCalibration_8188F: Channel = %d\n", ToChannel); */
897*4882a593Smuzhiyun
898*4882a593Smuzhiyun if (ToChannel == 5)
899*4882a593Smuzhiyun idx = 0;
900*4882a593Smuzhiyun else if (ToChannel == 6)
901*4882a593Smuzhiyun idx = 1;
902*4882a593Smuzhiyun else if (ToChannel == 7)
903*4882a593Smuzhiyun idx = 2;
904*4882a593Smuzhiyun else if (ToChannel == 8)
905*4882a593Smuzhiyun idx = 3;
906*4882a593Smuzhiyun else if (ToChannel == 13)
907*4882a593Smuzhiyun idx = 4;
908*4882a593Smuzhiyun else if (ToChannel == 14)
909*4882a593Smuzhiyun idx = 5;
910*4882a593Smuzhiyun else if (ToChannel == 11)
911*4882a593Smuzhiyun idx = 6;
912*4882a593Smuzhiyun else
913*4882a593Smuzhiyun idx = 10;
914*4882a593Smuzhiyun
915*4882a593Smuzhiyun reg948 = phy_query_bb_reg(pAdapter, rS0S1_PathSwitch, bMaskDWord);
916*4882a593Smuzhiyun if ((reg948 & BIT6) == 0x0)
917*4882a593Smuzhiyun bSW_Ctrl = TRUE;
918*4882a593Smuzhiyun else
919*4882a593Smuzhiyun bHW_Ctrl = TRUE;
920*4882a593Smuzhiyun
921*4882a593Smuzhiyun if (bHW_Ctrl)
922*4882a593Smuzhiyun bHW_Ctrl_S1 = (phy_query_bb_reg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5 | BIT4 | BIT3) == 0x1) ? TRUE : FALSE;
923*4882a593Smuzhiyun else if (bSW_Ctrl)
924*4882a593Smuzhiyun bSW_Ctrl_S1 = ((reg948 & BIT9) == 0x0) ? TRUE : FALSE;
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun /* If wlan at S1 (both HW control & SW control) and current channel=5,6,7,8,13,14 */
927*4882a593Smuzhiyun if ((bHW_Ctrl_S1 || bSW_Ctrl_S1) && (idx <= 6)) {
928*4882a593Smuzhiyun initial_gain = (u8)(odm_get_bb_reg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0) & 0x7f);
929*4882a593Smuzhiyun phy_set_bb_reg(pAdapter, rFPGA0_RFMOD, BIT24, 0); /* Disable CCK block */
930*4882a593Smuzhiyun odm_write_dig(pDM_Odm, 0x30);
931*4882a593Smuzhiyun phy_set_bb_reg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccf000c0); /* disable 3-wire */
932*4882a593Smuzhiyun
933*4882a593Smuzhiyun phy_set_bb_reg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, freq[idx]); /* Setup PSD */
934*4882a593Smuzhiyun phy_set_bb_reg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, 0x400000 | freq[idx]); /* Start PSD */
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun rtw_msleep_os(30);
937*4882a593Smuzhiyun
938*4882a593Smuzhiyun if (phy_query_bb_reg(pAdapter, rFPGA0_PSDReport, bMaskDWord) >= threshold)
939*4882a593Smuzhiyun b_doNotch = TRUE;
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun phy_set_bb_reg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, freq[idx]); /* turn off PSD */
942*4882a593Smuzhiyun
943*4882a593Smuzhiyun phy_set_bb_reg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccc000c0); /* enable 3-wire */
944*4882a593Smuzhiyun phy_set_bb_reg(pAdapter, rFPGA0_RFMOD, BIT24, 1); /* Enable CCK block */
945*4882a593Smuzhiyun odm_write_dig(pDM_Odm, initial_gain);
946*4882a593Smuzhiyun }
947*4882a593Smuzhiyun
948*4882a593Smuzhiyun /* --- Notch Filter --- Asked by Rock */
949*4882a593Smuzhiyun if (b_doNotch) {
950*4882a593Smuzhiyun CurrentChannel = odm_get_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
951*4882a593Smuzhiyun wlan_channel = CurrentChannel & 0x0f; /*Get center frequency */
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun switch (wlan_channel) { /*Set notch filter */
954*4882a593Smuzhiyun case 5:
955*4882a593Smuzhiyun case 13:
956*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
957*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0xB);
958*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */
959*4882a593Smuzhiyun #endif
960*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x06000000);
961*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
962*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
963*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
964*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */
965*4882a593Smuzhiyun break;
966*4882a593Smuzhiyun case 6:
967*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
968*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x4);
969*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */
970*4882a593Smuzhiyun #endif
971*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000600);
972*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
973*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
974*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
975*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */
976*4882a593Smuzhiyun break;
977*4882a593Smuzhiyun case 7:
978*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
979*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x3);
980*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */
981*4882a593Smuzhiyun #endif
982*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
983*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
984*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
985*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x06000000);
986*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */
987*4882a593Smuzhiyun break;
988*4882a593Smuzhiyun case 8:
989*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
990*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0xA);
991*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */
992*4882a593Smuzhiyun #endif
993*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
994*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
995*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
996*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000380);
997*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */
998*4882a593Smuzhiyun break;
999*4882a593Smuzhiyun case 11:
1000*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
1001*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT28|BIT27|BIT26|BIT25|BIT24, 0x19);
1002*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter*/
1003*4882a593Smuzhiyun #endif
1004*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
1005*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x04000000);
1006*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
1007*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
1008*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask*/
1009*4882a593Smuzhiyun break;
1010*4882a593Smuzhiyun case 14:
1011*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
1012*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x5);
1013*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */
1014*4882a593Smuzhiyun #endif
1015*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
1016*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
1017*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
1018*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD4C, bMaskDWord, 0x00180000);
1019*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */
1020*4882a593Smuzhiyun break;
1021*4882a593Smuzhiyun default:
1022*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
1023*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x0); /*disable notch filter */
1024*4882a593Smuzhiyun #endif
1025*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x0); /*disable CSI mask function */
1026*4882a593Smuzhiyun break;
1027*4882a593Smuzhiyun } /*switch(wlan_channel) */
1028*4882a593Smuzhiyun return;
1029*4882a593Smuzhiyun }
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun #ifndef CONFIG_AUTO_NOTCH_FILTER
1032*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xC40, BIT9, 0x0); /*disable notch filter */
1033*4882a593Smuzhiyun #endif
1034*4882a593Smuzhiyun odm_set_bb_reg(pDM_Odm, 0xD2C, BIT28, 0x0); /*disable CSI mask */
1035*4882a593Smuzhiyun
1036*4882a593Smuzhiyun }
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun void
phy_SetRegBW_8188F(PADAPTER Adapter,enum channel_width CurrentBW)1039*4882a593Smuzhiyun phy_SetRegBW_8188F(
1040*4882a593Smuzhiyun PADAPTER Adapter,
1041*4882a593Smuzhiyun enum channel_width CurrentBW
1042*4882a593Smuzhiyun )
1043*4882a593Smuzhiyun {
1044*4882a593Smuzhiyun u16 RegRfMod_BW, u2tmp = 0;
1045*4882a593Smuzhiyun RegRfMod_BW = rtw_read16(Adapter, REG_TRXPTCL_CTL_8188F);
1046*4882a593Smuzhiyun
1047*4882a593Smuzhiyun switch (CurrentBW) {
1048*4882a593Smuzhiyun case CHANNEL_WIDTH_20:
1049*4882a593Smuzhiyun rtw_write16(Adapter, REG_TRXPTCL_CTL_8188F, (RegRfMod_BW & 0xFE7F)); /* BIT 7 = 0, BIT 8 = 0 */
1050*4882a593Smuzhiyun break;
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun case CHANNEL_WIDTH_40:
1053*4882a593Smuzhiyun u2tmp = RegRfMod_BW | BIT7;
1054*4882a593Smuzhiyun rtw_write16(Adapter, REG_TRXPTCL_CTL_8188F, (u2tmp & 0xFEFF)); /* BIT 7 = 1, BIT 8 = 0 */
1055*4882a593Smuzhiyun break;
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun case CHANNEL_WIDTH_80:
1058*4882a593Smuzhiyun u2tmp = RegRfMod_BW | BIT8;
1059*4882a593Smuzhiyun rtw_write16(Adapter, REG_TRXPTCL_CTL_8188F, (u2tmp & 0xFF7F)); /* BIT 7 = 0, BIT 8 = 1 */
1060*4882a593Smuzhiyun break;
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun default:
1063*4882a593Smuzhiyun RTW_INFO("phy_PostSetBWMode8188F(): unknown Bandwidth: %#X\n", CurrentBW);
1064*4882a593Smuzhiyun break;
1065*4882a593Smuzhiyun }
1066*4882a593Smuzhiyun }
1067*4882a593Smuzhiyun
1068*4882a593Smuzhiyun u8
phy_GetSecondaryChnl_8188F(PADAPTER Adapter)1069*4882a593Smuzhiyun phy_GetSecondaryChnl_8188F(
1070*4882a593Smuzhiyun PADAPTER Adapter
1071*4882a593Smuzhiyun )
1072*4882a593Smuzhiyun {
1073*4882a593Smuzhiyun u8 SCSettingOf40 = 0, SCSettingOf20 = 0;
1074*4882a593Smuzhiyun PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
1075*4882a593Smuzhiyun
1076*4882a593Smuzhiyun if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) {
1077*4882a593Smuzhiyun if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
1078*4882a593Smuzhiyun SCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
1079*4882a593Smuzhiyun else if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
1080*4882a593Smuzhiyun SCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
1084*4882a593Smuzhiyun SCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
1085*4882a593Smuzhiyun else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
1086*4882a593Smuzhiyun SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
1087*4882a593Smuzhiyun else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
1088*4882a593Smuzhiyun SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
1089*4882a593Smuzhiyun else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
1090*4882a593Smuzhiyun SCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
1091*4882a593Smuzhiyun
1092*4882a593Smuzhiyun } else if (pHalData->current_channel_bw == CHANNEL_WIDTH_40) {
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun if (pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
1095*4882a593Smuzhiyun SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
1096*4882a593Smuzhiyun else if (pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
1097*4882a593Smuzhiyun SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
1098*4882a593Smuzhiyun
1099*4882a593Smuzhiyun }
1100*4882a593Smuzhiyun
1101*4882a593Smuzhiyun return (SCSettingOf40 << 4) | SCSettingOf20;
1102*4882a593Smuzhiyun }
1103*4882a593Smuzhiyun
1104*4882a593Smuzhiyun void
phy_PostSetBwMode8188F(PADAPTER Adapter)1105*4882a593Smuzhiyun phy_PostSetBwMode8188F(
1106*4882a593Smuzhiyun PADAPTER Adapter
1107*4882a593Smuzhiyun )
1108*4882a593Smuzhiyun {
1109*4882a593Smuzhiyun u8 SubChnlNum = 0;
1110*4882a593Smuzhiyun HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1111*4882a593Smuzhiyun
1112*4882a593Smuzhiyun /* RTW_INFO("===>%s: current_channel_bw = %s Mhz\n", __func__, pHalData->current_channel_bw?"40":"20"); */
1113*4882a593Smuzhiyun
1114*4882a593Smuzhiyun switch (pHalData->current_channel_bw) {
1115*4882a593Smuzhiyun case CHANNEL_WIDTH_20:
1116*4882a593Smuzhiyun /*
1117*4882a593Smuzhiyun 0x800[0]=1'b0
1118*4882a593Smuzhiyun 0x900[0]=1'b0
1119*4882a593Smuzhiyun 0x800[10:8]=3'b111(80M)
1120*4882a593Smuzhiyun 0x800[14:12]=3'b101(80M)
1121*4882a593Smuzhiyun 0xCE4[31:30]=2'b00
1122*4882a593Smuzhiyun 0xCE4[29:28]=2'b01
1123*4882a593Smuzhiyun 0xc10[29:28]=1
1124*4882a593Smuzhiyun 0x954[19]=1'b0
1125*4882a593Smuzhiyun 0x954[23:20]=3
1126*4882a593Smuzhiyun */
1127*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT0, 0x0);
1128*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rFPGA1_RFMOD, BIT0, 0x0);
1129*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT10 | BIT9 | BIT8, 0x7); /* RXADC CLK */
1130*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT14 | BIT13 | BIT12, 0x5); /* TXDAC CLK */
1131*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rOFDM0_TxPseudoNoiseWgt, BIT31 | BIT30, 0x0); /* small BW */
1132*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rOFDM0_TxPseudoNoiseWgt, BIT29 | BIT28, 0x1); /* adc buffer clk(TBD) */
1133*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rOFDM0_XARxAFE, BIT29 | BIT28, 0x1); /* adc buffer clk(TBD) */
1134*4882a593Smuzhiyun phy_set_bb_reg(Adapter, BBrx_DFIR, BIT19, 0x0); /* OFDM RX DFIR */
1135*4882a593Smuzhiyun phy_set_bb_reg(Adapter, BBrx_DFIR, BIT23 | BIT22 | BIT21 | BIT20, 0x3); /* OFDM RX DFIR */
1136*4882a593Smuzhiyun break;
1137*4882a593Smuzhiyun
1138*4882a593Smuzhiyun case CHANNEL_WIDTH_40:
1139*4882a593Smuzhiyun /*
1140*4882a593Smuzhiyun 0x800[0]=1'b1
1141*4882a593Smuzhiyun 0x900[0]=1'b1
1142*4882a593Smuzhiyun 0x800[10:8]=3'b111(80M)
1143*4882a593Smuzhiyun 0x800[14:12]=3'b101(80M)
1144*4882a593Smuzhiyun 0xCE4[31:30]=2'b00
1145*4882a593Smuzhiyun 0xCE4[29:28]=2'b01
1146*4882a593Smuzhiyun 0xc10[29:28]: 1
1147*4882a593Smuzhiyun 0x954[19]=1'b0
1148*4882a593Smuzhiyun 0x954[23:20]=0x6(For ACPR)
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun 0xa00[4]=1/0
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun 0x483[3:0]=1/2
1153*4882a593Smuzhiyun 0x440[22:21]=2'b00
1154*4882a593Smuzhiyun */
1155*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT0, 0x1);
1156*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rFPGA1_RFMOD, BIT0, 0x1);
1157*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT10 | BIT9 | BIT8, 0x7); /* RXADC CLK */
1158*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rFPGA0_RFMOD, BIT14 | BIT13 | BIT12, 0x5); /* TXDAC CLK */
1159*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rOFDM0_TxPseudoNoiseWgt, BIT31 | BIT30, 0x0); /* small BW */
1160*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rOFDM0_TxPseudoNoiseWgt, BIT29 | BIT28, 0x1); /* adc buffer clk(TBD) */
1161*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rOFDM0_XARxAFE, BIT29 | BIT28, 0x1); /* adc buffer clk(TBD) */
1162*4882a593Smuzhiyun phy_set_bb_reg(Adapter, BBrx_DFIR, BIT19, 0x0); /* OFDM RX DFIR */
1163*4882a593Smuzhiyun phy_set_bb_reg(Adapter, BBrx_DFIR, BIT23 | BIT22 | BIT21 | BIT20, 0x6); /* OFDM RX DFIR */
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun phy_set_bb_reg(Adapter, rCCK0_System, BIT4, (pHalData->nCur40MhzPrimeSC >> 1)); /* primary channel (CCK RXSC) */
1166*4882a593Smuzhiyun
1167*4882a593Smuzhiyun SubChnlNum = phy_GetSecondaryChnl_8188F(Adapter);
1168*4882a593Smuzhiyun phy_set_mac_reg(Adapter, REG_DATA_SC_8188F, BIT3 | BIT2 | BIT1 | BIT0, SubChnlNum); /* txsc_20 */
1169*4882a593Smuzhiyun phy_set_mac_reg(Adapter, REG_RRSR_8188F, BIT22 | BIT21, 0x0); /* RRSR_RSC */
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun if (0)
1172*4882a593Smuzhiyun RTW_INFO("%s: REG_DATA_SC_8188F(%d) nCur40MhzPrimeSC(%d)\n", __func__, SubChnlNum, pHalData->nCur40MhzPrimeSC);
1173*4882a593Smuzhiyun break;
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun default:
1176*4882a593Smuzhiyun break;
1177*4882a593Smuzhiyun }
1178*4882a593Smuzhiyun
1179*4882a593Smuzhiyun /*3<3>Set RF related register */
1180*4882a593Smuzhiyun PHY_RF6052SetBandwidth8188F(Adapter, pHalData->current_channel_bw);
1181*4882a593Smuzhiyun }
1182*4882a593Smuzhiyun
1183*4882a593Smuzhiyun void
phy_SwChnl8188F(PADAPTER pAdapter)1184*4882a593Smuzhiyun phy_SwChnl8188F(
1185*4882a593Smuzhiyun PADAPTER pAdapter
1186*4882a593Smuzhiyun )
1187*4882a593Smuzhiyun {
1188*4882a593Smuzhiyun HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1189*4882a593Smuzhiyun u8 channelToSW = pHalData->current_channel;
1190*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1191*4882a593Smuzhiyun struct dm_struct *pDM_Odm = &pHalData->DM_OutSrc;
1192*4882a593Smuzhiyun #else /* (DM_ODM_SUPPORT_TYPE == ODM_CE) */
1193*4882a593Smuzhiyun struct dm_struct *pDM_Odm = &pHalData->odmpriv;
1194*4882a593Smuzhiyun #endif
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun if (pHalData->rf_chip == RF_PSEUDO_11N) {
1197*4882a593Smuzhiyun return;
1198*4882a593Smuzhiyun }
1199*4882a593Smuzhiyun
1200*4882a593Smuzhiyun pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff00) | channelToSW);
1201*4882a593Smuzhiyun phy_set_rf_reg(pAdapter, RF_PATH_A, RF_CHNLBW, 0x3FF, pHalData->RfRegChnlVal[0]);
1202*4882a593Smuzhiyun /* phy_set_rf_reg(pAdapter, RF_PATH_B, RF_CHNLBW, 0x3FF, pHalData->RfRegChnlVal[0] ); */
1203*4882a593Smuzhiyun
1204*4882a593Smuzhiyun /* RTW_INFO("===>phy_SwChnl8188F: Channel = %d\n", channelToSW); */
1205*4882a593Smuzhiyun
1206*4882a593Smuzhiyun phy_SpurCalibration_8188F(pAdapter, channelToSW, 0x16);
1207*4882a593Smuzhiyun }
1208*4882a593Smuzhiyun
1209*4882a593Smuzhiyun void
PHY_HandleSwChnlAndSetBW8188F(PADAPTER Adapter,BOOLEAN bSwitchChannel,BOOLEAN bSetBandWidth,u8 ChannelNum,enum channel_width ChnlWidth,EXTCHNL_OFFSET ExtChnlOffsetOf40MHz,EXTCHNL_OFFSET ExtChnlOffsetOf80MHz,u8 CenterFrequencyIndex1)1210*4882a593Smuzhiyun PHY_HandleSwChnlAndSetBW8188F(
1211*4882a593Smuzhiyun PADAPTER Adapter,
1212*4882a593Smuzhiyun BOOLEAN bSwitchChannel,
1213*4882a593Smuzhiyun BOOLEAN bSetBandWidth,
1214*4882a593Smuzhiyun u8 ChannelNum,
1215*4882a593Smuzhiyun enum channel_width ChnlWidth,
1216*4882a593Smuzhiyun EXTCHNL_OFFSET ExtChnlOffsetOf40MHz,
1217*4882a593Smuzhiyun EXTCHNL_OFFSET ExtChnlOffsetOf80MHz,
1218*4882a593Smuzhiyun u8 CenterFrequencyIndex1
1219*4882a593Smuzhiyun )
1220*4882a593Smuzhiyun {
1221*4882a593Smuzhiyun PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
1222*4882a593Smuzhiyun
1223*4882a593Smuzhiyun /*check is swchnl or setbw */
1224*4882a593Smuzhiyun if (!bSwitchChannel && !bSetBandWidth) {
1225*4882a593Smuzhiyun RTW_INFO("PHY_HandleSwChnlAndSetBW8188F: not switch channel and not set bandwidth\n");
1226*4882a593Smuzhiyun return;
1227*4882a593Smuzhiyun }
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun if (RTW_CANNOT_RUN(Adapter))
1230*4882a593Smuzhiyun return;
1231*4882a593Smuzhiyun
1232*4882a593Smuzhiyun /*skip change for channel or bandwidth is the same */
1233*4882a593Smuzhiyun if (bSwitchChannel) {
1234*4882a593Smuzhiyun if (pHalData->current_channel != ChannelNum) {
1235*4882a593Smuzhiyun if (HAL_IsLegalChannel(Adapter, ChannelNum))
1236*4882a593Smuzhiyun pHalData->bSwChnl = _TRUE;
1237*4882a593Smuzhiyun }
1238*4882a593Smuzhiyun }
1239*4882a593Smuzhiyun
1240*4882a593Smuzhiyun if (bSetBandWidth) {
1241*4882a593Smuzhiyun if ((pHalData->current_channel_bw != ChnlWidth) || (pHalData->nCur40MhzPrimeSC != ExtChnlOffsetOf40MHz) || (pHalData->CurrentCenterFrequencyIndex1 != CenterFrequencyIndex1))
1242*4882a593Smuzhiyun pHalData->bSetChnlBW = _TRUE;
1243*4882a593Smuzhiyun }
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun if (Adapter->bNotifyChannelChange)
1246*4882a593Smuzhiyun RTW_INFO("[%s] bSwChnl=%d, ch=%d, bSetChnlBW=%d, bw=%d\n", __func__,
1247*4882a593Smuzhiyun pHalData->bSwChnl, ChannelNum, pHalData->bSetChnlBW, ChnlWidth);
1248*4882a593Smuzhiyun
1249*4882a593Smuzhiyun if (!pHalData->bSetChnlBW && !pHalData->bSwChnl)
1250*4882a593Smuzhiyun goto exit_iqk;
1251*4882a593Smuzhiyun
1252*4882a593Smuzhiyun pHalData->bSwChnl = _TRUE;
1253*4882a593Smuzhiyun pHalData->bSetChnlBW = _TRUE;
1254*4882a593Smuzhiyun
1255*4882a593Smuzhiyun pHalData->current_channel = ChannelNum;
1256*4882a593Smuzhiyun pHalData->CurrentCenterFrequencyIndex1 = ChannelNum;
1257*4882a593Smuzhiyun
1258*4882a593Smuzhiyun pHalData->current_channel_bw = ChnlWidth;
1259*4882a593Smuzhiyun pHalData->nCur40MhzPrimeSC = ExtChnlOffsetOf40MHz;
1260*4882a593Smuzhiyun pHalData->nCur80MhzPrimeSC = ExtChnlOffsetOf80MHz;
1261*4882a593Smuzhiyun pHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1;
1262*4882a593Smuzhiyun
1263*4882a593Smuzhiyun phy_SwChnl8188F(Adapter);
1264*4882a593Smuzhiyun pHalData->bSwChnl = _FALSE;
1265*4882a593Smuzhiyun
1266*4882a593Smuzhiyun phy_PostSetBwMode8188F(Adapter);
1267*4882a593Smuzhiyun pHalData->bSetChnlBW = _FALSE;
1268*4882a593Smuzhiyun
1269*4882a593Smuzhiyun rtw_hal_set_tx_power_level(Adapter, pHalData->current_channel);
1270*4882a593Smuzhiyun
1271*4882a593Smuzhiyun exit_iqk:
1272*4882a593Smuzhiyun if (pHalData->bNeedIQK == _TRUE) {
1273*4882a593Smuzhiyun if (pHalData->neediqk_24g == _TRUE) {
1274*4882a593Smuzhiyun halrf_iqk_trigger(&pHalData->odmpriv, _FALSE);
1275*4882a593Smuzhiyun pHalData->bIQKInitialized = _TRUE;
1276*4882a593Smuzhiyun pHalData->neediqk_24g = _FALSE;
1277*4882a593Smuzhiyun }
1278*4882a593Smuzhiyun pHalData->bNeedIQK = _FALSE;
1279*4882a593Smuzhiyun }
1280*4882a593Smuzhiyun }
1281*4882a593Smuzhiyun
1282*4882a593Smuzhiyun void
PHY_SetSwChnlBWMode8188F(PADAPTER Adapter,u8 channel,enum channel_width Bandwidth,u8 Offset40,u8 Offset80)1283*4882a593Smuzhiyun PHY_SetSwChnlBWMode8188F(
1284*4882a593Smuzhiyun PADAPTER Adapter,
1285*4882a593Smuzhiyun u8 channel,
1286*4882a593Smuzhiyun enum channel_width Bandwidth,
1287*4882a593Smuzhiyun u8 Offset40,
1288*4882a593Smuzhiyun u8 Offset80
1289*4882a593Smuzhiyun )
1290*4882a593Smuzhiyun {
1291*4882a593Smuzhiyun /*RTW_INFO("%s()===>\n",__func__); */
1292*4882a593Smuzhiyun
1293*4882a593Smuzhiyun PHY_HandleSwChnlAndSetBW8188F(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel);
1294*4882a593Smuzhiyun
1295*4882a593Smuzhiyun /*RTW_INFO("<==%s()\n",__func__); */
1296*4882a593Smuzhiyun }
1297*4882a593Smuzhiyun
1298*4882a593Smuzhiyun /* Set CCK and OFDM Block "ON" */
BBTurnOnBlock_8188F(_adapter * adapter)1299*4882a593Smuzhiyun void BBTurnOnBlock_8188F(_adapter *adapter)
1300*4882a593Smuzhiyun {
1301*4882a593Smuzhiyun #if (DISABLE_BB_RF)
1302*4882a593Smuzhiyun return;
1303*4882a593Smuzhiyun #endif
1304*4882a593Smuzhiyun
1305*4882a593Smuzhiyun phy_set_bb_reg(adapter, rFPGA0_RFMOD, bCCKEn, 0x1);
1306*4882a593Smuzhiyun phy_set_bb_reg(adapter, rFPGA0_RFMOD, bOFDMEn, 0x1);
1307*4882a593Smuzhiyun }
1308*4882a593Smuzhiyun
1309