wifi: renew patch drivers/net/wireless
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rtl8723au / hal / rtl8723a / rtl8723a_phycfg.c
1 /******************************************************************************\r
2  *\r
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
4  *\r
5  * This program is free software; you can redistribute it and/or modify it\r
6  * under the terms of version 2 of the GNU General Public License as\r
7  * published by the Free Software Foundation.\r
8  *\r
9  * This program is distributed in the hope that it will be useful, but WITHOUT\r
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
12  * more details.\r
13  *\r
14  * You should have received a copy of the GNU General Public License along with\r
15  * this program; if not, write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
17  *\r
18  *\r
19  ******************************************************************************/\r
20 #define _RTL8723A_PHYCFG_C_\r
21 \r
22 #include <drv_conf.h>\r
23 #include <osdep_service.h>\r
24 #include <drv_types.h>\r
25 #include <rtw_byteorder.h>\r
26 \r
27 #ifdef CONFIG_IOL\r
28 #include <rtw_iol.h>\r
29 #endif\r
30 \r
31 #include <rtl8723a_hal.h>\r
32 \r
33 \r
34 /*---------------------------Define Local Constant---------------------------*/\r
35 /* Channel switch:The size of command tables for switch channel*/\r
36 #define MAX_PRECMD_CNT 16\r
37 #define MAX_RFDEPENDCMD_CNT 16\r
38 #define MAX_POSTCMD_CNT 16\r
39 \r
40 #define MAX_DOZE_WAITING_TIMES_9x 64\r
41 \r
42 /*---------------------------Define Local Constant---------------------------*/\r
43 \r
44 \r
45 /*------------------------Define global variable-----------------------------*/\r
46 \r
47 /*------------------------Define local variable------------------------------*/\r
48 \r
49 \r
50 /*--------------------Define export function prototype-----------------------*/\r
51 // Please refer to header file\r
52 /*--------------------Define export function prototype-----------------------*/\r
53 \r
54 /*----------------------------Function Body----------------------------------*/\r
55 //\r
56 // 1. BB register R/W API\r
57 //\r
58 \r
59 /**\r
60 * Function:     phy_CalculateBitShift\r
61 *\r
62 * OverView:     Get shifted position of the BitMask\r
63 *\r
64 * Input:\r
65 *                       u4Byte          BitMask,\r
66 *\r
67 * Output:       none\r
68 * Return:               u4Byte          Return the shift bit bit position of the mask\r
69 */\r
70 static  u32\r
71 phy_CalculateBitShift(\r
72         u32 BitMask\r
73         )\r
74 {\r
75         u32 i;\r
76 \r
77         for(i=0; i<=31; i++)\r
78         {\r
79                 if ( ((BitMask>>i) &  0x1 ) == 1)\r
80                         break;\r
81         }\r
82 \r
83         return (i);\r
84 }\r
85 \r
86 \r
87 /**\r
88 * Function:     PHY_QueryBBReg\r
89 *\r
90 * OverView:     Read "sepcific bits" from BB register\r
91 *\r
92 * Input:\r
93 *                       PADAPTER                Adapter,\r
94 *                       u4Byte                  RegAddr,                //The target address to be readback\r
95 *                       u4Byte                  BitMask         //The target bit position in the target address\r
96 *                                                                               //to be readback\r
97 * Output:       None\r
98 * Return:               u4Byte                  Data                    //The readback register value\r
99 * Note:         This function is equal to "GetRegSetting" in PHY programming guide\r
100 */\r
101 u32\r
102 rtl8192c_PHY_QueryBBReg(\r
103         IN      PADAPTER        Adapter,\r
104         IN      u32             RegAddr,\r
105         IN      u32             BitMask\r
106         )\r
107 {\r
108         u32     ReturnValue = 0, OriginalValue, BitShift;\r
109         u16     BBWaitCounter = 0;\r
110 \r
111 #if (DISABLE_BB_RF == 1)\r
112         return 0;\r
113 #endif\r
114 \r
115         //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx)\n", RegAddr, BitMask));\r
116 \r
117         OriginalValue = rtw_read32(Adapter, RegAddr);\r
118         BitShift = phy_CalculateBitShift(BitMask);\r
119         ReturnValue = (OriginalValue & BitMask) >> BitShift;\r
120 \r
121         //RTPRINT(FPHY, PHY_BBR, ("BBR MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, OriginalValue));\r
122         //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx), OriginalValue(%#lx)\n", RegAddr, BitMask, OriginalValue));\r
123 \r
124         return (ReturnValue);\r
125 \r
126 }\r
127 \r
128 \r
129 /**\r
130 * Function:     PHY_SetBBReg\r
131 *\r
132 * OverView:     Write "Specific bits" to BB register (page 8~)\r
133 *\r
134 * Input:\r
135 *                       PADAPTER                Adapter,\r
136 *                       u4Byte                  RegAddr,                //The target address to be modified\r
137 *                       u4Byte                  BitMask         //The target bit position in the target address\r
138 *                                                                               //to be modified\r
139 *                       u4Byte                  Data                    //The new register value in the target bit position\r
140 *                                                                               //of the target address\r
141 *\r
142 * Output:       None\r
143 * Return:               None\r
144 * Note:         This function is equal to "PutRegSetting" in PHY programming guide\r
145 */\r
146 \r
147 VOID\r
148 rtl8192c_PHY_SetBBReg(\r
149         IN      PADAPTER        Adapter,\r
150         IN      u32             RegAddr,\r
151         IN      u32             BitMask,\r
152         IN      u32             Data\r
153         )\r
154 {\r
155         HAL_DATA_TYPE   *pHalData               = GET_HAL_DATA(Adapter);\r
156         //u16                   BBWaitCounter   = 0;\r
157         u32                     OriginalValue, BitShift;\r
158 \r
159 #if (DISABLE_BB_RF == 1)\r
160         return;\r
161 #endif\r
162 \r
163         //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data));\r
164 \r
165         if(BitMask!= bMaskDWord){//if not "double word" write\r
166                 OriginalValue = rtw_read32(Adapter, RegAddr);\r
167                 BitShift = phy_CalculateBitShift(BitMask);\r
168                 Data = ((OriginalValue & (~BitMask)) | ((Data << BitShift) & BitMask));\r
169         }\r
170 \r
171         rtw_write32(Adapter, RegAddr, Data);\r
172 \r
173         //RTPRINT(FPHY, PHY_BBW, ("BBW MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, Data));\r
174         //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data));\r
175 \r
176 }\r
177 \r
178 \r
179 //\r
180 // 2. RF register R/W API\r
181 //\r
182 \r
183 /*-----------------------------------------------------------------------------\r
184  * Function:    phy_FwRFSerialRead()\r
185  *\r
186  * Overview:    We support firmware to execute RF-R/W.\r
187  *\r
188  * Input:               NONE\r
189  *\r
190  * Output:              NONE\r
191  *\r
192  * Return:              NONE\r
193  *\r
194  * Revised History:\r
195  *      When            Who             Remark\r
196  *      01/21/2008      MHC             Create Version 0.\r
197  *\r
198  *---------------------------------------------------------------------------*/\r
199 static  u32\r
200 phy_FwRFSerialRead(\r
201         IN      PADAPTER                        Adapter,\r
202         IN      RF_RADIO_PATH_E eRFPath,\r
203         IN      u32                             Offset  )\r
204 {\r
205         u32             retValue = 0;\r
206         //RT_ASSERT(FALSE,("deprecate!\n"));\r
207         return  (retValue);\r
208 \r
209 }       /* phy_FwRFSerialRead */\r
210 \r
211 \r
212 /*-----------------------------------------------------------------------------\r
213  * Function:    phy_FwRFSerialWrite()\r
214  *\r
215  * Overview:    We support firmware to execute RF-R/W.\r
216  *\r
217  * Input:               NONE\r
218  *\r
219  * Output:              NONE\r
220  *\r
221  * Return:              NONE\r
222  *\r
223  * Revised History:\r
224  *      When            Who             Remark\r
225  *      01/21/2008      MHC             Create Version 0.\r
226  *\r
227  *---------------------------------------------------------------------------*/\r
228 static  VOID\r
229 phy_FwRFSerialWrite(\r
230         IN      PADAPTER                        Adapter,\r
231         IN      RF_RADIO_PATH_E eRFPath,\r
232         IN      u32                             Offset,\r
233         IN      u32                             Data    )\r
234 {\r
235         //RT_ASSERT(FALSE,("deprecate!\n"));\r
236 }\r
237 \r
238 \r
239 /**\r
240 * Function:     phy_RFSerialRead\r
241 *\r
242 * OverView:     Read regster from RF chips\r
243 *\r
244 * Input:\r
245 *                       PADAPTER                Adapter,\r
246 *                       RF_RADIO_PATH_E eRFPath,        //Radio path of A/B/C/D\r
247 *                       u4Byte                  Offset,         //The target address to be read\r
248 *\r
249 * Output:       None\r
250 * Return:               u4Byte                  reback value\r
251 * Note:         Threre are three types of serial operations:\r
252 *                       1. Software serial write\r
253 *                       2. Hardware LSSI-Low Speed Serial Interface\r
254 *                       3. Hardware HSSI-High speed\r
255 *                       serial write. Driver need to implement (1) and (2).\r
256 *                       This function is equal to the combination of RF_ReadReg() and  RFLSSIRead()\r
257 */\r
258 static  u32\r
259 phy_RFSerialRead(\r
260         IN      PADAPTER                        Adapter,\r
261         IN      RF_RADIO_PATH_E eRFPath,\r
262         IN      u32                             Offset\r
263         )\r
264 {\r
265         u32                                             retValue = 0;\r
266         HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(Adapter);\r
267         BB_REGISTER_DEFINITION_T        *pPhyReg = &pHalData->PHYRegDef[eRFPath];\r
268         u32                                             NewOffset;\r
269         u32                                             tmplong,tmplong2;\r
270         u8                                      RfPiEnable=0;\r
271 #if 0\r
272         if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs\r
273                 return  retValue;\r
274         if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs\r
275                 return  retValue;\r
276 #endif\r
277         //\r
278         // Make sure RF register offset is correct\r
279         //\r
280         Offset &= 0x3f;\r
281 \r
282         //\r
283         // Switch page for 8256 RF IC\r
284         //\r
285         NewOffset = Offset;\r
286 \r
287         // 2009/06/17 MH We can not execute IO for power save or other accident mode.\r
288         //if(RT_CANNOT_IO(Adapter))\r
289         //{\r
290         //      RTPRINT(FPHY, PHY_RFR, ("phy_RFSerialRead return all one\n"));\r
291         //      return  0xFFFFFFFF;\r
292         //}\r
293 \r
294         // For 92S LSSI Read RFLSSIRead\r
295         // For RF A/B write 0x824/82c(does not work in the future)\r
296         // We must use 0x824 for RF A and B to execute read trigger\r
297         tmplong = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord);\r
298         if(eRFPath == RF_PATH_A)\r
299                 tmplong2 = tmplong;\r
300         else\r
301                 tmplong2 = PHY_QueryBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord);\r
302 \r
303         tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge;  //T65 RF\r
304 \r
305         PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge));\r
306         rtw_udelay_os(10);// PlatformStallExecution(10);\r
307 \r
308         PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, tmplong2);\r
309         rtw_udelay_os(100);//PlatformStallExecution(100);\r
310 \r
311         PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong|bLSSIReadEdge);\r
312         rtw_udelay_os(10);//PlatformStallExecution(10);\r
313 \r
314         if(eRFPath == RF_PATH_A)\r
315                 RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter1, BIT8);\r
316         else if(eRFPath == RF_PATH_B)\r
317                 RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter1, BIT8);\r
318 \r
319         if(RfPiEnable)\r
320         {       // Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF\r
321                 retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData);\r
322                 //DBG_8192C("Readback from RF-PI : 0x%x\n", retValue);\r
323         }\r
324         else\r
325         {       //Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF\r
326                 retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, bLSSIReadBackData);\r
327                 //DBG_8192C("Readback from RF-SI : 0x%x\n", retValue);\r
328         }\r
329         //DBG_8192C("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue);\r
330 \r
331         return retValue;\r
332 \r
333 }\r
334 \r
335 \r
336 \r
337 /**\r
338 * Function:     phy_RFSerialWrite\r
339 *\r
340 * OverView:     Write data to RF register (page 8~)\r
341 *\r
342 * Input:\r
343 *                       PADAPTER                Adapter,\r
344 *                       RF_RADIO_PATH_E eRFPath,        //Radio path of A/B/C/D\r
345 *                       u4Byte                  Offset,         //The target address to be read\r
346 *                       u4Byte                  Data                    //The new register Data in the target bit position\r
347 *                                                                               //of the target to be read\r
348 *\r
349 * Output:       None\r
350 * Return:               None\r
351 * Note:         Threre are three types of serial operations:\r
352 *                       1. Software serial write\r
353 *                       2. Hardware LSSI-Low Speed Serial Interface\r
354 *                       3. Hardware HSSI-High speed\r
355 *                       serial write. Driver need to implement (1) and (2).\r
356 *                       This function is equal to the combination of RF_ReadReg() and  RFLSSIRead()\r
357  *\r
358  * Note:                  For RF8256 only\r
359  *                       The total count of RTL8256(Zebra4) register is around 36 bit it only employs\r
360  *                       4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10])\r
361  *                       to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration\r
362  *                       programming guide" for more details.\r
363  *                       Thus, we define a sub-finction for RTL8526 register address conversion\r
364  *                     ===========================================================\r
365  *                       Register Mode          RegCTL[1]               RegCTL[0]               Note\r
366  *                                                              (Reg00[12])             (Reg00[10])\r
367  *                     ===========================================================\r
368  *                       Reg_Mode0                              0                               x                       Reg 0 ~15(0x0 ~ 0xf)\r
369  *                     ------------------------------------------------------------------\r
370  *                       Reg_Mode1                              1                               0                       Reg 16 ~30(0x1 ~ 0xf)\r
371  *                     ------------------------------------------------------------------\r
372  *                       Reg_Mode2                              1                               1                       Reg 31 ~ 45(0x1 ~ 0xf)\r
373  *                     ------------------------------------------------------------------\r
374  *\r
375  *      2008/09/02      MH      Add 92S RF definition\r
376  *\r
377  *\r
378  *\r
379 */\r
380 static  VOID\r
381 phy_RFSerialWrite(\r
382         IN      PADAPTER                        Adapter,\r
383         IN      RF_RADIO_PATH_E eRFPath,\r
384         IN      u32                             Offset,\r
385         IN      u32                             Data\r
386         )\r
387 {\r
388         u32                                             DataAndAddr = 0;\r
389         HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(Adapter);\r
390         BB_REGISTER_DEFINITION_T        *pPhyReg = &pHalData->PHYRegDef[eRFPath];\r
391         u32                                             NewOffset;\r
392 \r
393 #if 0\r
394         //<Roger_TODO> We should check valid regs for RF_6052 case.\r
395         if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs\r
396                 return;\r
397         if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs\r
398                 return;\r
399 #endif\r
400 \r
401         // 2009/06/17 MH We can not execute IO for power save or other accident mode.\r
402         //if(RT_CANNOT_IO(Adapter))\r
403         //{\r
404         //      RTPRINT(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n"));\r
405         //      return;\r
406         //}\r
407 \r
408         Offset &= 0x3f;\r
409 \r
410         //\r
411         // Shadow Update\r
412         //\r
413         //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data);\r
414 \r
415         //\r
416         // Switch page for 8256 RF IC\r
417         //\r
418         NewOffset = Offset;\r
419 \r
420         //\r
421         // Put write addr in [5:0]  and write data in [31:16]\r
422         //\r
423         //DataAndAddr = (Data<<16) | (NewOffset&0x3f);\r
424         DataAndAddr = ((NewOffset<<20) | (Data&0x000fffff)) & 0x0fffffff;       // T65 RF\r
425 \r
426         //\r
427         // Write Operation\r
428         //\r
429         PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);\r
430         //RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr));\r
431 \r
432 }\r
433 \r
434 \r
435 /**\r
436 * Function:     PHY_QueryRFReg\r
437 *\r
438 * OverView:     Query "Specific bits" to RF register (page 8~)\r
439 *\r
440 * Input:\r
441 *                       PADAPTER                Adapter,\r
442 *                       RF_RADIO_PATH_E eRFPath,        //Radio path of A/B/C/D\r
443 *                       u4Byte                  RegAddr,                //The target address to be read\r
444 *                       u4Byte                  BitMask         //The target bit position in the target address\r
445 *                                                                               //to be read\r
446 *\r
447 * Output:       None\r
448 * Return:               u4Byte                  Readback value\r
449 * Note:         This function is equal to "GetRFRegSetting" in PHY programming guide\r
450 */\r
451 u32\r
452 rtl8192c_PHY_QueryRFReg(\r
453         IN      PADAPTER                        Adapter,\r
454         IN      RF_RADIO_PATH_E eRFPath,\r
455         IN      u32                             RegAddr,\r
456         IN      u32                             BitMask\r
457         )\r
458 {\r
459         u32 Original_Value, Readback_Value, BitShift;\r
460         //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);\r
461         //u8    RFWaitCounter = 0;\r
462         //_irqL irqL;\r
463 \r
464 #if (DISABLE_BB_RF == 1)\r
465         return 0;\r
466 #endif\r
467 \r
468         //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), BitMask(%#lx)\n", RegAddr, eRFPath,BitMask));\r
469 \r
470 #ifdef CONFIG_USB_HCI\r
471         //PlatformAcquireMutex(&pHalData->mxRFOperate);\r
472 #else\r
473         //_enter_critical(&pHalData->rf_lock, &irqL);\r
474 #endif\r
475 \r
476 \r
477         Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr);\r
478 \r
479         BitShift =  phy_CalculateBitShift(BitMask);\r
480         Readback_Value = (Original_Value & BitMask) >> BitShift;\r
481 \r
482 #ifdef CONFIG_USB_HCI\r
483         //PlatformReleaseMutex(&pHalData->mxRFOperate);\r
484 #else\r
485         //_exit_critical(&pHalData->rf_lock, &irqL);\r
486 #endif\r
487 \r
488 \r
489         //RTPRINT(FPHY, PHY_RFR, ("RFR-%d MASK=0x%lx Addr[0x%lx]=0x%lx\n", eRFPath, BitMask, RegAddr, Original_Value));//BitMask(%#lx),BitMask,\r
490         //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x),  Original_Value(%#lx)\n",\r
491         //                              RegAddr, eRFPath, Original_Value));\r
492 \r
493         return (Readback_Value);\r
494 }\r
495 \r
496 /**\r
497 * Function:     PHY_SetRFReg\r
498 *\r
499 * OverView:     Write "Specific bits" to RF register (page 8~)\r
500 *\r
501 * Input:\r
502 *                       PADAPTER                Adapter,\r
503 *                       RF_RADIO_PATH_E eRFPath,        //Radio path of A/B/C/D\r
504 *                       u4Byte                  RegAddr,                //The target address to be modified\r
505 *                       u4Byte                  BitMask         //The target bit position in the target address\r
506 *                                                                               //to be modified\r
507 *                       u4Byte                  Data                    //The new register Data in the target bit position\r
508 *                                                                               //of the target address\r
509 *\r
510 * Output:       None\r
511 * Return:               None\r
512 * Note:         This function is equal to "PutRFRegSetting" in PHY programming guide\r
513 */\r
514 VOID\r
515 rtl8192c_PHY_SetRFReg(\r
516         IN      PADAPTER                        Adapter,\r
517         IN      RF_RADIO_PATH_E eRFPath,\r
518         IN      u32                             RegAddr,\r
519         IN      u32                             BitMask,\r
520         IN      u32                             Data\r
521         )\r
522 {\r
523 \r
524         //HAL_DATA_TYPE *pHalData               = GET_HAL_DATA(Adapter);\r
525         //u1Byte                        RFWaitCounter   = 0;\r
526         u32             Original_Value, BitShift;\r
527         //_irqL irqL;\r
528 \r
529 #if (DISABLE_BB_RF == 1)\r
530         return;\r
531 #endif\r
532 \r
533         //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n",\r
534         //      RegAddr, BitMask, Data, eRFPath));\r
535         //RTPRINT(FINIT, INIT_RF, ("PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n",\r
536         //      RegAddr, BitMask, Data, eRFPath));\r
537 \r
538 \r
539 #ifdef CONFIG_USB_HCI\r
540         //PlatformAcquireMutex(&pHalData->mxRFOperate);\r
541 #else\r
542         //_enter_critical(&pHalData->rf_lock, &irqL);\r
543 #endif\r
544 \r
545 \r
546         // RF data is 12 bits only\r
547         if (BitMask != bRFRegOffsetMask)\r
548         {\r
549                 Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr);\r
550                 BitShift =  phy_CalculateBitShift(BitMask);\r
551                 Data = ((Original_Value & (~BitMask)) | (Data<< BitShift));\r
552         }\r
553 \r
554         phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data);\r
555 \r
556 \r
557 #ifdef CONFIG_USB_HCI\r
558         //PlatformReleaseMutex(&pHalData->mxRFOperate);\r
559 #else\r
560         //_exit_critical(&pHalData->rf_lock, &irqL);\r
561 #endif\r
562 \r
563         //PHY_QueryRFReg(Adapter,eRFPath,RegAddr,BitMask);\r
564         //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n",\r
565         //              RegAddr, BitMask, Data, eRFPath));\r
566 \r
567 }\r
568 \r
569 \r
570 //\r
571 // 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt.\r
572 //\r
573 \r
574 /*-----------------------------------------------------------------------------\r
575  * Function:    phy_ConfigMACWithParaFile()\r
576  *\r
577  * Overview:    This function read BB parameters from general file format, and do register\r
578  *                        Read/Write\r
579  *\r
580  * Input:       PADAPTER                Adapter\r
581  *                      ps1Byte                         pFileName\r
582  *\r
583  * Output:      NONE\r
584  *\r
585  * Return:      RT_STATUS_SUCCESS: configuration file exist\r
586  *\r
587  * Note:                The format of MACPHY_REG.txt is different from PHY and RF.\r
588  *                      [Register][Mask][Value]\r
589  *---------------------------------------------------------------------------*/\r
590 static  int\r
591 phy_ConfigMACWithParaFile(\r
592         IN      PADAPTER                Adapter,\r
593         IN      u8*                     pFileName\r
594 )\r
595 {\r
596         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
597 \r
598         int             rtStatus = _SUCCESS;\r
599 \r
600         return rtStatus;\r
601 }\r
602 \r
603 /*-----------------------------------------------------------------------------\r
604  * Function:    phy_ConfigMACWithHeaderFile()\r
605  *\r
606  * Overview:    This function read BB parameters from Header file we gen, and do register\r
607  *                        Read/Write\r
608  *\r
609  * Input:       PADAPTER                Adapter\r
610  *                      ps1Byte                         pFileName\r
611  *\r
612  * Output:      NONE\r
613  *\r
614  * Return:      RT_STATUS_SUCCESS: configuration file exist\r
615  *\r
616  * Note:                The format of MACPHY_REG.txt is different from PHY and RF.\r
617  *                      [Register][Mask][Value]\r
618  *---------------------------------------------------------------------------*/\r
619 #ifndef CONFIG_PHY_SETTING_WITH_ODM\r
620 static  int\r
621 phy_ConfigMACWithHeaderFile(\r
622         IN      PADAPTER                Adapter\r
623 )\r
624 {\r
625         u32                                     i = 0;\r
626         u32                                     ArrayLength = 0;\r
627         u32*                            ptrArray;\r
628         //HAL_DATA_TYPE                 *pHalData = GET_HAL_DATA(Adapter);\r
629 \r
630         //2008.11.06 Modified by tynli.\r
631         //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read Rtl819XMACPHY_Array\n"));\r
632         ArrayLength = Rtl8723_MAC_ArrayLength;\r
633         ptrArray = (u32*)Rtl8723_MAC_Array;\r
634 \r
635 #ifdef CONFIG_IOL_MAC\r
636         {\r
637                 struct xmit_frame       *xmit_frame;\r
638                 if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)\r
639                         return _FAIL;\r
640 \r
641                 for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column\r
642                         rtw_IOL_append_WB_cmd(xmit_frame, ptrArray[i], (u8)ptrArray[i+1]);\r
643                 }\r
644 \r
645                 return rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0);\r
646         }\r
647 #else\r
648         for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column\r
649                 rtw_write8(Adapter, ptrArray[i], (u8)ptrArray[i+1]);\r
650         }\r
651 #endif\r
652 \r
653         return _SUCCESS;\r
654 \r
655 }\r
656 #endif//#ifndef CONFIG_PHY_SETTING_WITH_ODM\r
657 \r
658 /*-----------------------------------------------------------------------------\r
659  * Function:    PHY_MACConfig8192C\r
660  *\r
661  * Overview:    Condig MAC by header file or parameter file.\r
662  *\r
663  * Input:       NONE\r
664  *\r
665  * Output:      NONE\r
666  *\r
667  * Return:      NONE\r
668  *\r
669  * Revised History:\r
670  *  When                Who             Remark\r
671  *  08/12/2008  MHC             Create Version 0.\r
672  *\r
673  *---------------------------------------------------------------------------*/\r
674 s32 PHY_MACConfig8723A(PADAPTER Adapter)\r
675 {\r
676         int             rtStatus = _SUCCESS;\r
677         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
678         s8                      *pszMACRegFile;\r
679         s8                      sz8723MACRegFile[] = RTL8723_PHY_MACREG;\r
680         BOOLEAN         is92C = IS_92C_SERIAL(pHalData->VersionID);\r
681 \r
682 \r
683         pszMACRegFile = sz8723MACRegFile;\r
684 \r
685         //\r
686         // Config MAC\r
687         //\r
688 #ifdef CONFIG_EMBEDDED_FWIMG\r
689         #ifdef CONFIG_PHY_SETTING_WITH_ODM\r
690         if(HAL_STATUS_FAILURE == ODM_ConfigMACWithHeaderFile(&pHalData->odmpriv))\r
691                 rtStatus = _FAIL;\r
692         #else\r
693                 rtStatus = phy_ConfigMACWithHeaderFile(Adapter);\r
694         #endif//#ifdef CONFIG_PHY_SETTING_WITH_ODM\r
695 #else\r
696 \r
697         // Not make sure EEPROM, add later\r
698         //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read MACREG.txt\n"));\r
699         rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile);\r
700 #endif//CONFIG_EMBEDDED_FWIMG\r
701 \r
702 #ifdef CONFIG_PCI_HCI\r
703         //this switching setting cause some 8192cu hw have redownload fw fail issue\r
704         //improve 2-stream TX EVM by Jenyu\r
705         if(is92C)\r
706                 rtw_write8(Adapter, REG_SPS0_CTRL+3,0x71);\r
707 #endif\r
708 \r
709 \r
710         // 2010.07.13 AMPDU aggregation number 9\r
711         //rtw_write8(Adapter, REG_MAX_AGGR_NUM, MAX_AGGR_NUM);\r
712         rtw_write8(Adapter, REG_MAX_AGGR_NUM, 0x0A); //By tynli. 2010.11.18.\r
713 #ifdef CONFIG_USB_HCI\r
714         if(is92C && (BOARD_USB_DONGLE == pHalData->BoardType))\r
715                 rtw_write8(Adapter, 0x40,0x04);\r
716 #endif\r
717 \r
718         return rtStatus;\r
719 \r
720 }\r
721 \r
722 \r
723 /**\r
724 * Function:     phy_InitBBRFRegisterDefinition\r
725 *\r
726 * OverView:     Initialize Register definition offset for Radio Path A/B/C/D\r
727 *\r
728 * Input:\r
729 *                       PADAPTER                Adapter,\r
730 *\r
731 * Output:       None\r
732 * Return:               None\r
733 * Note:         The initialization value is constant and it should never be changes\r
734 */\r
735 static  VOID\r
736 phy_InitBBRFRegisterDefinition(\r
737         IN      PADAPTER                Adapter\r
738 )\r
739 {\r
740         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
741 \r
742         // RF Interface Sowrtware Control\r
743         pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870\r
744         pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872)\r
745         pHalData->PHYRegDef[RF_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 LSBs if read 32-bit from 0x874\r
746         pHalData->PHYRegDef[RF_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876)\r
747 \r
748         // RF Interface Readback Value\r
749         pHalData->PHYRegDef[RF_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; // 16 LSBs if read 32-bit from 0x8E0\r
750         pHalData->PHYRegDef[RF_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2)\r
751         pHalData->PHYRegDef[RF_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 LSBs if read 32-bit from 0x8E4\r
752         pHalData->PHYRegDef[RF_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6)\r
753 \r
754         // RF Interface Output (and Enable)\r
755         pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860\r
756         pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864\r
757 \r
758         // RF Interface (Output and)  Enable\r
759         pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862)\r
760         pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866)\r
761 \r
762         //Addr of LSSI. Wirte RF register by driver\r
763         pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter\r
764         pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;\r
765 \r
766         // RF parameter\r
767         pHalData->PHYRegDef[RF_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter;  //BB Band Select\r
768         pHalData->PHYRegDef[RF_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter;\r
769         pHalData->PHYRegDef[RF_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter;\r
770         pHalData->PHYRegDef[RF_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter;\r
771 \r
772         // Tx AGC Gain Stage (same for all path. Should we remove this?)\r
773         pHalData->PHYRegDef[RF_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage\r
774         pHalData->PHYRegDef[RF_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage\r
775         pHalData->PHYRegDef[RF_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage\r
776         pHalData->PHYRegDef[RF_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage\r
777 \r
778         // Tranceiver A~D HSSI Parameter-1\r
779         pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1;  //wire control parameter1\r
780         pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1;  //wire control parameter1\r
781 \r
782         // Tranceiver A~D HSSI Parameter-2\r
783         pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;  //wire control parameter2\r
784         pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;  //wire control parameter2\r
785 \r
786         // RF switch Control\r
787         pHalData->PHYRegDef[RF_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; //TR/Ant switch control\r
788         pHalData->PHYRegDef[RF_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl;\r
789         pHalData->PHYRegDef[RF_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl;\r
790         pHalData->PHYRegDef[RF_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl;\r
791 \r
792         // AGC control 1\r
793         pHalData->PHYRegDef[RF_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1;\r
794         pHalData->PHYRegDef[RF_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1;\r
795         pHalData->PHYRegDef[RF_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1;\r
796         pHalData->PHYRegDef[RF_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1;\r
797 \r
798         // AGC control 2\r
799         pHalData->PHYRegDef[RF_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2;\r
800         pHalData->PHYRegDef[RF_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2;\r
801         pHalData->PHYRegDef[RF_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2;\r
802         pHalData->PHYRegDef[RF_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2;\r
803 \r
804         // RX AFE control 1\r
805         pHalData->PHYRegDef[RF_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance;\r
806         pHalData->PHYRegDef[RF_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance;\r
807         pHalData->PHYRegDef[RF_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance;\r
808         pHalData->PHYRegDef[RF_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance;\r
809 \r
810         // RX AFE control 1\r
811         pHalData->PHYRegDef[RF_PATH_A].rfRxAFE = rOFDM0_XARxAFE;\r
812         pHalData->PHYRegDef[RF_PATH_B].rfRxAFE = rOFDM0_XBRxAFE;\r
813         pHalData->PHYRegDef[RF_PATH_C].rfRxAFE = rOFDM0_XCRxAFE;\r
814         pHalData->PHYRegDef[RF_PATH_D].rfRxAFE = rOFDM0_XDRxAFE;\r
815 \r
816         // Tx AFE control 1\r
817         pHalData->PHYRegDef[RF_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance;\r
818         pHalData->PHYRegDef[RF_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance;\r
819         pHalData->PHYRegDef[RF_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance;\r
820         pHalData->PHYRegDef[RF_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance;\r
821 \r
822         // Tx AFE control 2\r
823         pHalData->PHYRegDef[RF_PATH_A].rfTxAFE = rOFDM0_XATxAFE;\r
824         pHalData->PHYRegDef[RF_PATH_B].rfTxAFE = rOFDM0_XBTxAFE;\r
825         pHalData->PHYRegDef[RF_PATH_C].rfTxAFE = rOFDM0_XCTxAFE;\r
826         pHalData->PHYRegDef[RF_PATH_D].rfTxAFE = rOFDM0_XDTxAFE;\r
827 \r
828         // Tranceiver LSSI Readback SI mode\r
829         pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;\r
830         pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;\r
831         pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack;\r
832         pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack;\r
833 \r
834         // Tranceiver LSSI Readback PI mode\r
835         pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;\r
836         pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;\r
837         //pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBackPi = rFPGA0_XC_LSSIReadBack;\r
838         //pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBackPi = rFPGA0_XD_LSSIReadBack;\r
839 \r
840 }\r
841 \r
842 \r
843 /*-----------------------------------------------------------------------------\r
844  * Function:    phy_ConfigBBWithParaFile()\r
845  *\r
846  * Overview:    This function read BB parameters from general file format, and do register\r
847  *                        Read/Write\r
848  *\r
849  * Input:       PADAPTER                Adapter\r
850  *                      ps1Byte                         pFileName\r
851  *\r
852  * Output:      NONE\r
853  *\r
854  * Return:      RT_STATUS_SUCCESS: configuration file exist\r
855  *      2008/11/06      MH      For 92S we do not support silent reset now. Disable\r
856  *                                      parameter file compare!!!!!!??\r
857  *\r
858  *---------------------------------------------------------------------------*/\r
859 static  int\r
860 phy_ConfigBBWithParaFile(\r
861         IN      PADAPTER                Adapter,\r
862         IN      u8*                     pFileName\r
863 )\r
864 {\r
865         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
866 \r
867         int             rtStatus = _SUCCESS;\r
868 \r
869         return rtStatus;\r
870 }\r
871 \r
872 \r
873 \r
874 //****************************************\r
875 // The following is for High Power PA\r
876 //****************************************\r
877 VOID\r
878 phy_ConfigBBExternalPA(\r
879         IN      PADAPTER                        Adapter\r
880 )\r
881 {\r
882 #ifdef CONFIG_USB_HCI\r
883         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
884         u16 i=0;\r
885         u32 temp=0;\r
886 \r
887         if(!pHalData->ExternalPA)\r
888         {\r
889                 return;\r
890         }\r
891 \r
892         // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the\r
893         // same code as SU. It is already updated in PHY_REG_1T_HP.txt.\r
894 #if 0\r
895         PHY_SetBBReg(Adapter, 0xee8, BIT28, 1);\r
896         temp = PHY_QueryBBReg(Adapter, 0x860, bMaskDWord);\r
897         temp |= (BIT26|BIT21|BIT10|BIT5);\r
898         PHY_SetBBReg(Adapter, 0x860, bMaskDWord, temp);\r
899         PHY_SetBBReg(Adapter, 0x870, BIT10, 0);\r
900         PHY_SetBBReg(Adapter, 0xc80, bMaskDWord, 0x20000080);\r
901         PHY_SetBBReg(Adapter, 0xc88, bMaskDWord, 0x40000100);\r
902 #endif\r
903 \r
904 #endif\r
905 }\r
906 \r
907 /*-----------------------------------------------------------------------------\r
908  * Function:    phy_ConfigBBWithHeaderFile()\r
909  *\r
910  * Overview:    This function read BB parameters from general file format, and do register\r
911  *                        Read/Write\r
912  *\r
913  * Input:       PADAPTER                Adapter\r
914  *                      u1Byte                  ConfigType     0 => PHY_CONFIG\r
915  *                                                                               1 =>AGC_TAB\r
916  *\r
917  * Output:      NONE\r
918  *\r
919  * Return:      RT_STATUS_SUCCESS: configuration file exist\r
920  *\r
921  *---------------------------------------------------------------------------*/\r
922 #ifndef CONFIG_PHY_SETTING_WITH_ODM\r
923 static  int\r
924 phy_ConfigBBWithHeaderFile(\r
925         IN      PADAPTER                Adapter,\r
926         IN      u8                      ConfigType\r
927 )\r
928 {\r
929         int i;\r
930         u32*    Rtl819XPHY_REGArray_Table;\r
931         u32*    Rtl819XAGCTAB_Array_Table;\r
932         u16     PHY_REGArrayLen, AGCTAB_ArrayLen;\r
933         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
934         int ret = _SUCCESS;\r
935 \r
936 \r
937         AGCTAB_ArrayLen = Rtl8723_AGCTAB_1TArrayLength;\r
938         Rtl819XAGCTAB_Array_Table = (u32*)Rtl8723_AGCTAB_1TArray;\r
939         PHY_REGArrayLen = Rtl8723_PHY_REG_1TArrayLength;\r
940         Rtl819XPHY_REGArray_Table = (u32*)Rtl8723_PHY_REG_1TArray;\r
941 //      RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8723AGCTAB_1TArray\n"));\r
942 //      RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8723PHY_REG_1TArray\n"));\r
943 \r
944         if(ConfigType == BaseBand_Config_PHY_REG)\r
945         {\r
946                 #ifdef CONFIG_IOL_BB_PHY_REG\r
947                 {\r
948                         struct xmit_frame       *xmit_frame;\r
949                         u32 tmp_value;\r
950 \r
951                         if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) {\r
952                                 ret = _FAIL;\r
953                                 goto exit;\r
954                         }\r
955 \r
956                         for(i=0;i<PHY_REGArrayLen;i=i+2)\r
957                         {\r
958                                 tmp_value=Rtl819XPHY_REGArray_Table[i+1];\r
959                                 \r
960                                 if (Rtl819XPHY_REGArray_Table[i] == 0xfe)\r
961                                         rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 50);\r
962                                 else if (Rtl819XPHY_REGArray_Table[i] == 0xfd)\r
963                                         rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 5);\r
964                                 else if (Rtl819XPHY_REGArray_Table[i] == 0xfc)\r
965                                         rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 1);\r
966                                 else if (Rtl819XPHY_REGArray_Table[i] == 0xfb)\r
967                                         rtw_IOL_append_DELAY_US_cmd(xmit_frame, 50);\r
968                                 else if (Rtl819XPHY_REGArray_Table[i] == 0xfa)\r
969                                         rtw_IOL_append_DELAY_US_cmd(xmit_frame, 5);\r
970                                 else if (Rtl819XPHY_REGArray_Table[i] == 0xf9)\r
971                                         rtw_IOL_append_DELAY_US_cmd(xmit_frame, 1);\r
972 \r
973                                 rtw_IOL_append_WD_cmd(xmit_frame, Rtl819XPHY_REGArray_Table[i], tmp_value);     \r
974                                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl819XPHY_REGArray_Table[0] is %lx Rtl819XPHY_REGArray[1] is %lx \n",Rtl819XPHY_REGArray_Table[i], Rtl819XPHY_REGArray_Table[i+1]));\r
975                         }\r
976                 \r
977                         ret = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0);\r
978                 }\r
979                 #else\r
980                 for(i=0;i<PHY_REGArrayLen;i=i+2)\r
981                 {\r
982                         if (Rtl819XPHY_REGArray_Table[i] == 0xfe){\r
983                                 #ifdef CONFIG_LONG_DELAY_ISSUE\r
984                                 rtw_msleep_os(50);\r
985                                 #else\r
986                                 rtw_mdelay_os(50);\r
987                                 #endif\r
988                         }\r
989                         else if (Rtl819XPHY_REGArray_Table[i] == 0xfd)\r
990                                 rtw_mdelay_os(5);\r
991                         else if (Rtl819XPHY_REGArray_Table[i] == 0xfc)\r
992                                 rtw_mdelay_os(1);\r
993                         else if (Rtl819XPHY_REGArray_Table[i] == 0xfb)\r
994                                 rtw_udelay_os(50);\r
995                         else if (Rtl819XPHY_REGArray_Table[i] == 0xfa)\r
996                                 rtw_udelay_os(5);\r
997                         else if (Rtl819XPHY_REGArray_Table[i] == 0xf9)\r
998                                 rtw_udelay_os(1);\r
999 \r
1000                         PHY_SetBBReg(Adapter, Rtl819XPHY_REGArray_Table[i], bMaskDWord, Rtl819XPHY_REGArray_Table[i+1]);\r
1001 \r
1002                         // Add 1us delay between BB/RF register setting.\r
1003                         rtw_udelay_os(1);\r
1004 \r
1005                         //RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl819XPHY_REGArray_Table[0] is %lx Rtl819XPHY_REGArray[1] is %lx \n",Rtl819XPHY_REGArray_Table[i], Rtl819XPHY_REGArray_Table[i+1]));\r
1006                 }\r
1007                 #endif\r
1008                 // for External PA\r
1009                 phy_ConfigBBExternalPA(Adapter);\r
1010         }\r
1011         else if(ConfigType == BaseBand_Config_AGC_TAB)\r
1012         {\r
1013                 #ifdef CONFIG_IOL_BB_AGC_TAB\r
1014                 {\r
1015                         struct xmit_frame       *xmit_frame;\r
1016 \r
1017                         if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) {\r
1018                                 ret = _FAIL;\r
1019                                 goto exit;\r
1020                         }\r
1021 \r
1022                         for(i=0;i<AGCTAB_ArrayLen;i=i+2)\r
1023                         {\r
1024                                 rtw_IOL_append_WD_cmd(xmit_frame, Rtl819XAGCTAB_Array_Table[i], Rtl819XAGCTAB_Array_Table[i+1]);                                                        \r
1025                                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl819XAGCTAB_Array_Table[0] is %lx Rtl819XPHY_REGArray[1] is %lx \n",Rtl819XAGCTAB_Array_Table[i], Rtl819XAGCTAB_Array_Table[i+1]));\r
1026                         }\r
1027                 \r
1028                         ret = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0);\r
1029                 }\r
1030                 #else\r
1031                 for(i=0;i<AGCTAB_ArrayLen;i=i+2)\r
1032                 {\r
1033                         PHY_SetBBReg(Adapter, Rtl819XAGCTAB_Array_Table[i], bMaskDWord, Rtl819XAGCTAB_Array_Table[i+1]);\r
1034 \r
1035                         // Add 1us delay between BB/RF register setting.\r
1036                         rtw_udelay_os(1);\r
1037 \r
1038                         //RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl819XAGCTAB_Array_Table[0] is %lx Rtl819XPHY_REGArray[1] is %lx \n",Rtl819XAGCTAB_Array_Table[i], Rtl819XAGCTAB_Array_Table[i+1]));\r
1039                 }\r
1040                 #endif\r
1041         }\r
1042 \r
1043 exit:\r
1044         return ret;\r
1045 }\r
1046 \r
1047 #endif\r
1048 VOID\r
1049 storePwrIndexDiffRateOffset(\r
1050         IN      PADAPTER        Adapter,\r
1051         IN      u32             RegAddr,\r
1052         IN      u32             BitMask,\r
1053         IN      u32             Data\r
1054         )\r
1055 {\r
1056         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1057 \r
1058         if(RegAddr == rTxAGC_A_Rate18_06)\r
1059         {\r
1060                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data;\r
1061                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1062                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0]));\r
1063         }\r
1064         if(RegAddr == rTxAGC_A_Rate54_24)\r
1065         {\r
1066                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data;\r
1067                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1068                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1]));\r
1069         }\r
1070         if(RegAddr == rTxAGC_A_CCK1_Mcs32)\r
1071         {\r
1072                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data;\r
1073                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1074                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6]));\r
1075         }\r
1076         if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00)\r
1077         {\r
1078                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data;\r
1079                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1080                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7]));\r
1081         }\r
1082         if(RegAddr == rTxAGC_A_Mcs03_Mcs00)\r
1083         {\r
1084                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data;\r
1085                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1086                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2]));\r
1087         }\r
1088         if(RegAddr == rTxAGC_A_Mcs07_Mcs04)\r
1089         {\r
1090                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data;\r
1091                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1092                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3]));\r
1093         }\r
1094         if(RegAddr == rTxAGC_A_Mcs11_Mcs08)\r
1095         {\r
1096                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data;\r
1097                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1098                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4]));\r
1099         }\r
1100         if(RegAddr == rTxAGC_A_Mcs15_Mcs12)\r
1101         {\r
1102                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data;\r
1103                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1104                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5]));\r
1105         }\r
1106         if(RegAddr == rTxAGC_B_Rate18_06)\r
1107         {\r
1108                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data;\r
1109                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1110                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8]));\r
1111         }\r
1112         if(RegAddr == rTxAGC_B_Rate54_24)\r
1113         {\r
1114                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data;\r
1115                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1116                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9]));\r
1117         }\r
1118         if(RegAddr == rTxAGC_B_CCK1_55_Mcs32)\r
1119         {\r
1120                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data;\r
1121                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1122                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14]));\r
1123         }\r
1124         if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff)\r
1125         {\r
1126                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data;\r
1127                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1128                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15]));\r
1129         }\r
1130         if(RegAddr == rTxAGC_B_Mcs03_Mcs00)\r
1131         {\r
1132                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data;\r
1133                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1134                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10]));\r
1135         }\r
1136         if(RegAddr == rTxAGC_B_Mcs07_Mcs04)\r
1137         {\r
1138                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data;\r
1139                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1140                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11]));\r
1141         }\r
1142         if(RegAddr == rTxAGC_B_Mcs11_Mcs08)\r
1143         {\r
1144                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data;\r
1145                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1146                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12]));\r
1147         }\r
1148         if(RegAddr == rTxAGC_B_Mcs15_Mcs12)\r
1149         {\r
1150                 pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data;\r
1151                 //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%lx\n", pHalData->pwrGroupCnt,\r
1152                 //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13]));\r
1153                 pHalData->pwrGroupCnt++;\r
1154         }\r
1155 }\r
1156 /*-----------------------------------------------------------------------------\r
1157  * Function:    phy_ConfigBBWithPgParaFile\r
1158  *\r
1159  * Overview:\r
1160  *\r
1161  * Input:       NONE\r
1162  *\r
1163  * Output:      NONE\r
1164  *\r
1165  * Return:      NONE\r
1166  *\r
1167  * Revised History:\r
1168  * When                 Who             Remark\r
1169  * 11/06/2008   MHC             Create Version 0.\r
1170  * 2009/07/29   tynli           (porting from 92SE branch)2009/03/11 Add copy parameter file to buffer for silent reset\r
1171  *---------------------------------------------------------------------------*/\r
1172 static  int\r
1173 phy_ConfigBBWithPgParaFile(\r
1174         IN      PADAPTER                Adapter,\r
1175         IN      u8*                     pFileName)\r
1176 {\r
1177         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1178 \r
1179         int             rtStatus = _SUCCESS;\r
1180 \r
1181 \r
1182         return rtStatus;\r
1183 \r
1184 }       /* phy_ConfigBBWithPgParaFile */\r
1185 \r
1186 \r
1187 /*-----------------------------------------------------------------------------\r
1188  * Function:    phy_ConfigBBWithPgHeaderFile\r
1189  *\r
1190  * Overview:    Config PHY_REG_PG array\r
1191  *\r
1192  * Input:       NONE\r
1193  *\r
1194  * Output:      NONE\r
1195  *\r
1196  * Return:      NONE\r
1197  *\r
1198  * Revised History:\r
1199  * When                 Who             Remark\r
1200  * 11/06/2008   MHC             Add later!!!!!!.. Please modify for new files!!!!\r
1201  * 11/10/2008   tynli           Modify to mew files.\r
1202  *---------------------------------------------------------------------------*/\r
1203 static  int\r
1204 phy_ConfigBBWithPgHeaderFile(\r
1205         IN      PADAPTER                Adapter,\r
1206         IN      u8                      ConfigType)\r
1207 {\r
1208         int i;\r
1209         u32*    Rtl819XPHY_REGArray_Table_PG;\r
1210         u16     PHY_REGArrayPGLen;\r
1211         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1212 \r
1213 \r
1214         PHY_REGArrayPGLen = Rtl8723_PHY_REG_Array_PGLength;\r
1215         Rtl819XPHY_REGArray_Table_PG = (u32*)Rtl8723_PHY_REG_Array_PG;\r
1216 \r
1217         if(ConfigType == BaseBand_Config_PHY_REG)\r
1218         {\r
1219                 for(i=0;i<PHY_REGArrayPGLen;i=i+3)\r
1220                 {\r
1221                         #if 0 //without IO, no delay is neeeded...\r
1222                         if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfe){\r
1223                                 #ifdef CONFIG_LONG_DELAY_ISSUE\r
1224                                 rtw_msleep_os(50);\r
1225                                 #else\r
1226                                 rtw_mdelay_os(50);\r
1227                                 #endif\r
1228                         }\r
1229                         else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfd)\r
1230                                 rtw_mdelay_os(5);\r
1231                         else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfc)\r
1232                                 rtw_mdelay_os(1);\r
1233                         else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfb)\r
1234                                 rtw_udelay_os(50);\r
1235                         else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfa)\r
1236                                 rtw_udelay_os(5);\r
1237                         else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xf9)\r
1238                                 rtw_udelay_os(1);\r
1239                         //PHY_SetBBReg(Adapter, Rtl819XPHY_REGArray_Table_PG[i], Rtl819XPHY_REGArray_Table_PG[i+1], Rtl819XPHY_REGArray_Table_PG[i+2]);         \r
1240                         #endif\r
1241                         \r
1242                         storePwrIndexDiffRateOffset(Adapter, Rtl819XPHY_REGArray_Table_PG[i],\r
1243                                 Rtl819XPHY_REGArray_Table_PG[i+1],\r
1244                                 Rtl819XPHY_REGArray_Table_PG[i+2]);\r
1245                         //RT_TRACE(COMP_SEND, DBG_TRACE, ("The Rtl819XPHY_REGArray_Table_PG[0] is %lx Rtl819XPHY_REGArray_Table_PG[1] is %lx \n",Rtl819XPHY_REGArray_Table_PG[i], Rtl819XPHY_REGArray_Table_PG[i+1]));\r
1246                 }\r
1247         }\r
1248         else\r
1249         {\r
1250 \r
1251                 //RT_TRACE(COMP_SEND, DBG_LOUD, ("phy_ConfigBBWithPgHeaderFile(): ConfigType != BaseBand_Config_PHY_REG\n"));\r
1252         }\r
1253 \r
1254         return _SUCCESS;\r
1255 \r
1256 }       /* phy_ConfigBBWithPgHeaderFile */\r
1257 \r
1258 #if (MP_DRIVER == 1)\r
1259 \r
1260 /*-----------------------------------------------------------------------------\r
1261  * Function:    phy_ConfigBBWithMpParaFile()\r
1262  *\r
1263  * Overview:    This function read BB parameters from general file format, and do register\r
1264  *                        Read/Write\r
1265  *\r
1266  * Input:       PADAPTER                Adapter\r
1267  *                      ps1Byte                         pFileName\r
1268  *\r
1269  * Output:      NONE\r
1270  *\r
1271  * Return:      RT_STATUS_SUCCESS: configuration file exist\r
1272  *      2008/11/06      MH      For 92S we do not support silent reset now. Disable\r
1273  *                                      parameter file compare!!!!!!??\r
1274  *\r
1275  *---------------------------------------------------------------------------*/\r
1276 static  int\r
1277 phy_ConfigBBWithMpParaFile(\r
1278         IN      PADAPTER                Adapter,\r
1279         IN      u8*                     pFileName\r
1280 )\r
1281 {\r
1282 #if 1\r
1283         int             rtStatus = _SUCCESS;\r
1284 #else\r
1285         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1286         s4Byte                  nLinesRead, ithLine;\r
1287         RT_STATUS               rtStatus = RT_STATUS_SUCCESS;\r
1288         ps1Byte                 szLine;\r
1289         u4Byte                  u4bRegOffset, u4bRegMask, u4bRegValue;\r
1290         u4Byte                  u4bMove;\r
1291 \r
1292         if(ADAPTER_TEST_STATUS_FLAG(Adapter, ADAPTER_STATUS_FIRST_INIT))\r
1293         {\r
1294                 rtStatus = PlatformReadFile(\r
1295                                         Adapter,\r
1296                                         pFileName,\r
1297                                         (pu1Byte)(pHalData->BufOfLines),\r
1298                                         MAX_LINES_HWCONFIG_TXT,\r
1299                                         MAX_BYTES_LINE_HWCONFIG_TXT,\r
1300                                         &nLinesRead\r
1301                                         );\r
1302                 if(rtStatus == RT_STATUS_SUCCESS)\r
1303                 {\r
1304                         PlatformMoveMemory(pHalData->BufOfLines6, pHalData->BufOfLines, nLinesRead*MAX_BYTES_LINE_HWCONFIG_TXT);\r
1305                         pHalData->nLinesRead6 = nLinesRead;\r
1306                 }\r
1307                 else\r
1308                 {\r
1309                         // Temporarily skip PHY_REG_MP.txt if file does not exist.\r
1310                         pHalData->nLinesRead6 = 0;\r
1311                         RT_TRACE(COMP_INIT, DBG_LOUD, ("No matched file \r\n"));\r
1312                         return RT_STATUS_SUCCESS;\r
1313                 }\r
1314         }\r
1315         else\r
1316         {\r
1317                 PlatformMoveMemory(pHalData->BufOfLines, pHalData->BufOfLines6, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);\r
1318                 nLinesRead = pHalData->nLinesRead6;\r
1319                 rtStatus = RT_STATUS_SUCCESS;\r
1320         }\r
1321 \r
1322 \r
1323         if(rtStatus == RT_STATUS_SUCCESS)\r
1324         {\r
1325                 RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): read %s ok\n", pFileName));\r
1326 \r
1327                 for(ithLine = 0; ithLine < nLinesRead; ithLine++)\r
1328                 {\r
1329                         szLine = pHalData->BufOfLines[ithLine];\r
1330 \r
1331                         if(!IsCommentString(szLine))\r
1332                         {\r
1333                                 // Get 1st hex value as register offset.\r
1334                                 if(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove))\r
1335                                 {\r
1336                                         if(u4bRegOffset == 0xff)\r
1337                                         { // Ending.\r
1338                                                 break;\r
1339                                         }\r
1340                                         else if (u4bRegOffset == 0xfe)\r
1341                                                 delay_ms(50);\r
1342                                         else if (u4bRegOffset == 0xfd)\r
1343                                                 delay_ms(5);\r
1344                                         else if (u4bRegOffset == 0xfc)\r
1345                                                 delay_ms(1);\r
1346                                         else if (u4bRegOffset == 0xfb)\r
1347                                                 PlatformStallExecution(50);\r
1348                                         else if (u4bRegOffset == 0xfa)\r
1349                                                 PlatformStallExecution(5);\r
1350                                         else if (u4bRegOffset == 0xf9)\r
1351                                                 PlatformStallExecution(1);\r
1352 \r
1353                                         // Get 2nd hex value as register value.\r
1354                                         szLine += u4bMove;\r
1355                                         if(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))\r
1356                                         {\r
1357                                                 RT_TRACE(COMP_FPGA, DBG_TRACE, ("[ADDR]%03lX=%08lX\n", u4bRegOffset, u4bRegValue));\r
1358                                                 PHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue);\r
1359 \r
1360                                                 // Add 1us delay between BB/RF register setting.\r
1361                                                 PlatformStallExecution(1);\r
1362                                         }\r
1363                                 }\r
1364                         }\r
1365                 }\r
1366         }\r
1367         else\r
1368         {\r
1369                 RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): Failed%s\n", pFileName));\r
1370         }\r
1371 #endif\r
1372 \r
1373         return rtStatus;\r
1374 }\r
1375 \r
1376 /*-----------------------------------------------------------------------------\r
1377  * Function:    phy_ConfigBBWithMpHeaderFile\r
1378  *\r
1379  * Overview:    Config PHY_REG_MP array\r
1380  *\r
1381  * Input:       NONE\r
1382  *\r
1383  * Output:      NONE\r
1384  *\r
1385  * Return:      NONE\r
1386  *\r
1387  * Revised History:\r
1388  * When                 Who             Remark\r
1389  * 02/04/2010   chiyokolin              Modify to new files.\r
1390  *---------------------------------------------------------------------------*/\r
1391 static int\r
1392 phy_ConfigBBWithMpHeaderFile(\r
1393         IN      PADAPTER                Adapter,\r
1394         IN      u1Byte                  ConfigType)\r
1395 {\r
1396         int i;\r
1397         u32*    Rtl8192CPHY_REGArray_Table_MP;\r
1398         u16     PHY_REGArrayMPLen;\r
1399         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1400 \r
1401 \r
1402         PHY_REGArrayMPLen = Rtl8723_PHY_REG_Array_MPLength;\r
1403         Rtl8192CPHY_REGArray_Table_MP = (u32*)Rtl8723_PHY_REG_Array_MP;\r
1404 \r
1405         if(ConfigType == BaseBand_Config_PHY_REG)\r
1406         {\r
1407                 for(i=0;i<PHY_REGArrayMPLen;i=i+2)\r
1408                 {\r
1409                         if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfe) {\r
1410                                 #ifdef CONFIG_LONG_DELAY_ISSUE\r
1411                                 rtw_msleep_os(50);\r
1412                                 #else\r
1413                                 rtw_mdelay_os(50);\r
1414                                 #endif\r
1415                         }\r
1416                         else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfd)\r
1417                                 rtw_mdelay_os(5);\r
1418                         else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfc)\r
1419                                 rtw_mdelay_os(1);\r
1420                         else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfb) {\r
1421                                 #ifdef CONFIG_LONG_DELAY_ISSUE\r
1422                                 rtw_msleep_os(50);\r
1423                                 #else\r
1424                                 rtw_mdelay_os(50);\r
1425                                 #endif\r
1426                         }\r
1427                         else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfa)\r
1428                                 rtw_mdelay_os(5);\r
1429                         else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xf9)\r
1430                                 rtw_mdelay_os(1);\r
1431                         PHY_SetBBReg(Adapter, Rtl8192CPHY_REGArray_Table_MP[i], bMaskDWord, Rtl8192CPHY_REGArray_Table_MP[i+1]);\r
1432 \r
1433                         // Add 1us delay between BB/RF register setting.\r
1434                         rtw_mdelay_os(1);\r
1435 \r
1436 //                      RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl8192CPHY_REGArray_Table_MP[%d] is %lx Rtl8192CPHY_REGArray_Table_MP[%d] is %lx \n", i, i+1, Rtl8192CPHY_REGArray_Table_MP[i], Rtl8192CPHY_REGArray_Table_MP[i+1]));\r
1437                 }\r
1438         }\r
1439         else\r
1440         {\r
1441 //              RT_TRACE(COMP_SEND, DBG_LOUD, ("phy_ConfigBBWithMpHeaderFile(): ConfigType != BaseBand_Config_PHY_REG\n"));\r
1442         }\r
1443 \r
1444         return _SUCCESS;\r
1445 }       /* phy_ConfigBBWithMpHeaderFile */\r
1446 \r
1447 #endif  // #if (MP_DRIVER == 1)\r
1448 \r
1449 static VOID\r
1450 phy_BB8192C_Config_1T(\r
1451         IN PADAPTER Adapter\r
1452         )\r
1453 {\r
1454 #if 0\r
1455         //for path - A\r
1456         PHY_SetBBReg(Adapter, rFPGA0_TxInfo, 0x3, 0x1);\r
1457         PHY_SetBBReg(Adapter, rFPGA1_TxInfo, 0x0303, 0x0101);\r
1458         PHY_SetBBReg(Adapter, 0xe74, 0x0c000000, 0x1);\r
1459         PHY_SetBBReg(Adapter, 0xe78, 0x0c000000, 0x1);\r
1460         PHY_SetBBReg(Adapter, 0xe7c, 0x0c000000, 0x1);\r
1461         PHY_SetBBReg(Adapter, 0xe80, 0x0c000000, 0x1);\r
1462         PHY_SetBBReg(Adapter, 0xe88, 0x0c000000, 0x1);\r
1463 #endif\r
1464         //for path - B\r
1465         PHY_SetBBReg(Adapter, rFPGA0_TxInfo, 0x3, 0x2);\r
1466         PHY_SetBBReg(Adapter, rFPGA1_TxInfo, 0x300033, 0x200022);\r
1467 \r
1468         // 20100519 Joseph: Add for 1T2R config. Suggested by Kevin, Jenyu and Yunan.\r
1469         PHY_SetBBReg(Adapter, rCCK0_AFESetting, bMaskByte3, 0x45);\r
1470         PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskByte0, 0x23);\r
1471         PHY_SetBBReg(Adapter, rOFDM0_AGCParameter1, 0x30, 0x1); // B path first AGC\r
1472 \r
1473         PHY_SetBBReg(Adapter, 0xe74, 0x0c000000, 0x2);\r
1474         PHY_SetBBReg(Adapter, 0xe78, 0x0c000000, 0x2);\r
1475         PHY_SetBBReg(Adapter, 0xe7c, 0x0c000000, 0x2);\r
1476         PHY_SetBBReg(Adapter, 0xe80, 0x0c000000, 0x2);\r
1477         PHY_SetBBReg(Adapter, 0xe88, 0x0c000000, 0x2);\r
1478 \r
1479 \r
1480 }\r
1481 \r
1482 // Joseph test: new initialize order!!\r
1483 // Test only!! This part need to be re-organized.\r
1484 // Now it is just for 8256.\r
1485 static  int\r
1486 phy_BB8190_Config_HardCode(\r
1487         IN      PADAPTER        Adapter\r
1488         )\r
1489 {\r
1490         //RT_ASSERT(FALSE, ("This function is not implement yet!! \n"));\r
1491         return _SUCCESS;\r
1492 }\r
1493 \r
1494 static  int\r
1495 phy_BB8723a_Config_ParaFile(\r
1496         IN      PADAPTER        Adapter\r
1497         )\r
1498 {\r
1499         EEPROM_EFUSE_PRIV       *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);\r
1500         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
1501         int                     rtStatus = _SUCCESS;\r
1502 \r
1503         u8      sz8723BBRegFile[] = RTL8723_PHY_REG;\r
1504         u8      sz8723AGCTableFile[] = RTL8723_AGC_TAB;\r
1505         u8      sz8723BBRegPgFile[] = RTL8723_PHY_REG_PG;\r
1506         u8      sz8723BBRegMpFile[] = RTL8723_PHY_REG_MP;\r
1507 \r
1508         u8      *pszBBRegFile = NULL, *pszAGCTableFile = NULL, *pszBBRegPgFile = NULL, *pszBBRegMpFile=NULL;\r
1509 \r
1510 \r
1511         //RT_TRACE(COMP_INIT, DBG_TRACE, ("==>phy_BB8192S_Config_ParaFile\n"));\r
1512 \r
1513         pszBBRegFile = sz8723BBRegFile ;\r
1514         pszAGCTableFile = sz8723AGCTableFile;\r
1515         pszBBRegPgFile = sz8723BBRegPgFile;\r
1516         pszBBRegMpFile = sz8723BBRegMpFile;\r
1517 \r
1518         //\r
1519         // 1. Read PHY_REG.TXT BB INIT!!\r
1520         // We will seperate as 88C / 92C according to chip version\r
1521         //\r
1522 #ifdef CONFIG_EMBEDDED_FWIMG\r
1523         #ifdef CONFIG_PHY_SETTING_WITH_ODM\r
1524         if(HAL_STATUS_FAILURE ==ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG))\r
1525                 rtStatus = _FAIL;\r
1526         #else\r
1527         rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_PHY_REG);\r
1528         #endif\r
1529 #else\r
1530         // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different\r
1531         // type of parameter files to phy_reg.txt at first.\r
1532         rtStatus = phy_ConfigBBWithParaFile(Adapter,pszBBRegFile);\r
1533 #endif//#ifdef CONFIG_EMBEDDED_FWIMG\r
1534 \r
1535         if(rtStatus != _SUCCESS){\r
1536                 //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg Fail!!"));\r
1537                 goto phy_BB8190_Config_ParaFile_Fail;\r
1538         }\r
1539 \r
1540 #if MP_DRIVER == 1\r
1541         if (Adapter->registrypriv.mp_mode == 1)\r
1542         {\r
1543         //\r
1544         // 1.1 Read PHY_REG_MP.TXT BB INIT!!\r
1545         // We will seperate as 88C / 92C according to chip version\r
1546         //\r
1547 #ifdef CONFIG_EMBEDDED_FWIMG\r
1548         rtStatus = phy_ConfigBBWithMpHeaderFile(Adapter, BaseBand_Config_PHY_REG);\r
1549 #else\r
1550         // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different\r
1551         // type of parameter files to phy_reg.txt at first.\r
1552         rtStatus = phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile);\r
1553 #endif\r
1554 \r
1555         if(rtStatus != _SUCCESS){\r
1556 //              RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg MP Fail!!"));\r
1557                 goto phy_BB8190_Config_ParaFile_Fail;\r
1558         }\r
1559         }\r
1560 #endif  // #if (MP_DRIVER == 1)\r
1561 \r
1562         //\r
1563         // 20100318 Joseph: Config 2T2R to 1T2R if necessary.\r
1564         //\r
1565         if(pHalData->rf_type == RF_1T2R)\r
1566         {\r
1567                 phy_BB8192C_Config_1T(Adapter);\r
1568                 DBG_8192C("phy_BB8723a_Config_ParaFile():Config to 1T!!\n");\r
1569         }\r
1570 \r
1571         //\r
1572         // 2. If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt\r
1573         //\r
1574         if (pEEPROM->bautoload_fail_flag == _FALSE)\r
1575         {\r
1576                 pHalData->pwrGroupCnt = 0;\r
1577 \r
1578 #ifdef CONFIG_EMBEDDED_FWIMG\r
1579                 rtStatus = phy_ConfigBBWithPgHeaderFile(Adapter, BaseBand_Config_PHY_REG);\r
1580 #else\r
1581                 rtStatus = phy_ConfigBBWithPgParaFile(Adapter, pszBBRegPgFile);\r
1582 #endif\r
1583         }\r
1584 \r
1585         if(rtStatus != _SUCCESS){\r
1586                 //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():BB_PG Reg Fail!!"));\r
1587                 goto phy_BB8190_Config_ParaFile_Fail;\r
1588         }\r
1589 \r
1590         //\r
1591         // 3. BB AGC table Initialization\r
1592         //\r
1593 #ifdef CONFIG_EMBEDDED_FWIMG\r
1594         #ifdef CONFIG_PHY_SETTING_WITH_ODM      \r
1595         if(HAL_STATUS_FAILURE ==ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv,  CONFIG_BB_AGC_TAB))\r
1596                 rtStatus = _FAIL;\r
1597         #else\r
1598         rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_AGC_TAB);\r
1599         #endif//#ifdef CONFIG_PHY_SETTING_WITH_ODM      \r
1600 #else\r
1601         //RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_BB8192S_Config_ParaFile AGC_TAB.txt\n"));\r
1602         rtStatus = phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile);\r
1603 #endif\r
1604 \r
1605         if(rtStatus != _SUCCESS){\r
1606                 //RT_TRACE(COMP_FPGA, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():AGC Table Fail\n"));\r
1607                 goto phy_BB8190_Config_ParaFile_Fail;\r
1608         }\r
1609 \r
1610 phy_BB8190_Config_ParaFile_Fail:\r
1611 \r
1612         return rtStatus;\r
1613 }\r
1614 \r
1615 \r
1616 int\r
1617 PHY_BBConfig8723A(\r
1618         IN      PADAPTER        Adapter\r
1619         )\r
1620 {\r
1621         int     rtStatus = _SUCCESS;\r
1622         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1623         u32     RegVal;\r
1624         u8      TmpU1B=0;\r
1625         u8      value8,CrystalCap;\r
1626 \r
1627         phy_InitBBRFRegisterDefinition(Adapter);\r
1628 \r
1629         if(IS_HARDWARE_TYPE_8723A(Adapter))\r
1630         {\r
1631                 // Suggested by Scott. tynli_test. 2010.12.30.\r
1632                 //1. 0x28[1] = 1\r
1633                 TmpU1B = rtw_read8(Adapter, REG_AFE_PLL_CTRL);\r
1634                 rtw_udelay_os(2);\r
1635                 rtw_write8(Adapter, REG_AFE_PLL_CTRL, (TmpU1B|BIT1));\r
1636                 rtw_udelay_os(2);\r
1637 \r
1638                 //2. 0x29[7:0] = 0xFF\r
1639                 rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xff);\r
1640                 rtw_udelay_os(2);\r
1641 \r
1642                 //3. 0x02[1:0] = 2b'11\r
1643                 TmpU1B = rtw_read8(Adapter, REG_SYS_FUNC_EN);\r
1644                 rtw_write8(Adapter, REG_SYS_FUNC_EN, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB));\r
1645 \r
1646                 //4. 0x25[6] = 0\r
1647                 TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+1);\r
1648                 rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, (TmpU1B&(~BIT6)));\r
1649 \r
1650                 //5. 0x24[20] = 0       //Advised by SD3 Alex Wang. 2011.02.09.\r
1651                 TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+2);\r
1652                 rtw_write8(Adapter, REG_AFE_XTAL_CTRL+2, (TmpU1B&(~BIT4)));\r
1653 \r
1654                 //6. 0x1f[7:0] = 0x07\r
1655                 rtw_write8(Adapter, REG_RF_CTRL, 0x07);\r
1656         }\r
1657         else\r
1658         {\r
1659                 // Enable BB and RF\r
1660                 RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN);\r
1661                 rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1));\r
1662 \r
1663                 // 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF.\r
1664                 rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83);\r
1665                 rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xdb);\r
1666 \r
1667                 rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB);\r
1668 \r
1669 #ifdef CONFIG_USB_HCI\r
1670                 rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB);\r
1671 #else\r
1672                 rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RSTn|FEN_BBRSTB);\r
1673 #endif\r
1674 \r
1675                 // 2009/10/21 by SD1 Jong. Modified by tynli. Not in Documented in V8.1.\r
1676 #ifdef CONFIG_USB_HCI\r
1677                 //To Fix MAC loopback mode fail. Suggested by SD4 Johnny. 2010.03.23.\r
1678                 rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x0f);\r
1679                 rtw_write8(Adapter, 0x15, 0xe9);\r
1680 #endif\r
1681 \r
1682                 rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, 0x80);\r
1683 \r
1684 #ifdef CONFIG_PCI_HCI\r
1685                 // Force use left antenna by default for 88C.\r
1686         //      if(!IS_92C_SERIAL(pHalData->VersionID) || IS_92C_1T2R(pHalData->VersionID))\r
1687                 if(Adapter->ledpriv.LedStrategy != SW_LED_MODE10)\r
1688                 {\r
1689                         RegVal = rtw_read32(Adapter, REG_LEDCFG0);\r
1690                         rtw_write32(Adapter, REG_LEDCFG0, RegVal|BIT23);\r
1691                 }\r
1692 #endif\r
1693         }\r
1694 \r
1695         //\r
1696         // Config BB and AGC\r
1697         //\r
1698         rtStatus = phy_BB8723a_Config_ParaFile(Adapter);\r
1699 \r
1700 #ifdef CONFIG_USB_HCI\r
1701         if(IS_HARDWARE_TYPE_8192CU(Adapter)&&IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)\r
1702                 &&(pHalData->BoardType == BOARD_USB_High_PA))\r
1703                         rtw_write8(Adapter, 0xc72, 0x50);\r
1704 #endif\r
1705 //only for B-cut\r
1706         if(IS_HARDWARE_TYPE_8723A(Adapter) && pHalData->EEPROMVersion >= 0x01)\r
1707         {\r
1708                 CrystalCap = pHalData->CrystalCap & 0x3F;\r
1709                 PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));    \r
1710         }\r
1711         \r
1712         if(IS_HARDWARE_TYPE_8723AE(Adapter))\r
1713                 PHY_SetBBReg(Adapter, REG_LDOA15_CTRL, bMaskDWord, 0x01572505);                 \r
1714         return rtStatus;\r
1715 }\r
1716 \r
1717 \r
1718 int\r
1719 PHY_RFConfig8723A(\r
1720         IN      PADAPTER        Adapter\r
1721         )\r
1722 {\r
1723         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1724         int             rtStatus = _SUCCESS;\r
1725 \r
1726         //\r
1727         // RF config\r
1728         //\r
1729         rtStatus = PHY_RF6052_Config8723A(Adapter);\r
1730         return rtStatus;\r
1731 }\r
1732 \r
1733 \r
1734 /*-----------------------------------------------------------------------------\r
1735  * Function:    PHY_ConfigRFWithParaFile()\r
1736  *\r
1737  * Overview:    This function read RF parameters from general file format, and do RF 3-wire\r
1738  *\r
1739  * Input:       PADAPTER                        Adapter\r
1740  *                      ps1Byte                                 pFileName\r
1741  *                      RF_RADIO_PATH_E eRFPath\r
1742  *\r
1743  * Output:      NONE\r
1744  *\r
1745  * Return:      RT_STATUS_SUCCESS: configuration file exist\r
1746  *\r
1747  * Note:                Delay may be required for RF configuration\r
1748  *---------------------------------------------------------------------------*/\r
1749 int\r
1750 rtl8192c_PHY_ConfigRFWithParaFile(\r
1751         IN      PADAPTER                        Adapter,\r
1752         IN      u8*                             pFileName,\r
1753         RF_RADIO_PATH_E         eRFPath\r
1754 )\r
1755 {\r
1756         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1757 \r
1758         int     rtStatus = _SUCCESS;\r
1759 \r
1760 \r
1761         return rtStatus;\r
1762 \r
1763 }\r
1764 \r
1765 //****************************************\r
1766 // The following is for High Power PA\r
1767 //****************************************\r
1768 #define HighPowerRadioAArrayLen 22\r
1769 //This is for High power PA\r
1770 u32 Rtl8192S_HighPower_RadioA_Array[HighPowerRadioAArrayLen] = {\r
1771 0x013,0x00029ea4,\r
1772 0x013,0x00025e74,\r
1773 0x013,0x00020ea4,\r
1774 0x013,0x0001ced0,\r
1775 0x013,0x00019f40,\r
1776 0x013,0x00014e70,\r
1777 0x013,0x000106a0,\r
1778 0x013,0x0000c670,\r
1779 0x013,0x000082a0,\r
1780 0x013,0x00004270,\r
1781 0x013,0x00000240,\r
1782 };\r
1783 \r
1784 int\r
1785 PHY_ConfigRFExternalPA(\r
1786         IN      PADAPTER                        Adapter,\r
1787         RF_RADIO_PATH_E         eRFPath\r
1788 )\r
1789 {\r
1790         int     rtStatus = _SUCCESS;\r
1791 #ifdef CONFIG_USB_HCI\r
1792         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1793         u16 i=0;\r
1794 \r
1795         if(!pHalData->ExternalPA)\r
1796         {\r
1797                 return rtStatus;\r
1798         }\r
1799 \r
1800         // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the\r
1801         // same code as SU. It is already updated in radio_a_1T_HP.txt.\r
1802 #if 0\r
1803         //add for SU High Power PA\r
1804         for(i = 0;i<HighPowerRadioAArrayLen; i=i+2)\r
1805         {\r
1806                 RT_TRACE(COMP_INIT, DBG_LOUD, ("External PA, write RF 0x%lx=0x%lx\n", Rtl8192S_HighPower_RadioA_Array[i], Rtl8192S_HighPower_RadioA_Array[i+1]));\r
1807                 PHY_SetRFReg(Adapter, eRFPath, Rtl8192S_HighPower_RadioA_Array[i], bRFRegOffsetMask, Rtl8192S_HighPower_RadioA_Array[i+1]);\r
1808         }\r
1809 #endif\r
1810 \r
1811 #endif\r
1812         return rtStatus;\r
1813 }\r
1814 //****************************************\r
1815 /*-----------------------------------------------------------------------------\r
1816  * Function:    PHY_ConfigRFWithHeaderFile()\r
1817  *\r
1818  * Overview:    This function read RF parameters from general file format, and do RF 3-wire\r
1819  *\r
1820  * Input:       PADAPTER                        Adapter\r
1821  *                      ps1Byte                                 pFileName\r
1822  *                      RF_RADIO_PATH_E eRFPath\r
1823  *\r
1824  * Output:      NONE\r
1825  *\r
1826  * Return:      RT_STATUS_SUCCESS: configuration file exist\r
1827  *\r
1828  * Note:                Delay may be required for RF configuration\r
1829  *---------------------------------------------------------------------------*/\r
1830 #ifndef CONFIG_PHY_SETTING_WITH_ODM\r
1831 int\r
1832 rtl8723a_PHY_ConfigRFWithHeaderFile(\r
1833         IN      PADAPTER                        Adapter,\r
1834         RF_RADIO_PATH_E         eRFPath\r
1835 )\r
1836 {\r
1837 \r
1838         int                     i;\r
1839         int                     rtStatus = _SUCCESS;\r
1840         u32*            Rtl819XRadioA_Array_Table;\r
1841         u32*            Rtl819XRadioB_Array_Table;\r
1842         u16             RadioA_ArrayLen,RadioB_ArrayLen;\r
1843         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1844 \r
1845 \r
1846         RadioA_ArrayLen = Rtl8723_RadioA_1TArrayLength;\r
1847         Rtl819XRadioA_Array_Table = (u32*)Rtl8723_RadioA_1TArray;\r
1848         RadioB_ArrayLen = Rtl8723_RadioB_1TArrayLength;\r
1849         Rtl819XRadioB_Array_Table = (u32*)Rtl8723_RadioB_1TArray;\r
1850 //      RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> PHY_ConfigRFWithHeaderFile() Radio_A:Rtl8723RadioA_1TArray\n"));\r
1851 //      RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> PHY_ConfigRFWithHeaderFile() Radio_B:Rtl8723RadioB_1TArray\n"));\r
1852 \r
1853         switch (eRFPath)\r
1854         {\r
1855                 case RF_PATH_A:\r
1856                         #ifdef CONFIG_IOL_RF_RF90_PATH_A\r
1857                         {\r
1858                                 struct xmit_frame       *xmit_frame;\r
1859                                 if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) {\r
1860                                         rtStatus = _FAIL;\r
1861                                         goto exit;\r
1862                                 }\r
1863 \r
1864                                 for(i = 0;i<RadioA_ArrayLen; i=i+2)\r
1865                                 {\r
1866                                         if(Rtl819XRadioA_Array_Table[i] == 0xfe)\r
1867                                                 rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 50);\r
1868                                         else if (Rtl819XRadioA_Array_Table[i] == 0xfd)\r
1869                                                 rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 5);\r
1870                                         else if (Rtl819XRadioA_Array_Table[i] == 0xfc)\r
1871                                                 rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 1);\r
1872                                         else if (Rtl819XRadioA_Array_Table[i] == 0xfb)\r
1873                                                 rtw_IOL_append_DELAY_US_cmd(xmit_frame, 50);\r
1874                                         else if (Rtl819XRadioA_Array_Table[i] == 0xfa)\r
1875                                                 rtw_IOL_append_DELAY_US_cmd(xmit_frame, 5);\r
1876                                         else if (Rtl819XRadioA_Array_Table[i] == 0xf9)\r
1877                                                 rtw_IOL_append_DELAY_US_cmd(xmit_frame, 1);\r
1878                                         else\r
1879                                         {\r
1880                                                 BB_REGISTER_DEFINITION_T        *pPhyReg = &pHalData->PHYRegDef[eRFPath];\r
1881                                                 u32     NewOffset = 0;\r
1882                                                 u32     DataAndAddr = 0;\r
1883 \r
1884                                                 NewOffset = Rtl819XRadioA_Array_Table[i] & 0x3f;\r
1885                                                 DataAndAddr = ((NewOffset<<20) | (Rtl819XRadioA_Array_Table[i+1]&0x000fffff)) & 0x0fffffff;     // T65 RF\r
1886                                                 rtw_IOL_append_WD_cmd(xmit_frame, pPhyReg->rf3wireOffset, DataAndAddr);\r
1887                                         }\r
1888                                 }\r
1889                                 rtStatus = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0);\r
1890                         }\r
1891                         #else\r
1892                         for(i = 0;i<RadioA_ArrayLen; i=i+2)\r
1893                         {\r
1894                                 if(Rtl819XRadioA_Array_Table[i] == 0xfe) {\r
1895                                         #ifdef CONFIG_LONG_DELAY_ISSUE\r
1896                                         rtw_msleep_os(50);\r
1897                                         #else\r
1898                                         rtw_mdelay_os(50);\r
1899                                         #endif\r
1900                                 }\r
1901                                 else if (Rtl819XRadioA_Array_Table[i] == 0xfd)\r
1902                                         rtw_mdelay_os(5);\r
1903                                 else if (Rtl819XRadioA_Array_Table[i] == 0xfc)\r
1904                                         rtw_mdelay_os(1);\r
1905                                 else if (Rtl819XRadioA_Array_Table[i] == 0xfb)\r
1906                                         rtw_udelay_os(50);\r
1907                                 else if (Rtl819XRadioA_Array_Table[i] == 0xfa)\r
1908                                         rtw_udelay_os(5);\r
1909                                 else if (Rtl819XRadioA_Array_Table[i] == 0xf9)\r
1910                                         rtw_udelay_os(1);\r
1911                                 else\r
1912                                 {\r
1913                                         PHY_SetRFReg(Adapter, eRFPath, Rtl819XRadioA_Array_Table[i], bRFRegOffsetMask, Rtl819XRadioA_Array_Table[i+1]);\r
1914                                         // Add 1us delay between BB/RF register setting.\r
1915                                         rtw_udelay_os(1);\r
1916                                 }\r
1917                         }\r
1918                         #endif\r
1919                         //Add for High Power PA\r
1920                         PHY_ConfigRFExternalPA(Adapter, eRFPath);\r
1921                         break;\r
1922                 case RF_PATH_B:\r
1923                         #ifdef CONFIG_IOL_RF_RF_PATH_B\r
1924                         {\r
1925                                 struct xmit_frame       *xmit_frame;\r
1926                                 if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) {\r
1927                                         rtStatus = _FAIL;\r
1928                                         goto exit;\r
1929                                 }\r
1930 \r
1931                                 for(i = 0;i<RadioB_ArrayLen; i=i+2)\r
1932                                 {\r
1933                                         if(Rtl819XRadioB_Array_Table[i] == 0xfe)\r
1934                                                 rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 50);\r
1935                                         else if (Rtl819XRadioB_Array_Table[i] == 0xfd)\r
1936                                                 rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 5);\r
1937                                         else if (Rtl819XRadioB_Array_Table[i] == 0xfc)\r
1938                                                 rtw_IOL_append_DELAY_MS_cmd(xmit_frame, 1);\r
1939                                         else if (Rtl819XRadioB_Array_Table[i] == 0xfb)\r
1940                                                 rtw_IOL_append_DELAY_US_cmd(xmit_frame, 50);\r
1941                                         else if (Rtl819XRadioB_Array_Table[i] == 0xfa)\r
1942                                                 rtw_IOL_append_DELAY_US_cmd(xmit_frame, 5);\r
1943                                         else if (Rtl819XRadioB_Array_Table[i] == 0xf9)\r
1944                                                 rtw_IOL_append_DELAY_US_cmd(xmit_frame, 1);\r
1945                                         else\r
1946                                         {\r
1947                                                 BB_REGISTER_DEFINITION_T        *pPhyReg = &pHalData->PHYRegDef[eRFPath];\r
1948                                                 u32     NewOffset = 0;\r
1949                                                 u32     DataAndAddr = 0;\r
1950 \r
1951                                                 NewOffset = Rtl819XRadioB_Array_Table[i] & 0x3f;\r
1952                                                 DataAndAddr = ((NewOffset<<20) | (Rtl819XRadioB_Array_Table[i+1]&0x000fffff)) & 0x0fffffff;     // T65 RF\r
1953                                                 rtw_IOL_append_WD_cmd(xmit_frame, pPhyReg->rf3wireOffset, DataAndAddr);\r
1954                                         }\r
1955                                 }\r
1956                                 rtStatus = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0);\r
1957                         }\r
1958                         #else\r
1959                         for(i = 0;i<RadioB_ArrayLen; i=i+2)\r
1960                         {\r
1961                                 if(Rtl819XRadioB_Array_Table[i] == 0xfe)\r
1962                                 { // Deay specific ms. Only RF configuration require delay.\r
1963 #if 0//#ifdef CONFIG_USB_HCI\r
1964                                         #ifdef CONFIG_LONG_DELAY_ISSUE\r
1965                                         rtw_msleep_os(1000);\r
1966                                         #else\r
1967                                         rtw_mdelay_os(1000);\r
1968                                         #endif\r
1969 #else\r
1970                                         #ifdef CONFIG_LONG_DELAY_ISSUE\r
1971                                         rtw_msleep_os(50);\r
1972                                         #else\r
1973                                         rtw_mdelay_os(50);\r
1974                                         #endif\r
1975 #endif\r
1976                                 }\r
1977                                 else if (Rtl819XRadioB_Array_Table[i] == 0xfd)\r
1978                                         rtw_mdelay_os(5);\r
1979                                 else if (Rtl819XRadioB_Array_Table[i] == 0xfc)\r
1980                                         rtw_mdelay_os(1);\r
1981                                 else if (Rtl819XRadioB_Array_Table[i] == 0xfb)\r
1982                                         rtw_udelay_os(50);\r
1983                                 else if (Rtl819XRadioB_Array_Table[i] == 0xfa)\r
1984                                         rtw_udelay_os(5);\r
1985                                 else if (Rtl819XRadioB_Array_Table[i] == 0xf9)\r
1986                                         rtw_udelay_os(1);\r
1987                                 else\r
1988                                 {\r
1989                                         PHY_SetRFReg(Adapter, eRFPath, Rtl819XRadioB_Array_Table[i], bRFRegOffsetMask, Rtl819XRadioB_Array_Table[i+1]);\r
1990                                         // Add 1us delay between BB/RF register setting.\r
1991                                         rtw_udelay_os(1);\r
1992                                 }\r
1993                         }\r
1994                         #endif\r
1995                         break;\r
1996                 case RF_PATH_C:\r
1997                         break;\r
1998                 case RF_PATH_D:\r
1999                         break;\r
2000         }\r
2001 \r
2002 exit:\r
2003         return rtStatus;\r
2004 \r
2005 }\r
2006 #endif\r
2007 \r
2008 /*-----------------------------------------------------------------------------\r
2009  * Function:    PHY_CheckBBAndRFOK()\r
2010  *\r
2011  * Overview:    This function is write register and then readback to make sure whether\r
2012  *                        BB[PHY0, PHY1], RF[Patha, path b, path c, path d] is Ok\r
2013  *\r
2014  * Input:       PADAPTER                        Adapter\r
2015  *                      HW90_BLOCK_E            CheckBlock\r
2016  *                      RF_RADIO_PATH_E eRFPath         // it is used only when CheckBlock is HW90_BLOCK_RF\r
2017  *\r
2018  * Output:      NONE\r
2019  *\r
2020  * Return:      RT_STATUS_SUCCESS: PHY is OK\r
2021  *\r
2022  * Note:                This function may be removed in the ASIC\r
2023  *---------------------------------------------------------------------------*/\r
2024 int\r
2025 PHY_CheckBBAndRFOK(\r
2026         IN      PADAPTER                        Adapter,\r
2027         IN      HW90_BLOCK_E            CheckBlock,\r
2028         IN      RF_RADIO_PATH_E eRFPath\r
2029         )\r
2030 {\r
2031         int                     rtStatus = _SUCCESS;\r
2032 \r
2033         u32                             i, CheckTimes = 4,ulRegRead = 0;\r
2034 \r
2035         u32                             WriteAddr[4];\r
2036         u32                             WriteData[] = {0xfffff027, 0xaa55a02f, 0x00000027, 0x55aa502f};\r
2037 \r
2038         // Initialize register address offset to be checked\r
2039         WriteAddr[HW90_BLOCK_MAC] = 0x100;\r
2040         WriteAddr[HW90_BLOCK_PHY0] = 0x900;\r
2041         WriteAddr[HW90_BLOCK_PHY1] = 0x800;\r
2042         WriteAddr[HW90_BLOCK_RF] = 0x3;\r
2043 \r
2044         for(i=0 ; i < CheckTimes ; i++)\r
2045         {\r
2046 \r
2047                 //\r
2048                 // Write Data to register and readback\r
2049                 //\r
2050                 switch(CheckBlock)\r
2051                 {\r
2052                 case HW90_BLOCK_MAC:\r
2053                         //RT_ASSERT(FALSE, ("PHY_CheckBBRFOK(): Never Write 0x100 here!"));\r
2054                         //RT_TRACE(COMP_INIT, DBG_LOUD, ("PHY_CheckBBRFOK(): Never Write 0x100 here!\n"));\r
2055                         break;\r
2056 \r
2057                 case HW90_BLOCK_PHY0:\r
2058                 case HW90_BLOCK_PHY1:\r
2059                         rtw_write32(Adapter, WriteAddr[CheckBlock], WriteData[i]);\r
2060                         ulRegRead = rtw_read32(Adapter, WriteAddr[CheckBlock]);\r
2061                         break;\r
2062 \r
2063                 case HW90_BLOCK_RF:\r
2064                         // When initialization, we want the delay function(delay_ms(), delay_us()\r
2065                         // ==> actually we call PlatformStallExecution()) to do NdisStallExecution()\r
2066                         // [busy wait] instead of NdisMSleep(). So we acquire RT_INITIAL_SPINLOCK\r
2067                         // to run at Dispatch level to achive it.\r
2068                         //cosa PlatformAcquireSpinLock(Adapter, RT_INITIAL_SPINLOCK);\r
2069                         WriteData[i] &= 0xfff;\r
2070                         PHY_SetRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bRFRegOffsetMask, WriteData[i]);\r
2071                         // TODO: we should not delay for such a long time. Ask SD3\r
2072                         rtw_mdelay_os(10);\r
2073                         ulRegRead = PHY_QueryRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord);\r
2074                         rtw_mdelay_os(10);\r
2075                         //cosa PlatformReleaseSpinLock(Adapter, RT_INITIAL_SPINLOCK);\r
2076                         break;\r
2077 \r
2078                 default:\r
2079                         rtStatus = _FAIL;\r
2080                         break;\r
2081                 }\r
2082 \r
2083 \r
2084                 //\r
2085                 // Check whether readback data is correct\r
2086                 //\r
2087                 if(ulRegRead != WriteData[i])\r
2088                 {\r
2089                         //RT_TRACE(COMP_FPGA, DBG_LOUD, ("ulRegRead: %lx, WriteData: %lx \n", ulRegRead, WriteData[i]));\r
2090                         rtStatus = _FAIL;\r
2091                         break;\r
2092                 }\r
2093         }\r
2094 \r
2095         return rtStatus;\r
2096 }\r
2097 \r
2098 \r
2099 VOID\r
2100 rtl8192c_PHY_GetHWRegOriginalValue(\r
2101         IN      PADAPTER                Adapter\r
2102         )\r
2103 {\r
2104         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
2105 \r
2106         // read rx initial gain\r
2107         pHalData->DefaultInitialGain[0] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XAAGCCore1, bMaskByte0);\r
2108         pHalData->DefaultInitialGain[1] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XBAGCCore1, bMaskByte0);\r
2109         pHalData->DefaultInitialGain[2] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XCAGCCore1, bMaskByte0);\r
2110         pHalData->DefaultInitialGain[3] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XDAGCCore1, bMaskByte0);\r
2111         //RT_TRACE(COMP_INIT, DBG_LOUD,\r
2112         //("Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n",\r
2113         //pHalData->DefaultInitialGain[0], pHalData->DefaultInitialGain[1],\r
2114         //pHalData->DefaultInitialGain[2], pHalData->DefaultInitialGain[3]));\r
2115 \r
2116         // read framesync\r
2117         pHalData->framesync = (u8)PHY_QueryBBReg(Adapter, rOFDM0_RxDetector3, bMaskByte0);\r
2118         pHalData->framesyncC34 = PHY_QueryBBReg(Adapter, rOFDM0_RxDetector2, bMaskDWord);\r
2119         //RT_TRACE(COMP_INIT, DBG_LOUD, ("Default framesync (0x%x) = 0x%x \n",\r
2120         //      rOFDM0_RxDetector3, pHalData->framesync));\r
2121 }\r
2122 \r
2123 \r
2124 //\r
2125 //      Description:\r
2126 //              Map dBm into Tx power index according to\r
2127 //              current HW model, for example, RF and PA, and\r
2128 //              current wireless mode.\r
2129 //      By Bruce, 2008-01-29.\r
2130 //\r
2131 static  u8\r
2132 phy_DbmToTxPwrIdx(\r
2133         IN      PADAPTER                Adapter,\r
2134         IN      WIRELESS_MODE   WirelessMode,\r
2135         IN      int                     PowerInDbm\r
2136         )\r
2137 {\r
2138         u8                              TxPwrIdx = 0;\r
2139         int                             Offset = 0;\r
2140 \r
2141 \r
2142         //\r
2143         // Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to\r
2144         // 3dbm, and OFDM HT equals to 0dbm repectively.\r
2145         // Note:\r
2146         //      The mapping may be different by different NICs. Do not use this formula for what needs accurate result.\r
2147         // By Bruce, 2008-01-29.\r
2148         //\r
2149         switch(WirelessMode)\r
2150         {\r
2151         case WIRELESS_MODE_B:\r
2152                 Offset = -7;\r
2153                 break;\r
2154 \r
2155         case WIRELESS_MODE_G:\r
2156         case WIRELESS_MODE_N_24G:\r
2157                 Offset = -8;\r
2158                 break;\r
2159         default:\r
2160                 Offset = -8;\r
2161                 break;\r
2162         }\r
2163 \r
2164         if((PowerInDbm - Offset) > 0)\r
2165         {\r
2166                 TxPwrIdx = (u8)((PowerInDbm - Offset) * 2);\r
2167         }\r
2168         else\r
2169         {\r
2170                 TxPwrIdx = 0;\r
2171         }\r
2172 \r
2173         // Tx Power Index is too large.\r
2174         if(TxPwrIdx > MAX_TXPWR_IDX_NMODE_92S)\r
2175                 TxPwrIdx = MAX_TXPWR_IDX_NMODE_92S;\r
2176 \r
2177         return TxPwrIdx;\r
2178 }\r
2179 \r
2180 //\r
2181 //      Description:\r
2182 //              Map Tx power index into dBm according to\r
2183 //              current HW model, for example, RF and PA, and\r
2184 //              current wireless mode.\r
2185 //      By Bruce, 2008-01-29.\r
2186 //\r
2187 int\r
2188 phy_TxPwrIdxToDbm(\r
2189         IN      PADAPTER                Adapter,\r
2190         IN      WIRELESS_MODE   WirelessMode,\r
2191         IN      u8                      TxPwrIdx\r
2192         )\r
2193 {\r
2194         int                             Offset = 0;\r
2195         int                             PwrOutDbm = 0;\r
2196 \r
2197         //\r
2198         // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm.\r
2199         // Note:\r
2200         //      The mapping may be different by different NICs. Do not use this formula for what needs accurate result.\r
2201         // By Bruce, 2008-01-29.\r
2202         //\r
2203         switch(WirelessMode)\r
2204         {\r
2205         case WIRELESS_MODE_B:\r
2206                 Offset = -7;\r
2207                 break;\r
2208 \r
2209         case WIRELESS_MODE_G:\r
2210         case WIRELESS_MODE_N_24G:\r
2211                 Offset = -8;\r
2212         default:\r
2213                 Offset = -8;\r
2214                 break;\r
2215         }\r
2216 \r
2217         PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part.\r
2218 \r
2219         return PwrOutDbm;\r
2220 }\r
2221 \r
2222 \r
2223 /*-----------------------------------------------------------------------------\r
2224  * Function:    GetTxPowerLevel8190()\r
2225  *\r
2226  * Overview:    This function is export to "common" moudule\r
2227  *\r
2228  * Input:       PADAPTER                Adapter\r
2229  *                      psByte                  Power Level\r
2230  *\r
2231  * Output:      NONE\r
2232  *\r
2233  * Return:      NONE\r
2234  *\r
2235  *---------------------------------------------------------------------------*/\r
2236 VOID\r
2237 PHY_GetTxPowerLevel8192C(\r
2238         IN      PADAPTER                Adapter,\r
2239         OUT u32*                powerlevel\r
2240         )\r
2241 {\r
2242         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
2243         u8                      TxPwrLevel = 0;\r
2244         int                     TxPwrDbm;\r
2245 \r
2246         //\r
2247         // Because the Tx power indexes are different, we report the maximum of them to\r
2248         // meet the CCX TPC request. By Bruce, 2008-01-31.\r
2249         //\r
2250 \r
2251         // CCK\r
2252         TxPwrLevel = pHalData->CurrentCckTxPwrIdx;\r
2253         TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel);\r
2254 \r
2255         // Legacy OFDM\r
2256         TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff;\r
2257 \r
2258         // Compare with Legacy OFDM Tx power.\r
2259         if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm)\r
2260                 TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel);\r
2261 \r
2262         // HT OFDM\r
2263         TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx;\r
2264 \r
2265         // Compare with HT OFDM Tx power.\r
2266         if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm)\r
2267                 TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel);\r
2268 \r
2269         *powerlevel = TxPwrDbm;\r
2270 }\r
2271 \r
2272 \r
2273 static void getTxPowerIndex(\r
2274         IN      PADAPTER                Adapter,\r
2275         IN      u8                      channel,\r
2276         IN OUT u8*              cckPowerLevel,\r
2277         IN OUT u8*              ofdmPowerLevel\r
2278         )\r
2279 {\r
2280         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
2281         u8                              index = (channel -1);\r
2282         // 1. CCK\r
2283         cckPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelCck[RF_PATH_A][index];   //RF-A\r
2284         cckPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelCck[RF_PATH_B][index];   //RF-B\r
2285 \r
2286         // 2. OFDM for 1S or 2S\r
2287         if (GET_RF_TYPE(Adapter) == RF_1T2R || GET_RF_TYPE(Adapter) == RF_1T1R)\r
2288         {\r
2289                 // Read HT 40 OFDM TX power\r
2290                 ofdmPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelHT40_1S[RF_PATH_A][index];\r
2291                 ofdmPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelHT40_1S[RF_PATH_B][index];\r
2292         }\r
2293         else if (GET_RF_TYPE(Adapter) == RF_2T2R)\r
2294         {\r
2295                 // Read HT 40 OFDM TX power\r
2296                 ofdmPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelHT40_2S[RF_PATH_A][index];\r
2297                 ofdmPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelHT40_2S[RF_PATH_B][index];\r
2298         }\r
2299         //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, set tx power index !!\n", channel));\r
2300 }\r
2301 \r
2302 static void ccxPowerIndexCheck(\r
2303         IN      PADAPTER                Adapter,\r
2304         IN      u8                      channel,\r
2305         IN OUT u8*              cckPowerLevel,\r
2306         IN OUT u8*              ofdmPowerLevel\r
2307         )\r
2308 {\r
2309 #if 0\r
2310         PMGNT_INFO                      pMgntInfo = &(Adapter->MgntInfo);\r
2311         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
2312         PRT_CCX_INFO            pCcxInfo = GET_CCX_INFO(pMgntInfo);\r
2313 \r
2314         //\r
2315         // CCX 2 S31, AP control of client transmit power:\r
2316         // 1. We shall not exceed Cell Power Limit as possible as we can.\r
2317         // 2. Tolerance is +/- 5dB.\r
2318         // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit.\r
2319         //\r
2320         // TODO:\r
2321         // 1. 802.11h power contraint\r
2322         //\r
2323         // 071011, by rcnjko.\r
2324         //\r
2325         if(     pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE &&\r
2326                 pMgntInfo->mAssoc &&\r
2327                 pCcxInfo->bUpdateCcxPwr &&\r
2328                 pCcxInfo->bWithCcxCellPwr &&\r
2329                 channel == pMgntInfo->dot11CurrentChannelNumber)\r
2330         {\r
2331                 u1Byte  CckCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pCcxInfo->CcxCellPwr);\r
2332                 u1Byte  LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pCcxInfo->CcxCellPwr);\r
2333                 u1Byte  OfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pCcxInfo->CcxCellPwr);\r
2334 \r
2335                 RT_TRACE(COMP_TXAGC, DBG_LOUD,\r
2336                 ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",\r
2337                 pCcxInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx));\r
2338                 RT_TRACE(COMP_TXAGC, DBG_LOUD,\r
2339                 ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",\r
2340                 channel, cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0]));\r
2341 \r
2342                 // CCK\r
2343                 if(cckPowerLevel[0] > CckCellPwrIdx)\r
2344                         cckPowerLevel[0] = CckCellPwrIdx;\r
2345                 // Legacy OFDM, HT OFDM\r
2346                 if(ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx)\r
2347                 {\r
2348                         if((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0)\r
2349                         {\r
2350                                 ofdmPowerLevel[0] = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff;\r
2351                         }\r
2352                         else\r
2353                         {\r
2354                                 ofdmPowerLevel[0] = 0;\r
2355                         }\r
2356                 }\r
2357 \r
2358                 RT_TRACE(COMP_TXAGC, DBG_LOUD,\r
2359                 ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n",\r
2360                 cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0]));\r
2361         }\r
2362 \r
2363         pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0];\r
2364         pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0];\r
2365 \r
2366         RT_TRACE(COMP_TXAGC, DBG_LOUD,\r
2367                 ("PHY_SetTxPowerLevel8192S(): CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n",\r
2368                 cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0]));\r
2369 #endif\r
2370 }\r
2371 /*-----------------------------------------------------------------------------\r
2372  * Function:    SetTxPowerLevel8190()\r
2373  *\r
2374  * Overview:    This function is export to "HalCommon" moudule\r
2375  *                      We must consider RF path later!!!!!!!\r
2376  *\r
2377  * Input:       PADAPTER                Adapter\r
2378  *                      u1Byte          channel\r
2379  *\r
2380  * Output:      NONE\r
2381  *\r
2382  * Return:      NONE\r
2383  *      2008/11/04      MHC             We remove EEPROM_93C56.\r
2384  *                                              We need to move CCX relative code to independet file.\r
2385  *      2009/01/21      MHC             Support new EEPROM format from SD3 requirement.\r
2386  *\r
2387  *---------------------------------------------------------------------------*/\r
2388 VOID\r
2389 PHY_SetTxPowerLevel8192C(\r
2390         IN      PADAPTER                Adapter,\r
2391         IN      u8                      channel\r
2392         )\r
2393 {\r
2394         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
2395         u8      cckPowerLevel[2], ofdmPowerLevel[2];    // [0]:RF-A, [1]:RF-B\r
2396 /*\r
2397 #if(MP_DRIVER == 1)\r
2398         if (Adapter->registrypriv.mp_mode == 1)\r
2399         return;\r
2400 #endif\r
2401 */\r
2402         if(pHalData->bTXPowerDataReadFromEEPORM == _FALSE)\r
2403                 return;\r
2404 \r
2405         getTxPowerIndex(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]);\r
2406         //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, cckPowerLevel (A / B) = 0x%x / 0x%x,   ofdmPowerLevel (A / B) = 0x%x / 0x%x\n",\r
2407         //      channel, cckPowerLevel[0], cckPowerLevel[1], ofdmPowerLevel[0], ofdmPowerLevel[1]));\r
2408 \r
2409         ccxPowerIndexCheck(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]);\r
2410 \r
2411         rtl8192c_PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]);\r
2412         rtl8192c_PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel);\r
2413 \r
2414 #if 0\r
2415         switch(pHalData->rf_chip)\r
2416         {\r
2417                 case RF_8225:\r
2418                         PHY_SetRF8225CckTxPower(Adapter, cckPowerLevel[0]);\r
2419                         PHY_SetRF8225OfdmTxPower(Adapter, ofdmPowerLevel[0]);\r
2420                 break;\r
2421 \r
2422                 case RF_8256:\r
2423                         PHY_SetRF8256CCKTxPower(Adapter, cckPowerLevel[0]);\r
2424                         PHY_SetRF8256OFDMTxPower(Adapter, ofdmPowerLevel[0]);\r
2425                         break;\r
2426 \r
2427                 case RF_6052:\r
2428                         PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]);\r
2429                         PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel);\r
2430                         break;\r
2431 \r
2432                 case RF_8258:\r
2433                         break;\r
2434         }\r
2435 #endif\r
2436 \r
2437 }\r
2438 \r
2439 \r
2440 //\r
2441 //      Description:\r
2442 //              Update transmit power level of all channel supported.\r
2443 //\r
2444 //      TODO:\r
2445 //              A mode.\r
2446 //      By Bruce, 2008-02-04.\r
2447 //\r
2448 BOOLEAN\r
2449 PHY_UpdateTxPowerDbm8192C(\r
2450         IN      PADAPTER        Adapter,\r
2451         IN      int             powerInDbm\r
2452         )\r
2453 {\r
2454         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
2455         u8                              idx;\r
2456         u8                      rf_path;\r
2457 \r
2458         // TODO: A mode Tx power.\r
2459         u8      CckTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, powerInDbm);\r
2460         u8      OfdmTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, powerInDbm);\r
2461 \r
2462         if(OfdmTxPwrIdx - pHalData->LegacyHTTxPowerDiff > 0)\r
2463                 OfdmTxPwrIdx -= pHalData->LegacyHTTxPowerDiff;\r
2464         else\r
2465                 OfdmTxPwrIdx = 0;\r
2466 \r
2467         //RT_TRACE(COMP_TXAGC, DBG_LOUD, ("PHY_UpdateTxPowerDbm8192S(): %ld dBm , CckTxPwrIdx = %d, OfdmTxPwrIdx = %d\n", powerInDbm, CckTxPwrIdx, OfdmTxPwrIdx));\r
2468 \r
2469         for(idx = 0; idx < 14; idx++)\r
2470         {\r
2471                 for (rf_path = 0; rf_path < 2; rf_path++)\r
2472                 {\r
2473                         pHalData->TxPwrLevelCck[rf_path][idx] = CckTxPwrIdx;\r
2474                         pHalData->TxPwrLevelHT40_1S[rf_path][idx] =\r
2475                         pHalData->TxPwrLevelHT40_2S[rf_path][idx] = OfdmTxPwrIdx;\r
2476                 }\r
2477         }\r
2478 \r
2479         //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel);//gtest:todo\r
2480 \r
2481         return _TRUE;\r
2482 }\r
2483 \r
2484 \r
2485 /*\r
2486         Description:\r
2487                 When beacon interval is changed, the values of the\r
2488                 hw registers should be modified.\r
2489         By tynli, 2008.10.24.\r
2490 \r
2491 */\r
2492 \r
2493 \r
2494 void\r
2495 rtl8192c_PHY_SetBeaconHwReg(\r
2496         IN      PADAPTER                Adapter,\r
2497         IN      u16                     BeaconInterval\r
2498         )\r
2499 {\r
2500 \r
2501 }\r
2502 \r
2503 \r
2504 VOID\r
2505 PHY_ScanOperationBackup8192C(\r
2506         IN      PADAPTER        Adapter,\r
2507         IN      u8              Operation\r
2508         )\r
2509 {\r
2510 #if 0\r
2511         IO_TYPE IoType;\r
2512 \r
2513         if(!Adapter->bDriverStopped)\r
2514         {\r
2515                 switch(Operation)\r
2516                 {\r
2517                         case SCAN_OPT_BACKUP:\r
2518                                 IoType = IO_CMD_PAUSE_DM_BY_SCAN;\r
2519                                 rtw_hal_set_hwreg(Adapter,HW_VAR_IO_CMD,  (pu1Byte)&IoType);\r
2520 \r
2521                                 break;\r
2522 \r
2523                         case SCAN_OPT_RESTORE:\r
2524                                 IoType = IO_CMD_RESUME_DM_BY_SCAN;\r
2525                                 rtw_hal_set_hwreg(Adapter,HW_VAR_IO_CMD,  (pu1Byte)&IoType);\r
2526                                 break;\r
2527 \r
2528                         default:\r
2529                                 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Unknown Scan Backup Operation. \n"));\r
2530                                 break;\r
2531                 }\r
2532         }\r
2533 #endif\r
2534 }\r
2535 \r
2536 /*-----------------------------------------------------------------------------\r
2537  * Function:    PHY_SetBWModeCallback8192C()\r
2538  *\r
2539  * Overview:    Timer callback function for SetSetBWMode\r
2540  *\r
2541  * Input:               PRT_TIMER               pTimer\r
2542  *\r
2543  * Output:      NONE\r
2544  *\r
2545  * Return:      NONE\r
2546  *\r
2547  * Note:                (1) We do not take j mode into consideration now\r
2548  *                      (2) Will two workitem of "switch channel" and "switch channel bandwidth" run\r
2549  *                           concurrently?\r
2550  *---------------------------------------------------------------------------*/\r
2551 static VOID\r
2552 _PHY_SetBWMode92C(\r
2553         IN      PADAPTER        Adapter\r
2554 )\r
2555 {\r
2556 //      PADAPTER                        Adapter = (PADAPTER)pTimer->Adapter;\r
2557         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
2558         u8                              regBwOpMode;\r
2559         u8                              regRRSR_RSC;\r
2560 \r
2561         //return;\r
2562 \r
2563         // Added it for 20/40 mhz switch time evaluation by guangan 070531\r
2564         //u4Byte                                NowL, NowH;\r
2565         //u8Byte                                BeginTime, EndTime;\r
2566 \r
2567         /*RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SetBWModeCallback8192C()  Switch to %s bandwidth\n", \\r
2568                                         pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"))*/\r
2569 \r
2570         if(pHalData->rf_chip == RF_PSEUDO_11N)\r
2571         {\r
2572                 //pHalData->SetBWModeInProgress= _FALSE;\r
2573                 return;\r
2574         }\r
2575 \r
2576         // There is no 40MHz mode in RF_8225.\r
2577         if(pHalData->rf_chip==RF_8225)\r
2578                 return;\r
2579 \r
2580         if(Adapter->bDriverStopped)\r
2581                 return;\r
2582 \r
2583         // Added it for 20/40 mhz switch time evaluation by guangan 070531\r
2584         //NowL = PlatformEFIORead4Byte(Adapter, TSFR);\r
2585         //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4);\r
2586         //BeginTime = ((u8Byte)NowH << 32) + NowL;\r
2587 \r
2588         //3//\r
2589         //3//<1>Set MAC register\r
2590         //3//\r
2591         //Adapter->HalFunc.SetBWModeHandler();\r
2592 \r
2593         regBwOpMode = rtw_read8(Adapter, REG_BWOPMODE);\r
2594         regRRSR_RSC = rtw_read8(Adapter, REG_RRSR+2);\r
2595         //regBwOpMode = rtw_hal_get_hwreg(Adapter,HW_VAR_BWMODE,(pu1Byte)&regBwOpMode);\r
2596 \r
2597         switch(pHalData->CurrentChannelBW)\r
2598         {\r
2599                 case HT_CHANNEL_WIDTH_20:\r
2600                         regBwOpMode |= BW_OPMODE_20MHZ;\r
2601                            // 2007/02/07 Mark by Emily becasue we have not verify whether this register works\r
2602                         rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode);\r
2603                         break;\r
2604 \r
2605                 case HT_CHANNEL_WIDTH_40:\r
2606                         regBwOpMode &= ~BW_OPMODE_20MHZ;\r
2607                                 // 2007/02/07 Mark by Emily becasue we have not verify whether this register works\r
2608                         rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode);\r
2609 \r
2610                         regRRSR_RSC = (regRRSR_RSC&0x90) |(pHalData->nCur40MhzPrimeSC<<5);\r
2611                         rtw_write8(Adapter, REG_RRSR+2, regRRSR_RSC);\r
2612                         break;\r
2613 \r
2614                 default:\r
2615                         /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C():\r
2616                                                 unknown Bandwidth: %#X\n",pHalData->CurrentChannelBW));*/\r
2617                         break;\r
2618         }\r
2619 \r
2620         //3//\r
2621         //3//<2>Set PHY related register\r
2622         //3//\r
2623         switch(pHalData->CurrentChannelBW)\r
2624         {\r
2625                 /* 20 MHz channel*/\r
2626                 case HT_CHANNEL_WIDTH_20:\r
2627                         PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x0);\r
2628                         PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x0);\r
2629                         PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 1);\r
2630 \r
2631                         break;\r
2632 \r
2633 \r
2634                 /* 40 MHz channel*/\r
2635                 case HT_CHANNEL_WIDTH_40:\r
2636                         PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x1);\r
2637                         PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x1);\r
2638 \r
2639                         // Set Control channel to upper or lower. These settings are required only for 40MHz\r
2640                         PHY_SetBBReg(Adapter, rCCK0_System, bCCKSideBand, (pHalData->nCur40MhzPrimeSC>>1));\r
2641                         PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0xC00, pHalData->nCur40MhzPrimeSC);\r
2642                         PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 0);\r
2643 \r
2644                         PHY_SetBBReg(Adapter, 0x818, (BIT26|BIT27), (pHalData->nCur40MhzPrimeSC==HAL_PRIME_CHNL_OFFSET_LOWER)?2:1);\r
2645 \r
2646                         break;\r
2647 \r
2648 \r
2649 \r
2650                 default:\r
2651                         /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): unknown Bandwidth: %#X\n"\\r
2652                                                 ,pHalData->CurrentChannelBW));*/\r
2653                         break;\r
2654 \r
2655         }\r
2656         //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315\r
2657 \r
2658         // Added it for 20/40 mhz switch time evaluation by guangan 070531\r
2659         //NowL = PlatformEFIORead4Byte(Adapter, TSFR);\r
2660         //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4);\r
2661         //EndTime = ((u8Byte)NowH << 32) + NowL;\r
2662         //RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWModeCallback8190Pci: time of SetBWMode = %I64d us!\n", (EndTime - BeginTime)));\r
2663 \r
2664         //3<3>Set RF related register\r
2665         switch(pHalData->rf_chip)\r
2666         {\r
2667                 case RF_8225:\r
2668                         //PHY_SetRF8225Bandwidth(Adapter, pHalData->CurrentChannelBW);\r
2669                         break;\r
2670 \r
2671                 case RF_8256:\r
2672                         // Please implement this function in Hal8190PciPhy8256.c\r
2673                         //PHY_SetRF8256Bandwidth(Adapter, pHalData->CurrentChannelBW);\r
2674                         break;\r
2675 \r
2676                 case RF_8258:\r
2677                         // Please implement this function in Hal8190PciPhy8258.c\r
2678                         // PHY_SetRF8258Bandwidth();\r
2679                         break;\r
2680 \r
2681                 case RF_PSEUDO_11N:\r
2682                         // Do Nothing\r
2683                         break;\r
2684 \r
2685                 case RF_6052:\r
2686                         rtl8192c_PHY_RF6052SetBandwidth(Adapter, pHalData->CurrentChannelBW);\r
2687                         break;\r
2688 \r
2689                 default:\r
2690                         //RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID));\r
2691                         break;\r
2692         }\r
2693 \r
2694         //pHalData->SetBWModeInProgress= FALSE;\r
2695 \r
2696         //RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SetBWModeCallback8192C() \n" ));\r
2697 }\r
2698 \r
2699 \r
2700  /*-----------------------------------------------------------------------------\r
2701  * Function:   SetBWMode8190Pci()\r
2702  *\r
2703  * Overview:  This function is export to "HalCommon" moudule\r
2704  *\r
2705  * Input:               PADAPTER                        Adapter\r
2706  *                      HT_CHANNEL_WIDTH        Bandwidth       //20M or 40M\r
2707  *\r
2708  * Output:      NONE\r
2709  *\r
2710  * Return:      NONE\r
2711  *\r
2712  * Note:                We do not take j mode into consideration now\r
2713  *---------------------------------------------------------------------------*/\r
2714 VOID\r
2715 PHY_SetBWMode8192C(\r
2716         IN      PADAPTER                                        Adapter,\r
2717         IN      HT_CHANNEL_WIDTH        Bandwidth,      // 20M or 40M\r
2718         IN      unsigned char   Offset          // Upper, Lower, or Don't care\r
2719 )\r
2720 {\r
2721         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
2722         HT_CHANNEL_WIDTH        tmpBW= pHalData->CurrentChannelBW;\r
2723         // Modified it for 20/40 mhz switch by guangan 070531\r
2724         //PMGNT_INFO    pMgntInfo=&Adapter->MgntInfo;\r
2725 \r
2726         //return;\r
2727 \r
2728         //if(pHalData->SwChnlInProgress)\r
2729 //      if(pMgntInfo->bScanInProgress)\r
2730 //      {\r
2731 //              RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s Exit because bScanInProgress!\n",\r
2732 //                                      Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"));\r
2733 //              return;\r
2734 //      }\r
2735 \r
2736 //      if(pHalData->SetBWModeInProgress)\r
2737 //      {\r
2738 //              // Modified it for 20/40 mhz switch by guangan 070531\r
2739 //              RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s cancel last timer because SetBWModeInProgress!\n",\r
2740 //                                      Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"));\r
2741 //              PlatformCancelTimer(Adapter, &pHalData->SetBWModeTimer);\r
2742 //              //return;\r
2743 //      }\r
2744 \r
2745         //if(pHalData->SetBWModeInProgress)\r
2746         //      return;\r
2747 \r
2748         //pHalData->SetBWModeInProgress= TRUE;\r
2749 \r
2750         pHalData->CurrentChannelBW = Bandwidth;\r
2751 \r
2752 #if 0\r
2753         if(Offset==HT_EXTCHNL_OFFSET_LOWER)\r
2754                 pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;\r
2755         else if(Offset==HT_EXTCHNL_OFFSET_UPPER)\r
2756                 pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;\r
2757         else\r
2758                 pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\r
2759 #else\r
2760         pHalData->nCur40MhzPrimeSC = Offset;\r
2761 #endif\r
2762 \r
2763         if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved))\r
2764         {\r
2765 \r
2766         #if 0\r
2767                 //PlatformSetTimer(Adapter, &(pHalData->SetBWModeTimer), 0);\r
2768         #else\r
2769                 _PHY_SetBWMode92C(Adapter);\r
2770         #endif\r
2771 \r
2772         }\r
2773         else\r
2774         {\r
2775                 //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() SetBWModeInProgress FALSE driver sleep or unload\n"));\r
2776                 //pHalData->SetBWModeInProgress= FALSE;\r
2777                 pHalData->CurrentChannelBW = tmpBW;\r
2778         }\r
2779         \r
2780 }\r
2781 \r
2782 \r
2783 static void _PHY_SwChnl8192C(PADAPTER Adapter, u8 channel)\r
2784 {\r
2785         u8 eRFPath;\r
2786         u32 param1, param2;\r
2787         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
2788 \r
2789         if ( Adapter->bNotifyChannelChange )\r
2790         {\r
2791                 DBG_871X( "[%s] ch = %d\n", __FUNCTION__, channel );\r
2792         }\r
2793 \r
2794         //s1. pre common command - CmdID_SetTxPowerLevel\r
2795         PHY_SetTxPowerLevel8192C(Adapter, channel);\r
2796 \r
2797         //s2. RF dependent command - CmdID_RF_WriteReg, param1=RF_CHNLBW, param2=channel\r
2798         param1 = RF_CHNLBW;\r
2799         param2 = channel;\r
2800         for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)\r
2801         {\r
2802                 pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | param2);\r
2803                 PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, param1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]);\r
2804         }\r
2805 \r
2806         if(channel >= 1 && channel <= 9)\r
2807         {\r
2808                                 //DBG_8192C("phy_SwitchRfSetting8723A REG_AFE_PLL_CTRL 0xF0FFFF83\n");\r
2809                                 PHY_SetBBReg(Adapter, REG_AFE_PLL_CTRL, bMaskDWord, 0xF0FFFF83);\r
2810         }\r
2811         else if (channel >= 10 && channel <= 14)\r
2812         {\r
2813                                 //DBG_8192C("phy_SwitchRfSetting8723A REG_AFE_PLL_CTRL 0xF2FFFF83\n");\r
2814                                 PHY_SetBBReg(Adapter, REG_AFE_PLL_CTRL, bMaskDWord, 0xF2FFFF83);\r
2815         }               \r
2816         //s3. post common command - CmdID_End, None\r
2817 \r
2818 }\r
2819 \r
2820 VOID\r
2821 PHY_SwChnl8192C(        // Call after initialization\r
2822         IN      PADAPTER        Adapter,\r
2823         IN      u8              channel\r
2824         )\r
2825 {\r
2826         //PADAPTER Adapter =  ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, _TRUE);\r
2827         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
2828         u8      tmpchannel = pHalData->CurrentChannel;\r
2829         BOOLEAN  bResult = _TRUE;\r
2830 \r
2831         if(pHalData->rf_chip == RF_PSEUDO_11N)\r
2832         {\r
2833                 //pHalData->SwChnlInProgress=FALSE;\r
2834                 return;                                                                 //return immediately if it is peudo-phy\r
2835         }\r
2836 \r
2837         //if(pHalData->SwChnlInProgress)\r
2838         //      return;\r
2839 \r
2840         //if(pHalData->SetBWModeInProgress)\r
2841         //      return;\r
2842 \r
2843         //--------------------------------------------\r
2844         switch(pHalData->CurrentWirelessMode)\r
2845         {\r
2846                 case WIRELESS_MODE_A:\r
2847                 case WIRELESS_MODE_N_5G:\r
2848                         //RT_ASSERT((channel>14), ("WIRELESS_MODE_A but channel<=14"));\r
2849                         break;\r
2850 \r
2851                 case WIRELESS_MODE_B:\r
2852                         //RT_ASSERT((channel<=14), ("WIRELESS_MODE_B but channel>14"));\r
2853                         break;\r
2854 \r
2855                 case WIRELESS_MODE_G:\r
2856                 case WIRELESS_MODE_N_24G:\r
2857                         //RT_ASSERT((channel<=14), ("WIRELESS_MODE_G but channel>14"));\r
2858                         break;\r
2859 \r
2860                 default:\r
2861                         //RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode));\r
2862                         break;\r
2863         }\r
2864         //--------------------------------------------\r
2865 \r
2866         //pHalData->SwChnlInProgress = TRUE;\r
2867         if(channel == 0)\r
2868                 channel = 1;\r
2869 \r
2870         pHalData->CurrentChannel=channel;\r
2871 \r
2872         //pHalData->SwChnlStage=0;\r
2873         //pHalData->SwChnlStep=0;\r
2874 \r
2875         if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved))\r
2876         {\r
2877 \r
2878                 #if 0\r
2879                 //PlatformSetTimer(Adapter, &(pHalData->SwChnlTimer), 0);\r
2880                 #else\r
2881                 _PHY_SwChnl8192C(Adapter, channel);\r
2882                 #endif\r
2883 \r
2884                 if(bResult)\r
2885                 {\r
2886                         //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress TRUE schdule workitem done\n"));\r
2887                 }\r
2888                 else\r
2889                 {\r
2890                         //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE schdule workitem error\n"));\r
2891                         //if(IS_HARDWARE_TYPE_8192SU(Adapter))\r
2892                         //{\r
2893                         //      pHalData->SwChnlInProgress = FALSE;\r
2894                                 pHalData->CurrentChannel = tmpchannel;\r
2895                         //}\r
2896                 }\r
2897 \r
2898         }\r
2899         else\r
2900         {\r
2901                 //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE driver sleep or unload\n"));\r
2902                 //if(IS_HARDWARE_TYPE_8192SU(Adapter))\r
2903                 //{\r
2904                 //      pHalData->SwChnlInProgress = FALSE;\r
2905                         pHalData->CurrentChannel = tmpchannel;\r
2906                 //}\r
2907         }\r
2908 }\r
2909 \r
2910 \r
2911 static  BOOLEAN\r
2912 phy_SwChnlStepByStep(\r
2913         IN      PADAPTER        Adapter,\r
2914         IN      u8              channel,\r
2915         IN      u8              *stage,\r
2916         IN      u8              *step,\r
2917         OUT u32         *delay\r
2918         )\r
2919 {\r
2920 #if 0\r
2921         HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(Adapter);\r
2922         PCHANNEL_ACCESS_SETTING pChnlAccessSetting;\r
2923         SwChnlCmd                               PreCommonCmd[MAX_PRECMD_CNT];\r
2924         u4Byte                                  PreCommonCmdCnt;\r
2925         SwChnlCmd                               PostCommonCmd[MAX_POSTCMD_CNT];\r
2926         u4Byte                                  PostCommonCmdCnt;\r
2927         SwChnlCmd                               RfDependCmd[MAX_RFDEPENDCMD_CNT];\r
2928         u4Byte                                  RfDependCmdCnt;\r
2929         SwChnlCmd                               *CurrentCmd;\r
2930         u1Byte                                  eRFPath;\r
2931         u4Byte                                  RfTXPowerCtrl;\r
2932         BOOLEAN                                 bAdjRfTXPowerCtrl = _FALSE;\r
2933 \r
2934 \r
2935         RT_ASSERT((Adapter != NULL), ("Adapter should not be NULL\n"));\r
2936 #if(MP_DRIVER != 1)\r
2937         RT_ASSERT(IsLegalChannel(Adapter, channel), ("illegal channel: %d\n", channel));\r
2938 #endif\r
2939         RT_ASSERT((pHalData != NULL), ("pHalData should not be NULL\n"));\r
2940 \r
2941         pChnlAccessSetting = &Adapter->MgntInfo.Info8185.ChannelAccessSetting;\r
2942         RT_ASSERT((pChnlAccessSetting != NULL), ("pChnlAccessSetting should not be NULL\n"));\r
2943 \r
2944         //for(eRFPath = RF_PATH_A; eRFPath <pHalData->NumTotalRFPath; eRFPath++)\r
2945         //for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)\r
2946         //{\r
2947                 // <1> Fill up pre common command.\r
2948         PreCommonCmdCnt = 0;\r
2949         phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,\r
2950                                 CmdID_SetTxPowerLevel, 0, 0, 0);\r
2951         phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,\r
2952                                 CmdID_End, 0, 0, 0);\r
2953 \r
2954                 // <2> Fill up post common command.\r
2955         PostCommonCmdCnt = 0;\r
2956 \r
2957         phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT,\r
2958                                 CmdID_End, 0, 0, 0);\r
2959 \r
2960                 // <3> Fill up RF dependent command.\r
2961         RfDependCmdCnt = 0;\r
2962         switch( pHalData->RFChipID )\r
2963         {\r
2964                 case RF_8225:\r
2965                 RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel));\r
2966                 // 2008/09/04 MH Change channel.\r
2967                 if(channel==14) channel++;\r
2968                 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,\r
2969                         CmdID_RF_WriteReg, rZebra1_Channel, (0x10+channel-1), 10);\r
2970                 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,\r
2971                 CmdID_End, 0, 0, 0);\r
2972                 break;\r
2973 \r
2974         case RF_8256:\r
2975                 // TEST!! This is not the table for 8256!!\r
2976                 RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel));\r
2977                 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,\r
2978                         CmdID_RF_WriteReg, rRfChannel, channel, 10);\r
2979                 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,\r
2980                 CmdID_End, 0, 0, 0);\r
2981                 break;\r
2982 \r
2983         case RF_6052:\r
2984                 RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel));\r
2985                 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,\r
2986                         CmdID_RF_WriteReg, RF_CHNLBW, channel, 10);\r
2987                 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,\r
2988                 CmdID_End, 0, 0, 0);\r
2989 \r
2990                 break;\r
2991 \r
2992         case RF_8258:\r
2993                 break;\r
2994 \r
2995         // For FPGA two MAC verification\r
2996         case RF_PSEUDO_11N:\r
2997                 return TRUE;\r
2998         default:\r
2999                 RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID));\r
3000                 return FALSE;\r
3001                 break;\r
3002         }\r
3003 \r
3004 \r
3005         do{\r
3006                 switch(*stage)\r
3007                 {\r
3008                 case 0:\r
3009                         CurrentCmd=&PreCommonCmd[*step];\r
3010                         break;\r
3011                 case 1:\r
3012                         CurrentCmd=&RfDependCmd[*step];\r
3013                         break;\r
3014                 case 2:\r
3015                         CurrentCmd=&PostCommonCmd[*step];\r
3016                         break;\r
3017                 }\r
3018 \r
3019                 if(CurrentCmd->CmdID==CmdID_End)\r
3020                 {\r
3021                         if((*stage)==2)\r
3022                         {\r
3023                                 return TRUE;\r
3024                         }\r
3025                         else\r
3026                         {\r
3027                                 (*stage)++;\r
3028                                 (*step)=0;\r
3029                                 continue;\r
3030                         }\r
3031                 }\r
3032 \r
3033                 switch(CurrentCmd->CmdID)\r
3034                 {\r
3035                 case CmdID_SetTxPowerLevel:\r
3036                         PHY_SetTxPowerLevel8192C(Adapter,channel);\r
3037                         break;\r
3038                 case CmdID_WritePortUlong:\r
3039                         PlatformEFIOWrite4Byte(Adapter, CurrentCmd->Para1, CurrentCmd->Para2);\r
3040                         break;\r
3041                 case CmdID_WritePortUshort:\r
3042                         PlatformEFIOWrite2Byte(Adapter, CurrentCmd->Para1, (u2Byte)CurrentCmd->Para2);\r
3043                         break;\r
3044                 case CmdID_WritePortUchar:\r
3045                         PlatformEFIOWrite1Byte(Adapter, CurrentCmd->Para1, (u1Byte)CurrentCmd->Para2);\r
3046                         break;\r
3047                 case CmdID_RF_WriteReg: // Only modify channel for the register now !!!!!\r
3048                         for(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)\r
3049                         {\r
3050 #if 1\r
3051                                 pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | CurrentCmd->Para2);\r
3052                                 PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]);\r
3053 #else\r
3054                                 PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, (CurrentCmd->Para2));\r
3055 #endif\r
3056                         }\r
3057                         break;\r
3058                 }\r
3059 \r
3060                 break;\r
3061         }while(TRUE);\r
3062         //cosa }/*for(Number of RF paths)*/\r
3063 \r
3064         (*delay)=CurrentCmd->msDelay;\r
3065         (*step)++;\r
3066         return FALSE;\r
3067 #endif\r
3068         return _TRUE;\r
3069 }\r
3070 \r
3071 \r
3072 static  BOOLEAN\r
3073 phy_SetSwChnlCmdArray(\r
3074         SwChnlCmd*              CmdTable,\r
3075         u32                     CmdTableIdx,\r
3076         u32                     CmdTableSz,\r
3077         SwChnlCmdID             CmdID,\r
3078         u32                     Para1,\r
3079         u32                     Para2,\r
3080         u32                     msDelay\r
3081         )\r
3082 {\r
3083         SwChnlCmd* pCmd;\r
3084 \r
3085         if(CmdTable == NULL)\r
3086         {\r
3087                 //RT_ASSERT(FALSE, ("phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n"));\r
3088                 return _FALSE;\r
3089         }\r
3090         if(CmdTableIdx >= CmdTableSz)\r
3091         {\r
3092                 //RT_ASSERT(FALSE,\r
3093                 //              ("phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%ld, CmdTableSz:%ld\n",\r
3094                 //              CmdTableIdx, CmdTableSz));\r
3095                 return _FALSE;\r
3096         }\r
3097 \r
3098         pCmd = CmdTable + CmdTableIdx;\r
3099         pCmd->CmdID = CmdID;\r
3100         pCmd->Para1 = Para1;\r
3101         pCmd->Para2 = Para2;\r
3102         pCmd->msDelay = msDelay;\r
3103 \r
3104         return _TRUE;\r
3105 }\r
3106 \r
3107 \r
3108 static  void\r
3109 phy_FinishSwChnlNow(    // We should not call this function directly\r
3110                 IN      PADAPTER        Adapter,\r
3111                 IN      u8              channel\r
3112                 )\r
3113 {\r
3114 #if 0\r
3115         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
3116         u32                     delay;\r
3117 \r
3118         while(!phy_SwChnlStepByStep(Adapter,channel,&pHalData->SwChnlStage,&pHalData->SwChnlStep,&delay))\r
3119         {\r
3120                 if(delay>0)\r
3121                         rtw_mdelay_os(delay);\r
3122         }\r
3123 #endif\r
3124 }\r
3125 \r
3126 \r
3127 \r
3128 //\r
3129 // Description:\r
3130 //      Switch channel synchronously. Called by SwChnlByDelayHandler.\r
3131 //\r
3132 // Implemented by Bruce, 2008-02-14.\r
3133 // The following procedure is operted according to SwChanlCallback8190Pci().\r
3134 // However, this procedure is performed synchronously  which should be running under\r
3135 // passive level.\r
3136 //\r
3137 VOID\r
3138 PHY_SwChnlPhy8192C(     // Only called during initialize\r
3139         IN      PADAPTER        Adapter,\r
3140         IN      u8              channel\r
3141         )\r
3142 {\r
3143         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
3144 \r
3145         //RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("==>PHY_SwChnlPhy8192S(), switch from channel %d to channel %d.\n", pHalData->CurrentChannel, channel));\r
3146 \r
3147         // Cannot IO.\r
3148         //if(RT_CANNOT_IO(Adapter))\r
3149         //      return;\r
3150 \r
3151         // Channel Switching is in progress.\r
3152         //if(pHalData->SwChnlInProgress)\r
3153         //      return;\r
3154 \r
3155         //return immediately if it is peudo-phy\r
3156         if(pHalData->rf_chip == RF_PSEUDO_11N)\r
3157         {\r
3158                 //pHalData->SwChnlInProgress=FALSE;\r
3159                 return;\r
3160         }\r
3161 \r
3162         //pHalData->SwChnlInProgress = TRUE;\r
3163         if( channel == 0)\r
3164                 channel = 1;\r
3165 \r
3166         pHalData->CurrentChannel=channel;\r
3167 \r
3168         //pHalData->SwChnlStage = 0;\r
3169         //pHalData->SwChnlStep = 0;\r
3170 \r
3171         phy_FinishSwChnlNow(Adapter,channel);\r
3172 \r
3173         //pHalData->SwChnlInProgress = FALSE;\r
3174 }\r
3175 \r
3176 \r
3177 //\r
3178 //      Description:\r
3179 //              Configure H/W functionality to enable/disable Monitor mode.\r
3180 //              Note, because we possibly need to configure BB and RF in this function,\r
3181 //              so caller should in PASSIVE_LEVEL. 080118, by rcnjko.\r
3182 //\r
3183 VOID\r
3184 PHY_SetMonitorMode8192C(\r
3185         IN      PADAPTER                        pAdapter,\r
3186         IN      BOOLEAN                         bEnableMonitorMode\r
3187         )\r
3188 {\r
3189 #if 0\r
3190         HAL_DATA_TYPE           *pHalData       = GET_HAL_DATA(pAdapter);\r
3191         BOOLEAN                         bFilterOutNonAssociatedBSSID = FALSE;\r
3192 \r
3193         //2 Note: we may need to stop antenna diversity.\r
3194         if(bEnableMonitorMode)\r
3195         {\r
3196                 bFilterOutNonAssociatedBSSID = FALSE;\r
3197                 RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): enable monitor mode\n"));\r
3198 \r
3199                 pHalData->bInMonitorMode = TRUE;\r
3200                 pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE);\r
3201                 rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID);\r
3202         }\r
3203         else\r
3204         {\r
3205                 bFilterOutNonAssociatedBSSID = TRUE;\r
3206                 RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): disable monitor mode\n"));\r
3207 \r
3208                 pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE);\r
3209                 pHalData->bInMonitorMode = FALSE;\r
3210                 rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID);\r
3211         }\r
3212 #endif\r
3213 }\r
3214 \r
3215 \r
3216 /*-----------------------------------------------------------------------------\r
3217  * Function:    PHYCheckIsLegalRfPath8190Pci()\r
3218  *\r
3219  * Overview:    Check different RF type to execute legal judgement. If RF Path is illegal\r
3220  *                      We will return false.\r
3221  *\r
3222  * Input:               NONE\r
3223  *\r
3224  * Output:              NONE\r
3225  *\r
3226  * Return:              NONE\r
3227  *\r
3228  * Revised History:\r
3229  *      When            Who             Remark\r
3230  *      11/15/2007      MHC             Create Version 0.\r
3231  *\r
3232  *---------------------------------------------------------------------------*/\r
3233 BOOLEAN\r
3234 PHY_CheckIsLegalRfPath8192C(\r
3235         IN      PADAPTER        pAdapter,\r
3236         IN      u32     eRFPath)\r
3237 {\r
3238 //      HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
3239         BOOLEAN                         rtValue = _TRUE;\r
3240 \r
3241         // NOt check RF Path now.!\r
3242 #if 0\r
3243         if (pHalData->RF_Type == RF_1T2R && eRFPath != RF_PATH_A)\r
3244         {\r
3245                 rtValue = FALSE;\r
3246         }\r
3247         if (pHalData->RF_Type == RF_1T2R && eRFPath != RF_PATH_A)\r
3248         {\r
3249 \r
3250         }\r
3251 #endif\r
3252         return  rtValue;\r
3253 \r
3254 }       /* PHY_CheckIsLegalRfPath8192C */\r
3255 \r
3256 static VOID _PHY_SetRFPathSwitch(\r
3257         IN      PADAPTER        pAdapter,\r
3258         IN      BOOLEAN         bMain,\r
3259         IN      BOOLEAN         is2T\r
3260         )\r
3261 {\r
3262         u8      u1bTmp;\r
3263 \r
3264         if(!pAdapter->hw_init_completed)\r
3265         {\r
3266                 u1bTmp = rtw_read8(pAdapter, REG_LEDCFG2) | BIT7;\r
3267                 rtw_write8(pAdapter, REG_LEDCFG2, u1bTmp);\r
3268                 //PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01);\r
3269                 PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01);\r
3270         }\r
3271 \r
3272         if(is2T)\r
3273         {\r
3274                 if(bMain)\r
3275                         PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1);        //92C_Path_A\r
3276                 else\r
3277                         PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2);        //BT\r
3278         }\r
3279         else\r
3280         {\r
3281 \r
3282                 if(bMain)\r
3283                         PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x2);    //Main\r
3284                 else\r
3285                         PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x1);    //Aux\r
3286         }\r
3287 \r
3288 }\r
3289 \r
3290 //return value TRUE => Main; FALSE => Aux\r
3291 \r
3292 static BOOLEAN _PHY_QueryRFPathSwitch(\r
3293         IN      PADAPTER        pAdapter,\r
3294         IN      BOOLEAN         is2T\r
3295         )\r
3296 {\r
3297 //      if(is2T)\r
3298 //              return _TRUE;\r
3299 \r
3300         if(!pAdapter->hw_init_completed)\r
3301         {\r
3302                 PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01);\r
3303                 PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01);\r
3304         }\r
3305 \r
3306         if(is2T)\r
3307         {\r
3308                 if(PHY_QueryBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01)\r
3309                         return _TRUE;\r
3310                 else\r
3311                         return _FALSE;\r
3312         }\r
3313         else\r
3314         {\r
3315                 if(PHY_QueryBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300) == 0x02)\r
3316                         return _TRUE;\r
3317                 else\r
3318                         return _FALSE;\r
3319         }\r
3320 }\r
3321 \r
3322 \r
3323 static VOID\r
3324 _PHY_DumpRFReg(IN       PADAPTER        pAdapter)\r
3325 {\r
3326         u32 rfRegValue,rfRegOffset;\r
3327 \r
3328         //RTPRINT(FINIT, INIT_RF, ("PHY_DumpRFReg()====>\n"));\r
3329 \r
3330         for(rfRegOffset = 0x00;rfRegOffset<=0x30;rfRegOffset++){\r
3331                 rfRegValue = PHY_QueryRFReg(pAdapter,RF_PATH_A, rfRegOffset, bMaskDWord);\r
3332                 //RTPRINT(FINIT, INIT_RF, (" 0x%02x = 0x%08x\n",rfRegOffset,rfRegValue));\r
3333         }\r
3334         //RTPRINT(FINIT, INIT_RF, ("<===== PHY_DumpRFReg()\n"));\r
3335 }\r
3336 \r
3337 \r
3338 VOID rtl8192c_PHY_SetRFPathSwitch(\r
3339         IN      PADAPTER        pAdapter,\r
3340         IN      BOOLEAN         bMain\r
3341         )\r
3342 {\r
3343         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
3344 \r
3345 #if DISABLE_BB_RF\r
3346         return;\r
3347 #endif\r
3348 \r
3349         if(IS_92C_SERIAL( pHalData->VersionID)){\r
3350                 _PHY_SetRFPathSwitch(pAdapter, bMain, _TRUE);\r
3351         }\r
3352         else{\r
3353                 // For 88C 1T1R\r
3354                 _PHY_SetRFPathSwitch(pAdapter, bMain, _FALSE);\r
3355         }\r
3356 }\r
3357 \r
3358 //\r
3359 // Move from phycfg.c to gen.c to be code independent later\r
3360 //\r
3361 //-------------------------Move to other DIR later----------------------------*/\r
3362 #ifdef CONFIG_USB_HCI\r
3363 \r
3364 //\r
3365 //      Description:\r
3366 //              To dump all Tx FIFO LLT related link-list table.\r
3367 //              Added by Roger, 2009.03.10.\r
3368 //\r
3369 VOID\r
3370 DumpBBDbgPort_92CU(\r
3371         IN      PADAPTER                        Adapter\r
3372         )\r
3373 {\r
3374 \r
3375         //RT_TRACE(COMP_SEND, DBG_WARNING, ("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"));\r
3376         //RT_TRACE(COMP_SEND, DBG_WARNING, ("BaseBand Debug Ports:\n"));\r
3377 \r
3378         PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0000);\r
3379         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord)));\r
3380 \r
3381         PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0803);\r
3382         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord)));\r
3383 \r
3384         PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0a06);\r
3385         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord)));\r
3386 \r
3387         PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0007);\r
3388         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord)));\r
3389 \r
3390         PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100);\r
3391         PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x000f0000);\r
3392         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord)));\r
3393 \r
3394         PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100);\r
3395         PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x00150000);\r
3396         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord)));\r
3397 \r
3398         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x800, PHY_QueryBBReg(Adapter, 0x0800, bMaskDWord)));\r
3399         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x900, PHY_QueryBBReg(Adapter, 0x0900, bMaskDWord)));\r
3400         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa00, PHY_QueryBBReg(Adapter, 0x0a00, bMaskDWord)));\r
3401         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa54, PHY_QueryBBReg(Adapter, 0x0a54, bMaskDWord)));\r
3402         //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa58, PHY_QueryBBReg(Adapter, 0x0a58, bMaskDWord)));\r
3403 \r
3404 }\r
3405 #endif\r
3406 \r