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