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 */
29 #include "ieee80211/dot11d.h"
32 //#define CONFIG_RTL8180_IO_MAP
34 #define TC_3W_POLL_MAX_TRY_CNT 5
35 static u8 MAC_REG_TABLE
[][2]={
37 // 0x34(BRSR), 0xBE(RATE_FALLBACK_CTL), 0x1E0(ARFR) would set in HwConfigureRTL8185()
38 // 0x272(RFSW_CTRL), 0x1CE(AESMSK_QC) set in InitializeAdapter8185().
39 // 0x1F0~0x1F8 set in MacConfig_85BASIC()
40 {0x08, 0xae}, {0x0a, 0x72}, {0x5b, 0x42},
41 {0x84, 0x88}, {0x85, 0x24}, {0x88, 0x54}, {0x8b, 0xb8}, {0x8c, 0x03},
42 {0x8d, 0x40}, {0x8e, 0x00}, {0x8f, 0x00}, {0x5b, 0x18}, {0x91, 0x03},
43 {0x94, 0x0F}, {0x95, 0x32},
44 {0x96, 0x00}, {0x97, 0x07}, {0xb4, 0x22}, {0xdb, 0x00},
45 {0xf0, 0x32}, {0xf1, 0x32}, {0xf2, 0x00}, {0xf3, 0x00}, {0xf4, 0x32},
46 {0xf5, 0x43}, {0xf6, 0x00}, {0xf7, 0x00}, {0xf8, 0x46}, {0xf9, 0xa4},
47 {0xfa, 0x00}, {0xfb, 0x00}, {0xfc, 0x96}, {0xfd, 0xa4}, {0xfe, 0x00},
51 // For Flextronics system Logo PCIHCT failure:
52 // 0x1C4~0x1CD set no-zero value to avoid PCI configuration space 0x45[7]=1
54 {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x04}, {0x5b, 0x00}, {0x60, 0x24},
55 {0x61, 0x97}, {0x62, 0xF0}, {0x63, 0x09}, {0x80, 0x0F}, {0x81, 0xFF},
56 {0x82, 0xFF}, {0x83, 0x03},
57 {0xC4, 0x22}, {0xC5, 0x22}, {0xC6, 0x22}, {0xC7, 0x22}, {0xC8, 0x22}, //lzm add 080826
58 {0xC9, 0x22}, {0xCA, 0x22}, {0xCB, 0x22}, {0xCC, 0x22}, {0xCD, 0x22},//lzm add 080826
64 {0x0c, 0x04}, {0x4c, 0x30}, {0x4d, 0x08}, {0x50, 0x05}, {0x51, 0xf5},
65 {0x52, 0x04}, {0x53, 0xa0}, {0x54, 0xff}, {0x55, 0xff}, {0x56, 0xff},
66 {0x57, 0xff}, {0x58, 0x08}, {0x59, 0x08}, {0x5a, 0x08}, {0x5b, 0x08},
67 {0x60, 0x08}, {0x61, 0x08}, {0x62, 0x08}, {0x63, 0x08}, {0x64, 0x2f},
68 {0x8c, 0x3f}, {0x8d, 0x3f}, {0x8e, 0x3f},
69 {0x8f, 0x3f}, {0xc4, 0xff}, {0xc5, 0xff}, {0xc6, 0xff}, {0xc7, 0xff},
70 {0xc8, 0x00}, {0xc9, 0x00}, {0xca, 0x80}, {0xcb, 0x00},
73 {0x5e, 0x00},{0x9f, 0x03}
77 static u8 ZEBRA_AGC
[]={
79 0x7E,0x7E,0x7E,0x7E,0x7D,0x7C,0x7B,0x7A,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,
80 0x71,0x70,0x6F,0x6E,0x6D,0x6C,0x6B,0x6A,0x69,0x68,0x67,0x66,0x65,0x64,0x63,0x62,
81 0x48,0x47,0x46,0x45,0x44,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x08,0x07,
82 0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
83 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x11,0x12,0x13,0x15,0x16,
84 0x17,0x17,0x18,0x18,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,
85 0x1f,0x1f,0x1f,0x20,0x20,0x20,0x20,0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x24,
86 0x24,0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F
89 static u32 ZEBRA_RF_RX_GAIN_TABLE
[]={
90 0x0096,0x0076,0x0056,0x0036,0x0016,0x01f6,0x01d6,0x01b6,
91 0x0196,0x0176,0x00F7,0x00D7,0x00B7,0x0097,0x0077,0x0057,
92 0x0037,0x00FB,0x00DB,0x00BB,0x00FF,0x00E3,0x00C3,0x00A3,
93 0x0083,0x0063,0x0043,0x0023,0x0003,0x01E3,0x01C3,0x01A3,
94 0x0183,0x0163,0x0143,0x0123,0x0103
97 static u8 OFDM_CONFIG
[]={
98 // OFDM reg0x06[7:0]=0xFF: Enable power saving mode in RX
99 // OFDM reg0x3C[4]=1'b1: Enable RX power saving mode
100 // ofdm 0x3a = 0x7b ,(original : 0xfb) For ECS shielding room TP test
103 0x10, 0x0F, 0x0A, 0x0C, 0x14, 0xFA, 0xFF, 0x50,
104 0x00, 0x50, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00,
106 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xA8, 0x26,
107 0x32, 0x33, 0x06, 0xA5, 0x6F, 0x55, 0xC8, 0xBB,
109 0x0A, 0xE1, 0x2C, 0x4A, 0x86, 0x83, 0x34, 0x00,
110 0x4F, 0x24, 0x6F, 0xC2, 0x03, 0x40, 0x80, 0x00,
112 0xC0, 0xC1, 0x58, 0xF1, 0x00, 0xC4, 0x90, 0x3e,
113 0xD8, 0x3C, 0x7B, 0x10, 0x10
116 /*---------------------------------------------------------------
118 * the code is ported from Windows source code
119 ----------------------------------------------------------------*/
122 PlatformIOWrite1Byte(
123 struct net_device
*dev
,
128 write_nic_byte(dev
, offset
, data
);
129 read_nic_byte(dev
, offset
); // To make sure write operation is completed, 2005.11.09, by rcnjko.
134 PlatformIOWrite2Byte(
135 struct net_device
*dev
,
140 write_nic_word(dev
, offset
, data
);
141 read_nic_word(dev
, offset
); // To make sure write operation is completed, 2005.11.09, by rcnjko.
145 u8
PlatformIORead1Byte(struct net_device
*dev
, u32 offset
);
148 PlatformIOWrite4Byte(
149 struct net_device
*dev
,
155 if (offset
== PhyAddr
)
156 {//For Base Band configuration.
157 unsigned char cmdByte
;
158 unsigned long dataBytes
;
162 cmdByte
= (u8
)(data
& 0x000000ff);
167 // The critical section is only BB read/write race condition.
169 // 1. We assume NO one will access BB at DIRQL, otherwise, system will crash for
170 // acquiring the spinlock in such context.
171 // 2. PlatformIOWrite4Byte() MUST NOT be recursive.
173 // NdisAcquireSpinLock( &(pDevice->IoSpinLock) );
175 for(idx
= 0; idx
< 30; idx
++)
176 { // Make sure command bit is clear before access it.
177 u1bTmp
= PlatformIORead1Byte(dev
, PhyAddr
);
178 if((u1bTmp
& BIT7
) == 0)
184 for(idx
=0; idx
< 3; idx
++)
186 PlatformIOWrite1Byte(dev
,offset
+1+idx
,((u8
*)&dataBytes
)[idx
] );
188 write_nic_byte(dev
, offset
, cmdByte
);
190 // NdisReleaseSpinLock( &(pDevice->IoSpinLock) );
194 write_nic_dword(dev
, offset
, data
);
195 read_nic_dword(dev
, offset
); // To make sure write operation is completed, 2005.11.09, by rcnjko.
201 struct net_device
*dev
,
207 data
= read_nic_byte(dev
, offset
);
215 struct net_device
*dev
,
221 data
= read_nic_word(dev
, offset
);
229 struct net_device
*dev
,
235 data
= read_nic_dword(dev
, offset
);
242 SetOutputEnableOfRfPins(
243 struct net_device
*dev
246 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
248 switch(priv
->rf_chip
)
250 case RFCHIPID_RTL8225
:
253 write_nic_word(dev
, RFPinsEnable
, 0x1bff);
254 //write_nic_word(dev, RFPinsEnable, 0x1fff);
261 struct net_device
*dev
,
269 u16 oval
,oval2
,oval3
;
274 // RTL8187S HSSI Read/Write Function
275 u1bTmp
= read_nic_byte(dev
, RF_SW_CONFIG
);
276 u1bTmp
|= RF_SW_CFG_SI
; //reg08[1]=1 Serial Interface(SI)
277 write_nic_byte(dev
, RF_SW_CONFIG
, u1bTmp
);
278 UshortBuffer
= read_nic_word(dev
, RFPinsOutput
);
279 oval
= UshortBuffer
& 0xfff8; // We shall clear bit0, 1, 2 first, 2005.10.28, by rcnjko.
281 oval2
= read_nic_word(dev
, RFPinsEnable
);
282 oval3
= read_nic_word(dev
, RFPinsSelect
);
284 // <RJ_NOTE> 3-wire should be controled by HW when we finish SW 3-wire programming. 2005.08.10, by rcnjko.
287 write_nic_word(dev
, RFPinsEnable
, (oval2
|0x0007)); // Set To Output Enable
288 write_nic_word(dev
, RFPinsSelect
, (oval3
|0x0007)); // Set To SW Switch
291 // Add this to avoid hardware and software 3-wire conflict.
292 // 2005.03.01, by rcnjko.
294 twreg
.struc
.enableB
= 1;
295 write_nic_word(dev
, RFPinsOutput
, (twreg
.longData
|oval
)); // Set SI_EN (RFLE)
297 twreg
.struc
.enableB
= 0;
298 write_nic_word(dev
, RFPinsOutput
, (twreg
.longData
|oval
)); // Clear SI_EN (RFLE)
301 mask
= (low2high
)?0x01:((u32
)0x01<<(totalLength
-1));
303 for(i
=0; i
<totalLength
/2; i
++)
305 twreg
.struc
.data
= ((data2Write
&mask
)!=0) ? 1 : 0;
306 write_nic_word(dev
, RFPinsOutput
, (twreg
.longData
|oval
));
308 write_nic_word(dev
, RFPinsOutput
, (twreg
.longData
|oval
));
309 write_nic_word(dev
, RFPinsOutput
, (twreg
.longData
|oval
));
311 mask
= (low2high
)?(mask
<<1):(mask
>>1);
312 twreg
.struc
.data
= ((data2Write
&mask
)!=0) ? 1 : 0;
313 write_nic_word(dev
, RFPinsOutput
, (twreg
.longData
|oval
));
314 write_nic_word(dev
, RFPinsOutput
, (twreg
.longData
|oval
));
316 write_nic_word(dev
, RFPinsOutput
, (twreg
.longData
|oval
));
317 mask
= (low2high
)?(mask
<<1):(mask
>>1);
320 twreg
.struc
.enableB
= 1;
322 twreg
.struc
.data
= 0;
323 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
);
326 write_nic_word(dev
, RFPinsOutput
, oval
|0x0004);
327 write_nic_word(dev
, RFPinsSelect
, oval3
|0x0000);
329 SetOutputEnableOfRfPins(dev
);
336 struct net_device
*dev
,
349 // Check if WE and RE are cleared.
350 for(TryCnt
= 0; TryCnt
< TC_3W_POLL_MAX_TRY_CNT
; TryCnt
++)
352 u1bTmp
= read_nic_byte(dev
, SW_3W_CMD1
);
353 if( (u1bTmp
& (SW_3W_CMD1_RE
|SW_3W_CMD1_WE
)) == 0 )
359 if (TryCnt
== TC_3W_POLL_MAX_TRY_CNT
) {
360 printk(KERN_ERR
"rtl8187se: HwThreeWire(): CmdReg:"
361 " %#X RE|WE bits are not clear!!\n", u1bTmp
);
366 // RTL8187S HSSI Read/Write Function
367 u1bTmp
= read_nic_byte(dev
, RF_SW_CONFIG
);
371 u1bTmp
|= RF_SW_CFG_SI
; //reg08[1]=1 Serial Interface(SI)
374 u1bTmp
&= ~RF_SW_CFG_SI
; //reg08[1]=0 Parallel Interface(PI)
377 write_nic_byte(dev
, RF_SW_CONFIG
, u1bTmp
);
381 // jong: HW SI read must set reg84[3]=0.
382 u1bTmp
= read_nic_byte(dev
, RFPinsSelect
);
384 write_nic_byte(dev
, RFPinsSelect
, u1bTmp
);
386 // Fill up data buffer for write operation.
390 if(nDataBufBitCnt
== 16)
392 write_nic_word(dev
, SW_3W_DB0
, *((u16
*)pDataBuf
));
394 else if(nDataBufBitCnt
== 64) // RTL8187S shouldn't enter this case
396 write_nic_dword(dev
, SW_3W_DB0
, *((u32
*)pDataBuf
));
397 write_nic_dword(dev
, SW_3W_DB1
, *((u32
*)(pDataBuf
+ 4)));
402 int ByteCnt
= nDataBufBitCnt
/ 8;
403 //printk("%d\n",nDataBufBitCnt);
404 if ((nDataBufBitCnt
% 8) != 0) {
405 printk(KERN_ERR
"rtl8187se: "
406 "HwThreeWire(): nDataBufBitCnt(%d)"
407 " should be multiple of 8!!!\n",
411 nDataBufBitCnt
&= ~7;
414 if (nDataBufBitCnt
> 64) {
415 printk(KERN_ERR
"rtl8187se: HwThreeWire():"
416 " nDataBufBitCnt(%d) should <= 64!!!\n",
422 for(idx
= 0; idx
< ByteCnt
; idx
++)
424 write_nic_byte(dev
, (SW_3W_DB0
+idx
), *(pDataBuf
+idx
));
432 // SI - reg274[3:0] : RF register's Address
433 write_nic_word(dev
, SW_3W_DB0
, *((u16
*)pDataBuf
) );
437 // PI - reg274[15:12] : RF register's Address
438 write_nic_word(dev
, SW_3W_DB0
, (*((u16
*)pDataBuf
)) << 12);
442 // Set up command: WE or RE.
445 write_nic_byte(dev
, SW_3W_CMD1
, SW_3W_CMD1_WE
);
449 write_nic_byte(dev
, SW_3W_CMD1
, SW_3W_CMD1_RE
);
452 // Check if DONE is set.
453 for(TryCnt
= 0; TryCnt
< TC_3W_POLL_MAX_TRY_CNT
; TryCnt
++)
455 u1bTmp
= read_nic_byte(dev
, SW_3W_CMD1
);
456 if( (u1bTmp
& SW_3W_CMD1_DONE
) != 0 )
463 write_nic_byte(dev
, SW_3W_CMD1
, 0);
465 // Read back data for read operation.
470 //Serial Interface : reg363_362[11:0]
471 *((u16
*)pDataBuf
) = read_nic_word(dev
, SI_DATA_READ
) ;
475 //Parallel Interface : reg361_360[11:0]
476 *((u16
*)pDataBuf
) = read_nic_word(dev
, PI_DATA_READ
);
479 *((u16
*)pDataBuf
) &= 0x0FFF;
490 struct net_device
*dev
,
503 // Check if WE and RE are cleared.
504 for(TryCnt
= 0; TryCnt
< TC_3W_POLL_MAX_TRY_CNT
; TryCnt
++)
506 u1bTmp
= read_nic_byte(dev
, SW_3W_CMD1
);
507 if( (u1bTmp
& (SW_3W_CMD1_RE
|SW_3W_CMD1_WE
)) == 0 )
513 if (TryCnt
== TC_3W_POLL_MAX_TRY_CNT
)
514 panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp
);
516 // Fill up data buffer for write operation.
517 if(nDataBufBitCnt
== 16)
519 write_nic_word(dev
, SW_3W_DB0
, *((u16
*)pDataBuf
));
521 else if(nDataBufBitCnt
== 64)
523 write_nic_dword(dev
, SW_3W_DB0
, *((u32
*)pDataBuf
));
524 write_nic_dword(dev
, SW_3W_DB1
, *((u32
*)(pDataBuf
+ 4)));
529 int ByteCnt
= nDataBufBitCnt
/ 8;
531 if ((nDataBufBitCnt
% 8) != 0)
532 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
535 if (nDataBufBitCnt
> 64)
536 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
539 for(idx
= 0; idx
< ByteCnt
; idx
++)
541 write_nic_byte(dev
, (SW_3W_DB0
+idx
), *(pDataBuf
+idx
));
545 // Fill up length field.
546 u1bTmp
= (u8
)(nDataBufBitCnt
- 1); // Number of bits - 1.
548 u1bTmp
|= SW_3W_CMD0_HOLD
;
549 write_nic_byte(dev
, SW_3W_CMD0
, u1bTmp
);
551 // Set up command: WE or RE.
554 write_nic_byte(dev
, SW_3W_CMD1
, SW_3W_CMD1_WE
);
558 write_nic_byte(dev
, SW_3W_CMD1
, SW_3W_CMD1_RE
);
561 // Check if WE and RE are cleared and DONE is set.
562 for(TryCnt
= 0; TryCnt
< TC_3W_POLL_MAX_TRY_CNT
; TryCnt
++)
564 u1bTmp
= read_nic_byte(dev
, SW_3W_CMD1
);
565 if( (u1bTmp
& (SW_3W_CMD1_RE
|SW_3W_CMD1_WE
)) == 0 &&
566 (u1bTmp
& SW_3W_CMD1_DONE
) != 0 )
572 if(TryCnt
== TC_3W_POLL_MAX_TRY_CNT
)
574 //RT_ASSERT(TryCnt != TC_3W_POLL_MAX_TRY_CNT,
575 // ("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear or DONE is not set!!\n", u1bTmp));
576 // Workaround suggested by wcchu: clear WE here. 2006.07.07, by rcnjko.
577 write_nic_byte(dev
, SW_3W_CMD1
, 0);
580 // Read back data for read operation.
581 // <RJ_TODO> I am not sure if this is correct output format of a read operation.
584 if(nDataBufBitCnt
== 16)
586 *((u16
*)pDataBuf
) = read_nic_word(dev
, SW_3W_DB0
);
588 else if(nDataBufBitCnt
== 64)
590 *((u32
*)pDataBuf
) = read_nic_dword(dev
, SW_3W_DB0
);
591 *((u32
*)(pDataBuf
+ 4)) = read_nic_dword(dev
, SW_3W_DB1
);
596 int ByteCnt
= nDataBufBitCnt
/ 8;
598 if ((nDataBufBitCnt
% 8) != 0)
599 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
602 if (nDataBufBitCnt
> 64)
603 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
606 for(idx
= 0; idx
< ByteCnt
; idx
++)
608 *(pDataBuf
+idx
) = read_nic_byte(dev
, (SW_3W_DB0
+idx
));
621 struct net_device
*dev
,
631 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
634 switch(priv
->rf_chip
)
636 case RFCHIPID_RTL8225
:
637 case RF_ZEBRA2
: // Annie 2006-05-12.
638 case RF_ZEBRA4
: //by amy
639 switch(priv
->RegThreeWireMode
)
642 { // Perform SW 3-wire programming by driver.
643 data2Write
= (data
<< 4) | (u32
)(offset
& 0x0f);
646 ZEBRA_RFSerialWrite(dev
, data2Write
, len
, low2high
);
652 data2Write
= (data
<< 4) | (u32
)(offset
& 0x0f);
656 (u8
*)(&data2Write
), // pDataBuf,
657 len
, // nDataBufBitCnt,
662 case HW_THREE_WIRE_PI
: //Parallel Interface
664 data2Write
= (data
<< 4) | (u32
)(offset
& 0x0f);
668 (u8
*)(&data2Write
), // pDataBuf,
669 len
, // nDataBufBitCnt,
677 case HW_THREE_WIRE_SI
: //Serial Interface
679 data2Write
= (data
<< 4) | (u32
)(offset
& 0x0f);
681 // printk(" enter ZEBRA_RFSerialWrite\n ");
683 // ZEBRA_RFSerialWrite(dev, data2Write, len, low2high);
687 (u8
*)(&data2Write
), // pDataBuf,
688 len
, // nDataBufBitCnt,
692 // printk(" exit ZEBRA_RFSerialWrite\n ");
698 DMESGE("RF_WriteReg(): invalid RegThreeWireMode(%d) !!!", priv
->RegThreeWireMode
);
704 DMESGE("RF_WriteReg(): unknown RFChipID: %#X", priv
->rf_chip
);
712 struct net_device
*dev
,
722 u16 oval
,oval2
,oval3
,tmp
, wReg80
;
726 //PHAL_DATA_8187 pHalData = GetHalData8187(pAdapter);
727 { // RTL8187S HSSI Read/Write Function
728 u1bTmp
= read_nic_byte(dev
, RF_SW_CONFIG
);
729 u1bTmp
|= RF_SW_CFG_SI
; //reg08[1]=1 Serial Interface(SI)
730 write_nic_byte(dev
, RF_SW_CONFIG
, u1bTmp
);
733 wReg80
= oval
= read_nic_word(dev
, RFPinsOutput
);
734 oval2
= read_nic_word(dev
, RFPinsEnable
);
735 oval3
= read_nic_word(dev
, RFPinsSelect
);
737 write_nic_word(dev
, RFPinsEnable
, oval2
|0xf);
738 write_nic_word(dev
, RFPinsSelect
, oval3
|0xf);
742 // We must clear BIT0-3 here, otherwise,
743 // SW_Enalbe will be true when we first call ZEBRA_RFSerialRead() after 8187MPVC open,
744 // which will cause the value read become 0. 2005.04.11, by rcnjko.
747 // Avoid collision with hardware three-wire.
749 twreg
.struc
.enableB
= 1;
750 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(4);
753 twreg
.struc
.enableB
= 0;
755 twreg
.struc
.read_write
= 0;
756 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(5);
758 mask
= (low2high
) ? 0x01 : ((u32
)0x01<<(32-1));
759 for(i
= 0; i
< wLength
/2; i
++)
761 twreg
.struc
.data
= ((data2Write
&mask
) != 0) ? 1 : 0;
762 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(1);
764 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
765 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
767 mask
= (low2high
) ? (mask
<<1): (mask
>>1);
771 // 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.
772 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0xe); // turn off data enable
773 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0xe);
775 twreg
.struc
.read_write
=1;
776 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
778 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
781 twreg
.struc
.data
= ((data2Write
&mask
) != 0) ? 1: 0;
782 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
783 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
786 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(1);
788 mask
= (low2high
) ? (mask
<<1) : (mask
>>1);
792 twreg
.struc
.data
= 0;
793 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
794 mask
= (low2high
) ? 0x01 : ((u32
)0x01 << (12-1));
797 // 061016, by rcnjko:
798 // We must set data pin to HW controled, otherwise RF can't driver it and
799 // value RF register won't be able to read back properly.
801 write_nic_word(dev
, RFPinsEnable
, ( ((oval2
|0x0E) & (~0x01))) );
803 for(i
= 0; i
< rLength
; i
++)
805 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(1);
807 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
808 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
809 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
810 tmp
= read_nic_word(dev
, RFPinsInput
);
811 tdata
.longData
= tmp
;
812 *data2Read
|= tdata
.struc
.clk
? mask
: 0;
815 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
817 mask
= (low2high
) ? (mask
<<1) : (mask
>>1);
819 twreg
.struc
.enableB
= 1;
821 twreg
.struc
.data
= 0;
822 twreg
.struc
.read_write
= 1;
823 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
825 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, oval2|0x8); // Set To Output Enable
826 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.
827 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0x1bff);
828 write_nic_word(dev
, RFPinsSelect
, oval3
); // Set To SW Switch
829 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0x0488);
830 write_nic_word(dev
, RFPinsOutput
, 0x3a0);
831 //PlatformEFIOWrite2Byte(pAdapter, RFPinsOutput, 0x0480);
837 struct net_device
*dev
,
841 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
848 switch(priv
->rf_chip
)
850 case RFCHIPID_RTL8225
:
853 switch(priv
->RegThreeWireMode
)
855 case HW_THREE_WIRE_PI
: // For 87S Parallel Interface.
857 data2Write
= ((u32
)(offset
&0x0f));
861 (u8
*)(&data2Write
), // pDataBuf,
862 wlen
, // nDataBufBitCnt,
865 dataRead
= data2Write
;
869 case HW_THREE_WIRE_SI
: // For 87S Serial Interface.
871 data2Write
= ((u32
)(offset
&0x0f)) ;
875 (u8
*)(&data2Write
), // pDataBuf,
876 wlen
, // nDataBufBitCnt,
880 dataRead
= data2Write
;
884 // Perform SW 3-wire programming by driver.
887 data2Write
= ((u32
)(offset
&0x1f)) << 27; // For Zebra E-cut. 2005.04.11, by rcnjko.
891 ZEBRA_RFSerialRead(dev
, data2Write
, wlen
,&dataRead
,rlen
, low2high
);
905 // by Owen on 04/07/14 for writing BB register successfully
908 struct net_device
*dev
,
916 UCharData
= (u8
)((Data
& 0x0000ff00) >> 8);
917 PlatformIOWrite4Byte(dev
, PhyAddr
, Data
);
918 //for(TimeoutCounter = 10; TimeoutCounter > 0; TimeoutCounter--)
920 PlatformIOWrite4Byte(dev
, PhyAddr
, Data
& 0xffffff7f);
921 RegisterContent
= PlatformIORead1Byte(dev
, PhyDataR
);
922 //if(UCharData == RegisterContent)
929 struct net_device
*dev
,
936 PlatformIOWrite4Byte(dev
, PhyAddr
, addr
& 0xffffff7f);
937 RegisterContent
= PlatformIORead1Byte(dev
, PhyDataR
);
939 return RegisterContent
;
944 // Perform Antenna settings with antenna diversity on 87SE.
945 // Created by Roger, 2008.01.25.
948 SetAntennaConfig87SE(
949 struct net_device
*dev
,
950 u8 DefaultAnt
, // 0: Main, 1: Aux.
951 bool bAntDiversity
// 1:Enable, 0: Disable.
954 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
955 bool bAntennaSwitched
= true;
957 //printk("SetAntennaConfig87SE(): DefaultAnt(%d), bAntDiversity(%d)\n", DefaultAnt, bAntDiversity);
959 // Threshold for antenna diversity.
960 write_phy_cck(dev
, 0x0c, 0x09); // Reg0c : 09
962 if( bAntDiversity
) // Enable Antenna Diversity.
964 if( DefaultAnt
== 1 ) // aux antenna
966 // Mac register, aux antenna
967 write_nic_byte(dev
, ANTSEL
, 0x00);
969 // Config CCK RX antenna.
970 write_phy_cck(dev
, 0x11, 0xbb); // Reg11 : bb
971 write_phy_cck(dev
, 0x01, 0xc7); // Reg01 : c7
973 // Config OFDM RX antenna.
974 write_phy_ofdm(dev
, 0x0D, 0x54); // Reg0d : 54
975 write_phy_ofdm(dev
, 0x18, 0xb2); // Reg18 : b2
977 else // use main antenna
979 // Mac register, main antenna
980 write_nic_byte(dev
, ANTSEL
, 0x03);
982 // Config CCK RX antenna.
983 write_phy_cck(dev
, 0x11, 0x9b); // Reg11 : 9b
984 write_phy_cck(dev
, 0x01, 0xc7); // Reg01 : c7
986 // Config OFDM RX antenna.
987 write_phy_ofdm(dev
, 0x0d, 0x5c); // Reg0d : 5c
988 write_phy_ofdm(dev
, 0x18, 0xb2); // Reg18 : b2
991 else // Disable Antenna Diversity.
993 if( DefaultAnt
== 1 ) // aux Antenna
995 // Mac register, aux antenna
996 write_nic_byte(dev
, ANTSEL
, 0x00);
998 // Config CCK RX antenna.
999 write_phy_cck(dev
, 0x11, 0xbb); // Reg11 : bb
1000 write_phy_cck(dev
, 0x01, 0x47); // Reg01 : 47
1002 // Config OFDM RX antenna.
1003 write_phy_ofdm(dev
, 0x0D, 0x54); // Reg0d : 54
1004 write_phy_ofdm(dev
, 0x18, 0x32); // Reg18 : 32
1006 else // main Antenna
1008 // Mac register, main antenna
1009 write_nic_byte(dev
, ANTSEL
, 0x03);
1011 // Config CCK RX antenna.
1012 write_phy_cck(dev
, 0x11, 0x9b); // Reg11 : 9b
1013 write_phy_cck(dev
, 0x01, 0x47); // Reg01 : 47
1015 // Config OFDM RX antenna.
1016 write_phy_ofdm(dev
, 0x0D, 0x5c); // Reg0d : 5c
1017 write_phy_ofdm(dev
, 0x18, 0x32); // Reg18 : 32
1020 priv
->CurrAntennaIndex
= DefaultAnt
; // Update default settings.
1021 return bAntennaSwitched
;
1024 /*---------------------------------------------------------------
1025 * Hardware Initialization.
1026 * the code is ported from Windows source code
1027 ----------------------------------------------------------------*/
1030 ZEBRA_Config_85BASIC_HardCode(
1031 struct net_device
*dev
1035 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1038 u32 u4bRegOffset
, u4bRegValue
, u4bRF23
, u4bRF24
;
1042 //=============================================================================
1043 // 87S_PCIE :: RADIOCFG.TXT
1044 //=============================================================================
1047 // Page1 : reg16-reg30
1048 RF_WriteReg(dev
, 0x00, 0x013f); mdelay(1); // switch to page1
1049 u4bRF23
= RF_ReadReg(dev
, 0x08); mdelay(1);
1050 u4bRF24
= RF_ReadReg(dev
, 0x09); mdelay(1);
1052 if (u4bRF23
==0x818 && u4bRF24
==0x70C && priv
->card_8185
== VERSION_8187S_C
)
1053 priv
->card_8185
= VERSION_8187S_D
;
1055 // Page0 : reg0-reg15
1057 // RF_WriteReg(dev, 0x00, 0x003f); mdelay(1);//1
1058 RF_WriteReg(dev
, 0x00, 0x009f); mdelay(1);// 1
1060 RF_WriteReg(dev
, 0x01, 0x06e0); mdelay(1);
1062 // RF_WriteReg(dev, 0x02, 0x004c); mdelay(1);//2
1063 RF_WriteReg(dev
, 0x02, 0x004d); mdelay(1);// 2
1065 // RF_WriteReg(dev, 0x03, 0x0000); mdelay(1);//3
1066 RF_WriteReg(dev
, 0x03, 0x07f1); mdelay(1);// 3
1068 RF_WriteReg(dev
, 0x04, 0x0975); mdelay(1);
1069 RF_WriteReg(dev
, 0x05, 0x0c72); mdelay(1);
1070 RF_WriteReg(dev
, 0x06, 0x0ae6); mdelay(1);
1071 RF_WriteReg(dev
, 0x07, 0x00ca); mdelay(1);
1072 RF_WriteReg(dev
, 0x08, 0x0e1c); mdelay(1);
1073 RF_WriteReg(dev
, 0x09, 0x02f0); mdelay(1);
1074 RF_WriteReg(dev
, 0x0a, 0x09d0); mdelay(1);
1075 RF_WriteReg(dev
, 0x0b, 0x01ba); mdelay(1);
1076 RF_WriteReg(dev
, 0x0c, 0x0640); mdelay(1);
1077 RF_WriteReg(dev
, 0x0d, 0x08df); mdelay(1);
1078 RF_WriteReg(dev
, 0x0e, 0x0020); mdelay(1);
1079 RF_WriteReg(dev
, 0x0f, 0x0990); mdelay(1);
1082 // Page1 : reg16-reg30
1083 RF_WriteReg(dev
, 0x00, 0x013f); mdelay(1);
1085 RF_WriteReg(dev
, 0x03, 0x0806); mdelay(1);
1087 if(priv
->card_8185
< VERSION_8187S_C
)
1089 RF_WriteReg(dev
, 0x04, 0x03f7); mdelay(1);
1090 RF_WriteReg(dev
, 0x05, 0x05ab); mdelay(1);
1091 RF_WriteReg(dev
, 0x06, 0x00c1); mdelay(1);
1095 RF_WriteReg(dev
, 0x04, 0x03a7); mdelay(1);
1096 RF_WriteReg(dev
, 0x05, 0x059b); mdelay(1);
1097 RF_WriteReg(dev
, 0x06, 0x0081); mdelay(1);
1101 RF_WriteReg(dev
, 0x07, 0x01A0); mdelay(1);
1102 // Don't write RF23/RF24 to make a difference between 87S C cut and D cut. asked by SD3 stevenl.
1103 // RF_WriteReg(dev, 0x08, 0x0597); mdelay(1);
1104 // RF_WriteReg(dev, 0x09, 0x050a); mdelay(1);
1105 RF_WriteReg(dev
, 0x0a, 0x0001); mdelay(1);
1106 RF_WriteReg(dev
, 0x0b, 0x0418); mdelay(1);
1108 if(priv
->card_8185
== VERSION_8187S_D
)
1110 RF_WriteReg(dev
, 0x0c, 0x0fbe); mdelay(1);
1111 RF_WriteReg(dev
, 0x0d, 0x0008); mdelay(1);
1112 RF_WriteReg(dev
, 0x0e, 0x0807); mdelay(1); // RX LO buffer
1116 RF_WriteReg(dev
, 0x0c, 0x0fbe); mdelay(1);
1117 RF_WriteReg(dev
, 0x0d, 0x0008); mdelay(1);
1118 RF_WriteReg(dev
, 0x0e, 0x0806); mdelay(1); // RX LO buffer
1121 RF_WriteReg(dev
, 0x0f, 0x0acc); mdelay(1);
1123 // RF_WriteReg(dev, 0x00, 0x017f); mdelay(1);//6
1124 RF_WriteReg(dev
, 0x00, 0x01d7); mdelay(1);// 6
1126 RF_WriteReg(dev
, 0x03, 0x0e00); mdelay(1);
1127 RF_WriteReg(dev
, 0x04, 0x0e50); mdelay(1);
1130 RF_WriteReg(dev
, 0x01, i
); mdelay(1);
1131 RF_WriteReg(dev
, 0x02, ZEBRA_RF_RX_GAIN_TABLE
[i
]); mdelay(1);
1132 //DbgPrint("RF - 0x%x = 0x%x", i, ZEBRA_RF_RX_GAIN_TABLE[i]);
1135 RF_WriteReg(dev
, 0x05, 0x0203); mdelay(1); /// 203, 343
1136 //RF_WriteReg(dev, 0x06, 0x0300); mdelay(1); // 400
1137 RF_WriteReg(dev
, 0x06, 0x0200); mdelay(1); // 400
1139 RF_WriteReg(dev
, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30, and HSSI disable 137
1140 mdelay(10); // Deay 10 ms. //0xfd
1142 // RF_WriteReg(dev, 0x0c, 0x09be); mdelay(1); // 7
1143 //RF_WriteReg(dev, 0x0c, 0x07be); mdelay(1);
1144 //mdelay(10); // Deay 10 ms. //0xfd
1146 RF_WriteReg(dev
, 0x0d, 0x0008); mdelay(1); // Z4 synthesizer loop filter setting, 392
1147 mdelay(10); // Deay 10 ms. //0xfd
1149 RF_WriteReg(dev
, 0x00, 0x0037); mdelay(1); // switch to reg0-reg15, and HSSI disable
1150 mdelay(10); // Deay 10 ms. //0xfd
1152 RF_WriteReg(dev
, 0x04, 0x0160); mdelay(1); // CBC on, Tx Rx disable, High gain
1153 mdelay(10); // Deay 10 ms. //0xfd
1155 RF_WriteReg(dev
, 0x07, 0x0080); mdelay(1); // Z4 setted channel 1
1156 mdelay(10); // Deay 10 ms. //0xfd
1158 RF_WriteReg(dev
, 0x02, 0x088D); mdelay(1); // LC calibration
1159 mdelay(200); // Deay 200 ms. //0xfd
1160 mdelay(10); // Deay 10 ms. //0xfd
1161 mdelay(10); // Deay 10 ms. //0xfd
1163 RF_WriteReg(dev
, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30 137, and HSSI disable 137
1164 mdelay(10); // Deay 10 ms. //0xfd
1166 RF_WriteReg(dev
, 0x07, 0x0000); mdelay(1);
1167 RF_WriteReg(dev
, 0x07, 0x0180); mdelay(1);
1168 RF_WriteReg(dev
, 0x07, 0x0220); mdelay(1);
1169 RF_WriteReg(dev
, 0x07, 0x03E0); mdelay(1);
1171 // DAC calibration off 20070702
1172 RF_WriteReg(dev
, 0x06, 0x00c1); mdelay(1);
1173 RF_WriteReg(dev
, 0x0a, 0x0001); mdelay(1);
1175 // For crystal calibration, added by Roger, 2007.12.11.
1176 if( priv
->bXtalCalibration
) // reg 30.
1177 { // enable crystal calibration.
1178 // RF Reg[30], (1)Xin:[12:9], Xout:[8:5], addr[4:0].
1179 // (2)PA Pwr delay timer[15:14], default: 2.4us, set BIT15=0
1180 // (3)RF signal on/off when calibration[13], default: on, set BIT13=0.
1181 // So we should minus 4 BITs offset.
1182 RF_WriteReg(dev
, 0x0f, (priv
->XtalCal_Xin
<<5)|(priv
->XtalCal_Xout
<<1)|BIT11
|BIT9
); mdelay(1);
1183 printk("ZEBRA_Config_85BASIC_HardCode(): (%02x)\n",
1184 (priv
->XtalCal_Xin
<<5) | (priv
->XtalCal_Xout
<<1) | BIT11
| BIT9
);
1187 { // using default value. Xin=6, Xout=6.
1188 RF_WriteReg(dev
, 0x0f, 0x0acc); mdelay(1);
1191 // RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1); //-by amy 080312
1193 RF_WriteReg(dev
, 0x00, 0x00bf); mdelay(1); // switch to reg0-reg15, and HSSI enable
1194 // RF_WriteReg(dev, 0x0d, 0x009f); mdelay(1); // Rx BB start calibration, 00c//-edward
1195 RF_WriteReg(dev
, 0x0d, 0x08df); mdelay(1); // Rx BB start calibration, 00c//+edward
1196 RF_WriteReg(dev
, 0x02, 0x004d); mdelay(1); // temperature meter off
1197 RF_WriteReg(dev
, 0x04, 0x0975); mdelay(1); // Rx mode
1198 mdelay(10); // Deay 10 ms. //0xfe
1199 mdelay(10); // Deay 10 ms. //0xfe
1200 mdelay(10); // Deay 10 ms. //0xfe
1201 RF_WriteReg(dev
, 0x00, 0x0197); mdelay(1); // Rx mode//+edward
1202 RF_WriteReg(dev
, 0x05, 0x05ab); mdelay(1); // Rx mode//+edward
1203 RF_WriteReg(dev
, 0x00, 0x009f); mdelay(1); // Rx mode//+edward
1205 RF_WriteReg(dev
, 0x01, 0x0000); mdelay(1); // Rx mode//+edward
1206 RF_WriteReg(dev
, 0x02, 0x0000); mdelay(1); // Rx mode//+edward
1207 //power save parameters.
1208 u1b24E
= read_nic_byte(dev
, 0x24E);
1209 write_nic_byte(dev
, 0x24E, (u1b24E
& (~(BIT5
|BIT6
))));
1211 //=============================================================================
1213 //=============================================================================
1215 //=============================================================================
1217 /* [POWER SAVE] Power Saving Parameters by jong. 2007-11-27
1218 CCK reg0x00[7]=1'b1 :power saving for TX (default)
1219 CCK reg0x00[6]=1'b1: power saving for RX (default)
1220 CCK reg0x06[4]=1'b1: turn off channel estimation related circuits if not doing channel estimation.
1221 CCK reg0x06[3]=1'b1: turn off unused circuits before cca = 1
1222 CCK reg0x06[2]=1'b1: turn off cck's circuit if macrst =0
1225 write_phy_cck(dev
,0x00,0xc8);
1226 write_phy_cck(dev
,0x06,0x1c);
1227 write_phy_cck(dev
,0x10,0x78);
1228 write_phy_cck(dev
,0x2e,0xd0);
1229 write_phy_cck(dev
,0x2f,0x06);
1230 write_phy_cck(dev
,0x01,0x46);
1233 write_nic_byte(dev
, CCK_TXAGC
, 0x10);
1234 write_nic_byte(dev
, OFDM_TXAGC
, 0x1B);
1235 write_nic_byte(dev
, ANTSEL
, 0x03);
1239 //=============================================================================
1241 //=============================================================================
1243 // PlatformIOWrite4Byte( dev, PhyAddr, 0x00001280); // Annie, 2006-05-05
1244 write_phy_ofdm(dev
, 0x00, 0x12);
1245 //WriteBBPortUchar(dev, 0x00001280);
1247 for (i
=0; i
<128; i
++)
1249 //DbgPrint("AGC - [%x+1] = 0x%x\n", i, ZEBRA_AGC[i+1]);
1251 data
= ZEBRA_AGC
[i
+1];
1253 data
= data
| 0x0000008F;
1255 addr
= i
+ 0x80; //enable writing AGC table
1257 addr
= addr
| 0x0000008E;
1259 WriteBBPortUchar(dev
, data
);
1260 WriteBBPortUchar(dev
, addr
);
1261 WriteBBPortUchar(dev
, 0x0000008E);
1264 PlatformIOWrite4Byte( dev
, PhyAddr
, 0x00001080); // Annie, 2006-05-05
1265 //WriteBBPortUchar(dev, 0x00001080);
1267 //=============================================================================
1269 //=============================================================================
1271 //=============================================================================
1276 u4bRegValue
=OFDM_CONFIG
[i
];
1278 //DbgPrint("OFDM - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
1280 WriteBBPortUchar(dev
,
1282 (u4bRegOffset
& 0x7f) |
1283 ((u4bRegValue
& 0xff) << 8)));
1286 //=============================================================================
1287 //by amy for antenna
1288 //=============================================================================
1290 // Config Sw/Hw Combinational Antenna Diversity. Added by Roger, 2008.02.26.
1291 SetAntennaConfig87SE(dev
, priv
->bDefaultAntenna1
, priv
->bSwAntennaDiverity
);
1293 //by amy for antenna
1299 struct net_device
*dev
1302 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1303 //unsigned char* IGTable;
1304 //u8 DIG_CurrentInitialGain = 4;
1305 //unsigned char u1Tmp;
1308 if(priv
->eRFPowerState
!= eRfOn
)
1310 //Don't access BB/RF under disable PLL situation.
1311 //RT_TRACE(COMP_DIG, DBG_LOUD, ("UpdateInitialGain - pHalData->eRFPowerState!=eRfOn\n"));
1312 // Back to the original state
1313 priv
->InitialGain
= priv
->InitialGainBackUp
;
1317 switch(priv
->rf_chip
)
1320 // Dynamic set initial gain, follow 87B
1321 switch(priv
->InitialGain
)
1324 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm \n");
1325 write_phy_ofdm(dev
, 0x17, 0x26); mdelay(1);
1326 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1327 write_phy_ofdm(dev
, 0x05, 0xfa); mdelay(1);
1331 //DMESG("RTL8187 + 8225 Initial Gain State 2: -82 dBm \n");
1332 write_phy_ofdm(dev
, 0x17, 0x36); mdelay(1);
1333 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1334 write_phy_ofdm(dev
, 0x05, 0xfa); mdelay(1);
1338 //DMESG("RTL8187 + 8225 Initial Gain State 3: -82 dBm \n");
1339 write_phy_ofdm(dev
, 0x17, 0x36); mdelay(1);
1340 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1341 write_phy_ofdm(dev
, 0x05, 0xfb); mdelay(1);
1345 //DMESG("RTL8187 + 8225 Initial Gain State 4: -78 dBm \n");
1346 write_phy_ofdm(dev
, 0x17, 0x46); mdelay(1);
1347 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1348 write_phy_ofdm(dev
, 0x05, 0xfb); mdelay(1);
1352 //DMESG("RTL8187 + 8225 Initial Gain State 5: -74 dBm \n");
1353 write_phy_ofdm(dev
, 0x17, 0x46); mdelay(1);
1354 write_phy_ofdm(dev
, 0x24, 0x96); mdelay(1);
1355 write_phy_ofdm(dev
, 0x05, 0xfb); mdelay(1);
1359 //DMESG ("RTL8187 + 8225 Initial Gain State 6: -70 dBm \n");
1360 write_phy_ofdm(dev
, 0x17, 0x56); mdelay(1);
1361 write_phy_ofdm(dev
, 0x24, 0x96); mdelay(1);
1362 write_phy_ofdm(dev
, 0x05, 0xfc); mdelay(1);
1366 //DMESG("RTL8187 + 8225 Initial Gain State 7: -66 dBm \n");
1367 write_phy_ofdm(dev
, 0x17, 0x56); mdelay(1);
1368 write_phy_ofdm(dev
, 0x24, 0xa6); mdelay(1);
1369 write_phy_ofdm(dev
, 0x05, 0xfc); mdelay(1);
1373 //DMESG("RTL8187 + 8225 Initial Gain State 8:\n");
1374 write_phy_ofdm(dev
, 0x17, 0x66); mdelay(1);
1375 write_phy_ofdm(dev
, 0x24, 0xb6); mdelay(1);
1376 write_phy_ofdm(dev
, 0x05, 0xfc); mdelay(1);
1381 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm (default)\n");
1382 write_phy_ofdm(dev
, 0x17, 0x26); mdelay(1);
1383 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1384 write_phy_ofdm(dev
, 0x05, 0xfa); mdelay(1);
1391 DMESG("UpdateInitialGain(): unknown RFChipID: %#X\n", priv
->rf_chip
);
1397 // Tx Power tracking mechanism routine on 87SE.
1398 // Created by Roger, 2007.12.11.
1401 InitTxPwrTracking87SE(
1402 struct net_device
*dev
1405 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1408 u4bRfReg
= RF_ReadReg(dev
, 0x02);
1410 // Enable Thermal meter indication.
1411 //printk("InitTxPwrTracking87SE(): Enable thermal meter indication, Write RF[0x02] = %#x", u4bRfReg|PWR_METER_EN);
1412 RF_WriteReg(dev
, 0x02, u4bRfReg
|PWR_METER_EN
); mdelay(1);
1417 struct net_device
*dev
1420 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1421 write_nic_dword(dev
, RCR
, priv
->ReceiveConfig
);
1422 priv
->RFProgType
= read_nic_byte(dev
, CONFIG4
) & 0x03;
1424 switch(priv
->rf_chip
)
1428 ZEBRA_Config_85BASIC_HardCode( dev
);
1432 // Set default initial gain state to 4, approved by SD3 DZ, by Bruce, 2007-06-06.
1433 if(priv
->bDigMechanism
)
1435 if(priv
->InitialGain
== 0)
1436 priv
->InitialGain
= 4;
1437 //printk("PhyConfig8185(): DIG is enabled, set default initial gain index to %d\n", priv->InitialGain);
1441 // Enable thermal meter indication to implement TxPower tracking on 87SE.
1442 // We initialize thermal meter here to avoid unsuccessful configuration.
1443 // Added by Roger, 2007.12.11.
1445 if(priv
->bTxPowerTrack
)
1446 InitTxPwrTracking87SE(dev
);
1449 priv
->InitialGainBackUp
= priv
->InitialGain
;
1450 UpdateInitialGain(dev
);
1460 struct net_device
*dev
1463 //RTL8185_TODO: Determine Retrylimit, TxAGC, AutoRateFallback control.
1464 // u8 bUNIVERSAL_CONTROL_RL = 1;
1465 u8 bUNIVERSAL_CONTROL_RL
= 0;
1467 u8 bUNIVERSAL_CONTROL_AGC
= 1;
1468 u8 bUNIVERSAL_CONTROL_ANT
= 1;
1469 u8 bAUTO_RATE_FALLBACK_CTL
= 1;
1471 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1472 //struct ieee80211_device *ieee = priv->ieee80211;
1473 //if(IS_WIRELESS_MODE_A(dev) || IS_WIRELESS_MODE_G(dev))
1474 //{by amy 080312 if((ieee->mode == IEEE_G)||(ieee->mode == IEEE_A))
1476 // write_nic_word(dev, BRSR, 0xffff);
1480 // write_nic_word(dev, BRSR, 0x000f);
1483 write_nic_word(dev
, BRSR
, 0x0fff);
1485 val8
= read_nic_byte(dev
, CW_CONF
);
1487 if(bUNIVERSAL_CONTROL_RL
)
1492 write_nic_byte(dev
, CW_CONF
, val8
);
1495 val8
= read_nic_byte(dev
, TXAGC_CTL
);
1496 if(bUNIVERSAL_CONTROL_AGC
)
1498 write_nic_byte(dev
, CCK_TXAGC
, 128);
1499 write_nic_byte(dev
, OFDM_TXAGC
, 128);
1504 val8
= val8
| 0x01 ;
1508 write_nic_byte(dev
, TXAGC_CTL
, val8
);
1510 // Tx Antenna including Feedback control
1511 val8
= read_nic_byte(dev
, TXAGC_CTL
);
1513 if(bUNIVERSAL_CONTROL_ANT
)
1515 write_nic_byte(dev
, ANTSEL
, 0x00);
1520 val8
= val8
& (val8
|0x02); //xiong-2006-11-15
1523 write_nic_byte(dev
, TXAGC_CTL
, val8
);
1525 // Auto Rate fallback control
1526 val8
= read_nic_byte(dev
, RATE_FALLBACK
);
1528 if( bAUTO_RATE_FALLBACK_CTL
)
1530 val8
|= RATE_FALLBACK_CTL_ENABLE
| RATE_FALLBACK_CTL_AUTO_STEP1
;
1532 // <RJ_TODO_8185B> We shall set up the ARFR according to user's setting.
1533 //write_nic_word(dev, ARFR, 0x0fff); // set 1M ~ 54M
1535 // Aadded by Roger, 2007.11.15.
1536 PlatformIOWrite2Byte(dev
, ARFR
, 0x0fff); //set 1M ~ 54Mbps.
1542 write_nic_byte(dev
, RATE_FALLBACK
, val8
);
1548 MacConfig_85BASIC_HardCode(
1549 struct net_device
*dev
)
1551 //============================================================================
1553 //============================================================================
1556 u32 u4bRegOffset
, u4bRegValue
,u4bPageIndex
= 0;
1559 nLinesRead
=sizeof(MAC_REG_TABLE
)/2;
1561 for(i
= 0; i
< nLinesRead
; i
++) //nLinesRead=101
1563 u4bRegOffset
=MAC_REG_TABLE
[i
][0];
1564 u4bRegValue
=MAC_REG_TABLE
[i
][1];
1566 if(u4bRegOffset
== 0x5e)
1568 u4bPageIndex
= u4bRegValue
;
1572 u4bRegOffset
|= (u4bPageIndex
<< 8);
1574 //DbgPrint("MAC - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
1575 write_nic_byte(dev
, u4bRegOffset
, (u8
)u4bRegValue
);
1577 //============================================================================
1584 struct net_device
*dev
)
1588 MacConfig_85BASIC_HardCode(dev
);
1590 //============================================================================
1592 // Follow TID_AC_MAP of WMac.
1593 write_nic_word(dev
, TID_AC_MAP
, 0xfa50);
1595 // Interrupt Migration, Jong suggested we use set 0x0000 first, 2005.12.14, by rcnjko.
1596 write_nic_word(dev
, IntMig
, 0x0000);
1598 // Prevent TPC to cause CRC error. Added by Annie, 2006-06-10.
1599 PlatformIOWrite4Byte(dev
, 0x1F0, 0x00000000);
1600 PlatformIOWrite4Byte(dev
, 0x1F4, 0x00000000);
1601 PlatformIOWrite1Byte(dev
, 0x1F8, 0x00);
1603 // Asked for by SD3 CM Lin, 2006.06.27, by rcnjko.
1604 //PlatformIOWrite4Byte(dev, RFTiming, 0x00004001);
1606 // power save parameter based on "87SE power save parameters 20071127.doc", as follow.
1608 //Enable DA10 TX power saving
1609 u1DA
= read_nic_byte(dev
, PHYPR
);
1610 write_nic_byte(dev
, PHYPR
, (u1DA
| BIT2
) );
1613 write_nic_word(dev
, 0x360, 0x1000);
1614 write_nic_word(dev
, 0x362, 0x1000);
1617 write_nic_word(dev
, 0x370, 0x0560);
1618 write_nic_word(dev
, 0x372, 0x0560);
1619 write_nic_word(dev
, 0x374, 0x0DA4);
1620 write_nic_word(dev
, 0x376, 0x0DA4);
1621 write_nic_word(dev
, 0x378, 0x0560);
1622 write_nic_word(dev
, 0x37A, 0x0560);
1623 write_nic_word(dev
, 0x37C, 0x00EC);
1624 // write_nic_word(dev, 0x37E, 0x00FE);//-edward
1625 write_nic_word(dev
, 0x37E, 0x00EC);//+edward
1626 write_nic_byte(dev
, 0x24E,0x01);
1635 GetSupportedWirelessMode8185(
1636 struct net_device
*dev
1639 u8 btSupportedWirelessMode
= 0;
1640 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1642 switch(priv
->rf_chip
)
1646 btSupportedWirelessMode
= (WIRELESS_MODE_B
| WIRELESS_MODE_G
);
1649 btSupportedWirelessMode
= WIRELESS_MODE_B
;
1653 return btSupportedWirelessMode
;
1657 ActUpdateChannelAccessSetting(
1658 struct net_device
*dev
,
1659 WIRELESS_MODE WirelessMode
,
1660 PCHANNEL_ACCESS_SETTING ChnlAccessSetting
1663 struct r8180_priv
*priv
= ieee80211_priv(dev
);
1664 struct ieee80211_device
*ieee
= priv
->ieee80211
;
1667 //PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
1668 u8 bFollowLegacySetting
= 0;
1673 // TODO: We still don't know how to set up these registers, just follow WMAC to
1674 // verify 8185B FPAG.
1677 // Jong said CWmin/CWmax register are not functional in 8185B,
1678 // so we shall fill channel access realted register into AC parameter registers,
1681 ChnlAccessSetting
->SIFS_Timer
= 0x22; // Suggested by Jong, 2005.12.08.
1682 ChnlAccessSetting
->DIFS_Timer
= 0x1C; // 2006.06.02, by rcnjko.
1683 ChnlAccessSetting
->SlotTimeTimer
= 9; // 2006.06.02, by rcnjko.
1684 ChnlAccessSetting
->EIFS_Timer
= 0x5B; // Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
1685 ChnlAccessSetting
->CWminIndex
= 3; // 2006.06.02, by rcnjko.
1686 ChnlAccessSetting
->CWmaxIndex
= 7; // 2006.06.02, by rcnjko.
1688 write_nic_byte(dev
, SIFS
, ChnlAccessSetting
->SIFS_Timer
);
1689 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SLOT_TIME, &ChnlAccessSetting->SlotTimeTimer ); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
1690 write_nic_byte(dev
, SLOT
, ChnlAccessSetting
->SlotTimeTimer
); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
1692 u1bAIFS
= aSifsTime
+ (2 * ChnlAccessSetting
->SlotTimeTimer
);
1694 //write_nic_byte(dev, AC_VO_PARAM, u1bAIFS);
1695 //write_nic_byte(dev, AC_VI_PARAM, u1bAIFS);
1696 //write_nic_byte(dev, AC_BE_PARAM, u1bAIFS);
1697 //write_nic_byte(dev, AC_BK_PARAM, u1bAIFS);
1699 write_nic_byte(dev
, EIFS
, ChnlAccessSetting
->EIFS_Timer
);
1701 write_nic_byte(dev
, AckTimeOutReg
, 0x5B); // <RJ_EXPR_QOS> Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
1704 // <RJ_TODO_NOW_8185B> Update ECWmin/ECWmax, AIFS, TXOP Limit of each AC to the value defined by SPEC.
1705 if( pStaQos
->CurrentQosMode
> QOS_DISABLE
)
1707 if(pStaQos
->QBssWirelessMode
== WirelessMode
)
1709 // Follow AC Parameters of the QBSS.
1710 for(eACI
= 0; eACI
< AC_MAX
; eACI
++)
1712 Adapter
->HalFunc
.SetHwRegHandler(Adapter
, HW_VAR_AC_PARAM
, (pu1Byte
)(&(pStaQos
->WMMParamEle
.AcParam
[eACI
])) );
1717 // Follow Default WMM AC Parameters.
1718 bFollowLegacySetting
= 1;
1724 bFollowLegacySetting
= 1;
1728 // this setting is copied from rtl8187B. xiong-2006-11-13
1729 if(bFollowLegacySetting
)
1734 // Follow 802.11 seeting to AC parameter, all AC shall use the same parameter.
1735 // 2005.12.01, by rcnjko.
1737 AcParam
.longData
= 0;
1738 AcParam
.f
.AciAifsn
.f
.AIFSN
= 2; // Follow 802.11 DIFS.
1739 AcParam
.f
.AciAifsn
.f
.ACM
= 0;
1740 AcParam
.f
.Ecw
.f
.ECWmin
= ChnlAccessSetting
->CWminIndex
; // Follow 802.11 CWmin.
1741 AcParam
.f
.Ecw
.f
.ECWmax
= ChnlAccessSetting
->CWmaxIndex
; // Follow 802.11 CWmax.
1742 AcParam
.f
.TXOPLimit
= 0;
1744 //lzm reserved 080826
1746 // For turbo mode setting. port from 87B by Isaiah 2008-08-01
1747 if( ieee
->current_network
.Turbo_Enable
== 1 )
1748 AcParam
.f
.TXOPLimit
= 0x01FF;
1749 // For 87SE with Intel 4965 Ad-Hoc mode have poor throughput (19MB)
1750 if (ieee
->iw_mode
== IW_MODE_ADHOC
)
1751 AcParam
.f
.TXOPLimit
= 0x0020;
1754 for(eACI
= 0; eACI
< AC_MAX
; eACI
++)
1756 AcParam
.f
.AciAifsn
.f
.ACI
= (u8
)eACI
;
1758 PAC_PARAM pAcParam
= (PAC_PARAM
)(&AcParam
);
1763 // Retrive paramters to udpate.
1764 eACI
= pAcParam
->f
.AciAifsn
.f
.ACI
;
1765 u1bAIFS
= pAcParam
->f
.AciAifsn
.f
.AIFSN
* ChnlAccessSetting
->SlotTimeTimer
+ aSifsTime
;
1766 u4bAcParam
= ( (((u32
)(pAcParam
->f
.TXOPLimit
)) << AC_PARAM_TXOP_LIMIT_OFFSET
) |
1767 (((u32
)(pAcParam
->f
.Ecw
.f
.ECWmax
)) << AC_PARAM_ECW_MAX_OFFSET
) |
1768 (((u32
)(pAcParam
->f
.Ecw
.f
.ECWmin
)) << AC_PARAM_ECW_MIN_OFFSET
) |
1769 (((u32
)u1bAIFS
) << AC_PARAM_AIFS_OFFSET
));
1774 //write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
1778 //write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
1782 //write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
1786 //write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
1790 DMESGW( "SetHwReg8185(): invalid ACI: %d !\n", eACI
);
1795 // If it is set, immediately set ACM control bit to downgrading AC for passing WMM testplan. Annie, 2005-12-13.
1796 //write_nic_byte(dev, ACM_CONTROL, pAcParam->f.AciAifsn);
1798 PACI_AIFSN pAciAifsn
= (PACI_AIFSN
)(&pAcParam
->f
.AciAifsn
);
1799 AC_CODING eACI
= pAciAifsn
->f
.ACI
;
1802 //for 8187B AsynIORead issue
1804 u8 AcmCtrl
= pHalData
->AcmControl
;
1808 if( pAciAifsn
->f
.ACM
)
1813 AcmCtrl
|= (BEQ_ACM_EN
|BEQ_ACM_CTL
|ACM_HW_EN
); // or 0x21
1817 AcmCtrl
|= (VIQ_ACM_EN
|VIQ_ACM_CTL
|ACM_HW_EN
); // or 0x42
1821 AcmCtrl
|= (VOQ_ACM_EN
|VOQ_ACM_CTL
|ACM_HW_EN
); // or 0x84
1825 DMESGW("SetHwReg8185(): [HW_VAR_ACM_CTRL] ACM set failed: eACI is %d\n", eACI
);
1834 AcmCtrl
&= ( (~BEQ_ACM_EN
) & (~BEQ_ACM_CTL
) & (~ACM_HW_EN
) ); // and 0xDE
1838 AcmCtrl
&= ( (~VIQ_ACM_EN
) & (~VIQ_ACM_CTL
) & (~ACM_HW_EN
) ); // and 0xBD
1842 AcmCtrl
&= ( (~VOQ_ACM_EN
) & (~VOQ_ACM_CTL
) & (~ACM_HW_EN
) ); // and 0x7B
1850 //printk(KERN_WARNING "SetHwReg8185(): [HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl);
1853 pHalData
->AcmControl
= AcmCtrl
;
1855 //write_nic_byte(dev, ACM_CONTROL, AcmCtrl);
1856 write_nic_byte(dev
, ACM_CONTROL
, 0);
1866 ActSetWirelessMode8185(
1867 struct net_device
*dev
,
1871 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1872 struct ieee80211_device
*ieee
= priv
->ieee80211
;
1873 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
1874 u8 btSupportedWirelessMode
= GetSupportedWirelessMode8185(dev
);
1876 if( (btWirelessMode
& btSupportedWirelessMode
) == 0 )
1877 { // Don't switch to unsupported wireless mode, 2006.02.15, by rcnjko.
1878 DMESGW("ActSetWirelessMode8185(): WirelessMode(%d) is not supported (%d)!\n",
1879 btWirelessMode
, btSupportedWirelessMode
);
1883 // 1. Assign wireless mode to swtich if necessary.
1884 if (btWirelessMode
== WIRELESS_MODE_AUTO
)
1886 if((btSupportedWirelessMode
& WIRELESS_MODE_A
))
1888 btWirelessMode
= WIRELESS_MODE_A
;
1890 else if((btSupportedWirelessMode
& WIRELESS_MODE_G
))
1892 btWirelessMode
= WIRELESS_MODE_G
;
1894 else if((btSupportedWirelessMode
& WIRELESS_MODE_B
))
1896 btWirelessMode
= WIRELESS_MODE_B
;
1900 DMESGW("ActSetWirelessMode8185(): No valid wireless mode supported, btSupportedWirelessMode(%x)!!!\n",
1901 btSupportedWirelessMode
);
1902 btWirelessMode
= WIRELESS_MODE_B
;
1907 // 2. Swtich band: RF or BB specific actions,
1908 // for example, refresh tables in omc8255, or change initial gain if necessary.
1909 switch(priv
->rf_chip
)
1914 // Nothing to do for Zebra to switch band.
1915 // Update current wireless mode if we swtich to specified band successfully.
1916 ieee
->mode
= (WIRELESS_MODE
)btWirelessMode
;
1921 DMESGW("ActSetWirelessMode8185(): unsupported RF: 0x%X !!!\n", priv
->rf_chip
);
1925 // 3. Change related setting.
1926 if( ieee
->mode
== WIRELESS_MODE_A
){
1927 DMESG("WIRELESS_MODE_A\n");
1929 else if( ieee
->mode
== WIRELESS_MODE_B
){
1930 DMESG("WIRELESS_MODE_B\n");
1932 else if( ieee
->mode
== WIRELESS_MODE_G
){
1933 DMESG("WIRELESS_MODE_G\n");
1936 ActUpdateChannelAccessSetting( dev
, ieee
->mode
, &priv
->ChannelAccessSetting
);
1939 void rtl8185b_irq_enable(struct net_device
*dev
)
1941 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1943 priv
->irq_enabled
= 1;
1944 write_nic_dword(dev
, IMR
, priv
->IntrMask
);
1946 //by amy for power save
1948 DrvIFIndicateDisassociation(
1949 struct net_device
*dev
,
1953 //printk("==> DrvIFIndicateDisassociation()\n");
1955 // nothing is needed after disassociation request.
1957 //printk("<== DrvIFIndicateDisassociation()\n");
1961 struct net_device
*dev
1964 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1967 //printk("XXXXXXXXXX MgntDisconnect IBSS\n");
1969 DrvIFIndicateDisassociation(dev
, unspec_reason
);
1971 // PlatformZeroMemory( pMgntInfo->Bssid, 6 );
1972 for(i
=0;i
<6;i
++) priv
->ieee80211
->current_network
.bssid
[i
] = 0x55;
1974 priv
->ieee80211
->state
= IEEE80211_NOLINK
;
1978 // Vista add a Adhoc profile, HW radio off untill OID_DOT11_RESET_REQUEST
1979 // Driver would set MSR=NO_LINK, then HW Radio ON, MgntQueue Stuck.
1980 // Because Bcn DMA isn't complete, mgnt queue would stuck until Bcn packet send.
1982 // Disable Beacon Queue Own bit, suggested by jong
1983 // Adapter->HalFunc.SetTxDescOWNHandler(Adapter, BEACON_QUEUE, 0, 0);
1984 ieee80211_stop_send_beacons(priv
->ieee80211
);
1986 priv
->ieee80211
->link_change(dev
);
1987 notify_wx_assoc_event(priv
->ieee80211
);
1989 // Stop SW Beacon.Use hw beacon so do not need to do so.by amy
1991 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE );
1995 MlmeDisassociateRequest(
1996 struct net_device
*dev
,
2001 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2004 SendDisassociation(priv
->ieee80211
, asSta
, asRsn
);
2006 if( memcmp(priv
->ieee80211
->current_network
.bssid
, asSta
, 6 ) == 0 ){
2007 //ShuChen TODO: change media status.
2008 //ShuChen TODO: What to do when disassociate.
2009 DrvIFIndicateDisassociation(dev
, unspec_reason
);
2012 // pMgntInfo->AsocTimestamp = 0;
2013 for(i
=0;i
<6;i
++) priv
->ieee80211
->current_network
.bssid
[i
] = 0x22;
2014 // pMgntInfo->mBrates.Length = 0;
2015 // Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
2017 ieee80211_disassociate(priv
->ieee80211
);
2026 struct net_device
*dev
,
2030 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2033 // Commented out by rcnjko, 2005.01.27:
2034 // I move SecClearAllKeys() to MgntActSet_802_11_DISASSOCIATE().
2036 // //2004/09/15, kcwu, the key should be cleared, or the new handshaking will not success
2037 // SecClearAllKeys(Adapter);
2039 // In WPA WPA2 need to Clear all key ... because new key will set after new handshaking.
2041 if( pMgntInfo
->SecurityInfo
.AuthMode
> RT_802_11AuthModeAutoSwitch
||
2042 (pMgntInfo
->bAPSuportCCKM
&& pMgntInfo
->bCCX8021xenable
) ) // In CCKM mode will Clear key
2044 SecClearAllKeys(Adapter
);
2045 RT_TRACE(COMP_SEC
, DBG_LOUD
,("======>CCKM clear key..."))
2048 // 2004.10.11, by rcnjko.
2049 //MlmeDisassociateRequest( Adapter, pMgntInfo->Bssid, disas_lv_ss );
2050 MlmeDisassociateRequest( dev
, priv
->ieee80211
->current_network
.bssid
, asRsn
);
2052 priv
->ieee80211
->state
= IEEE80211_NOLINK
;
2053 // pMgntInfo->AsocTimestamp = 0;
2057 struct net_device
*dev
,
2061 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2063 // Schedule an workitem to wake up for ps mode, 070109, by rcnjko.
2066 if(pMgntInfo
->mPss
!= eAwake
)
2069 // Using AwkaeTimer to prevent mismatch ps state.
2070 // In the timer the state will be changed according to the RF is being awoke or not. By Bruce, 2007-10-31.
2072 // PlatformScheduleWorkItem( &(pMgntInfo->AwakeWorkItem) );
2073 PlatformSetTimer( Adapter
, &(pMgntInfo
->AwakeTimer
), 0 );
2077 // Indication of disassociation event.
2078 //DrvIFIndicateDisassociation(Adapter, asRsn);
2079 if(IS_DOT11D_ENABLE(priv
->ieee80211
))
2080 Dot11d_Reset(priv
->ieee80211
);
2081 // In adhoc mode, update beacon frame.
2082 if( priv
->ieee80211
->state
== IEEE80211_LINKED
)
2084 if( priv
->ieee80211
->iw_mode
== IW_MODE_ADHOC
)
2086 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectIBSS\n"));
2087 //printk("MgntDisconnect() ===> MgntDisconnectIBSS\n");
2088 MgntDisconnectIBSS(dev
);
2090 if( priv
->ieee80211
->iw_mode
== IW_MODE_INFRA
)
2092 // We clear key here instead of MgntDisconnectAP() because that
2093 // MgntActSet_802_11_DISASSOCIATE() is an interface called by OS,
2094 // e.g. OID_802_11_DISASSOCIATE in Windows while as MgntDisconnectAP() is
2095 // used to handle disassociation related things to AP, e.g. send Disassoc
2096 // frame to AP. 2005.01.27, by rcnjko.
2097 // SecClearAllKeys(Adapter);
2099 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectAP\n"));
2100 //printk("MgntDisconnect() ===> MgntDisconnectAP\n");
2101 MgntDisconnectAP(dev
, asRsn
);
2104 // Inidicate Disconnect, 2005.02.23, by rcnjko.
2105 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE);
2112 // Chang RF Power State.
2113 // Note that, only MgntActSet_RF_State() is allowed to set HW_VAR_RF_STATE.
2120 struct net_device
*dev
,
2121 RT_RF_POWER_STATE eRFPowerState
2124 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2125 bool bResult
= false;
2127 // printk("---------> SetRFPowerState(): eRFPowerState(%d)\n", eRFPowerState);
2128 if(eRFPowerState
== priv
->eRFPowerState
)
2130 // printk("<--------- SetRFPowerState(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState);
2134 switch(priv
->rf_chip
)
2138 bResult
= SetZebraRFPowerState8185(dev
, eRFPowerState
);
2142 printk("SetRFPowerState8185(): unknown RFChipID: 0x%X!!!\n", priv
->rf_chip
);
2145 // printk("<--------- SetRFPowerState(): bResult(%d)\n", bResult);
2150 HalEnableRx8185Dummy(
2151 struct net_device
*dev
2156 HalDisableRx8185Dummy(
2157 struct net_device
*dev
2163 MgntActSet_RF_State(
2164 struct net_device
*dev
,
2165 RT_RF_POWER_STATE StateToSet
,
2169 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2170 bool bActionAllowed
= false;
2171 bool bConnectBySSID
= false;
2172 RT_RF_POWER_STATE rtState
;
2173 u16 RFWaitCounter
= 0;
2175 // printk("===>MgntActSet_RF_State(): StateToSet(%d), ChangeSource(0x%x)\n",StateToSet, ChangeSource);
2177 // Prevent the race condition of RF state change. By Bruce, 2007-11-28.
2178 // Only one thread can change the RF state at one time, and others should wait to be executed.
2183 // down(&priv->rf_state);
2184 spin_lock_irqsave(&priv
->rf_ps_lock
,flag
);
2185 if(priv
->RFChangeInProgress
)
2187 // printk("====================>haha111111111\n");
2188 // up(&priv->rf_state);
2189 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): RF Change in progress! Wait to set..StateToSet(%d).\n", StateToSet));
2190 spin_unlock_irqrestore(&priv
->rf_ps_lock
,flag
);
2191 // Set RF after the previous action is done.
2192 while(priv
->RFChangeInProgress
)
2195 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Wait 1 ms (%d times)...\n", RFWaitCounter));
2196 udelay(1000); // 1 ms
2198 // Wait too long, return FALSE to avoid to be stuck here.
2199 if(RFWaitCounter
> 1000) // 1sec
2201 // RT_ASSERT(FALSE, ("MgntActSet_RF_State(): Wait too logn to set RF\n"));
2202 printk("MgntActSet_RF_State(): Wait too long to set RF\n");
2203 // TODO: Reset RF state?
2210 // printk("========================>haha2\n");
2211 priv
->RFChangeInProgress
= true;
2212 // up(&priv->rf_state);
2213 spin_unlock_irqrestore(&priv
->rf_ps_lock
,flag
);
2218 rtState
= priv
->eRFPowerState
;
2225 // Turn On RF no matter the IPS setting because we need to update the RF state to Ndis under Vista, or
2226 // the Windows does not allow the driver to perform site survey any more. By Bruce, 2007-10-02.
2228 priv
->RfOffReason
&= (~ChangeSource
);
2230 if(! priv
->RfOffReason
)
2232 priv
->RfOffReason
= 0;
2233 bActionAllowed
= true;
2235 if(rtState
== eRfOff
&& ChangeSource
>=RF_CHANGE_BY_HW
&& !priv
->bInHctTest
)
2237 bConnectBySSID
= true;
2241 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State - eRfon reject pMgntInfo->RfOffReason= 0x%x, ChangeSource=0x%X\n", pMgntInfo->RfOffReason, ChangeSource));
2246 // 070125, rcnjko: we always keep connected in AP mode.
2248 if (priv
->RfOffReason
> RF_CHANGE_BY_IPS
)
2252 // Disconnect to current BSS when radio off. Asked by QuanTa.
2256 // Calling MgntDisconnect() instead of MgntActSet_802_11_DISASSOCIATE(),
2257 // because we do NOT need to set ssid to dummy ones.
2258 // Revised by Roger, 2007.12.04.
2260 MgntDisconnect( dev
, disas_lv_ss
);
2262 // Clear content of bssDesc[] and bssDesc4Query[] to avoid reporting old bss to UI.
2263 // 2007.05.28, by shien chang.
2264 // PlatformZeroMemory( pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2265 // pMgntInfo->NumBssDesc = 0;
2266 // PlatformZeroMemory( pMgntInfo->bssDesc4Query, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2267 // pMgntInfo->NumBssDesc4Query = 0;
2272 priv
->RfOffReason
|= ChangeSource
;
2273 bActionAllowed
= true;
2277 priv
->RfOffReason
|= ChangeSource
;
2278 bActionAllowed
= true;
2287 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, pMgntInfo->RfOffReason));
2288 // Config HW to the specified mode.
2289 // printk("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, priv->RfOffReason);
2290 SetRFPowerState(dev
, StateToSet
);
2293 if(StateToSet
== eRfOn
)
2295 HalEnableRx8185Dummy(dev
);
2298 // by amy not supported
2299 // MgntActSet_802_11_SSID(Adapter, Adapter->MgntInfo.Ssid.Octet, Adapter->MgntInfo.Ssid.Length, TRUE );
2303 else if(StateToSet
== eRfOff
)
2305 HalDisableRx8185Dummy(dev
);
2310 // printk("MgntActSet_RF_State(): Action is rejected.... StateToSet(%d), ChangeSource(%#X), RfOffReason(%#X)\n", StateToSet, ChangeSource, priv->RfOffReason);
2313 // Release RF spinlock
2314 // down(&priv->rf_state);
2315 spin_lock_irqsave(&priv
->rf_ps_lock
,flag
);
2316 priv
->RFChangeInProgress
= false;
2317 // up(&priv->rf_state);
2318 spin_unlock_irqrestore(&priv
->rf_ps_lock
,flag
);
2319 // printk("<===MgntActSet_RF_State()\n");
2320 return bActionAllowed
;
2324 struct net_device
*dev
2327 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2331 // This flag "bSwRfProcessing", indicates the status of IPS procedure, should be set if the IPS workitem
2332 // is really scheduled.
2333 // The old code, sets this flag before scheduling the IPS workitem and however, at the same time the
2334 // previous IPS workitem did not end yet, fails to schedule the current workitem. Thus, bSwRfProcessing
2335 // blocks the IPS procedure of switching RF.
2336 // By Bruce, 2007-12-25.
2338 priv
->bSwRfProcessing
= true;
2340 MgntActSet_RF_State(dev
, priv
->eInactivePowerState
, RF_CHANGE_BY_IPS
);
2343 // To solve CAM values miss in RF OFF, rewrite CAM values after RF ON. By Bruce, 2007-09-20.
2346 priv
->bSwRfProcessing
= false;
2351 // Enter the inactive power save mode. RF will be off
2352 // 2007.08.17, by shien chang.
2356 struct net_device
*dev
2359 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2360 RT_RF_POWER_STATE rtState
;
2361 //printk("==============================>enter IPS\n");
2362 if (priv
->bInactivePs
)
2364 rtState
= priv
->eRFPowerState
;
2367 // Added by Bruce, 2007-12-25.
2368 // Do not enter IPS in the following conditions:
2369 // (1) RF is already OFF or Sleep
2370 // (2) bSwRfProcessing (indicates the IPS is still under going)
2371 // (3) Connectted (only disconnected can trigger IPS)
2372 // (4) IBSS (send Beacon)
2373 // (5) AP mode (send Beacon)
2375 if (rtState
== eRfOn
&& !priv
->bSwRfProcessing
2376 && (priv
->ieee80211
->state
!= IEEE80211_LINKED
))
2378 // printk("IPSEnter(): Turn off RF.\n");
2379 priv
->eInactivePowerState
= eRfOff
;
2380 InactivePowerSave(dev
);
2383 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2387 struct net_device
*dev
2390 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2391 RT_RF_POWER_STATE rtState
;
2392 //printk("===================================>leave IPS\n");
2393 if (priv
->bInactivePs
)
2395 rtState
= priv
->eRFPowerState
;
2396 if ((rtState
== eRfOff
|| rtState
== eRfSleep
) && (!priv
->bSwRfProcessing
) && priv
->RfOffReason
<= RF_CHANGE_BY_IPS
)
2398 // printk("IPSLeave(): Turn on RF.\n");
2399 priv
->eInactivePowerState
= eRfOn
;
2400 InactivePowerSave(dev
);
2403 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2405 //by amy for power save
2406 void rtl8185b_adapter_start(struct net_device
*dev
)
2408 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2409 struct ieee80211_device
*ieee
= priv
->ieee80211
;
2411 u8 SupportedWirelessMode
;
2412 u8 InitWirelessMode
;
2413 u8 bInvalidWirelessMode
= 0;
2421 //rtl8180_rtx_disable(dev);
2423 write_nic_byte(dev
,0x24e, (BIT5
|BIT6
|BIT0
));
2427 priv
->dma_poll_mask
= 0;
2428 priv
->dma_poll_stop_mask
= 0;
2430 //rtl8180_beacon_tx_disable(dev);
2432 HwConfigureRTL8185(dev
);
2434 write_nic_dword(dev
, MAC0
, ((u32
*)dev
->dev_addr
)[0]);
2435 write_nic_word(dev
, MAC4
, ((u32
*)dev
->dev_addr
)[1] & 0xffff );
2437 write_nic_byte(dev
, MSR
, read_nic_byte(dev
, MSR
) & 0xf3); // default network type to 'No Link'
2439 //write_nic_byte(dev, BRSR, 0x0); // Set BRSR= 1M
2441 write_nic_word(dev
, BcnItv
, 100);
2442 write_nic_word(dev
, AtimWnd
, 2);
2444 //PlatformEFIOWrite2Byte(dev, FEMR, 0xFFFF);
2445 PlatformIOWrite2Byte(dev
, FEMR
, 0xFFFF);
2447 write_nic_byte(dev
, WPA_CONFIG
, 0);
2449 MacConfig_85BASIC(dev
);
2451 // Override the RFSW_CTRL (MAC offset 0x272-0x273), 2006.06.07, by rcnjko.
2452 // BT_DEMO_BOARD type
2453 PlatformIOWrite2Byte(dev
, RFSW_CTRL
, 0x569a);
2455 //#ifdef CONFIG_RTL818X_S
2456 // for jong required
2457 // PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2461 //PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2463 //-----------------------------------------------------------------------------
2464 // Set up PHY related.
2465 //-----------------------------------------------------------------------------
2466 // Enable Config3.PARAM_En to revise AnaaParm.
2467 write_nic_byte(dev
, CR9346
, 0xc0); // enable config register write
2469 tmpu8
= read_nic_byte(dev
, CONFIG3
);
2470 write_nic_byte(dev
, CONFIG3
, (tmpu8
|CONFIG3_PARM_En
) );
2472 // Turn on Analog power.
2473 // Asked for by William, otherwise, MAC 3-wire can't work, 2006.06.27, by rcnjko.
2474 write_nic_dword(dev
, ANAPARAM2
, ANAPARM2_ASIC_ON
);
2475 write_nic_dword(dev
, ANAPARAM
, ANAPARM_ASIC_ON
);
2477 write_nic_word(dev
, ANAPARAM3
, 0x0010);
2480 write_nic_byte(dev
, CONFIG3
, tmpu8
);
2481 write_nic_byte(dev
, CR9346
, 0x00);
2482 //{by amy 080312 for led
2483 // enable EEM0 and EEM1 in 9346CR
2484 btCR9346
= read_nic_byte(dev
, CR9346
);
2485 write_nic_byte(dev
, CR9346
, (btCR9346
|0xC0) );
2487 // B cut use LED1 to control HW RF on/off
2488 TmpU1b
= read_nic_byte(dev
, CONFIG5
);
2489 TmpU1b
= TmpU1b
& ~BIT3
;
2490 write_nic_byte(dev
,CONFIG5
, TmpU1b
);
2492 // disable EEM0 and EEM1 in 9346CR
2493 btCR9346
&= ~(0xC0);
2494 write_nic_byte(dev
, CR9346
, btCR9346
);
2496 //Enable Led (suggested by Jong)
2497 // B-cut RF Radio on/off 5e[3]=0
2498 btPSR
= read_nic_byte(dev
, PSR
);
2499 write_nic_byte(dev
, PSR
, (btPSR
| BIT3
));
2500 //by amy 080312 for led}
2501 // setup initial timing for RFE.
2502 write_nic_word(dev
, RFPinsOutput
, 0x0480);
2503 SetOutputEnableOfRfPins(dev
);
2504 write_nic_word(dev
, RFPinsSelect
, 0x2488);
2509 // We assume RegWirelessMode has already been initialized before,
2510 // however, we has to validate the wireless mode here and provide a reasonble
2511 // initialized value if necessary. 2005.01.13, by rcnjko.
2512 SupportedWirelessMode
= GetSupportedWirelessMode8185(dev
);
2513 if( (ieee
->mode
!= WIRELESS_MODE_B
) &&
2514 (ieee
->mode
!= WIRELESS_MODE_G
) &&
2515 (ieee
->mode
!= WIRELESS_MODE_A
) &&
2516 (ieee
->mode
!= WIRELESS_MODE_AUTO
))
2517 { // It should be one of B, G, A, or AUTO.
2518 bInvalidWirelessMode
= 1;
2521 { // One of B, G, A, or AUTO.
2522 // Check if the wireless mode is supported by RF.
2523 if( (ieee
->mode
!= WIRELESS_MODE_AUTO
) &&
2524 (ieee
->mode
& SupportedWirelessMode
) == 0 )
2526 bInvalidWirelessMode
= 1;
2530 if(bInvalidWirelessMode
|| ieee
->mode
==WIRELESS_MODE_AUTO
)
2531 { // Auto or other invalid value.
2532 // Assigne a wireless mode to initialize.
2533 if((SupportedWirelessMode
& WIRELESS_MODE_A
))
2535 InitWirelessMode
= WIRELESS_MODE_A
;
2537 else if((SupportedWirelessMode
& WIRELESS_MODE_G
))
2539 InitWirelessMode
= WIRELESS_MODE_G
;
2541 else if((SupportedWirelessMode
& WIRELESS_MODE_B
))
2543 InitWirelessMode
= WIRELESS_MODE_B
;
2547 DMESGW("InitializeAdapter8185(): No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n",
2548 SupportedWirelessMode
);
2549 InitWirelessMode
= WIRELESS_MODE_B
;
2552 // Initialize RegWirelessMode if it is not a valid one.
2553 if(bInvalidWirelessMode
)
2555 ieee
->mode
= (WIRELESS_MODE
)InitWirelessMode
;
2559 { // One of B, G, A.
2560 InitWirelessMode
= ieee
->mode
;
2562 //by amy for power save
2563 // printk("initialize ENABLE_IPS\n");
2564 priv
->eRFPowerState
= eRfOff
;
2565 priv
->RfOffReason
= 0;
2568 // u32 tmp = jiffies;
2569 MgntActSet_RF_State(dev
, eRfOn
, 0);
2571 // printk("rf on cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
2573 // DrvIFIndicateCurrentPhyStatus(priv);
2575 // If inactive power mode is enabled, disable rf while in disconnected state.
2576 // 2007.07.16, by shien chang.
2578 if (priv
->bInactivePs
)
2581 // u32 tmp = jiffies;
2582 MgntActSet_RF_State(dev
,eRfOff
, RF_CHANGE_BY_IPS
);
2584 // printk("rf off cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
2588 //by amy for power save
2590 // Turn off RF if necessary. 2005.08.23, by rcnjko.
2591 // We shall turn off RF after setting CMDR, otherwise,
2592 // RF will be turnned on after we enable MAC Tx/Rx.
2593 if(Adapter
->MgntInfo
.RegRfOff
== TRUE
)
2595 SetRFPowerState8185(Adapter
, RF_OFF
);
2599 SetRFPowerState8185(Adapter
, RF_ON
);
2603 /* //these is equal with above TODO.
2604 write_nic_byte(dev, CR9346, 0xc0); // enable config register write
2605 write_nic_byte(dev, CONFIG3, read_nic_byte(dev, CONFIG3) | CONFIG3_PARM_En);
2606 RF_WriteReg(dev, 0x4, 0x9FF);
2607 write_nic_dword(dev, ANAPARAM2, ANAPARM2_ASIC_ON);
2608 write_nic_dword(dev, ANAPARAM, ANAPARM_ASIC_ON);
2609 write_nic_byte(dev, CONFIG3, (read_nic_byte(dev, CONFIG3)&(~CONFIG3_PARM_En)));
2610 write_nic_byte(dev, CR9346, 0x00);
2613 ActSetWirelessMode8185(dev
, (u8
)(InitWirelessMode
));
2615 //-----------------------------------------------------------------------------
2617 rtl8185b_irq_enable(dev
);
2619 netif_start_queue(dev
);
2624 void rtl8185b_rx_enable(struct net_device
*dev
)
2628 /* for now we accept data, management & ctl frame*/
2629 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2631 if (dev
->flags
& IFF_PROMISC
) DMESG ("NIC in promisc mode");
2633 if(priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
|| \
2634 dev
->flags
& IFF_PROMISC
){
2635 priv
->ReceiveConfig
= priv
->ReceiveConfig
& (~RCR_APM
);
2636 priv
->ReceiveConfig
= priv
->ReceiveConfig
| RCR_AAP
;
2639 /*if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
2640 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
2641 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
2644 if(priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
){
2645 priv
->ReceiveConfig
= priv
->ReceiveConfig
| RCR_ACF
| RCR_APWRMGT
| RCR_AICV
;
2648 if( priv
->crcmon
== 1 && priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
)
2649 priv
->ReceiveConfig
= priv
->ReceiveConfig
| RCR_ACRC32
;
2651 write_nic_dword(dev
, RCR
, priv
->ReceiveConfig
);
2656 DMESG("rxconf: %x %x",priv
->ReceiveConfig
,read_nic_dword(dev
,RCR
));
2658 cmd
=read_nic_byte(dev
,CMD
);
2659 write_nic_byte(dev
,CMD
,cmd
| (1<<CMD_RX_ENABLE_SHIFT
));
2663 void rtl8185b_tx_enable(struct net_device
*dev
)
2669 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2671 write_nic_dword(dev
, TCR
, priv
->TransmitConfig
);
2672 byte
= read_nic_byte(dev
, MSR
);
2673 byte
|= MSR_LINK_ENEDCA
;
2674 write_nic_byte(dev
, MSR
, byte
);
2679 DMESG("txconf: %x %x",priv
->TransmitConfig
,read_nic_dword(dev
,TCR
));
2682 cmd
=read_nic_byte(dev
,CMD
);
2683 write_nic_byte(dev
,CMD
,cmd
| (1<<CMD_TX_ENABLE_SHIFT
));
2685 //write_nic_dword(dev,TX_CONF,txconf);
2689 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
2690 write_nic_byte(dev, TX_DMA_POLLING, priv->dma_poll_mask);
2691 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);