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_sa2400.h" /* PHILIPS Radio frontend */
26 #include "r8180_max2820.h" /* MAXIM Radio frontend */
27 #include "r8180_gct.h" /* GCT Radio frontend */
28 #include "r8180_rtl8225.h" /* RTL8225 Radio frontend */
29 #include "r8180_rtl8255.h" /* RTL8255 Radio frontend */
30 #include "r8180_93cx6.h" /* Card EEPROM */
35 #include "ieee80211/dot11d.h"
38 //#define CONFIG_RTL8180_IO_MAP
40 #define TC_3W_POLL_MAX_TRY_CNT 5
41 static u8 MAC_REG_TABLE[][2]={
43 // 0x34(BRSR), 0xBE(RATE_FALLBACK_CTL), 0x1E0(ARFR) would set in HwConfigureRTL8185()
44 // 0x272(RFSW_CTRL), 0x1CE(AESMSK_QC) set in InitializeAdapter8185().
45 // 0x1F0~0x1F8 set in MacConfig_85BASIC()
46 {0x08, 0xae}, {0x0a, 0x72}, {0x5b, 0x42},
47 {0x84, 0x88}, {0x85, 0x24}, {0x88, 0x54}, {0x8b, 0xb8}, {0x8c, 0x03},
48 {0x8d, 0x40}, {0x8e, 0x00}, {0x8f, 0x00}, {0x5b, 0x18}, {0x91, 0x03},
49 {0x94, 0x0F}, {0x95, 0x32},
50 {0x96, 0x00}, {0x97, 0x07}, {0xb4, 0x22}, {0xdb, 0x00},
51 {0xf0, 0x32}, {0xf1, 0x32}, {0xf2, 0x00}, {0xf3, 0x00}, {0xf4, 0x32},
52 {0xf5, 0x43}, {0xf6, 0x00}, {0xf7, 0x00}, {0xf8, 0x46}, {0xf9, 0xa4},
53 {0xfa, 0x00}, {0xfb, 0x00}, {0xfc, 0x96}, {0xfd, 0xa4}, {0xfe, 0x00},
57 // For Flextronics system Logo PCIHCT failure:
58 // 0x1C4~0x1CD set no-zero value to avoid PCI configuration space 0x45[7]=1
60 {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x04}, {0x5b, 0x00}, {0x60, 0x24},
61 {0x61, 0x97}, {0x62, 0xF0}, {0x63, 0x09}, {0x80, 0x0F}, {0x81, 0xFF},
62 {0x82, 0xFF}, {0x83, 0x03},
63 {0xC4, 0x22}, {0xC5, 0x22}, {0xC6, 0x22}, {0xC7, 0x22}, {0xC8, 0x22}, //lzm add 080826
64 {0xC9, 0x22}, {0xCA, 0x22}, {0xCB, 0x22}, {0xCC, 0x22}, {0xCD, 0x22},//lzm add 080826
70 {0x0c, 0x04}, {0x4c, 0x30}, {0x4d, 0x08}, {0x50, 0x05}, {0x51, 0xf5},
71 {0x52, 0x04}, {0x53, 0xa0}, {0x54, 0xff}, {0x55, 0xff}, {0x56, 0xff},
72 {0x57, 0xff}, {0x58, 0x08}, {0x59, 0x08}, {0x5a, 0x08}, {0x5b, 0x08},
73 {0x60, 0x08}, {0x61, 0x08}, {0x62, 0x08}, {0x63, 0x08}, {0x64, 0x2f},
74 {0x8c, 0x3f}, {0x8d, 0x3f}, {0x8e, 0x3f},
75 {0x8f, 0x3f}, {0xc4, 0xff}, {0xc5, 0xff}, {0xc6, 0xff}, {0xc7, 0xff},
76 {0xc8, 0x00}, {0xc9, 0x00}, {0xca, 0x80}, {0xcb, 0x00},
79 {0x5e, 0x00},{0x9f, 0x03}
83 static u8 ZEBRA_AGC[]={
85 0x7E,0x7E,0x7E,0x7E,0x7D,0x7C,0x7B,0x7A,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,
86 0x71,0x70,0x6F,0x6E,0x6D,0x6C,0x6B,0x6A,0x69,0x68,0x67,0x66,0x65,0x64,0x63,0x62,
87 0x48,0x47,0x46,0x45,0x44,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x08,0x07,
88 0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
89 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x11,0x12,0x13,0x15,0x16,
90 0x17,0x17,0x18,0x18,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,
91 0x1f,0x1f,0x1f,0x20,0x20,0x20,0x20,0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x24,
92 0x24,0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F
95 static u32 ZEBRA_RF_RX_GAIN_TABLE[]={
96 0x0096,0x0076,0x0056,0x0036,0x0016,0x01f6,0x01d6,0x01b6,
97 0x0196,0x0176,0x00F7,0x00D7,0x00B7,0x0097,0x0077,0x0057,
98 0x0037,0x00FB,0x00DB,0x00BB,0x00FF,0x00E3,0x00C3,0x00A3,
99 0x0083,0x0063,0x0043,0x0023,0x0003,0x01E3,0x01C3,0x01A3,
100 0x0183,0x0163,0x0143,0x0123,0x0103
103 static u8 OFDM_CONFIG[]={
104 // OFDM reg0x06[7:0]=0xFF: Enable power saving mode in RX
105 // OFDM reg0x3C[4]=1'b1: Enable RX power saving mode
106 // ofdm 0x3a = 0x7b ,(original : 0xfb) For ECS shielding room TP test
109 0x10, 0x0F, 0x0A, 0x0C, 0x14, 0xFA, 0xFF, 0x50,
110 0x00, 0x50, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00,
112 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xA8, 0x26,
113 0x32, 0x33, 0x06, 0xA5, 0x6F, 0x55, 0xC8, 0xBB,
115 0x0A, 0xE1, 0x2C, 0x4A, 0x86, 0x83, 0x34, 0x00,
116 0x4F, 0x24, 0x6F, 0xC2, 0x03, 0x40, 0x80, 0x00,
118 0xC0, 0xC1, 0x58, 0xF1, 0x00, 0xC4, 0x90, 0x3e,
119 0xD8, 0x3C, 0x7B, 0x10, 0x10
122 /*---------------------------------------------------------------
124 * the code is ported from Windows source code
125 ----------------------------------------------------------------*/
128 PlatformIOWrite1Byte(
129 struct net_device *dev,
134 write_nic_byte(dev, offset, data);
135 read_nic_byte(dev, offset); // To make sure write operation is completed, 2005.11.09, by rcnjko.
140 PlatformIOWrite2Byte(
141 struct net_device *dev,
146 write_nic_word(dev, offset, data);
147 read_nic_word(dev, offset); // To make sure write operation is completed, 2005.11.09, by rcnjko.
151 u8 PlatformIORead1Byte(struct net_device *dev, u32 offset);
154 PlatformIOWrite4Byte(
155 struct net_device *dev,
161 if (offset == PhyAddr)
162 {//For Base Band configuration.
163 unsigned char cmdByte;
164 unsigned long dataBytes;
168 cmdByte = (u8)(data & 0x000000ff);
173 // The critical section is only BB read/write race condition.
175 // 1. We assume NO one will access BB at DIRQL, otherwise, system will crash for
176 // acquiring the spinlock in such context.
177 // 2. PlatformIOWrite4Byte() MUST NOT be recursive.
179 // NdisAcquireSpinLock( &(pDevice->IoSpinLock) );
181 for(idx = 0; idx < 30; idx++)
182 { // Make sure command bit is clear before access it.
183 u1bTmp = PlatformIORead1Byte(dev, PhyAddr);
184 if((u1bTmp & BIT7) == 0)
190 for(idx=0; idx < 3; idx++)
192 PlatformIOWrite1Byte(dev,offset+1+idx,((u8*)&dataBytes)[idx] );
194 write_nic_byte(dev, offset, cmdByte);
196 // NdisReleaseSpinLock( &(pDevice->IoSpinLock) );
200 write_nic_dword(dev, offset, data);
201 read_nic_dword(dev, offset); // To make sure write operation is completed, 2005.11.09, by rcnjko.
207 struct net_device *dev,
213 data = read_nic_byte(dev, offset);
221 struct net_device *dev,
227 data = read_nic_word(dev, offset);
235 struct net_device *dev,
241 data = read_nic_dword(dev, offset);
248 SetOutputEnableOfRfPins(
249 struct net_device *dev
252 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
254 switch(priv->rf_chip)
256 case RFCHIPID_RTL8225:
259 write_nic_word(dev, RFPinsEnable, 0x1bff);
260 //write_nic_word(dev, RFPinsEnable, 0x1fff);
267 struct net_device *dev,
275 u16 oval,oval2,oval3;
280 // RTL8187S HSSI Read/Write Function
281 u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
282 u1bTmp |= RF_SW_CFG_SI; //reg08[1]=1 Serial Interface(SI)
283 write_nic_byte(dev, RF_SW_CONFIG, u1bTmp);
284 UshortBuffer = read_nic_word(dev, RFPinsOutput);
285 oval = UshortBuffer & 0xfff8; // We shall clear bit0, 1, 2 first, 2005.10.28, by rcnjko.
287 oval2 = read_nic_word(dev, RFPinsEnable);
288 oval3 = read_nic_word(dev, RFPinsSelect);
290 // <RJ_NOTE> 3-wire should be controled by HW when we finish SW 3-wire programming. 2005.08.10, by rcnjko.
293 write_nic_word(dev, RFPinsEnable, (oval2|0x0007)); // Set To Output Enable
294 write_nic_word(dev, RFPinsSelect, (oval3|0x0007)); // Set To SW Switch
297 // Add this to avoid hardware and software 3-wire conflict.
298 // 2005.03.01, by rcnjko.
300 twreg.struc.enableB = 1;
301 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval)); // Set SI_EN (RFLE)
303 twreg.struc.enableB = 0;
304 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval)); // Clear SI_EN (RFLE)
307 mask = (low2high)?0x01:((u32)0x01<<(totalLength-1));
309 for(i=0; i<totalLength/2; i++)
311 twreg.struc.data = ((data2Write&mask)!=0) ? 1 : 0;
312 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
314 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
315 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
317 mask = (low2high)?(mask<<1):(mask>>1);
318 twreg.struc.data = ((data2Write&mask)!=0) ? 1 : 0;
319 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
320 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
322 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
323 mask = (low2high)?(mask<<1):(mask>>1);
326 twreg.struc.enableB = 1;
328 twreg.struc.data = 0;
329 write_nic_word(dev, RFPinsOutput, twreg.longData|oval);
332 write_nic_word(dev, RFPinsOutput, oval|0x0004);
333 write_nic_word(dev, RFPinsSelect, oval3|0x0000);
335 SetOutputEnableOfRfPins(dev);
342 struct net_device *dev,
355 // Check if WE and RE are cleared.
356 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
358 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
359 if( (u1bTmp & (SW_3W_CMD1_RE|SW_3W_CMD1_WE)) == 0 )
365 if (TryCnt == TC_3W_POLL_MAX_TRY_CNT)
366 panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp);
368 // RTL8187S HSSI Read/Write Function
369 u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
373 u1bTmp |= RF_SW_CFG_SI; //reg08[1]=1 Serial Interface(SI)
376 u1bTmp &= ~RF_SW_CFG_SI; //reg08[1]=0 Parallel Interface(PI)
379 write_nic_byte(dev, RF_SW_CONFIG, u1bTmp);
383 // jong: HW SI read must set reg84[3]=0.
384 u1bTmp = read_nic_byte(dev, RFPinsSelect);
386 write_nic_byte(dev, RFPinsSelect, u1bTmp );
388 // Fill up data buffer for write operation.
392 if(nDataBufBitCnt == 16)
394 write_nic_word(dev, SW_3W_DB0, *((u16*)pDataBuf));
396 else if(nDataBufBitCnt == 64) // RTL8187S shouldn't enter this case
398 write_nic_dword(dev, SW_3W_DB0, *((u32*)pDataBuf));
399 write_nic_dword(dev, SW_3W_DB1, *((u32*)(pDataBuf + 4)));
404 int ByteCnt = nDataBufBitCnt / 8;
405 //printk("%d\n",nDataBufBitCnt);
406 if ((nDataBufBitCnt % 8) != 0)
407 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
410 if (nDataBufBitCnt > 64)
411 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
414 for(idx = 0; idx < ByteCnt; idx++)
416 write_nic_byte(dev, (SW_3W_DB0+idx), *(pDataBuf+idx));
424 // SI - reg274[3:0] : RF register's Address
425 write_nic_word(dev, SW_3W_DB0, *((u16*)pDataBuf) );
429 // PI - reg274[15:12] : RF register's Address
430 write_nic_word(dev, SW_3W_DB0, (*((u16*)pDataBuf)) << 12);
434 // Set up command: WE or RE.
437 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_WE);
441 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_RE);
444 // Check if DONE is set.
445 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
447 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
448 if( (u1bTmp & SW_3W_CMD1_DONE) != 0 )
455 write_nic_byte(dev, SW_3W_CMD1, 0);
457 // Read back data for read operation.
462 //Serial Interface : reg363_362[11:0]
463 *((u16*)pDataBuf) = read_nic_word(dev, SI_DATA_READ) ;
467 //Parallel Interface : reg361_360[11:0]
468 *((u16*)pDataBuf) = read_nic_word(dev, PI_DATA_READ);
471 *((u16*)pDataBuf) &= 0x0FFF;
482 struct net_device *dev,
495 // Check if WE and RE are cleared.
496 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
498 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
499 if( (u1bTmp & (SW_3W_CMD1_RE|SW_3W_CMD1_WE)) == 0 )
505 if (TryCnt == TC_3W_POLL_MAX_TRY_CNT)
506 panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp);
508 // Fill up data buffer for write operation.
509 if(nDataBufBitCnt == 16)
511 write_nic_word(dev, SW_3W_DB0, *((u16 *)pDataBuf));
513 else if(nDataBufBitCnt == 64)
515 write_nic_dword(dev, SW_3W_DB0, *((u32 *)pDataBuf));
516 write_nic_dword(dev, SW_3W_DB1, *((u32 *)(pDataBuf + 4)));
521 int ByteCnt = nDataBufBitCnt / 8;
523 if ((nDataBufBitCnt % 8) != 0)
524 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
527 if (nDataBufBitCnt > 64)
528 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
531 for(idx = 0; idx < ByteCnt; idx++)
533 write_nic_byte(dev, (SW_3W_DB0+idx), *(pDataBuf+idx));
537 // Fill up length field.
538 u1bTmp = (u8)(nDataBufBitCnt - 1); // Number of bits - 1.
540 u1bTmp |= SW_3W_CMD0_HOLD;
541 write_nic_byte(dev, SW_3W_CMD0, u1bTmp);
543 // Set up command: WE or RE.
546 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_WE);
550 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_RE);
553 // Check if WE and RE are cleared and DONE is set.
554 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
556 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
557 if( (u1bTmp & (SW_3W_CMD1_RE|SW_3W_CMD1_WE)) == 0 &&
558 (u1bTmp & SW_3W_CMD1_DONE) != 0 )
564 if(TryCnt == TC_3W_POLL_MAX_TRY_CNT)
566 //RT_ASSERT(TryCnt != TC_3W_POLL_MAX_TRY_CNT,
567 // ("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear or DONE is not set!!\n", u1bTmp));
568 // Workaround suggested by wcchu: clear WE here. 2006.07.07, by rcnjko.
569 write_nic_byte(dev, SW_3W_CMD1, 0);
572 // Read back data for read operation.
573 // <RJ_TODO> I am not sure if this is correct output format of a read operation.
576 if(nDataBufBitCnt == 16)
578 *((u16 *)pDataBuf) = read_nic_word(dev, SW_3W_DB0);
580 else if(nDataBufBitCnt == 64)
582 *((u32 *)pDataBuf) = read_nic_dword(dev, SW_3W_DB0);
583 *((u32 *)(pDataBuf + 4)) = read_nic_dword(dev, SW_3W_DB1);
588 int ByteCnt = nDataBufBitCnt / 8;
590 if ((nDataBufBitCnt % 8) != 0)
591 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
594 if (nDataBufBitCnt > 64)
595 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
598 for(idx = 0; idx < ByteCnt; idx++)
600 *(pDataBuf+idx) = read_nic_byte(dev, (SW_3W_DB0+idx));
613 struct net_device *dev,
623 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
626 switch(priv->rf_chip)
628 case RFCHIPID_RTL8225:
629 case RF_ZEBRA2: // Annie 2006-05-12.
630 case RF_ZEBRA4: //by amy
631 switch(priv->RegThreeWireMode)
634 { // Perform SW 3-wire programming by driver.
635 data2Write = (data << 4) | (u32)(offset & 0x0f);
638 ZEBRA_RFSerialWrite(dev, data2Write, len, low2high);
644 data2Write = (data << 4) | (u32)(offset & 0x0f);
648 (u8 *)(&data2Write), // pDataBuf,
649 len, // nDataBufBitCnt,
654 case HW_THREE_WIRE_PI: //Parallel Interface
656 data2Write = (data << 4) | (u32)(offset & 0x0f);
660 (u8*)(&data2Write), // pDataBuf,
661 len, // nDataBufBitCnt,
669 case HW_THREE_WIRE_SI: //Serial Interface
671 data2Write = (data << 4) | (u32)(offset & 0x0f);
673 // printk(" enter ZEBRA_RFSerialWrite\n ");
675 // ZEBRA_RFSerialWrite(dev, data2Write, len, low2high);
679 (u8*)(&data2Write), // pDataBuf,
680 len, // nDataBufBitCnt,
684 // printk(" exit ZEBRA_RFSerialWrite\n ");
690 DMESGE("RF_WriteReg(): invalid RegThreeWireMode(%d) !!!", priv->RegThreeWireMode);
696 DMESGE("RF_WriteReg(): unknown RFChipID: %#X", priv->rf_chip);
704 struct net_device *dev,
714 u16 oval,oval2,oval3,tmp, wReg80;
718 //PHAL_DATA_8187 pHalData = GetHalData8187(pAdapter);
719 { // RTL8187S HSSI Read/Write Function
720 u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
721 u1bTmp |= RF_SW_CFG_SI; //reg08[1]=1 Serial Interface(SI)
722 write_nic_byte(dev, RF_SW_CONFIG, u1bTmp);
725 wReg80 = oval = read_nic_word(dev, RFPinsOutput);
726 oval2 = read_nic_word(dev, RFPinsEnable);
727 oval3 = read_nic_word(dev, RFPinsSelect);
729 write_nic_word(dev, RFPinsEnable, oval2|0xf);
730 write_nic_word(dev, RFPinsSelect, oval3|0xf);
734 // We must clear BIT0-3 here, otherwise,
735 // SW_Enalbe will be true when we first call ZEBRA_RFSerialRead() after 8187MPVC open,
736 // which will cause the value read become 0. 2005.04.11, by rcnjko.
739 // Avoid collision with hardware three-wire.
741 twreg.struc.enableB = 1;
742 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(4);
745 twreg.struc.enableB = 0;
747 twreg.struc.read_write = 0;
748 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(5);
750 mask = (low2high) ? 0x01 : ((u32)0x01<<(32-1));
751 for(i = 0; i < wLength/2; i++)
753 twreg.struc.data = ((data2Write&mask) != 0) ? 1 : 0;
754 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(1);
756 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
757 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
759 mask = (low2high) ? (mask<<1): (mask>>1);
763 // 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.
764 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0xe); // turn off data enable
765 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0xe);
767 twreg.struc.read_write=1;
768 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
770 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
773 twreg.struc.data = ((data2Write&mask) != 0) ? 1: 0;
774 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
775 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
778 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(1);
780 mask = (low2high) ? (mask<<1) : (mask>>1);
784 twreg.struc.data = 0;
785 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
786 mask = (low2high) ? 0x01 : ((u32)0x01 << (12-1));
789 // 061016, by rcnjko:
790 // We must set data pin to HW controled, otherwise RF can't driver it and
791 // value RF register won't be able to read back properly.
793 write_nic_word(dev, RFPinsEnable, ( ((oval2|0x0E) & (~0x01))) );
795 for(i = 0; i < rLength; i++)
797 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(1);
799 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
800 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
801 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
802 tmp = read_nic_word(dev, RFPinsInput);
803 tdata.longData = tmp;
804 *data2Read |= tdata.struc.clk ? mask : 0;
807 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
809 mask = (low2high) ? (mask<<1) : (mask>>1);
811 twreg.struc.enableB = 1;
813 twreg.struc.data = 0;
814 twreg.struc.read_write = 1;
815 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
817 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, oval2|0x8); // Set To Output Enable
818 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.
819 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0x1bff);
820 write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch
821 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0x0488);
822 write_nic_word(dev, RFPinsOutput, 0x3a0);
823 //PlatformEFIOWrite2Byte(pAdapter, RFPinsOutput, 0x0480);
829 struct net_device *dev,
833 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
840 switch(priv->rf_chip)
842 case RFCHIPID_RTL8225:
845 switch(priv->RegThreeWireMode)
847 case HW_THREE_WIRE_PI: // For 87S Parallel Interface.
849 data2Write = ((u32)(offset&0x0f));
853 (u8*)(&data2Write), // pDataBuf,
854 wlen, // nDataBufBitCnt,
857 dataRead= data2Write;
861 case HW_THREE_WIRE_SI: // For 87S Serial Interface.
863 data2Write = ((u32)(offset&0x0f)) ;
867 (u8*)(&data2Write), // pDataBuf,
868 wlen, // nDataBufBitCnt,
872 dataRead= data2Write;
876 // Perform SW 3-wire programming by driver.
879 data2Write = ((u32)(offset&0x1f)) << 27; // For Zebra E-cut. 2005.04.11, by rcnjko.
883 ZEBRA_RFSerialRead(dev, data2Write, wlen,&dataRead,rlen, low2high);
897 // by Owen on 04/07/14 for writing BB register successfully
900 struct net_device *dev,
908 UCharData = (u8)((Data & 0x0000ff00) >> 8);
909 PlatformIOWrite4Byte(dev, PhyAddr, Data);
910 //for(TimeoutCounter = 10; TimeoutCounter > 0; TimeoutCounter--)
912 PlatformIOWrite4Byte(dev, PhyAddr, Data & 0xffffff7f);
913 RegisterContent = PlatformIORead1Byte(dev, PhyDataR);
914 //if(UCharData == RegisterContent)
921 struct net_device *dev,
928 PlatformIOWrite4Byte(dev, PhyAddr, addr & 0xffffff7f);
929 RegisterContent = PlatformIORead1Byte(dev, PhyDataR);
931 return RegisterContent;
936 // Perform Antenna settings with antenna diversity on 87SE.
937 // Created by Roger, 2008.01.25.
940 SetAntennaConfig87SE(
941 struct net_device *dev,
942 u8 DefaultAnt, // 0: Main, 1: Aux.
943 bool bAntDiversity // 1:Enable, 0: Disable.
946 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
947 bool bAntennaSwitched = true;
949 //printk("SetAntennaConfig87SE(): DefaultAnt(%d), bAntDiversity(%d)\n", DefaultAnt, bAntDiversity);
951 // Threshold for antenna diversity.
952 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
954 if( bAntDiversity ) // Enable Antenna Diversity.
956 if( DefaultAnt == 1 ) // aux antenna
958 // Mac register, aux antenna
959 write_nic_byte(dev, ANTSEL, 0x00);
961 // Config CCK RX antenna.
962 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
963 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
965 // Config OFDM RX antenna.
966 write_phy_ofdm(dev, 0x0D, 0x54); // Reg0d : 54
967 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
969 else // use main antenna
971 // Mac register, main antenna
972 write_nic_byte(dev, ANTSEL, 0x03);
974 // Config CCK RX antenna.
975 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
976 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
978 // Config OFDM RX antenna.
979 write_phy_ofdm(dev, 0x0d, 0x5c); // Reg0d : 5c
980 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
983 else // Disable Antenna Diversity.
985 if( DefaultAnt == 1 ) // aux Antenna
987 // Mac register, aux antenna
988 write_nic_byte(dev, ANTSEL, 0x00);
990 // Config CCK RX antenna.
991 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
992 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
994 // Config OFDM RX antenna.
995 write_phy_ofdm(dev, 0x0D, 0x54); // Reg0d : 54
996 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
1000 // Mac register, main antenna
1001 write_nic_byte(dev, ANTSEL, 0x03);
1003 // Config CCK RX antenna.
1004 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
1005 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
1007 // Config OFDM RX antenna.
1008 write_phy_ofdm(dev, 0x0D, 0x5c); // Reg0d : 5c
1009 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
1012 priv->CurrAntennaIndex = DefaultAnt; // Update default settings.
1013 return bAntennaSwitched;
1016 /*---------------------------------------------------------------
1017 * Hardware Initialization.
1018 * the code is ported from Windows source code
1019 ----------------------------------------------------------------*/
1022 ZEBRA_Config_85BASIC_HardCode(
1023 struct net_device *dev
1027 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1030 u32 u4bRegOffset, u4bRegValue, u4bRF23, u4bRF24;
1034 //=============================================================================
1035 // 87S_PCIE :: RADIOCFG.TXT
1036 //=============================================================================
1039 // Page1 : reg16-reg30
1040 RF_WriteReg(dev, 0x00, 0x013f); mdelay(1); // switch to page1
1041 u4bRF23= RF_ReadReg(dev, 0x08); mdelay(1);
1042 u4bRF24= RF_ReadReg(dev, 0x09); mdelay(1);
1044 if (u4bRF23==0x818 && u4bRF24==0x70C && priv->card_8185 == VERSION_8187S_C)
1045 priv->card_8185 = VERSION_8187S_D;
1047 // Page0 : reg0-reg15
1049 // RF_WriteReg(dev, 0x00, 0x003f); mdelay(1);//1
1050 RF_WriteReg(dev, 0x00, 0x009f); mdelay(1);// 1
1052 RF_WriteReg(dev, 0x01, 0x06e0); mdelay(1);
1054 // RF_WriteReg(dev, 0x02, 0x004c); mdelay(1);//2
1055 RF_WriteReg(dev, 0x02, 0x004d); mdelay(1);// 2
1057 // RF_WriteReg(dev, 0x03, 0x0000); mdelay(1);//3
1058 RF_WriteReg(dev, 0x03, 0x07f1); mdelay(1);// 3
1060 RF_WriteReg(dev, 0x04, 0x0975); mdelay(1);
1061 RF_WriteReg(dev, 0x05, 0x0c72); mdelay(1);
1062 RF_WriteReg(dev, 0x06, 0x0ae6); mdelay(1);
1063 RF_WriteReg(dev, 0x07, 0x00ca); mdelay(1);
1064 RF_WriteReg(dev, 0x08, 0x0e1c); mdelay(1);
1065 RF_WriteReg(dev, 0x09, 0x02f0); mdelay(1);
1066 RF_WriteReg(dev, 0x0a, 0x09d0); mdelay(1);
1067 RF_WriteReg(dev, 0x0b, 0x01ba); mdelay(1);
1068 RF_WriteReg(dev, 0x0c, 0x0640); mdelay(1);
1069 RF_WriteReg(dev, 0x0d, 0x08df); mdelay(1);
1070 RF_WriteReg(dev, 0x0e, 0x0020); mdelay(1);
1071 RF_WriteReg(dev, 0x0f, 0x0990); mdelay(1);
1074 // Page1 : reg16-reg30
1075 RF_WriteReg(dev, 0x00, 0x013f); mdelay(1);
1077 RF_WriteReg(dev, 0x03, 0x0806); mdelay(1);
1079 if(priv->card_8185 < VERSION_8187S_C)
1081 RF_WriteReg(dev, 0x04, 0x03f7); mdelay(1);
1082 RF_WriteReg(dev, 0x05, 0x05ab); mdelay(1);
1083 RF_WriteReg(dev, 0x06, 0x00c1); mdelay(1);
1087 RF_WriteReg(dev, 0x04, 0x03a7); mdelay(1);
1088 RF_WriteReg(dev, 0x05, 0x059b); mdelay(1);
1089 RF_WriteReg(dev, 0x06, 0x0081); mdelay(1);
1093 RF_WriteReg(dev, 0x07, 0x01A0); mdelay(1);
1094 // Don't write RF23/RF24 to make a difference between 87S C cut and D cut. asked by SD3 stevenl.
1095 // RF_WriteReg(dev, 0x08, 0x0597); mdelay(1);
1096 // RF_WriteReg(dev, 0x09, 0x050a); mdelay(1);
1097 RF_WriteReg(dev, 0x0a, 0x0001); mdelay(1);
1098 RF_WriteReg(dev, 0x0b, 0x0418); mdelay(1);
1100 if(priv->card_8185 == VERSION_8187S_D)
1102 RF_WriteReg(dev, 0x0c, 0x0fbe); mdelay(1);
1103 RF_WriteReg(dev, 0x0d, 0x0008); mdelay(1);
1104 RF_WriteReg(dev, 0x0e, 0x0807); mdelay(1); // RX LO buffer
1108 RF_WriteReg(dev, 0x0c, 0x0fbe); mdelay(1);
1109 RF_WriteReg(dev, 0x0d, 0x0008); mdelay(1);
1110 RF_WriteReg(dev, 0x0e, 0x0806); mdelay(1); // RX LO buffer
1113 RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1);
1115 // RF_WriteReg(dev, 0x00, 0x017f); mdelay(1);//6
1116 RF_WriteReg(dev, 0x00, 0x01d7); mdelay(1);// 6
1118 RF_WriteReg(dev, 0x03, 0x0e00); mdelay(1);
1119 RF_WriteReg(dev, 0x04, 0x0e50); mdelay(1);
1122 RF_WriteReg(dev, 0x01, i); mdelay(1);
1123 RF_WriteReg(dev, 0x02, ZEBRA_RF_RX_GAIN_TABLE[i]); mdelay(1);
1124 //DbgPrint("RF - 0x%x = 0x%x", i, ZEBRA_RF_RX_GAIN_TABLE[i]);
1127 RF_WriteReg(dev, 0x05, 0x0203); mdelay(1); /// 203, 343
1128 //RF_WriteReg(dev, 0x06, 0x0300); mdelay(1); // 400
1129 RF_WriteReg(dev, 0x06, 0x0200); mdelay(1); // 400
1131 RF_WriteReg(dev, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30, and HSSI disable 137
1132 mdelay(10); // Deay 10 ms. //0xfd
1134 // RF_WriteReg(dev, 0x0c, 0x09be); mdelay(1); // 7
1135 //RF_WriteReg(dev, 0x0c, 0x07be); mdelay(1);
1136 //mdelay(10); // Deay 10 ms. //0xfd
1138 RF_WriteReg(dev, 0x0d, 0x0008); mdelay(1); // Z4 synthesizer loop filter setting, 392
1139 mdelay(10); // Deay 10 ms. //0xfd
1141 RF_WriteReg(dev, 0x00, 0x0037); mdelay(1); // switch to reg0-reg15, and HSSI disable
1142 mdelay(10); // Deay 10 ms. //0xfd
1144 RF_WriteReg(dev, 0x04, 0x0160); mdelay(1); // CBC on, Tx Rx disable, High gain
1145 mdelay(10); // Deay 10 ms. //0xfd
1147 RF_WriteReg(dev, 0x07, 0x0080); mdelay(1); // Z4 setted channel 1
1148 mdelay(10); // Deay 10 ms. //0xfd
1150 RF_WriteReg(dev, 0x02, 0x088D); mdelay(1); // LC calibration
1151 mdelay(200); // Deay 200 ms. //0xfd
1152 mdelay(10); // Deay 10 ms. //0xfd
1153 mdelay(10); // Deay 10 ms. //0xfd
1155 RF_WriteReg(dev, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30 137, and HSSI disable 137
1156 mdelay(10); // Deay 10 ms. //0xfd
1158 RF_WriteReg(dev, 0x07, 0x0000); mdelay(1);
1159 RF_WriteReg(dev, 0x07, 0x0180); mdelay(1);
1160 RF_WriteReg(dev, 0x07, 0x0220); mdelay(1);
1161 RF_WriteReg(dev, 0x07, 0x03E0); mdelay(1);
1163 // DAC calibration off 20070702
1164 RF_WriteReg(dev, 0x06, 0x00c1); mdelay(1);
1165 RF_WriteReg(dev, 0x0a, 0x0001); mdelay(1);
1167 // For crystal calibration, added by Roger, 2007.12.11.
1168 if( priv->bXtalCalibration ) // reg 30.
1169 { // enable crystal calibration.
1170 // RF Reg[30], (1)Xin:[12:9], Xout:[8:5], addr[4:0].
1171 // (2)PA Pwr delay timer[15:14], default: 2.4us, set BIT15=0
1172 // (3)RF signal on/off when calibration[13], default: on, set BIT13=0.
1173 // So we should minus 4 BITs offset.
1174 RF_WriteReg(dev, 0x0f, (priv->XtalCal_Xin<<5)|(priv->XtalCal_Xout<<1)|BIT11|BIT9); mdelay(1);
1175 printk("ZEBRA_Config_85BASIC_HardCode(): (%02x)\n",
1176 (priv->XtalCal_Xin<<5) | (priv->XtalCal_Xout<<1) | BIT11| BIT9);
1179 { // using default value. Xin=6, Xout=6.
1180 RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1);
1183 // RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1); //-by amy 080312
1185 RF_WriteReg(dev, 0x00, 0x00bf); mdelay(1); // switch to reg0-reg15, and HSSI enable
1186 // RF_WriteReg(dev, 0x0d, 0x009f); mdelay(1); // Rx BB start calibration, 00c//-edward
1187 RF_WriteReg(dev, 0x0d, 0x08df); mdelay(1); // Rx BB start calibration, 00c//+edward
1188 RF_WriteReg(dev, 0x02, 0x004d); mdelay(1); // temperature meter off
1189 RF_WriteReg(dev, 0x04, 0x0975); mdelay(1); // Rx mode
1190 mdelay(10); // Deay 10 ms. //0xfe
1191 mdelay(10); // Deay 10 ms. //0xfe
1192 mdelay(10); // Deay 10 ms. //0xfe
1193 RF_WriteReg(dev, 0x00, 0x0197); mdelay(1); // Rx mode//+edward
1194 RF_WriteReg(dev, 0x05, 0x05ab); mdelay(1); // Rx mode//+edward
1195 RF_WriteReg(dev, 0x00, 0x009f); mdelay(1); // Rx mode//+edward
1198 RF_WriteReg(dev, 0x00, 0x0197); mdelay(1);
1199 RF_WriteReg(dev, 0x05, 0x05ab); mdelay(1);
1200 RF_WriteReg(dev, 0x00, 0x009F); mdelay(1);
1202 RF_WriteReg(dev, 0x01, 0x0000); mdelay(1); // Rx mode//+edward
1203 RF_WriteReg(dev, 0x02, 0x0000); mdelay(1); // Rx mode//+edward
1204 //power save parameters.
1205 u1b24E = read_nic_byte(dev, 0x24E);
1206 write_nic_byte(dev, 0x24E, (u1b24E & (~(BIT5|BIT6))));
1208 //=============================================================================
1210 //=============================================================================
1212 //=============================================================================
1214 /* [POWER SAVE] Power Saving Parameters by jong. 2007-11-27
1215 CCK reg0x00[7]=1'b1 :power saving for TX (default)
1216 CCK reg0x00[6]=1'b1: power saving for RX (default)
1217 CCK reg0x06[4]=1'b1: turn off channel estimation related circuits if not doing channel estimation.
1218 CCK reg0x06[3]=1'b1: turn off unused circuits before cca = 1
1219 CCK reg0x06[2]=1'b1: turn off cck's circuit if macrst =0
1222 write_nic_dword(dev, PHY_ADR, 0x0100c880);
1223 write_nic_dword(dev, PHY_ADR, 0x01001c86);
1224 write_nic_dword(dev, PHY_ADR, 0x01007890);
1225 write_nic_dword(dev, PHY_ADR, 0x0100d0ae);
1226 write_nic_dword(dev, PHY_ADR, 0x010006af);
1227 write_nic_dword(dev, PHY_ADR, 0x01004681);
1229 write_phy_cck(dev,0x00,0xc8);
1230 write_phy_cck(dev,0x06,0x1c);
1231 write_phy_cck(dev,0x10,0x78);
1232 write_phy_cck(dev,0x2e,0xd0);
1233 write_phy_cck(dev,0x2f,0x06);
1234 write_phy_cck(dev,0x01,0x46);
1237 write_nic_byte(dev, CCK_TXAGC, 0x10);
1238 write_nic_byte(dev, OFDM_TXAGC, 0x1B);
1239 write_nic_byte(dev, ANTSEL, 0x03);
1243 //=============================================================================
1245 //=============================================================================
1247 // PlatformIOWrite4Byte( dev, PhyAddr, 0x00001280); // Annie, 2006-05-05
1248 write_phy_ofdm(dev, 0x00, 0x12);
1249 //WriteBBPortUchar(dev, 0x00001280);
1251 for (i=0; i<128; i++)
1253 //DbgPrint("AGC - [%x+1] = 0x%x\n", i, ZEBRA_AGC[i+1]);
1255 data = ZEBRA_AGC[i+1];
1257 data = data | 0x0000008F;
1259 addr = i + 0x80; //enable writing AGC table
1261 addr = addr | 0x0000008E;
1263 WriteBBPortUchar(dev, data);
1264 WriteBBPortUchar(dev, addr);
1265 WriteBBPortUchar(dev, 0x0000008E);
1268 PlatformIOWrite4Byte( dev, PhyAddr, 0x00001080); // Annie, 2006-05-05
1269 //WriteBBPortUchar(dev, 0x00001080);
1271 //=============================================================================
1273 //=============================================================================
1275 //=============================================================================
1280 u4bRegValue=OFDM_CONFIG[i];
1282 //DbgPrint("OFDM - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
1284 WriteBBPortUchar(dev,
1286 (u4bRegOffset & 0x7f) |
1287 ((u4bRegValue & 0xff) << 8)));
1290 //=============================================================================
1291 //by amy for antenna
1292 //=============================================================================
1294 // Config Sw/Hw Combinational Antenna Diversity. Added by Roger, 2008.02.26.
1295 SetAntennaConfig87SE(dev, priv->bDefaultAntenna1, priv->bSwAntennaDiverity);
1298 // Config Sw/Hw Antenna Diversity
1299 if( priv->bSwAntennaDiverity ) // Use SW+Hw Antenna Diversity
1301 if( priv->bDefaultAntenna1 == true ) // aux antenna
1303 // Mac register, aux antenna
1304 write_nic_byte(dev, ANTSEL, 0x00);
1305 // Config CCK RX antenna.
1306 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
1307 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
1308 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
1309 // Config OFDM RX antenna.
1310 write_phy_ofdm(dev, 0x0d, 0x54); // Reg0d : 54
1311 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
1313 else // main antenna
1315 // Mac register, main antenna
1316 write_nic_byte(dev, ANTSEL, 0x03);
1318 // Config CCK RX antenna.
1319 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
1320 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
1321 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
1322 // Config OFDM RX antenna.
1323 write_phy_ofdm(dev, 0x0d, 0x5c); // Reg0d : 5c
1324 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
1327 else // Disable Antenna Diversity
1329 if( priv->bDefaultAntenna1 == true ) // aux Antenna
1331 // Mac register, aux antenna
1332 write_nic_byte(dev, ANTSEL, 0x00);
1333 // Config CCK RX antenna.
1334 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
1335 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
1336 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
1337 // Config OFDM RX antenna.
1338 write_phy_ofdm(dev, 0x0d, 0x54); // Reg0d : 54
1339 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
1341 else // main Antenna
1343 // Mac register, main antenna
1344 write_nic_byte(dev, ANTSEL, 0x03);
1345 // Config CCK RX antenna.
1346 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
1347 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
1348 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
1349 // Config OFDM RX antenna.
1350 write_phy_ofdm(dev, 0x0d, 0x5c); // Reg0d : 5c
1351 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
1355 //by amy for antenna
1361 struct net_device *dev
1364 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1365 //unsigned char* IGTable;
1366 //u8 DIG_CurrentInitialGain = 4;
1367 //unsigned char u1Tmp;
1370 if(priv->eRFPowerState != eRfOn)
1372 //Don't access BB/RF under disable PLL situation.
1373 //RT_TRACE(COMP_DIG, DBG_LOUD, ("UpdateInitialGain - pHalData->eRFPowerState!=eRfOn\n"));
1374 // Back to the original state
1375 priv->InitialGain= priv->InitialGainBackUp;
1379 switch(priv->rf_chip)
1383 // Dynamic set initial gain, by shien chang, 2006.07.14
1384 switch(priv->InitialGain)
1387 DMESG("RTL8185B + 8225 Initial Gain State 1: -82 dBm \n");
1388 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1389 write_nic_dword(dev, PhyAddr, 0x86a4); mdelay(1);
1390 write_nic_dword(dev, PhyAddr, 0xfa85); mdelay(1);
1394 DMESG("RTL8185B + 8225 Initial Gain State 2: -82 dBm \n");
1395 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1396 write_nic_dword(dev, PhyAddr, 0x86a4); mdelay(1);
1397 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1401 DMESG("RTL8185B + 8225 Initial Gain State 3: -82 dBm \n");
1402 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1403 write_nic_dword(dev, PhyAddr, 0x96a4); mdelay(1);
1404 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1408 DMESG("RTL8185B + 8225 Initial Gain State 4: -78 dBm \n");
1409 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1410 write_nic_dword(dev, PhyAddr, 0xa6a4); mdelay(1);
1411 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1415 DMESG("RTL8185B + 8225 Initial Gain State 5: -74 dBm \n");
1416 write_nic_dword(dev, PhyAddr, 0x3697); mdelay(1);
1417 write_nic_dword(dev, PhyAddr, 0xa6a4); mdelay(1);
1418 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1422 DMESG("RTL8185B + 8225 Initial Gain State 6: -70 dBm \n");
1423 write_nic_dword(dev, PhyAddr, 0x4697); mdelay(1);
1424 write_nic_dword(dev, PhyAddr, 0xa6a4); mdelay(1);
1425 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1429 DMESG("RTL8185B + 8225 Initial Gain State 7: -66 dBm \n");
1430 write_nic_dword(dev, PhyAddr, 0x5697); mdelay(1);
1431 write_nic_dword(dev, PhyAddr, 0xa6a4); mdelay(1);
1432 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1436 DMESG("RTL8185B + 8225 Initial Gain State 1: -82 dBm (default)\n");
1437 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1438 write_nic_dword(dev, PhyAddr, 0x86a4); mdelay(1);
1439 write_nic_dword(dev, PhyAddr, 0xfa85); mdelay(1);
1445 // Dynamic set initial gain, follow 87B
1446 switch(priv->InitialGain)
1449 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm \n");
1450 write_phy_ofdm(dev, 0x17, 0x26); mdelay(1);
1451 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1452 write_phy_ofdm(dev, 0x05, 0xfa); mdelay(1);
1456 //DMESG("RTL8187 + 8225 Initial Gain State 2: -82 dBm \n");
1457 write_phy_ofdm(dev, 0x17, 0x36); mdelay(1);
1458 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1459 write_phy_ofdm(dev, 0x05, 0xfa); mdelay(1);
1463 //DMESG("RTL8187 + 8225 Initial Gain State 3: -82 dBm \n");
1464 write_phy_ofdm(dev, 0x17, 0x36); mdelay(1);
1465 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1466 write_phy_ofdm(dev, 0x05, 0xfb); mdelay(1);
1470 //DMESG("RTL8187 + 8225 Initial Gain State 4: -78 dBm \n");
1471 write_phy_ofdm(dev, 0x17, 0x46); mdelay(1);
1472 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1473 write_phy_ofdm(dev, 0x05, 0xfb); mdelay(1);
1477 //DMESG("RTL8187 + 8225 Initial Gain State 5: -74 dBm \n");
1478 write_phy_ofdm(dev, 0x17, 0x46); mdelay(1);
1479 write_phy_ofdm(dev, 0x24, 0x96); mdelay(1);
1480 write_phy_ofdm(dev, 0x05, 0xfb); mdelay(1);
1484 //DMESG ("RTL8187 + 8225 Initial Gain State 6: -70 dBm \n");
1485 write_phy_ofdm(dev, 0x17, 0x56); mdelay(1);
1486 write_phy_ofdm(dev, 0x24, 0x96); mdelay(1);
1487 write_phy_ofdm(dev, 0x05, 0xfc); mdelay(1);
1491 //DMESG("RTL8187 + 8225 Initial Gain State 7: -66 dBm \n");
1492 write_phy_ofdm(dev, 0x17, 0x56); mdelay(1);
1493 write_phy_ofdm(dev, 0x24, 0xa6); mdelay(1);
1494 write_phy_ofdm(dev, 0x05, 0xfc); mdelay(1);
1498 //DMESG("RTL8187 + 8225 Initial Gain State 8:\n");
1499 write_phy_ofdm(dev, 0x17, 0x66); mdelay(1);
1500 write_phy_ofdm(dev, 0x24, 0xb6); mdelay(1);
1501 write_phy_ofdm(dev, 0x05, 0xfc); mdelay(1);
1506 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm (default)\n");
1507 write_phy_ofdm(dev, 0x17, 0x26); mdelay(1);
1508 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1509 write_phy_ofdm(dev, 0x05, 0xfa); mdelay(1);
1516 DMESG("UpdateInitialGain(): unknown RFChipID: %#X\n", priv->rf_chip);
1522 // Tx Power tracking mechanism routine on 87SE.
1523 // Created by Roger, 2007.12.11.
1526 InitTxPwrTracking87SE(
1527 struct net_device *dev
1530 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1533 u4bRfReg = RF_ReadReg(dev, 0x02);
1535 // Enable Thermal meter indication.
1536 //printk("InitTxPwrTracking87SE(): Enable thermal meter indication, Write RF[0x02] = %#x", u4bRfReg|PWR_METER_EN);
1537 RF_WriteReg(dev, 0x02, u4bRfReg|PWR_METER_EN); mdelay(1);
1542 struct net_device *dev
1545 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1546 write_nic_dword(dev, RCR, priv->ReceiveConfig);
1547 priv->RFProgType = read_nic_byte(dev, CONFIG4) & 0x03;
1549 switch(priv->rf_chip)
1553 ZEBRA_Config_85BASIC_HardCode( dev);
1557 // Set default initial gain state to 4, approved by SD3 DZ, by Bruce, 2007-06-06.
1558 if(priv->bDigMechanism)
1560 if(priv->InitialGain == 0)
1561 priv->InitialGain = 4;
1562 //printk("PhyConfig8185(): DIG is enabled, set default initial gain index to %d\n", priv->InitialGain);
1566 // Enable thermal meter indication to implement TxPower tracking on 87SE.
1567 // We initialize thermal meter here to avoid unsuccessful configuration.
1568 // Added by Roger, 2007.12.11.
1570 if(priv->bTxPowerTrack)
1571 InitTxPwrTracking87SE(dev);
1574 priv->InitialGainBackUp= priv->InitialGain;
1575 UpdateInitialGain(dev);
1585 struct net_device *dev
1588 //RTL8185_TODO: Determine Retrylimit, TxAGC, AutoRateFallback control.
1589 // u8 bUNIVERSAL_CONTROL_RL = 1;
1590 u8 bUNIVERSAL_CONTROL_RL = 0;
1592 u8 bUNIVERSAL_CONTROL_AGC = 1;
1593 u8 bUNIVERSAL_CONTROL_ANT = 1;
1594 u8 bAUTO_RATE_FALLBACK_CTL = 1;
1596 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1597 //struct ieee80211_device *ieee = priv->ieee80211;
1598 //if(IS_WIRELESS_MODE_A(dev) || IS_WIRELESS_MODE_G(dev))
1599 //{by amy 080312 if((ieee->mode == IEEE_G)||(ieee->mode == IEEE_A))
1601 // write_nic_word(dev, BRSR, 0xffff);
1605 // write_nic_word(dev, BRSR, 0x000f);
1608 write_nic_word(dev, BRSR, 0x0fff);
1610 val8 = read_nic_byte(dev, CW_CONF);
1612 if(bUNIVERSAL_CONTROL_RL)
1617 write_nic_byte(dev, CW_CONF, val8);
1620 val8 = read_nic_byte(dev, TXAGC_CTL);
1621 if(bUNIVERSAL_CONTROL_AGC)
1623 write_nic_byte(dev, CCK_TXAGC, 128);
1624 write_nic_byte(dev, OFDM_TXAGC, 128);
1629 val8 = val8 | 0x01 ;
1633 write_nic_byte(dev, TXAGC_CTL, val8);
1635 // Tx Antenna including Feedback control
1636 val8 = read_nic_byte(dev, TXAGC_CTL );
1638 if(bUNIVERSAL_CONTROL_ANT)
1640 write_nic_byte(dev, ANTSEL, 0x00);
1645 val8 = val8 & (val8|0x02); //xiong-2006-11-15
1648 write_nic_byte(dev, TXAGC_CTL, val8);
1650 // Auto Rate fallback control
1651 val8 = read_nic_byte(dev, RATE_FALLBACK);
1653 if( bAUTO_RATE_FALLBACK_CTL )
1655 val8 |= RATE_FALLBACK_CTL_ENABLE | RATE_FALLBACK_CTL_AUTO_STEP1;
1657 // <RJ_TODO_8185B> We shall set up the ARFR according to user's setting.
1658 //write_nic_word(dev, ARFR, 0x0fff); // set 1M ~ 54M
1661 PlatformIOWrite2Byte(dev, ARFR, 0x0fff); // set 1M ~ 54M
1663 // Aadded by Roger, 2007.11.15.
1664 PlatformIOWrite2Byte(dev, ARFR, 0x0fff); //set 1M ~ 54Mbps.
1670 write_nic_byte(dev, RATE_FALLBACK, val8);
1676 MacConfig_85BASIC_HardCode(
1677 struct net_device *dev)
1679 //============================================================================
1681 //============================================================================
1684 u32 u4bRegOffset, u4bRegValue,u4bPageIndex = 0;
1687 nLinesRead=sizeof(MAC_REG_TABLE)/2;
1689 for(i = 0; i < nLinesRead; i++) //nLinesRead=101
1691 u4bRegOffset=MAC_REG_TABLE[i][0];
1692 u4bRegValue=MAC_REG_TABLE[i][1];
1694 if(u4bRegOffset == 0x5e)
1696 u4bPageIndex = u4bRegValue;
1700 u4bRegOffset |= (u4bPageIndex << 8);
1702 //DbgPrint("MAC - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
1703 write_nic_byte(dev, u4bRegOffset, (u8)u4bRegValue);
1705 //============================================================================
1712 struct net_device *dev)
1716 MacConfig_85BASIC_HardCode(dev);
1718 //============================================================================
1720 // Follow TID_AC_MAP of WMac.
1721 write_nic_word(dev, TID_AC_MAP, 0xfa50);
1723 // Interrupt Migration, Jong suggested we use set 0x0000 first, 2005.12.14, by rcnjko.
1724 write_nic_word(dev, IntMig, 0x0000);
1726 // Prevent TPC to cause CRC error. Added by Annie, 2006-06-10.
1727 PlatformIOWrite4Byte(dev, 0x1F0, 0x00000000);
1728 PlatformIOWrite4Byte(dev, 0x1F4, 0x00000000);
1729 PlatformIOWrite1Byte(dev, 0x1F8, 0x00);
1731 // Asked for by SD3 CM Lin, 2006.06.27, by rcnjko.
1732 //PlatformIOWrite4Byte(dev, RFTiming, 0x00004001);
1735 write_nic_dword(dev, RFTiming, 0x00004001);
1737 // power save parameter based on "87SE power save parameters 20071127.doc", as follow.
1739 //Enable DA10 TX power saving
1740 u1DA = read_nic_byte(dev, PHYPR);
1741 write_nic_byte(dev, PHYPR, (u1DA | BIT2) );
1744 write_nic_word(dev, 0x360, 0x1000);
1745 write_nic_word(dev, 0x362, 0x1000);
1748 write_nic_word(dev, 0x370, 0x0560);
1749 write_nic_word(dev, 0x372, 0x0560);
1750 write_nic_word(dev, 0x374, 0x0DA4);
1751 write_nic_word(dev, 0x376, 0x0DA4);
1752 write_nic_word(dev, 0x378, 0x0560);
1753 write_nic_word(dev, 0x37A, 0x0560);
1754 write_nic_word(dev, 0x37C, 0x00EC);
1755 // write_nic_word(dev, 0x37E, 0x00FE);//-edward
1756 write_nic_word(dev, 0x37E, 0x00EC);//+edward
1757 write_nic_byte(dev, 0x24E,0x01);
1766 GetSupportedWirelessMode8185(
1767 struct net_device *dev
1770 u8 btSupportedWirelessMode = 0;
1771 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1773 switch(priv->rf_chip)
1777 btSupportedWirelessMode = (WIRELESS_MODE_B | WIRELESS_MODE_G);
1780 btSupportedWirelessMode = WIRELESS_MODE_B;
1784 return btSupportedWirelessMode;
1788 ActUpdateChannelAccessSetting(
1789 struct net_device *dev,
1790 WIRELESS_MODE WirelessMode,
1791 PCHANNEL_ACCESS_SETTING ChnlAccessSetting
1794 struct r8180_priv *priv = ieee80211_priv(dev);
1795 struct ieee80211_device *ieee = priv->ieee80211;
1798 //PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
1799 u8 bFollowLegacySetting = 0;
1804 // TODO: We still don't know how to set up these registers, just follow WMAC to
1805 // verify 8185B FPAG.
1808 // Jong said CWmin/CWmax register are not functional in 8185B,
1809 // so we shall fill channel access realted register into AC parameter registers,
1812 ChnlAccessSetting->SIFS_Timer = 0x22; // Suggested by Jong, 2005.12.08.
1813 ChnlAccessSetting->DIFS_Timer = 0x1C; // 2006.06.02, by rcnjko.
1814 ChnlAccessSetting->SlotTimeTimer = 9; // 2006.06.02, by rcnjko.
1815 ChnlAccessSetting->EIFS_Timer = 0x5B; // Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
1816 ChnlAccessSetting->CWminIndex = 3; // 2006.06.02, by rcnjko.
1817 ChnlAccessSetting->CWmaxIndex = 7; // 2006.06.02, by rcnjko.
1819 write_nic_byte(dev, SIFS, ChnlAccessSetting->SIFS_Timer);
1820 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SLOT_TIME, &ChnlAccessSetting->SlotTimeTimer ); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
1821 write_nic_byte(dev, SLOT, ChnlAccessSetting->SlotTimeTimer); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
1823 u1bAIFS = aSifsTime + (2 * ChnlAccessSetting->SlotTimeTimer );
1825 //write_nic_byte(dev, AC_VO_PARAM, u1bAIFS);
1826 //write_nic_byte(dev, AC_VI_PARAM, u1bAIFS);
1827 //write_nic_byte(dev, AC_BE_PARAM, u1bAIFS);
1828 //write_nic_byte(dev, AC_BK_PARAM, u1bAIFS);
1830 write_nic_byte(dev, EIFS, ChnlAccessSetting->EIFS_Timer);
1832 write_nic_byte(dev, AckTimeOutReg, 0x5B); // <RJ_EXPR_QOS> Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
1835 // <RJ_TODO_NOW_8185B> Update ECWmin/ECWmax, AIFS, TXOP Limit of each AC to the value defined by SPEC.
1836 if( pStaQos->CurrentQosMode > QOS_DISABLE )
1838 if(pStaQos->QBssWirelessMode == WirelessMode)
1840 // Follow AC Parameters of the QBSS.
1841 for(eACI = 0; eACI < AC_MAX; eACI++)
1843 Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, (pu1Byte)(&(pStaQos->WMMParamEle.AcParam[eACI])) );
1848 // Follow Default WMM AC Parameters.
1849 bFollowLegacySetting = 1;
1855 bFollowLegacySetting = 1;
1859 // this setting is copied from rtl8187B. xiong-2006-11-13
1860 if(bFollowLegacySetting)
1865 // Follow 802.11 seeting to AC parameter, all AC shall use the same parameter.
1866 // 2005.12.01, by rcnjko.
1868 AcParam.longData = 0;
1869 AcParam.f.AciAifsn.f.AIFSN = 2; // Follow 802.11 DIFS.
1870 AcParam.f.AciAifsn.f.ACM = 0;
1871 AcParam.f.Ecw.f.ECWmin = ChnlAccessSetting->CWminIndex; // Follow 802.11 CWmin.
1872 AcParam.f.Ecw.f.ECWmax = ChnlAccessSetting->CWmaxIndex; // Follow 802.11 CWmax.
1873 AcParam.f.TXOPLimit = 0;
1875 //lzm reserved 080826
1877 // For turbo mode setting. port from 87B by Isaiah 2008-08-01
1878 if( ieee->current_network.Turbo_Enable == 1 )
1879 AcParam.f.TXOPLimit = 0x01FF;
1880 // For 87SE with Intel 4965 Ad-Hoc mode have poor throughput (19MB)
1881 if (ieee->iw_mode == IW_MODE_ADHOC)
1882 AcParam.f.TXOPLimit = 0x0020;
1885 for(eACI = 0; eACI < AC_MAX; eACI++)
1887 AcParam.f.AciAifsn.f.ACI = (u8)eACI;
1889 PAC_PARAM pAcParam = (PAC_PARAM)(&AcParam);
1894 // Retrive paramters to udpate.
1895 eACI = pAcParam->f.AciAifsn.f.ACI;
1896 u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * ChnlAccessSetting->SlotTimeTimer + aSifsTime;
1897 u4bAcParam = ( (((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET) |
1898 (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET) |
1899 (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET) |
1900 (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
1905 //write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
1909 //write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
1913 //write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
1917 //write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
1921 DMESGW( "SetHwReg8185(): invalid ACI: %d !\n", eACI);
1926 // If it is set, immediately set ACM control bit to downgrading AC for passing WMM testplan. Annie, 2005-12-13.
1927 //write_nic_byte(dev, ACM_CONTROL, pAcParam->f.AciAifsn);
1929 PACI_AIFSN pAciAifsn = (PACI_AIFSN)(&pAcParam->f.AciAifsn);
1930 AC_CODING eACI = pAciAifsn->f.ACI;
1933 //for 8187B AsynIORead issue
1935 u8 AcmCtrl = pHalData->AcmControl;
1939 if( pAciAifsn->f.ACM )
1944 AcmCtrl |= (BEQ_ACM_EN|BEQ_ACM_CTL|ACM_HW_EN); // or 0x21
1948 AcmCtrl |= (VIQ_ACM_EN|VIQ_ACM_CTL|ACM_HW_EN); // or 0x42
1952 AcmCtrl |= (VOQ_ACM_EN|VOQ_ACM_CTL|ACM_HW_EN); // or 0x84
1956 DMESGW("SetHwReg8185(): [HW_VAR_ACM_CTRL] ACM set failed: eACI is %d\n", eACI );
1965 AcmCtrl &= ( (~BEQ_ACM_EN) & (~BEQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0xDE
1969 AcmCtrl &= ( (~VIQ_ACM_EN) & (~VIQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0xBD
1973 AcmCtrl &= ( (~VOQ_ACM_EN) & (~VOQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0x7B
1981 //printk(KERN_WARNING "SetHwReg8185(): [HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl);
1984 pHalData->AcmControl = AcmCtrl;
1986 //write_nic_byte(dev, ACM_CONTROL, AcmCtrl);
1987 write_nic_byte(dev, ACM_CONTROL, 0);
1997 ActSetWirelessMode8185(
1998 struct net_device *dev,
2002 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2003 struct ieee80211_device *ieee = priv->ieee80211;
2004 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
2005 u8 btSupportedWirelessMode = GetSupportedWirelessMode8185(dev);
2007 if( (btWirelessMode & btSupportedWirelessMode) == 0 )
2008 { // Don't switch to unsupported wireless mode, 2006.02.15, by rcnjko.
2009 DMESGW("ActSetWirelessMode8185(): WirelessMode(%d) is not supported (%d)!\n",
2010 btWirelessMode, btSupportedWirelessMode);
2014 // 1. Assign wireless mode to swtich if necessary.
2015 if (btWirelessMode == WIRELESS_MODE_AUTO)
2017 if((btSupportedWirelessMode & WIRELESS_MODE_A))
2019 btWirelessMode = WIRELESS_MODE_A;
2021 else if((btSupportedWirelessMode & WIRELESS_MODE_G))
2023 btWirelessMode = WIRELESS_MODE_G;
2025 else if((btSupportedWirelessMode & WIRELESS_MODE_B))
2027 btWirelessMode = WIRELESS_MODE_B;
2031 DMESGW("ActSetWirelessMode8185(): No valid wireless mode supported, btSupportedWirelessMode(%x)!!!\n",
2032 btSupportedWirelessMode);
2033 btWirelessMode = WIRELESS_MODE_B;
2038 // 2. Swtich band: RF or BB specific actions,
2039 // for example, refresh tables in omc8255, or change initial gain if necessary.
2040 switch(priv->rf_chip)
2045 // Nothing to do for Zebra to switch band.
2046 // Update current wireless mode if we swtich to specified band successfully.
2047 ieee->mode = (WIRELESS_MODE)btWirelessMode;
2052 DMESGW("ActSetWirelessMode8185(): unsupported RF: 0x%X !!!\n", priv->rf_chip);
2056 // 3. Change related setting.
2057 if( ieee->mode == WIRELESS_MODE_A ){
2058 DMESG("WIRELESS_MODE_A\n");
2060 else if( ieee->mode == WIRELESS_MODE_B ){
2061 DMESG("WIRELESS_MODE_B\n");
2063 else if( ieee->mode == WIRELESS_MODE_G ){
2064 DMESG("WIRELESS_MODE_G\n");
2067 ActUpdateChannelAccessSetting( dev, ieee->mode, &priv->ChannelAccessSetting);
2070 void rtl8185b_irq_enable(struct net_device *dev)
2072 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2074 priv->irq_enabled = 1;
2075 write_nic_dword(dev, IMR, priv->IntrMask);
2077 //by amy for power save
2079 DrvIFIndicateDisassociation(
2080 struct net_device *dev,
2084 //printk("==> DrvIFIndicateDisassociation()\n");
2086 // nothing is needed after disassociation request.
2088 //printk("<== DrvIFIndicateDisassociation()\n");
2092 struct net_device *dev
2095 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2098 //printk("XXXXXXXXXX MgntDisconnect IBSS\n");
2100 DrvIFIndicateDisassociation(dev, unspec_reason);
2102 // PlatformZeroMemory( pMgntInfo->Bssid, 6 );
2103 for(i=0;i<6;i++) priv->ieee80211->current_network.bssid[i] = 0x55;
2105 priv->ieee80211->state = IEEE80211_NOLINK;
2109 // Vista add a Adhoc profile, HW radio off untill OID_DOT11_RESET_REQUEST
2110 // Driver would set MSR=NO_LINK, then HW Radio ON, MgntQueue Stuck.
2111 // Because Bcn DMA isn't complete, mgnt queue would stuck until Bcn packet send.
2113 // Disable Beacon Queue Own bit, suggested by jong
2114 // Adapter->HalFunc.SetTxDescOWNHandler(Adapter, BEACON_QUEUE, 0, 0);
2115 ieee80211_stop_send_beacons(priv->ieee80211);
2117 priv->ieee80211->link_change(dev);
2118 notify_wx_assoc_event(priv->ieee80211);
2120 // Stop SW Beacon.Use hw beacon so do not need to do so.by amy
2122 if(pMgntInfo->bEnableSwBeaconTimer)
2124 // SwBeaconTimer will stop if pMgntInfo->mIbss==FALSE, see SwBeaconCallback() for details.
2125 // comment out by haich, 2007.10.01
2126 //#if DEV_BUS_TYPE==USB_INTERFACE
2127 PlatformCancelTimer( Adapter, &pMgntInfo->SwBeaconTimer);
2132 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE );
2136 MlmeDisassociateRequest(
2137 struct net_device *dev,
2142 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2145 SendDisassociation(priv->ieee80211, asSta, asRsn );
2147 if( memcmp(priv->ieee80211->current_network.bssid, asSta, 6 ) == 0 ){
2148 //ShuChen TODO: change media status.
2149 //ShuChen TODO: What to do when disassociate.
2150 DrvIFIndicateDisassociation(dev, unspec_reason);
2153 // pMgntInfo->AsocTimestamp = 0;
2154 for(i=0;i<6;i++) priv->ieee80211->current_network.bssid[i] = 0x22;
2155 // pMgntInfo->mBrates.Length = 0;
2156 // Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
2158 ieee80211_disassociate(priv->ieee80211);
2167 struct net_device *dev,
2171 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2174 // Commented out by rcnjko, 2005.01.27:
2175 // I move SecClearAllKeys() to MgntActSet_802_11_DISASSOCIATE().
2177 // //2004/09/15, kcwu, the key should be cleared, or the new handshaking will not success
2178 // SecClearAllKeys(Adapter);
2180 // In WPA WPA2 need to Clear all key ... because new key will set after new handshaking.
2182 if( pMgntInfo->SecurityInfo.AuthMode > RT_802_11AuthModeAutoSwitch ||
2183 (pMgntInfo->bAPSuportCCKM && pMgntInfo->bCCX8021xenable) ) // In CCKM mode will Clear key
2185 SecClearAllKeys(Adapter);
2186 RT_TRACE(COMP_SEC, DBG_LOUD,("======>CCKM clear key..."))
2189 // 2004.10.11, by rcnjko.
2190 //MlmeDisassociateRequest( Adapter, pMgntInfo->Bssid, disas_lv_ss );
2191 MlmeDisassociateRequest( dev, priv->ieee80211->current_network.bssid, asRsn );
2193 priv->ieee80211->state = IEEE80211_NOLINK;
2194 // pMgntInfo->AsocTimestamp = 0;
2198 struct net_device *dev,
2202 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2204 // Schedule an workitem to wake up for ps mode, 070109, by rcnjko.
2207 if(pMgntInfo->mPss != eAwake)
2210 // Using AwkaeTimer to prevent mismatch ps state.
2211 // In the timer the state will be changed according to the RF is being awoke or not. By Bruce, 2007-10-31.
2213 // PlatformScheduleWorkItem( &(pMgntInfo->AwakeWorkItem) );
2214 PlatformSetTimer( Adapter, &(pMgntInfo->AwakeTimer), 0 );
2218 // Indication of disassociation event.
2219 //DrvIFIndicateDisassociation(Adapter, asRsn);
2220 if(IS_DOT11D_ENABLE(priv->ieee80211))
2221 Dot11d_Reset(priv->ieee80211);
2222 // In adhoc mode, update beacon frame.
2223 if( priv->ieee80211->state == IEEE80211_LINKED )
2225 if( priv->ieee80211->iw_mode == IW_MODE_ADHOC )
2227 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectIBSS\n"));
2228 //printk("MgntDisconnect() ===> MgntDisconnectIBSS\n");
2229 MgntDisconnectIBSS(dev);
2231 if( priv->ieee80211->iw_mode == IW_MODE_INFRA )
2233 // We clear key here instead of MgntDisconnectAP() because that
2234 // MgntActSet_802_11_DISASSOCIATE() is an interface called by OS,
2235 // e.g. OID_802_11_DISASSOCIATE in Windows while as MgntDisconnectAP() is
2236 // used to handle disassociation related things to AP, e.g. send Disassoc
2237 // frame to AP. 2005.01.27, by rcnjko.
2238 // SecClearAllKeys(Adapter);
2240 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectAP\n"));
2241 //printk("MgntDisconnect() ===> MgntDisconnectAP\n");
2242 MgntDisconnectAP(dev, asRsn);
2245 // Inidicate Disconnect, 2005.02.23, by rcnjko.
2246 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE);
2253 // Chang RF Power State.
2254 // Note that, only MgntActSet_RF_State() is allowed to set HW_VAR_RF_STATE.
2261 struct net_device *dev,
2262 RT_RF_POWER_STATE eRFPowerState
2265 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2266 bool bResult = false;
2268 // printk("---------> SetRFPowerState(): eRFPowerState(%d)\n", eRFPowerState);
2269 if(eRFPowerState == priv->eRFPowerState)
2271 // printk("<--------- SetRFPowerState(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState);
2275 switch(priv->rf_chip)
2279 bResult = SetZebraRFPowerState8185(dev, eRFPowerState);
2283 printk("SetRFPowerState8185(): unknown RFChipID: 0x%X!!!\n", priv->rf_chip);
2286 // printk("<--------- SetRFPowerState(): bResult(%d)\n", bResult);
2291 HalEnableRx8185Dummy(
2292 struct net_device *dev
2297 HalDisableRx8185Dummy(
2298 struct net_device *dev
2304 MgntActSet_RF_State(
2305 struct net_device *dev,
2306 RT_RF_POWER_STATE StateToSet,
2310 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2311 bool bActionAllowed = false;
2312 bool bConnectBySSID = false;
2313 RT_RF_POWER_STATE rtState;
2314 u16 RFWaitCounter = 0;
2316 // printk("===>MgntActSet_RF_State(): StateToSet(%d), ChangeSource(0x%x)\n",StateToSet, ChangeSource);
2318 // Prevent the race condition of RF state change. By Bruce, 2007-11-28.
2319 // Only one thread can change the RF state at one time, and others should wait to be executed.
2324 // down(&priv->rf_state);
2325 spin_lock_irqsave(&priv->rf_ps_lock,flag);
2326 if(priv->RFChangeInProgress)
2328 // printk("====================>haha111111111\n");
2329 // up(&priv->rf_state);
2330 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): RF Change in progress! Wait to set..StateToSet(%d).\n", StateToSet));
2331 spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
2332 // Set RF after the previous action is done.
2333 while(priv->RFChangeInProgress)
2336 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Wait 1 ms (%d times)...\n", RFWaitCounter));
2337 udelay(1000); // 1 ms
2339 // Wait too long, return FALSE to avoid to be stuck here.
2340 if(RFWaitCounter > 1000) // 1sec
2342 // RT_ASSERT(FALSE, ("MgntActSet_RF_State(): Wait too logn to set RF\n"));
2343 printk("MgntActSet_RF_State(): Wait too long to set RF\n");
2344 // TODO: Reset RF state?
2351 // printk("========================>haha2\n");
2352 priv->RFChangeInProgress = true;
2353 // up(&priv->rf_state);
2354 spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
2359 rtState = priv->eRFPowerState;
2366 // Turn On RF no matter the IPS setting because we need to update the RF state to Ndis under Vista, or
2367 // the Windows does not allow the driver to perform site survey any more. By Bruce, 2007-10-02.
2369 priv->RfOffReason &= (~ChangeSource);
2371 if(! priv->RfOffReason)
2373 priv->RfOffReason = 0;
2374 bActionAllowed = true;
2376 if(rtState == eRfOff && ChangeSource >=RF_CHANGE_BY_HW && !priv->bInHctTest)
2378 bConnectBySSID = true;
2382 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State - eRfon reject pMgntInfo->RfOffReason= 0x%x, ChangeSource=0x%X\n", pMgntInfo->RfOffReason, ChangeSource));
2387 // 070125, rcnjko: we always keep connected in AP mode.
2389 if (priv->RfOffReason > RF_CHANGE_BY_IPS)
2393 // Disconnect to current BSS when radio off. Asked by QuanTa.
2397 // Calling MgntDisconnect() instead of MgntActSet_802_11_DISASSOCIATE(),
2398 // because we do NOT need to set ssid to dummy ones.
2399 // Revised by Roger, 2007.12.04.
2401 MgntDisconnect( dev, disas_lv_ss );
2403 // Clear content of bssDesc[] and bssDesc4Query[] to avoid reporting old bss to UI.
2404 // 2007.05.28, by shien chang.
2405 // PlatformZeroMemory( pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2406 // pMgntInfo->NumBssDesc = 0;
2407 // PlatformZeroMemory( pMgntInfo->bssDesc4Query, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2408 // pMgntInfo->NumBssDesc4Query = 0;
2413 priv->RfOffReason |= ChangeSource;
2414 bActionAllowed = true;
2418 priv->RfOffReason |= ChangeSource;
2419 bActionAllowed = true;
2428 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, pMgntInfo->RfOffReason));
2429 // Config HW to the specified mode.
2430 // printk("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, priv->RfOffReason);
2431 SetRFPowerState(dev, StateToSet);
2434 if(StateToSet == eRfOn)
2436 HalEnableRx8185Dummy(dev);
2439 // by amy not supported
2440 // MgntActSet_802_11_SSID(Adapter, Adapter->MgntInfo.Ssid.Octet, Adapter->MgntInfo.Ssid.Length, TRUE );
2444 else if(StateToSet == eRfOff)
2446 HalDisableRx8185Dummy(dev);
2451 // printk("MgntActSet_RF_State(): Action is rejected.... StateToSet(%d), ChangeSource(%#X), RfOffReason(%#X)\n", StateToSet, ChangeSource, priv->RfOffReason);
2454 // Release RF spinlock
2455 // down(&priv->rf_state);
2456 spin_lock_irqsave(&priv->rf_ps_lock,flag);
2457 priv->RFChangeInProgress = false;
2458 // up(&priv->rf_state);
2459 spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
2460 // printk("<===MgntActSet_RF_State()\n");
2461 return bActionAllowed;
2465 struct net_device *dev
2468 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2472 // This flag "bSwRfProcessing", indicates the status of IPS procedure, should be set if the IPS workitem
2473 // is really scheduled.
2474 // The old code, sets this flag before scheduling the IPS workitem and however, at the same time the
2475 // previous IPS workitem did not end yet, fails to schedule the current workitem. Thus, bSwRfProcessing
2476 // blocks the IPS procedure of switching RF.
2477 // By Bruce, 2007-12-25.
2479 priv->bSwRfProcessing = true;
2481 MgntActSet_RF_State(dev, priv->eInactivePowerState, RF_CHANGE_BY_IPS);
2484 // To solve CAM values miss in RF OFF, rewrite CAM values after RF ON. By Bruce, 2007-09-20.
2489 if( ( pMgntInfo->SecurityInfo.PairwiseEncAlgorithm == WEP104_Encryption ) ||
2490 (pMgntInfo->SecurityInfo.PairwiseEncAlgorithm == WEP40_Encryption) )
2492 if( pMgntInfo->SecurityInfo.KeyLen[index] != 0)
2493 pAdapter->HalFunc.SetKeyHandler(pAdapter, index, 0, FALSE, pMgntInfo->SecurityInfo.PairwiseEncAlgorithm, TRUE, FALSE);
2499 priv->bSwRfProcessing = false;
2504 // Enter the inactive power save mode. RF will be off
2505 // 2007.08.17, by shien chang.
2509 struct net_device *dev
2512 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2513 RT_RF_POWER_STATE rtState;
2514 //printk("==============================>enter IPS\n");
2515 if (priv->bInactivePs)
2517 rtState = priv->eRFPowerState;
2520 // Added by Bruce, 2007-12-25.
2521 // Do not enter IPS in the following conditions:
2522 // (1) RF is already OFF or Sleep
2523 // (2) bSwRfProcessing (indicates the IPS is still under going)
2524 // (3) Connectted (only disconnected can trigger IPS)
2525 // (4) IBSS (send Beacon)
2526 // (5) AP mode (send Beacon)
2528 if (rtState == eRfOn && !priv->bSwRfProcessing
2529 && (priv->ieee80211->state != IEEE80211_LINKED ))
2531 // printk("IPSEnter(): Turn off RF.\n");
2532 priv->eInactivePowerState = eRfOff;
2533 InactivePowerSave(dev);
2536 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2540 struct net_device *dev
2543 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2544 RT_RF_POWER_STATE rtState;
2545 //printk("===================================>leave IPS\n");
2546 if (priv->bInactivePs)
2548 rtState = priv->eRFPowerState;
2549 if ((rtState == eRfOff || rtState == eRfSleep) && (!priv->bSwRfProcessing) && priv->RfOffReason <= RF_CHANGE_BY_IPS)
2551 // printk("IPSLeave(): Turn on RF.\n");
2552 priv->eInactivePowerState = eRfOn;
2553 InactivePowerSave(dev);
2556 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2558 //by amy for power save
2559 void rtl8185b_adapter_start(struct net_device *dev)
2561 struct r8180_priv *priv = ieee80211_priv(dev);
2562 struct ieee80211_device *ieee = priv->ieee80211;
2564 u8 SupportedWirelessMode;
2565 u8 InitWirelessMode;
2566 u8 bInvalidWirelessMode = 0;
2574 //rtl8180_rtx_disable(dev);
2576 write_nic_byte(dev,0x24e, (BIT5|BIT6|BIT0));
2580 priv->dma_poll_mask = 0;
2581 priv->dma_poll_stop_mask = 0;
2583 //rtl8180_beacon_tx_disable(dev);
2585 HwConfigureRTL8185(dev);
2587 write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
2588 write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff );
2590 write_nic_byte(dev, MSR, read_nic_byte(dev, MSR) & 0xf3); // default network type to 'No Link'
2592 //write_nic_byte(dev, BRSR, 0x0); // Set BRSR= 1M
2594 write_nic_word(dev, BcnItv, 100);
2595 write_nic_word(dev, AtimWnd, 2);
2597 //PlatformEFIOWrite2Byte(dev, FEMR, 0xFFFF);
2598 PlatformIOWrite2Byte(dev, FEMR, 0xFFFF);
2600 write_nic_byte(dev, WPA_CONFIG, 0);
2602 MacConfig_85BASIC(dev);
2604 // Override the RFSW_CTRL (MAC offset 0x272-0x273), 2006.06.07, by rcnjko.
2605 // BT_DEMO_BOARD type
2606 PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x569a);
2608 //#ifdef CONFIG_RTL818X_S
2609 // for jong required
2610 // PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2614 //PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2616 //-----------------------------------------------------------------------------
2617 // Set up PHY related.
2618 //-----------------------------------------------------------------------------
2619 // Enable Config3.PARAM_En to revise AnaaParm.
2620 write_nic_byte(dev, CR9346, 0xc0); // enable config register write
2622 tmpu8 = read_nic_byte(dev, CONFIG3);
2623 write_nic_byte(dev, CONFIG3, (tmpu8 |CONFIG3_PARM_En) );
2625 // Turn on Analog power.
2626 // Asked for by William, otherwise, MAC 3-wire can't work, 2006.06.27, by rcnjko.
2627 write_nic_dword(dev, ANAPARAM2, ANAPARM2_ASIC_ON);
2628 write_nic_dword(dev, ANAPARAM, ANAPARM_ASIC_ON);
2630 write_nic_word(dev, ANAPARAM3, 0x0010);
2633 write_nic_byte(dev, CONFIG3, tmpu8);
2634 write_nic_byte(dev, CR9346, 0x00);
2635 //{by amy 080312 for led
2636 // enable EEM0 and EEM1 in 9346CR
2637 btCR9346 = read_nic_byte(dev, CR9346);
2638 write_nic_byte(dev, CR9346, (btCR9346|0xC0) );
2640 // B cut use LED1 to control HW RF on/off
2641 TmpU1b = read_nic_byte(dev, CONFIG5);
2642 TmpU1b = TmpU1b & ~BIT3;
2643 write_nic_byte(dev,CONFIG5, TmpU1b);
2645 // disable EEM0 and EEM1 in 9346CR
2646 btCR9346 &= ~(0xC0);
2647 write_nic_byte(dev, CR9346, btCR9346);
2649 //Enable Led (suggested by Jong)
2650 // B-cut RF Radio on/off 5e[3]=0
2651 btPSR = read_nic_byte(dev, PSR);
2652 write_nic_byte(dev, PSR, (btPSR | BIT3));
2653 //by amy 080312 for led}
2654 // setup initial timing for RFE.
2655 write_nic_word(dev, RFPinsOutput, 0x0480);
2656 SetOutputEnableOfRfPins(dev);
2657 write_nic_word(dev, RFPinsSelect, 0x2488);
2662 // We assume RegWirelessMode has already been initialized before,
2663 // however, we has to validate the wireless mode here and provide a reasonble
2664 // initialized value if necessary. 2005.01.13, by rcnjko.
2665 SupportedWirelessMode = GetSupportedWirelessMode8185(dev);
2666 if( (ieee->mode != WIRELESS_MODE_B) &&
2667 (ieee->mode != WIRELESS_MODE_G) &&
2668 (ieee->mode != WIRELESS_MODE_A) &&
2669 (ieee->mode != WIRELESS_MODE_AUTO))
2670 { // It should be one of B, G, A, or AUTO.
2671 bInvalidWirelessMode = 1;
2674 { // One of B, G, A, or AUTO.
2675 // Check if the wireless mode is supported by RF.
2676 if( (ieee->mode != WIRELESS_MODE_AUTO) &&
2677 (ieee->mode & SupportedWirelessMode) == 0 )
2679 bInvalidWirelessMode = 1;
2683 if(bInvalidWirelessMode || ieee->mode==WIRELESS_MODE_AUTO)
2684 { // Auto or other invalid value.
2685 // Assigne a wireless mode to initialize.
2686 if((SupportedWirelessMode & WIRELESS_MODE_A))
2688 InitWirelessMode = WIRELESS_MODE_A;
2690 else if((SupportedWirelessMode & WIRELESS_MODE_G))
2692 InitWirelessMode = WIRELESS_MODE_G;
2694 else if((SupportedWirelessMode & WIRELESS_MODE_B))
2696 InitWirelessMode = WIRELESS_MODE_B;
2700 DMESGW("InitializeAdapter8185(): No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n",
2701 SupportedWirelessMode);
2702 InitWirelessMode = WIRELESS_MODE_B;
2705 // Initialize RegWirelessMode if it is not a valid one.
2706 if(bInvalidWirelessMode)
2708 ieee->mode = (WIRELESS_MODE)InitWirelessMode;
2712 { // One of B, G, A.
2713 InitWirelessMode = ieee->mode;
2715 //by amy for power save
2717 // printk("initialize ENABLE_IPS\n");
2718 priv->eRFPowerState = eRfOff;
2719 priv->RfOffReason = 0;
2722 // u32 tmp = jiffies;
2723 MgntActSet_RF_State(dev, eRfOn, 0);
2725 // printk("rf on cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
2727 // DrvIFIndicateCurrentPhyStatus(priv);
2729 // If inactive power mode is enabled, disable rf while in disconnected state.
2730 // 2007.07.16, by shien chang.
2732 if (priv->bInactivePs)
2735 // u32 tmp = jiffies;
2736 MgntActSet_RF_State(dev,eRfOff, RF_CHANGE_BY_IPS);
2738 // printk("rf off cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
2743 //by amy for power save
2745 // Turn off RF if necessary. 2005.08.23, by rcnjko.
2746 // We shall turn off RF after setting CMDR, otherwise,
2747 // RF will be turnned on after we enable MAC Tx/Rx.
2748 if(Adapter->MgntInfo.RegRfOff == TRUE)
2750 SetRFPowerState8185(Adapter, RF_OFF);
2754 SetRFPowerState8185(Adapter, RF_ON);
2758 /* //these is equal with above TODO.
2759 write_nic_byte(dev, CR9346, 0xc0); // enable config register write
2760 write_nic_byte(dev, CONFIG3, read_nic_byte(dev, CONFIG3) | CONFIG3_PARM_En);
2761 RF_WriteReg(dev, 0x4, 0x9FF);
2762 write_nic_dword(dev, ANAPARAM2, ANAPARM2_ASIC_ON);
2763 write_nic_dword(dev, ANAPARAM, ANAPARM_ASIC_ON);
2764 write_nic_byte(dev, CONFIG3, (read_nic_byte(dev, CONFIG3)&(~CONFIG3_PARM_En)));
2765 write_nic_byte(dev, CR9346, 0x00);
2768 ActSetWirelessMode8185(dev, (u8)(InitWirelessMode));
2770 //-----------------------------------------------------------------------------
2772 rtl8185b_irq_enable(dev);
2774 netif_start_queue(dev);
2779 void rtl8185b_rx_enable(struct net_device *dev)
2783 /* for now we accept data, management & ctl frame*/
2784 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2786 rxconf=read_nic_dword(dev,RX_CONF);
2787 rxconf = rxconf &~ MAC_FILTER_MASK;
2788 rxconf = rxconf | (1<<ACCEPT_MNG_FRAME_SHIFT);
2789 rxconf = rxconf | (1<<ACCEPT_DATA_FRAME_SHIFT);
2790 rxconf = rxconf | (1<<ACCEPT_BCAST_FRAME_SHIFT);
2791 rxconf = rxconf | (1<<ACCEPT_MCAST_FRAME_SHIFT);
2792 // rxconf = rxconf | (1<<ACCEPT_CRCERR_FRAME_SHIFT);
2793 if (dev->flags & IFF_PROMISC) DMESG ("NIC in promisc mode");
2795 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
2796 dev->flags & IFF_PROMISC){
2797 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
2799 rxconf = rxconf | (1<<ACCEPT_NICMAC_FRAME_SHIFT);
2800 if(priv->card_8185 == 0)
2801 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
2804 /*if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
2805 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
2806 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
2809 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
2810 rxconf = rxconf | (1<<ACCEPT_CTL_FRAME_SHIFT);
2811 rxconf = rxconf | (1<<ACCEPT_ICVERR_FRAME_SHIFT);
2812 rxconf = rxconf | (1<<ACCEPT_PWR_FRAME_SHIFT);
2815 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
2816 rxconf = rxconf | (1<<ACCEPT_CRCERR_FRAME_SHIFT);
2818 //if(!priv->card_8185){
2819 rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
2820 rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
2823 rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
2824 rxconf = rxconf &~ MAX_RX_DMA_MASK;
2825 rxconf = rxconf | (MAX_RX_DMA_2048<<MAX_RX_DMA_SHIFT);
2827 //if(!priv->card_8185)
2828 rxconf = rxconf | RCR_ONLYERLPKT;
2830 rxconf = rxconf &~ RCR_CS_MASK;
2831 if(!priv->card_8185)
2832 rxconf |= (priv->rcr_csense<<RCR_CS_SHIFT);
2833 // rxconf &=~ 0xfff00000;
2834 // rxconf |= 0x90100000;//9014f76f;
2835 write_nic_dword(dev, RX_CONF, rxconf);
2838 if (dev->flags & IFF_PROMISC) DMESG ("NIC in promisc mode");
2840 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
2841 dev->flags & IFF_PROMISC){
2842 priv->ReceiveConfig = priv->ReceiveConfig & (~RCR_APM);
2843 priv->ReceiveConfig = priv->ReceiveConfig | RCR_AAP;
2846 /*if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
2847 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
2848 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
2851 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
2852 priv->ReceiveConfig = priv->ReceiveConfig | RCR_ACF | RCR_APWRMGT | RCR_AICV;
2855 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
2856 priv->ReceiveConfig = priv->ReceiveConfig | RCR_ACRC32;
2858 write_nic_dword(dev, RCR, priv->ReceiveConfig);
2863 DMESG("rxconf: %x %x",priv->ReceiveConfig ,read_nic_dword(dev,RCR));
2865 cmd=read_nic_byte(dev,CMD);
2866 write_nic_byte(dev,CMD,cmd | (1<<CMD_RX_ENABLE_SHIFT));
2870 void rtl8185b_tx_enable(struct net_device *dev)
2876 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2879 txconf= read_nic_dword(dev,TX_CONF);
2880 if(priv->card_8185){
2883 byte = read_nic_byte(dev,CW_CONF);
2884 byte &= ~(1<<CW_CONF_PERPACKET_CW_SHIFT);
2885 byte &= ~(1<<CW_CONF_PERPACKET_RETRY_SHIFT);
2886 write_nic_byte(dev, CW_CONF, byte);
2888 tx_agc_ctl = read_nic_byte(dev, TX_AGC_CTL);
2889 tx_agc_ctl &= ~(1<<TX_AGC_CTL_PERPACKET_GAIN_SHIFT);
2890 tx_agc_ctl &= ~(1<<TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT);
2891 tx_agc_ctl |=(1<<TX_AGC_CTL_FEEDBACK_ANT);
2892 write_nic_byte(dev, TX_AGC_CTL, tx_agc_ctl);
2894 write_nic_word(dev, 0x5e, 0x01);
2895 force_pci_posting(dev);
2897 write_nic_word(dev, 0xfe, 0x10);
2898 force_pci_posting(dev);
2900 write_nic_word(dev, 0x5e, 0x00);
2901 force_pci_posting(dev);
2904 write_nic_byte(dev, 0xec, 0x3f); /* Disable early TX */
2907 if(priv->card_8185){
2909 txconf = txconf &~ (1<<TCR_PROBE_NOTIMESTAMP_SHIFT);
2914 txconf= txconf &~ (1<<TX_CONF_HEADER_AUTOICREMENT_SHIFT);
2916 txconf= txconf | (1<<TX_CONF_HEADER_AUTOICREMENT_SHIFT);
2919 txconf = txconf &~ TX_LOOPBACK_MASK;
2920 txconf = txconf | (TX_LOOPBACK_NONE <<TX_LOOPBACK_SHIFT);
2921 txconf = txconf &~ TCR_DPRETRY_MASK;
2922 txconf = txconf &~ TCR_RTSRETRY_MASK;
2923 txconf = txconf | (priv->retry_data<<TX_DPRETRY_SHIFT);
2924 txconf = txconf | (priv->retry_rts<<TX_RTSRETRY_SHIFT);
2925 txconf = txconf &~ (1<<TX_NOCRC_SHIFT);
2927 if(priv->card_8185){
2928 if(priv->hw_plcp_len)
2929 txconf = txconf &~ TCR_PLCP_LEN;
2931 txconf = txconf | TCR_PLCP_LEN;
2933 txconf = txconf &~ TCR_SAT;
2935 txconf = txconf &~ TCR_MXDMA_MASK;
2936 txconf = txconf | (TCR_MXDMA_2048<<TCR_MXDMA_SHIFT);
2937 txconf = txconf | TCR_CWMIN;
2938 txconf = txconf | TCR_DISCW;
2940 // if(priv->ieee80211->hw_wep)
2941 // txconf=txconf &~ (1<<TX_NOICV_SHIFT);
2943 txconf=txconf | (1<<TX_NOICV_SHIFT);
2945 write_nic_dword(dev,TX_CONF,txconf);
2948 write_nic_dword(dev, TCR, priv->TransmitConfig);
2949 byte = read_nic_byte(dev, MSR);
2950 byte |= MSR_LINK_ENEDCA;
2951 write_nic_byte(dev, MSR, byte);
2956 DMESG("txconf: %x %x",priv->TransmitConfig,read_nic_dword(dev,TCR));
2959 cmd=read_nic_byte(dev,CMD);
2960 write_nic_byte(dev,CMD,cmd | (1<<CMD_TX_ENABLE_SHIFT));
2962 //write_nic_dword(dev,TX_CONF,txconf);
2966 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
2967 write_nic_byte(dev, TX_DMA_POLLING, priv->dma_poll_mask);
2968 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);