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 panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp
);
362 // RTL8187S HSSI Read/Write Function
363 u1bTmp
= read_nic_byte(dev
, RF_SW_CONFIG
);
367 u1bTmp
|= RF_SW_CFG_SI
; //reg08[1]=1 Serial Interface(SI)
370 u1bTmp
&= ~RF_SW_CFG_SI
; //reg08[1]=0 Parallel Interface(PI)
373 write_nic_byte(dev
, RF_SW_CONFIG
, u1bTmp
);
377 // jong: HW SI read must set reg84[3]=0.
378 u1bTmp
= read_nic_byte(dev
, RFPinsSelect
);
380 write_nic_byte(dev
, RFPinsSelect
, u1bTmp
);
382 // Fill up data buffer for write operation.
386 if(nDataBufBitCnt
== 16)
388 write_nic_word(dev
, SW_3W_DB0
, *((u16
*)pDataBuf
));
390 else if(nDataBufBitCnt
== 64) // RTL8187S shouldn't enter this case
392 write_nic_dword(dev
, SW_3W_DB0
, *((u32
*)pDataBuf
));
393 write_nic_dword(dev
, SW_3W_DB1
, *((u32
*)(pDataBuf
+ 4)));
398 int ByteCnt
= nDataBufBitCnt
/ 8;
399 //printk("%d\n",nDataBufBitCnt);
400 if ((nDataBufBitCnt
% 8) != 0)
401 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
404 if (nDataBufBitCnt
> 64)
405 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
408 for(idx
= 0; idx
< ByteCnt
; idx
++)
410 write_nic_byte(dev
, (SW_3W_DB0
+idx
), *(pDataBuf
+idx
));
418 // SI - reg274[3:0] : RF register's Address
419 write_nic_word(dev
, SW_3W_DB0
, *((u16
*)pDataBuf
) );
423 // PI - reg274[15:12] : RF register's Address
424 write_nic_word(dev
, SW_3W_DB0
, (*((u16
*)pDataBuf
)) << 12);
428 // Set up command: WE or RE.
431 write_nic_byte(dev
, SW_3W_CMD1
, SW_3W_CMD1_WE
);
435 write_nic_byte(dev
, SW_3W_CMD1
, SW_3W_CMD1_RE
);
438 // Check if DONE is set.
439 for(TryCnt
= 0; TryCnt
< TC_3W_POLL_MAX_TRY_CNT
; TryCnt
++)
441 u1bTmp
= read_nic_byte(dev
, SW_3W_CMD1
);
442 if( (u1bTmp
& SW_3W_CMD1_DONE
) != 0 )
449 write_nic_byte(dev
, SW_3W_CMD1
, 0);
451 // Read back data for read operation.
456 //Serial Interface : reg363_362[11:0]
457 *((u16
*)pDataBuf
) = read_nic_word(dev
, SI_DATA_READ
) ;
461 //Parallel Interface : reg361_360[11:0]
462 *((u16
*)pDataBuf
) = read_nic_word(dev
, PI_DATA_READ
);
465 *((u16
*)pDataBuf
) &= 0x0FFF;
476 struct net_device
*dev
,
489 // Check if WE and RE are cleared.
490 for(TryCnt
= 0; TryCnt
< TC_3W_POLL_MAX_TRY_CNT
; TryCnt
++)
492 u1bTmp
= read_nic_byte(dev
, SW_3W_CMD1
);
493 if( (u1bTmp
& (SW_3W_CMD1_RE
|SW_3W_CMD1_WE
)) == 0 )
499 if (TryCnt
== TC_3W_POLL_MAX_TRY_CNT
)
500 panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp
);
502 // Fill up data buffer for write operation.
503 if(nDataBufBitCnt
== 16)
505 write_nic_word(dev
, SW_3W_DB0
, *((u16
*)pDataBuf
));
507 else if(nDataBufBitCnt
== 64)
509 write_nic_dword(dev
, SW_3W_DB0
, *((u32
*)pDataBuf
));
510 write_nic_dword(dev
, SW_3W_DB1
, *((u32
*)(pDataBuf
+ 4)));
515 int ByteCnt
= nDataBufBitCnt
/ 8;
517 if ((nDataBufBitCnt
% 8) != 0)
518 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
521 if (nDataBufBitCnt
> 64)
522 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
525 for(idx
= 0; idx
< ByteCnt
; idx
++)
527 write_nic_byte(dev
, (SW_3W_DB0
+idx
), *(pDataBuf
+idx
));
531 // Fill up length field.
532 u1bTmp
= (u8
)(nDataBufBitCnt
- 1); // Number of bits - 1.
534 u1bTmp
|= SW_3W_CMD0_HOLD
;
535 write_nic_byte(dev
, SW_3W_CMD0
, u1bTmp
);
537 // Set up command: WE or RE.
540 write_nic_byte(dev
, SW_3W_CMD1
, SW_3W_CMD1_WE
);
544 write_nic_byte(dev
, SW_3W_CMD1
, SW_3W_CMD1_RE
);
547 // Check if WE and RE are cleared and DONE is set.
548 for(TryCnt
= 0; TryCnt
< TC_3W_POLL_MAX_TRY_CNT
; TryCnt
++)
550 u1bTmp
= read_nic_byte(dev
, SW_3W_CMD1
);
551 if( (u1bTmp
& (SW_3W_CMD1_RE
|SW_3W_CMD1_WE
)) == 0 &&
552 (u1bTmp
& SW_3W_CMD1_DONE
) != 0 )
558 if(TryCnt
== TC_3W_POLL_MAX_TRY_CNT
)
560 //RT_ASSERT(TryCnt != TC_3W_POLL_MAX_TRY_CNT,
561 // ("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear or DONE is not set!!\n", u1bTmp));
562 // Workaround suggested by wcchu: clear WE here. 2006.07.07, by rcnjko.
563 write_nic_byte(dev
, SW_3W_CMD1
, 0);
566 // Read back data for read operation.
567 // <RJ_TODO> I am not sure if this is correct output format of a read operation.
570 if(nDataBufBitCnt
== 16)
572 *((u16
*)pDataBuf
) = read_nic_word(dev
, SW_3W_DB0
);
574 else if(nDataBufBitCnt
== 64)
576 *((u32
*)pDataBuf
) = read_nic_dword(dev
, SW_3W_DB0
);
577 *((u32
*)(pDataBuf
+ 4)) = read_nic_dword(dev
, SW_3W_DB1
);
582 int ByteCnt
= nDataBufBitCnt
/ 8;
584 if ((nDataBufBitCnt
% 8) != 0)
585 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
588 if (nDataBufBitCnt
> 64)
589 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
592 for(idx
= 0; idx
< ByteCnt
; idx
++)
594 *(pDataBuf
+idx
) = read_nic_byte(dev
, (SW_3W_DB0
+idx
));
607 struct net_device
*dev
,
617 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
620 switch(priv
->rf_chip
)
622 case RFCHIPID_RTL8225
:
623 case RF_ZEBRA2
: // Annie 2006-05-12.
624 case RF_ZEBRA4
: //by amy
625 switch(priv
->RegThreeWireMode
)
628 { // Perform SW 3-wire programming by driver.
629 data2Write
= (data
<< 4) | (u32
)(offset
& 0x0f);
632 ZEBRA_RFSerialWrite(dev
, data2Write
, len
, low2high
);
638 data2Write
= (data
<< 4) | (u32
)(offset
& 0x0f);
642 (u8
*)(&data2Write
), // pDataBuf,
643 len
, // nDataBufBitCnt,
648 case HW_THREE_WIRE_PI
: //Parallel Interface
650 data2Write
= (data
<< 4) | (u32
)(offset
& 0x0f);
654 (u8
*)(&data2Write
), // pDataBuf,
655 len
, // nDataBufBitCnt,
663 case HW_THREE_WIRE_SI
: //Serial Interface
665 data2Write
= (data
<< 4) | (u32
)(offset
& 0x0f);
667 // printk(" enter ZEBRA_RFSerialWrite\n ");
669 // ZEBRA_RFSerialWrite(dev, data2Write, len, low2high);
673 (u8
*)(&data2Write
), // pDataBuf,
674 len
, // nDataBufBitCnt,
678 // printk(" exit ZEBRA_RFSerialWrite\n ");
684 DMESGE("RF_WriteReg(): invalid RegThreeWireMode(%d) !!!", priv
->RegThreeWireMode
);
690 DMESGE("RF_WriteReg(): unknown RFChipID: %#X", priv
->rf_chip
);
698 struct net_device
*dev
,
708 u16 oval
,oval2
,oval3
,tmp
, wReg80
;
712 //PHAL_DATA_8187 pHalData = GetHalData8187(pAdapter);
713 { // RTL8187S HSSI Read/Write Function
714 u1bTmp
= read_nic_byte(dev
, RF_SW_CONFIG
);
715 u1bTmp
|= RF_SW_CFG_SI
; //reg08[1]=1 Serial Interface(SI)
716 write_nic_byte(dev
, RF_SW_CONFIG
, u1bTmp
);
719 wReg80
= oval
= read_nic_word(dev
, RFPinsOutput
);
720 oval2
= read_nic_word(dev
, RFPinsEnable
);
721 oval3
= read_nic_word(dev
, RFPinsSelect
);
723 write_nic_word(dev
, RFPinsEnable
, oval2
|0xf);
724 write_nic_word(dev
, RFPinsSelect
, oval3
|0xf);
728 // We must clear BIT0-3 here, otherwise,
729 // SW_Enalbe will be true when we first call ZEBRA_RFSerialRead() after 8187MPVC open,
730 // which will cause the value read become 0. 2005.04.11, by rcnjko.
733 // Avoid collision with hardware three-wire.
735 twreg
.struc
.enableB
= 1;
736 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(4);
739 twreg
.struc
.enableB
= 0;
741 twreg
.struc
.read_write
= 0;
742 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(5);
744 mask
= (low2high
) ? 0x01 : ((u32
)0x01<<(32-1));
745 for(i
= 0; i
< wLength
/2; i
++)
747 twreg
.struc
.data
= ((data2Write
&mask
) != 0) ? 1 : 0;
748 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(1);
750 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
751 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
753 mask
= (low2high
) ? (mask
<<1): (mask
>>1);
757 // 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.
758 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0xe); // turn off data enable
759 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0xe);
761 twreg
.struc
.read_write
=1;
762 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
764 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
767 twreg
.struc
.data
= ((data2Write
&mask
) != 0) ? 1: 0;
768 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
769 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
772 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(1);
774 mask
= (low2high
) ? (mask
<<1) : (mask
>>1);
778 twreg
.struc
.data
= 0;
779 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
780 mask
= (low2high
) ? 0x01 : ((u32
)0x01 << (12-1));
783 // 061016, by rcnjko:
784 // We must set data pin to HW controled, otherwise RF can't driver it and
785 // value RF register won't be able to read back properly.
787 write_nic_word(dev
, RFPinsEnable
, ( ((oval2
|0x0E) & (~0x01))) );
789 for(i
= 0; i
< rLength
; i
++)
791 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(1);
793 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
794 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
795 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
796 tmp
= read_nic_word(dev
, RFPinsInput
);
797 tdata
.longData
= tmp
;
798 *data2Read
|= tdata
.struc
.clk
? mask
: 0;
801 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
803 mask
= (low2high
) ? (mask
<<1) : (mask
>>1);
805 twreg
.struc
.enableB
= 1;
807 twreg
.struc
.data
= 0;
808 twreg
.struc
.read_write
= 1;
809 write_nic_word(dev
, RFPinsOutput
, twreg
.longData
|oval
); udelay(2);
811 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, oval2|0x8); // Set To Output Enable
812 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.
813 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0x1bff);
814 write_nic_word(dev
, RFPinsSelect
, oval3
); // Set To SW Switch
815 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0x0488);
816 write_nic_word(dev
, RFPinsOutput
, 0x3a0);
817 //PlatformEFIOWrite2Byte(pAdapter, RFPinsOutput, 0x0480);
823 struct net_device
*dev
,
827 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
834 switch(priv
->rf_chip
)
836 case RFCHIPID_RTL8225
:
839 switch(priv
->RegThreeWireMode
)
841 case HW_THREE_WIRE_PI
: // For 87S Parallel Interface.
843 data2Write
= ((u32
)(offset
&0x0f));
847 (u8
*)(&data2Write
), // pDataBuf,
848 wlen
, // nDataBufBitCnt,
851 dataRead
= data2Write
;
855 case HW_THREE_WIRE_SI
: // For 87S Serial Interface.
857 data2Write
= ((u32
)(offset
&0x0f)) ;
861 (u8
*)(&data2Write
), // pDataBuf,
862 wlen
, // nDataBufBitCnt,
866 dataRead
= data2Write
;
870 // Perform SW 3-wire programming by driver.
873 data2Write
= ((u32
)(offset
&0x1f)) << 27; // For Zebra E-cut. 2005.04.11, by rcnjko.
877 ZEBRA_RFSerialRead(dev
, data2Write
, wlen
,&dataRead
,rlen
, low2high
);
891 // by Owen on 04/07/14 for writing BB register successfully
894 struct net_device
*dev
,
902 UCharData
= (u8
)((Data
& 0x0000ff00) >> 8);
903 PlatformIOWrite4Byte(dev
, PhyAddr
, Data
);
904 //for(TimeoutCounter = 10; TimeoutCounter > 0; TimeoutCounter--)
906 PlatformIOWrite4Byte(dev
, PhyAddr
, Data
& 0xffffff7f);
907 RegisterContent
= PlatformIORead1Byte(dev
, PhyDataR
);
908 //if(UCharData == RegisterContent)
915 struct net_device
*dev
,
922 PlatformIOWrite4Byte(dev
, PhyAddr
, addr
& 0xffffff7f);
923 RegisterContent
= PlatformIORead1Byte(dev
, PhyDataR
);
925 return RegisterContent
;
930 // Perform Antenna settings with antenna diversity on 87SE.
931 // Created by Roger, 2008.01.25.
934 SetAntennaConfig87SE(
935 struct net_device
*dev
,
936 u8 DefaultAnt
, // 0: Main, 1: Aux.
937 bool bAntDiversity
// 1:Enable, 0: Disable.
940 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
941 bool bAntennaSwitched
= true;
943 //printk("SetAntennaConfig87SE(): DefaultAnt(%d), bAntDiversity(%d)\n", DefaultAnt, bAntDiversity);
945 // Threshold for antenna diversity.
946 write_phy_cck(dev
, 0x0c, 0x09); // Reg0c : 09
948 if( bAntDiversity
) // Enable Antenna Diversity.
950 if( DefaultAnt
== 1 ) // aux antenna
952 // Mac register, aux antenna
953 write_nic_byte(dev
, ANTSEL
, 0x00);
955 // Config CCK RX antenna.
956 write_phy_cck(dev
, 0x11, 0xbb); // Reg11 : bb
957 write_phy_cck(dev
, 0x01, 0xc7); // Reg01 : c7
959 // Config OFDM RX antenna.
960 write_phy_ofdm(dev
, 0x0D, 0x54); // Reg0d : 54
961 write_phy_ofdm(dev
, 0x18, 0xb2); // Reg18 : b2
963 else // use main antenna
965 // Mac register, main antenna
966 write_nic_byte(dev
, ANTSEL
, 0x03);
968 // Config CCK RX antenna.
969 write_phy_cck(dev
, 0x11, 0x9b); // Reg11 : 9b
970 write_phy_cck(dev
, 0x01, 0xc7); // Reg01 : c7
972 // Config OFDM RX antenna.
973 write_phy_ofdm(dev
, 0x0d, 0x5c); // Reg0d : 5c
974 write_phy_ofdm(dev
, 0x18, 0xb2); // Reg18 : b2
977 else // Disable Antenna Diversity.
979 if( DefaultAnt
== 1 ) // aux Antenna
981 // Mac register, aux antenna
982 write_nic_byte(dev
, ANTSEL
, 0x00);
984 // Config CCK RX antenna.
985 write_phy_cck(dev
, 0x11, 0xbb); // Reg11 : bb
986 write_phy_cck(dev
, 0x01, 0x47); // Reg01 : 47
988 // Config OFDM RX antenna.
989 write_phy_ofdm(dev
, 0x0D, 0x54); // Reg0d : 54
990 write_phy_ofdm(dev
, 0x18, 0x32); // Reg18 : 32
994 // Mac register, main antenna
995 write_nic_byte(dev
, ANTSEL
, 0x03);
997 // Config CCK RX antenna.
998 write_phy_cck(dev
, 0x11, 0x9b); // Reg11 : 9b
999 write_phy_cck(dev
, 0x01, 0x47); // Reg01 : 47
1001 // Config OFDM RX antenna.
1002 write_phy_ofdm(dev
, 0x0D, 0x5c); // Reg0d : 5c
1003 write_phy_ofdm(dev
, 0x18, 0x32); // Reg18 : 32
1006 priv
->CurrAntennaIndex
= DefaultAnt
; // Update default settings.
1007 return bAntennaSwitched
;
1010 /*---------------------------------------------------------------
1011 * Hardware Initialization.
1012 * the code is ported from Windows source code
1013 ----------------------------------------------------------------*/
1016 ZEBRA_Config_85BASIC_HardCode(
1017 struct net_device
*dev
1021 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1024 u32 u4bRegOffset
, u4bRegValue
, u4bRF23
, u4bRF24
;
1028 //=============================================================================
1029 // 87S_PCIE :: RADIOCFG.TXT
1030 //=============================================================================
1033 // Page1 : reg16-reg30
1034 RF_WriteReg(dev
, 0x00, 0x013f); mdelay(1); // switch to page1
1035 u4bRF23
= RF_ReadReg(dev
, 0x08); mdelay(1);
1036 u4bRF24
= RF_ReadReg(dev
, 0x09); mdelay(1);
1038 if (u4bRF23
==0x818 && u4bRF24
==0x70C && priv
->card_8185
== VERSION_8187S_C
)
1039 priv
->card_8185
= VERSION_8187S_D
;
1041 // Page0 : reg0-reg15
1043 // RF_WriteReg(dev, 0x00, 0x003f); mdelay(1);//1
1044 RF_WriteReg(dev
, 0x00, 0x009f); mdelay(1);// 1
1046 RF_WriteReg(dev
, 0x01, 0x06e0); mdelay(1);
1048 // RF_WriteReg(dev, 0x02, 0x004c); mdelay(1);//2
1049 RF_WriteReg(dev
, 0x02, 0x004d); mdelay(1);// 2
1051 // RF_WriteReg(dev, 0x03, 0x0000); mdelay(1);//3
1052 RF_WriteReg(dev
, 0x03, 0x07f1); mdelay(1);// 3
1054 RF_WriteReg(dev
, 0x04, 0x0975); mdelay(1);
1055 RF_WriteReg(dev
, 0x05, 0x0c72); mdelay(1);
1056 RF_WriteReg(dev
, 0x06, 0x0ae6); mdelay(1);
1057 RF_WriteReg(dev
, 0x07, 0x00ca); mdelay(1);
1058 RF_WriteReg(dev
, 0x08, 0x0e1c); mdelay(1);
1059 RF_WriteReg(dev
, 0x09, 0x02f0); mdelay(1);
1060 RF_WriteReg(dev
, 0x0a, 0x09d0); mdelay(1);
1061 RF_WriteReg(dev
, 0x0b, 0x01ba); mdelay(1);
1062 RF_WriteReg(dev
, 0x0c, 0x0640); mdelay(1);
1063 RF_WriteReg(dev
, 0x0d, 0x08df); mdelay(1);
1064 RF_WriteReg(dev
, 0x0e, 0x0020); mdelay(1);
1065 RF_WriteReg(dev
, 0x0f, 0x0990); mdelay(1);
1068 // Page1 : reg16-reg30
1069 RF_WriteReg(dev
, 0x00, 0x013f); mdelay(1);
1071 RF_WriteReg(dev
, 0x03, 0x0806); mdelay(1);
1073 if(priv
->card_8185
< VERSION_8187S_C
)
1075 RF_WriteReg(dev
, 0x04, 0x03f7); mdelay(1);
1076 RF_WriteReg(dev
, 0x05, 0x05ab); mdelay(1);
1077 RF_WriteReg(dev
, 0x06, 0x00c1); mdelay(1);
1081 RF_WriteReg(dev
, 0x04, 0x03a7); mdelay(1);
1082 RF_WriteReg(dev
, 0x05, 0x059b); mdelay(1);
1083 RF_WriteReg(dev
, 0x06, 0x0081); mdelay(1);
1087 RF_WriteReg(dev
, 0x07, 0x01A0); mdelay(1);
1088 // Don't write RF23/RF24 to make a difference between 87S C cut and D cut. asked by SD3 stevenl.
1089 // RF_WriteReg(dev, 0x08, 0x0597); mdelay(1);
1090 // RF_WriteReg(dev, 0x09, 0x050a); mdelay(1);
1091 RF_WriteReg(dev
, 0x0a, 0x0001); mdelay(1);
1092 RF_WriteReg(dev
, 0x0b, 0x0418); mdelay(1);
1094 if(priv
->card_8185
== VERSION_8187S_D
)
1096 RF_WriteReg(dev
, 0x0c, 0x0fbe); mdelay(1);
1097 RF_WriteReg(dev
, 0x0d, 0x0008); mdelay(1);
1098 RF_WriteReg(dev
, 0x0e, 0x0807); mdelay(1); // RX LO buffer
1102 RF_WriteReg(dev
, 0x0c, 0x0fbe); mdelay(1);
1103 RF_WriteReg(dev
, 0x0d, 0x0008); mdelay(1);
1104 RF_WriteReg(dev
, 0x0e, 0x0806); mdelay(1); // RX LO buffer
1107 RF_WriteReg(dev
, 0x0f, 0x0acc); mdelay(1);
1109 // RF_WriteReg(dev, 0x00, 0x017f); mdelay(1);//6
1110 RF_WriteReg(dev
, 0x00, 0x01d7); mdelay(1);// 6
1112 RF_WriteReg(dev
, 0x03, 0x0e00); mdelay(1);
1113 RF_WriteReg(dev
, 0x04, 0x0e50); mdelay(1);
1116 RF_WriteReg(dev
, 0x01, i
); mdelay(1);
1117 RF_WriteReg(dev
, 0x02, ZEBRA_RF_RX_GAIN_TABLE
[i
]); mdelay(1);
1118 //DbgPrint("RF - 0x%x = 0x%x", i, ZEBRA_RF_RX_GAIN_TABLE[i]);
1121 RF_WriteReg(dev
, 0x05, 0x0203); mdelay(1); /// 203, 343
1122 //RF_WriteReg(dev, 0x06, 0x0300); mdelay(1); // 400
1123 RF_WriteReg(dev
, 0x06, 0x0200); mdelay(1); // 400
1125 RF_WriteReg(dev
, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30, and HSSI disable 137
1126 mdelay(10); // Deay 10 ms. //0xfd
1128 // RF_WriteReg(dev, 0x0c, 0x09be); mdelay(1); // 7
1129 //RF_WriteReg(dev, 0x0c, 0x07be); mdelay(1);
1130 //mdelay(10); // Deay 10 ms. //0xfd
1132 RF_WriteReg(dev
, 0x0d, 0x0008); mdelay(1); // Z4 synthesizer loop filter setting, 392
1133 mdelay(10); // Deay 10 ms. //0xfd
1135 RF_WriteReg(dev
, 0x00, 0x0037); mdelay(1); // switch to reg0-reg15, and HSSI disable
1136 mdelay(10); // Deay 10 ms. //0xfd
1138 RF_WriteReg(dev
, 0x04, 0x0160); mdelay(1); // CBC on, Tx Rx disable, High gain
1139 mdelay(10); // Deay 10 ms. //0xfd
1141 RF_WriteReg(dev
, 0x07, 0x0080); mdelay(1); // Z4 setted channel 1
1142 mdelay(10); // Deay 10 ms. //0xfd
1144 RF_WriteReg(dev
, 0x02, 0x088D); mdelay(1); // LC calibration
1145 mdelay(200); // Deay 200 ms. //0xfd
1146 mdelay(10); // Deay 10 ms. //0xfd
1147 mdelay(10); // Deay 10 ms. //0xfd
1149 RF_WriteReg(dev
, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30 137, and HSSI disable 137
1150 mdelay(10); // Deay 10 ms. //0xfd
1152 RF_WriteReg(dev
, 0x07, 0x0000); mdelay(1);
1153 RF_WriteReg(dev
, 0x07, 0x0180); mdelay(1);
1154 RF_WriteReg(dev
, 0x07, 0x0220); mdelay(1);
1155 RF_WriteReg(dev
, 0x07, 0x03E0); mdelay(1);
1157 // DAC calibration off 20070702
1158 RF_WriteReg(dev
, 0x06, 0x00c1); mdelay(1);
1159 RF_WriteReg(dev
, 0x0a, 0x0001); mdelay(1);
1161 // For crystal calibration, added by Roger, 2007.12.11.
1162 if( priv
->bXtalCalibration
) // reg 30.
1163 { // enable crystal calibration.
1164 // RF Reg[30], (1)Xin:[12:9], Xout:[8:5], addr[4:0].
1165 // (2)PA Pwr delay timer[15:14], default: 2.4us, set BIT15=0
1166 // (3)RF signal on/off when calibration[13], default: on, set BIT13=0.
1167 // So we should minus 4 BITs offset.
1168 RF_WriteReg(dev
, 0x0f, (priv
->XtalCal_Xin
<<5)|(priv
->XtalCal_Xout
<<1)|BIT11
|BIT9
); mdelay(1);
1169 printk("ZEBRA_Config_85BASIC_HardCode(): (%02x)\n",
1170 (priv
->XtalCal_Xin
<<5) | (priv
->XtalCal_Xout
<<1) | BIT11
| BIT9
);
1173 { // using default value. Xin=6, Xout=6.
1174 RF_WriteReg(dev
, 0x0f, 0x0acc); mdelay(1);
1177 // RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1); //-by amy 080312
1179 RF_WriteReg(dev
, 0x00, 0x00bf); mdelay(1); // switch to reg0-reg15, and HSSI enable
1180 // RF_WriteReg(dev, 0x0d, 0x009f); mdelay(1); // Rx BB start calibration, 00c//-edward
1181 RF_WriteReg(dev
, 0x0d, 0x08df); mdelay(1); // Rx BB start calibration, 00c//+edward
1182 RF_WriteReg(dev
, 0x02, 0x004d); mdelay(1); // temperature meter off
1183 RF_WriteReg(dev
, 0x04, 0x0975); mdelay(1); // Rx mode
1184 mdelay(10); // Deay 10 ms. //0xfe
1185 mdelay(10); // Deay 10 ms. //0xfe
1186 mdelay(10); // Deay 10 ms. //0xfe
1187 RF_WriteReg(dev
, 0x00, 0x0197); mdelay(1); // Rx mode//+edward
1188 RF_WriteReg(dev
, 0x05, 0x05ab); mdelay(1); // Rx mode//+edward
1189 RF_WriteReg(dev
, 0x00, 0x009f); mdelay(1); // Rx mode//+edward
1191 RF_WriteReg(dev
, 0x01, 0x0000); mdelay(1); // Rx mode//+edward
1192 RF_WriteReg(dev
, 0x02, 0x0000); mdelay(1); // Rx mode//+edward
1193 //power save parameters.
1194 u1b24E
= read_nic_byte(dev
, 0x24E);
1195 write_nic_byte(dev
, 0x24E, (u1b24E
& (~(BIT5
|BIT6
))));
1197 //=============================================================================
1199 //=============================================================================
1201 //=============================================================================
1203 /* [POWER SAVE] Power Saving Parameters by jong. 2007-11-27
1204 CCK reg0x00[7]=1'b1 :power saving for TX (default)
1205 CCK reg0x00[6]=1'b1: power saving for RX (default)
1206 CCK reg0x06[4]=1'b1: turn off channel estimation related circuits if not doing channel estimation.
1207 CCK reg0x06[3]=1'b1: turn off unused circuits before cca = 1
1208 CCK reg0x06[2]=1'b1: turn off cck's circuit if macrst =0
1211 write_phy_cck(dev
,0x00,0xc8);
1212 write_phy_cck(dev
,0x06,0x1c);
1213 write_phy_cck(dev
,0x10,0x78);
1214 write_phy_cck(dev
,0x2e,0xd0);
1215 write_phy_cck(dev
,0x2f,0x06);
1216 write_phy_cck(dev
,0x01,0x46);
1219 write_nic_byte(dev
, CCK_TXAGC
, 0x10);
1220 write_nic_byte(dev
, OFDM_TXAGC
, 0x1B);
1221 write_nic_byte(dev
, ANTSEL
, 0x03);
1225 //=============================================================================
1227 //=============================================================================
1229 // PlatformIOWrite4Byte( dev, PhyAddr, 0x00001280); // Annie, 2006-05-05
1230 write_phy_ofdm(dev
, 0x00, 0x12);
1231 //WriteBBPortUchar(dev, 0x00001280);
1233 for (i
=0; i
<128; i
++)
1235 //DbgPrint("AGC - [%x+1] = 0x%x\n", i, ZEBRA_AGC[i+1]);
1237 data
= ZEBRA_AGC
[i
+1];
1239 data
= data
| 0x0000008F;
1241 addr
= i
+ 0x80; //enable writing AGC table
1243 addr
= addr
| 0x0000008E;
1245 WriteBBPortUchar(dev
, data
);
1246 WriteBBPortUchar(dev
, addr
);
1247 WriteBBPortUchar(dev
, 0x0000008E);
1250 PlatformIOWrite4Byte( dev
, PhyAddr
, 0x00001080); // Annie, 2006-05-05
1251 //WriteBBPortUchar(dev, 0x00001080);
1253 //=============================================================================
1255 //=============================================================================
1257 //=============================================================================
1262 u4bRegValue
=OFDM_CONFIG
[i
];
1264 //DbgPrint("OFDM - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
1266 WriteBBPortUchar(dev
,
1268 (u4bRegOffset
& 0x7f) |
1269 ((u4bRegValue
& 0xff) << 8)));
1272 //=============================================================================
1273 //by amy for antenna
1274 //=============================================================================
1276 // Config Sw/Hw Combinational Antenna Diversity. Added by Roger, 2008.02.26.
1277 SetAntennaConfig87SE(dev
, priv
->bDefaultAntenna1
, priv
->bSwAntennaDiverity
);
1279 //by amy for antenna
1285 struct net_device
*dev
1288 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1289 //unsigned char* IGTable;
1290 //u8 DIG_CurrentInitialGain = 4;
1291 //unsigned char u1Tmp;
1294 if(priv
->eRFPowerState
!= eRfOn
)
1296 //Don't access BB/RF under disable PLL situation.
1297 //RT_TRACE(COMP_DIG, DBG_LOUD, ("UpdateInitialGain - pHalData->eRFPowerState!=eRfOn\n"));
1298 // Back to the original state
1299 priv
->InitialGain
= priv
->InitialGainBackUp
;
1303 switch(priv
->rf_chip
)
1306 // Dynamic set initial gain, follow 87B
1307 switch(priv
->InitialGain
)
1310 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm \n");
1311 write_phy_ofdm(dev
, 0x17, 0x26); mdelay(1);
1312 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1313 write_phy_ofdm(dev
, 0x05, 0xfa); mdelay(1);
1317 //DMESG("RTL8187 + 8225 Initial Gain State 2: -82 dBm \n");
1318 write_phy_ofdm(dev
, 0x17, 0x36); mdelay(1);
1319 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1320 write_phy_ofdm(dev
, 0x05, 0xfa); mdelay(1);
1324 //DMESG("RTL8187 + 8225 Initial Gain State 3: -82 dBm \n");
1325 write_phy_ofdm(dev
, 0x17, 0x36); mdelay(1);
1326 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1327 write_phy_ofdm(dev
, 0x05, 0xfb); mdelay(1);
1331 //DMESG("RTL8187 + 8225 Initial Gain State 4: -78 dBm \n");
1332 write_phy_ofdm(dev
, 0x17, 0x46); mdelay(1);
1333 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1334 write_phy_ofdm(dev
, 0x05, 0xfb); mdelay(1);
1338 //DMESG("RTL8187 + 8225 Initial Gain State 5: -74 dBm \n");
1339 write_phy_ofdm(dev
, 0x17, 0x46); mdelay(1);
1340 write_phy_ofdm(dev
, 0x24, 0x96); mdelay(1);
1341 write_phy_ofdm(dev
, 0x05, 0xfb); mdelay(1);
1345 //DMESG ("RTL8187 + 8225 Initial Gain State 6: -70 dBm \n");
1346 write_phy_ofdm(dev
, 0x17, 0x56); mdelay(1);
1347 write_phy_ofdm(dev
, 0x24, 0x96); mdelay(1);
1348 write_phy_ofdm(dev
, 0x05, 0xfc); mdelay(1);
1352 //DMESG("RTL8187 + 8225 Initial Gain State 7: -66 dBm \n");
1353 write_phy_ofdm(dev
, 0x17, 0x56); mdelay(1);
1354 write_phy_ofdm(dev
, 0x24, 0xa6); mdelay(1);
1355 write_phy_ofdm(dev
, 0x05, 0xfc); mdelay(1);
1359 //DMESG("RTL8187 + 8225 Initial Gain State 8:\n");
1360 write_phy_ofdm(dev
, 0x17, 0x66); mdelay(1);
1361 write_phy_ofdm(dev
, 0x24, 0xb6); mdelay(1);
1362 write_phy_ofdm(dev
, 0x05, 0xfc); mdelay(1);
1367 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm (default)\n");
1368 write_phy_ofdm(dev
, 0x17, 0x26); mdelay(1);
1369 write_phy_ofdm(dev
, 0x24, 0x86); mdelay(1);
1370 write_phy_ofdm(dev
, 0x05, 0xfa); mdelay(1);
1377 DMESG("UpdateInitialGain(): unknown RFChipID: %#X\n", priv
->rf_chip
);
1383 // Tx Power tracking mechanism routine on 87SE.
1384 // Created by Roger, 2007.12.11.
1387 InitTxPwrTracking87SE(
1388 struct net_device
*dev
1391 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1394 u4bRfReg
= RF_ReadReg(dev
, 0x02);
1396 // Enable Thermal meter indication.
1397 //printk("InitTxPwrTracking87SE(): Enable thermal meter indication, Write RF[0x02] = %#x", u4bRfReg|PWR_METER_EN);
1398 RF_WriteReg(dev
, 0x02, u4bRfReg
|PWR_METER_EN
); mdelay(1);
1403 struct net_device
*dev
1406 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1407 write_nic_dword(dev
, RCR
, priv
->ReceiveConfig
);
1408 priv
->RFProgType
= read_nic_byte(dev
, CONFIG4
) & 0x03;
1410 switch(priv
->rf_chip
)
1414 ZEBRA_Config_85BASIC_HardCode( dev
);
1418 // Set default initial gain state to 4, approved by SD3 DZ, by Bruce, 2007-06-06.
1419 if(priv
->bDigMechanism
)
1421 if(priv
->InitialGain
== 0)
1422 priv
->InitialGain
= 4;
1423 //printk("PhyConfig8185(): DIG is enabled, set default initial gain index to %d\n", priv->InitialGain);
1427 // Enable thermal meter indication to implement TxPower tracking on 87SE.
1428 // We initialize thermal meter here to avoid unsuccessful configuration.
1429 // Added by Roger, 2007.12.11.
1431 if(priv
->bTxPowerTrack
)
1432 InitTxPwrTracking87SE(dev
);
1435 priv
->InitialGainBackUp
= priv
->InitialGain
;
1436 UpdateInitialGain(dev
);
1446 struct net_device
*dev
1449 //RTL8185_TODO: Determine Retrylimit, TxAGC, AutoRateFallback control.
1450 // u8 bUNIVERSAL_CONTROL_RL = 1;
1451 u8 bUNIVERSAL_CONTROL_RL
= 0;
1453 u8 bUNIVERSAL_CONTROL_AGC
= 1;
1454 u8 bUNIVERSAL_CONTROL_ANT
= 1;
1455 u8 bAUTO_RATE_FALLBACK_CTL
= 1;
1457 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1458 //struct ieee80211_device *ieee = priv->ieee80211;
1459 //if(IS_WIRELESS_MODE_A(dev) || IS_WIRELESS_MODE_G(dev))
1460 //{by amy 080312 if((ieee->mode == IEEE_G)||(ieee->mode == IEEE_A))
1462 // write_nic_word(dev, BRSR, 0xffff);
1466 // write_nic_word(dev, BRSR, 0x000f);
1469 write_nic_word(dev
, BRSR
, 0x0fff);
1471 val8
= read_nic_byte(dev
, CW_CONF
);
1473 if(bUNIVERSAL_CONTROL_RL
)
1478 write_nic_byte(dev
, CW_CONF
, val8
);
1481 val8
= read_nic_byte(dev
, TXAGC_CTL
);
1482 if(bUNIVERSAL_CONTROL_AGC
)
1484 write_nic_byte(dev
, CCK_TXAGC
, 128);
1485 write_nic_byte(dev
, OFDM_TXAGC
, 128);
1490 val8
= val8
| 0x01 ;
1494 write_nic_byte(dev
, TXAGC_CTL
, val8
);
1496 // Tx Antenna including Feedback control
1497 val8
= read_nic_byte(dev
, TXAGC_CTL
);
1499 if(bUNIVERSAL_CONTROL_ANT
)
1501 write_nic_byte(dev
, ANTSEL
, 0x00);
1506 val8
= val8
& (val8
|0x02); //xiong-2006-11-15
1509 write_nic_byte(dev
, TXAGC_CTL
, val8
);
1511 // Auto Rate fallback control
1512 val8
= read_nic_byte(dev
, RATE_FALLBACK
);
1514 if( bAUTO_RATE_FALLBACK_CTL
)
1516 val8
|= RATE_FALLBACK_CTL_ENABLE
| RATE_FALLBACK_CTL_AUTO_STEP1
;
1518 // <RJ_TODO_8185B> We shall set up the ARFR according to user's setting.
1519 //write_nic_word(dev, ARFR, 0x0fff); // set 1M ~ 54M
1521 // Aadded by Roger, 2007.11.15.
1522 PlatformIOWrite2Byte(dev
, ARFR
, 0x0fff); //set 1M ~ 54Mbps.
1528 write_nic_byte(dev
, RATE_FALLBACK
, val8
);
1534 MacConfig_85BASIC_HardCode(
1535 struct net_device
*dev
)
1537 //============================================================================
1539 //============================================================================
1542 u32 u4bRegOffset
, u4bRegValue
,u4bPageIndex
= 0;
1545 nLinesRead
=sizeof(MAC_REG_TABLE
)/2;
1547 for(i
= 0; i
< nLinesRead
; i
++) //nLinesRead=101
1549 u4bRegOffset
=MAC_REG_TABLE
[i
][0];
1550 u4bRegValue
=MAC_REG_TABLE
[i
][1];
1552 if(u4bRegOffset
== 0x5e)
1554 u4bPageIndex
= u4bRegValue
;
1558 u4bRegOffset
|= (u4bPageIndex
<< 8);
1560 //DbgPrint("MAC - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
1561 write_nic_byte(dev
, u4bRegOffset
, (u8
)u4bRegValue
);
1563 //============================================================================
1570 struct net_device
*dev
)
1574 MacConfig_85BASIC_HardCode(dev
);
1576 //============================================================================
1578 // Follow TID_AC_MAP of WMac.
1579 write_nic_word(dev
, TID_AC_MAP
, 0xfa50);
1581 // Interrupt Migration, Jong suggested we use set 0x0000 first, 2005.12.14, by rcnjko.
1582 write_nic_word(dev
, IntMig
, 0x0000);
1584 // Prevent TPC to cause CRC error. Added by Annie, 2006-06-10.
1585 PlatformIOWrite4Byte(dev
, 0x1F0, 0x00000000);
1586 PlatformIOWrite4Byte(dev
, 0x1F4, 0x00000000);
1587 PlatformIOWrite1Byte(dev
, 0x1F8, 0x00);
1589 // Asked for by SD3 CM Lin, 2006.06.27, by rcnjko.
1590 //PlatformIOWrite4Byte(dev, RFTiming, 0x00004001);
1592 // power save parameter based on "87SE power save parameters 20071127.doc", as follow.
1594 //Enable DA10 TX power saving
1595 u1DA
= read_nic_byte(dev
, PHYPR
);
1596 write_nic_byte(dev
, PHYPR
, (u1DA
| BIT2
) );
1599 write_nic_word(dev
, 0x360, 0x1000);
1600 write_nic_word(dev
, 0x362, 0x1000);
1603 write_nic_word(dev
, 0x370, 0x0560);
1604 write_nic_word(dev
, 0x372, 0x0560);
1605 write_nic_word(dev
, 0x374, 0x0DA4);
1606 write_nic_word(dev
, 0x376, 0x0DA4);
1607 write_nic_word(dev
, 0x378, 0x0560);
1608 write_nic_word(dev
, 0x37A, 0x0560);
1609 write_nic_word(dev
, 0x37C, 0x00EC);
1610 // write_nic_word(dev, 0x37E, 0x00FE);//-edward
1611 write_nic_word(dev
, 0x37E, 0x00EC);//+edward
1612 write_nic_byte(dev
, 0x24E,0x01);
1621 GetSupportedWirelessMode8185(
1622 struct net_device
*dev
1625 u8 btSupportedWirelessMode
= 0;
1626 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1628 switch(priv
->rf_chip
)
1632 btSupportedWirelessMode
= (WIRELESS_MODE_B
| WIRELESS_MODE_G
);
1635 btSupportedWirelessMode
= WIRELESS_MODE_B
;
1639 return btSupportedWirelessMode
;
1643 ActUpdateChannelAccessSetting(
1644 struct net_device
*dev
,
1645 WIRELESS_MODE WirelessMode
,
1646 PCHANNEL_ACCESS_SETTING ChnlAccessSetting
1649 struct r8180_priv
*priv
= ieee80211_priv(dev
);
1650 struct ieee80211_device
*ieee
= priv
->ieee80211
;
1653 //PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
1654 u8 bFollowLegacySetting
= 0;
1659 // TODO: We still don't know how to set up these registers, just follow WMAC to
1660 // verify 8185B FPAG.
1663 // Jong said CWmin/CWmax register are not functional in 8185B,
1664 // so we shall fill channel access realted register into AC parameter registers,
1667 ChnlAccessSetting
->SIFS_Timer
= 0x22; // Suggested by Jong, 2005.12.08.
1668 ChnlAccessSetting
->DIFS_Timer
= 0x1C; // 2006.06.02, by rcnjko.
1669 ChnlAccessSetting
->SlotTimeTimer
= 9; // 2006.06.02, by rcnjko.
1670 ChnlAccessSetting
->EIFS_Timer
= 0x5B; // Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
1671 ChnlAccessSetting
->CWminIndex
= 3; // 2006.06.02, by rcnjko.
1672 ChnlAccessSetting
->CWmaxIndex
= 7; // 2006.06.02, by rcnjko.
1674 write_nic_byte(dev
, SIFS
, ChnlAccessSetting
->SIFS_Timer
);
1675 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SLOT_TIME, &ChnlAccessSetting->SlotTimeTimer ); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
1676 write_nic_byte(dev
, SLOT
, ChnlAccessSetting
->SlotTimeTimer
); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
1678 u1bAIFS
= aSifsTime
+ (2 * ChnlAccessSetting
->SlotTimeTimer
);
1680 //write_nic_byte(dev, AC_VO_PARAM, u1bAIFS);
1681 //write_nic_byte(dev, AC_VI_PARAM, u1bAIFS);
1682 //write_nic_byte(dev, AC_BE_PARAM, u1bAIFS);
1683 //write_nic_byte(dev, AC_BK_PARAM, u1bAIFS);
1685 write_nic_byte(dev
, EIFS
, ChnlAccessSetting
->EIFS_Timer
);
1687 write_nic_byte(dev
, AckTimeOutReg
, 0x5B); // <RJ_EXPR_QOS> Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
1690 // <RJ_TODO_NOW_8185B> Update ECWmin/ECWmax, AIFS, TXOP Limit of each AC to the value defined by SPEC.
1691 if( pStaQos
->CurrentQosMode
> QOS_DISABLE
)
1693 if(pStaQos
->QBssWirelessMode
== WirelessMode
)
1695 // Follow AC Parameters of the QBSS.
1696 for(eACI
= 0; eACI
< AC_MAX
; eACI
++)
1698 Adapter
->HalFunc
.SetHwRegHandler(Adapter
, HW_VAR_AC_PARAM
, (pu1Byte
)(&(pStaQos
->WMMParamEle
.AcParam
[eACI
])) );
1703 // Follow Default WMM AC Parameters.
1704 bFollowLegacySetting
= 1;
1710 bFollowLegacySetting
= 1;
1714 // this setting is copied from rtl8187B. xiong-2006-11-13
1715 if(bFollowLegacySetting
)
1720 // Follow 802.11 seeting to AC parameter, all AC shall use the same parameter.
1721 // 2005.12.01, by rcnjko.
1723 AcParam
.longData
= 0;
1724 AcParam
.f
.AciAifsn
.f
.AIFSN
= 2; // Follow 802.11 DIFS.
1725 AcParam
.f
.AciAifsn
.f
.ACM
= 0;
1726 AcParam
.f
.Ecw
.f
.ECWmin
= ChnlAccessSetting
->CWminIndex
; // Follow 802.11 CWmin.
1727 AcParam
.f
.Ecw
.f
.ECWmax
= ChnlAccessSetting
->CWmaxIndex
; // Follow 802.11 CWmax.
1728 AcParam
.f
.TXOPLimit
= 0;
1730 //lzm reserved 080826
1732 // For turbo mode setting. port from 87B by Isaiah 2008-08-01
1733 if( ieee
->current_network
.Turbo_Enable
== 1 )
1734 AcParam
.f
.TXOPLimit
= 0x01FF;
1735 // For 87SE with Intel 4965 Ad-Hoc mode have poor throughput (19MB)
1736 if (ieee
->iw_mode
== IW_MODE_ADHOC
)
1737 AcParam
.f
.TXOPLimit
= 0x0020;
1740 for(eACI
= 0; eACI
< AC_MAX
; eACI
++)
1742 AcParam
.f
.AciAifsn
.f
.ACI
= (u8
)eACI
;
1744 PAC_PARAM pAcParam
= (PAC_PARAM
)(&AcParam
);
1749 // Retrive paramters to udpate.
1750 eACI
= pAcParam
->f
.AciAifsn
.f
.ACI
;
1751 u1bAIFS
= pAcParam
->f
.AciAifsn
.f
.AIFSN
* ChnlAccessSetting
->SlotTimeTimer
+ aSifsTime
;
1752 u4bAcParam
= ( (((u32
)(pAcParam
->f
.TXOPLimit
)) << AC_PARAM_TXOP_LIMIT_OFFSET
) |
1753 (((u32
)(pAcParam
->f
.Ecw
.f
.ECWmax
)) << AC_PARAM_ECW_MAX_OFFSET
) |
1754 (((u32
)(pAcParam
->f
.Ecw
.f
.ECWmin
)) << AC_PARAM_ECW_MIN_OFFSET
) |
1755 (((u32
)u1bAIFS
) << AC_PARAM_AIFS_OFFSET
));
1760 //write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
1764 //write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
1768 //write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
1772 //write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
1776 DMESGW( "SetHwReg8185(): invalid ACI: %d !\n", eACI
);
1781 // If it is set, immediately set ACM control bit to downgrading AC for passing WMM testplan. Annie, 2005-12-13.
1782 //write_nic_byte(dev, ACM_CONTROL, pAcParam->f.AciAifsn);
1784 PACI_AIFSN pAciAifsn
= (PACI_AIFSN
)(&pAcParam
->f
.AciAifsn
);
1785 AC_CODING eACI
= pAciAifsn
->f
.ACI
;
1788 //for 8187B AsynIORead issue
1790 u8 AcmCtrl
= pHalData
->AcmControl
;
1794 if( pAciAifsn
->f
.ACM
)
1799 AcmCtrl
|= (BEQ_ACM_EN
|BEQ_ACM_CTL
|ACM_HW_EN
); // or 0x21
1803 AcmCtrl
|= (VIQ_ACM_EN
|VIQ_ACM_CTL
|ACM_HW_EN
); // or 0x42
1807 AcmCtrl
|= (VOQ_ACM_EN
|VOQ_ACM_CTL
|ACM_HW_EN
); // or 0x84
1811 DMESGW("SetHwReg8185(): [HW_VAR_ACM_CTRL] ACM set failed: eACI is %d\n", eACI
);
1820 AcmCtrl
&= ( (~BEQ_ACM_EN
) & (~BEQ_ACM_CTL
) & (~ACM_HW_EN
) ); // and 0xDE
1824 AcmCtrl
&= ( (~VIQ_ACM_EN
) & (~VIQ_ACM_CTL
) & (~ACM_HW_EN
) ); // and 0xBD
1828 AcmCtrl
&= ( (~VOQ_ACM_EN
) & (~VOQ_ACM_CTL
) & (~ACM_HW_EN
) ); // and 0x7B
1836 //printk(KERN_WARNING "SetHwReg8185(): [HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl);
1839 pHalData
->AcmControl
= AcmCtrl
;
1841 //write_nic_byte(dev, ACM_CONTROL, AcmCtrl);
1842 write_nic_byte(dev
, ACM_CONTROL
, 0);
1852 ActSetWirelessMode8185(
1853 struct net_device
*dev
,
1857 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1858 struct ieee80211_device
*ieee
= priv
->ieee80211
;
1859 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
1860 u8 btSupportedWirelessMode
= GetSupportedWirelessMode8185(dev
);
1862 if( (btWirelessMode
& btSupportedWirelessMode
) == 0 )
1863 { // Don't switch to unsupported wireless mode, 2006.02.15, by rcnjko.
1864 DMESGW("ActSetWirelessMode8185(): WirelessMode(%d) is not supported (%d)!\n",
1865 btWirelessMode
, btSupportedWirelessMode
);
1869 // 1. Assign wireless mode to swtich if necessary.
1870 if (btWirelessMode
== WIRELESS_MODE_AUTO
)
1872 if((btSupportedWirelessMode
& WIRELESS_MODE_A
))
1874 btWirelessMode
= WIRELESS_MODE_A
;
1876 else if((btSupportedWirelessMode
& WIRELESS_MODE_G
))
1878 btWirelessMode
= WIRELESS_MODE_G
;
1880 else if((btSupportedWirelessMode
& WIRELESS_MODE_B
))
1882 btWirelessMode
= WIRELESS_MODE_B
;
1886 DMESGW("ActSetWirelessMode8185(): No valid wireless mode supported, btSupportedWirelessMode(%x)!!!\n",
1887 btSupportedWirelessMode
);
1888 btWirelessMode
= WIRELESS_MODE_B
;
1893 // 2. Swtich band: RF or BB specific actions,
1894 // for example, refresh tables in omc8255, or change initial gain if necessary.
1895 switch(priv
->rf_chip
)
1900 // Nothing to do for Zebra to switch band.
1901 // Update current wireless mode if we swtich to specified band successfully.
1902 ieee
->mode
= (WIRELESS_MODE
)btWirelessMode
;
1907 DMESGW("ActSetWirelessMode8185(): unsupported RF: 0x%X !!!\n", priv
->rf_chip
);
1911 // 3. Change related setting.
1912 if( ieee
->mode
== WIRELESS_MODE_A
){
1913 DMESG("WIRELESS_MODE_A\n");
1915 else if( ieee
->mode
== WIRELESS_MODE_B
){
1916 DMESG("WIRELESS_MODE_B\n");
1918 else if( ieee
->mode
== WIRELESS_MODE_G
){
1919 DMESG("WIRELESS_MODE_G\n");
1922 ActUpdateChannelAccessSetting( dev
, ieee
->mode
, &priv
->ChannelAccessSetting
);
1925 void rtl8185b_irq_enable(struct net_device
*dev
)
1927 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1929 priv
->irq_enabled
= 1;
1930 write_nic_dword(dev
, IMR
, priv
->IntrMask
);
1932 //by amy for power save
1934 DrvIFIndicateDisassociation(
1935 struct net_device
*dev
,
1939 //printk("==> DrvIFIndicateDisassociation()\n");
1941 // nothing is needed after disassociation request.
1943 //printk("<== DrvIFIndicateDisassociation()\n");
1947 struct net_device
*dev
1950 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1953 //printk("XXXXXXXXXX MgntDisconnect IBSS\n");
1955 DrvIFIndicateDisassociation(dev
, unspec_reason
);
1957 // PlatformZeroMemory( pMgntInfo->Bssid, 6 );
1958 for(i
=0;i
<6;i
++) priv
->ieee80211
->current_network
.bssid
[i
] = 0x55;
1960 priv
->ieee80211
->state
= IEEE80211_NOLINK
;
1964 // Vista add a Adhoc profile, HW radio off untill OID_DOT11_RESET_REQUEST
1965 // Driver would set MSR=NO_LINK, then HW Radio ON, MgntQueue Stuck.
1966 // Because Bcn DMA isn't complete, mgnt queue would stuck until Bcn packet send.
1968 // Disable Beacon Queue Own bit, suggested by jong
1969 // Adapter->HalFunc.SetTxDescOWNHandler(Adapter, BEACON_QUEUE, 0, 0);
1970 ieee80211_stop_send_beacons(priv
->ieee80211
);
1972 priv
->ieee80211
->link_change(dev
);
1973 notify_wx_assoc_event(priv
->ieee80211
);
1975 // Stop SW Beacon.Use hw beacon so do not need to do so.by amy
1977 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE );
1981 MlmeDisassociateRequest(
1982 struct net_device
*dev
,
1987 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
1990 SendDisassociation(priv
->ieee80211
, asSta
, asRsn
);
1992 if( memcmp(priv
->ieee80211
->current_network
.bssid
, asSta
, 6 ) == 0 ){
1993 //ShuChen TODO: change media status.
1994 //ShuChen TODO: What to do when disassociate.
1995 DrvIFIndicateDisassociation(dev
, unspec_reason
);
1998 // pMgntInfo->AsocTimestamp = 0;
1999 for(i
=0;i
<6;i
++) priv
->ieee80211
->current_network
.bssid
[i
] = 0x22;
2000 // pMgntInfo->mBrates.Length = 0;
2001 // Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
2003 ieee80211_disassociate(priv
->ieee80211
);
2012 struct net_device
*dev
,
2016 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2019 // Commented out by rcnjko, 2005.01.27:
2020 // I move SecClearAllKeys() to MgntActSet_802_11_DISASSOCIATE().
2022 // //2004/09/15, kcwu, the key should be cleared, or the new handshaking will not success
2023 // SecClearAllKeys(Adapter);
2025 // In WPA WPA2 need to Clear all key ... because new key will set after new handshaking.
2027 if( pMgntInfo
->SecurityInfo
.AuthMode
> RT_802_11AuthModeAutoSwitch
||
2028 (pMgntInfo
->bAPSuportCCKM
&& pMgntInfo
->bCCX8021xenable
) ) // In CCKM mode will Clear key
2030 SecClearAllKeys(Adapter
);
2031 RT_TRACE(COMP_SEC
, DBG_LOUD
,("======>CCKM clear key..."))
2034 // 2004.10.11, by rcnjko.
2035 //MlmeDisassociateRequest( Adapter, pMgntInfo->Bssid, disas_lv_ss );
2036 MlmeDisassociateRequest( dev
, priv
->ieee80211
->current_network
.bssid
, asRsn
);
2038 priv
->ieee80211
->state
= IEEE80211_NOLINK
;
2039 // pMgntInfo->AsocTimestamp = 0;
2043 struct net_device
*dev
,
2047 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2049 // Schedule an workitem to wake up for ps mode, 070109, by rcnjko.
2052 if(pMgntInfo
->mPss
!= eAwake
)
2055 // Using AwkaeTimer to prevent mismatch ps state.
2056 // In the timer the state will be changed according to the RF is being awoke or not. By Bruce, 2007-10-31.
2058 // PlatformScheduleWorkItem( &(pMgntInfo->AwakeWorkItem) );
2059 PlatformSetTimer( Adapter
, &(pMgntInfo
->AwakeTimer
), 0 );
2063 // Indication of disassociation event.
2064 //DrvIFIndicateDisassociation(Adapter, asRsn);
2065 if(IS_DOT11D_ENABLE(priv
->ieee80211
))
2066 Dot11d_Reset(priv
->ieee80211
);
2067 // In adhoc mode, update beacon frame.
2068 if( priv
->ieee80211
->state
== IEEE80211_LINKED
)
2070 if( priv
->ieee80211
->iw_mode
== IW_MODE_ADHOC
)
2072 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectIBSS\n"));
2073 //printk("MgntDisconnect() ===> MgntDisconnectIBSS\n");
2074 MgntDisconnectIBSS(dev
);
2076 if( priv
->ieee80211
->iw_mode
== IW_MODE_INFRA
)
2078 // We clear key here instead of MgntDisconnectAP() because that
2079 // MgntActSet_802_11_DISASSOCIATE() is an interface called by OS,
2080 // e.g. OID_802_11_DISASSOCIATE in Windows while as MgntDisconnectAP() is
2081 // used to handle disassociation related things to AP, e.g. send Disassoc
2082 // frame to AP. 2005.01.27, by rcnjko.
2083 // SecClearAllKeys(Adapter);
2085 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectAP\n"));
2086 //printk("MgntDisconnect() ===> MgntDisconnectAP\n");
2087 MgntDisconnectAP(dev
, asRsn
);
2090 // Inidicate Disconnect, 2005.02.23, by rcnjko.
2091 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE);
2098 // Chang RF Power State.
2099 // Note that, only MgntActSet_RF_State() is allowed to set HW_VAR_RF_STATE.
2106 struct net_device
*dev
,
2107 RT_RF_POWER_STATE eRFPowerState
2110 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2111 bool bResult
= false;
2113 // printk("---------> SetRFPowerState(): eRFPowerState(%d)\n", eRFPowerState);
2114 if(eRFPowerState
== priv
->eRFPowerState
)
2116 // printk("<--------- SetRFPowerState(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState);
2120 switch(priv
->rf_chip
)
2124 bResult
= SetZebraRFPowerState8185(dev
, eRFPowerState
);
2128 printk("SetRFPowerState8185(): unknown RFChipID: 0x%X!!!\n", priv
->rf_chip
);
2131 // printk("<--------- SetRFPowerState(): bResult(%d)\n", bResult);
2136 HalEnableRx8185Dummy(
2137 struct net_device
*dev
2142 HalDisableRx8185Dummy(
2143 struct net_device
*dev
2149 MgntActSet_RF_State(
2150 struct net_device
*dev
,
2151 RT_RF_POWER_STATE StateToSet
,
2155 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2156 bool bActionAllowed
= false;
2157 bool bConnectBySSID
= false;
2158 RT_RF_POWER_STATE rtState
;
2159 u16 RFWaitCounter
= 0;
2161 // printk("===>MgntActSet_RF_State(): StateToSet(%d), ChangeSource(0x%x)\n",StateToSet, ChangeSource);
2163 // Prevent the race condition of RF state change. By Bruce, 2007-11-28.
2164 // Only one thread can change the RF state at one time, and others should wait to be executed.
2169 // down(&priv->rf_state);
2170 spin_lock_irqsave(&priv
->rf_ps_lock
,flag
);
2171 if(priv
->RFChangeInProgress
)
2173 // printk("====================>haha111111111\n");
2174 // up(&priv->rf_state);
2175 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): RF Change in progress! Wait to set..StateToSet(%d).\n", StateToSet));
2176 spin_unlock_irqrestore(&priv
->rf_ps_lock
,flag
);
2177 // Set RF after the previous action is done.
2178 while(priv
->RFChangeInProgress
)
2181 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Wait 1 ms (%d times)...\n", RFWaitCounter));
2182 udelay(1000); // 1 ms
2184 // Wait too long, return FALSE to avoid to be stuck here.
2185 if(RFWaitCounter
> 1000) // 1sec
2187 // RT_ASSERT(FALSE, ("MgntActSet_RF_State(): Wait too logn to set RF\n"));
2188 printk("MgntActSet_RF_State(): Wait too long to set RF\n");
2189 // TODO: Reset RF state?
2196 // printk("========================>haha2\n");
2197 priv
->RFChangeInProgress
= true;
2198 // up(&priv->rf_state);
2199 spin_unlock_irqrestore(&priv
->rf_ps_lock
,flag
);
2204 rtState
= priv
->eRFPowerState
;
2211 // Turn On RF no matter the IPS setting because we need to update the RF state to Ndis under Vista, or
2212 // the Windows does not allow the driver to perform site survey any more. By Bruce, 2007-10-02.
2214 priv
->RfOffReason
&= (~ChangeSource
);
2216 if(! priv
->RfOffReason
)
2218 priv
->RfOffReason
= 0;
2219 bActionAllowed
= true;
2221 if(rtState
== eRfOff
&& ChangeSource
>=RF_CHANGE_BY_HW
&& !priv
->bInHctTest
)
2223 bConnectBySSID
= true;
2227 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State - eRfon reject pMgntInfo->RfOffReason= 0x%x, ChangeSource=0x%X\n", pMgntInfo->RfOffReason, ChangeSource));
2232 // 070125, rcnjko: we always keep connected in AP mode.
2234 if (priv
->RfOffReason
> RF_CHANGE_BY_IPS
)
2238 // Disconnect to current BSS when radio off. Asked by QuanTa.
2242 // Calling MgntDisconnect() instead of MgntActSet_802_11_DISASSOCIATE(),
2243 // because we do NOT need to set ssid to dummy ones.
2244 // Revised by Roger, 2007.12.04.
2246 MgntDisconnect( dev
, disas_lv_ss
);
2248 // Clear content of bssDesc[] and bssDesc4Query[] to avoid reporting old bss to UI.
2249 // 2007.05.28, by shien chang.
2250 // PlatformZeroMemory( pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2251 // pMgntInfo->NumBssDesc = 0;
2252 // PlatformZeroMemory( pMgntInfo->bssDesc4Query, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2253 // pMgntInfo->NumBssDesc4Query = 0;
2258 priv
->RfOffReason
|= ChangeSource
;
2259 bActionAllowed
= true;
2263 priv
->RfOffReason
|= ChangeSource
;
2264 bActionAllowed
= true;
2273 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, pMgntInfo->RfOffReason));
2274 // Config HW to the specified mode.
2275 // printk("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, priv->RfOffReason);
2276 SetRFPowerState(dev
, StateToSet
);
2279 if(StateToSet
== eRfOn
)
2281 HalEnableRx8185Dummy(dev
);
2284 // by amy not supported
2285 // MgntActSet_802_11_SSID(Adapter, Adapter->MgntInfo.Ssid.Octet, Adapter->MgntInfo.Ssid.Length, TRUE );
2289 else if(StateToSet
== eRfOff
)
2291 HalDisableRx8185Dummy(dev
);
2296 // printk("MgntActSet_RF_State(): Action is rejected.... StateToSet(%d), ChangeSource(%#X), RfOffReason(%#X)\n", StateToSet, ChangeSource, priv->RfOffReason);
2299 // Release RF spinlock
2300 // down(&priv->rf_state);
2301 spin_lock_irqsave(&priv
->rf_ps_lock
,flag
);
2302 priv
->RFChangeInProgress
= false;
2303 // up(&priv->rf_state);
2304 spin_unlock_irqrestore(&priv
->rf_ps_lock
,flag
);
2305 // printk("<===MgntActSet_RF_State()\n");
2306 return bActionAllowed
;
2310 struct net_device
*dev
2313 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2317 // This flag "bSwRfProcessing", indicates the status of IPS procedure, should be set if the IPS workitem
2318 // is really scheduled.
2319 // The old code, sets this flag before scheduling the IPS workitem and however, at the same time the
2320 // previous IPS workitem did not end yet, fails to schedule the current workitem. Thus, bSwRfProcessing
2321 // blocks the IPS procedure of switching RF.
2322 // By Bruce, 2007-12-25.
2324 priv
->bSwRfProcessing
= true;
2326 MgntActSet_RF_State(dev
, priv
->eInactivePowerState
, RF_CHANGE_BY_IPS
);
2329 // To solve CAM values miss in RF OFF, rewrite CAM values after RF ON. By Bruce, 2007-09-20.
2332 priv
->bSwRfProcessing
= false;
2337 // Enter the inactive power save mode. RF will be off
2338 // 2007.08.17, by shien chang.
2342 struct net_device
*dev
2345 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2346 RT_RF_POWER_STATE rtState
;
2347 //printk("==============================>enter IPS\n");
2348 if (priv
->bInactivePs
)
2350 rtState
= priv
->eRFPowerState
;
2353 // Added by Bruce, 2007-12-25.
2354 // Do not enter IPS in the following conditions:
2355 // (1) RF is already OFF or Sleep
2356 // (2) bSwRfProcessing (indicates the IPS is still under going)
2357 // (3) Connectted (only disconnected can trigger IPS)
2358 // (4) IBSS (send Beacon)
2359 // (5) AP mode (send Beacon)
2361 if (rtState
== eRfOn
&& !priv
->bSwRfProcessing
2362 && (priv
->ieee80211
->state
!= IEEE80211_LINKED
))
2364 // printk("IPSEnter(): Turn off RF.\n");
2365 priv
->eInactivePowerState
= eRfOff
;
2366 InactivePowerSave(dev
);
2369 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2373 struct net_device
*dev
2376 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2377 RT_RF_POWER_STATE rtState
;
2378 //printk("===================================>leave IPS\n");
2379 if (priv
->bInactivePs
)
2381 rtState
= priv
->eRFPowerState
;
2382 if ((rtState
== eRfOff
|| rtState
== eRfSleep
) && (!priv
->bSwRfProcessing
) && priv
->RfOffReason
<= RF_CHANGE_BY_IPS
)
2384 // printk("IPSLeave(): Turn on RF.\n");
2385 priv
->eInactivePowerState
= eRfOn
;
2386 InactivePowerSave(dev
);
2389 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2391 //by amy for power save
2392 void rtl8185b_adapter_start(struct net_device
*dev
)
2394 struct r8180_priv
*priv
= ieee80211_priv(dev
);
2395 struct ieee80211_device
*ieee
= priv
->ieee80211
;
2397 u8 SupportedWirelessMode
;
2398 u8 InitWirelessMode
;
2399 u8 bInvalidWirelessMode
= 0;
2407 //rtl8180_rtx_disable(dev);
2409 write_nic_byte(dev
,0x24e, (BIT5
|BIT6
|BIT0
));
2413 priv
->dma_poll_mask
= 0;
2414 priv
->dma_poll_stop_mask
= 0;
2416 //rtl8180_beacon_tx_disable(dev);
2418 HwConfigureRTL8185(dev
);
2420 write_nic_dword(dev
, MAC0
, ((u32
*)dev
->dev_addr
)[0]);
2421 write_nic_word(dev
, MAC4
, ((u32
*)dev
->dev_addr
)[1] & 0xffff );
2423 write_nic_byte(dev
, MSR
, read_nic_byte(dev
, MSR
) & 0xf3); // default network type to 'No Link'
2425 //write_nic_byte(dev, BRSR, 0x0); // Set BRSR= 1M
2427 write_nic_word(dev
, BcnItv
, 100);
2428 write_nic_word(dev
, AtimWnd
, 2);
2430 //PlatformEFIOWrite2Byte(dev, FEMR, 0xFFFF);
2431 PlatformIOWrite2Byte(dev
, FEMR
, 0xFFFF);
2433 write_nic_byte(dev
, WPA_CONFIG
, 0);
2435 MacConfig_85BASIC(dev
);
2437 // Override the RFSW_CTRL (MAC offset 0x272-0x273), 2006.06.07, by rcnjko.
2438 // BT_DEMO_BOARD type
2439 PlatformIOWrite2Byte(dev
, RFSW_CTRL
, 0x569a);
2441 //#ifdef CONFIG_RTL818X_S
2442 // for jong required
2443 // PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2447 //PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2449 //-----------------------------------------------------------------------------
2450 // Set up PHY related.
2451 //-----------------------------------------------------------------------------
2452 // Enable Config3.PARAM_En to revise AnaaParm.
2453 write_nic_byte(dev
, CR9346
, 0xc0); // enable config register write
2455 tmpu8
= read_nic_byte(dev
, CONFIG3
);
2456 write_nic_byte(dev
, CONFIG3
, (tmpu8
|CONFIG3_PARM_En
) );
2458 // Turn on Analog power.
2459 // Asked for by William, otherwise, MAC 3-wire can't work, 2006.06.27, by rcnjko.
2460 write_nic_dword(dev
, ANAPARAM2
, ANAPARM2_ASIC_ON
);
2461 write_nic_dword(dev
, ANAPARAM
, ANAPARM_ASIC_ON
);
2463 write_nic_word(dev
, ANAPARAM3
, 0x0010);
2466 write_nic_byte(dev
, CONFIG3
, tmpu8
);
2467 write_nic_byte(dev
, CR9346
, 0x00);
2468 //{by amy 080312 for led
2469 // enable EEM0 and EEM1 in 9346CR
2470 btCR9346
= read_nic_byte(dev
, CR9346
);
2471 write_nic_byte(dev
, CR9346
, (btCR9346
|0xC0) );
2473 // B cut use LED1 to control HW RF on/off
2474 TmpU1b
= read_nic_byte(dev
, CONFIG5
);
2475 TmpU1b
= TmpU1b
& ~BIT3
;
2476 write_nic_byte(dev
,CONFIG5
, TmpU1b
);
2478 // disable EEM0 and EEM1 in 9346CR
2479 btCR9346
&= ~(0xC0);
2480 write_nic_byte(dev
, CR9346
, btCR9346
);
2482 //Enable Led (suggested by Jong)
2483 // B-cut RF Radio on/off 5e[3]=0
2484 btPSR
= read_nic_byte(dev
, PSR
);
2485 write_nic_byte(dev
, PSR
, (btPSR
| BIT3
));
2486 //by amy 080312 for led}
2487 // setup initial timing for RFE.
2488 write_nic_word(dev
, RFPinsOutput
, 0x0480);
2489 SetOutputEnableOfRfPins(dev
);
2490 write_nic_word(dev
, RFPinsSelect
, 0x2488);
2495 // We assume RegWirelessMode has already been initialized before,
2496 // however, we has to validate the wireless mode here and provide a reasonble
2497 // initialized value if necessary. 2005.01.13, by rcnjko.
2498 SupportedWirelessMode
= GetSupportedWirelessMode8185(dev
);
2499 if( (ieee
->mode
!= WIRELESS_MODE_B
) &&
2500 (ieee
->mode
!= WIRELESS_MODE_G
) &&
2501 (ieee
->mode
!= WIRELESS_MODE_A
) &&
2502 (ieee
->mode
!= WIRELESS_MODE_AUTO
))
2503 { // It should be one of B, G, A, or AUTO.
2504 bInvalidWirelessMode
= 1;
2507 { // One of B, G, A, or AUTO.
2508 // Check if the wireless mode is supported by RF.
2509 if( (ieee
->mode
!= WIRELESS_MODE_AUTO
) &&
2510 (ieee
->mode
& SupportedWirelessMode
) == 0 )
2512 bInvalidWirelessMode
= 1;
2516 if(bInvalidWirelessMode
|| ieee
->mode
==WIRELESS_MODE_AUTO
)
2517 { // Auto or other invalid value.
2518 // Assigne a wireless mode to initialize.
2519 if((SupportedWirelessMode
& WIRELESS_MODE_A
))
2521 InitWirelessMode
= WIRELESS_MODE_A
;
2523 else if((SupportedWirelessMode
& WIRELESS_MODE_G
))
2525 InitWirelessMode
= WIRELESS_MODE_G
;
2527 else if((SupportedWirelessMode
& WIRELESS_MODE_B
))
2529 InitWirelessMode
= WIRELESS_MODE_B
;
2533 DMESGW("InitializeAdapter8185(): No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n",
2534 SupportedWirelessMode
);
2535 InitWirelessMode
= WIRELESS_MODE_B
;
2538 // Initialize RegWirelessMode if it is not a valid one.
2539 if(bInvalidWirelessMode
)
2541 ieee
->mode
= (WIRELESS_MODE
)InitWirelessMode
;
2545 { // One of B, G, A.
2546 InitWirelessMode
= ieee
->mode
;
2548 //by amy for power save
2549 // printk("initialize ENABLE_IPS\n");
2550 priv
->eRFPowerState
= eRfOff
;
2551 priv
->RfOffReason
= 0;
2554 // u32 tmp = jiffies;
2555 MgntActSet_RF_State(dev
, eRfOn
, 0);
2557 // printk("rf on cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
2559 // DrvIFIndicateCurrentPhyStatus(priv);
2561 // If inactive power mode is enabled, disable rf while in disconnected state.
2562 // 2007.07.16, by shien chang.
2564 if (priv
->bInactivePs
)
2567 // u32 tmp = jiffies;
2568 MgntActSet_RF_State(dev
,eRfOff
, RF_CHANGE_BY_IPS
);
2570 // printk("rf off cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
2574 //by amy for power save
2576 // Turn off RF if necessary. 2005.08.23, by rcnjko.
2577 // We shall turn off RF after setting CMDR, otherwise,
2578 // RF will be turnned on after we enable MAC Tx/Rx.
2579 if(Adapter
->MgntInfo
.RegRfOff
== TRUE
)
2581 SetRFPowerState8185(Adapter
, RF_OFF
);
2585 SetRFPowerState8185(Adapter
, RF_ON
);
2589 /* //these is equal with above TODO.
2590 write_nic_byte(dev, CR9346, 0xc0); // enable config register write
2591 write_nic_byte(dev, CONFIG3, read_nic_byte(dev, CONFIG3) | CONFIG3_PARM_En);
2592 RF_WriteReg(dev, 0x4, 0x9FF);
2593 write_nic_dword(dev, ANAPARAM2, ANAPARM2_ASIC_ON);
2594 write_nic_dword(dev, ANAPARAM, ANAPARM_ASIC_ON);
2595 write_nic_byte(dev, CONFIG3, (read_nic_byte(dev, CONFIG3)&(~CONFIG3_PARM_En)));
2596 write_nic_byte(dev, CR9346, 0x00);
2599 ActSetWirelessMode8185(dev
, (u8
)(InitWirelessMode
));
2601 //-----------------------------------------------------------------------------
2603 rtl8185b_irq_enable(dev
);
2605 netif_start_queue(dev
);
2610 void rtl8185b_rx_enable(struct net_device
*dev
)
2614 /* for now we accept data, management & ctl frame*/
2615 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2617 if (dev
->flags
& IFF_PROMISC
) DMESG ("NIC in promisc mode");
2619 if(priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
|| \
2620 dev
->flags
& IFF_PROMISC
){
2621 priv
->ReceiveConfig
= priv
->ReceiveConfig
& (~RCR_APM
);
2622 priv
->ReceiveConfig
= priv
->ReceiveConfig
| RCR_AAP
;
2625 /*if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
2626 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
2627 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
2630 if(priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
){
2631 priv
->ReceiveConfig
= priv
->ReceiveConfig
| RCR_ACF
| RCR_APWRMGT
| RCR_AICV
;
2634 if( priv
->crcmon
== 1 && priv
->ieee80211
->iw_mode
== IW_MODE_MONITOR
)
2635 priv
->ReceiveConfig
= priv
->ReceiveConfig
| RCR_ACRC32
;
2637 write_nic_dword(dev
, RCR
, priv
->ReceiveConfig
);
2642 DMESG("rxconf: %x %x",priv
->ReceiveConfig
,read_nic_dword(dev
,RCR
));
2644 cmd
=read_nic_byte(dev
,CMD
);
2645 write_nic_byte(dev
,CMD
,cmd
| (1<<CMD_RX_ENABLE_SHIFT
));
2649 void rtl8185b_tx_enable(struct net_device
*dev
)
2655 struct r8180_priv
*priv
= (struct r8180_priv
*)ieee80211_priv(dev
);
2657 write_nic_dword(dev
, TCR
, priv
->TransmitConfig
);
2658 byte
= read_nic_byte(dev
, MSR
);
2659 byte
|= MSR_LINK_ENEDCA
;
2660 write_nic_byte(dev
, MSR
, byte
);
2665 DMESG("txconf: %x %x",priv
->TransmitConfig
,read_nic_dword(dev
,TCR
));
2668 cmd
=read_nic_byte(dev
,CMD
);
2669 write_nic_byte(dev
,CMD
,cmd
| (1<<CMD_TX_ENABLE_SHIFT
));
2671 //write_nic_dword(dev,TX_CONF,txconf);
2675 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
2676 write_nic_byte(dev, TX_DMA_POLLING, priv->dma_poll_mask);
2677 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);