2 Copyright (c) Realtek Semiconductor Corp. All rights reserved.
8 Hardware Initialization and Hardware IO for RTL8185B
12 ---------- --------------- -------------------------------
13 2006-11-15 Xiong Created
16 This file is ported from RTL8185B Windows driver.
21 /*--------------------------Include File------------------------------------*/
22 #include <linux/spinlock.h>
25 #include "r8180_rtl8225.h" /* RTL8225 Radio frontend */
26 #include "r8180_93cx6.h" /* Card EEPROM */
31 #include "ieee80211/dot11d.h"
34 //#define CONFIG_RTL8180_IO_MAP
36 #define TC_3W_POLL_MAX_TRY_CNT 5
37 static u8 MAC_REG_TABLE[][2]={
39 // 0x34(BRSR), 0xBE(RATE_FALLBACK_CTL), 0x1E0(ARFR) would set in HwConfigureRTL8185()
40 // 0x272(RFSW_CTRL), 0x1CE(AESMSK_QC) set in InitializeAdapter8185().
41 // 0x1F0~0x1F8 set in MacConfig_85BASIC()
42 {0x08, 0xae}, {0x0a, 0x72}, {0x5b, 0x42},
43 {0x84, 0x88}, {0x85, 0x24}, {0x88, 0x54}, {0x8b, 0xb8}, {0x8c, 0x03},
44 {0x8d, 0x40}, {0x8e, 0x00}, {0x8f, 0x00}, {0x5b, 0x18}, {0x91, 0x03},
45 {0x94, 0x0F}, {0x95, 0x32},
46 {0x96, 0x00}, {0x97, 0x07}, {0xb4, 0x22}, {0xdb, 0x00},
47 {0xf0, 0x32}, {0xf1, 0x32}, {0xf2, 0x00}, {0xf3, 0x00}, {0xf4, 0x32},
48 {0xf5, 0x43}, {0xf6, 0x00}, {0xf7, 0x00}, {0xf8, 0x46}, {0xf9, 0xa4},
49 {0xfa, 0x00}, {0xfb, 0x00}, {0xfc, 0x96}, {0xfd, 0xa4}, {0xfe, 0x00},
53 // For Flextronics system Logo PCIHCT failure:
54 // 0x1C4~0x1CD set no-zero value to avoid PCI configuration space 0x45[7]=1
56 {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x04}, {0x5b, 0x00}, {0x60, 0x24},
57 {0x61, 0x97}, {0x62, 0xF0}, {0x63, 0x09}, {0x80, 0x0F}, {0x81, 0xFF},
58 {0x82, 0xFF}, {0x83, 0x03},
59 {0xC4, 0x22}, {0xC5, 0x22}, {0xC6, 0x22}, {0xC7, 0x22}, {0xC8, 0x22}, //lzm add 080826
60 {0xC9, 0x22}, {0xCA, 0x22}, {0xCB, 0x22}, {0xCC, 0x22}, {0xCD, 0x22},//lzm add 080826
66 {0x0c, 0x04}, {0x4c, 0x30}, {0x4d, 0x08}, {0x50, 0x05}, {0x51, 0xf5},
67 {0x52, 0x04}, {0x53, 0xa0}, {0x54, 0xff}, {0x55, 0xff}, {0x56, 0xff},
68 {0x57, 0xff}, {0x58, 0x08}, {0x59, 0x08}, {0x5a, 0x08}, {0x5b, 0x08},
69 {0x60, 0x08}, {0x61, 0x08}, {0x62, 0x08}, {0x63, 0x08}, {0x64, 0x2f},
70 {0x8c, 0x3f}, {0x8d, 0x3f}, {0x8e, 0x3f},
71 {0x8f, 0x3f}, {0xc4, 0xff}, {0xc5, 0xff}, {0xc6, 0xff}, {0xc7, 0xff},
72 {0xc8, 0x00}, {0xc9, 0x00}, {0xca, 0x80}, {0xcb, 0x00},
75 {0x5e, 0x00},{0x9f, 0x03}
79 static u8 ZEBRA_AGC[]={
81 0x7E,0x7E,0x7E,0x7E,0x7D,0x7C,0x7B,0x7A,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,
82 0x71,0x70,0x6F,0x6E,0x6D,0x6C,0x6B,0x6A,0x69,0x68,0x67,0x66,0x65,0x64,0x63,0x62,
83 0x48,0x47,0x46,0x45,0x44,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x08,0x07,
84 0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
85 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x11,0x12,0x13,0x15,0x16,
86 0x17,0x17,0x18,0x18,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,
87 0x1f,0x1f,0x1f,0x20,0x20,0x20,0x20,0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x24,
88 0x24,0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F
91 static u32 ZEBRA_RF_RX_GAIN_TABLE[]={
92 0x0096,0x0076,0x0056,0x0036,0x0016,0x01f6,0x01d6,0x01b6,
93 0x0196,0x0176,0x00F7,0x00D7,0x00B7,0x0097,0x0077,0x0057,
94 0x0037,0x00FB,0x00DB,0x00BB,0x00FF,0x00E3,0x00C3,0x00A3,
95 0x0083,0x0063,0x0043,0x0023,0x0003,0x01E3,0x01C3,0x01A3,
96 0x0183,0x0163,0x0143,0x0123,0x0103
99 static u8 OFDM_CONFIG[]={
100 // OFDM reg0x06[7:0]=0xFF: Enable power saving mode in RX
101 // OFDM reg0x3C[4]=1'b1: Enable RX power saving mode
102 // ofdm 0x3a = 0x7b ,(original : 0xfb) For ECS shielding room TP test
105 0x10, 0x0F, 0x0A, 0x0C, 0x14, 0xFA, 0xFF, 0x50,
106 0x00, 0x50, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00,
108 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xA8, 0x26,
109 0x32, 0x33, 0x06, 0xA5, 0x6F, 0x55, 0xC8, 0xBB,
111 0x0A, 0xE1, 0x2C, 0x4A, 0x86, 0x83, 0x34, 0x00,
112 0x4F, 0x24, 0x6F, 0xC2, 0x03, 0x40, 0x80, 0x00,
114 0xC0, 0xC1, 0x58, 0xF1, 0x00, 0xC4, 0x90, 0x3e,
115 0xD8, 0x3C, 0x7B, 0x10, 0x10
118 /*---------------------------------------------------------------
120 * the code is ported from Windows source code
121 ----------------------------------------------------------------*/
124 PlatformIOWrite1Byte(
125 struct net_device *dev,
130 write_nic_byte(dev, offset, data);
131 read_nic_byte(dev, offset); // To make sure write operation is completed, 2005.11.09, by rcnjko.
136 PlatformIOWrite2Byte(
137 struct net_device *dev,
142 write_nic_word(dev, offset, data);
143 read_nic_word(dev, offset); // To make sure write operation is completed, 2005.11.09, by rcnjko.
147 u8 PlatformIORead1Byte(struct net_device *dev, u32 offset);
150 PlatformIOWrite4Byte(
151 struct net_device *dev,
157 if (offset == PhyAddr)
158 {//For Base Band configuration.
159 unsigned char cmdByte;
160 unsigned long dataBytes;
164 cmdByte = (u8)(data & 0x000000ff);
169 // The critical section is only BB read/write race condition.
171 // 1. We assume NO one will access BB at DIRQL, otherwise, system will crash for
172 // acquiring the spinlock in such context.
173 // 2. PlatformIOWrite4Byte() MUST NOT be recursive.
175 // NdisAcquireSpinLock( &(pDevice->IoSpinLock) );
177 for(idx = 0; idx < 30; idx++)
178 { // Make sure command bit is clear before access it.
179 u1bTmp = PlatformIORead1Byte(dev, PhyAddr);
180 if((u1bTmp & BIT7) == 0)
186 for(idx=0; idx < 3; idx++)
188 PlatformIOWrite1Byte(dev,offset+1+idx,((u8*)&dataBytes)[idx] );
190 write_nic_byte(dev, offset, cmdByte);
192 // NdisReleaseSpinLock( &(pDevice->IoSpinLock) );
196 write_nic_dword(dev, offset, data);
197 read_nic_dword(dev, offset); // To make sure write operation is completed, 2005.11.09, by rcnjko.
203 struct net_device *dev,
209 data = read_nic_byte(dev, offset);
217 struct net_device *dev,
223 data = read_nic_word(dev, offset);
231 struct net_device *dev,
237 data = read_nic_dword(dev, offset);
244 SetOutputEnableOfRfPins(
245 struct net_device *dev
248 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
250 switch(priv->rf_chip)
252 case RFCHIPID_RTL8225:
255 write_nic_word(dev, RFPinsEnable, 0x1bff);
256 //write_nic_word(dev, RFPinsEnable, 0x1fff);
263 struct net_device *dev,
271 u16 oval,oval2,oval3;
276 // RTL8187S HSSI Read/Write Function
277 u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
278 u1bTmp |= RF_SW_CFG_SI; //reg08[1]=1 Serial Interface(SI)
279 write_nic_byte(dev, RF_SW_CONFIG, u1bTmp);
280 UshortBuffer = read_nic_word(dev, RFPinsOutput);
281 oval = UshortBuffer & 0xfff8; // We shall clear bit0, 1, 2 first, 2005.10.28, by rcnjko.
283 oval2 = read_nic_word(dev, RFPinsEnable);
284 oval3 = read_nic_word(dev, RFPinsSelect);
286 // <RJ_NOTE> 3-wire should be controled by HW when we finish SW 3-wire programming. 2005.08.10, by rcnjko.
289 write_nic_word(dev, RFPinsEnable, (oval2|0x0007)); // Set To Output Enable
290 write_nic_word(dev, RFPinsSelect, (oval3|0x0007)); // Set To SW Switch
293 // Add this to avoid hardware and software 3-wire conflict.
294 // 2005.03.01, by rcnjko.
296 twreg.struc.enableB = 1;
297 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval)); // Set SI_EN (RFLE)
299 twreg.struc.enableB = 0;
300 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval)); // Clear SI_EN (RFLE)
303 mask = (low2high)?0x01:((u32)0x01<<(totalLength-1));
305 for(i=0; i<totalLength/2; i++)
307 twreg.struc.data = ((data2Write&mask)!=0) ? 1 : 0;
308 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
310 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
311 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
313 mask = (low2high)?(mask<<1):(mask>>1);
314 twreg.struc.data = ((data2Write&mask)!=0) ? 1 : 0;
315 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
316 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
318 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
319 mask = (low2high)?(mask<<1):(mask>>1);
322 twreg.struc.enableB = 1;
324 twreg.struc.data = 0;
325 write_nic_word(dev, RFPinsOutput, twreg.longData|oval);
328 write_nic_word(dev, RFPinsOutput, oval|0x0004);
329 write_nic_word(dev, RFPinsSelect, oval3|0x0000);
331 SetOutputEnableOfRfPins(dev);
338 struct net_device *dev,
351 // Check if WE and RE are cleared.
352 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
354 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
355 if( (u1bTmp & (SW_3W_CMD1_RE|SW_3W_CMD1_WE)) == 0 )
361 if (TryCnt == TC_3W_POLL_MAX_TRY_CNT)
362 panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp);
364 // RTL8187S HSSI Read/Write Function
365 u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
369 u1bTmp |= RF_SW_CFG_SI; //reg08[1]=1 Serial Interface(SI)
372 u1bTmp &= ~RF_SW_CFG_SI; //reg08[1]=0 Parallel Interface(PI)
375 write_nic_byte(dev, RF_SW_CONFIG, u1bTmp);
379 // jong: HW SI read must set reg84[3]=0.
380 u1bTmp = read_nic_byte(dev, RFPinsSelect);
382 write_nic_byte(dev, RFPinsSelect, u1bTmp );
384 // Fill up data buffer for write operation.
388 if(nDataBufBitCnt == 16)
390 write_nic_word(dev, SW_3W_DB0, *((u16*)pDataBuf));
392 else if(nDataBufBitCnt == 64) // RTL8187S shouldn't enter this case
394 write_nic_dword(dev, SW_3W_DB0, *((u32*)pDataBuf));
395 write_nic_dword(dev, SW_3W_DB1, *((u32*)(pDataBuf + 4)));
400 int ByteCnt = nDataBufBitCnt / 8;
401 //printk("%d\n",nDataBufBitCnt);
402 if ((nDataBufBitCnt % 8) != 0)
403 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
406 if (nDataBufBitCnt > 64)
407 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
410 for(idx = 0; idx < ByteCnt; idx++)
412 write_nic_byte(dev, (SW_3W_DB0+idx), *(pDataBuf+idx));
420 // SI - reg274[3:0] : RF register's Address
421 write_nic_word(dev, SW_3W_DB0, *((u16*)pDataBuf) );
425 // PI - reg274[15:12] : RF register's Address
426 write_nic_word(dev, SW_3W_DB0, (*((u16*)pDataBuf)) << 12);
430 // Set up command: WE or RE.
433 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_WE);
437 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_RE);
440 // Check if DONE is set.
441 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
443 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
444 if( (u1bTmp & SW_3W_CMD1_DONE) != 0 )
451 write_nic_byte(dev, SW_3W_CMD1, 0);
453 // Read back data for read operation.
458 //Serial Interface : reg363_362[11:0]
459 *((u16*)pDataBuf) = read_nic_word(dev, SI_DATA_READ) ;
463 //Parallel Interface : reg361_360[11:0]
464 *((u16*)pDataBuf) = read_nic_word(dev, PI_DATA_READ);
467 *((u16*)pDataBuf) &= 0x0FFF;
478 struct net_device *dev,
491 // Check if WE and RE are cleared.
492 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
494 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
495 if( (u1bTmp & (SW_3W_CMD1_RE|SW_3W_CMD1_WE)) == 0 )
501 if (TryCnt == TC_3W_POLL_MAX_TRY_CNT)
502 panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp);
504 // Fill up data buffer for write operation.
505 if(nDataBufBitCnt == 16)
507 write_nic_word(dev, SW_3W_DB0, *((u16 *)pDataBuf));
509 else if(nDataBufBitCnt == 64)
511 write_nic_dword(dev, SW_3W_DB0, *((u32 *)pDataBuf));
512 write_nic_dword(dev, SW_3W_DB1, *((u32 *)(pDataBuf + 4)));
517 int ByteCnt = nDataBufBitCnt / 8;
519 if ((nDataBufBitCnt % 8) != 0)
520 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
523 if (nDataBufBitCnt > 64)
524 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
527 for(idx = 0; idx < ByteCnt; idx++)
529 write_nic_byte(dev, (SW_3W_DB0+idx), *(pDataBuf+idx));
533 // Fill up length field.
534 u1bTmp = (u8)(nDataBufBitCnt - 1); // Number of bits - 1.
536 u1bTmp |= SW_3W_CMD0_HOLD;
537 write_nic_byte(dev, SW_3W_CMD0, u1bTmp);
539 // Set up command: WE or RE.
542 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_WE);
546 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_RE);
549 // Check if WE and RE are cleared and DONE is set.
550 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
552 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
553 if( (u1bTmp & (SW_3W_CMD1_RE|SW_3W_CMD1_WE)) == 0 &&
554 (u1bTmp & SW_3W_CMD1_DONE) != 0 )
560 if(TryCnt == TC_3W_POLL_MAX_TRY_CNT)
562 //RT_ASSERT(TryCnt != TC_3W_POLL_MAX_TRY_CNT,
563 // ("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear or DONE is not set!!\n", u1bTmp));
564 // Workaround suggested by wcchu: clear WE here. 2006.07.07, by rcnjko.
565 write_nic_byte(dev, SW_3W_CMD1, 0);
568 // Read back data for read operation.
569 // <RJ_TODO> I am not sure if this is correct output format of a read operation.
572 if(nDataBufBitCnt == 16)
574 *((u16 *)pDataBuf) = read_nic_word(dev, SW_3W_DB0);
576 else if(nDataBufBitCnt == 64)
578 *((u32 *)pDataBuf) = read_nic_dword(dev, SW_3W_DB0);
579 *((u32 *)(pDataBuf + 4)) = read_nic_dword(dev, SW_3W_DB1);
584 int ByteCnt = nDataBufBitCnt / 8;
586 if ((nDataBufBitCnt % 8) != 0)
587 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
590 if (nDataBufBitCnt > 64)
591 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
594 for(idx = 0; idx < ByteCnt; idx++)
596 *(pDataBuf+idx) = read_nic_byte(dev, (SW_3W_DB0+idx));
609 struct net_device *dev,
619 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
622 switch(priv->rf_chip)
624 case RFCHIPID_RTL8225:
625 case RF_ZEBRA2: // Annie 2006-05-12.
626 case RF_ZEBRA4: //by amy
627 switch(priv->RegThreeWireMode)
630 { // Perform SW 3-wire programming by driver.
631 data2Write = (data << 4) | (u32)(offset & 0x0f);
634 ZEBRA_RFSerialWrite(dev, data2Write, len, low2high);
640 data2Write = (data << 4) | (u32)(offset & 0x0f);
644 (u8 *)(&data2Write), // pDataBuf,
645 len, // nDataBufBitCnt,
650 case HW_THREE_WIRE_PI: //Parallel Interface
652 data2Write = (data << 4) | (u32)(offset & 0x0f);
656 (u8*)(&data2Write), // pDataBuf,
657 len, // nDataBufBitCnt,
665 case HW_THREE_WIRE_SI: //Serial Interface
667 data2Write = (data << 4) | (u32)(offset & 0x0f);
669 // printk(" enter ZEBRA_RFSerialWrite\n ");
671 // ZEBRA_RFSerialWrite(dev, data2Write, len, low2high);
675 (u8*)(&data2Write), // pDataBuf,
676 len, // nDataBufBitCnt,
680 // printk(" exit ZEBRA_RFSerialWrite\n ");
686 DMESGE("RF_WriteReg(): invalid RegThreeWireMode(%d) !!!", priv->RegThreeWireMode);
692 DMESGE("RF_WriteReg(): unknown RFChipID: %#X", priv->rf_chip);
700 struct net_device *dev,
710 u16 oval,oval2,oval3,tmp, wReg80;
714 //PHAL_DATA_8187 pHalData = GetHalData8187(pAdapter);
715 { // RTL8187S HSSI Read/Write Function
716 u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
717 u1bTmp |= RF_SW_CFG_SI; //reg08[1]=1 Serial Interface(SI)
718 write_nic_byte(dev, RF_SW_CONFIG, u1bTmp);
721 wReg80 = oval = read_nic_word(dev, RFPinsOutput);
722 oval2 = read_nic_word(dev, RFPinsEnable);
723 oval3 = read_nic_word(dev, RFPinsSelect);
725 write_nic_word(dev, RFPinsEnable, oval2|0xf);
726 write_nic_word(dev, RFPinsSelect, oval3|0xf);
730 // We must clear BIT0-3 here, otherwise,
731 // SW_Enalbe will be true when we first call ZEBRA_RFSerialRead() after 8187MPVC open,
732 // which will cause the value read become 0. 2005.04.11, by rcnjko.
735 // Avoid collision with hardware three-wire.
737 twreg.struc.enableB = 1;
738 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(4);
741 twreg.struc.enableB = 0;
743 twreg.struc.read_write = 0;
744 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(5);
746 mask = (low2high) ? 0x01 : ((u32)0x01<<(32-1));
747 for(i = 0; i < wLength/2; i++)
749 twreg.struc.data = ((data2Write&mask) != 0) ? 1 : 0;
750 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(1);
752 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
753 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
755 mask = (low2high) ? (mask<<1): (mask>>1);
759 // Commented out by Jackie, 2004.08.26. <RJ_NOTE> We must comment out the following two lines for we cannot pull down VCOPDN during RF Serail Read.
760 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0xe); // turn off data enable
761 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0xe);
763 twreg.struc.read_write=1;
764 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
766 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
769 twreg.struc.data = ((data2Write&mask) != 0) ? 1: 0;
770 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
771 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
774 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(1);
776 mask = (low2high) ? (mask<<1) : (mask>>1);
780 twreg.struc.data = 0;
781 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
782 mask = (low2high) ? 0x01 : ((u32)0x01 << (12-1));
785 // 061016, by rcnjko:
786 // We must set data pin to HW controled, otherwise RF can't driver it and
787 // value RF register won't be able to read back properly.
789 write_nic_word(dev, RFPinsEnable, ( ((oval2|0x0E) & (~0x01))) );
791 for(i = 0; i < rLength; i++)
793 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(1);
795 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
796 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
797 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
798 tmp = read_nic_word(dev, RFPinsInput);
799 tdata.longData = tmp;
800 *data2Read |= tdata.struc.clk ? mask : 0;
803 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
805 mask = (low2high) ? (mask<<1) : (mask>>1);
807 twreg.struc.enableB = 1;
809 twreg.struc.data = 0;
810 twreg.struc.read_write = 1;
811 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
813 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, oval2|0x8); // Set To Output Enable
814 write_nic_word(dev, RFPinsEnable, oval2); // Set To Output Enable, <RJ_NOTE> We cannot enable BIT3 here, otherwise, we will failed to switch channel. 2005.04.12.
815 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0x1bff);
816 write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch
817 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0x0488);
818 write_nic_word(dev, RFPinsOutput, 0x3a0);
819 //PlatformEFIOWrite2Byte(pAdapter, RFPinsOutput, 0x0480);
825 struct net_device *dev,
829 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
836 switch(priv->rf_chip)
838 case RFCHIPID_RTL8225:
841 switch(priv->RegThreeWireMode)
843 case HW_THREE_WIRE_PI: // For 87S Parallel Interface.
845 data2Write = ((u32)(offset&0x0f));
849 (u8*)(&data2Write), // pDataBuf,
850 wlen, // nDataBufBitCnt,
853 dataRead= data2Write;
857 case HW_THREE_WIRE_SI: // For 87S Serial Interface.
859 data2Write = ((u32)(offset&0x0f)) ;
863 (u8*)(&data2Write), // pDataBuf,
864 wlen, // nDataBufBitCnt,
868 dataRead= data2Write;
872 // Perform SW 3-wire programming by driver.
875 data2Write = ((u32)(offset&0x1f)) << 27; // For Zebra E-cut. 2005.04.11, by rcnjko.
879 ZEBRA_RFSerialRead(dev, data2Write, wlen,&dataRead,rlen, low2high);
893 // by Owen on 04/07/14 for writing BB register successfully
896 struct net_device *dev,
904 UCharData = (u8)((Data & 0x0000ff00) >> 8);
905 PlatformIOWrite4Byte(dev, PhyAddr, Data);
906 //for(TimeoutCounter = 10; TimeoutCounter > 0; TimeoutCounter--)
908 PlatformIOWrite4Byte(dev, PhyAddr, Data & 0xffffff7f);
909 RegisterContent = PlatformIORead1Byte(dev, PhyDataR);
910 //if(UCharData == RegisterContent)
917 struct net_device *dev,
924 PlatformIOWrite4Byte(dev, PhyAddr, addr & 0xffffff7f);
925 RegisterContent = PlatformIORead1Byte(dev, PhyDataR);
927 return RegisterContent;
932 // Perform Antenna settings with antenna diversity on 87SE.
933 // Created by Roger, 2008.01.25.
936 SetAntennaConfig87SE(
937 struct net_device *dev,
938 u8 DefaultAnt, // 0: Main, 1: Aux.
939 bool bAntDiversity // 1:Enable, 0: Disable.
942 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
943 bool bAntennaSwitched = true;
945 //printk("SetAntennaConfig87SE(): DefaultAnt(%d), bAntDiversity(%d)\n", DefaultAnt, bAntDiversity);
947 // Threshold for antenna diversity.
948 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
950 if( bAntDiversity ) // Enable Antenna Diversity.
952 if( DefaultAnt == 1 ) // aux antenna
954 // Mac register, aux antenna
955 write_nic_byte(dev, ANTSEL, 0x00);
957 // Config CCK RX antenna.
958 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
959 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
961 // Config OFDM RX antenna.
962 write_phy_ofdm(dev, 0x0D, 0x54); // Reg0d : 54
963 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
965 else // use main antenna
967 // Mac register, main antenna
968 write_nic_byte(dev, ANTSEL, 0x03);
970 // Config CCK RX antenna.
971 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
972 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
974 // Config OFDM RX antenna.
975 write_phy_ofdm(dev, 0x0d, 0x5c); // Reg0d : 5c
976 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
979 else // Disable Antenna Diversity.
981 if( DefaultAnt == 1 ) // aux Antenna
983 // Mac register, aux antenna
984 write_nic_byte(dev, ANTSEL, 0x00);
986 // Config CCK RX antenna.
987 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
988 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
990 // Config OFDM RX antenna.
991 write_phy_ofdm(dev, 0x0D, 0x54); // Reg0d : 54
992 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
996 // Mac register, main antenna
997 write_nic_byte(dev, ANTSEL, 0x03);
999 // Config CCK RX antenna.
1000 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
1001 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
1003 // Config OFDM RX antenna.
1004 write_phy_ofdm(dev, 0x0D, 0x5c); // Reg0d : 5c
1005 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
1008 priv->CurrAntennaIndex = DefaultAnt; // Update default settings.
1009 return bAntennaSwitched;
1012 /*---------------------------------------------------------------
1013 * Hardware Initialization.
1014 * the code is ported from Windows source code
1015 ----------------------------------------------------------------*/
1018 ZEBRA_Config_85BASIC_HardCode(
1019 struct net_device *dev
1023 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1026 u32 u4bRegOffset, u4bRegValue, u4bRF23, u4bRF24;
1030 //=============================================================================
1031 // 87S_PCIE :: RADIOCFG.TXT
1032 //=============================================================================
1035 // Page1 : reg16-reg30
1036 RF_WriteReg(dev, 0x00, 0x013f); mdelay(1); // switch to page1
1037 u4bRF23= RF_ReadReg(dev, 0x08); mdelay(1);
1038 u4bRF24= RF_ReadReg(dev, 0x09); mdelay(1);
1040 if (u4bRF23==0x818 && u4bRF24==0x70C && priv->card_8185 == VERSION_8187S_C)
1041 priv->card_8185 = VERSION_8187S_D;
1043 // Page0 : reg0-reg15
1045 // RF_WriteReg(dev, 0x00, 0x003f); mdelay(1);//1
1046 RF_WriteReg(dev, 0x00, 0x009f); mdelay(1);// 1
1048 RF_WriteReg(dev, 0x01, 0x06e0); mdelay(1);
1050 // RF_WriteReg(dev, 0x02, 0x004c); mdelay(1);//2
1051 RF_WriteReg(dev, 0x02, 0x004d); mdelay(1);// 2
1053 // RF_WriteReg(dev, 0x03, 0x0000); mdelay(1);//3
1054 RF_WriteReg(dev, 0x03, 0x07f1); mdelay(1);// 3
1056 RF_WriteReg(dev, 0x04, 0x0975); mdelay(1);
1057 RF_WriteReg(dev, 0x05, 0x0c72); mdelay(1);
1058 RF_WriteReg(dev, 0x06, 0x0ae6); mdelay(1);
1059 RF_WriteReg(dev, 0x07, 0x00ca); mdelay(1);
1060 RF_WriteReg(dev, 0x08, 0x0e1c); mdelay(1);
1061 RF_WriteReg(dev, 0x09, 0x02f0); mdelay(1);
1062 RF_WriteReg(dev, 0x0a, 0x09d0); mdelay(1);
1063 RF_WriteReg(dev, 0x0b, 0x01ba); mdelay(1);
1064 RF_WriteReg(dev, 0x0c, 0x0640); mdelay(1);
1065 RF_WriteReg(dev, 0x0d, 0x08df); mdelay(1);
1066 RF_WriteReg(dev, 0x0e, 0x0020); mdelay(1);
1067 RF_WriteReg(dev, 0x0f, 0x0990); mdelay(1);
1070 // Page1 : reg16-reg30
1071 RF_WriteReg(dev, 0x00, 0x013f); mdelay(1);
1073 RF_WriteReg(dev, 0x03, 0x0806); mdelay(1);
1075 if(priv->card_8185 < VERSION_8187S_C)
1077 RF_WriteReg(dev, 0x04, 0x03f7); mdelay(1);
1078 RF_WriteReg(dev, 0x05, 0x05ab); mdelay(1);
1079 RF_WriteReg(dev, 0x06, 0x00c1); mdelay(1);
1083 RF_WriteReg(dev, 0x04, 0x03a7); mdelay(1);
1084 RF_WriteReg(dev, 0x05, 0x059b); mdelay(1);
1085 RF_WriteReg(dev, 0x06, 0x0081); mdelay(1);
1089 RF_WriteReg(dev, 0x07, 0x01A0); mdelay(1);
1090 // Don't write RF23/RF24 to make a difference between 87S C cut and D cut. asked by SD3 stevenl.
1091 // RF_WriteReg(dev, 0x08, 0x0597); mdelay(1);
1092 // RF_WriteReg(dev, 0x09, 0x050a); mdelay(1);
1093 RF_WriteReg(dev, 0x0a, 0x0001); mdelay(1);
1094 RF_WriteReg(dev, 0x0b, 0x0418); mdelay(1);
1096 if(priv->card_8185 == VERSION_8187S_D)
1098 RF_WriteReg(dev, 0x0c, 0x0fbe); mdelay(1);
1099 RF_WriteReg(dev, 0x0d, 0x0008); mdelay(1);
1100 RF_WriteReg(dev, 0x0e, 0x0807); mdelay(1); // RX LO buffer
1104 RF_WriteReg(dev, 0x0c, 0x0fbe); mdelay(1);
1105 RF_WriteReg(dev, 0x0d, 0x0008); mdelay(1);
1106 RF_WriteReg(dev, 0x0e, 0x0806); mdelay(1); // RX LO buffer
1109 RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1);
1111 // RF_WriteReg(dev, 0x00, 0x017f); mdelay(1);//6
1112 RF_WriteReg(dev, 0x00, 0x01d7); mdelay(1);// 6
1114 RF_WriteReg(dev, 0x03, 0x0e00); mdelay(1);
1115 RF_WriteReg(dev, 0x04, 0x0e50); mdelay(1);
1118 RF_WriteReg(dev, 0x01, i); mdelay(1);
1119 RF_WriteReg(dev, 0x02, ZEBRA_RF_RX_GAIN_TABLE[i]); mdelay(1);
1120 //DbgPrint("RF - 0x%x = 0x%x", i, ZEBRA_RF_RX_GAIN_TABLE[i]);
1123 RF_WriteReg(dev, 0x05, 0x0203); mdelay(1); /// 203, 343
1124 //RF_WriteReg(dev, 0x06, 0x0300); mdelay(1); // 400
1125 RF_WriteReg(dev, 0x06, 0x0200); mdelay(1); // 400
1127 RF_WriteReg(dev, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30, and HSSI disable 137
1128 mdelay(10); // Deay 10 ms. //0xfd
1130 // RF_WriteReg(dev, 0x0c, 0x09be); mdelay(1); // 7
1131 //RF_WriteReg(dev, 0x0c, 0x07be); mdelay(1);
1132 //mdelay(10); // Deay 10 ms. //0xfd
1134 RF_WriteReg(dev, 0x0d, 0x0008); mdelay(1); // Z4 synthesizer loop filter setting, 392
1135 mdelay(10); // Deay 10 ms. //0xfd
1137 RF_WriteReg(dev, 0x00, 0x0037); mdelay(1); // switch to reg0-reg15, and HSSI disable
1138 mdelay(10); // Deay 10 ms. //0xfd
1140 RF_WriteReg(dev, 0x04, 0x0160); mdelay(1); // CBC on, Tx Rx disable, High gain
1141 mdelay(10); // Deay 10 ms. //0xfd
1143 RF_WriteReg(dev, 0x07, 0x0080); mdelay(1); // Z4 setted channel 1
1144 mdelay(10); // Deay 10 ms. //0xfd
1146 RF_WriteReg(dev, 0x02, 0x088D); mdelay(1); // LC calibration
1147 mdelay(200); // Deay 200 ms. //0xfd
1148 mdelay(10); // Deay 10 ms. //0xfd
1149 mdelay(10); // Deay 10 ms. //0xfd
1151 RF_WriteReg(dev, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30 137, and HSSI disable 137
1152 mdelay(10); // Deay 10 ms. //0xfd
1154 RF_WriteReg(dev, 0x07, 0x0000); mdelay(1);
1155 RF_WriteReg(dev, 0x07, 0x0180); mdelay(1);
1156 RF_WriteReg(dev, 0x07, 0x0220); mdelay(1);
1157 RF_WriteReg(dev, 0x07, 0x03E0); mdelay(1);
1159 // DAC calibration off 20070702
1160 RF_WriteReg(dev, 0x06, 0x00c1); mdelay(1);
1161 RF_WriteReg(dev, 0x0a, 0x0001); mdelay(1);
1163 // For crystal calibration, added by Roger, 2007.12.11.
1164 if( priv->bXtalCalibration ) // reg 30.
1165 { // enable crystal calibration.
1166 // RF Reg[30], (1)Xin:[12:9], Xout:[8:5], addr[4:0].
1167 // (2)PA Pwr delay timer[15:14], default: 2.4us, set BIT15=0
1168 // (3)RF signal on/off when calibration[13], default: on, set BIT13=0.
1169 // So we should minus 4 BITs offset.
1170 RF_WriteReg(dev, 0x0f, (priv->XtalCal_Xin<<5)|(priv->XtalCal_Xout<<1)|BIT11|BIT9); mdelay(1);
1171 printk("ZEBRA_Config_85BASIC_HardCode(): (%02x)\n",
1172 (priv->XtalCal_Xin<<5) | (priv->XtalCal_Xout<<1) | BIT11| BIT9);
1175 { // using default value. Xin=6, Xout=6.
1176 RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1);
1179 // RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1); //-by amy 080312
1181 RF_WriteReg(dev, 0x00, 0x00bf); mdelay(1); // switch to reg0-reg15, and HSSI enable
1182 // RF_WriteReg(dev, 0x0d, 0x009f); mdelay(1); // Rx BB start calibration, 00c//-edward
1183 RF_WriteReg(dev, 0x0d, 0x08df); mdelay(1); // Rx BB start calibration, 00c//+edward
1184 RF_WriteReg(dev, 0x02, 0x004d); mdelay(1); // temperature meter off
1185 RF_WriteReg(dev, 0x04, 0x0975); mdelay(1); // Rx mode
1186 mdelay(10); // Deay 10 ms. //0xfe
1187 mdelay(10); // Deay 10 ms. //0xfe
1188 mdelay(10); // Deay 10 ms. //0xfe
1189 RF_WriteReg(dev, 0x00, 0x0197); mdelay(1); // Rx mode//+edward
1190 RF_WriteReg(dev, 0x05, 0x05ab); mdelay(1); // Rx mode//+edward
1191 RF_WriteReg(dev, 0x00, 0x009f); mdelay(1); // Rx mode//+edward
1193 RF_WriteReg(dev, 0x01, 0x0000); mdelay(1); // Rx mode//+edward
1194 RF_WriteReg(dev, 0x02, 0x0000); mdelay(1); // Rx mode//+edward
1195 //power save parameters.
1196 u1b24E = read_nic_byte(dev, 0x24E);
1197 write_nic_byte(dev, 0x24E, (u1b24E & (~(BIT5|BIT6))));
1199 //=============================================================================
1201 //=============================================================================
1203 //=============================================================================
1205 /* [POWER SAVE] Power Saving Parameters by jong. 2007-11-27
1206 CCK reg0x00[7]=1'b1 :power saving for TX (default)
1207 CCK reg0x00[6]=1'b1: power saving for RX (default)
1208 CCK reg0x06[4]=1'b1: turn off channel estimation related circuits if not doing channel estimation.
1209 CCK reg0x06[3]=1'b1: turn off unused circuits before cca = 1
1210 CCK reg0x06[2]=1'b1: turn off cck's circuit if macrst =0
1213 write_phy_cck(dev,0x00,0xc8);
1214 write_phy_cck(dev,0x06,0x1c);
1215 write_phy_cck(dev,0x10,0x78);
1216 write_phy_cck(dev,0x2e,0xd0);
1217 write_phy_cck(dev,0x2f,0x06);
1218 write_phy_cck(dev,0x01,0x46);
1221 write_nic_byte(dev, CCK_TXAGC, 0x10);
1222 write_nic_byte(dev, OFDM_TXAGC, 0x1B);
1223 write_nic_byte(dev, ANTSEL, 0x03);
1227 //=============================================================================
1229 //=============================================================================
1231 // PlatformIOWrite4Byte( dev, PhyAddr, 0x00001280); // Annie, 2006-05-05
1232 write_phy_ofdm(dev, 0x00, 0x12);
1233 //WriteBBPortUchar(dev, 0x00001280);
1235 for (i=0; i<128; i++)
1237 //DbgPrint("AGC - [%x+1] = 0x%x\n", i, ZEBRA_AGC[i+1]);
1239 data = ZEBRA_AGC[i+1];
1241 data = data | 0x0000008F;
1243 addr = i + 0x80; //enable writing AGC table
1245 addr = addr | 0x0000008E;
1247 WriteBBPortUchar(dev, data);
1248 WriteBBPortUchar(dev, addr);
1249 WriteBBPortUchar(dev, 0x0000008E);
1252 PlatformIOWrite4Byte( dev, PhyAddr, 0x00001080); // Annie, 2006-05-05
1253 //WriteBBPortUchar(dev, 0x00001080);
1255 //=============================================================================
1257 //=============================================================================
1259 //=============================================================================
1264 u4bRegValue=OFDM_CONFIG[i];
1266 //DbgPrint("OFDM - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
1268 WriteBBPortUchar(dev,
1270 (u4bRegOffset & 0x7f) |
1271 ((u4bRegValue & 0xff) << 8)));
1274 //=============================================================================
1275 //by amy for antenna
1276 //=============================================================================
1278 // Config Sw/Hw Combinational Antenna Diversity. Added by Roger, 2008.02.26.
1279 SetAntennaConfig87SE(dev, priv->bDefaultAntenna1, priv->bSwAntennaDiverity);
1281 //by amy for antenna
1287 struct net_device *dev
1290 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1291 //unsigned char* IGTable;
1292 //u8 DIG_CurrentInitialGain = 4;
1293 //unsigned char u1Tmp;
1296 if(priv->eRFPowerState != eRfOn)
1298 //Don't access BB/RF under disable PLL situation.
1299 //RT_TRACE(COMP_DIG, DBG_LOUD, ("UpdateInitialGain - pHalData->eRFPowerState!=eRfOn\n"));
1300 // Back to the original state
1301 priv->InitialGain= priv->InitialGainBackUp;
1305 switch(priv->rf_chip)
1308 // Dynamic set initial gain, follow 87B
1309 switch(priv->InitialGain)
1312 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm \n");
1313 write_phy_ofdm(dev, 0x17, 0x26); mdelay(1);
1314 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1315 write_phy_ofdm(dev, 0x05, 0xfa); mdelay(1);
1319 //DMESG("RTL8187 + 8225 Initial Gain State 2: -82 dBm \n");
1320 write_phy_ofdm(dev, 0x17, 0x36); mdelay(1);
1321 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1322 write_phy_ofdm(dev, 0x05, 0xfa); mdelay(1);
1326 //DMESG("RTL8187 + 8225 Initial Gain State 3: -82 dBm \n");
1327 write_phy_ofdm(dev, 0x17, 0x36); mdelay(1);
1328 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1329 write_phy_ofdm(dev, 0x05, 0xfb); mdelay(1);
1333 //DMESG("RTL8187 + 8225 Initial Gain State 4: -78 dBm \n");
1334 write_phy_ofdm(dev, 0x17, 0x46); mdelay(1);
1335 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1336 write_phy_ofdm(dev, 0x05, 0xfb); mdelay(1);
1340 //DMESG("RTL8187 + 8225 Initial Gain State 5: -74 dBm \n");
1341 write_phy_ofdm(dev, 0x17, 0x46); mdelay(1);
1342 write_phy_ofdm(dev, 0x24, 0x96); mdelay(1);
1343 write_phy_ofdm(dev, 0x05, 0xfb); mdelay(1);
1347 //DMESG ("RTL8187 + 8225 Initial Gain State 6: -70 dBm \n");
1348 write_phy_ofdm(dev, 0x17, 0x56); mdelay(1);
1349 write_phy_ofdm(dev, 0x24, 0x96); mdelay(1);
1350 write_phy_ofdm(dev, 0x05, 0xfc); mdelay(1);
1354 //DMESG("RTL8187 + 8225 Initial Gain State 7: -66 dBm \n");
1355 write_phy_ofdm(dev, 0x17, 0x56); mdelay(1);
1356 write_phy_ofdm(dev, 0x24, 0xa6); mdelay(1);
1357 write_phy_ofdm(dev, 0x05, 0xfc); mdelay(1);
1361 //DMESG("RTL8187 + 8225 Initial Gain State 8:\n");
1362 write_phy_ofdm(dev, 0x17, 0x66); mdelay(1);
1363 write_phy_ofdm(dev, 0x24, 0xb6); mdelay(1);
1364 write_phy_ofdm(dev, 0x05, 0xfc); mdelay(1);
1369 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm (default)\n");
1370 write_phy_ofdm(dev, 0x17, 0x26); mdelay(1);
1371 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1372 write_phy_ofdm(dev, 0x05, 0xfa); mdelay(1);
1379 DMESG("UpdateInitialGain(): unknown RFChipID: %#X\n", priv->rf_chip);
1385 // Tx Power tracking mechanism routine on 87SE.
1386 // Created by Roger, 2007.12.11.
1389 InitTxPwrTracking87SE(
1390 struct net_device *dev
1393 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1396 u4bRfReg = RF_ReadReg(dev, 0x02);
1398 // Enable Thermal meter indication.
1399 //printk("InitTxPwrTracking87SE(): Enable thermal meter indication, Write RF[0x02] = %#x", u4bRfReg|PWR_METER_EN);
1400 RF_WriteReg(dev, 0x02, u4bRfReg|PWR_METER_EN); mdelay(1);
1405 struct net_device *dev
1408 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1409 write_nic_dword(dev, RCR, priv->ReceiveConfig);
1410 priv->RFProgType = read_nic_byte(dev, CONFIG4) & 0x03;
1412 switch(priv->rf_chip)
1416 ZEBRA_Config_85BASIC_HardCode( dev);
1420 // Set default initial gain state to 4, approved by SD3 DZ, by Bruce, 2007-06-06.
1421 if(priv->bDigMechanism)
1423 if(priv->InitialGain == 0)
1424 priv->InitialGain = 4;
1425 //printk("PhyConfig8185(): DIG is enabled, set default initial gain index to %d\n", priv->InitialGain);
1429 // Enable thermal meter indication to implement TxPower tracking on 87SE.
1430 // We initialize thermal meter here to avoid unsuccessful configuration.
1431 // Added by Roger, 2007.12.11.
1433 if(priv->bTxPowerTrack)
1434 InitTxPwrTracking87SE(dev);
1437 priv->InitialGainBackUp= priv->InitialGain;
1438 UpdateInitialGain(dev);
1448 struct net_device *dev
1451 //RTL8185_TODO: Determine Retrylimit, TxAGC, AutoRateFallback control.
1452 // u8 bUNIVERSAL_CONTROL_RL = 1;
1453 u8 bUNIVERSAL_CONTROL_RL = 0;
1455 u8 bUNIVERSAL_CONTROL_AGC = 1;
1456 u8 bUNIVERSAL_CONTROL_ANT = 1;
1457 u8 bAUTO_RATE_FALLBACK_CTL = 1;
1459 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1460 //struct ieee80211_device *ieee = priv->ieee80211;
1461 //if(IS_WIRELESS_MODE_A(dev) || IS_WIRELESS_MODE_G(dev))
1462 //{by amy 080312 if((ieee->mode == IEEE_G)||(ieee->mode == IEEE_A))
1464 // write_nic_word(dev, BRSR, 0xffff);
1468 // write_nic_word(dev, BRSR, 0x000f);
1471 write_nic_word(dev, BRSR, 0x0fff);
1473 val8 = read_nic_byte(dev, CW_CONF);
1475 if(bUNIVERSAL_CONTROL_RL)
1480 write_nic_byte(dev, CW_CONF, val8);
1483 val8 = read_nic_byte(dev, TXAGC_CTL);
1484 if(bUNIVERSAL_CONTROL_AGC)
1486 write_nic_byte(dev, CCK_TXAGC, 128);
1487 write_nic_byte(dev, OFDM_TXAGC, 128);
1492 val8 = val8 | 0x01 ;
1496 write_nic_byte(dev, TXAGC_CTL, val8);
1498 // Tx Antenna including Feedback control
1499 val8 = read_nic_byte(dev, TXAGC_CTL );
1501 if(bUNIVERSAL_CONTROL_ANT)
1503 write_nic_byte(dev, ANTSEL, 0x00);
1508 val8 = val8 & (val8|0x02); //xiong-2006-11-15
1511 write_nic_byte(dev, TXAGC_CTL, val8);
1513 // Auto Rate fallback control
1514 val8 = read_nic_byte(dev, RATE_FALLBACK);
1516 if( bAUTO_RATE_FALLBACK_CTL )
1518 val8 |= RATE_FALLBACK_CTL_ENABLE | RATE_FALLBACK_CTL_AUTO_STEP1;
1520 // <RJ_TODO_8185B> We shall set up the ARFR according to user's setting.
1521 //write_nic_word(dev, ARFR, 0x0fff); // set 1M ~ 54M
1523 // Aadded by Roger, 2007.11.15.
1524 PlatformIOWrite2Byte(dev, ARFR, 0x0fff); //set 1M ~ 54Mbps.
1530 write_nic_byte(dev, RATE_FALLBACK, val8);
1536 MacConfig_85BASIC_HardCode(
1537 struct net_device *dev)
1539 //============================================================================
1541 //============================================================================
1544 u32 u4bRegOffset, u4bRegValue,u4bPageIndex = 0;
1547 nLinesRead=sizeof(MAC_REG_TABLE)/2;
1549 for(i = 0; i < nLinesRead; i++) //nLinesRead=101
1551 u4bRegOffset=MAC_REG_TABLE[i][0];
1552 u4bRegValue=MAC_REG_TABLE[i][1];
1554 if(u4bRegOffset == 0x5e)
1556 u4bPageIndex = u4bRegValue;
1560 u4bRegOffset |= (u4bPageIndex << 8);
1562 //DbgPrint("MAC - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
1563 write_nic_byte(dev, u4bRegOffset, (u8)u4bRegValue);
1565 //============================================================================
1572 struct net_device *dev)
1576 MacConfig_85BASIC_HardCode(dev);
1578 //============================================================================
1580 // Follow TID_AC_MAP of WMac.
1581 write_nic_word(dev, TID_AC_MAP, 0xfa50);
1583 // Interrupt Migration, Jong suggested we use set 0x0000 first, 2005.12.14, by rcnjko.
1584 write_nic_word(dev, IntMig, 0x0000);
1586 // Prevent TPC to cause CRC error. Added by Annie, 2006-06-10.
1587 PlatformIOWrite4Byte(dev, 0x1F0, 0x00000000);
1588 PlatformIOWrite4Byte(dev, 0x1F4, 0x00000000);
1589 PlatformIOWrite1Byte(dev, 0x1F8, 0x00);
1591 // Asked for by SD3 CM Lin, 2006.06.27, by rcnjko.
1592 //PlatformIOWrite4Byte(dev, RFTiming, 0x00004001);
1594 // power save parameter based on "87SE power save parameters 20071127.doc", as follow.
1596 //Enable DA10 TX power saving
1597 u1DA = read_nic_byte(dev, PHYPR);
1598 write_nic_byte(dev, PHYPR, (u1DA | BIT2) );
1601 write_nic_word(dev, 0x360, 0x1000);
1602 write_nic_word(dev, 0x362, 0x1000);
1605 write_nic_word(dev, 0x370, 0x0560);
1606 write_nic_word(dev, 0x372, 0x0560);
1607 write_nic_word(dev, 0x374, 0x0DA4);
1608 write_nic_word(dev, 0x376, 0x0DA4);
1609 write_nic_word(dev, 0x378, 0x0560);
1610 write_nic_word(dev, 0x37A, 0x0560);
1611 write_nic_word(dev, 0x37C, 0x00EC);
1612 // write_nic_word(dev, 0x37E, 0x00FE);//-edward
1613 write_nic_word(dev, 0x37E, 0x00EC);//+edward
1614 write_nic_byte(dev, 0x24E,0x01);
1623 GetSupportedWirelessMode8185(
1624 struct net_device *dev
1627 u8 btSupportedWirelessMode = 0;
1628 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1630 switch(priv->rf_chip)
1634 btSupportedWirelessMode = (WIRELESS_MODE_B | WIRELESS_MODE_G);
1637 btSupportedWirelessMode = WIRELESS_MODE_B;
1641 return btSupportedWirelessMode;
1645 ActUpdateChannelAccessSetting(
1646 struct net_device *dev,
1647 WIRELESS_MODE WirelessMode,
1648 PCHANNEL_ACCESS_SETTING ChnlAccessSetting
1651 struct r8180_priv *priv = ieee80211_priv(dev);
1652 struct ieee80211_device *ieee = priv->ieee80211;
1655 //PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
1656 u8 bFollowLegacySetting = 0;
1661 // TODO: We still don't know how to set up these registers, just follow WMAC to
1662 // verify 8185B FPAG.
1665 // Jong said CWmin/CWmax register are not functional in 8185B,
1666 // so we shall fill channel access realted register into AC parameter registers,
1669 ChnlAccessSetting->SIFS_Timer = 0x22; // Suggested by Jong, 2005.12.08.
1670 ChnlAccessSetting->DIFS_Timer = 0x1C; // 2006.06.02, by rcnjko.
1671 ChnlAccessSetting->SlotTimeTimer = 9; // 2006.06.02, by rcnjko.
1672 ChnlAccessSetting->EIFS_Timer = 0x5B; // Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
1673 ChnlAccessSetting->CWminIndex = 3; // 2006.06.02, by rcnjko.
1674 ChnlAccessSetting->CWmaxIndex = 7; // 2006.06.02, by rcnjko.
1676 write_nic_byte(dev, SIFS, ChnlAccessSetting->SIFS_Timer);
1677 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SLOT_TIME, &ChnlAccessSetting->SlotTimeTimer ); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
1678 write_nic_byte(dev, SLOT, ChnlAccessSetting->SlotTimeTimer); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
1680 u1bAIFS = aSifsTime + (2 * ChnlAccessSetting->SlotTimeTimer );
1682 //write_nic_byte(dev, AC_VO_PARAM, u1bAIFS);
1683 //write_nic_byte(dev, AC_VI_PARAM, u1bAIFS);
1684 //write_nic_byte(dev, AC_BE_PARAM, u1bAIFS);
1685 //write_nic_byte(dev, AC_BK_PARAM, u1bAIFS);
1687 write_nic_byte(dev, EIFS, ChnlAccessSetting->EIFS_Timer);
1689 write_nic_byte(dev, AckTimeOutReg, 0x5B); // <RJ_EXPR_QOS> Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
1692 // <RJ_TODO_NOW_8185B> Update ECWmin/ECWmax, AIFS, TXOP Limit of each AC to the value defined by SPEC.
1693 if( pStaQos->CurrentQosMode > QOS_DISABLE )
1695 if(pStaQos->QBssWirelessMode == WirelessMode)
1697 // Follow AC Parameters of the QBSS.
1698 for(eACI = 0; eACI < AC_MAX; eACI++)
1700 Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, (pu1Byte)(&(pStaQos->WMMParamEle.AcParam[eACI])) );
1705 // Follow Default WMM AC Parameters.
1706 bFollowLegacySetting = 1;
1712 bFollowLegacySetting = 1;
1716 // this setting is copied from rtl8187B. xiong-2006-11-13
1717 if(bFollowLegacySetting)
1722 // Follow 802.11 seeting to AC parameter, all AC shall use the same parameter.
1723 // 2005.12.01, by rcnjko.
1725 AcParam.longData = 0;
1726 AcParam.f.AciAifsn.f.AIFSN = 2; // Follow 802.11 DIFS.
1727 AcParam.f.AciAifsn.f.ACM = 0;
1728 AcParam.f.Ecw.f.ECWmin = ChnlAccessSetting->CWminIndex; // Follow 802.11 CWmin.
1729 AcParam.f.Ecw.f.ECWmax = ChnlAccessSetting->CWmaxIndex; // Follow 802.11 CWmax.
1730 AcParam.f.TXOPLimit = 0;
1732 //lzm reserved 080826
1734 // For turbo mode setting. port from 87B by Isaiah 2008-08-01
1735 if( ieee->current_network.Turbo_Enable == 1 )
1736 AcParam.f.TXOPLimit = 0x01FF;
1737 // For 87SE with Intel 4965 Ad-Hoc mode have poor throughput (19MB)
1738 if (ieee->iw_mode == IW_MODE_ADHOC)
1739 AcParam.f.TXOPLimit = 0x0020;
1742 for(eACI = 0; eACI < AC_MAX; eACI++)
1744 AcParam.f.AciAifsn.f.ACI = (u8)eACI;
1746 PAC_PARAM pAcParam = (PAC_PARAM)(&AcParam);
1751 // Retrive paramters to udpate.
1752 eACI = pAcParam->f.AciAifsn.f.ACI;
1753 u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * ChnlAccessSetting->SlotTimeTimer + aSifsTime;
1754 u4bAcParam = ( (((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET) |
1755 (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET) |
1756 (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET) |
1757 (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
1762 //write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
1766 //write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
1770 //write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
1774 //write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
1778 DMESGW( "SetHwReg8185(): invalid ACI: %d !\n", eACI);
1783 // If it is set, immediately set ACM control bit to downgrading AC for passing WMM testplan. Annie, 2005-12-13.
1784 //write_nic_byte(dev, ACM_CONTROL, pAcParam->f.AciAifsn);
1786 PACI_AIFSN pAciAifsn = (PACI_AIFSN)(&pAcParam->f.AciAifsn);
1787 AC_CODING eACI = pAciAifsn->f.ACI;
1790 //for 8187B AsynIORead issue
1792 u8 AcmCtrl = pHalData->AcmControl;
1796 if( pAciAifsn->f.ACM )
1801 AcmCtrl |= (BEQ_ACM_EN|BEQ_ACM_CTL|ACM_HW_EN); // or 0x21
1805 AcmCtrl |= (VIQ_ACM_EN|VIQ_ACM_CTL|ACM_HW_EN); // or 0x42
1809 AcmCtrl |= (VOQ_ACM_EN|VOQ_ACM_CTL|ACM_HW_EN); // or 0x84
1813 DMESGW("SetHwReg8185(): [HW_VAR_ACM_CTRL] ACM set failed: eACI is %d\n", eACI );
1822 AcmCtrl &= ( (~BEQ_ACM_EN) & (~BEQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0xDE
1826 AcmCtrl &= ( (~VIQ_ACM_EN) & (~VIQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0xBD
1830 AcmCtrl &= ( (~VOQ_ACM_EN) & (~VOQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0x7B
1838 //printk(KERN_WARNING "SetHwReg8185(): [HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl);
1841 pHalData->AcmControl = AcmCtrl;
1843 //write_nic_byte(dev, ACM_CONTROL, AcmCtrl);
1844 write_nic_byte(dev, ACM_CONTROL, 0);
1854 ActSetWirelessMode8185(
1855 struct net_device *dev,
1859 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1860 struct ieee80211_device *ieee = priv->ieee80211;
1861 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
1862 u8 btSupportedWirelessMode = GetSupportedWirelessMode8185(dev);
1864 if( (btWirelessMode & btSupportedWirelessMode) == 0 )
1865 { // Don't switch to unsupported wireless mode, 2006.02.15, by rcnjko.
1866 DMESGW("ActSetWirelessMode8185(): WirelessMode(%d) is not supported (%d)!\n",
1867 btWirelessMode, btSupportedWirelessMode);
1871 // 1. Assign wireless mode to swtich if necessary.
1872 if (btWirelessMode == WIRELESS_MODE_AUTO)
1874 if((btSupportedWirelessMode & WIRELESS_MODE_A))
1876 btWirelessMode = WIRELESS_MODE_A;
1878 else if((btSupportedWirelessMode & WIRELESS_MODE_G))
1880 btWirelessMode = WIRELESS_MODE_G;
1882 else if((btSupportedWirelessMode & WIRELESS_MODE_B))
1884 btWirelessMode = WIRELESS_MODE_B;
1888 DMESGW("ActSetWirelessMode8185(): No valid wireless mode supported, btSupportedWirelessMode(%x)!!!\n",
1889 btSupportedWirelessMode);
1890 btWirelessMode = WIRELESS_MODE_B;
1895 // 2. Swtich band: RF or BB specific actions,
1896 // for example, refresh tables in omc8255, or change initial gain if necessary.
1897 switch(priv->rf_chip)
1902 // Nothing to do for Zebra to switch band.
1903 // Update current wireless mode if we swtich to specified band successfully.
1904 ieee->mode = (WIRELESS_MODE)btWirelessMode;
1909 DMESGW("ActSetWirelessMode8185(): unsupported RF: 0x%X !!!\n", priv->rf_chip);
1913 // 3. Change related setting.
1914 if( ieee->mode == WIRELESS_MODE_A ){
1915 DMESG("WIRELESS_MODE_A\n");
1917 else if( ieee->mode == WIRELESS_MODE_B ){
1918 DMESG("WIRELESS_MODE_B\n");
1920 else if( ieee->mode == WIRELESS_MODE_G ){
1921 DMESG("WIRELESS_MODE_G\n");
1924 ActUpdateChannelAccessSetting( dev, ieee->mode, &priv->ChannelAccessSetting);
1927 void rtl8185b_irq_enable(struct net_device *dev)
1929 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1931 priv->irq_enabled = 1;
1932 write_nic_dword(dev, IMR, priv->IntrMask);
1934 //by amy for power save
1936 DrvIFIndicateDisassociation(
1937 struct net_device *dev,
1941 //printk("==> DrvIFIndicateDisassociation()\n");
1943 // nothing is needed after disassociation request.
1945 //printk("<== DrvIFIndicateDisassociation()\n");
1949 struct net_device *dev
1952 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1955 //printk("XXXXXXXXXX MgntDisconnect IBSS\n");
1957 DrvIFIndicateDisassociation(dev, unspec_reason);
1959 // PlatformZeroMemory( pMgntInfo->Bssid, 6 );
1960 for(i=0;i<6;i++) priv->ieee80211->current_network.bssid[i] = 0x55;
1962 priv->ieee80211->state = IEEE80211_NOLINK;
1966 // Vista add a Adhoc profile, HW radio off untill OID_DOT11_RESET_REQUEST
1967 // Driver would set MSR=NO_LINK, then HW Radio ON, MgntQueue Stuck.
1968 // Because Bcn DMA isn't complete, mgnt queue would stuck until Bcn packet send.
1970 // Disable Beacon Queue Own bit, suggested by jong
1971 // Adapter->HalFunc.SetTxDescOWNHandler(Adapter, BEACON_QUEUE, 0, 0);
1972 ieee80211_stop_send_beacons(priv->ieee80211);
1974 priv->ieee80211->link_change(dev);
1975 notify_wx_assoc_event(priv->ieee80211);
1977 // Stop SW Beacon.Use hw beacon so do not need to do so.by amy
1979 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE );
1983 MlmeDisassociateRequest(
1984 struct net_device *dev,
1989 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1992 SendDisassociation(priv->ieee80211, asSta, asRsn );
1994 if( memcmp(priv->ieee80211->current_network.bssid, asSta, 6 ) == 0 ){
1995 //ShuChen TODO: change media status.
1996 //ShuChen TODO: What to do when disassociate.
1997 DrvIFIndicateDisassociation(dev, unspec_reason);
2000 // pMgntInfo->AsocTimestamp = 0;
2001 for(i=0;i<6;i++) priv->ieee80211->current_network.bssid[i] = 0x22;
2002 // pMgntInfo->mBrates.Length = 0;
2003 // Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
2005 ieee80211_disassociate(priv->ieee80211);
2014 struct net_device *dev,
2018 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2021 // Commented out by rcnjko, 2005.01.27:
2022 // I move SecClearAllKeys() to MgntActSet_802_11_DISASSOCIATE().
2024 // //2004/09/15, kcwu, the key should be cleared, or the new handshaking will not success
2025 // SecClearAllKeys(Adapter);
2027 // In WPA WPA2 need to Clear all key ... because new key will set after new handshaking.
2029 if( pMgntInfo->SecurityInfo.AuthMode > RT_802_11AuthModeAutoSwitch ||
2030 (pMgntInfo->bAPSuportCCKM && pMgntInfo->bCCX8021xenable) ) // In CCKM mode will Clear key
2032 SecClearAllKeys(Adapter);
2033 RT_TRACE(COMP_SEC, DBG_LOUD,("======>CCKM clear key..."))
2036 // 2004.10.11, by rcnjko.
2037 //MlmeDisassociateRequest( Adapter, pMgntInfo->Bssid, disas_lv_ss );
2038 MlmeDisassociateRequest( dev, priv->ieee80211->current_network.bssid, asRsn );
2040 priv->ieee80211->state = IEEE80211_NOLINK;
2041 // pMgntInfo->AsocTimestamp = 0;
2045 struct net_device *dev,
2049 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2051 // Schedule an workitem to wake up for ps mode, 070109, by rcnjko.
2054 if(pMgntInfo->mPss != eAwake)
2057 // Using AwkaeTimer to prevent mismatch ps state.
2058 // In the timer the state will be changed according to the RF is being awoke or not. By Bruce, 2007-10-31.
2060 // PlatformScheduleWorkItem( &(pMgntInfo->AwakeWorkItem) );
2061 PlatformSetTimer( Adapter, &(pMgntInfo->AwakeTimer), 0 );
2065 // Indication of disassociation event.
2066 //DrvIFIndicateDisassociation(Adapter, asRsn);
2067 if(IS_DOT11D_ENABLE(priv->ieee80211))
2068 Dot11d_Reset(priv->ieee80211);
2069 // In adhoc mode, update beacon frame.
2070 if( priv->ieee80211->state == IEEE80211_LINKED )
2072 if( priv->ieee80211->iw_mode == IW_MODE_ADHOC )
2074 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectIBSS\n"));
2075 //printk("MgntDisconnect() ===> MgntDisconnectIBSS\n");
2076 MgntDisconnectIBSS(dev);
2078 if( priv->ieee80211->iw_mode == IW_MODE_INFRA )
2080 // We clear key here instead of MgntDisconnectAP() because that
2081 // MgntActSet_802_11_DISASSOCIATE() is an interface called by OS,
2082 // e.g. OID_802_11_DISASSOCIATE in Windows while as MgntDisconnectAP() is
2083 // used to handle disassociation related things to AP, e.g. send Disassoc
2084 // frame to AP. 2005.01.27, by rcnjko.
2085 // SecClearAllKeys(Adapter);
2087 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectAP\n"));
2088 //printk("MgntDisconnect() ===> MgntDisconnectAP\n");
2089 MgntDisconnectAP(dev, asRsn);
2092 // Inidicate Disconnect, 2005.02.23, by rcnjko.
2093 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE);
2100 // Chang RF Power State.
2101 // Note that, only MgntActSet_RF_State() is allowed to set HW_VAR_RF_STATE.
2108 struct net_device *dev,
2109 RT_RF_POWER_STATE eRFPowerState
2112 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2113 bool bResult = false;
2115 // printk("---------> SetRFPowerState(): eRFPowerState(%d)\n", eRFPowerState);
2116 if(eRFPowerState == priv->eRFPowerState)
2118 // printk("<--------- SetRFPowerState(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState);
2122 switch(priv->rf_chip)
2126 bResult = SetZebraRFPowerState8185(dev, eRFPowerState);
2130 printk("SetRFPowerState8185(): unknown RFChipID: 0x%X!!!\n", priv->rf_chip);
2133 // printk("<--------- SetRFPowerState(): bResult(%d)\n", bResult);
2138 HalEnableRx8185Dummy(
2139 struct net_device *dev
2144 HalDisableRx8185Dummy(
2145 struct net_device *dev
2151 MgntActSet_RF_State(
2152 struct net_device *dev,
2153 RT_RF_POWER_STATE StateToSet,
2157 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2158 bool bActionAllowed = false;
2159 bool bConnectBySSID = false;
2160 RT_RF_POWER_STATE rtState;
2161 u16 RFWaitCounter = 0;
2163 // printk("===>MgntActSet_RF_State(): StateToSet(%d), ChangeSource(0x%x)\n",StateToSet, ChangeSource);
2165 // Prevent the race condition of RF state change. By Bruce, 2007-11-28.
2166 // Only one thread can change the RF state at one time, and others should wait to be executed.
2171 // down(&priv->rf_state);
2172 spin_lock_irqsave(&priv->rf_ps_lock,flag);
2173 if(priv->RFChangeInProgress)
2175 // printk("====================>haha111111111\n");
2176 // up(&priv->rf_state);
2177 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): RF Change in progress! Wait to set..StateToSet(%d).\n", StateToSet));
2178 spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
2179 // Set RF after the previous action is done.
2180 while(priv->RFChangeInProgress)
2183 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Wait 1 ms (%d times)...\n", RFWaitCounter));
2184 udelay(1000); // 1 ms
2186 // Wait too long, return FALSE to avoid to be stuck here.
2187 if(RFWaitCounter > 1000) // 1sec
2189 // RT_ASSERT(FALSE, ("MgntActSet_RF_State(): Wait too logn to set RF\n"));
2190 printk("MgntActSet_RF_State(): Wait too long to set RF\n");
2191 // TODO: Reset RF state?
2198 // printk("========================>haha2\n");
2199 priv->RFChangeInProgress = true;
2200 // up(&priv->rf_state);
2201 spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
2206 rtState = priv->eRFPowerState;
2213 // Turn On RF no matter the IPS setting because we need to update the RF state to Ndis under Vista, or
2214 // the Windows does not allow the driver to perform site survey any more. By Bruce, 2007-10-02.
2216 priv->RfOffReason &= (~ChangeSource);
2218 if(! priv->RfOffReason)
2220 priv->RfOffReason = 0;
2221 bActionAllowed = true;
2223 if(rtState == eRfOff && ChangeSource >=RF_CHANGE_BY_HW && !priv->bInHctTest)
2225 bConnectBySSID = true;
2229 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State - eRfon reject pMgntInfo->RfOffReason= 0x%x, ChangeSource=0x%X\n", pMgntInfo->RfOffReason, ChangeSource));
2234 // 070125, rcnjko: we always keep connected in AP mode.
2236 if (priv->RfOffReason > RF_CHANGE_BY_IPS)
2240 // Disconnect to current BSS when radio off. Asked by QuanTa.
2244 // Calling MgntDisconnect() instead of MgntActSet_802_11_DISASSOCIATE(),
2245 // because we do NOT need to set ssid to dummy ones.
2246 // Revised by Roger, 2007.12.04.
2248 MgntDisconnect( dev, disas_lv_ss );
2250 // Clear content of bssDesc[] and bssDesc4Query[] to avoid reporting old bss to UI.
2251 // 2007.05.28, by shien chang.
2252 // PlatformZeroMemory( pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2253 // pMgntInfo->NumBssDesc = 0;
2254 // PlatformZeroMemory( pMgntInfo->bssDesc4Query, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2255 // pMgntInfo->NumBssDesc4Query = 0;
2260 priv->RfOffReason |= ChangeSource;
2261 bActionAllowed = true;
2265 priv->RfOffReason |= ChangeSource;
2266 bActionAllowed = true;
2275 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, pMgntInfo->RfOffReason));
2276 // Config HW to the specified mode.
2277 // printk("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, priv->RfOffReason);
2278 SetRFPowerState(dev, StateToSet);
2281 if(StateToSet == eRfOn)
2283 HalEnableRx8185Dummy(dev);
2286 // by amy not supported
2287 // MgntActSet_802_11_SSID(Adapter, Adapter->MgntInfo.Ssid.Octet, Adapter->MgntInfo.Ssid.Length, TRUE );
2291 else if(StateToSet == eRfOff)
2293 HalDisableRx8185Dummy(dev);
2298 // printk("MgntActSet_RF_State(): Action is rejected.... StateToSet(%d), ChangeSource(%#X), RfOffReason(%#X)\n", StateToSet, ChangeSource, priv->RfOffReason);
2301 // Release RF spinlock
2302 // down(&priv->rf_state);
2303 spin_lock_irqsave(&priv->rf_ps_lock,flag);
2304 priv->RFChangeInProgress = false;
2305 // up(&priv->rf_state);
2306 spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
2307 // printk("<===MgntActSet_RF_State()\n");
2308 return bActionAllowed;
2312 struct net_device *dev
2315 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2319 // This flag "bSwRfProcessing", indicates the status of IPS procedure, should be set if the IPS workitem
2320 // is really scheduled.
2321 // The old code, sets this flag before scheduling the IPS workitem and however, at the same time the
2322 // previous IPS workitem did not end yet, fails to schedule the current workitem. Thus, bSwRfProcessing
2323 // blocks the IPS procedure of switching RF.
2324 // By Bruce, 2007-12-25.
2326 priv->bSwRfProcessing = true;
2328 MgntActSet_RF_State(dev, priv->eInactivePowerState, RF_CHANGE_BY_IPS);
2331 // To solve CAM values miss in RF OFF, rewrite CAM values after RF ON. By Bruce, 2007-09-20.
2334 priv->bSwRfProcessing = false;
2339 // Enter the inactive power save mode. RF will be off
2340 // 2007.08.17, by shien chang.
2344 struct net_device *dev
2347 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2348 RT_RF_POWER_STATE rtState;
2349 //printk("==============================>enter IPS\n");
2350 if (priv->bInactivePs)
2352 rtState = priv->eRFPowerState;
2355 // Added by Bruce, 2007-12-25.
2356 // Do not enter IPS in the following conditions:
2357 // (1) RF is already OFF or Sleep
2358 // (2) bSwRfProcessing (indicates the IPS is still under going)
2359 // (3) Connectted (only disconnected can trigger IPS)
2360 // (4) IBSS (send Beacon)
2361 // (5) AP mode (send Beacon)
2363 if (rtState == eRfOn && !priv->bSwRfProcessing
2364 && (priv->ieee80211->state != IEEE80211_LINKED ))
2366 // printk("IPSEnter(): Turn off RF.\n");
2367 priv->eInactivePowerState = eRfOff;
2368 InactivePowerSave(dev);
2371 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2375 struct net_device *dev
2378 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2379 RT_RF_POWER_STATE rtState;
2380 //printk("===================================>leave IPS\n");
2381 if (priv->bInactivePs)
2383 rtState = priv->eRFPowerState;
2384 if ((rtState == eRfOff || rtState == eRfSleep) && (!priv->bSwRfProcessing) && priv->RfOffReason <= RF_CHANGE_BY_IPS)
2386 // printk("IPSLeave(): Turn on RF.\n");
2387 priv->eInactivePowerState = eRfOn;
2388 InactivePowerSave(dev);
2391 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2393 //by amy for power save
2394 void rtl8185b_adapter_start(struct net_device *dev)
2396 struct r8180_priv *priv = ieee80211_priv(dev);
2397 struct ieee80211_device *ieee = priv->ieee80211;
2399 u8 SupportedWirelessMode;
2400 u8 InitWirelessMode;
2401 u8 bInvalidWirelessMode = 0;
2409 //rtl8180_rtx_disable(dev);
2411 write_nic_byte(dev,0x24e, (BIT5|BIT6|BIT0));
2415 priv->dma_poll_mask = 0;
2416 priv->dma_poll_stop_mask = 0;
2418 //rtl8180_beacon_tx_disable(dev);
2420 HwConfigureRTL8185(dev);
2422 write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
2423 write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff );
2425 write_nic_byte(dev, MSR, read_nic_byte(dev, MSR) & 0xf3); // default network type to 'No Link'
2427 //write_nic_byte(dev, BRSR, 0x0); // Set BRSR= 1M
2429 write_nic_word(dev, BcnItv, 100);
2430 write_nic_word(dev, AtimWnd, 2);
2432 //PlatformEFIOWrite2Byte(dev, FEMR, 0xFFFF);
2433 PlatformIOWrite2Byte(dev, FEMR, 0xFFFF);
2435 write_nic_byte(dev, WPA_CONFIG, 0);
2437 MacConfig_85BASIC(dev);
2439 // Override the RFSW_CTRL (MAC offset 0x272-0x273), 2006.06.07, by rcnjko.
2440 // BT_DEMO_BOARD type
2441 PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x569a);
2443 //#ifdef CONFIG_RTL818X_S
2444 // for jong required
2445 // PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2449 //PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2451 //-----------------------------------------------------------------------------
2452 // Set up PHY related.
2453 //-----------------------------------------------------------------------------
2454 // Enable Config3.PARAM_En to revise AnaaParm.
2455 write_nic_byte(dev, CR9346, 0xc0); // enable config register write
2457 tmpu8 = read_nic_byte(dev, CONFIG3);
2458 write_nic_byte(dev, CONFIG3, (tmpu8 |CONFIG3_PARM_En) );
2460 // Turn on Analog power.
2461 // Asked for by William, otherwise, MAC 3-wire can't work, 2006.06.27, by rcnjko.
2462 write_nic_dword(dev, ANAPARAM2, ANAPARM2_ASIC_ON);
2463 write_nic_dword(dev, ANAPARAM, ANAPARM_ASIC_ON);
2465 write_nic_word(dev, ANAPARAM3, 0x0010);
2468 write_nic_byte(dev, CONFIG3, tmpu8);
2469 write_nic_byte(dev, CR9346, 0x00);
2470 //{by amy 080312 for led
2471 // enable EEM0 and EEM1 in 9346CR
2472 btCR9346 = read_nic_byte(dev, CR9346);
2473 write_nic_byte(dev, CR9346, (btCR9346|0xC0) );
2475 // B cut use LED1 to control HW RF on/off
2476 TmpU1b = read_nic_byte(dev, CONFIG5);
2477 TmpU1b = TmpU1b & ~BIT3;
2478 write_nic_byte(dev,CONFIG5, TmpU1b);
2480 // disable EEM0 and EEM1 in 9346CR
2481 btCR9346 &= ~(0xC0);
2482 write_nic_byte(dev, CR9346, btCR9346);
2484 //Enable Led (suggested by Jong)
2485 // B-cut RF Radio on/off 5e[3]=0
2486 btPSR = read_nic_byte(dev, PSR);
2487 write_nic_byte(dev, PSR, (btPSR | BIT3));
2488 //by amy 080312 for led}
2489 // setup initial timing for RFE.
2490 write_nic_word(dev, RFPinsOutput, 0x0480);
2491 SetOutputEnableOfRfPins(dev);
2492 write_nic_word(dev, RFPinsSelect, 0x2488);
2497 // We assume RegWirelessMode has already been initialized before,
2498 // however, we has to validate the wireless mode here and provide a reasonble
2499 // initialized value if necessary. 2005.01.13, by rcnjko.
2500 SupportedWirelessMode = GetSupportedWirelessMode8185(dev);
2501 if( (ieee->mode != WIRELESS_MODE_B) &&
2502 (ieee->mode != WIRELESS_MODE_G) &&
2503 (ieee->mode != WIRELESS_MODE_A) &&
2504 (ieee->mode != WIRELESS_MODE_AUTO))
2505 { // It should be one of B, G, A, or AUTO.
2506 bInvalidWirelessMode = 1;
2509 { // One of B, G, A, or AUTO.
2510 // Check if the wireless mode is supported by RF.
2511 if( (ieee->mode != WIRELESS_MODE_AUTO) &&
2512 (ieee->mode & SupportedWirelessMode) == 0 )
2514 bInvalidWirelessMode = 1;
2518 if(bInvalidWirelessMode || ieee->mode==WIRELESS_MODE_AUTO)
2519 { // Auto or other invalid value.
2520 // Assigne a wireless mode to initialize.
2521 if((SupportedWirelessMode & WIRELESS_MODE_A))
2523 InitWirelessMode = WIRELESS_MODE_A;
2525 else if((SupportedWirelessMode & WIRELESS_MODE_G))
2527 InitWirelessMode = WIRELESS_MODE_G;
2529 else if((SupportedWirelessMode & WIRELESS_MODE_B))
2531 InitWirelessMode = WIRELESS_MODE_B;
2535 DMESGW("InitializeAdapter8185(): No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n",
2536 SupportedWirelessMode);
2537 InitWirelessMode = WIRELESS_MODE_B;
2540 // Initialize RegWirelessMode if it is not a valid one.
2541 if(bInvalidWirelessMode)
2543 ieee->mode = (WIRELESS_MODE)InitWirelessMode;
2547 { // One of B, G, A.
2548 InitWirelessMode = ieee->mode;
2550 //by amy for power save
2552 // printk("initialize ENABLE_IPS\n");
2553 priv->eRFPowerState = eRfOff;
2554 priv->RfOffReason = 0;
2557 // u32 tmp = jiffies;
2558 MgntActSet_RF_State(dev, eRfOn, 0);
2560 // printk("rf on cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
2562 // DrvIFIndicateCurrentPhyStatus(priv);
2564 // If inactive power mode is enabled, disable rf while in disconnected state.
2565 // 2007.07.16, by shien chang.
2567 if (priv->bInactivePs)
2570 // u32 tmp = jiffies;
2571 MgntActSet_RF_State(dev,eRfOff, RF_CHANGE_BY_IPS);
2573 // printk("rf off cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
2578 //by amy for power save
2580 // Turn off RF if necessary. 2005.08.23, by rcnjko.
2581 // We shall turn off RF after setting CMDR, otherwise,
2582 // RF will be turnned on after we enable MAC Tx/Rx.
2583 if(Adapter->MgntInfo.RegRfOff == TRUE)
2585 SetRFPowerState8185(Adapter, RF_OFF);
2589 SetRFPowerState8185(Adapter, RF_ON);
2593 /* //these is equal with above TODO.
2594 write_nic_byte(dev, CR9346, 0xc0); // enable config register write
2595 write_nic_byte(dev, CONFIG3, read_nic_byte(dev, CONFIG3) | CONFIG3_PARM_En);
2596 RF_WriteReg(dev, 0x4, 0x9FF);
2597 write_nic_dword(dev, ANAPARAM2, ANAPARM2_ASIC_ON);
2598 write_nic_dword(dev, ANAPARAM, ANAPARM_ASIC_ON);
2599 write_nic_byte(dev, CONFIG3, (read_nic_byte(dev, CONFIG3)&(~CONFIG3_PARM_En)));
2600 write_nic_byte(dev, CR9346, 0x00);
2603 ActSetWirelessMode8185(dev, (u8)(InitWirelessMode));
2605 //-----------------------------------------------------------------------------
2607 rtl8185b_irq_enable(dev);
2609 netif_start_queue(dev);
2614 void rtl8185b_rx_enable(struct net_device *dev)
2618 /* for now we accept data, management & ctl frame*/
2619 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2621 if (dev->flags & IFF_PROMISC) DMESG ("NIC in promisc mode");
2623 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
2624 dev->flags & IFF_PROMISC){
2625 priv->ReceiveConfig = priv->ReceiveConfig & (~RCR_APM);
2626 priv->ReceiveConfig = priv->ReceiveConfig | RCR_AAP;
2629 /*if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
2630 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
2631 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
2634 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
2635 priv->ReceiveConfig = priv->ReceiveConfig | RCR_ACF | RCR_APWRMGT | RCR_AICV;
2638 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
2639 priv->ReceiveConfig = priv->ReceiveConfig | RCR_ACRC32;
2641 write_nic_dword(dev, RCR, priv->ReceiveConfig);
2646 DMESG("rxconf: %x %x",priv->ReceiveConfig ,read_nic_dword(dev,RCR));
2648 cmd=read_nic_byte(dev,CMD);
2649 write_nic_byte(dev,CMD,cmd | (1<<CMD_RX_ENABLE_SHIFT));
2653 void rtl8185b_tx_enable(struct net_device *dev)
2659 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2661 write_nic_dword(dev, TCR, priv->TransmitConfig);
2662 byte = read_nic_byte(dev, MSR);
2663 byte |= MSR_LINK_ENEDCA;
2664 write_nic_byte(dev, MSR, byte);
2669 DMESG("txconf: %x %x",priv->TransmitConfig,read_nic_dword(dev,TCR));
2672 cmd=read_nic_byte(dev,CMD);
2673 write_nic_byte(dev,CMD,cmd | (1<<CMD_TX_ENABLE_SHIFT));
2675 //write_nic_dword(dev,TX_CONF,txconf);
2679 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
2680 write_nic_byte(dev, TX_DMA_POLLING, priv->dma_poll_mask);
2681 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);