1 /******************************************************************************
3 (c) Copyright 2008, RealTEK Technologies Inc. All Rights Reserved.
7 Note: Merge 92SE/SU PHY config as below
10 3. Initial BB/RF/MAC config by reading BB/MAC/RF txt.
13 5. Initial gain switch API.
14 6. Other BB/MAC/RF API.
16 Function: PHY: Extern function, phy: local function
18 Export: PHY_FunctionName
24 08/08/2008 MHC 1. Port from 9x series phycfg.c
25 2. Reorganize code arch and ad description.
26 3. Collect similar function.
27 4. Seperate extern/local API.
28 08/12/2008 MHC We must merge or move USB PHY relative function later.
29 10/07/2008 MHC Add IQ calibration for PHY.(Only 1T2R mode now!!!)
30 11/06/2008 MHC Add TX Power index PG file to config in 0xExx register
31 area to map with EEPROM/EFUSE tx pwr index.
33 ******************************************************************************/
35 #include "r8192U_dm.h"
36 #include "r8192S_rtl6052.h"
39 #include "r8192S_hw.h"
40 #include "r8192S_phy.h"
41 #include "r8192S_phyreg.h"
42 #include "r8192SU_HWImg.h"
43 //#include "r8192S_FwImgDTM.h"
45 #include "r8192U_hw.h"
46 #include "r819xU_phy.h"
47 #include "r819xU_phyreg.h"
50 #include "ieee80211/dot11d.h"
52 /*---------------------------Define Local Constant---------------------------*/
53 /* Channel switch:The size of command tables for switch channel*/
54 #define MAX_PRECMD_CNT 16
55 #define MAX_RFDEPENDCMD_CNT 16
56 #define MAX_POSTCMD_CNT 16
57 #define MAX_DOZE_WAITING_TIMES_9x 64
59 /*------------------------Define local variable------------------------------*/
62 static u32 RF_CHANNEL_TABLE_ZEBRA[]={
78 0x0f72,//2484 //20040810
83 phy_CalculateBitShift(u32 BitMask);
85 phy_ConfigMACWithHeaderFile(struct net_device* dev);
87 phy_InitBBRFRegisterDefinition(struct net_device* dev);
89 phy_BB8192S_Config_ParaFile(struct net_device* dev);
91 phy_ConfigBBWithHeaderFile(struct net_device* dev,u8 ConfigType);
93 phy_SetRFPowerState8192SU(struct net_device* dev,RT_RF_POWER_STATE eRFPowerState);
95 SetBWModeCallback8192SUsbWorkItem(struct net_device *dev);
97 SetBWModeCallback8192SUsbWorkItem(struct net_device *dev);
99 SwChnlCallback8192SUsbWorkItem(struct net_device *dev );
101 phy_FinishSwChnlNow(struct net_device* dev,u8 channel);
103 phy_SwChnlStepByStep(
104 struct net_device* dev,
111 phy_ConfigBBWithPgHeaderFile(struct net_device* dev,u8 ConfigType);
112 static long phy_TxPwrIdxToDbm( struct net_device* dev, WIRELESS_MODE WirelessMode, u8 TxPwrIdx);
113 static u8 phy_DbmToTxPwrIdx( struct net_device* dev, WIRELESS_MODE WirelessMode, long PowerInDbm);
114 void phy_SetFwCmdIOCallback(struct net_device* dev);
116 //#if ((HAL_CODE_BASE == RTL8192_S) && (DEV_BUS_TYPE==USB_INTERFACE))
120 // Base Band read by 4181 to make sure that operation could be done in unlimited cycle.
123 // - Only use on RTL8192S USB interface.
126 // Created by Roger, 2008.09.06.
129 u32 phy_QueryUsbBBReg(struct net_device* dev, u32 RegAddr)
131 struct r8192_priv *priv = ieee80211_priv(dev);
132 u32 ReturnValue = 0xffffffff;
134 u8 BBWaitCounter = 0;
138 // <Roger_Notes> Due to PASSIVE_LEVEL, so we ONLY simply busy waiting for a while here.
139 // We have to make sure that previous BB I/O has been done.
142 while(priv->bChangeBBInProgress)
145 RT_TRACE(COMP_RF, "phy_QueryUsbBBReg(): Wait 1 ms (%d times)...\n", BBWaitCounter);
148 // Wait too long, return FALSE to avoid to be stuck here.
149 if((BBWaitCounter > 100) )//||RT_USB_CANNOT_IO(Adapter))
151 RT_TRACE(COMP_RF, "phy_QueryUsbBBReg(): (%d) Wait too logn to query BB!!\n", BBWaitCounter);
156 priv->bChangeBBInProgress = true;
158 read_nic_dword(dev, RegAddr);
161 {// Make sure that access could be done.
162 if((read_nic_byte(dev, PHY_REG)&HST_RDBUSY) == 0)
164 }while( --PollingCnt );
168 RT_TRACE(COMP_RF, "Fail!!!phy_QueryUsbBBReg(): RegAddr(%#x) = %#x\n", RegAddr, ReturnValue);
172 // Data FW read back.
173 ReturnValue = read_nic_dword(dev, PHY_REG_DATA);
174 RT_TRACE(COMP_RF, "phy_QueryUsbBBReg(): RegAddr(%#x) = %#x, PollingCnt(%d)\n", RegAddr, ReturnValue, PollingCnt);
177 priv->bChangeBBInProgress = false;
186 // Base Band wrote by 4181 to make sure that operation could be done in unlimited cycle.
189 // - Only use on RTL8192S USB interface.
192 // Created by Roger, 2008.09.06.
196 phy_SetUsbBBReg(struct net_device* dev,u32 RegAddr,u32 Data)
198 struct r8192_priv *priv = ieee80211_priv(dev);
199 u8 BBWaitCounter = 0;
201 RT_TRACE(COMP_RF, "phy_SetUsbBBReg(): RegAddr(%#x) <= %#x\n", RegAddr, Data);
204 // <Roger_Notes> Due to PASSIVE_LEVEL, so we ONLY simply busy waiting for a while here.
205 // We have to make sure that previous BB I/O has been done.
208 while(priv->bChangeBBInProgress)
211 RT_TRACE(COMP_RF, "phy_SetUsbBBReg(): Wait 1 ms (%d times)...\n", BBWaitCounter);
214 if((BBWaitCounter > 100))// || RT_USB_CANNOT_IO(Adapter))
216 RT_TRACE(COMP_RF, "phy_SetUsbBBReg(): (%d) Wait too logn to query BB!!\n", BBWaitCounter);
221 priv->bChangeBBInProgress = true;
222 //printk("**************%s: RegAddr:%x Data:%x\n", __FUNCTION__,RegAddr, Data);
223 write_nic_dword(dev, RegAddr, Data);
225 priv->bChangeBBInProgress = false;
232 // RF read by 4181 to make sure that operation could be done in unlimited cycle.
235 // - Only use on RTL8192S USB interface.
237 // - RT_RF_OPERATE_SPINLOCK is acquired and keep on holding to the end.FIXLZM
239 // Created by Roger, 2008.09.06.
242 u32 phy_QueryUsbRFReg( struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 Offset)
245 struct r8192_priv *priv = ieee80211_priv(dev);
246 //u32 value = 0, ReturnValue = 0;
248 //u32 tmplong,tmplong2;
250 u8 RFWaitCounter = 0;
254 // <Roger_Notes> Due to PASSIVE_LEVEL, so we ONLY simply busy waiting for a while here.
255 // We have to make sure that previous RF I/O has been done.
258 while(priv->bChangeRFInProgress)
260 //PlatformReleaseSpinLock(Adapter, RT_RF_OPERATE_SPINLOCK);
261 //spin_lock_irqsave(&priv->rf_lock, flags); //LZM,090318
265 RT_TRACE(COMP_RF, "phy_QueryUsbRFReg(): Wait 1 ms (%d times)...\n", RFWaitCounter);
268 if((RFWaitCounter > 100)) //|| RT_USB_CANNOT_IO(Adapter))
270 RT_TRACE(COMP_RF, "phy_QueryUsbRFReg(): (%d) Wait too logn to query BB!!\n", RFWaitCounter);
275 //PlatformAcquireSpinLock(Adapter, RT_RF_OPERATE_SPINLOCK);
279 priv->bChangeRFInProgress = true;
280 //PlatformReleaseSpinLock(Adapter, RT_RF_OPERATE_SPINLOCK);
283 Offset &= 0x3f; //RF_Offset= 0x00~0x3F
285 write_nic_dword(dev, RF_BB_CMD_ADDR, 0xF0000002|
286 (Offset<<8)| //RF_Offset= 0x00~0x3F
287 (eRFPath<<16)); //RF_Path = 0(A) or 1(B)
290 {// Make sure that access could be done.
291 if(read_nic_dword(dev, RF_BB_CMD_ADDR) == 0)
293 }while( --PollingCnt );
295 // Data FW read back.
296 ReturnValue = read_nic_dword(dev, RF_BB_CMD_DATA);
298 //PlatformAcquireSpinLock(Adapter, RT_RF_OPERATE_SPINLOCK);
299 //spin_unlock_irqrestore(&priv->rf_lock, flags); //LZM,090318
301 priv->bChangeRFInProgress = false;
303 RT_TRACE(COMP_RF, "phy_QueryUsbRFReg(): eRFPath(%d), Offset(%#x) = %#x\n", eRFPath, Offset, ReturnValue);
312 // RF wrote by 4181 to make sure that operation could be done in unlimited cycle.
315 // - Only use on RTL8192S USB interface.
317 // - RT_RF_OPERATE_SPINLOCK is acquired and keep on holding to the end.FIXLZM
319 // Created by Roger, 2008.09.06.
322 void phy_SetUsbRFReg(struct net_device* dev,RF90_RADIO_PATH_E eRFPath,u32 RegAddr,u32 Data)
325 struct r8192_priv *priv = ieee80211_priv(dev);
327 u8 RFWaitCounter = 0;
331 // <Roger_Notes> Due to PASSIVE_LEVEL, so we ONLY simply busy waiting for a while here.
332 // We have to make sure that previous BB I/O has been done.
335 while(priv->bChangeRFInProgress)
337 //PlatformReleaseSpinLock(Adapter, RT_RF_OPERATE_SPINLOCK);
338 //spin_lock_irqsave(&priv->rf_lock, flags); //LZM,090318
342 RT_TRACE(COMP_RF, "phy_SetUsbRFReg(): Wait 1 ms (%d times)...\n", RFWaitCounter);
345 if((RFWaitCounter > 100))// || RT_USB_CANNOT_IO(Adapter))
347 RT_TRACE(COMP_RF, "phy_SetUsbRFReg(): (%d) Wait too logn to query BB!!\n", RFWaitCounter);
352 //PlatformAcquireSpinLock(Adapter, RT_RF_OPERATE_SPINLOCK);
356 priv->bChangeRFInProgress = true;
357 //PlatformReleaseSpinLock(Adapter, RT_RF_OPERATE_SPINLOCK);
360 RegAddr &= 0x3f; //RF_Offset= 0x00~0x3F
362 write_nic_dword(dev, RF_BB_CMD_DATA, Data);
363 write_nic_dword(dev, RF_BB_CMD_ADDR, 0xF0000003|
364 (RegAddr<<8)| //RF_Offset= 0x00~0x3F
365 (eRFPath<<16)); //RF_Path = 0(A) or 1(B)
368 {// Make sure that access could be done.
369 if(read_nic_dword(dev, RF_BB_CMD_ADDR) == 0)
371 }while( --PollingCnt );
375 RT_TRACE(COMP_RF, "phy_SetUsbRFReg(): Set RegAddr(%#x) = %#x Fail!!!\n", RegAddr, Data);
378 //PlatformAcquireSpinLock(Adapter, RT_RF_OPERATE_SPINLOCK);
379 //spin_unlock_irqrestore(&priv->rf_lock, flags); //LZM,090318
381 priv->bChangeRFInProgress = false;
387 /*---------------------Define local function prototype-----------------------*/
390 /*----------------------------Function Body----------------------------------*/
392 // 1. BB register R/W API
395 * Function: PHY_QueryBBReg
397 * OverView: Read "sepcific bits" from BB register
401 * u32 RegAddr, //The target address to be readback
402 * u32 BitMask //The target bit position in the target address
405 * Return: u32 Data //The readback register value
406 * Note: This function is equal to "GetRegSetting" in PHY programming guide
408 //use phy dm core 8225 8256 6052
409 //u32 PHY_QueryBBReg(struct net_device* dev,u32 RegAddr, u32 BitMask)
410 u32 rtl8192_QueryBBReg(struct net_device* dev, u32 RegAddr, u32 BitMask)
413 u32 ReturnValue = 0, OriginalValue, BitShift;
416 RT_TRACE(COMP_RF, "--->PHY_QueryBBReg(): RegAddr(%#x), BitMask(%#x)\n", RegAddr, BitMask);
419 // <Roger_Notes> Due to 8051 operation cycle (limitation cycle: 6us) and 1-Byte access issue, we should use
420 // 4181 to access Base Band instead of 8051 on USB interface to make sure that access could be done in
424 //#if ((HAL_CODE_BASE == RTL8192_S) && (DEV_BUS_TYPE==USB_INTERFACE))
426 if(IS_BB_REG_OFFSET_92S(RegAddr))
428 //if(RT_USB_CANNOT_IO(Adapter)) return FALSE;
430 if((RegAddr & 0x03) != 0)
432 printk("%s: Not DWORD alignment!!\n", __FUNCTION__);
436 OriginalValue = phy_QueryUsbBBReg(dev, RegAddr);
441 OriginalValue = read_nic_dword(dev, RegAddr);
444 BitShift = phy_CalculateBitShift(BitMask);
445 ReturnValue = (OriginalValue & BitMask) >> BitShift;
447 //RTPRINT(FPHY, PHY_BBR, ("BBR MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, OriginalValue));
448 RT_TRACE(COMP_RF, "<---PHY_QueryBBReg(): RegAddr(%#x), BitMask(%#x), OriginalValue(%#x)\n", RegAddr, BitMask, OriginalValue);
449 return (ReturnValue);
453 * Function: PHY_SetBBReg
455 * OverView: Write "Specific bits" to BB register (page 8~)
459 * u32 RegAddr, //The target address to be modified
460 * u32 BitMask //The target bit position in the target address
462 * u32 Data //The new register value in the target bit position
463 * //of the target address
467 * Note: This function is equal to "PutRegSetting" in PHY programming guide
469 //use phy dm core 8225 8256
470 //void PHY_SetBBReg(struct net_device* dev,u32 RegAddr, u32 BitMask, u32 Data )
471 void rtl8192_setBBreg(struct net_device* dev, u32 RegAddr, u32 BitMask, u32 Data)
473 u32 OriginalValue, BitShift, NewValue;
476 RT_TRACE(COMP_RF, "--->PHY_SetBBReg(): RegAddr(%#x), BitMask(%#x), Data(%#x)\n", RegAddr, BitMask, Data);
479 // <Roger_Notes> Due to 8051 operation cycle (limitation cycle: 6us) and 1-Byte access issue, we should use
480 // 4181 to access Base Band instead of 8051 on USB interface to make sure that access could be done in
484 //#if ((HAL_CODE_BASE == RTL8192_S) && (DEV_BUS_TYPE==USB_INTERFACE))
486 if(IS_BB_REG_OFFSET_92S(RegAddr))
488 if((RegAddr & 0x03) != 0)
490 printk("%s: Not DWORD alignment!!\n", __FUNCTION__);
494 if(BitMask!= bMaskDWord)
495 {//if not "double word" write
496 OriginalValue = phy_QueryUsbBBReg(dev, RegAddr);
497 BitShift = phy_CalculateBitShift(BitMask);
498 NewValue = (((OriginalValue) & (~BitMask))|(Data << BitShift));
499 phy_SetUsbBBReg(dev, RegAddr, NewValue);
501 phy_SetUsbBBReg(dev, RegAddr, Data);
506 if(BitMask!= bMaskDWord)
507 {//if not "double word" write
508 OriginalValue = read_nic_dword(dev, RegAddr);
509 BitShift = phy_CalculateBitShift(BitMask);
510 NewValue = (((OriginalValue) & (~BitMask)) | (Data << BitShift));
511 write_nic_dword(dev, RegAddr, NewValue);
513 write_nic_dword(dev, RegAddr, Data);
516 //RT_TRACE(COMP_RF, "<---PHY_SetBBReg(): RegAddr(%#x), BitMask(%#x), Data(%#x)\n", RegAddr, BitMask, Data);
523 // 2. RF register R/W API
526 * Function: PHY_QueryRFReg
528 * OverView: Query "Specific bits" to RF register (page 8~)
532 * RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
533 * u32 RegAddr, //The target address to be read
534 * u32 BitMask //The target bit position in the target address
538 * Return: u32 Readback value
539 * Note: This function is equal to "GetRFRegSetting" in PHY programming guide
542 //u32 PHY_QueryRFReg(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask)
543 u32 rtl8192_phy_QueryRFReg(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask)
545 u32 Original_Value, Readback_Value, BitShift;//, flags;
546 struct r8192_priv *priv = ieee80211_priv(dev);
549 RT_TRACE(COMP_RF, "--->PHY_QueryRFReg(): RegAddr(%#x), eRFPath(%#x), BitMask(%#x)\n", RegAddr, eRFPath,BitMask);
551 if (!((priv->rf_pathmap >> eRFPath) & 0x1))
553 printk("EEEEEError: rfpath off! rf_pathmap=%x eRFPath=%x\n", priv->rf_pathmap, eRFPath);
557 if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
559 printk("EEEEEError: not legal rfpath! eRFPath=%x\n", eRFPath);
563 /* 2008/01/17 MH We get and release spin lock when reading RF register. */
564 //PlatformAcquireSpinLock(dev, RT_RF_OPERATE_SPINLOCK);FIXLZM
565 //spin_lock_irqsave(&priv->rf_lock, flags); //YJ,test,090113
568 // <Roger_Notes> Due to 8051 operation cycle (limitation cycle: 6us) and 1-Byte access issue, we should use
569 // 4181 to access Base Band instead of 8051 on USB interface to make sure that access could be done in
573 //#if (HAL_CODE_BASE == RTL8192_S && DEV_BUS_TYPE==USB_INTERFACE)
575 //if(RT_USB_CANNOT_IO(Adapter)) return FALSE;
576 Original_Value = phy_QueryUsbRFReg(dev, eRFPath, RegAddr);
578 if (priv->Rf_Mode == RF_OP_By_FW)
580 Original_Value = phy_FwRFSerialRead(dev, eRFPath, RegAddr);
584 Original_Value = phy_RFSerialRead(dev, eRFPath, RegAddr);
588 BitShift = phy_CalculateBitShift(BitMask);
589 Readback_Value = (Original_Value & BitMask) >> BitShift;
590 //spin_unlock_irqrestore(&priv->rf_lock, flags); //YJ,test,090113
592 //PlatformReleaseSpinLock(dev, RT_RF_OPERATE_SPINLOCK);
594 //RTPRINT(FPHY, PHY_RFR, ("RFR-%d MASK=0x%x Addr[0x%x]=0x%x\n", eRFPath, BitMask, RegAddr, Original_Value));
596 return (Readback_Value);
600 * Function: PHY_SetRFReg
602 * OverView: Write "Specific bits" to RF register (page 8~)
606 * RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
607 * u32 RegAddr, //The target address to be modified
608 * u32 BitMask //The target bit position in the target address
610 * u32 Data //The new register Data in the target bit position
611 * //of the target address
615 * Note: This function is equal to "PutRFRegSetting" in PHY programming guide
618 //void PHY_SetRFReg(struct net_device* dev,RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask,u32 Data )
619 void rtl8192_phy_SetRFReg(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
622 struct r8192_priv *priv = ieee80211_priv(dev);
623 u32 Original_Value, BitShift, New_Value;//, flags;
625 RT_TRACE(COMP_RF, "--->PHY_SetRFReg(): RegAddr(%#x), BitMask(%#x), Data(%#x), eRFPath(%#x)\n",
626 RegAddr, BitMask, Data, eRFPath);
628 if (!((priv->rf_pathmap >> eRFPath) & 0x1))
630 printk("EEEEEError: rfpath off! rf_pathmap=%x eRFPath=%x\n", priv->rf_pathmap, eRFPath);
633 if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
635 printk("EEEEEError: not legal rfpath! eRFPath=%x\n", eRFPath);
639 /* 2008/01/17 MH We get and release spin lock when writing RF register. */
640 //PlatformAcquireSpinLock(dev, RT_RF_OPERATE_SPINLOCK);
641 //spin_lock_irqsave(&priv->rf_lock, flags); //YJ,test,090113
644 // <Roger_Notes> Due to 8051 operation cycle (limitation cycle: 6us) and 1-Byte access issue, we should use
645 // 4181 to access Base Band instead of 8051 on USB interface to make sure that access could be done in
649 //#if (HAL_CODE_BASE == RTL8192_S && DEV_BUS_TYPE==USB_INTERFACE)
651 //if(RT_USB_CANNOT_IO(Adapter)) return;
653 if (BitMask != bRFRegOffsetMask) // RF data is 12 bits only
655 Original_Value = phy_QueryUsbRFReg(dev, eRFPath, RegAddr);
656 BitShift = phy_CalculateBitShift(BitMask);
657 New_Value = (((Original_Value)&(~BitMask))|(Data<< BitShift));
658 phy_SetUsbRFReg(dev, eRFPath, RegAddr, New_Value);
661 phy_SetUsbRFReg(dev, eRFPath, RegAddr, Data);
663 if (priv->Rf_Mode == RF_OP_By_FW)
665 //DbgPrint("eRFPath-%d Addr[%02x] = %08x\n", eRFPath, RegAddr, Data);
666 if (BitMask != bRFRegOffsetMask) // RF data is 12 bits only
668 Original_Value = phy_FwRFSerialRead(dev, eRFPath, RegAddr);
669 BitShift = phy_CalculateBitShift(BitMask);
670 New_Value = (((Original_Value) & (~BitMask)) | (Data<< BitShift));
672 phy_FwRFSerialWrite(dev, eRFPath, RegAddr, New_Value);
675 phy_FwRFSerialWrite(dev, eRFPath, RegAddr, Data);
679 //DbgPrint("eRFPath-%d Addr[%02x] = %08x\n", eRFPath, RegAddr, Data);
680 if (BitMask != bRFRegOffsetMask) // RF data is 12 bits only
682 Original_Value = phy_RFSerialRead(dev, eRFPath, RegAddr);
683 BitShift = phy_CalculateBitShift(BitMask);
684 New_Value = (((Original_Value) & (~BitMask)) | (Data<< BitShift));
686 phy_RFSerialWrite(dev, eRFPath, RegAddr, New_Value);
689 phy_RFSerialWrite(dev, eRFPath, RegAddr, Data);
693 //PlatformReleaseSpinLock(dev, RT_RF_OPERATE_SPINLOCK);
694 //spin_unlock_irqrestore(&priv->rf_lock, flags); //YJ,test,090113
696 //RTPRINT(FPHY, PHY_RFW, ("RFW-%d MASK=0x%x Addr[0x%x]=0x%x\n", eRFPath, BitMask, RegAddr, Data));
697 RT_TRACE(COMP_RF, "<---PHY_SetRFReg(): RegAddr(%#x), BitMask(%#x), Data(%#x), eRFPath(%#x)\n",
698 RegAddr, BitMask, Data, eRFPath);
703 * Function: phy_RFSerialRead
705 * OverView: Read regster from RF chips
709 * RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
710 * u4Byte Offset, //The target address to be read
713 * Return: u4Byte reback value
714 * Note: Threre are three types of serial operations:
715 * 1. Software serial write
716 * 2. Hardware LSSI-Low Speed Serial Interface
717 * 3. Hardware HSSI-High speed
718 * serial write. Driver need to implement (1) and (2).
719 * This function is equal to the combination of RF_ReadReg() and RFLSSIRead()
723 phy_RFSerialRead(struct net_device* dev,RF90_RADIO_PATH_E eRFPath,u32 Offset)
727 struct r8192_priv *priv = ieee80211_priv(dev);
728 BB_REGISTER_DEFINITION_T *pPhyReg = &priv->PHYRegDef[eRFPath];
731 u32 tmplong,tmplong2;
734 if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs
736 if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs
740 // Make sure RF register offset is correct
745 // Switch page for 8256 RF IC
749 // For 92S LSSI Read RFLSSIRead
750 // For RF A/B write 0x824/82c(does not work in the future)
751 // We must use 0x824 for RF A and B to execute read trigger
752 tmplong = rtl8192_QueryBBReg(dev, rFPGA0_XA_HSSIParameter2, bMaskDWord);
753 tmplong2 = rtl8192_QueryBBReg(dev, pPhyReg->rfHSSIPara2, bMaskDWord);
754 tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge; //T65 RF
756 rtl8192_setBBreg(dev, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge));
759 rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, bMaskDWord, tmplong2);
762 rtl8192_setBBreg(dev, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong|bLSSIReadEdge);
765 if(eRFPath == RF90_PATH_A)
766 RfPiEnable = (u8)rtl8192_QueryBBReg(dev, rFPGA0_XA_HSSIParameter1, BIT8);
767 else if(eRFPath == RF90_PATH_B)
768 RfPiEnable = (u8)rtl8192_QueryBBReg(dev, rFPGA0_XB_HSSIParameter1, BIT8);
771 { // Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF
772 retValue = rtl8192_QueryBBReg(dev, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData);
773 //DbgPrint("Readback from RF-PI : 0x%x\n", retValue);
776 { //Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF
777 retValue = rtl8192_QueryBBReg(dev, pPhyReg->rfLSSIReadBack, bLSSIReadBackData);
778 //DbgPrint("Readback from RF-SI : 0x%x\n", retValue);
780 //RTPRINT(FPHY, PHY_RFR, ("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue));
789 * Function: phy_RFSerialWrite
791 * OverView: Write data to RF register (page 8~)
795 * RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
796 * u4Byte Offset, //The target address to be read
797 * u4Byte Data //The new register Data in the target bit position
798 * //of the target to be read
802 * Note: Threre are three types of serial operations:
803 * 1. Software serial write
804 * 2. Hardware LSSI-Low Speed Serial Interface
805 * 3. Hardware HSSI-High speed
806 * serial write. Driver need to implement (1) and (2).
807 * This function is equal to the combination of RF_ReadReg() and RFLSSIRead()
809 * Note: For RF8256 only
810 * The total count of RTL8256(Zebra4) register is around 36 bit it only employs
811 * 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10])
812 * to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration
813 * programming guide" for more details.
814 * Thus, we define a sub-finction for RTL8526 register address conversion
815 * ===========================================================
816 * Register Mode RegCTL[1] RegCTL[0] Note
817 * (Reg00[12]) (Reg00[10])
818 * ===========================================================
819 * Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf)
820 * ------------------------------------------------------------------
821 * Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf)
822 * ------------------------------------------------------------------
823 * Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf)
824 * ------------------------------------------------------------------
826 * 2008/09/02 MH Add 92S RF definition
832 phy_RFSerialWrite(struct net_device* dev,RF90_RADIO_PATH_E eRFPath,u32 Offset,u32 Data)
835 struct r8192_priv *priv = ieee80211_priv(dev);
836 BB_REGISTER_DEFINITION_T *pPhyReg = &priv->PHYRegDef[eRFPath];
840 //<Roger_TODO> We should check valid regs for RF_6052 case.
841 if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs
843 if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs
852 PHY_RFShadowWrite(dev, eRFPath, Offset, Data);
855 // Switch page for 8256 RF IC
860 // Put write addr in [5:0] and write data in [31:16]
862 //DataAndAddr = (Data<<16) | (NewOffset&0x3f);
863 DataAndAddr = ((NewOffset<<20) | (Data&0x000fffff)) & 0x0fffffff; // T65 RF
868 rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
869 //RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr));
875 * Function: phy_CalculateBitShift
877 * OverView: Get shifted position of the BitMask
883 * Return: u32 Return the shift bit bit position of the mask
886 static u32 phy_CalculateBitShift(u32 BitMask)
892 if ( ((BitMask>>i) & 0x1 ) == 1)
901 // 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt.
903 /*-----------------------------------------------------------------------------
904 * Function: PHY_MACConfig8192S
906 * Overview: Condig MAC by header file or parameter file.
916 * 08/12/2008 MHC Create Version 0.
918 *---------------------------------------------------------------------------*/
920 extern bool PHY_MACConfig8192S(struct net_device* dev)
922 RT_STATUS rtStatus = RT_STATUS_SUCCESS;
927 rtStatus = phy_ConfigMACWithHeaderFile(dev);
928 return (rtStatus == RT_STATUS_SUCCESS) ? true:false;
934 PHY_BBConfig8192S(struct net_device* dev)
936 RT_STATUS rtStatus = RT_STATUS_SUCCESS;
938 u8 PathMap = 0, index = 0, rf_num = 0;
939 struct r8192_priv *priv = ieee80211_priv(dev);
940 phy_InitBBRFRegisterDefinition(dev);
945 //switch( Adapter->MgntInfo.bRegHwParaFile )
948 // phy_BB8190_Config_HardCode(dev);
952 rtStatus = phy_BB8192S_Config_ParaFile(dev);
957 // phy_BB8190_Config_HardCode(dev);
958 // phy_BB8192S_Config_ParaFile(dev);
962 // phy_BB8190_Config_HardCode(dev);
965 PathMap = (u8)(rtl8192_QueryBBReg(dev, rFPGA0_TxInfo, 0xf) |
966 rtl8192_QueryBBReg(dev, rOFDM0_TRxPathEnable, 0xf));
967 priv->rf_pathmap = PathMap;
968 for(index = 0; index<4; index++)
970 if((PathMap>>index)&0x1)
974 if((priv->rf_type==RF_1T1R && rf_num!=1) ||
975 (priv->rf_type==RF_1T2R && rf_num!=2) ||
976 (priv->rf_type==RF_2T2R && rf_num!=2) ||
977 (priv->rf_type==RF_2T2R_GREEN && rf_num!=2) ||
978 (priv->rf_type==RF_2T4R && rf_num!=4))
980 RT_TRACE( COMP_INIT, "PHY_BBConfig8192S: RF_Type(%x) does not match RF_Num(%x)!!\n", priv->rf_type, rf_num);
982 return (rtStatus == RT_STATUS_SUCCESS) ? 1:0;
987 PHY_RFConfig8192S(struct net_device* dev)
989 struct r8192_priv *priv = ieee80211_priv(dev);
990 RT_STATUS rtStatus = RT_STATUS_SUCCESS;
992 //Set priv->rf_chip = RF_8225 to do real PHY FPGA initilization
994 //<Roger_EXP> We assign RF type here temporally. 2008.09.12.
995 priv->rf_chip = RF_6052;
1000 switch(priv->rf_chip)
1004 rtStatus = PHY_RF6052_Config(dev);
1008 //rtStatus = PHY_RF8256_Config(dev);
1015 //rtStatus = PHY_RF8225_Config(dev);
1021 return (rtStatus == RT_STATUS_SUCCESS) ? 1:0;
1025 // Joseph test: new initialize order!!
1026 // Test only!! This part need to be re-organized.
1027 // Now it is just for 8256.
1031 phy_BB8190_Config_HardCode(struct net_device* dev)
1033 //RT_ASSERT(FALSE, ("This function is not implement yet!! \n"));
1034 return RT_STATUS_SUCCESS;
1038 /*-----------------------------------------------------------------------------
1039 * Function: phy_SetBBtoDiffRFWithHeaderFile()
1041 * Overview: This function
1044 * Input: PADAPTER Adapter
1045 * u1Byte ConfigType 0 => PHY_CONFIG
1049 * Return: RT_STATUS_SUCCESS: configuration file exist
1053 *---------------------------------------------------------------------------*/
1055 phy_SetBBtoDiffRFWithHeaderFile(struct net_device* dev, u8 ConfigType)
1058 struct r8192_priv *priv = ieee80211_priv(dev);
1059 u32* Rtl819XPHY_REGArraytoXTXR_Table;
1060 u16 PHY_REGArraytoXTXRLen;
1062 //#if (HAL_CODE_BASE != RTL8192_S)
1064 if(priv->rf_type == RF_1T1R)
1066 Rtl819XPHY_REGArraytoXTXR_Table = Rtl819XPHY_REG_to1T1R_Array;
1067 PHY_REGArraytoXTXRLen = PHY_ChangeTo_1T1RArrayLength;
1069 else if(priv->rf_type == RF_1T2R)
1071 Rtl819XPHY_REGArraytoXTXR_Table = Rtl819XPHY_REG_to1T2R_Array;
1072 PHY_REGArraytoXTXRLen = PHY_ChangeTo_1T2RArrayLength;
1074 //else if(priv->rf_type == RF_2T2R || priv->rf_type == RF_2T2R_GREEN)
1076 // Rtl819XPHY_REGArraytoXTXR_Table = Rtl819XPHY_REG_to2T2R_Array;
1077 // PHY_REGArraytoXTXRLen = PHY_ChangeTo_2T2RArrayLength;
1081 return RT_STATUS_FAILURE;
1084 if(ConfigType == BaseBand_Config_PHY_REG)
1086 for(i=0;i<PHY_REGArraytoXTXRLen;i=i+3)
1088 if (Rtl819XPHY_REGArraytoXTXR_Table[i] == 0xfe)
1090 else if (Rtl819XPHY_REGArraytoXTXR_Table[i] == 0xfd)
1092 else if (Rtl819XPHY_REGArraytoXTXR_Table[i] == 0xfc)
1094 else if (Rtl819XPHY_REGArraytoXTXR_Table[i] == 0xfb)
1096 else if (Rtl819XPHY_REGArraytoXTXR_Table[i] == 0xfa)
1098 else if (Rtl819XPHY_REGArraytoXTXR_Table[i] == 0xf9)
1100 rtl8192_setBBreg(dev, Rtl819XPHY_REGArraytoXTXR_Table[i], Rtl819XPHY_REGArraytoXTXR_Table[i+1], Rtl819XPHY_REGArraytoXTXR_Table[i+2]);
1101 //RT_TRACE(COMP_SEND,
1102 //"The Rtl819XPHY_REGArraytoXTXR_Table[0] is %lx Rtl819XPHY_REGArraytoXTXR_Table[1] is %lx Rtl819XPHY_REGArraytoXTXR_Table[2] is %lx \n",
1103 //Rtl819XPHY_REGArraytoXTXR_Table[i],Rtl819XPHY_REGArraytoXTXR_Table[i+1], Rtl819XPHY_REGArraytoXTXR_Table[i+2]);
1107 RT_TRACE(COMP_SEND, "phy_SetBBtoDiffRFWithHeaderFile(): ConfigType != BaseBand_Config_PHY_REG\n");
1109 //#endif // #if (HAL_CODE_BASE != RTL8192_S)
1110 return RT_STATUS_SUCCESS;
1116 phy_BB8192S_Config_ParaFile(struct net_device* dev)
1118 struct r8192_priv *priv = ieee80211_priv(dev);
1119 RT_STATUS rtStatus = RT_STATUS_SUCCESS;
1122 //char szBBRegFile[] = RTL819X_PHY_REG;
1123 //char szBBRegFile1T2R[] = RTL819X_PHY_REG_1T2R;
1124 //char szBBRegPgFile[] = RTL819X_PHY_REG_PG;
1125 //char szAGCTableFile[] = RTL819X_AGC_TAB;
1126 //char szBBRegto1T1RFile[] = RTL819X_PHY_REG_to1T1R;
1127 //char szBBRegto1T2RFile[] = RTL819X_PHY_REG_to1T2R;
1129 RT_TRACE(COMP_INIT, "==>phy_BB8192S_Config_ParaFile\n");
1132 // 1. Read PHY_REG.TXT BB INIT!!
1133 // We will seperate as 1T1R/1T2R/1T2R_GREEN/2T2R
1135 if (priv->rf_type == RF_1T2R || priv->rf_type == RF_2T2R ||
1136 priv->rf_type == RF_1T1R ||priv->rf_type == RF_2T2R_GREEN)
1138 rtStatus = phy_ConfigBBWithHeaderFile(dev,BaseBand_Config_PHY_REG);
1139 if(priv->rf_type != RF_2T2R && priv->rf_type != RF_2T2R_GREEN)
1140 {//2008.11.10 Added by tynli. The default PHY_REG.txt we read is for 2T2R,
1141 //so we should reconfig BB reg with the right PHY parameters.
1142 rtStatus = phy_SetBBtoDiffRFWithHeaderFile(dev,BaseBand_Config_PHY_REG);
1145 rtStatus = RT_STATUS_FAILURE;
1147 if(rtStatus != RT_STATUS_SUCCESS){
1148 RT_TRACE(COMP_INIT, "phy_BB8192S_Config_ParaFile():Write BB Reg Fail!!");
1149 goto phy_BB8190_Config_ParaFile_Fail;
1153 // 2. If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt
1155 if (priv->AutoloadFailFlag == false)
1157 rtStatus = phy_ConfigBBWithPgHeaderFile(dev,BaseBand_Config_PHY_REG);
1159 if(rtStatus != RT_STATUS_SUCCESS){
1160 RT_TRACE(COMP_INIT, "phy_BB8192S_Config_ParaFile():BB_PG Reg Fail!!");
1161 goto phy_BB8190_Config_ParaFile_Fail;
1165 // 3. BB AGC table Initialization
1167 rtStatus = phy_ConfigBBWithHeaderFile(dev,BaseBand_Config_AGC_TAB);
1169 if(rtStatus != RT_STATUS_SUCCESS){
1170 printk( "phy_BB8192S_Config_ParaFile():AGC Table Fail\n");
1171 goto phy_BB8190_Config_ParaFile_Fail;
1175 #if 0 // 2008/08/18 MH Disable for 92SE
1176 if(pHalData->VersionID > VERSION_8190_BD)
1178 //if(pHalData->RF_Type == RF_2T4R)
1180 // Antenna gain offset from B/C/D to A
1181 u4RegValue = ( pHalData->AntennaTxPwDiff[2]<<8 |
1182 pHalData->AntennaTxPwDiff[1]<<4 |
1183 pHalData->AntennaTxPwDiff[0]);
1188 PHY_SetBBReg(dev, rFPGA0_TxGainStage,
1189 (bXBTxAGC|bXCTxAGC|bXDTxAGC), u4RegValue);
1193 u4RegValue = pHalData->CrystalCap;
1194 PHY_SetBBReg(dev, rFPGA0_AnalogParameter1, bXtalCap92x, u4RegValue);
1196 //u4RegValue = ((pHalData->CrystalCap & 0xc)>>2); // bit2~3 of crystal cap
1197 //PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, bXtalCap23, u4RegValue);
1202 // Check if the CCK HighPower is turned ON.
1203 // This is used to calculate PWDB.
1204 priv->bCckHighPower = (bool)(rtl8192_QueryBBReg(dev, rFPGA0_XA_HSSIParameter2, 0x200));
1207 phy_BB8190_Config_ParaFile_Fail:
1211 /*-----------------------------------------------------------------------------
1212 * Function: phy_ConfigMACWithHeaderFile()
1214 * Overview: This function read BB parameters from Header file we gen, and do register
1217 * Input: PADAPTER Adapter
1222 * Return: RT_STATUS_SUCCESS: configuration file exist
1224 * Note: The format of MACPHY_REG.txt is different from PHY and RF.
1225 * [Register][Mask][Value]
1226 *---------------------------------------------------------------------------*/
1229 phy_ConfigMACWithHeaderFile(struct net_device* dev)
1232 u32 ArrayLength = 0;
1234 //struct r8192_priv *priv = ieee80211_priv(dev);
1236 //#if (HAL_CODE_BASE != RTL8192_S)
1237 /*if(Adapter->bInHctTest)
1239 RT_TRACE(COMP_INIT, DBG_LOUD, ("Rtl819XMACPHY_ArrayDTM\n"));
1240 ArrayLength = MACPHY_ArrayLengthDTM;
1241 ptrArray = Rtl819XMACPHY_ArrayDTM;
1243 else if(pHalData->bTXPowerDataReadFromEEPORM)
1245 // RT_TRACE(COMP_INIT, DBG_LOUD, ("Rtl819XMACPHY_Array_PG\n"));
1246 // ArrayLength = MACPHY_Array_PGLength;
1247 // ptrArray = Rtl819XMACPHY_Array_PG;
1250 { //2008.11.06 Modified by tynli.
1251 RT_TRACE(COMP_INIT, "Read Rtl819XMACPHY_Array\n");
1252 ArrayLength = MAC_2T_ArrayLength;
1253 ptrArray = Rtl819XMAC_Array;
1256 /*for(i = 0 ;i < ArrayLength;i=i+3){
1257 RT_TRACE(COMP_SEND, DBG_LOUD, ("The Rtl819XMACPHY_Array[0] is %lx Rtl819XMACPHY_Array[1] is %lx Rtl819XMACPHY_Array[2] is %lx\n",ptrArray[i], ptrArray[i+1], ptrArray[i+2]));
1258 if(ptrArray[i] == 0x318)
1260 ptrArray[i+2] = 0x00000800;
1261 //DbgPrint("ptrArray[i], ptrArray[i+1], ptrArray[i+2] = %x, %x, %x\n",
1262 // ptrArray[i], ptrArray[i+1], ptrArray[i+2]);
1264 PHY_SetBBReg(Adapter, ptrArray[i], ptrArray[i+1], ptrArray[i+2]);
1266 for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column
1267 write_nic_byte(dev, ptrArray[i], (u8)ptrArray[i+1]);
1270 return RT_STATUS_SUCCESS;
1273 /*-----------------------------------------------------------------------------
1274 * Function: phy_ConfigBBWithHeaderFile()
1276 * Overview: This function read BB parameters from general file format, and do register
1279 * Input: PADAPTER Adapter
1280 * u8 ConfigType 0 => PHY_CONFIG
1285 * Return: RT_STATUS_SUCCESS: configuration file exist
1287 *---------------------------------------------------------------------------*/
1290 phy_ConfigBBWithHeaderFile(struct net_device* dev,u8 ConfigType)
1294 u32* Rtl819XPHY_REGArray_Table;
1295 u32* Rtl819XAGCTAB_Array_Table;
1296 u16 PHY_REGArrayLen, AGCTAB_ArrayLen;
1297 //struct r8192_priv *priv = ieee80211_priv(dev);
1298 //#if (HAL_CODE_BASE != RTL8192_S)
1299 /*if(Adapter->bInHctTest)
1302 AGCTAB_ArrayLen = AGCTAB_ArrayLengthDTM;
1303 Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_ArrayDTM;
1305 if(pHalData->RF_Type == RF_2T4R)
1307 PHY_REGArrayLen = PHY_REGArrayLengthDTM;
1308 Rtl819XPHY_REGArray_Table = Rtl819XPHY_REGArrayDTM;
1310 else if (pHalData->RF_Type == RF_1T2R)
1312 PHY_REGArrayLen = PHY_REG_1T2RArrayLengthDTM;
1313 Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T2RArrayDTM;
1321 // 2008.11.06 Modified by tynli.
1323 AGCTAB_ArrayLen = AGCTAB_ArrayLength;
1324 Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_Array;
1325 PHY_REGArrayLen = PHY_REG_2T2RArrayLength; // Default RF_type: 2T2R
1326 Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_Array;
1329 if(ConfigType == BaseBand_Config_PHY_REG)
1331 for(i=0;i<PHY_REGArrayLen;i=i+2)
1333 if (Rtl819XPHY_REGArray_Table[i] == 0xfe)
1335 else if (Rtl819XPHY_REGArray_Table[i] == 0xfd)
1337 else if (Rtl819XPHY_REGArray_Table[i] == 0xfc)
1339 else if (Rtl819XPHY_REGArray_Table[i] == 0xfb)
1341 else if (Rtl819XPHY_REGArray_Table[i] == 0xfa)
1343 else if (Rtl819XPHY_REGArray_Table[i] == 0xf9)
1345 rtl8192_setBBreg(dev, Rtl819XPHY_REGArray_Table[i], bMaskDWord, Rtl819XPHY_REGArray_Table[i+1]);
1346 //RT_TRACE(COMP_SEND, "The Rtl819XPHY_REGArray_Table[0] is %lx Rtl819XPHY_REGArray[1] is %lx \n",Rtl819XPHY_REGArray_Table[i], Rtl819XPHY_REGArray_Table[i+1]);
1350 else if(ConfigType == BaseBand_Config_AGC_TAB){
1351 for(i=0;i<AGCTAB_ArrayLen;i=i+2)
1353 rtl8192_setBBreg(dev, Rtl819XAGCTAB_Array_Table[i], bMaskDWord, Rtl819XAGCTAB_Array_Table[i+1]);
1356 //#endif // #if (HAL_CODE_BASE != RTL8192_S)
1357 return RT_STATUS_SUCCESS;
1360 /*-----------------------------------------------------------------------------
1361 * Function: phy_ConfigBBWithPgHeaderFile
1363 * Overview: Config PHY_REG_PG array
1373 * 11/06/2008 MHC Add later!!!!!!.. Please modify for new files!!!!
1374 * 11/10/2008 tynli Modify to mew files.
1376 *---------------------------------------------------------------------------*/
1378 phy_ConfigBBWithPgHeaderFile(struct net_device* dev,u8 ConfigType)
1382 u32* Rtl819XPHY_REGArray_Table_PG;
1383 u16 PHY_REGArrayPGLen;
1384 //struct r8192_priv *priv = ieee80211_priv(dev);
1385 //#if (HAL_CODE_BASE != RTL8192_S)
1386 // Default: pHalData->RF_Type = RF_2T2R.
1388 PHY_REGArrayPGLen = PHY_REG_Array_PGLength;
1389 Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG;
1391 if(ConfigType == BaseBand_Config_PHY_REG)
1393 for(i=0;i<PHY_REGArrayPGLen;i=i+3)
1395 if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfe)
1397 else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfd)
1399 else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfc)
1401 else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfb)
1403 else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xfa)
1405 else if (Rtl819XPHY_REGArray_Table_PG[i] == 0xf9)
1407 rtl8192_setBBreg(dev, Rtl819XPHY_REGArray_Table_PG[i], Rtl819XPHY_REGArray_Table_PG[i+1], Rtl819XPHY_REGArray_Table_PG[i+2]);
1408 //RT_TRACE(COMP_SEND, "The Rtl819XPHY_REGArray_Table_PG[0] is %lx Rtl819XPHY_REGArray_Table_PG[1] is %lx \n",
1409 // Rtl819XPHY_REGArray_Table_PG[i], Rtl819XPHY_REGArray_Table_PG[i+1]);
1412 RT_TRACE(COMP_SEND, "phy_ConfigBBWithPgHeaderFile(): ConfigType != BaseBand_Config_PHY_REG\n");
1414 return RT_STATUS_SUCCESS;
1416 } /* phy_ConfigBBWithPgHeaderFile */
1418 /*-----------------------------------------------------------------------------
1419 * Function: PHY_ConfigRFWithHeaderFile()
1421 * Overview: This function read RF parameters from general file format, and do RF 3-wire
1423 * Input: PADAPTER Adapter
1425 * RF90_RADIO_PATH_E eRFPath
1429 * Return: RT_STATUS_SUCCESS: configuration file exist
1431 * Note: Delay may be required for RF configuration
1432 *---------------------------------------------------------------------------*/
1433 //in 8256 phy_RF8256_Config_ParaFile only
1434 //RT_STATUS PHY_ConfigRFWithHeaderFile(struct net_device* dev,RF90_RADIO_PATH_E eRFPath)
1435 u8 rtl8192_phy_ConfigRFWithHeaderFile(struct net_device* dev, RF90_RADIO_PATH_E eRFPath)
1438 struct r8192_priv *priv = ieee80211_priv(dev);
1441 RT_STATUS rtStatus = RT_STATUS_SUCCESS;
1442 u32 *Rtl819XRadioA_Array_Table;
1443 u32 *Rtl819XRadioB_Array_Table;
1444 //u32* Rtl819XRadioC_Array_Table;
1445 //u32* Rtl819XRadioD_Array_Table;
1446 u16 RadioA_ArrayLen,RadioB_ArrayLen;
1448 { //2008.11.06 Modified by tynli
1449 RadioA_ArrayLen = RadioA_1T_ArrayLength;
1450 Rtl819XRadioA_Array_Table=Rtl819XRadioA_Array;
1451 Rtl819XRadioB_Array_Table=Rtl819XRadioB_Array;
1452 RadioB_ArrayLen = RadioB_ArrayLength;
1455 if( priv->rf_type == RF_2T2R_GREEN )
1457 Rtl819XRadioB_Array_Table = Rtl819XRadioB_GM_Array;
1458 RadioB_ArrayLen = RadioB_GM_ArrayLength;
1462 Rtl819XRadioB_Array_Table = Rtl819XRadioB_Array;
1463 RadioB_ArrayLen = RadioB_ArrayLength;
1466 rtStatus = RT_STATUS_SUCCESS;
1468 // When initialization, we want the delay function(mdelay(), delay_us()
1469 // ==> actually we call PlatformStallExecution()) to do NdisStallExecution()
1470 // [busy wait] instead of NdisMSleep(). So we acquire RT_INITIAL_SPINLOCK
1471 // to run at Dispatch level to achive it.
1472 //cosa PlatformAcquireSpinLock(Adapter, RT_INITIAL_SPINLOCK);
1476 for(i = 0;i<RadioA_ArrayLen; i=i+2){
1477 if(Rtl819XRadioA_Array_Table[i] == 0xfe)
1478 { // Deay specific ms. Only RF configuration require delay.
1479 //#if (DEV_BUS_TYPE == USB_INTERFACE)
1486 else if (Rtl819XRadioA_Array_Table[i] == 0xfd)
1488 else if (Rtl819XRadioA_Array_Table[i] == 0xfc)
1490 else if (Rtl819XRadioA_Array_Table[i] == 0xfb)
1492 //PlatformStallExecution(50);
1493 else if (Rtl819XRadioA_Array_Table[i] == 0xfa)
1495 else if (Rtl819XRadioA_Array_Table[i] == 0xf9)
1499 rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioA_Array_Table[i], bRFRegOffsetMask, Rtl819XRadioA_Array_Table[i+1]);
1504 for(i = 0;i<RadioB_ArrayLen; i=i+2){
1505 if(Rtl819XRadioB_Array_Table[i] == 0xfe)
1506 { // Deay specific ms. Only RF configuration require delay.
1507 //#if (DEV_BUS_TYPE == USB_INTERFACE)
1514 else if (Rtl819XRadioB_Array_Table[i] == 0xfd)
1516 else if (Rtl819XRadioB_Array_Table[i] == 0xfc)
1518 else if (Rtl819XRadioB_Array_Table[i] == 0xfb)
1520 else if (Rtl819XRadioB_Array_Table[i] == 0xfa)
1522 else if (Rtl819XRadioB_Array_Table[i] == 0xf9)
1526 rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioB_Array_Table[i], bRFRegOffsetMask, Rtl819XRadioB_Array_Table[i+1]);
1542 /*-----------------------------------------------------------------------------
1543 * Function: PHY_CheckBBAndRFOK()
1545 * Overview: This function is write register and then readback to make sure whether
1546 * BB[PHY0, PHY1], RF[Patha, path b, path c, path d] is Ok
1548 * Input: PADAPTER Adapter
1549 * HW90_BLOCK_E CheckBlock
1550 * RF90_RADIO_PATH_E eRFPath // it is used only when CheckBlock is HW90_BLOCK_RF
1554 * Return: RT_STATUS_SUCCESS: PHY is OK
1556 * Note: This function may be removed in the ASIC
1557 *---------------------------------------------------------------------------*/
1558 //in 8256 phy_RF8256_Config_HardCode
1559 //but we don't use it temp
1562 struct net_device* dev,
1563 HW90_BLOCK_E CheckBlock,
1564 RF90_RADIO_PATH_E eRFPath
1567 //struct r8192_priv *priv = ieee80211_priv(dev);
1568 RT_STATUS rtStatus = RT_STATUS_SUCCESS;
1569 u32 i, CheckTimes = 4,ulRegRead = 0;
1571 u32 WriteData[] = {0xfffff027, 0xaa55a02f, 0x00000027, 0x55aa502f};
1573 // Initialize register address offset to be checked
1574 WriteAddr[HW90_BLOCK_MAC] = 0x100;
1575 WriteAddr[HW90_BLOCK_PHY0] = 0x900;
1576 WriteAddr[HW90_BLOCK_PHY1] = 0x800;
1577 WriteAddr[HW90_BLOCK_RF] = 0x3;
1579 for(i=0 ; i < CheckTimes ; i++)
1583 // Write Data to register and readback
1587 case HW90_BLOCK_MAC:
1588 //RT_ASSERT(FALSE, ("PHY_CheckBBRFOK(): Never Write 0x100 here!"));
1589 RT_TRACE(COMP_INIT, "PHY_CheckBBRFOK(): Never Write 0x100 here!\n");
1592 case HW90_BLOCK_PHY0:
1593 case HW90_BLOCK_PHY1:
1594 write_nic_dword(dev, WriteAddr[CheckBlock], WriteData[i]);
1595 ulRegRead = read_nic_dword(dev, WriteAddr[CheckBlock]);
1599 // When initialization, we want the delay function(mdelay(), delay_us()
1600 // ==> actually we call PlatformStallExecution()) to do NdisStallExecution()
1601 // [busy wait] instead of NdisMSleep(). So we acquire RT_INITIAL_SPINLOCK
1602 // to run at Dispatch level to achive it.
1603 //cosa PlatformAcquireSpinLock(dev, RT_INITIAL_SPINLOCK);
1604 WriteData[i] &= 0xfff;
1605 rtl8192_phy_SetRFReg(dev, eRFPath, WriteAddr[HW90_BLOCK_RF], bRFRegOffsetMask, WriteData[i]);
1606 // TODO: we should not delay for such a long time. Ask SD3
1608 ulRegRead = rtl8192_phy_QueryRFReg(dev, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord);
1610 //cosa PlatformReleaseSpinLock(dev, RT_INITIAL_SPINLOCK);
1614 rtStatus = RT_STATUS_FAILURE;
1620 // Check whether readback data is correct
1622 if(ulRegRead != WriteData[i])
1624 //RT_TRACE(COMP_FPGA, ("ulRegRead: %x, WriteData: %x \n", ulRegRead, WriteData[i]));
1625 RT_TRACE(COMP_ERR, "read back error(read:%x, write:%x)\n", ulRegRead, WriteData[i]);
1626 rtStatus = RT_STATUS_FAILURE;
1634 //no use temp in windows driver
1637 PHY_SetRFPowerState8192SUsb(
1638 struct net_device* dev,
1639 RF_POWER_STATE RFPowerState
1642 struct r8192_priv *priv = ieee80211_priv(dev);
1643 bool WaitShutDown = FALSE;
1645 //RF90_RADIO_PATH_E eRFPath;
1647 BB_REGISTER_DEFINITION_T *pPhyReg;
1649 if(priv->SetRFPowerStateInProgress == TRUE)
1652 priv->SetRFPowerStateInProgress = TRUE;
1654 // TODO: Emily, 2006.11.21, we should rewrite this function
1656 if(RFPowerState==RF_SHUT_DOWN)
1658 RFPowerState=RF_OFF;
1663 priv->RFPowerState = RFPowerState;
1664 switch( priv->rf_chip )
1668 switch( RFPowerState )
1682 switch( RFPowerState )
1691 for(eRFPath=(RF90_RADIO_PATH_E)RF90_PATH_A; eRFPath < RF90_PATH_MAX; eRFPath++)
1693 if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
1696 pPhyReg = &priv->PHYRegDef[eRFPath];
1697 rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV, bRFSI_RFENV);
1698 rtl8192_setBBreg(dev, pPhyReg->rfintfo, bRFSI_RFENV, 0);
1706 }// switch( priv->rf_chip )
1708 priv->SetRFPowerStateInProgress = FALSE;
1713 //no use temp in windows driver
1715 PHY_UpdateInitialGain(
1716 struct net_device* dev
1719 struct r8192_priv *priv = ieee80211_priv(dev);
1720 //unsigned char *IGTable;
1721 //u8 DIG_CurrentInitialGain = 4;
1723 switch(priv->rf_chip)
1736 RT_TRACE(COMP_DBG, "PHY_UpdateInitialGain(): unknown rf_chip: %#X\n", priv->rf_chip);
1742 //YJ,modified,090107
1743 void PHY_GetHWRegOriginalValue(struct net_device* dev)
1745 struct r8192_priv *priv = ieee80211_priv(dev);
1747 // read tx power offset
1749 priv->MCSTxPowerLevelOriginalOffset[0] =
1750 rtl8192_QueryBBReg(dev, rTxAGC_Rate18_06, bMaskDWord);
1751 priv->MCSTxPowerLevelOriginalOffset[1] =
1752 rtl8192_QueryBBReg(dev, rTxAGC_Rate54_24, bMaskDWord);
1753 priv->MCSTxPowerLevelOriginalOffset[2] =
1754 rtl8192_QueryBBReg(dev, rTxAGC_Mcs03_Mcs00, bMaskDWord);
1755 priv->MCSTxPowerLevelOriginalOffset[3] =
1756 rtl8192_QueryBBReg(dev, rTxAGC_Mcs07_Mcs04, bMaskDWord);
1757 priv->MCSTxPowerLevelOriginalOffset[4] =
1758 rtl8192_QueryBBReg(dev, rTxAGC_Mcs11_Mcs08, bMaskDWord);
1759 priv->MCSTxPowerLevelOriginalOffset[5] =
1760 rtl8192_QueryBBReg(dev, rTxAGC_Mcs15_Mcs12, bMaskDWord);
1763 priv->MCSTxPowerLevelOriginalOffset[6] =
1764 rtl8192_QueryBBReg(dev, rTxAGC_CCK_Mcs32, bMaskDWord);
1765 RT_TRACE(COMP_INIT, "Legacy OFDM =%08x/%08x HT_OFDM=%08x/%08x/%08x/%08x\n",
1766 priv->MCSTxPowerLevelOriginalOffset[0], priv->MCSTxPowerLevelOriginalOffset[1] ,
1767 priv->MCSTxPowerLevelOriginalOffset[2], priv->MCSTxPowerLevelOriginalOffset[3] ,
1768 priv->MCSTxPowerLevelOriginalOffset[4], priv->MCSTxPowerLevelOriginalOffset[5] );
1770 // read rx initial gain
1771 priv->DefaultInitialGain[0] = rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1, bMaskByte0);
1772 priv->DefaultInitialGain[1] = rtl8192_QueryBBReg(dev, rOFDM0_XBAGCCore1, bMaskByte0);
1773 priv->DefaultInitialGain[2] = rtl8192_QueryBBReg(dev, rOFDM0_XCAGCCore1, bMaskByte0);
1774 priv->DefaultInitialGain[3] = rtl8192_QueryBBReg(dev, rOFDM0_XDAGCCore1, bMaskByte0);
1775 RT_TRACE(COMP_INIT, "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n",
1776 priv->DefaultInitialGain[0], priv->DefaultInitialGain[1],
1777 priv->DefaultInitialGain[2], priv->DefaultInitialGain[3]);
1780 priv->framesync = rtl8192_QueryBBReg(dev, rOFDM0_RxDetector3, bMaskByte0);
1781 priv->framesyncC34 = rtl8192_QueryBBReg(dev, rOFDM0_RxDetector2, bMaskDWord);
1782 RT_TRACE(COMP_INIT, "Default framesync (0x%x) = 0x%x \n",
1783 rOFDM0_RxDetector3, priv->framesync);
1785 //YJ,modified,090107,end
1790 * Function: phy_InitBBRFRegisterDefinition
1792 * OverView: Initialize Register definition offset for Radio Path A/B/C/D
1799 * Note: The initialization value is constant and it should never be changes
1802 static void phy_InitBBRFRegisterDefinition( struct net_device* dev)
1804 struct r8192_priv *priv = ieee80211_priv(dev);
1806 // RF Interface Sowrtware Control
1807 priv->PHYRegDef[RF90_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870
1808 priv->PHYRegDef[RF90_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872)
1809 priv->PHYRegDef[RF90_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 LSBs if read 32-bit from 0x874
1810 priv->PHYRegDef[RF90_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876)
1812 // RF Interface Readback Value
1813 priv->PHYRegDef[RF90_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; // 16 LSBs if read 32-bit from 0x8E0
1814 priv->PHYRegDef[RF90_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2)
1815 priv->PHYRegDef[RF90_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 LSBs if read 32-bit from 0x8E4
1816 priv->PHYRegDef[RF90_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6)
1818 // RF Interface Output (and Enable)
1819 priv->PHYRegDef[RF90_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860
1820 priv->PHYRegDef[RF90_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864
1821 priv->PHYRegDef[RF90_PATH_C].rfintfo = rFPGA0_XC_RFInterfaceOE;// 16 LSBs if read 32-bit from 0x868
1822 priv->PHYRegDef[RF90_PATH_D].rfintfo = rFPGA0_XD_RFInterfaceOE;// 16 LSBs if read 32-bit from 0x86C
1824 // RF Interface (Output and) Enable
1825 priv->PHYRegDef[RF90_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862)
1826 priv->PHYRegDef[RF90_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866)
1827 priv->PHYRegDef[RF90_PATH_C].rfintfe = rFPGA0_XC_RFInterfaceOE;// 16 MSBs if read 32-bit from 0x86A (16-bit for 0x86A)
1828 priv->PHYRegDef[RF90_PATH_D].rfintfe = rFPGA0_XD_RFInterfaceOE;// 16 MSBs if read 32-bit from 0x86C (16-bit for 0x86E)
1830 //Addr of LSSI. Wirte RF register by driver
1831 priv->PHYRegDef[RF90_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter
1832 priv->PHYRegDef[RF90_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
1833 priv->PHYRegDef[RF90_PATH_C].rf3wireOffset = rFPGA0_XC_LSSIParameter;
1834 priv->PHYRegDef[RF90_PATH_D].rf3wireOffset = rFPGA0_XD_LSSIParameter;
1837 priv->PHYRegDef[RF90_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; //BB Band Select
1838 priv->PHYRegDef[RF90_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter;
1839 priv->PHYRegDef[RF90_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter;
1840 priv->PHYRegDef[RF90_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter;
1842 // Tx AGC Gain Stage (same for all path. Should we remove this?)
1843 priv->PHYRegDef[RF90_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
1844 priv->PHYRegDef[RF90_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
1845 priv->PHYRegDef[RF90_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
1846 priv->PHYRegDef[RF90_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
1848 // Tranceiver A~D HSSI Parameter-1
1849 priv->PHYRegDef[RF90_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; //wire control parameter1
1850 priv->PHYRegDef[RF90_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; //wire control parameter1
1851 priv->PHYRegDef[RF90_PATH_C].rfHSSIPara1 = rFPGA0_XC_HSSIParameter1; //wire control parameter1
1852 priv->PHYRegDef[RF90_PATH_D].rfHSSIPara1 = rFPGA0_XD_HSSIParameter1; //wire control parameter1
1854 // Tranceiver A~D HSSI Parameter-2
1855 priv->PHYRegDef[RF90_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2
1856 priv->PHYRegDef[RF90_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2
1857 priv->PHYRegDef[RF90_PATH_C].rfHSSIPara2 = rFPGA0_XC_HSSIParameter2; //wire control parameter2
1858 priv->PHYRegDef[RF90_PATH_D].rfHSSIPara2 = rFPGA0_XD_HSSIParameter2; //wire control parameter1
1860 // RF switch Control
1861 priv->PHYRegDef[RF90_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; //TR/Ant switch control
1862 priv->PHYRegDef[RF90_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl;
1863 priv->PHYRegDef[RF90_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl;
1864 priv->PHYRegDef[RF90_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl;
1867 priv->PHYRegDef[RF90_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1;
1868 priv->PHYRegDef[RF90_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1;
1869 priv->PHYRegDef[RF90_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1;
1870 priv->PHYRegDef[RF90_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1;
1873 priv->PHYRegDef[RF90_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2;
1874 priv->PHYRegDef[RF90_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2;
1875 priv->PHYRegDef[RF90_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2;
1876 priv->PHYRegDef[RF90_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2;
1879 priv->PHYRegDef[RF90_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance;
1880 priv->PHYRegDef[RF90_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance;
1881 priv->PHYRegDef[RF90_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance;
1882 priv->PHYRegDef[RF90_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance;
1885 priv->PHYRegDef[RF90_PATH_A].rfRxAFE = rOFDM0_XARxAFE;
1886 priv->PHYRegDef[RF90_PATH_B].rfRxAFE = rOFDM0_XBRxAFE;
1887 priv->PHYRegDef[RF90_PATH_C].rfRxAFE = rOFDM0_XCRxAFE;
1888 priv->PHYRegDef[RF90_PATH_D].rfRxAFE = rOFDM0_XDRxAFE;
1891 priv->PHYRegDef[RF90_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance;
1892 priv->PHYRegDef[RF90_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance;
1893 priv->PHYRegDef[RF90_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance;
1894 priv->PHYRegDef[RF90_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance;
1897 priv->PHYRegDef[RF90_PATH_A].rfTxAFE = rOFDM0_XATxAFE;
1898 priv->PHYRegDef[RF90_PATH_B].rfTxAFE = rOFDM0_XBTxAFE;
1899 priv->PHYRegDef[RF90_PATH_C].rfTxAFE = rOFDM0_XCTxAFE;
1900 priv->PHYRegDef[RF90_PATH_D].rfTxAFE = rOFDM0_XDTxAFE;
1902 // Tranceiver LSSI Readback SI mode
1903 priv->PHYRegDef[RF90_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
1904 priv->PHYRegDef[RF90_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
1905 priv->PHYRegDef[RF90_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack;
1906 priv->PHYRegDef[RF90_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack;
1908 // Tranceiver LSSI Readback PI mode
1909 priv->PHYRegDef[RF90_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
1910 priv->PHYRegDef[RF90_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;
1911 //pHalData->PHYRegDef[RF90_PATH_C].rfLSSIReadBackPi = rFPGA0_XC_LSSIReadBack;
1912 //pHalData->PHYRegDef[RF90_PATH_D].rfLSSIReadBackPi = rFPGA0_XD_LSSIReadBack;
1918 // Description: Change RF power state.
1920 // Assumption: This function must be executed in re-schdulable context,
1921 // ie. PASSIVE_LEVEL.
1923 // 050823, by rcnjko.
1924 //not understand it seem's use in init
1925 //SetHwReg8192SUsb--->HalFunc.SetHwRegHandler
1926 bool PHY_SetRFPowerState(struct net_device* dev, RT_RF_POWER_STATE eRFPowerState)
1928 struct r8192_priv *priv = ieee80211_priv(dev);
1929 bool bResult = FALSE;
1931 RT_TRACE(COMP_RF, "---------> PHY_SetRFPowerState(): eRFPowerState(%d)\n", eRFPowerState);
1933 if(eRFPowerState == priv->ieee80211->eRFPowerState)
1935 RT_TRACE(COMP_RF, "<--------- PHY_SetRFPowerState(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState);
1939 bResult = phy_SetRFPowerState8192SU(dev, eRFPowerState);
1941 RT_TRACE(COMP_RF, "<--------- PHY_SetRFPowerState(): bResult(%d)\n", bResult);
1947 static bool phy_SetRFPowerState8192SU(struct net_device* dev,RT_RF_POWER_STATE eRFPowerState)
1949 struct r8192_priv *priv = ieee80211_priv(dev);
1950 bool bResult = TRUE;
1955 if(priv->SetRFPowerStateInProgress == TRUE)
1958 priv->SetRFPowerStateInProgress = TRUE;
1960 switch(priv->rf_chip )
1963 switch( eRFPowerState )
1966 write_nic_dword(dev, WFM5, FW_BB_RESET_ENABLE);
1967 write_nic_word(dev, CMDR, 0x37FC);
1968 write_nic_byte(dev, PHY_CCA, 0x3);
1969 write_nic_byte(dev, TXPAUSE, 0x00);
1970 write_nic_byte(dev, SPS1_CTRL, 0x64);
1974 // In current solution, RFSleep=RFOff in order to save power under 802.11 power save.
1975 // By Bruce, 2008-01-16.
1979 if (priv->ieee80211->eRFPowerState == eRfSleep || priv->ieee80211->eRFPowerState == eRfOff)
1982 // Make sure BusyQueue is empty befor turn off RFE pwoer.
1983 for(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; )
1985 if(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID]))
1992 RT_TRACE(COMP_POWER, "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID);
1997 if(i >= MAX_DOZE_WAITING_TIMES_9x)
1999 RT_TRACE(COMP_POWER, "\n\n\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID);
2005 //RF Off/Sleep sequence. Designed/tested from SD4 Scott, SD1 Grent and Jonbon.
2006 // Added by Bruce, 2008-11-22.
2008 //==================================================================
2009 // (0) Disable FW BB reset checking
2010 write_nic_dword(dev, WFM5, FW_BB_RESET_DISABLE);
2012 // (1) Switching Power Supply Register : Disable LD12 & SW12 (for IT)
2013 u1bTmp = read_nic_byte(dev, LDOV12D_CTRL);
2015 write_nic_byte(dev, LDOV12D_CTRL, u1bTmp);
2017 write_nic_byte(dev, SPS1_CTRL, 0x0);
2018 write_nic_byte(dev, TXPAUSE, 0xFF);
2020 // (2) MAC Tx/Rx enable, BB enable, CCK/OFDM enable
2021 write_nic_word(dev, CMDR, 0x77FC);
2022 write_nic_byte(dev, PHY_CCA, 0x0);
2025 write_nic_word(dev, CMDR, 0x37FC);
2028 write_nic_word(dev, CMDR, 0x77FC);
2031 // (3) Reset BB TRX blocks
2032 write_nic_word(dev, CMDR, 0x57FC);
2037 //RT_ASSERT(FALSE, ("phy_SetRFPowerState8192SU(): unknow state to set: 0x%X!!!\n", eRFPowerState));
2043 priv->ieee80211->eRFPowerState = eRFPowerState;
2047 // Update current RF state variable.
2048 priv->ieee80211->eRFPowerState = eRFPowerState;
2050 switch(priv->rf_chip )
2053 switch(priv->ieee80211->eRFPowerState)
2057 //If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015
2059 if(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS )
2061 dev->HalFunc.LedControlHandler(dev,LED_CTL_NO_LINK);
2065 // Turn off LED if RF is not ON.
2066 dev->HalFunc.LedControlHandler(dev, LED_CTL_POWER_OFF);
2071 // Turn on RF we are still linked, which might happen when
2072 // we quickly turn off and on HW RF. 2006.05.12, by rcnjko.
2073 if( pMgntInfo->bMediaConnect == TRUE )
2075 dev->HalFunc.LedControlHandler(dev, LED_CTL_LINK);
2079 // Turn off LED if RF is not ON.
2080 dev->HalFunc.LedControlHandler(dev, LED_CTL_NO_LINK);
2092 RT_TRACE(COMP_RF, "phy_SetRFPowerState8192SU(): Unknown RF type\n");
2097 priv->SetRFPowerStateInProgress = FALSE;
2102 /*-----------------------------------------------------------------------------
2103 * Function: GetTxPowerLevel8190()
2105 * Overview: This function is export to "common" moudule
2107 * Input: PADAPTER Adapter
2108 * psByte Power Level
2114 *---------------------------------------------------------------------------*/
2117 PHY_GetTxPowerLevel8192S(
2118 struct net_device* dev,
2122 struct r8192_priv *priv = ieee80211_priv(dev);
2126 // Because the Tx power indexes are different, we report the maximum of them to
2127 // meet the CCX TPC request. By Bruce, 2008-01-31.
2131 TxPwrLevel = priv->CurrentCckTxPwrIdx;
2132 TxPwrDbm = phy_TxPwrIdxToDbm(dev, WIRELESS_MODE_B, TxPwrLevel);
2135 TxPwrLevel = priv->CurrentOfdm24GTxPwrIdx + priv->LegacyHTTxPowerDiff;
2137 // Compare with Legacy OFDM Tx power.
2138 if(phy_TxPwrIdxToDbm(dev, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm)
2139 TxPwrDbm = phy_TxPwrIdxToDbm(dev, WIRELESS_MODE_G, TxPwrLevel);
2142 TxPwrLevel = priv->CurrentOfdm24GTxPwrIdx;
2144 // Compare with HT OFDM Tx power.
2145 if(phy_TxPwrIdxToDbm(dev, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm)
2146 TxPwrDbm = phy_TxPwrIdxToDbm(dev, WIRELESS_MODE_N_24G, TxPwrLevel);
2148 *powerlevel = TxPwrDbm;
2151 /*-----------------------------------------------------------------------------
2152 * Function: SetTxPowerLevel8190()
2154 * Overview: This function is export to "HalCommon" moudule
2156 * Input: PADAPTER Adapter
2162 * 2008/11/04 MHC We remove EEPROM_93C56.
2163 * We need to move CCX relative code to independet file.
2164 * 2009/01/21 MHC Support new EEPROM format from SD3 requirement.
2165 *---------------------------------------------------------------------------*/
2166 void PHY_SetTxPowerLevel8192S(struct net_device* dev, u8 channel)
2168 struct r8192_priv *priv = ieee80211_priv(dev);
2169 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(dev);
2170 u8 powerlevel = (u8)EEPROM_Default_TxPower, powerlevelOFDM24G = 0x10;
2171 s8 ant_pwr_diff = 0;
2173 u8 index = (channel -1);
2174 // 2009/01/22 MH Add for new EEPROM format from SD3
2175 u8 pwrdiff[2] = {0};
2176 u8 ht20pwr[2] = {0}, ht40pwr[2] = {0};
2177 u8 rfpath = 0, rfpathnum = 2;
2179 if(priv->bTXPowerDataReadFromEEPORM == FALSE)
2183 // Read predefined TX power index in EEPROM
2185 // if(priv->epromtype == EPROM_93c46)
2188 // Mainly we use RF-A Tx Power to write the Tx Power registers, but the RF-B Tx
2189 // Power must be calculated by the antenna diff.
2190 // So we have to rewrite Antenna gain offset register here.
2191 // Please refer to BB register 0x80c
2193 // 2. For OFDM 1T or 2T
2197 powerlevel = priv->RfTxPwrLevelCck[0][index];
2199 if (priv->rf_type == RF_1T2R || priv->rf_type == RF_1T1R)
2201 // Read HT 40 OFDM TX power
2202 powerlevelOFDM24G = priv->RfTxPwrLevelOfdm1T[0][index];
2203 // RF B HT OFDM pwr-RFA HT OFDM pwr
2204 // Only one RF we need not to decide B <-> A pwr diff
2206 // Legacy<->HT pwr diff, we only care about path A.
2208 // We only assume 1T as RF path A
2210 ht20pwr[0] = ht40pwr[0] = priv->RfTxPwrLevelOfdm1T[0][index];
2212 else if (priv->rf_type == RF_2T2R)
2214 // Read HT 40 OFDM TX power
2215 powerlevelOFDM24G = priv->RfTxPwrLevelOfdm2T[0][index];
2216 // RF B HT OFDM pwr-RFA HT OFDM pwr
2217 ant_pwr_diff = priv->RfTxPwrLevelOfdm2T[1][index] -
2218 priv->RfTxPwrLevelOfdm2T[0][index];
2219 // RF B (HT OFDM pwr+legacy-ht-diff) -(RFA HT OFDM pwr+legacy-ht-diff)
2220 // We can not handle Path B&A HT/Legacy pwr diff for 92S now.
2222 //RTPRINT(FPHY, PHY_TXPWR, ("CH-%d HT40 A/B Pwr index = %x/%x(%d/%d)\n",
2223 //channel, priv->RfTxPwrLevelOfdm2T[0][index],
2224 //priv->RfTxPwrLevelOfdm2T[1][index],
2225 //priv->RfTxPwrLevelOfdm2T[0][index],
2226 //priv->RfTxPwrLevelOfdm2T[1][index]));
2228 ht20pwr[0] = ht40pwr[0] = priv->RfTxPwrLevelOfdm2T[0][index];
2229 ht20pwr[1] = ht40pwr[1] = priv->RfTxPwrLevelOfdm2T[1][index];
2233 // 2009/01/21 MH Support new EEPROM format from SD3 requirement
2234 // 2009/02/10 Cosa, Here is only for reg B/C/D to A gain diff.
2236 if (priv->EEPROMVersion == 2) // Defined by SD1 Jong
2238 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
2240 for (rfpath = 0; rfpath < rfpathnum; rfpath++)
2242 // HT 20<->40 pwr diff
2243 pwrdiff[rfpath] = priv->TxPwrHt20Diff[rfpath][index];
2245 // Calculate Antenna pwr diff
2246 if (pwrdiff[rfpath] < 8) // 0~+7
2248 #if 0//cosa, it doesn't need to add the offset here
2250 powerlevelOFDM24G += pwrdiff[rfpath];
2252 ht20pwr[rfpath] += pwrdiff[rfpath];
2254 else // index8-15=-8~-1
2256 #if 0//cosa, it doesn't need to add the offset here
2258 powerlevelOFDM24G -= (15-pwrdiff[rfpath]);
2260 ht20pwr[rfpath] -= (15-pwrdiff[rfpath]);
2264 // RF B HT OFDM pwr-RFA HT OFDM pwr
2265 if (priv->rf_type == RF_2T2R)
2266 ant_pwr_diff = ht20pwr[1] - ht20pwr[0];
2268 //RTPRINT(FPHY, PHY_TXPWR,
2269 //("HT20 to HT40 pwrdiff[A/B]=%d/%d, ant_pwr_diff=%d(B-A=%d-%d)\n",
2270 //pwrdiff[0], pwrdiff[1], ant_pwr_diff, ht20pwr[1], ht20pwr[0]));
2273 // Band Edge scheme is enabled for FCC mode
2274 if (priv->TxPwrbandEdgeFlag == 1/* && pHalData->ChannelPlan == 0*/)
2276 for (rfpath = 0; rfpath < rfpathnum; rfpath++)
2278 pwrdiff[rfpath] = 0;
2279 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
2282 pwrdiff[rfpath] = priv->TxPwrbandEdgeHt40[rfpath][0];
2283 else if (channel >= 9)
2284 pwrdiff[rfpath] = priv->TxPwrbandEdgeHt40[rfpath][1];
2286 pwrdiff[rfpath] = 0;
2288 ht40pwr[rfpath] -= pwrdiff[rfpath];
2290 else if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
2293 pwrdiff[rfpath] = priv->TxPwrbandEdgeHt20[rfpath][0];
2294 else if (channel >= 11)
2295 pwrdiff[rfpath] = priv->TxPwrbandEdgeHt20[rfpath][1];
2297 pwrdiff[rfpath] = 0;
2299 ht20pwr[rfpath] -= pwrdiff[rfpath];
2301 #if 0//cosa, it doesn't need to add the offset here
2303 powerlevelOFDM24G -= pwrdiff[rfpath];
2307 if (priv->rf_type == RF_2T2R)
2309 // HT 20/40 must decide if they need to minus BD pwr offset
2310 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
2311 ant_pwr_diff = ht40pwr[1] - ht40pwr[0];
2313 ant_pwr_diff = ht20pwr[1] - ht20pwr[0];
2315 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
2317 if (channel <= 1 || channel >= 11)
2319 //RTPRINT(FPHY, PHY_TXPWR,
2320 //("HT20 Band-edge pwrdiff[A/B]=%d/%d, ant_pwr_diff=%d(B-A=%d-%d)\n",
2321 //pwrdiff[0], pwrdiff[1], ant_pwr_diff, ht20pwr[1], ht20pwr[0]));
2326 if (channel <= 3 || channel >= 9)
2328 //RTPRINT(FPHY, PHY_TXPWR,
2329 //("HT40 Band-edge pwrdiff[A/B]=%d/%d, ant_pwr_diff=%d(B-A=%d-%d)\n",
2330 //pwrdiff[0], pwrdiff[1], ant_pwr_diff, ht40pwr[1], ht40pwr[0]));
2334 #if 0//cosa, useless
2335 // Read HT/Legacy OFDM diff
2336 legacy_ant_pwr_diff= pHalData->TxPwrLegacyHtDiff[RF90_PATH_A][index];
2340 //Cosa added for protection, the reg rFPGA0_TxGainStage
2341 // range is from 7~-8, index = 0x0~0xf
2342 if(ant_pwr_diff > 7)
2344 if(ant_pwr_diff < -8)
2347 //RTPRINT(FPHY, PHY_TXPWR,
2348 //("CCK/HT Power index = %x/%x(%d/%d), ant_pwr_diff=%d\n",
2349 //powerlevel, powerlevelOFDM24G, powerlevel, powerlevelOFDM24G, ant_pwr_diff));
2351 ant_pwr_diff &= 0xf;
2353 // Antenna TX power difference
2354 priv->AntennaTxPwDiff[2] = 0;// RF-D, don't care
2355 priv->AntennaTxPwDiff[1] = 0;// RF-C, don't care
2356 priv->AntennaTxPwDiff[0] = (u8)(ant_pwr_diff); // RF-B
2358 // Antenna gain offset from B/C/D to A
2359 u4RegValue = ( priv->AntennaTxPwDiff[2]<<8 |
2360 priv->AntennaTxPwDiff[1]<<4 |
2361 priv->AntennaTxPwDiff[0] );
2363 // Notify Tx power difference for B/C/D to A!!!
2364 rtl8192_setBBreg(dev, rFPGA0_TxGainStage, (bXBTxAGC|bXCTxAGC|bXDTxAGC), u4RegValue);
2368 // CCX 2 S31, AP control of client transmit power:
2369 // 1. We shall not exceed Cell Power Limit as possible as we can.
2370 // 2. Tolerance is +/- 5dB.
2371 // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit.
2374 // 1. 802.11h power contraint
2376 // 071011, by rcnjko.
2378 #ifdef TODO //WB, 11h has not implemented now.
2379 if( priv->ieee80211->iw_mode != IW_MODE_INFRA && priv->bWithCcxCellPwr &&
2380 channel == priv->ieee80211->current_network.channel)// & priv->ieee80211->mAssoc )
2382 u8 CckCellPwrIdx = phy_DbmToTxPwrIdx(dev, WIRELESS_MODE_B, priv->CcxCellPwr);
2383 u8 LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(dev, WIRELESS_MODE_G, priv->CcxCellPwr);
2384 u8 OfdmCellPwrIdx = phy_DbmToTxPwrIdx(dev, WIRELESS_MODE_N_24G, priv->CcxCellPwr);
2386 RT_TRACE(COMP_TXAGC,
2387 ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
2388 priv->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx));
2389 RT_TRACE(COMP_TXAGC,
2390 ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
2391 channel, powerlevel, powerlevelOFDM24G + priv->LegacyHTTxPowerDiff, powerlevelOFDM24G));
2394 if(powerlevel > CckCellPwrIdx)
2395 powerlevel = CckCellPwrIdx;
2396 // Legacy OFDM, HT OFDM
2397 if(powerlevelOFDM24G + priv->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx)
2399 if((OfdmCellPwrIdx - priv->LegacyHTTxPowerDiff) > 0)
2401 powerlevelOFDM24G = OfdmCellPwrIdx - priv->LegacyHTTxPowerDiff;
2405 powerlevelOFDM24G = 0;
2409 RT_TRACE(COMP_TXAGC,
2410 ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n",
2411 powerlevel, powerlevelOFDM24G + priv->LegacyHTTxPowerDiff, powerlevelOFDM24G));
2415 priv->CurrentCckTxPwrIdx = powerlevel;
2416 priv->CurrentOfdm24GTxPwrIdx = powerlevelOFDM24G;
2418 switch(priv->rf_chip)
2421 //PHY_SetRF8225CckTxPower(dev, powerlevel);
2422 //PHY_SetRF8225OfdmTxPower(dev, powerlevelOFDM24G);
2427 PHY_SetRF8256CCKTxPower(dev, powerlevel);
2428 PHY_SetRF8256OFDMTxPower(dev, powerlevelOFDM24G);
2433 PHY_RF6052SetCckTxPower(dev, powerlevel);
2434 PHY_RF6052SetOFDMTxPower(dev, powerlevelOFDM24G);
2447 // Update transmit power level of all channel supported.
2451 // By Bruce, 2008-02-04.
2453 bool PHY_UpdateTxPowerDbm8192S(struct net_device* dev, long powerInDbm)
2455 struct r8192_priv *priv = ieee80211_priv(dev);
2459 // TODO: A mode Tx power.
2460 u8 CckTxPwrIdx = phy_DbmToTxPwrIdx(dev, WIRELESS_MODE_B, powerInDbm);
2461 u8 OfdmTxPwrIdx = phy_DbmToTxPwrIdx(dev, WIRELESS_MODE_N_24G, powerInDbm);
2463 if(OfdmTxPwrIdx - priv->LegacyHTTxPowerDiff > 0)
2464 OfdmTxPwrIdx -= priv->LegacyHTTxPowerDiff;
2468 for(idx = 0; idx < 14; idx++)
2470 priv->TxPowerLevelCCK[idx] = CckTxPwrIdx;
2471 priv->TxPowerLevelCCK_A[idx] = CckTxPwrIdx;
2472 priv->TxPowerLevelCCK_C[idx] = CckTxPwrIdx;
2473 priv->TxPowerLevelOFDM24G[idx] = OfdmTxPwrIdx;
2474 priv->TxPowerLevelOFDM24G_A[idx] = OfdmTxPwrIdx;
2475 priv->TxPowerLevelOFDM24G_C[idx] = OfdmTxPwrIdx;
2477 for (rf_path = 0; rf_path < 2; rf_path++)
2479 priv->RfTxPwrLevelCck[rf_path][idx] = CckTxPwrIdx;
2480 priv->RfTxPwrLevelOfdm1T[rf_path][idx] = \
2481 priv->RfTxPwrLevelOfdm2T[rf_path][idx] = OfdmTxPwrIdx;
2485 PHY_SetTxPowerLevel8192S(dev, priv->chan);
2492 When beacon interval is changed, the values of the
2493 hw registers should be modified.
2494 By tynli, 2008.10.24.
2498 extern void PHY_SetBeaconHwReg( struct net_device* dev, u16 BeaconInterval)
2502 NewBeaconNum = BeaconInterval *32 - 64;
2503 //PlatformEFIOWrite4Byte(Adapter, WFM3+4, NewBeaconNum);
2504 //PlatformEFIOWrite4Byte(Adapter, WFM3, 0xB026007C);
2505 write_nic_dword(dev, WFM3+4, NewBeaconNum);
2506 write_nic_dword(dev, WFM3, 0xB026007C);
2511 // Map dBm into Tx power index according to
2512 // current HW model, for example, RF and PA, and
2513 // current wireless mode.
2514 // By Bruce, 2008-01-29.
2516 static u8 phy_DbmToTxPwrIdx(
2517 struct net_device* dev,
2518 WIRELESS_MODE WirelessMode,
2522 //struct r8192_priv *priv = ieee80211_priv(dev);
2528 // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to
2529 // 3dbm, and OFDM HT equals to 0dbm repectively.
2531 // The mapping may be different by different NICs. Do not use this formula for what needs accurate result.
2532 // By Bruce, 2008-01-29.
2534 switch(WirelessMode)
2536 case WIRELESS_MODE_B:
2540 case WIRELESS_MODE_G:
2541 case WIRELESS_MODE_N_24G:
2548 if((PowerInDbm - Offset) > 0)
2550 TxPwrIdx = (u8)((PowerInDbm - Offset) * 2);
2557 // Tx Power Index is too large.
2558 if(TxPwrIdx > MAX_TXPWR_IDX_NMODE_92S)
2559 TxPwrIdx = MAX_TXPWR_IDX_NMODE_92S;
2565 // Map Tx power index into dBm according to
2566 // current HW model, for example, RF and PA, and
2567 // current wireless mode.
2568 // By Bruce, 2008-01-29.
2570 static long phy_TxPwrIdxToDbm(
2571 struct net_device* dev,
2572 WIRELESS_MODE WirelessMode,
2576 //struct r8192_priv *priv = ieee80211_priv(dev);
2581 // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to
2582 // 3dbm, and OFDM HT equals to 0dbm repectively.
2584 // The mapping may be different by different NICs. Do not use this formula for what needs accurate result.
2585 // By Bruce, 2008-01-29.
2587 switch(WirelessMode)
2589 case WIRELESS_MODE_B:
2593 case WIRELESS_MODE_G:
2594 case WIRELESS_MODE_N_24G:
2601 PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part.
2608 PHY_ScanOperationBackup8192S(
2609 IN PADAPTER Adapter,
2614 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2615 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
2617 u1Byte initial_gain;
2623 if(!Adapter->bDriverStopped)
2627 case SCAN_OPT_BACKUP:
2629 // <Roger_Notes> We halt FW DIG and disable high ppower both two DMs here
2630 // and resume both two DMs while scan complete.
2633 Adapter->HalFunc.SetFwCmdHandler(Adapter, FW_CMD_PAUSE_DM_BY_SCAN);
2636 case SCAN_OPT_RESTORE:
2638 // <Roger_Notes> We resume DIG and enable high power both two DMs here and
2639 // recover earlier DIG settings.
2642 Adapter->HalFunc.SetFwCmdHandler(Adapter, FW_CMD_RESUME_DM_BY_SCAN);
2646 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Unknown Scan Backup Operation. \n"));
2654 void PHY_InitialGain8192S(struct net_device* dev,u8 Operation )
2657 //struct r8192_priv *priv = ieee80211_priv(dev);
2661 #if 0 // For 8192s test disable
2662 if(!dev->bDriverStopped)
2667 RT_TRACE(COMP_SCAN, DBG_LOUD, ("IG_Backup, backup the initial gain.\n"));
2668 initial_gain = priv->DefaultInitialGain[0];
2669 BitMask = bMaskByte0;
2670 if(DM_DigTable.Dig_Algorithm == DIG_ALGO_BY_FALSE_ALARM)
2671 PHY_SetMacReg(dev, UFWP, bMaskByte1, 0x8); // FW DIG OFF
2672 pMgntInfo->InitGain_Backup.XAAGCCore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1, BitMask);
2673 pMgntInfo->InitGain_Backup.XBAGCCore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XBAGCCore1, BitMask);
2674 pMgntInfo->InitGain_Backup.XCAGCCore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XCAGCCore1, BitMask);
2675 pMgntInfo->InitGain_Backup.XDAGCCore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XDAGCCore1, BitMask);
2676 BitMask = bMaskByte2;
2677 pMgntInfo->InitGain_Backup.CCA = (u8)rtl8192_QueryBBReg(dev, rCCK0_CCA, BitMask);
2679 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan InitialGainBackup 0xc50 is %x\n",pMgntInfo->InitGain_Backup.XAAGCCore1));
2680 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan InitialGainBackup 0xc58 is %x\n",pMgntInfo->InitGain_Backup.XBAGCCore1));
2681 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan InitialGainBackup 0xc60 is %x\n",pMgntInfo->InitGain_Backup.XCAGCCore1));
2682 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan InitialGainBackup 0xc68 is %x\n",pMgntInfo->InitGain_Backup.XDAGCCore1));
2683 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan InitialGainBackup 0xa0a is %x\n",pMgntInfo->InitGain_Backup.CCA));
2685 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Write scan initial gain = 0x%x \n", initial_gain));
2686 write_nic_byte(dev, rOFDM0_XAAGCCore1, initial_gain);
2687 write_nic_byte(dev, rOFDM0_XBAGCCore1, initial_gain);
2688 write_nic_byte(dev, rOFDM0_XCAGCCore1, initial_gain);
2689 write_nic_byte(dev, rOFDM0_XDAGCCore1, initial_gain);
2692 RT_TRACE(COMP_SCAN, DBG_LOUD, ("IG_Restore, restore the initial gain.\n"));
2693 BitMask = 0x7f; //Bit0~ Bit6
2694 if(DM_DigTable.Dig_Algorithm == DIG_ALGO_BY_FALSE_ALARM)
2695 PHY_SetMacReg(dev, UFWP, bMaskByte1, 0x8); // FW DIG OFF
2697 rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, BitMask, (u32)pMgntInfo->InitGain_Backup.XAAGCCore1);
2698 rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, BitMask, (u32)pMgntInfo->InitGain_Backup.XBAGCCore1);
2699 rtl8192_setBBreg(dev, rOFDM0_XCAGCCore1, BitMask, (u32)pMgntInfo->InitGain_Backup.XCAGCCore1);
2700 rtl8192_setBBreg(dev, rOFDM0_XDAGCCore1, BitMask, (u32)pMgntInfo->InitGain_Backup.XDAGCCore1);
2701 BitMask = (BIT22|BIT23);
2702 rtl8192_setBBreg(dev, rCCK0_CCA, BitMask, (u32)pMgntInfo->InitGain_Backup.CCA);
2704 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan BBInitialGainRestore 0xc50 is %x\n",pMgntInfo->InitGain_Backup.XAAGCCore1));
2705 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan BBInitialGainRestore 0xc58 is %x\n",pMgntInfo->InitGain_Backup.XBAGCCore1));
2706 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan BBInitialGainRestore 0xc60 is %x\n",pMgntInfo->InitGain_Backup.XCAGCCore1));
2707 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan BBInitialGainRestore 0xc68 is %x\n",pMgntInfo->InitGain_Backup.XDAGCCore1));
2708 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Scan BBInitialGainRestore 0xa0a is %x\n",pMgntInfo->InitGain_Backup.CCA));
2710 if(DM_DigTable.Dig_Algorithm == DIG_ALGO_BY_FALSE_ALARM)
2711 PHY_SetMacReg(dev, UFWP, bMaskByte1, 0x1); // FW DIG ON
2714 RT_TRACE(COMP_SCAN, DBG_LOUD, ("Unknown IG Operation. \n"));
2721 /*-----------------------------------------------------------------------------
2722 * Function: SetBWModeCallback8190Pci()
2724 * Overview: Timer callback function for SetSetBWMode
2726 * Input: PRT_TIMER pTimer
2732 * Note: (1) We do not take j mode into consideration now
2733 * (2) Will two workitem of "switch channel" and "switch channel bandwidth" run
2735 *---------------------------------------------------------------------------*/
2736 // use in phy only (in win it's timer)
2737 void PHY_SetBWModeCallback8192S(struct net_device *dev)
2739 struct r8192_priv *priv = ieee80211_priv(dev);
2744 // Added it for 20/40 mhz switch time evaluation by guangan 070531
2746 //u8Byte BeginTime, EndTime;
2749 RT_TRACE(COMP_SWBW, "==>SetBWModeCallback8190Pci() Switch to %s bandwidth\n", \
2750 priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz");
2752 if(priv->rf_chip == RF_PSEUDO_11N)
2754 priv->SetBWModeInProgress= FALSE;
2761 // Added it for 20/40 mhz switch time evaluation by guangan 070531
2762 //NowL = read_nic_dword(dev, TSFR);
2763 //NowH = read_nic_dword(dev, TSFR+4);
2764 //BeginTime = ((u8Byte)NowH << 32) + NowL;
2767 //3//<1>Set MAC register
2769 regBwOpMode = read_nic_byte(dev, BW_OPMODE);
2770 regRRSR_RSC = read_nic_byte(dev, RRSR+2);
2772 switch(priv->CurrentChannelBW)
2774 case HT_CHANNEL_WIDTH_20:
2775 //if(priv->card_8192_version >= VERSION_8192S_BCUT)
2776 // write_nic_byte(dev, rFPGA0_AnalogParameter2, 0x58);
2778 regBwOpMode |= BW_OPMODE_20MHZ;
2779 // 2007/02/07 Mark by Emily becasue we have not verify whether this register works
2780 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
2783 case HT_CHANNEL_WIDTH_20_40:
2784 //if(priv->card_8192_version >= VERSION_8192S_BCUT)
2785 // write_nic_byte(dev, rFPGA0_AnalogParameter2, 0x18);
2787 regBwOpMode &= ~BW_OPMODE_20MHZ;
2788 // 2007/02/07 Mark by Emily becasue we have not verify whether this register works
2789 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
2790 regRRSR_RSC = (regRRSR_RSC&0x90) |(priv->nCur40MhzPrimeSC<<5);
2791 write_nic_byte(dev, RRSR+2, regRRSR_RSC);
2795 RT_TRACE(COMP_DBG, "SetBWModeCallback8190Pci():\
2796 unknown Bandwidth: %#X\n",priv->CurrentChannelBW);
2801 //3//<2>Set PHY related register
2803 switch(priv->CurrentChannelBW)
2806 case HT_CHANNEL_WIDTH_20:
2807 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x0);
2808 rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x0);
2810 // Correct the tx power for CCK rate in 40M. Suggest by YN, 20071207
2811 // It is set in Tx descriptor for 8192x series
2812 //write_nic_dword(dev, rCCK0_TxFilter1, 0x1a1b0000);
2813 //write_nic_dword(dev, rCCK0_TxFilter2, 0x090e1317);
2814 //write_nic_dword(dev, rCCK0_DebugPort, 0x00000204);
2816 rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0000);
2817 rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, 0x090e1317);
2818 rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskDWord, 0x00000204);
2819 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00300000, 3);
2822 if (priv->card_8192_version >= VERSION_8192S_BCUT)
2823 write_nic_byte(dev, rFPGA0_AnalogParameter2, 0x58);
2829 case HT_CHANNEL_WIDTH_20_40:
2830 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x1);
2831 rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x1);
2833 // Correct the tx power for CCK rate in 40M. Suggest by YN, 20071207
2834 //write_nic_dword(dev, rCCK0_TxFilter1, 0x35360000);
2835 //write_nic_dword(dev, rCCK0_TxFilter2, 0x121c252e);
2836 //write_nic_dword(dev, rCCK0_DebugPort, 0x00000409);
2838 rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskDWord, 0x35360000);
2839 rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, 0x121c252e);
2840 rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskDWord, 0x00000409);
2843 // Set Control channel to upper or lower. These settings are required only for 40MHz
2844 rtl8192_setBBreg(dev, rCCK0_System, bCCKSideBand, (priv->nCur40MhzPrimeSC>>1));
2845 rtl8192_setBBreg(dev, rOFDM1_LSTF, 0xC00, priv->nCur40MhzPrimeSC);
2847 //rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00300000, 3);
2848 if (priv->card_8192_version >= VERSION_8192S_BCUT)
2849 write_nic_byte(dev, rFPGA0_AnalogParameter2, 0x18);
2854 RT_TRACE(COMP_DBG, "SetBWModeCallback8190Pci(): unknown Bandwidth: %#X\n"\
2855 ,priv->CurrentChannelBW);
2859 //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315
2861 // Added it for 20/40 mhz switch time evaluation by guangan 070531
2862 //NowL = read_nic_dword(dev, TSFR);
2863 //NowH = read_nic_dword(dev, TSFR+4);
2864 //EndTime = ((u8Byte)NowH << 32) + NowL;
2865 //RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWModeCallback8190Pci: time of SetBWMode = %I64d us!\n", (EndTime - BeginTime)));
2867 //3<3>Set RF related register
2868 switch( priv->rf_chip )
2871 //PHY_SetRF8225Bandwidth(dev, priv->CurrentChannelBW);
2875 // Please implement this function in Hal8190PciPhy8256.c
2876 //PHY_SetRF8256Bandwidth(dev, priv->CurrentChannelBW);
2880 // Please implement this function in Hal8190PciPhy8258.c
2881 // PHY_SetRF8258Bandwidth();
2889 PHY_RF6052SetBandwidth(dev, priv->CurrentChannelBW);
2892 printk("Unknown rf_chip: %d\n", priv->rf_chip);
2896 priv->SetBWModeInProgress= FALSE;
2898 RT_TRACE(COMP_SWBW, "<==SetBWModeCallback8190Pci() \n" );
2902 /*-----------------------------------------------------------------------------
2903 * Function: SetBWMode8190Pci()
2905 * Overview: This function is export to "HalCommon" moudule
2907 * Input: PADAPTER Adapter
2908 * HT_CHANNEL_WIDTH Bandwidth //20M or 40M
2914 * Note: We do not take j mode into consideration now
2915 *---------------------------------------------------------------------------*/
2916 //extern void PHY_SetBWMode8192S( struct net_device* dev,
2917 // HT_CHANNEL_WIDTH Bandwidth, // 20M or 40M
2918 // HT_EXTCHNL_OFFSET Offset // Upper, Lower, or Don't care
2919 void rtl8192_SetBWMode(struct net_device *dev, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET Offset)
2921 struct r8192_priv *priv = ieee80211_priv(dev);
2922 HT_CHANNEL_WIDTH tmpBW = priv->CurrentChannelBW;
2925 // Modified it for 20/40 mhz switch by guangan 070531
2929 //if(priv->SwChnlInProgress)
2930 // if(pMgntInfo->bScanInProgress)
2932 // RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWMode8190Pci() %s Exit because bScanInProgress!\n",
2933 // Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"));
2937 // if(priv->SetBWModeInProgress)
2939 // // Modified it for 20/40 mhz switch by guangan 070531
2940 // RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWMode8190Pci() %s cancel last timer because SetBWModeInProgress!\n",
2941 // Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"));
2942 // PlatformCancelTimer(dev, &priv->SetBWModeTimer);
2946 if(priv->SetBWModeInProgress)
2949 priv->SetBWModeInProgress= TRUE;
2951 priv->CurrentChannelBW = Bandwidth;
2953 if(Offset==HT_EXTCHNL_OFFSET_LOWER)
2954 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
2955 else if(Offset==HT_EXTCHNL_OFFSET_UPPER)
2956 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
2958 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
2961 if(!priv->bDriverStopped)
2964 PlatformScheduleWorkItem(&(priv->SetBWModeWorkItem));//SetBWModeCallback8192SUsbWorkItem
2966 PlatformSetTimer(dev, &(priv->SetBWModeTimer), 0);//PHY_SetBWModeCallback8192S
2970 if((priv->up) )// && !(RT_CANNOT_IO(Adapter) && Adapter->bInSetPower) )
2972 #if defined(RTL8192SU)
2973 SetBWModeCallback8192SUsbWorkItem(dev);
2978 RT_TRACE(COMP_SCAN, "PHY_SetBWMode8192S() SetBWModeInProgress FALSE driver sleep or unload\n");
2979 priv->SetBWModeInProgress= FALSE;
2980 priv->CurrentChannelBW = tmpBW;
2984 // use in phy only (in win it's timer)
2985 void PHY_SwChnlCallback8192S(struct net_device *dev)
2988 struct r8192_priv *priv = ieee80211_priv(dev);
2992 RT_TRACE(COMP_CH, "==>SwChnlCallback8190Pci(), switch to channel %d\n", priv->chan);
2997 if(priv->rf_chip == RF_PSEUDO_11N)
2999 priv->SwChnlInProgress=FALSE;
3000 return; //return immediately if it is peudo-phy
3004 if(!priv->SwChnlInProgress)
3007 //if(!phy_SwChnlStepByStep(dev, priv->CurrentChannel, &priv->SwChnlStage, &priv->SwChnlStep, &delay))
3008 if(!phy_SwChnlStepByStep(dev, priv->chan, &priv->SwChnlStage, &priv->SwChnlStep, &delay))
3013 //PlatformSetTimer(dev, &priv->SwChnlTimer, delay);
3014 //mod_timer(&priv->SwChnlTimer, jiffies + MSECS(delay));
3015 //==>PHY_SwChnlCallback8192S(dev); for 92se
3016 //==>SwChnlCallback8192SUsb(dev) for 92su
3023 priv->SwChnlInProgress=FALSE;
3029 // Call after initialization
3030 //extern void PHY_SwChnl8192S(struct net_device* dev, u8 channel)
3031 u8 rtl8192_phy_SwChnl(struct net_device* dev, u8 channel)
3033 struct r8192_priv *priv = ieee80211_priv(dev);
3034 //u8 tmpchannel =channel;
3035 //bool bResult = false;
3040 if(priv->SwChnlInProgress)
3043 if(priv->SetBWModeInProgress)
3046 //--------------------------------------------
3047 switch(priv->ieee80211->mode)
3049 case WIRELESS_MODE_A:
3050 case WIRELESS_MODE_N_5G:
3052 RT_TRACE(COMP_ERR, "WIRELESS_MODE_A but channel<=14");
3057 case WIRELESS_MODE_B:
3059 RT_TRACE(COMP_ERR, "WIRELESS_MODE_B but channel>14");
3064 case WIRELESS_MODE_G:
3065 case WIRELESS_MODE_N_24G:
3067 RT_TRACE(COMP_ERR, "WIRELESS_MODE_G but channel>14");
3073 ;//RT_TRACE(COMP_ERR, "Invalid WirelessMode(%#x)!!\n", priv->ieee80211->mode);
3076 //--------------------------------------------
3078 priv->SwChnlInProgress = TRUE;
3084 priv->SwChnlStage=0;
3087 if((priv->up))// && !(RT_CANNOT_IO(Adapter) && Adapter->bInSetPower))
3089 #if defined(RTL8192SU)
3090 SwChnlCallback8192SUsbWorkItem(dev);
3095 RT_TRACE(COMP_SCAN, "PHY_SwChnl8192S SwChnlInProgress TRUE schdule workitem done\n");
3099 RT_TRACE(COMP_SCAN, "PHY_SwChnl8192S SwChnlInProgress FALSE schdule workitem error\n");
3100 priv->SwChnlInProgress = false;
3101 priv->CurrentChannel = tmpchannel;
3107 RT_TRACE(COMP_SCAN, "PHY_SwChnl8192S SwChnlInProgress FALSE driver sleep or unload\n");
3108 priv->SwChnlInProgress = false;
3109 //priv->CurrentChannel = tmpchannel;
3117 // Switch channel synchronously. Called by SwChnlByDelayHandler.
3119 // Implemented by Bruce, 2008-02-14.
3120 // The following procedure is operted according to SwChanlCallback8190Pci().
3121 // However, this procedure is performed synchronously which should be running under
3125 void PHY_SwChnlPhy8192S( // Only called during initialize
3126 struct net_device* dev,
3130 struct r8192_priv *priv = ieee80211_priv(dev);
3132 RT_TRACE(COMP_SCAN, "==>PHY_SwChnlPhy8192S(), switch to channel %d.\n", priv->chan);
3136 if(RT_CANNOT_IO(dev))
3140 // Channel Switching is in progress.
3141 if(priv->SwChnlInProgress)
3144 //return immediately if it is peudo-phy
3145 if(priv->rf_chip == RF_PSEUDO_11N)
3147 priv->SwChnlInProgress=FALSE;
3151 priv->SwChnlInProgress = TRUE;
3157 priv->SwChnlStage = 0;
3158 priv->SwChnlStep = 0;
3160 phy_FinishSwChnlNow(dev,channel);
3162 priv->SwChnlInProgress = FALSE;
3167 phy_SetSwChnlCmdArray(
3168 SwChnlCmd* CmdTable,
3179 if(CmdTable == NULL)
3181 //RT_ASSERT(FALSE, ("phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n"));
3184 if(CmdTableIdx >= CmdTableSz)
3187 // ("phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%d, CmdTableSz:%d\n",
3188 //CmdTableIdx, CmdTableSz));
3192 pCmd = CmdTable + CmdTableIdx;
3193 pCmd->CmdID = CmdID;
3194 pCmd->Para1 = Para1;
3195 pCmd->Para2 = Para2;
3196 pCmd->msDelay = msDelay;
3203 phy_SwChnlStepByStep(
3204 struct net_device* dev,
3211 struct r8192_priv *priv = ieee80211_priv(dev);
3212 //PCHANNEL_ACCESS_SETTING pChnlAccessSetting;
3213 SwChnlCmd PreCommonCmd[MAX_PRECMD_CNT];
3214 u32 PreCommonCmdCnt;
3215 SwChnlCmd PostCommonCmd[MAX_POSTCMD_CNT];
3216 u32 PostCommonCmdCnt;
3217 SwChnlCmd RfDependCmd[MAX_RFDEPENDCMD_CNT];
3219 SwChnlCmd *CurrentCmd = NULL;
3222 //RT_ASSERT((dev != NULL), ("Adapter should not be NULL\n"));
3223 //RT_ASSERT(IsLegalChannel(dev, channel), ("illegal channel: %d\n", channel));
3224 RT_TRACE(COMP_CH, "===========>%s(), channel:%d, stage:%d, step:%d\n", __FUNCTION__, channel, *stage, *step);
3225 //RT_ASSERT((pHalData != NULL), ("pHalData should not be NULL\n"));
3226 if (!IsLegalChannel(priv->ieee80211, channel))
3228 RT_TRACE(COMP_ERR, "=============>set to illegal channel:%d\n", channel);
3229 return true; //return true to tell upper caller function this channel setting is finished! Or it will in while loop.
3232 //pChnlAccessSetting = &Adapter->MgntInfo.Info8185.ChannelAccessSetting;
3233 //RT_ASSERT((pChnlAccessSetting != NULL), ("pChnlAccessSetting should not be NULL\n"));
3235 //for(eRFPath = RF90_PATH_A; eRFPath <priv->NumTotalRFPath; eRFPath++)
3236 //for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
3238 // <1> Fill up pre common command.
3239 PreCommonCmdCnt = 0;
3240 phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,
3241 CmdID_SetTxPowerLevel, 0, 0, 0);
3242 phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,
3243 CmdID_End, 0, 0, 0);
3245 // <2> Fill up post common command.
3246 PostCommonCmdCnt = 0;
3248 phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT,
3249 CmdID_End, 0, 0, 0);
3251 // <3> Fill up RF dependent command.
3253 switch( priv->rf_chip )
3256 if (channel < 1 || channel > 14)
3257 RT_TRACE(COMP_ERR, "illegal channel for zebra:%d\n", channel);
3258 //RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel));
3259 // 2008/09/04 MH Change channel.
3260 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
3261 CmdID_RF_WriteReg, rRfChannel, channel, 10);
3262 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
3263 CmdID_End, 0, 0, 0);
3267 if (channel < 1 || channel > 14)
3268 RT_TRACE(COMP_ERR, "illegal channel for zebra:%d\n", channel);
3269 // TEST!! This is not the table for 8256!!
3270 //RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel));
3271 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
3272 CmdID_RF_WriteReg, rRfChannel, channel, 10);
3273 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
3274 CmdID_End, 0, 0, 0);
3278 if (channel < 1 || channel > 14)
3279 RT_TRACE(COMP_ERR, "illegal channel for zebra:%d\n", channel);
3280 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
3281 CmdID_RF_WriteReg, RF_CHNLBW, channel, 10);
3282 phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
3283 CmdID_End, 0, 0, 0);
3290 //RT_ASSERT(FALSE, ("Unknown rf_chip: %d\n", priv->rf_chip));
3300 CurrentCmd=&PreCommonCmd[*step];
3303 CurrentCmd=&RfDependCmd[*step];
3306 CurrentCmd=&PostCommonCmd[*step];
3310 if(CurrentCmd->CmdID==CmdID_End)
3324 switch(CurrentCmd->CmdID)
3326 case CmdID_SetTxPowerLevel:
3327 //if(priv->card_8192_version > VERSION_8190_BD)
3328 PHY_SetTxPowerLevel8192S(dev,channel);
3330 case CmdID_WritePortUlong:
3331 write_nic_dword(dev, CurrentCmd->Para1, CurrentCmd->Para2);
3333 case CmdID_WritePortUshort:
3334 write_nic_word(dev, CurrentCmd->Para1, (u16)CurrentCmd->Para2);
3336 case CmdID_WritePortUchar:
3337 write_nic_byte(dev, CurrentCmd->Para1, (u8)CurrentCmd->Para2);
3339 case CmdID_RF_WriteReg: // Only modify channel for the register now !!!!!
3340 for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
3342 #if defined RTL8192SU
3343 // For new T65 RF 0222d register 0x18 bit 0-9 = channel number.
3344 rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, 0x1f, (CurrentCmd->Para2));
3345 //printk("====>%x, %x, read_back:%x\n", CurrentCmd->Para2,CurrentCmd->Para1, rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, 0x1f));
3347 rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, ((CurrentCmd->Para2)<<7));
3357 //cosa }/*for(Number of RF paths)*/
3359 (*delay)=CurrentCmd->msDelay;
3361 RT_TRACE(COMP_CH, "<===========%s(), channel:%d, stage:%d, step:%d\n", __FUNCTION__, channel, *stage, *step);
3365 //called PHY_SwChnlPhy8192S, SwChnlCallback8192SUsbWorkItem
3368 phy_FinishSwChnlNow( // We should not call this function directly
3369 struct net_device* dev,
3373 struct r8192_priv *priv = ieee80211_priv(dev);
3376 while(!phy_SwChnlStepByStep(dev,channel,&priv->SwChnlStage,&priv->SwChnlStep,&delay))
3386 /*-----------------------------------------------------------------------------
3387 * Function: PHYCheckIsLegalRfPath8190Pci()
3389 * Overview: Check different RF type to execute legal judgement. If RF Path is illegal
3390 * We will return false.
3400 * 11/15/2007 MHC Create Version 0.
3402 *---------------------------------------------------------------------------*/
3403 //called by rtl8192_phy_QueryRFReg, rtl8192_phy_SetRFReg, PHY_SetRFPowerState8192SUsb
3405 //PHY_CheckIsLegalRfPath8192S(
3406 // struct net_device* dev,
3408 u8 rtl8192_phy_CheckIsLegalRFPath(struct net_device* dev, u32 eRFPath)
3410 // struct r8192_priv *priv = ieee80211_priv(dev);
3411 bool rtValue = TRUE;
3413 // NOt check RF Path now.!
3415 if (priv->rf_type == RF_1T2R && eRFPath != RF90_PATH_A)
3419 if (priv->rf_type == RF_1T2R && eRFPath != RF90_PATH_A)
3426 } /* PHY_CheckIsLegalRfPath8192S */
3430 /*-----------------------------------------------------------------------------
3431 * Function: PHY_IQCalibrate8192S()
3433 * Overview: After all MAC/PHY/RF is configued. We must execute IQ calibration
3434 * to improve RF EVM!!?
3436 * Input: IN PADAPTER pAdapter
3444 * 10/07/2008 MHC Create. Document from SD3 RFSI Jenyu.
3446 *---------------------------------------------------------------------------*/
3447 //called by InitializeAdapter8192SE
3449 PHY_IQCalibrate( struct net_device* dev)
3451 //struct r8192_priv *priv = ieee80211_priv(dev);
3457 // 1. Check QFN68 or 64 92S (Read from EEPROM)
3462 // For 1T2R IQK only now !!!
3463 for (i = 0; i < 10; i++)
3466 rtl8192_setBBreg(dev, 0xc04, bMaskDWord, 0x00a05430);
3467 //PlatformStallExecution(5);
3469 rtl8192_setBBreg(dev, 0xc08, bMaskDWord, 0x000800e4);
3471 rtl8192_setBBreg(dev, 0xe28, bMaskDWord, 0x80800000);
3473 rtl8192_setBBreg(dev, 0xe40, bMaskDWord, 0x02140148);
3475 rtl8192_setBBreg(dev, 0xe44, bMaskDWord, 0x681604a2);
3477 rtl8192_setBBreg(dev, 0xe4c, bMaskDWord, 0x000028d1);
3479 rtl8192_setBBreg(dev, 0xe60, bMaskDWord, 0x0214014d);
3481 rtl8192_setBBreg(dev, 0xe64, bMaskDWord, 0x281608ba);
3483 rtl8192_setBBreg(dev, 0xe6c, bMaskDWord, 0x000028d1);
3485 rtl8192_setBBreg(dev, 0xe48, bMaskDWord, 0xfb000001);
3487 rtl8192_setBBreg(dev, 0xe48, bMaskDWord, 0xf8000001);
3489 rtl8192_setBBreg(dev, 0xc04, bMaskDWord, 0x00a05433);
3491 rtl8192_setBBreg(dev, 0xc08, bMaskDWord, 0x000000e4);
3493 rtl8192_setBBreg(dev, 0xe28, bMaskDWord, 0x0);
3496 reg = rtl8192_QueryBBReg(dev, 0xeac, bMaskDWord);
3498 // Readback IQK value and rewrite
3499 if (!(reg&(BIT27|BIT28|BIT30|BIT31)))
3501 old_value = (rtl8192_QueryBBReg(dev, 0xc80, bMaskDWord) & 0x3FF);
3503 // Calibrate init gain for A path for TX0
3504 X = (rtl8192_QueryBBReg(dev, 0xe94, bMaskDWord) & 0x03FF0000)>>16;
3505 TXA[RF90_PATH_A] = (X * old_value)/0x100;
3506 reg = rtl8192_QueryBBReg(dev, 0xc80, bMaskDWord);
3507 reg = (reg & 0xFFFFFC00) | (u32)TXA[RF90_PATH_A];
3508 rtl8192_setBBreg(dev, 0xc80, bMaskDWord, reg);
3511 // Calibrate init gain for C path for TX0
3512 Y = ( rtl8192_QueryBBReg(dev, 0xe9C, bMaskDWord) & 0x03FF0000)>>16;
3513 TX0[RF90_PATH_C] = ((Y * old_value)/0x100);
3514 reg = rtl8192_QueryBBReg(dev, 0xc80, bMaskDWord);
3515 reg = (reg & 0xffc0ffff) |((u32) (TX0[RF90_PATH_C]&0x3F)<<16);
3516 rtl8192_setBBreg(dev, 0xc80, bMaskDWord, reg);
3517 reg = rtl8192_QueryBBReg(dev, 0xc94, bMaskDWord);
3518 reg = (reg & 0x0fffffff) |(((Y&0x3c0)>>6)<<28);
3519 rtl8192_setBBreg(dev, 0xc94, bMaskDWord, reg);
3522 // Calibrate RX A and B for RX0
3523 reg = rtl8192_QueryBBReg(dev, 0xc14, bMaskDWord);
3524 X = (rtl8192_QueryBBReg(dev, 0xea4, bMaskDWord) & 0x03FF0000)>>16;
3525 reg = (reg & 0xFFFFFC00) |X;
3526 rtl8192_setBBreg(dev, 0xc14, bMaskDWord, reg);
3527 Y = (rtl8192_QueryBBReg(dev, 0xeac, bMaskDWord) & 0x003F0000)>>16;
3528 reg = (reg & 0xFFFF03FF) |Y<<10;
3529 rtl8192_setBBreg(dev, 0xc14, bMaskDWord, reg);
3531 old_value = (rtl8192_QueryBBReg(dev, 0xc88, bMaskDWord) & 0x3FF);
3533 // Calibrate init gain for A path for TX1 !!!!!!
3534 X = (rtl8192_QueryBBReg(dev, 0xeb4, bMaskDWord) & 0x03FF0000)>>16;
3535 reg = rtl8192_QueryBBReg(dev, 0xc88, bMaskDWord);
3536 TXA[RF90_PATH_A] = (X * old_value) / 0x100;
3537 reg = (reg & 0xFFFFFC00) | TXA[RF90_PATH_A];
3538 rtl8192_setBBreg(dev, 0xc88, bMaskDWord, reg);
3541 // Calibrate init gain for C path for TX1
3542 Y = (rtl8192_QueryBBReg(dev, 0xebc, bMaskDWord)& 0x03FF0000)>>16;
3543 TX0[RF90_PATH_C] = ((Y * old_value)/0x100);
3544 reg = rtl8192_QueryBBReg(dev, 0xc88, bMaskDWord);
3545 reg = (reg & 0xffc0ffff) |( (TX0[RF90_PATH_C]&0x3F)<<16);
3546 rtl8192_setBBreg(dev, 0xc88, bMaskDWord, reg);
3547 reg = rtl8192_QueryBBReg(dev, 0xc9c, bMaskDWord);
3548 reg = (reg & 0x0fffffff) |(((Y&0x3c0)>>6)<<28);
3549 rtl8192_setBBreg(dev, 0xc9c, bMaskDWord, reg);
3552 // Calibrate RX A and B for RX1
3553 reg = rtl8192_QueryBBReg(dev, 0xc1c, bMaskDWord);
3554 X = (rtl8192_QueryBBReg(dev, 0xec4, bMaskDWord) & 0x03FF0000)>>16;
3555 reg = (reg & 0xFFFFFC00) |X;
3556 rtl8192_setBBreg(dev, 0xc1c, bMaskDWord, reg);
3558 Y = (rtl8192_QueryBBReg(dev, 0xecc, bMaskDWord) & 0x003F0000)>>16;
3559 reg = (reg & 0xFFFF03FF) |Y<<10;
3560 rtl8192_setBBreg(dev, 0xc1c, bMaskDWord, reg);
3563 RT_TRACE(COMP_INIT, "PHY_IQCalibrate OK\n");
3571 // 3. QFN64. Not enabled now !!! We must use different gain table for 1T2R.
3577 /*-----------------------------------------------------------------------------
3578 * Function: PHY_IQCalibrateBcut()
3580 * Overview: After all MAC/PHY/RF is configued. We must execute IQ calibration
3581 * to improve RF EVM!!?
3583 * Input: IN PADAPTER pAdapter
3591 * 11/18/2008 MHC Create. Document from SD3 RFSI Jenyu.
3592 * 92S B-cut QFN 68 pin IQ calibration procedure.doc
3594 *---------------------------------------------------------------------------*/
3595 extern void PHY_IQCalibrateBcut(struct net_device* dev)
3597 //struct r8192_priv *priv = ieee80211_priv(dev);
3598 //PMGNT_INFO pMgntInfo = &pAdapter->MgntInfo;
3603 u32 calibrate_set[13] = {0};
3607 // 0. Check QFN68 or 64 92S (Read from EEPROM/EFUSE)
3610 // 1. Save e70~ee0 register setting, and load calibration setting
3613 0xee0[31:0]=0x3fed92fb;
3614 0xedc[31:0] =0x3fed92fb;
3615 0xe70[31:0] =0x3fed92fb;
3616 0xe74[31:0] =0x3fed92fb;
3617 0xe78[31:0] =0x3fed92fb;
3618 0xe7c[31:0]= 0x3fed92fb;
3619 0xe80[31:0]= 0x3fed92fb;
3620 0xe84[31:0]= 0x3fed92fb;
3621 0xe88[31:0]= 0x3fed92fb;
3622 0xe8c[31:0]= 0x3fed92fb;
3623 0xed0[31:0]= 0x3fed92fb;
3624 0xed4[31:0]= 0x3fed92fb;
3625 0xed8[31:0]= 0x3fed92fb;
3627 calibrate_set [0] = 0xee0;
3628 calibrate_set [1] = 0xedc;
3629 calibrate_set [2] = 0xe70;
3630 calibrate_set [3] = 0xe74;
3631 calibrate_set [4] = 0xe78;
3632 calibrate_set [5] = 0xe7c;
3633 calibrate_set [6] = 0xe80;
3634 calibrate_set [7] = 0xe84;
3635 calibrate_set [8] = 0xe88;
3636 calibrate_set [9] = 0xe8c;
3637 calibrate_set [10] = 0xed0;
3638 calibrate_set [11] = 0xed4;
3639 calibrate_set [12] = 0xed8;
3640 //RT_TRACE(COMP_INIT, DBG_LOUD, ("Save e70~ee0 register setting\n"));
3641 for (i = 0; i < 13; i++)
3643 load_value[i] = rtl8192_QueryBBReg(dev, calibrate_set[i], bMaskDWord);
3644 rtl8192_setBBreg(dev, calibrate_set[i], bMaskDWord, 0x3fed92fb);
3648 RfPiEnable = (u8)rtl8192_QueryBBReg(dev, rFPGA0_XA_HSSIParameter1, BIT8);
3653 // For 1T2R IQK only now !!!
3654 for (i = 0; i < 10; i++)
3656 RT_TRACE(COMP_INIT, "IQK -%d\n", i);
3657 //BB switch to PI mode. If default is PI mode, ignoring 2 commands below.
3658 if (!RfPiEnable) //if original is SI mode, then switch to PI mode.
3660 //DbgPrint("IQK Switch to PI mode\n");
3661 rtl8192_setBBreg(dev, 0x820, bMaskDWord, 0x01000100);
3662 rtl8192_setBBreg(dev, 0x828, bMaskDWord, 0x01000100);
3666 // 2. IQ calibration & LO leakage calibration
3667 rtl8192_setBBreg(dev, 0xc04, bMaskDWord, 0x00a05430);
3669 rtl8192_setBBreg(dev, 0xc08, bMaskDWord, 0x000800e4);
3671 rtl8192_setBBreg(dev, 0xe28, bMaskDWord, 0x80800000);
3673 //path-A IQ K and LO K gain setting
3674 rtl8192_setBBreg(dev, 0xe40, bMaskDWord, 0x02140102);
3676 rtl8192_setBBreg(dev, 0xe44, bMaskDWord, 0x681604c2);
3678 //set LO calibration
3679 rtl8192_setBBreg(dev, 0xe4c, bMaskDWord, 0x000028d1);
3681 //path-B IQ K and LO K gain setting
3682 rtl8192_setBBreg(dev, 0xe60, bMaskDWord, 0x02140102);
3684 rtl8192_setBBreg(dev, 0xe64, bMaskDWord, 0x28160d05);
3687 rtl8192_setBBreg(dev, 0xe48, bMaskDWord, 0xfb000000);
3689 rtl8192_setBBreg(dev, 0xe48, bMaskDWord, 0xf8000000);
3696 rtl8192_setBBreg(dev, 0xe6c, bMaskDWord, 0x020028d1);
3699 rtl8192_setBBreg(dev, 0xe48, bMaskDWord, 0xfb000000);
3701 rtl8192_setBBreg(dev, 0xe48, bMaskDWord, 0xf8000000);
3706 rtl8192_setBBreg(dev, 0xc04, bMaskDWord, 0x00a05433);
3708 rtl8192_setBBreg(dev, 0xc08, bMaskDWord, 0x000000e4);
3710 rtl8192_setBBreg(dev, 0xe28, bMaskDWord, 0x0);
3712 if (!RfPiEnable) //if original is SI mode, then switch to PI mode.
3714 //DbgPrint("IQK Switch back to SI mode\n");
3715 rtl8192_setBBreg(dev, 0x820, bMaskDWord, 0x01000000);
3716 rtl8192_setBBreg(dev, 0x828, bMaskDWord, 0x01000000);
3720 reg = rtl8192_QueryBBReg(dev, 0xeac, bMaskDWord);
3722 // 3. check fail bit, and fill BB IQ matrix
3723 // Readback IQK value and rewrite
3724 if (!(reg&(BIT27|BIT28|BIT30|BIT31)))
3726 old_value = (rtl8192_QueryBBReg(dev, 0xc80, bMaskDWord) & 0x3FF);
3728 // Calibrate init gain for A path for TX0
3729 X = (rtl8192_QueryBBReg(dev, 0xe94, bMaskDWord) & 0x03FF0000)>>16;
3730 TXA[RF90_PATH_A] = (X * old_value)/0x100;
3731 reg = rtl8192_QueryBBReg(dev, 0xc80, bMaskDWord);
3732 reg = (reg & 0xFFFFFC00) | (u32)TXA[RF90_PATH_A];
3733 rtl8192_setBBreg(dev, 0xc80, bMaskDWord, reg);
3736 // Calibrate init gain for C path for TX0
3737 Y = ( rtl8192_QueryBBReg(dev, 0xe9C, bMaskDWord) & 0x03FF0000)>>16;
3738 TX0[RF90_PATH_C] = ((Y * old_value)/0x100);
3739 reg = rtl8192_QueryBBReg(dev, 0xc80, bMaskDWord);
3740 reg = (reg & 0xffc0ffff) |((u32) (TX0[RF90_PATH_C]&0x3F)<<16);
3741 rtl8192_setBBreg(dev, 0xc80, bMaskDWord, reg);
3742 reg = rtl8192_QueryBBReg(dev, 0xc94, bMaskDWord);
3743 reg = (reg & 0x0fffffff) |(((Y&0x3c0)>>6)<<28);
3744 rtl8192_setBBreg(dev, 0xc94, bMaskDWord, reg);
3747 // Calibrate RX A and B for RX0
3748 reg = rtl8192_QueryBBReg(dev, 0xc14, bMaskDWord);
3749 X = (rtl8192_QueryBBReg(dev, 0xea4, bMaskDWord) & 0x03FF0000)>>16;
3750 reg = (reg & 0xFFFFFC00) |X;
3751 rtl8192_setBBreg(dev, 0xc14, bMaskDWord, reg);
3752 Y = (rtl8192_QueryBBReg(dev, 0xeac, bMaskDWord) & 0x003F0000)>>16;
3753 reg = (reg & 0xFFFF03FF) |Y<<10;
3754 rtl8192_setBBreg(dev, 0xc14, bMaskDWord, reg);
3756 old_value = (rtl8192_QueryBBReg(dev, 0xc88, bMaskDWord) & 0x3FF);
3758 // Calibrate init gain for A path for TX1 !!!!!!
3759 X = (rtl8192_QueryBBReg(dev, 0xeb4, bMaskDWord) & 0x03FF0000)>>16;
3760 reg = rtl8192_QueryBBReg(dev, 0xc88, bMaskDWord);
3761 TXA[RF90_PATH_A] = (X * old_value) / 0x100;
3762 reg = (reg & 0xFFFFFC00) | TXA[RF90_PATH_A];
3763 rtl8192_setBBreg(dev, 0xc88, bMaskDWord, reg);
3766 // Calibrate init gain for C path for TX1
3767 Y = (rtl8192_QueryBBReg(dev, 0xebc, bMaskDWord)& 0x03FF0000)>>16;
3768 TX0[RF90_PATH_C] = ((Y * old_value)/0x100);
3769 reg = rtl8192_QueryBBReg(dev, 0xc88, bMaskDWord);
3770 reg = (reg & 0xffc0ffff) |( (TX0[RF90_PATH_C]&0x3F)<<16);
3771 rtl8192_setBBreg(dev, 0xc88, bMaskDWord, reg);
3772 reg = rtl8192_QueryBBReg(dev, 0xc9c, bMaskDWord);
3773 reg = (reg & 0x0fffffff) |(((Y&0x3c0)>>6)<<28);
3774 rtl8192_setBBreg(dev, 0xc9c, bMaskDWord, reg);
3777 // Calibrate RX A and B for RX1
3778 reg = rtl8192_QueryBBReg(dev, 0xc1c, bMaskDWord);
3779 X = (rtl8192_QueryBBReg(dev, 0xec4, bMaskDWord) & 0x03FF0000)>>16;
3780 reg = (reg & 0xFFFFFC00) |X;
3781 rtl8192_setBBreg(dev, 0xc1c, bMaskDWord, reg);
3783 Y = (rtl8192_QueryBBReg(dev, 0xecc, bMaskDWord) & 0x003F0000)>>16;
3784 reg = (reg & 0xFFFF03FF) |Y<<10;
3785 rtl8192_setBBreg(dev, 0xc1c, bMaskDWord, reg);
3788 RT_TRACE(COMP_INIT, "PHY_IQCalibrate OK\n");
3795 // 4. Reload e70~ee0 register setting.
3797 //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reload e70~ee0 register setting.\n"));
3798 for (i = 0; i < 13; i++)
3799 rtl8192_setBBreg(dev, calibrate_set[i], bMaskDWord, load_value[i]);
3803 // 3. QFN64. Not enabled now !!! We must use different gain table for 1T2R.
3808 } // PHY_IQCalibrateBcut
3812 // Move from phycfg.c to gen.c to be code independent later
3814 //-------------------------Move to other DIR later----------------------------*/
3815 //#if (DEV_BUS_TYPE == USB_INTERFACE)
3818 // use in phy only (in win it's timer)
3819 void SwChnlCallback8192SUsb(struct net_device *dev)
3822 struct r8192_priv *priv = ieee80211_priv(dev);
3826 RT_TRACE(COMP_SCAN, "==>SwChnlCallback8190Pci(), switch to channel\
3833 if(priv->rf_chip == RF_PSEUDO_11N)
3835 priv->SwChnlInProgress=FALSE;
3836 return; //return immediately if it is peudo-phy
3840 if(!priv->SwChnlInProgress)
3843 if(!phy_SwChnlStepByStep(dev, priv->chan, &priv->SwChnlStage, &priv->SwChnlStep, &delay))
3847 //PlatformSetTimer(dev, &priv->SwChnlTimer, delay);
3855 priv->SwChnlInProgress=FALSE;
3863 // Callback routine of the work item for switch channel.
3865 // use in phy only (in win it's work)
3866 void SwChnlCallback8192SUsbWorkItem(struct net_device *dev )
3868 struct r8192_priv *priv = ieee80211_priv(dev);
3870 RT_TRACE(COMP_TRACE, "==> SwChnlCallback8192SUsbWorkItem()\n");
3872 if(pAdapter->bInSetPower && RT_USB_CANNOT_IO(pAdapter))
3874 RT_TRACE(COMP_SCAN, DBG_LOUD, ("<== SwChnlCallback8192SUsbWorkItem() SwChnlInProgress FALSE driver sleep or unload\n"));
3876 pHalData->SwChnlInProgress = FALSE;
3880 phy_FinishSwChnlNow(dev, priv->chan);
3881 priv->SwChnlInProgress = FALSE;
3883 RT_TRACE(COMP_TRACE, "<== SwChnlCallback8192SUsbWorkItem()\n");
3887 /*-----------------------------------------------------------------------------
3888 * Function: SetBWModeCallback8192SUsb()
3890 * Overview: Timer callback function for SetSetBWMode
3892 * Input: PRT_TIMER pTimer
3898 * Note: (1) We do not take j mode into consideration now
3899 * (2) Will two workitem of "switch channel" and "switch channel bandwidth" run
3901 *---------------------------------------------------------------------------*/
3902 //====>//rtl8192_SetBWMode
3903 // use in phy only (in win it's timer)
3904 void SetBWModeCallback8192SUsb(struct net_device *dev)
3906 struct r8192_priv *priv = ieee80211_priv(dev);
3909 // Added it for 20/40 mhz switch time evaluation by guangan 070531
3911 //u8Byte BeginTime, EndTime;
3914 RT_TRACE(COMP_SCAN, "==>SetBWModeCallback8190Pci() Switch to %s bandwidth\n", \
3915 priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz");
3917 if(priv->rf_chip == RF_PSEUDO_11N)
3919 priv->SetBWModeInProgress= FALSE;
3926 // Added it for 20/40 mhz switch time evaluation by guangan 070531
3927 //NowL = read_nic_dword(dev, TSFR);
3928 //NowH = read_nic_dword(dev, TSFR+4);
3929 //BeginTime = ((u8Byte)NowH << 32) + NowL;
3931 //3<1>Set MAC register
3932 regBwOpMode = read_nic_byte(dev, BW_OPMODE);
3933 regRRSR_RSC = read_nic_byte(dev, RRSR+2);
3935 switch(priv->CurrentChannelBW)
3937 case HT_CHANNEL_WIDTH_20:
3938 regBwOpMode |= BW_OPMODE_20MHZ;
3939 // 2007/02/07 Mark by Emily becasue we have not verify whether this register works
3940 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
3943 case HT_CHANNEL_WIDTH_20_40:
3944 regBwOpMode &= ~BW_OPMODE_20MHZ;
3945 // 2007/02/07 Mark by Emily becasue we have not verify whether this register works
3946 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
3948 regRRSR_RSC = (regRRSR_RSC&0x90) |(priv->nCur40MhzPrimeSC<<5);
3949 write_nic_byte(dev, RRSR+2, regRRSR_RSC);
3953 RT_TRACE(COMP_DBG, "SetChannelBandwidth8190Pci():\
3954 unknown Bandwidth: %#X\n",priv->CurrentChannelBW);
3958 //3 <2>Set PHY related register
3959 switch(priv->CurrentChannelBW)
3961 case HT_CHANNEL_WIDTH_20:
3962 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x0);
3963 rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x0);
3965 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00300000, 3);
3967 // Correct the tx power for CCK rate in 20M. Suggest by YN, 20071207
3968 //write_nic_dword(dev, rCCK0_TxFilter1, 0x1a1b0000);
3969 //write_nic_dword(dev, rCCK0_TxFilter2, 0x090e1317);
3970 //write_nic_dword(dev, rCCK0_DebugPort, 0x00000204);
3971 rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0000);
3972 rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, 0x090e1317);
3973 rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskDWord, 0x00000204);
3974 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00300000, 3);
3977 if (priv->card_8192_version >= VERSION_8192S_BCUT)
3978 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, 0xff, 0x58);
3981 case HT_CHANNEL_WIDTH_20_40:
3982 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x1);
3983 rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x1);
3984 rtl8192_setBBreg(dev, rCCK0_System, bCCKSideBand, (priv->nCur40MhzPrimeSC>>1));
3985 rtl8192_setBBreg(dev, rOFDM1_LSTF, 0xC00, priv->nCur40MhzPrimeSC);
3987 // Correct the tx power for CCK rate in 40M. Suggest by YN, 20071207
3988 //PHY_SetBBReg(Adapter, rCCK0_TxFilter1, bMaskDWord, 0x35360000);
3989 //PHY_SetBBReg(Adapter, rCCK0_TxFilter2, bMaskDWord, 0x121c252e);
3990 //PHY_SetBBReg(Adapter, rCCK0_DebugPort, bMaskDWord, 0x00000409);
3991 //PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter1, bADClkPhase, 0);
3993 if (priv->card_8192_version >= VERSION_8192S_BCUT)
3994 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, 0xff, 0x18);
3998 RT_TRACE(COMP_DBG, "SetChannelBandwidth8190Pci(): unknown Bandwidth: %#X\n"\
3999 ,priv->CurrentChannelBW);
4003 //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315
4005 // Added it for 20/40 mhz switch time evaluation by guangan 070531
4006 //NowL = read_nic_dword(dev, TSFR);
4007 //NowH = read_nic_dword(dev, TSFR+4);
4008 //EndTime = ((u8Byte)NowH << 32) + NowL;
4009 //RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWModeCallback8190Pci: time of SetBWMode = %I64d us!\n", (EndTime - BeginTime)));
4012 //3<3>Set RF related register
4013 switch( priv->rf_chip )
4016 PHY_SetRF8225Bandwidth(dev, priv->CurrentChannelBW);
4020 // Please implement this function in Hal8190PciPhy8256.c
4021 //PHY_SetRF8256Bandwidth(dev, priv->CurrentChannelBW);
4025 PHY_RF6052SetBandwidth(dev, priv->CurrentChannelBW);
4029 // Please implement this function in Hal8190PciPhy8258.c
4030 // PHY_SetRF8258Bandwidth();
4038 //RT_ASSERT(FALSE, ("Unknown rf_chip: %d\n", priv->rf_chip));
4042 priv->SetBWModeInProgress= FALSE;
4044 RT_TRACE(COMP_SCAN, "<==SetBWMode8190Pci()" );
4048 // Callback routine of the work item for set bandwidth mode.
4050 // use in phy only (in win it's work)
4051 void SetBWModeCallback8192SUsbWorkItem(struct net_device *dev)
4053 struct r8192_priv *priv = ieee80211_priv(dev);
4056 // Added it for 20/40 mhz switch time evaluation by guangan 070531
4058 //u8Byte BeginTime, EndTime;
4061 RT_TRACE(COMP_SCAN, "==>SetBWModeCallback8192SUsbWorkItem() Switch to %s bandwidth\n", \
4062 priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz");
4064 if(priv->rf_chip == RF_PSEUDO_11N)
4066 priv->SetBWModeInProgress= FALSE;
4073 // Added it for 20/40 mhz switch time evaluation by guangan 070531
4074 //NowL = read_nic_dword(dev, TSFR);
4075 //NowH = read_nic_dword(dev, TSFR+4);
4076 //BeginTime = ((u8Byte)NowH << 32) + NowL;
4078 //3<1>Set MAC register
4079 regBwOpMode = read_nic_byte(dev, BW_OPMODE);
4080 regRRSR_RSC = read_nic_byte(dev, RRSR+2);
4082 switch(priv->CurrentChannelBW)
4084 case HT_CHANNEL_WIDTH_20:
4085 regBwOpMode |= BW_OPMODE_20MHZ;
4086 // 2007/02/07 Mark by Emily becasue we have not verify whether this register works
4087 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
4090 case HT_CHANNEL_WIDTH_20_40:
4091 regBwOpMode &= ~BW_OPMODE_20MHZ;
4092 // 2007/02/07 Mark by Emily becasue we have not verify whether this register works
4093 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
4094 regRRSR_RSC = (regRRSR_RSC&0x90) |(priv->nCur40MhzPrimeSC<<5);
4095 write_nic_byte(dev, RRSR+2, regRRSR_RSC);
4100 RT_TRACE(COMP_DBG, "SetBWModeCallback8192SUsbWorkItem():\
4101 unknown Bandwidth: %#X\n",priv->CurrentChannelBW);
4105 //3 <2>Set PHY related register
4106 switch(priv->CurrentChannelBW)
4108 case HT_CHANNEL_WIDTH_20:
4109 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x0);
4110 rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x0);
4113 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bADClkPhase, 1);
4115 // Correct the tx power for CCK rate in 20M. Suggest by YN, 20071207
4116 rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0000);
4117 rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, 0x090e1317);
4118 rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskDWord, 0x00000204);
4119 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00100000, 1);
4122 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, 0xff, 0x58);
4125 case HT_CHANNEL_WIDTH_20_40:
4126 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x1);
4127 rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x1);
4129 rtl8192_setBBreg(dev, rCCK0_System, bCCKSideBand, (priv->nCur40MhzPrimeSC>>1));
4131 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bADClkPhase, 0);
4133 rtl8192_setBBreg(dev, rOFDM1_LSTF, 0xC00, priv->nCur40MhzPrimeSC);
4134 // Correct the tx power for CCK rate in 40M. Suggest by YN, 20071207
4135 rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskDWord, 0x35360000);
4136 rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, 0x121c252e);
4137 rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskDWord, 0x00000409);
4140 // Set Control channel to upper or lower. These settings are required only for 40MHz
4141 rtl8192_setBBreg(dev, rCCK0_System, bCCKSideBand, (priv->nCur40MhzPrimeSC>>1));
4142 rtl8192_setBBreg(dev, rOFDM1_LSTF, 0xC00, priv->nCur40MhzPrimeSC);
4144 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, 0xff, 0x18);
4150 RT_TRACE(COMP_DBG, "SetBWModeCallback8192SUsbWorkItem(): unknown Bandwidth: %#X\n"\
4151 ,priv->CurrentChannelBW);
4155 //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315
4157 //3<3>Set RF related register
4158 switch( priv->rf_chip )
4161 PHY_SetRF8225Bandwidth(dev, priv->CurrentChannelBW);
4165 // Please implement this function in Hal8190PciPhy8256.c
4166 //PHY_SetRF8256Bandwidth(dev, priv->CurrentChannelBW);
4170 PHY_RF6052SetBandwidth(dev, priv->CurrentChannelBW);
4174 // Please implement this function in Hal8190PciPhy8258.c
4175 // PHY_SetRF8258Bandwidth();
4183 //RT_ASSERT(FALSE, ("Unknown rf_chip: %d\n", priv->rf_chip));
4187 priv->SetBWModeInProgress= FALSE;
4189 RT_TRACE(COMP_SCAN, "<==SetBWModeCallback8192SUsbWorkItem()" );
4192 //--------------------------Move to oter DIR later-------------------------------*/
4194 void InitialGain8192S(struct net_device *dev, u8 Operation)
4197 struct r8192_priv *priv = ieee80211_priv(dev);
4203 void InitialGain819xUsb(struct net_device *dev, u8 Operation)
4205 struct r8192_priv *priv = ieee80211_priv(dev);
4207 priv->InitialGainOperateType = Operation;
4211 queue_delayed_work(priv->priv_wq,&priv->initialgain_operate_wq,0);
4215 extern void InitialGainOperateWorkItemCallBack(struct work_struct *work)
4217 struct delayed_work *dwork = container_of(work,struct delayed_work,work);
4218 struct r8192_priv *priv = container_of(dwork,struct r8192_priv,initialgain_operate_wq);
4219 struct net_device *dev = priv->ieee80211->dev;
4220 #define SCAN_RX_INITIAL_GAIN 0x17
4221 #define POWER_DETECTION_TH 0x08
4226 Operation = priv->InitialGainOperateType;
4231 RT_TRACE(COMP_SCAN, "IG_Backup, backup the initial gain.\n");
4232 initial_gain = SCAN_RX_INITIAL_GAIN;//priv->DefaultInitialGain[0];//
4233 BitMask = bMaskByte0;
4234 if(dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
4235 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8); // FW DIG OFF
4236 priv->initgain_backup.xaagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1, BitMask);
4237 priv->initgain_backup.xbagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XBAGCCore1, BitMask);
4238 priv->initgain_backup.xcagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XCAGCCore1, BitMask);
4239 priv->initgain_backup.xdagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XDAGCCore1, BitMask);
4240 BitMask = bMaskByte2;
4241 priv->initgain_backup.cca = (u8)rtl8192_QueryBBReg(dev, rCCK0_CCA, BitMask);
4243 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc50 is %x\n",priv->initgain_backup.xaagccore1);
4244 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc58 is %x\n",priv->initgain_backup.xbagccore1);
4245 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc60 is %x\n",priv->initgain_backup.xcagccore1);
4246 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc68 is %x\n",priv->initgain_backup.xdagccore1);
4247 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xa0a is %x\n",priv->initgain_backup.cca);
4249 RT_TRACE(COMP_SCAN, "Write scan initial gain = 0x%x \n", initial_gain);
4250 write_nic_byte(dev, rOFDM0_XAAGCCore1, initial_gain);
4251 write_nic_byte(dev, rOFDM0_XBAGCCore1, initial_gain);
4252 write_nic_byte(dev, rOFDM0_XCAGCCore1, initial_gain);
4253 write_nic_byte(dev, rOFDM0_XDAGCCore1, initial_gain);
4254 RT_TRACE(COMP_SCAN, "Write scan 0xa0a = 0x%x \n", POWER_DETECTION_TH);
4255 write_nic_byte(dev, 0xa0a, POWER_DETECTION_TH);
4258 RT_TRACE(COMP_SCAN, "IG_Restore, restore the initial gain.\n");
4259 BitMask = 0x7f; //Bit0~ Bit6
4260 if(dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
4261 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8); // FW DIG OFF
4263 rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, BitMask, (u32)priv->initgain_backup.xaagccore1);
4264 rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, BitMask, (u32)priv->initgain_backup.xbagccore1);
4265 rtl8192_setBBreg(dev, rOFDM0_XCAGCCore1, BitMask, (u32)priv->initgain_backup.xcagccore1);
4266 rtl8192_setBBreg(dev, rOFDM0_XDAGCCore1, BitMask, (u32)priv->initgain_backup.xdagccore1);
4267 BitMask = bMaskByte2;
4268 rtl8192_setBBreg(dev, rCCK0_CCA, BitMask, (u32)priv->initgain_backup.cca);
4270 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc50 is %x\n",priv->initgain_backup.xaagccore1);
4271 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc58 is %x\n",priv->initgain_backup.xbagccore1);
4272 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc60 is %x\n",priv->initgain_backup.xcagccore1);
4273 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc68 is %x\n",priv->initgain_backup.xdagccore1);
4274 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xa0a is %x\n",priv->initgain_backup.cca);
4276 PHY_SetTxPowerLevel8192S(dev,priv->ieee80211->current_network.channel);
4278 if(dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
4279 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1); // FW DIG ON
4282 RT_TRACE(COMP_SCAN, "Unknown IG Operation. \n");
4287 #endif // #if (DEV_BUS_TYPE == USB_INTERFACE)
4289 //-----------------------------------------------------------------------------
4291 // Schedule workitem to send specific CMD IO to FW.
4292 // Added by Roger, 2008.12.03.
4294 //-----------------------------------------------------------------------------
4295 bool HalSetFwCmd8192S(struct net_device* dev, FW_CMD_IO_TYPE FwCmdIO)
4297 struct r8192_priv *priv = ieee80211_priv(dev);
4298 u16 FwCmdWaitCounter = 0;
4300 u16 FwCmdWaitLimit = 1000;
4302 //if(IS_HARDWARE_TYPE_8192SU(Adapter) && Adapter->bInHctTest)
4303 if(priv->bInHctTest)
4306 RT_TRACE(COMP_CMD, "-->HalSetFwCmd8192S(): Set FW Cmd(%x), SetFwCmdInProgress(%d)\n", (u32)FwCmdIO, priv->SetFwCmdInProgress);
4308 // Will be done by high power respectively.
4309 if(FwCmdIO==FW_CMD_DIG_HALT || FwCmdIO==FW_CMD_DIG_RESUME)
4311 RT_TRACE(COMP_CMD, "<--HalSetFwCmd8192S(): Set FW Cmd(%x)\n", (u32)FwCmdIO);
4316 while(priv->SetFwCmdInProgress && FwCmdWaitCounter<FwCmdWaitLimit)
4318 //if(RT_USB_CANNOT_IO(Adapter))
4320 // RT_TRACE(COMP_CMD, DBG_WARNING, ("HalSetFwCmd8192S(): USB can NOT IO!!\n"));
4324 RT_TRACE(COMP_CMD, "HalSetFwCmd8192S(): previous workitem not finish!!\n");
4326 FwCmdWaitCounter ++;
4327 RT_TRACE(COMP_CMD, "HalSetFwCmd8192S(): Wait 10 ms (%d times)...\n", FwCmdWaitCounter);
4331 if(FwCmdWaitCounter == FwCmdWaitLimit)
4333 //RT_ASSERT(FALSE, ("SetFwCmdIOWorkItemCallback(): Wait too logn to set FW CMD\n"));
4334 RT_TRACE(COMP_CMD, "HalSetFwCmd8192S(): Wait too logn to set FW CMD\n");
4338 if (priv->SetFwCmdInProgress)
4340 RT_TRACE(COMP_ERR, "<--HalSetFwCmd8192S(): Set FW Cmd(%#x)\n", FwCmdIO);
4343 priv->SetFwCmdInProgress = TRUE;
4344 priv->CurrentFwCmdIO = FwCmdIO; // Update current FW Cmd for callback use.
4346 phy_SetFwCmdIOCallback(dev);
4349 void ChkFwCmdIoDone(struct net_device* dev)
4351 u16 PollingCnt = 1000;
4355 {// Make sure that CMD IO has be accepted by FW.
4357 if(RT_USB_CANNOT_IO(Adapter))
4359 RT_TRACE(COMP_CMD, "ChkFwCmdIoDone(): USB can NOT IO!!\n");
4363 udelay(10); // sleep 20us
4364 tmpValue = read_nic_dword(dev, WFM5);
4367 RT_TRACE(COMP_CMD, "[FW CMD] Set FW Cmd success!!\n");
4372 RT_TRACE(COMP_CMD, "[FW CMD] Polling FW Cmd PollingCnt(%d)!!\n", PollingCnt);
4374 }while( --PollingCnt );
4378 RT_TRACE(COMP_ERR, "[FW CMD] Set FW Cmd fail!!\n");
4381 // Callback routine of the timer callback for FW Cmd IO.
4384 // This routine will send specific CMD IO to FW and check whether it is done.
4386 void phy_SetFwCmdIOCallback(struct net_device* dev)
4388 //struct net_device* dev = (struct net_device*) data;
4390 static u32 ScanRegister;
4391 struct r8192_priv *priv = ieee80211_priv(dev);
4394 RT_TRACE(COMP_CMD, "SetFwCmdIOTimerCallback(): driver is going to unload\n");
4398 RT_TRACE(COMP_CMD, "--->SetFwCmdIOTimerCallback(): Cmd(%#x), SetFwCmdInProgress(%d)\n", priv->CurrentFwCmdIO, priv->SetFwCmdInProgress);
4400 switch(priv->CurrentFwCmdIO)
4402 case FW_CMD_HIGH_PWR_ENABLE:
4403 if((priv->ieee80211->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)==0)
4404 write_nic_dword(dev, WFM5, FW_HIGH_PWR_ENABLE);
4407 case FW_CMD_HIGH_PWR_DISABLE:
4408 write_nic_dword(dev, WFM5, FW_HIGH_PWR_DISABLE);
4411 case FW_CMD_DIG_RESUME:
4412 write_nic_dword(dev, WFM5, FW_DIG_RESUME);
4415 case FW_CMD_DIG_HALT:
4416 write_nic_dword(dev, WFM5, FW_DIG_HALT);
4420 // <Roger_Notes> The following FW CMD IO was combined into single operation
4421 // (i.e., to prevent number of system workitem out of resource!!).
4424 case FW_CMD_RESUME_DM_BY_SCAN:
4425 RT_TRACE(COMP_CMD, "[FW CMD] Set HIGHPWR enable and DIG resume!!\n");
4426 if((priv->ieee80211->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)==0)
4428 write_nic_dword(dev, WFM5, FW_HIGH_PWR_ENABLE); //break;
4429 ChkFwCmdIoDone(dev);
4431 write_nic_dword(dev, WFM5, FW_DIG_RESUME);
4434 case FW_CMD_PAUSE_DM_BY_SCAN:
4435 RT_TRACE(COMP_CMD, "[FW CMD] Set HIGHPWR disable and DIG halt!!\n");
4436 write_nic_dword(dev, WFM5, FW_HIGH_PWR_DISABLE); //break;
4437 ChkFwCmdIoDone(dev);
4438 write_nic_dword(dev, WFM5, FW_DIG_HALT);
4442 // <Roger_Notes> The following FW CMD IO should be checked
4443 // (i.e., workitem schedule timing issue!!).
4446 case FW_CMD_DIG_DISABLE:
4447 RT_TRACE(COMP_CMD, "[FW CMD] Set DIG disable!!\n");
4448 write_nic_dword(dev, WFM5, FW_DIG_DISABLE);
4451 case FW_CMD_DIG_ENABLE:
4452 RT_TRACE(COMP_CMD, "[FW CMD] Set DIG enable!!\n");
4453 write_nic_dword(dev, WFM5, FW_DIG_ENABLE);
4456 case FW_CMD_RA_RESET:
4457 write_nic_dword(dev, WFM5, FW_RA_RESET);
4460 case FW_CMD_RA_ACTIVE:
4461 write_nic_dword(dev, WFM5, FW_RA_ACTIVE);
4464 case FW_CMD_RA_REFRESH_N:
4465 RT_TRACE(COMP_CMD, "[FW CMD] Set RA refresh!! N\n");
4466 if(priv->ieee80211->pHTInfo->IOTRaFunc & HT_IOT_RAFUNC_DISABLE_ALL)
4467 input = FW_RA_REFRESH;
4469 input = FW_RA_REFRESH | (priv->ieee80211->pHTInfo->IOTRaFunc << 8);
4470 write_nic_dword(dev, WFM5, input);
4472 case FW_CMD_RA_REFRESH_BG:
4473 RT_TRACE(COMP_CMD, "[FW CMD] Set RA refresh!! B/G\n");
4474 write_nic_dword(dev, WFM5, FW_RA_REFRESH);
4475 ChkFwCmdIoDone(dev);
4476 write_nic_dword(dev, WFM5, FW_RA_ENABLE_BG);
4479 case FW_CMD_IQK_ENABLE:
4480 write_nic_dword(dev, WFM5, FW_IQK_ENABLE);
4483 case FW_CMD_TXPWR_TRACK_ENABLE:
4484 write_nic_dword(dev, WFM5, FW_TXPWR_TRACK_ENABLE);
4487 case FW_CMD_TXPWR_TRACK_DISABLE:
4488 write_nic_dword(dev, WFM5, FW_TXPWR_TRACK_DISABLE);
4492 RT_TRACE(COMP_CMD,"Unknown FW Cmd IO(%#x)\n", priv->CurrentFwCmdIO);
4496 ChkFwCmdIoDone(dev);
4498 switch(priv->CurrentFwCmdIO)
4500 case FW_CMD_HIGH_PWR_DISABLE:
4501 //if(pMgntInfo->bTurboScan)
4503 //Lower initial gain
4504 rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, bMaskByte0, 0x17);
4505 rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, bMaskByte0, 0x17);
4507 rtl8192_setBBreg(dev, rCCK0_CCA, bMaskByte2, 0x40);
4508 // Disable OFDM Part
4509 rtl8192_setBBreg(dev, rOFDM0_TRMuxPar, bMaskByte2, 0x1);
4510 ScanRegister = rtl8192_QueryBBReg(dev, rOFDM0_RxDetector1,bMaskDWord);
4511 rtl8192_setBBreg(dev, rOFDM0_RxDetector1, 0xf, 0xf);
4512 rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0x0);
4516 case FW_CMD_HIGH_PWR_ENABLE:
4517 //if(pMgntInfo->bTurboScan)
4519 rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, bMaskByte0, 0x36);
4520 rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, bMaskByte0, 0x36);
4523 rtl8192_setBBreg(dev, rCCK0_CCA, bMaskByte2, 0x83);
4525 rtl8192_setBBreg(dev, rOFDM0_TRMuxPar, bMaskByte2, 0x0);
4527 //LZM ADD because sometimes there is no FW_CMD_HIGH_PWR_DISABLE, this value will be 0.
4528 if(ScanRegister != 0){
4529 rtl8192_setBBreg(dev, rOFDM0_RxDetector1, bMaskDWord, ScanRegister);
4532 if(priv->rf_type == RF_1T2R || priv->rf_type == RF_2T2R)
4533 rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0x3);
4535 rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0x1);
4540 priv->SetFwCmdInProgress = false;// Clear FW CMD operation flag.
4541 RT_TRACE(COMP_CMD, "<---SetFwCmdIOWorkItemCallback()\n");