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