added 2.6.29.6 aldebaran kernel
[nao-ulib.git] / kernel / 2.6.29.6-aldebaran-rt / drivers / staging / rtl8187se / r8185b_init.c
blob4b885a2319ee94e667d0b4c0aa477a232499065d
1 /*++
2 Copyright (c) Realtek Semiconductor Corp. All rights reserved.
4 Module Name:
5 r8185b_init.c
7 Abstract:
8 Hardware Initialization and Hardware IO for RTL8185B
10 Major Change History:
11 When Who What
12 ---------- --------------- -------------------------------
13 2006-11-15 Xiong Created
15 Notes:
16 This file is ported from RTL8185B Windows driver.
19 --*/
21 /*--------------------------Include File------------------------------------*/
22 #include <linux/spinlock.h>
23 #include "r8180_hw.h"
24 #include "r8180.h"
25 #include "r8180_sa2400.h" /* PHILIPS Radio frontend */
26 #include "r8180_max2820.h" /* MAXIM Radio frontend */
27 #include "r8180_gct.h" /* GCT Radio frontend */
28 #include "r8180_rtl8225.h" /* RTL8225 Radio frontend */
29 #include "r8180_rtl8255.h" /* RTL8255 Radio frontend */
30 #include "r8180_93cx6.h" /* Card EEPROM */
31 #include "r8180_wx.h"
33 #ifdef CONFIG_RTL8180_PM
34 #include "r8180_pm.h"
35 #endif
37 #ifdef ENABLE_DOT11D
38 #include "dot11d.h"
39 #endif
41 #ifdef CONFIG_RTL8185B
43 //#define CONFIG_RTL8180_IO_MAP
45 #define TC_3W_POLL_MAX_TRY_CNT 5
46 #ifdef CONFIG_RTL818X_S
47 static u8 MAC_REG_TABLE[][2]={
48 //PAGA 0:
49 // 0x34(BRSR), 0xBE(RATE_FALLBACK_CTL), 0x1E0(ARFR) would set in HwConfigureRTL8185()
50 // 0x272(RFSW_CTRL), 0x1CE(AESMSK_QC) set in InitializeAdapter8185().
51 // 0x1F0~0x1F8 set in MacConfig_85BASIC()
52 {0x08, 0xae}, {0x0a, 0x72}, {0x5b, 0x42},
53 {0x84, 0x88}, {0x85, 0x24}, {0x88, 0x54}, {0x8b, 0xb8}, {0x8c, 0x03},
54 {0x8d, 0x40}, {0x8e, 0x00}, {0x8f, 0x00}, {0x5b, 0x18}, {0x91, 0x03},
55 {0x94, 0x0F}, {0x95, 0x32},
56 {0x96, 0x00}, {0x97, 0x07}, {0xb4, 0x22}, {0xdb, 0x00},
57 {0xf0, 0x32}, {0xf1, 0x32}, {0xf2, 0x00}, {0xf3, 0x00}, {0xf4, 0x32},
58 {0xf5, 0x43}, {0xf6, 0x00}, {0xf7, 0x00}, {0xf8, 0x46}, {0xf9, 0xa4},
59 {0xfa, 0x00}, {0xfb, 0x00}, {0xfc, 0x96}, {0xfd, 0xa4}, {0xfe, 0x00},
60 {0xff, 0x00},
62 //PAGE 1:
63 // For Flextronics system Logo PCIHCT failure:
64 // 0x1C4~0x1CD set no-zero value to avoid PCI configuration space 0x45[7]=1
65 {0x5e, 0x01},
66 {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x04}, {0x5b, 0x00}, {0x60, 0x24},
67 {0x61, 0x97}, {0x62, 0xF0}, {0x63, 0x09}, {0x80, 0x0F}, {0x81, 0xFF},
68 {0x82, 0xFF}, {0x83, 0x03},
69 {0xC4, 0x22}, {0xC5, 0x22}, {0xC6, 0x22}, {0xC7, 0x22}, {0xC8, 0x22}, //lzm add 080826
70 {0xC9, 0x22}, {0xCA, 0x22}, {0xCB, 0x22}, {0xCC, 0x22}, {0xCD, 0x22},//lzm add 080826
71 {0xe2, 0x00},
74 //PAGE 2:
75 {0x5e, 0x02},
76 {0x0c, 0x04}, {0x4c, 0x30}, {0x4d, 0x08}, {0x50, 0x05}, {0x51, 0xf5},
77 {0x52, 0x04}, {0x53, 0xa0}, {0x54, 0xff}, {0x55, 0xff}, {0x56, 0xff},
78 {0x57, 0xff}, {0x58, 0x08}, {0x59, 0x08}, {0x5a, 0x08}, {0x5b, 0x08},
79 {0x60, 0x08}, {0x61, 0x08}, {0x62, 0x08}, {0x63, 0x08}, {0x64, 0x2f},
80 {0x8c, 0x3f}, {0x8d, 0x3f}, {0x8e, 0x3f},
81 {0x8f, 0x3f}, {0xc4, 0xff}, {0xc5, 0xff}, {0xc6, 0xff}, {0xc7, 0xff},
82 {0xc8, 0x00}, {0xc9, 0x00}, {0xca, 0x80}, {0xcb, 0x00},
84 //PAGA 0:
85 {0x5e, 0x00},{0x9f, 0x03}
89 static u8 ZEBRA_AGC[]={
91 0x7E,0x7E,0x7E,0x7E,0x7D,0x7C,0x7B,0x7A,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,
92 0x71,0x70,0x6F,0x6E,0x6D,0x6C,0x6B,0x6A,0x69,0x68,0x67,0x66,0x65,0x64,0x63,0x62,
93 0x48,0x47,0x46,0x45,0x44,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x08,0x07,
94 0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
95 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x11,0x12,0x13,0x15,0x16,
96 0x17,0x17,0x18,0x18,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,
97 0x1f,0x1f,0x1f,0x20,0x20,0x20,0x20,0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x24,
98 0x24,0x25,0x25,0x25,0x26,0x26,0x27,0x27,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F
101 static u32 ZEBRA_RF_RX_GAIN_TABLE[]={
102 0x0096,0x0076,0x0056,0x0036,0x0016,0x01f6,0x01d6,0x01b6,
103 0x0196,0x0176,0x00F7,0x00D7,0x00B7,0x0097,0x0077,0x0057,
104 0x0037,0x00FB,0x00DB,0x00BB,0x00FF,0x00E3,0x00C3,0x00A3,
105 0x0083,0x0063,0x0043,0x0023,0x0003,0x01E3,0x01C3,0x01A3,
106 0x0183,0x0163,0x0143,0x0123,0x0103
109 static u8 OFDM_CONFIG[]={
110 // OFDM reg0x06[7:0]=0xFF: Enable power saving mode in RX
111 // OFDM reg0x3C[4]=1'b1: Enable RX power saving mode
112 // ofdm 0x3a = 0x7b ,(original : 0xfb) For ECS shielding room TP test
114 // 0x00
115 0x10, 0x0F, 0x0A, 0x0C, 0x14, 0xFA, 0xFF, 0x50,
116 0x00, 0x50, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00,
117 // 0x10
118 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xA8, 0x26,
119 0x32, 0x33, 0x06, 0xA5, 0x6F, 0x55, 0xC8, 0xBB,
120 // 0x20
121 0x0A, 0xE1, 0x2C, 0x4A, 0x86, 0x83, 0x34, 0x00,
122 0x4F, 0x24, 0x6F, 0xC2, 0x03, 0x40, 0x80, 0x00,
123 // 0x30
124 0xC0, 0xC1, 0x58, 0xF1, 0x00, 0xC4, 0x90, 0x3e,
125 0xD8, 0x3C, 0x7B, 0x10, 0x10
127 #else
128 static u8 MAC_REG_TABLE[][2]={
129 //PAGA 0:
130 {0xf0, 0x32}, {0xf1, 0x32}, {0xf2, 0x00}, {0xf3, 0x00}, {0xf4, 0x32},
131 {0xf5, 0x43}, {0xf6, 0x00}, {0xf7, 0x00}, {0xf8, 0x46}, {0xf9, 0xa4},
132 {0xfa, 0x00}, {0xfb, 0x00}, {0xfc, 0x96}, {0xfd, 0xa4}, {0xfe, 0x00},
133 {0xff, 0x00},
135 //PAGE 1:
136 {0x5e, 0x01},
137 {0x58, 0x4b}, {0x59, 0x00}, {0x5a, 0x4b}, {0x5b, 0x00}, {0x60, 0x4b},
138 {0x61, 0x09}, {0x62, 0x4b}, {0x63, 0x09}, {0xce, 0x0f}, {0xcf, 0x00},
139 {0xe0, 0xff}, {0xe1, 0x0f}, {0xe2, 0x00}, {0xf0, 0x4e}, {0xf1, 0x01},
140 {0xf2, 0x02}, {0xf3, 0x03}, {0xf4, 0x04}, {0xf5, 0x05}, {0xf6, 0x06},
141 {0xf7, 0x07}, {0xf8, 0x08},
144 //PAGE 2:
145 {0x5e, 0x02},
146 {0x0c, 0x04}, {0x21, 0x61}, {0x22, 0x68}, {0x23, 0x6f}, {0x24, 0x76},
147 {0x25, 0x7d}, {0x26, 0x84}, {0x27, 0x8d}, {0x4d, 0x08}, {0x4e, 0x00},
148 {0x50, 0x05}, {0x51, 0xf5}, {0x52, 0x04}, {0x53, 0xa0}, {0x54, 0x1f},
149 {0x55, 0x23}, {0x56, 0x45}, {0x57, 0x67}, {0x58, 0x08}, {0x59, 0x08},
150 {0x5a, 0x08}, {0x5b, 0x08}, {0x60, 0x08}, {0x61, 0x08}, {0x62, 0x08},
151 {0x63, 0x08}, {0x64, 0xcf}, {0x72, 0x56}, {0x73, 0x9a},
153 //PAGA 0:
154 {0x5e, 0x00},
155 {0x34, 0xff}, {0x35, 0x0f}, {0x5b, 0x40}, {0x84, 0x88}, {0x85, 0x24},
156 {0x88, 0x54}, {0x8b, 0xb8}, {0x8c, 0x07}, {0x8d, 0x00}, {0x94, 0x1b},
157 {0x95, 0x12}, {0x96, 0x00}, {0x97, 0x06}, {0x9d, 0x1a}, {0x9f, 0x10},
158 {0xb4, 0x22}, {0xbe, 0x80}, {0xdb, 0x00}, {0xee, 0x00}, {0x5b, 0x42},
159 {0x91, 0x03},
161 //PAGE 2:
162 {0x5e, 0x02},
163 {0x4c, 0x03},
165 //PAGE 0:
166 {0x5e, 0x00},
168 //PAGE 3:
169 {0x5e, 0x03},
170 {0x9f, 0x00},
172 //PAGE 0:
173 {0x5e, 0x00},
174 {0x8c, 0x01}, {0x8d, 0x10},{0x8e, 0x08}, {0x8f, 0x00}
178 static u8 ZEBRA_AGC[]={
180 0x5e,0x5e,0x5e,0x5e,0x5d,0x5b,0x59,0x57,0x55,0x53,0x51,0x4f,0x4d,0x4b,0x49,0x47,
181 0x45,0x43,0x41,0x3f,0x3d,0x3b,0x39,0x37,0x35,0x33,0x31,0x2f,0x2d,0x2b,0x29,0x27,
182 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x11,0x0f,0x0d,0x0b,0x09,0x07,
183 0x05,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
184 0x19,0x19,0x19,0x019,0x19,0x19,0x19,0x19,0x19,0x19,0x1e,0x1f,0x20,0x21,0x21,0x22,
185 0x23,0x24,0x24,0x25,0x25,0x26,0x26,0x27,0x27,0x28,0x28,0x28,0x29,0x2a,0x2a,0x2b,
186 0x2b,0x2b,0x2c,0x2c,0x2c,0x2d,0x2d,0x2d,0x2e,0x2e,0x2f,0x30,0x31,0x31,0x31,0x31,
187 0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31
190 static u32 ZEBRA_RF_RX_GAIN_TABLE[]={
192 0x0400,0x0401,0x0402,0x0403,0x0404,0x0405,0x0408,0x0409,
193 0x040a,0x040b,0x0502,0x0503,0x0504,0x0505,0x0540,0x0541,
194 0x0542,0x0543,0x0544,0x0545,0x0580,0x0581,0x0582,0x0583,
195 0x0584,0x0585,0x0588,0x0589,0x058a,0x058b,0x0643,0x0644,
196 0x0645,0x0680,0x0681,0x0682,0x0683,0x0684,0x0685,0x0688,
197 0x0689,0x068a,0x068b,0x068c,0x0742,0x0743,0x0744,0x0745,
198 0x0780,0x0781,0x0782,0x0783,0x0784,0x0785,0x0788,0x0789,
199 0x078a,0x078b,0x078c,0x078d,0x0790,0x0791,0x0792,0x0793,
200 0x0794,0x0795,0x0798,0x0799,0x079a,0x079b,0x079c,0x079d,
201 0x07a0,0x07a1,0x07a2,0x07a3,0x07a4,0x07a5,0x07a8,0x07a9,
202 0x03aa,0x03ab,0x03ac,0x03ad,0x03b0,0x03b1,0x03b2,0x03b3,
203 0x03b4,0x03b5,0x03b8,0x03b9,0x03ba,0x03bb,0x03bb
206 // 2006.07.13, SD3 szuyitasi:
207 // OFDM.0x03=0x0C (original is 0x0F)
208 // Use the new SD3 given param, by shien chang, 2006.07.14
209 static u8 OFDM_CONFIG[]={
210 0x10, 0x0d, 0x01, 0x0C, 0x14, 0xfb, 0x0f, 0x60, 0x00, 0x60,
211 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
212 0x00, 0x00, 0xa8, 0x46, 0xb2, 0x33, 0x07, 0xa5, 0x6f, 0x55,
213 0xc8, 0xb3, 0x0a, 0xe1, 0x1c, 0x8a, 0xb6, 0x83, 0x34, 0x0f,
214 0x4f, 0x23, 0x6f, 0xc2, 0x6b, 0x40, 0x80, 0x00, 0xc0, 0xc1,
215 0x58, 0xf1, 0x00, 0xe4, 0x90, 0x3e, 0x6d, 0x3c, 0xff, 0x07
217 #endif
219 /*---------------------------------------------------------------
220 * Hardware IO
221 * the code is ported from Windows source code
222 ----------------------------------------------------------------*/
224 void
225 PlatformIOWrite1Byte(
226 struct net_device *dev,
227 u32 offset,
228 u8 data
231 #ifndef CONFIG_RTL8180_IO_MAP
232 write_nic_byte(dev, offset, data);
233 read_nic_byte(dev, offset); // To make sure write operation is completed, 2005.11.09, by rcnjko.
235 #else // Port IO
236 u32 Page = (offset >> 8);
238 switch(Page)
240 case 0: // Page 0
241 write_nic_byte(dev, offset, data);
242 break;
244 case 1: // Page 1
245 case 2: // Page 2
246 case 3: // Page 3
248 u8 psr = read_nic_byte(dev, PSR);
250 write_nic_byte(dev, PSR, ((psr & 0xfc) | (u8)Page)); // Switch to page N.
251 write_nic_byte(dev, (offset & 0xff), data);
252 write_nic_byte(dev, PSR, (psr & 0xfc)); // Switch to page 0.
254 break;
256 default:
257 // Illegal page number.
258 DMESGE("PlatformIOWrite1Byte(): illegal page number: %d, offset: %#X", Page, offset);
259 break;
261 #endif
264 void
265 PlatformIOWrite2Byte(
266 struct net_device *dev,
267 u32 offset,
268 u16 data
271 #ifndef CONFIG_RTL8180_IO_MAP
272 write_nic_word(dev, offset, data);
273 read_nic_word(dev, offset); // To make sure write operation is completed, 2005.11.09, by rcnjko.
276 #else // Port IO
277 u32 Page = (offset >> 8);
279 switch(Page)
281 case 0: // Page 0
282 write_nic_word(dev, offset, data);
283 break;
285 case 1: // Page 1
286 case 2: // Page 2
287 case 3: // Page 3
289 u8 psr = read_nic_byte(dev, PSR);
291 write_nic_byte(dev, PSR, ((psr & 0xfc) | (u8)Page)); // Switch to page N.
292 write_nic_word(dev, (offset & 0xff), data);
293 write_nic_byte(dev, PSR, (psr & 0xfc)); // Switch to page 0.
295 break;
297 default:
298 // Illegal page number.
299 DMESGE("PlatformIOWrite2Byte(): illegal page number: %d, offset: %#X", Page, offset);
300 break;
302 #endif
304 u8 PlatformIORead1Byte(struct net_device *dev, u32 offset);
306 void
307 PlatformIOWrite4Byte(
308 struct net_device *dev,
309 u32 offset,
310 u32 data
313 #ifndef CONFIG_RTL8180_IO_MAP
314 //{by amy 080312
315 if (offset == PhyAddr)
316 {//For Base Band configuration.
317 unsigned char cmdByte;
318 unsigned long dataBytes;
319 unsigned char idx;
320 u8 u1bTmp;
322 cmdByte = (u8)(data & 0x000000ff);
323 dataBytes = data>>8;
326 // 071010, rcnjko:
327 // The critical section is only BB read/write race condition.
328 // Assumption:
329 // 1. We assume NO one will access BB at DIRQL, otherwise, system will crash for
330 // acquiring the spinlock in such context.
331 // 2. PlatformIOWrite4Byte() MUST NOT be recursive.
333 // NdisAcquireSpinLock( &(pDevice->IoSpinLock) );
335 for(idx = 0; idx < 30; idx++)
336 { // Make sure command bit is clear before access it.
337 u1bTmp = PlatformIORead1Byte(dev, PhyAddr);
338 if((u1bTmp & BIT7) == 0)
339 break;
340 else
341 mdelay(10);
344 for(idx=0; idx < 3; idx++)
346 PlatformIOWrite1Byte(dev,offset+1+idx,((u8*)&dataBytes)[idx] );
348 write_nic_byte(dev, offset, cmdByte);
350 // NdisReleaseSpinLock( &(pDevice->IoSpinLock) );
352 //by amy 080312}
353 else{
354 write_nic_dword(dev, offset, data);
355 read_nic_dword(dev, offset); // To make sure write operation is completed, 2005.11.09, by rcnjko.
357 #else // Port IO
358 u32 Page = (offset >> 8);
360 switch(Page)
362 case 0: // Page 0
363 write_nic_word(dev, offset, data);
364 break;
366 case 1: // Page 1
367 case 2: // Page 2
368 case 3: // Page 3
370 u8 psr = read_nic_byte(dev, PSR);
372 write_nic_byte(dev, PSR, ((psr & 0xfc) | (u8)Page)); // Switch to page N.
373 write_nic_dword(dev, (offset & 0xff), data);
374 write_nic_byte(dev, PSR, (psr & 0xfc)); // Switch to page 0.
376 break;
378 default:
379 // Illegal page number.
380 DMESGE("PlatformIOWrite4Byte(): illegal page number: %d, offset: %#X", Page, offset);
381 break;
383 #endif
387 PlatformIORead1Byte(
388 struct net_device *dev,
389 u32 offset
392 u8 data = 0;
394 #ifndef CONFIG_RTL8180_IO_MAP
395 data = read_nic_byte(dev, offset);
397 #else // Port IO
398 u32 Page = (offset >> 8);
400 switch(Page)
402 case 0: // Page 0
403 data = read_nic_byte(dev, offset);
404 break;
406 case 1: // Page 1
407 case 2: // Page 2
408 case 3: // Page 3
410 u8 psr = read_nic_byte(dev, PSR);
412 write_nic_byte(dev, PSR, ((psr & 0xfc) | (u8)Page)); // Switch to page N.
413 data = read_nic_byte(dev, (offset & 0xff));
414 write_nic_byte(dev, PSR, (psr & 0xfc)); // Switch to page 0.
416 break;
418 default:
419 // Illegal page number.
420 DMESGE("PlatformIORead1Byte(): illegal page number: %d, offset: %#X", Page, offset);
421 break;
423 #endif
425 return data;
429 PlatformIORead2Byte(
430 struct net_device *dev,
431 u32 offset
434 u16 data = 0;
436 #ifndef CONFIG_RTL8180_IO_MAP
437 data = read_nic_word(dev, offset);
439 #else // Port IO
440 u32 Page = (offset >> 8);
442 switch(Page)
444 case 0: // Page 0
445 data = read_nic_word(dev, offset);
446 break;
448 case 1: // Page 1
449 case 2: // Page 2
450 case 3: // Page 3
452 u8 psr = read_nic_byte(dev, PSR);
454 write_nic_byte(dev, PSR, ((psr & 0xfc) | (u8)Page)); // Switch to page N.
455 data = read_nic_word(dev, (offset & 0xff));
456 write_nic_byte(dev, PSR, (psr & 0xfc)); // Switch to page 0.
458 break;
460 default:
461 // Illegal page number.
462 DMESGE("PlatformIORead2Byte(): illegal page number: %d, offset: %#X", Page, offset);
463 break;
465 #endif
467 return data;
471 PlatformIORead4Byte(
472 struct net_device *dev,
473 u32 offset
476 u32 data = 0;
478 #ifndef CONFIG_RTL8180_IO_MAP
479 data = read_nic_dword(dev, offset);
481 #else // Port IO
482 u32 Page = (offset >> 8);
484 switch(Page)
486 case 0: // Page 0
487 data = read_nic_dword(dev, offset);
488 break;
490 case 1: // Page 1
491 case 2: // Page 2
492 case 3: // Page 3
494 u8 psr = read_nic_byte(dev, PSR);
496 write_nic_byte(dev, PSR, ((psr & 0xfc) | (u8)Page)); // Switch to page N.
497 data = read_nic_dword(dev, (offset & 0xff));
498 write_nic_byte(dev, PSR, (psr & 0xfc)); // Switch to page 0.
500 break;
502 default:
503 // Illegal page number.
504 DMESGE("PlatformIORead4Byte(): illegal page number: %d, offset: %#X\n", Page, offset);
505 break;
507 #endif
509 return data;
512 void
513 SetOutputEnableOfRfPins(
514 struct net_device *dev
517 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
519 switch(priv->rf_chip)
521 case RFCHIPID_RTL8225:
522 case RF_ZEBRA2:
523 case RF_ZEBRA4:
524 write_nic_word(dev, RFPinsEnable, 0x1bff);
525 //write_nic_word(dev, RFPinsEnable, 0x1fff);
526 break;
530 void
531 ZEBRA_RFSerialWrite(
532 struct net_device *dev,
533 u32 data2Write,
534 u8 totalLength,
535 u8 low2high
538 ThreeWireReg twreg;
539 int i;
540 u16 oval,oval2,oval3;
541 u32 mask;
542 u16 UshortBuffer;
544 u8 u1bTmp;
545 #ifdef CONFIG_RTL818X_S
546 // RTL8187S HSSI Read/Write Function
547 u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
548 u1bTmp |= RF_SW_CFG_SI; //reg08[1]=1 Serial Interface(SI)
549 write_nic_byte(dev, RF_SW_CONFIG, u1bTmp);
550 #endif
551 UshortBuffer = read_nic_word(dev, RFPinsOutput);
552 oval = UshortBuffer & 0xfff8; // We shall clear bit0, 1, 2 first, 2005.10.28, by rcnjko.
554 oval2 = read_nic_word(dev, RFPinsEnable);
555 oval3 = read_nic_word(dev, RFPinsSelect);
557 // <RJ_NOTE> 3-wire should be controled by HW when we finish SW 3-wire programming. 2005.08.10, by rcnjko.
558 oval3 &= 0xfff8;
560 write_nic_word(dev, RFPinsEnable, (oval2|0x0007)); // Set To Output Enable
561 write_nic_word(dev, RFPinsSelect, (oval3|0x0007)); // Set To SW Switch
562 udelay(10);
564 // Add this to avoid hardware and software 3-wire conflict.
565 // 2005.03.01, by rcnjko.
566 twreg.longData = 0;
567 twreg.struc.enableB = 1;
568 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval)); // Set SI_EN (RFLE)
569 udelay(2);
570 twreg.struc.enableB = 0;
571 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval)); // Clear SI_EN (RFLE)
572 udelay(10);
574 mask = (low2high)?0x01:((u32)0x01<<(totalLength-1));
576 for(i=0; i<totalLength/2; i++)
578 twreg.struc.data = ((data2Write&mask)!=0) ? 1 : 0;
579 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
580 twreg.struc.clk = 1;
581 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
582 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
584 mask = (low2high)?(mask<<1):(mask>>1);
585 twreg.struc.data = ((data2Write&mask)!=0) ? 1 : 0;
586 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
587 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
588 twreg.struc.clk = 0;
589 write_nic_word(dev, RFPinsOutput, (twreg.longData|oval));
590 mask = (low2high)?(mask<<1):(mask>>1);
593 twreg.struc.enableB = 1;
594 twreg.struc.clk = 0;
595 twreg.struc.data = 0;
596 write_nic_word(dev, RFPinsOutput, twreg.longData|oval);
597 udelay(10);
599 write_nic_word(dev, RFPinsOutput, oval|0x0004);
600 write_nic_word(dev, RFPinsSelect, oval3|0x0000);
602 SetOutputEnableOfRfPins(dev);
604 //by amy
608 HwHSSIThreeWire(
609 struct net_device *dev,
610 u8 *pDataBuf,
611 u8 nDataBufBitCnt,
612 int bSI,
613 int bWrite
616 int bResult = 1;
617 u8 TryCnt;
618 u8 u1bTmp;
622 // Check if WE and RE are cleared.
623 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
625 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
626 if( (u1bTmp & (SW_3W_CMD1_RE|SW_3W_CMD1_WE)) == 0 )
628 break;
630 udelay(10);
632 if (TryCnt == TC_3W_POLL_MAX_TRY_CNT)
633 panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp);
635 // RTL8187S HSSI Read/Write Function
636 u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
638 if(bSI)
640 u1bTmp |= RF_SW_CFG_SI; //reg08[1]=1 Serial Interface(SI)
641 }else
643 u1bTmp &= ~RF_SW_CFG_SI; //reg08[1]=0 Parallel Interface(PI)
646 write_nic_byte(dev, RF_SW_CONFIG, u1bTmp);
648 if(bSI)
650 // jong: HW SI read must set reg84[3]=0.
651 u1bTmp = read_nic_byte(dev, RFPinsSelect);
652 u1bTmp &= ~BIT3;
653 write_nic_byte(dev, RFPinsSelect, u1bTmp );
655 // Fill up data buffer for write operation.
657 if(bWrite)
659 if(nDataBufBitCnt == 16)
661 write_nic_word(dev, SW_3W_DB0, *((u16*)pDataBuf));
663 else if(nDataBufBitCnt == 64) // RTL8187S shouldn't enter this case
665 write_nic_dword(dev, SW_3W_DB0, *((u32*)pDataBuf));
666 write_nic_dword(dev, SW_3W_DB1, *((u32*)(pDataBuf + 4)));
668 else
670 int idx;
671 int ByteCnt = nDataBufBitCnt / 8;
672 //printk("%d\n",nDataBufBitCnt);
673 if ((nDataBufBitCnt % 8) != 0)
674 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
675 nDataBufBitCnt);
677 if (nDataBufBitCnt > 64)
678 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
679 nDataBufBitCnt);
681 for(idx = 0; idx < ByteCnt; idx++)
683 write_nic_byte(dev, (SW_3W_DB0+idx), *(pDataBuf+idx));
687 else //read
689 if(bSI)
691 // SI - reg274[3:0] : RF register's Address
692 write_nic_word(dev, SW_3W_DB0, *((u16*)pDataBuf) );
694 else
696 // PI - reg274[15:12] : RF register's Address
697 write_nic_word(dev, SW_3W_DB0, (*((u16*)pDataBuf)) << 12);
701 // Set up command: WE or RE.
702 if(bWrite)
704 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_WE);
706 else
708 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_RE);
711 // Check if DONE is set.
712 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
714 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
715 if( (u1bTmp & SW_3W_CMD1_DONE) != 0 )
717 break;
719 udelay(10);
722 write_nic_byte(dev, SW_3W_CMD1, 0);
724 // Read back data for read operation.
725 if(bWrite == 0)
727 if(bSI)
729 //Serial Interface : reg363_362[11:0]
730 *((u16*)pDataBuf) = read_nic_word(dev, SI_DATA_READ) ;
732 else
734 //Parallel Interface : reg361_360[11:0]
735 *((u16*)pDataBuf) = read_nic_word(dev, PI_DATA_READ);
738 *((u16*)pDataBuf) &= 0x0FFF;
741 }while(0);
743 return bResult;
745 //by amy
748 HwThreeWire(
749 struct net_device *dev,
750 u8 *pDataBuf,
751 u8 nDataBufBitCnt,
752 int bHold,
753 int bWrite
756 int bResult = 1;
757 u8 TryCnt;
758 u8 u1bTmp;
762 // Check if WE and RE are cleared.
763 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
765 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
766 if( (u1bTmp & (SW_3W_CMD1_RE|SW_3W_CMD1_WE)) == 0 )
768 break;
770 udelay(10);
772 if (TryCnt == TC_3W_POLL_MAX_TRY_CNT)
773 panic("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear!!\n", u1bTmp);
775 // Fill up data buffer for write operation.
776 if(nDataBufBitCnt == 16)
778 write_nic_word(dev, SW_3W_DB0, *((u16 *)pDataBuf));
780 else if(nDataBufBitCnt == 64)
782 write_nic_dword(dev, SW_3W_DB0, *((u32 *)pDataBuf));
783 write_nic_dword(dev, SW_3W_DB1, *((u32 *)(pDataBuf + 4)));
785 else
787 int idx;
788 int ByteCnt = nDataBufBitCnt / 8;
790 if ((nDataBufBitCnt % 8) != 0)
791 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
792 nDataBufBitCnt);
794 if (nDataBufBitCnt > 64)
795 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
796 nDataBufBitCnt);
798 for(idx = 0; idx < ByteCnt; idx++)
800 write_nic_byte(dev, (SW_3W_DB0+idx), *(pDataBuf+idx));
804 // Fill up length field.
805 u1bTmp = (u8)(nDataBufBitCnt - 1); // Number of bits - 1.
806 if(bHold)
807 u1bTmp |= SW_3W_CMD0_HOLD;
808 write_nic_byte(dev, SW_3W_CMD0, u1bTmp);
810 // Set up command: WE or RE.
811 if(bWrite)
813 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_WE);
815 else
817 write_nic_byte(dev, SW_3W_CMD1, SW_3W_CMD1_RE);
820 // Check if WE and RE are cleared and DONE is set.
821 for(TryCnt = 0; TryCnt < TC_3W_POLL_MAX_TRY_CNT; TryCnt++)
823 u1bTmp = read_nic_byte(dev, SW_3W_CMD1);
824 if( (u1bTmp & (SW_3W_CMD1_RE|SW_3W_CMD1_WE)) == 0 &&
825 (u1bTmp & SW_3W_CMD1_DONE) != 0 )
827 break;
829 udelay(10);
831 if(TryCnt == TC_3W_POLL_MAX_TRY_CNT)
833 //RT_ASSERT(TryCnt != TC_3W_POLL_MAX_TRY_CNT,
834 // ("HwThreeWire(): CmdReg: %#X RE|WE bits are not clear or DONE is not set!!\n", u1bTmp));
835 // Workaround suggested by wcchu: clear WE here. 2006.07.07, by rcnjko.
836 write_nic_byte(dev, SW_3W_CMD1, 0);
839 // Read back data for read operation.
840 // <RJ_TODO> I am not sure if this is correct output format of a read operation.
841 if(bWrite == 0)
843 if(nDataBufBitCnt == 16)
845 *((u16 *)pDataBuf) = read_nic_word(dev, SW_3W_DB0);
847 else if(nDataBufBitCnt == 64)
849 *((u32 *)pDataBuf) = read_nic_dword(dev, SW_3W_DB0);
850 *((u32 *)(pDataBuf + 4)) = read_nic_dword(dev, SW_3W_DB1);
852 else
854 int idx;
855 int ByteCnt = nDataBufBitCnt / 8;
857 if ((nDataBufBitCnt % 8) != 0)
858 panic("HwThreeWire(): nDataBufBitCnt(%d) should be multiple of 8!!!\n",
859 nDataBufBitCnt);
861 if (nDataBufBitCnt > 64)
862 panic("HwThreeWire(): nDataBufBitCnt(%d) should <= 64!!!\n",
863 nDataBufBitCnt);
865 for(idx = 0; idx < ByteCnt; idx++)
867 *(pDataBuf+idx) = read_nic_byte(dev, (SW_3W_DB0+idx));
872 }while(0);
874 return bResult;
878 void
879 RF_WriteReg(
880 struct net_device *dev,
881 u8 offset,
882 u32 data
885 //RFReg reg;
886 u32 data2Write;
887 u8 len;
888 u8 low2high;
889 //u32 RF_Read = 0;
890 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
893 switch(priv->rf_chip)
895 case RFCHIPID_RTL8225:
896 case RF_ZEBRA2: // Annie 2006-05-12.
897 case RF_ZEBRA4: //by amy
898 switch(priv->RegThreeWireMode)
900 case SW_THREE_WIRE:
901 { // Perform SW 3-wire programming by driver.
902 data2Write = (data << 4) | (u32)(offset & 0x0f);
903 len = 16;
904 low2high = 0;
905 ZEBRA_RFSerialWrite(dev, data2Write, len, low2high);
907 break;
909 case HW_THREE_WIRE:
910 { // Pure HW 3-wire.
911 data2Write = (data << 4) | (u32)(offset & 0x0f);
912 len = 16;
913 HwThreeWire(
914 dev,
915 (u8 *)(&data2Write), // pDataBuf,
916 len, // nDataBufBitCnt,
917 0, // bHold,
918 1); // bWrite
920 break;
921 #ifdef CONFIG_RTL818X_S
922 case HW_THREE_WIRE_PI: //Parallel Interface
923 { // Pure HW 3-wire.
924 data2Write = (data << 4) | (u32)(offset & 0x0f);
925 len = 16;
926 HwHSSIThreeWire(
927 dev,
928 (u8*)(&data2Write), // pDataBuf,
929 len, // nDataBufBitCnt,
930 0, // bSI
931 1); // bWrite
933 //printk("33333\n");
935 break;
937 case HW_THREE_WIRE_SI: //Serial Interface
938 { // Pure HW 3-wire.
939 data2Write = (data << 4) | (u32)(offset & 0x0f);
940 len = 16;
941 // printk(" enter ZEBRA_RFSerialWrite\n ");
942 // low2high = 0;
943 // ZEBRA_RFSerialWrite(dev, data2Write, len, low2high);
945 HwHSSIThreeWire(
946 dev,
947 (u8*)(&data2Write), // pDataBuf,
948 len, // nDataBufBitCnt,
949 1, // bSI
950 1); // bWrite
952 // printk(" exit ZEBRA_RFSerialWrite\n ");
954 break;
955 #endif
958 default:
959 DMESGE("RF_WriteReg(): invalid RegThreeWireMode(%d) !!!", priv->RegThreeWireMode);
960 break;
962 break;
964 default:
965 DMESGE("RF_WriteReg(): unknown RFChipID: %#X", priv->rf_chip);
966 break;
971 void
972 ZEBRA_RFSerialRead(
973 struct net_device *dev,
974 u32 data2Write,
975 u8 wLength,
976 u32 *data2Read,
977 u8 rLength,
978 u8 low2high
981 ThreeWireReg twreg;
982 int i;
983 u16 oval,oval2,oval3,tmp, wReg80;
984 u32 mask;
985 u8 u1bTmp;
986 ThreeWireReg tdata;
987 //PHAL_DATA_8187 pHalData = GetHalData8187(pAdapter);
988 #ifdef CONFIG_RTL818X_S
989 { // RTL8187S HSSI Read/Write Function
990 u1bTmp = read_nic_byte(dev, RF_SW_CONFIG);
991 u1bTmp |= RF_SW_CFG_SI; //reg08[1]=1 Serial Interface(SI)
992 write_nic_byte(dev, RF_SW_CONFIG, u1bTmp);
994 #endif
996 wReg80 = oval = read_nic_word(dev, RFPinsOutput);
997 oval2 = read_nic_word(dev, RFPinsEnable);
998 oval3 = read_nic_word(dev, RFPinsSelect);
1000 write_nic_word(dev, RFPinsEnable, oval2|0xf);
1001 write_nic_word(dev, RFPinsSelect, oval3|0xf);
1003 *data2Read = 0;
1005 // We must clear BIT0-3 here, otherwise,
1006 // SW_Enalbe will be true when we first call ZEBRA_RFSerialRead() after 8187MPVC open,
1007 // which will cause the value read become 0. 2005.04.11, by rcnjko.
1008 oval &= ~0xf;
1010 // Avoid collision with hardware three-wire.
1011 twreg.longData = 0;
1012 twreg.struc.enableB = 1;
1013 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(4);
1015 twreg.longData = 0;
1016 twreg.struc.enableB = 0;
1017 twreg.struc.clk = 0;
1018 twreg.struc.read_write = 0;
1019 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(5);
1021 mask = (low2high) ? 0x01 : ((u32)0x01<<(32-1));
1022 for(i = 0; i < wLength/2; i++)
1024 twreg.struc.data = ((data2Write&mask) != 0) ? 1 : 0;
1025 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(1);
1026 twreg.struc.clk = 1;
1027 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1028 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1030 mask = (low2high) ? (mask<<1): (mask>>1);
1032 if(i == 2)
1034 // 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.
1035 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0xe); // turn off data enable
1036 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0xe);
1038 twreg.struc.read_write=1;
1039 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1040 twreg.struc.clk = 0;
1041 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1042 break;
1044 twreg.struc.data = ((data2Write&mask) != 0) ? 1: 0;
1045 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1046 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1048 twreg.struc.clk = 0;
1049 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(1);
1051 mask = (low2high) ? (mask<<1) : (mask>>1);
1054 twreg.struc.clk = 0;
1055 twreg.struc.data = 0;
1056 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1057 mask = (low2high) ? 0x01 : ((u32)0x01 << (12-1));
1060 // 061016, by rcnjko:
1061 // We must set data pin to HW controled, otherwise RF can't driver it and
1062 // value RF register won't be able to read back properly.
1064 write_nic_word(dev, RFPinsEnable, ( ((oval2|0x0E) & (~0x01))) );
1066 for(i = 0; i < rLength; i++)
1068 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(1);
1069 twreg.struc.clk = 1;
1070 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1071 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1072 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1073 tmp = read_nic_word(dev, RFPinsInput);
1074 tdata.longData = tmp;
1075 *data2Read |= tdata.struc.clk ? mask : 0;
1077 twreg.struc.clk = 0;
1078 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1080 mask = (low2high) ? (mask<<1) : (mask>>1);
1082 twreg.struc.enableB = 1;
1083 twreg.struc.clk = 0;
1084 twreg.struc.data = 0;
1085 twreg.struc.read_write = 1;
1086 write_nic_word(dev, RFPinsOutput, twreg.longData|oval); udelay(2);
1088 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, oval2|0x8); // Set To Output Enable
1089 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.
1090 //PlatformEFIOWrite2Byte(pAdapter, RFPinsEnable, 0x1bff);
1091 write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch
1092 //PlatformEFIOWrite2Byte(pAdapter, RFPinsSelect, 0x0488);
1093 write_nic_word(dev, RFPinsOutput, 0x3a0);
1094 //PlatformEFIOWrite2Byte(pAdapter, RFPinsOutput, 0x0480);
1099 RF_ReadReg(
1100 struct net_device *dev,
1101 u8 offset
1104 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1105 u32 data2Write;
1106 u8 wlen;
1107 u8 rlen;
1108 u8 low2high;
1109 u32 dataRead;
1111 switch(priv->rf_chip)
1113 case RFCHIPID_RTL8225:
1114 case RF_ZEBRA2:
1115 case RF_ZEBRA4:
1116 switch(priv->RegThreeWireMode)
1118 #ifdef CONFIG_RTL818X_S
1119 case HW_THREE_WIRE_PI: // For 87S Parallel Interface.
1121 data2Write = ((u32)(offset&0x0f));
1122 wlen=16;
1123 HwHSSIThreeWire(
1124 dev,
1125 (u8*)(&data2Write), // pDataBuf,
1126 wlen, // nDataBufBitCnt,
1127 0, // bSI
1128 0); // bWrite
1129 dataRead= data2Write;
1131 break;
1133 case HW_THREE_WIRE_SI: // For 87S Serial Interface.
1135 data2Write = ((u32)(offset&0x0f)) ;
1136 wlen=16;
1137 HwHSSIThreeWire(
1138 dev,
1139 (u8*)(&data2Write), // pDataBuf,
1140 wlen, // nDataBufBitCnt,
1141 1, // bSI
1142 0 // bWrite
1144 dataRead= data2Write;
1146 break;
1148 #endif
1149 // Perform SW 3-wire programming by driver.
1150 default:
1152 data2Write = ((u32)(offset&0x1f)) << 27; // For Zebra E-cut. 2005.04.11, by rcnjko.
1153 wlen = 6;
1154 rlen = 12;
1155 low2high = 0;
1156 ZEBRA_RFSerialRead(dev, data2Write, wlen,&dataRead,rlen, low2high);
1158 break;
1160 break;
1161 default:
1162 dataRead = 0;
1163 break;
1166 return dataRead;
1170 // by Owen on 04/07/14 for writing BB register successfully
1171 void
1172 WriteBBPortUchar(
1173 struct net_device *dev,
1174 u32 Data
1177 //u8 TimeoutCounter;
1178 u8 RegisterContent;
1179 u8 UCharData;
1181 UCharData = (u8)((Data & 0x0000ff00) >> 8);
1182 PlatformIOWrite4Byte(dev, PhyAddr, Data);
1183 //for(TimeoutCounter = 10; TimeoutCounter > 0; TimeoutCounter--)
1185 PlatformIOWrite4Byte(dev, PhyAddr, Data & 0xffffff7f);
1186 RegisterContent = PlatformIORead1Byte(dev, PhyDataR);
1187 //if(UCharData == RegisterContent)
1188 // break;
1193 ReadBBPortUchar(
1194 struct net_device *dev,
1195 u32 addr
1198 //u8 TimeoutCounter;
1199 u8 RegisterContent;
1201 PlatformIOWrite4Byte(dev, PhyAddr, addr & 0xffffff7f);
1202 RegisterContent = PlatformIORead1Byte(dev, PhyDataR);
1204 return RegisterContent;
1206 //{by amy 080312
1207 #ifdef CONFIG_RTL818X_S
1209 // Description:
1210 // Perform Antenna settings with antenna diversity on 87SE.
1211 // Created by Roger, 2008.01.25.
1213 bool
1214 SetAntennaConfig87SE(
1215 struct net_device *dev,
1216 u8 DefaultAnt, // 0: Main, 1: Aux.
1217 bool bAntDiversity // 1:Enable, 0: Disable.
1220 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1221 bool bAntennaSwitched = true;
1223 //printk("SetAntennaConfig87SE(): DefaultAnt(%d), bAntDiversity(%d)\n", DefaultAnt, bAntDiversity);
1225 // Threshold for antenna diversity.
1226 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
1228 if( bAntDiversity ) // Enable Antenna Diversity.
1230 if( DefaultAnt == 1 ) // aux antenna
1232 // Mac register, aux antenna
1233 write_nic_byte(dev, ANTSEL, 0x00);
1235 // Config CCK RX antenna.
1236 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
1237 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
1239 // Config OFDM RX antenna.
1240 write_phy_ofdm(dev, 0x0D, 0x54); // Reg0d : 54
1241 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
1243 else // use main antenna
1245 // Mac register, main antenna
1246 write_nic_byte(dev, ANTSEL, 0x03);
1247 //base band
1248 // Config CCK RX antenna.
1249 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
1250 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
1252 // Config OFDM RX antenna.
1253 write_phy_ofdm(dev, 0x0d, 0x5c); // Reg0d : 5c
1254 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
1257 else // Disable Antenna Diversity.
1259 if( DefaultAnt == 1 ) // aux Antenna
1261 // Mac register, aux antenna
1262 write_nic_byte(dev, ANTSEL, 0x00);
1264 // Config CCK RX antenna.
1265 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
1266 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
1268 // Config OFDM RX antenna.
1269 write_phy_ofdm(dev, 0x0D, 0x54); // Reg0d : 54
1270 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
1272 else // main Antenna
1274 // Mac register, main antenna
1275 write_nic_byte(dev, ANTSEL, 0x03);
1277 // Config CCK RX antenna.
1278 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
1279 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
1281 // Config OFDM RX antenna.
1282 write_phy_ofdm(dev, 0x0D, 0x5c); // Reg0d : 5c
1283 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
1286 priv->CurrAntennaIndex = DefaultAnt; // Update default settings.
1287 return bAntennaSwitched;
1289 #endif
1290 //by amy 080312
1291 /*---------------------------------------------------------------
1292 * Hardware Initialization.
1293 * the code is ported from Windows source code
1294 ----------------------------------------------------------------*/
1296 void
1297 ZEBRA_Config_85BASIC_HardCode(
1298 struct net_device *dev
1302 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1303 u32 i;
1304 u32 addr,data;
1305 u32 u4bRegOffset, u4bRegValue, u4bRF23, u4bRF24;
1306 u8 u1b24E;
1308 #ifdef CONFIG_RTL818X_S
1310 //=============================================================================
1311 // 87S_PCIE :: RADIOCFG.TXT
1312 //=============================================================================
1315 // Page1 : reg16-reg30
1316 RF_WriteReg(dev, 0x00, 0x013f); mdelay(1); // switch to page1
1317 u4bRF23= RF_ReadReg(dev, 0x08); mdelay(1);
1318 u4bRF24= RF_ReadReg(dev, 0x09); mdelay(1);
1320 if (u4bRF23==0x818 && u4bRF24==0x70C && priv->card_8185 == VERSION_8187S_C)
1321 priv->card_8185 = VERSION_8187S_D;
1323 // Page0 : reg0-reg15
1325 // RF_WriteReg(dev, 0x00, 0x003f); mdelay(1);//1
1326 RF_WriteReg(dev, 0x00, 0x009f); mdelay(1);// 1
1328 RF_WriteReg(dev, 0x01, 0x06e0); mdelay(1);
1330 // RF_WriteReg(dev, 0x02, 0x004c); mdelay(1);//2
1331 RF_WriteReg(dev, 0x02, 0x004d); mdelay(1);// 2
1333 // RF_WriteReg(dev, 0x03, 0x0000); mdelay(1);//3
1334 RF_WriteReg(dev, 0x03, 0x07f1); mdelay(1);// 3
1336 RF_WriteReg(dev, 0x04, 0x0975); mdelay(1);
1337 RF_WriteReg(dev, 0x05, 0x0c72); mdelay(1);
1338 RF_WriteReg(dev, 0x06, 0x0ae6); mdelay(1);
1339 RF_WriteReg(dev, 0x07, 0x00ca); mdelay(1);
1340 RF_WriteReg(dev, 0x08, 0x0e1c); mdelay(1);
1341 RF_WriteReg(dev, 0x09, 0x02f0); mdelay(1);
1342 RF_WriteReg(dev, 0x0a, 0x09d0); mdelay(1);
1343 RF_WriteReg(dev, 0x0b, 0x01ba); mdelay(1);
1344 RF_WriteReg(dev, 0x0c, 0x0640); mdelay(1);
1345 RF_WriteReg(dev, 0x0d, 0x08df); mdelay(1);
1346 RF_WriteReg(dev, 0x0e, 0x0020); mdelay(1);
1347 RF_WriteReg(dev, 0x0f, 0x0990); mdelay(1);
1350 // Page1 : reg16-reg30
1351 RF_WriteReg(dev, 0x00, 0x013f); mdelay(1);
1353 RF_WriteReg(dev, 0x03, 0x0806); mdelay(1);
1355 if(priv->card_8185 < VERSION_8187S_C)
1357 RF_WriteReg(dev, 0x04, 0x03f7); mdelay(1);
1358 RF_WriteReg(dev, 0x05, 0x05ab); mdelay(1);
1359 RF_WriteReg(dev, 0x06, 0x00c1); mdelay(1);
1361 else
1363 RF_WriteReg(dev, 0x04, 0x03a7); mdelay(1);
1364 RF_WriteReg(dev, 0x05, 0x059b); mdelay(1);
1365 RF_WriteReg(dev, 0x06, 0x0081); mdelay(1);
1369 RF_WriteReg(dev, 0x07, 0x01A0); mdelay(1);
1370 // Don't write RF23/RF24 to make a difference between 87S C cut and D cut. asked by SD3 stevenl.
1371 // RF_WriteReg(dev, 0x08, 0x0597); mdelay(1);
1372 // RF_WriteReg(dev, 0x09, 0x050a); mdelay(1);
1373 RF_WriteReg(dev, 0x0a, 0x0001); mdelay(1);
1374 RF_WriteReg(dev, 0x0b, 0x0418); mdelay(1);
1376 if(priv->card_8185 == VERSION_8187S_D)
1378 RF_WriteReg(dev, 0x0c, 0x0fbe); mdelay(1);
1379 RF_WriteReg(dev, 0x0d, 0x0008); mdelay(1);
1380 RF_WriteReg(dev, 0x0e, 0x0807); mdelay(1); // RX LO buffer
1382 else
1384 RF_WriteReg(dev, 0x0c, 0x0fbe); mdelay(1);
1385 RF_WriteReg(dev, 0x0d, 0x0008); mdelay(1);
1386 RF_WriteReg(dev, 0x0e, 0x0806); mdelay(1); // RX LO buffer
1389 RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1);
1391 // RF_WriteReg(dev, 0x00, 0x017f); mdelay(1);//6
1392 RF_WriteReg(dev, 0x00, 0x01d7); mdelay(1);// 6
1394 RF_WriteReg(dev, 0x03, 0x0e00); mdelay(1);
1395 RF_WriteReg(dev, 0x04, 0x0e50); mdelay(1);
1396 for(i=0;i<=36;i++)
1398 RF_WriteReg(dev, 0x01, i); mdelay(1);
1399 RF_WriteReg(dev, 0x02, ZEBRA_RF_RX_GAIN_TABLE[i]); mdelay(1);
1400 //DbgPrint("RF - 0x%x = 0x%x", i, ZEBRA_RF_RX_GAIN_TABLE[i]);
1403 RF_WriteReg(dev, 0x05, 0x0203); mdelay(1); /// 203, 343
1404 //RF_WriteReg(dev, 0x06, 0x0300); mdelay(1); // 400
1405 RF_WriteReg(dev, 0x06, 0x0200); mdelay(1); // 400
1407 RF_WriteReg(dev, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30, and HSSI disable 137
1408 mdelay(10); // Deay 10 ms. //0xfd
1410 // RF_WriteReg(dev, 0x0c, 0x09be); mdelay(1); // 7
1411 //RF_WriteReg(dev, 0x0c, 0x07be); mdelay(1);
1412 //mdelay(10); // Deay 10 ms. //0xfd
1414 RF_WriteReg(dev, 0x0d, 0x0008); mdelay(1); // Z4 synthesizer loop filter setting, 392
1415 mdelay(10); // Deay 10 ms. //0xfd
1417 RF_WriteReg(dev, 0x00, 0x0037); mdelay(1); // switch to reg0-reg15, and HSSI disable
1418 mdelay(10); // Deay 10 ms. //0xfd
1420 RF_WriteReg(dev, 0x04, 0x0160); mdelay(1); // CBC on, Tx Rx disable, High gain
1421 mdelay(10); // Deay 10 ms. //0xfd
1423 RF_WriteReg(dev, 0x07, 0x0080); mdelay(1); // Z4 setted channel 1
1424 mdelay(10); // Deay 10 ms. //0xfd
1426 RF_WriteReg(dev, 0x02, 0x088D); mdelay(1); // LC calibration
1427 mdelay(200); // Deay 200 ms. //0xfd
1428 mdelay(10); // Deay 10 ms. //0xfd
1429 mdelay(10); // Deay 10 ms. //0xfd
1431 RF_WriteReg(dev, 0x00, 0x0137); mdelay(1); // switch to reg16-reg30 137, and HSSI disable 137
1432 mdelay(10); // Deay 10 ms. //0xfd
1434 RF_WriteReg(dev, 0x07, 0x0000); mdelay(1);
1435 RF_WriteReg(dev, 0x07, 0x0180); mdelay(1);
1436 RF_WriteReg(dev, 0x07, 0x0220); mdelay(1);
1437 RF_WriteReg(dev, 0x07, 0x03E0); mdelay(1);
1439 // DAC calibration off 20070702
1440 RF_WriteReg(dev, 0x06, 0x00c1); mdelay(1);
1441 RF_WriteReg(dev, 0x0a, 0x0001); mdelay(1);
1442 //{by amy 080312
1443 // For crystal calibration, added by Roger, 2007.12.11.
1444 if( priv->bXtalCalibration ) // reg 30.
1445 { // enable crystal calibration.
1446 // RF Reg[30], (1)Xin:[12:9], Xout:[8:5], addr[4:0].
1447 // (2)PA Pwr delay timer[15:14], default: 2.4us, set BIT15=0
1448 // (3)RF signal on/off when calibration[13], default: on, set BIT13=0.
1449 // So we should minus 4 BITs offset.
1450 RF_WriteReg(dev, 0x0f, (priv->XtalCal_Xin<<5)|(priv->XtalCal_Xout<<1)|BIT11|BIT9); mdelay(1);
1451 printk("ZEBRA_Config_85BASIC_HardCode(): (%02x)\n",
1452 (priv->XtalCal_Xin<<5) | (priv->XtalCal_Xout<<1) | BIT11| BIT9);
1454 else
1455 { // using default value. Xin=6, Xout=6.
1456 RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1);
1458 //by amy 080312
1459 // RF_WriteReg(dev, 0x0f, 0x0acc); mdelay(1); //-by amy 080312
1461 RF_WriteReg(dev, 0x00, 0x00bf); mdelay(1); // switch to reg0-reg15, and HSSI enable
1462 // RF_WriteReg(dev, 0x0d, 0x009f); mdelay(1); // Rx BB start calibration, 00c//-edward
1463 RF_WriteReg(dev, 0x0d, 0x08df); mdelay(1); // Rx BB start calibration, 00c//+edward
1464 RF_WriteReg(dev, 0x02, 0x004d); mdelay(1); // temperature meter off
1465 RF_WriteReg(dev, 0x04, 0x0975); mdelay(1); // Rx mode
1466 mdelay(10); // Deay 10 ms. //0xfe
1467 mdelay(10); // Deay 10 ms. //0xfe
1468 mdelay(10); // Deay 10 ms. //0xfe
1469 RF_WriteReg(dev, 0x00, 0x0197); mdelay(1); // Rx mode//+edward
1470 RF_WriteReg(dev, 0x05, 0x05ab); mdelay(1); // Rx mode//+edward
1471 RF_WriteReg(dev, 0x00, 0x009f); mdelay(1); // Rx mode//+edward
1473 #if 0//-edward
1474 RF_WriteReg(dev, 0x00, 0x0197); mdelay(1);
1475 RF_WriteReg(dev, 0x05, 0x05ab); mdelay(1);
1476 RF_WriteReg(dev, 0x00, 0x009F); mdelay(1);
1477 #endif
1478 RF_WriteReg(dev, 0x01, 0x0000); mdelay(1); // Rx mode//+edward
1479 RF_WriteReg(dev, 0x02, 0x0000); mdelay(1); // Rx mode//+edward
1480 //power save parameters.
1481 u1b24E = read_nic_byte(dev, 0x24E);
1482 write_nic_byte(dev, 0x24E, (u1b24E & (~(BIT5|BIT6))));
1484 //=============================================================================
1486 //=============================================================================
1487 // CCKCONF.TXT
1488 //=============================================================================
1490 /* [POWER SAVE] Power Saving Parameters by jong. 2007-11-27
1491 CCK reg0x00[7]=1'b1 :power saving for TX (default)
1492 CCK reg0x00[6]=1'b1: power saving for RX (default)
1493 CCK reg0x06[4]=1'b1: turn off channel estimation related circuits if not doing channel estimation.
1494 CCK reg0x06[3]=1'b1: turn off unused circuits before cca = 1
1495 CCK reg0x06[2]=1'b1: turn off cck's circuit if macrst =0
1497 #if 0
1498 write_nic_dword(dev, PHY_ADR, 0x0100c880);
1499 write_nic_dword(dev, PHY_ADR, 0x01001c86);
1500 write_nic_dword(dev, PHY_ADR, 0x01007890);
1501 write_nic_dword(dev, PHY_ADR, 0x0100d0ae);
1502 write_nic_dword(dev, PHY_ADR, 0x010006af);
1503 write_nic_dword(dev, PHY_ADR, 0x01004681);
1504 #endif
1505 write_phy_cck(dev,0x00,0xc8);
1506 write_phy_cck(dev,0x06,0x1c);
1507 write_phy_cck(dev,0x10,0x78);
1508 write_phy_cck(dev,0x2e,0xd0);
1509 write_phy_cck(dev,0x2f,0x06);
1510 write_phy_cck(dev,0x01,0x46);
1512 // power control
1513 write_nic_byte(dev, CCK_TXAGC, 0x10);
1514 write_nic_byte(dev, OFDM_TXAGC, 0x1B);
1515 write_nic_byte(dev, ANTSEL, 0x03);
1516 #else
1517 //=============================================================================
1518 // RADIOCFG.TXT
1519 //=============================================================================
1521 RF_WriteReg(dev, 0x00, 0x00b7); mdelay(1);
1522 RF_WriteReg(dev, 0x01, 0x0ee0); mdelay(1);
1523 RF_WriteReg(dev, 0x02, 0x044d); mdelay(1);
1524 RF_WriteReg(dev, 0x03, 0x0441); mdelay(1);
1525 RF_WriteReg(dev, 0x04, 0x08c3); mdelay(1);
1526 RF_WriteReg(dev, 0x05, 0x0c72); mdelay(1);
1527 RF_WriteReg(dev, 0x06, 0x00e6); mdelay(1);
1528 RF_WriteReg(dev, 0x07, 0x082a); mdelay(1);
1529 RF_WriteReg(dev, 0x08, 0x003f); mdelay(1);
1530 RF_WriteReg(dev, 0x09, 0x0335); mdelay(1);
1531 RF_WriteReg(dev, 0x0a, 0x09d4); mdelay(1);
1532 RF_WriteReg(dev, 0x0b, 0x07bb); mdelay(1);
1533 RF_WriteReg(dev, 0x0c, 0x0850); mdelay(1);
1534 RF_WriteReg(dev, 0x0d, 0x0cdf); mdelay(1);
1535 RF_WriteReg(dev, 0x0e, 0x002b); mdelay(1);
1536 RF_WriteReg(dev, 0x0f, 0x0114); mdelay(1);
1538 RF_WriteReg(dev, 0x00, 0x01b7); mdelay(1);
1541 for(i=1;i<=95;i++)
1543 RF_WriteReg(dev, 0x01, i); mdelay(1);
1544 RF_WriteReg(dev, 0x02, ZEBRA_RF_RX_GAIN_TABLE[i]); mdelay(1);
1545 //DbgPrint("RF - 0x%x = 0x%x", i, ZEBRA_RF_RX_GAIN_TABLE[i]);
1548 RF_WriteReg(dev, 0x03, 0x0080); mdelay(1); // write reg 18
1549 RF_WriteReg(dev, 0x05, 0x0004); mdelay(1); // write reg 20
1550 RF_WriteReg(dev, 0x00, 0x00b7); mdelay(1); // switch to reg0-reg15
1551 //0xfd
1552 //0xfd
1553 //0xfd
1554 RF_WriteReg(dev, 0x02, 0x0c4d); mdelay(1);
1555 mdelay(100); // Deay 100 ms. //0xfe
1556 mdelay(100); // Deay 100 ms. //0xfe
1557 RF_WriteReg(dev, 0x02, 0x044d); mdelay(1);
1558 RF_WriteReg(dev, 0x00, 0x02bf); mdelay(1); //0x002f disable 6us corner change, 06f--> enable
1560 //=============================================================================
1562 //=============================================================================
1563 // CCKCONF.TXT
1564 //=============================================================================
1566 //=============================================================================
1568 //=============================================================================
1569 // Follow WMAC RTL8225_Config()
1570 //=============================================================================
1572 // power control
1573 write_nic_byte(dev, CCK_TXAGC, 0x03);
1574 write_nic_byte(dev, OFDM_TXAGC, 0x07);
1575 write_nic_byte(dev, ANTSEL, 0x03);
1577 //=============================================================================
1579 // OFDM BBP setup
1580 // SetOutputEnableOfRfPins(dev);//by amy
1581 #endif
1585 //=============================================================================
1586 // AGC.txt
1587 //=============================================================================
1589 // PlatformIOWrite4Byte( dev, PhyAddr, 0x00001280); // Annie, 2006-05-05
1590 write_phy_ofdm(dev, 0x00, 0x12);
1591 //WriteBBPortUchar(dev, 0x00001280);
1593 for (i=0; i<128; i++)
1595 //DbgPrint("AGC - [%x+1] = 0x%x\n", i, ZEBRA_AGC[i+1]);
1597 data = ZEBRA_AGC[i+1];
1598 data = data << 8;
1599 data = data | 0x0000008F;
1601 addr = i + 0x80; //enable writing AGC table
1602 addr = addr << 8;
1603 addr = addr | 0x0000008E;
1605 WriteBBPortUchar(dev, data);
1606 WriteBBPortUchar(dev, addr);
1607 WriteBBPortUchar(dev, 0x0000008E);
1610 PlatformIOWrite4Byte( dev, PhyAddr, 0x00001080); // Annie, 2006-05-05
1611 //WriteBBPortUchar(dev, 0x00001080);
1613 //=============================================================================
1615 //=============================================================================
1616 // OFDMCONF.TXT
1617 //=============================================================================
1619 for(i=0; i<60; i++)
1621 u4bRegOffset=i;
1622 u4bRegValue=OFDM_CONFIG[i];
1624 //DbgPrint("OFDM - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
1626 WriteBBPortUchar(dev,
1627 (0x00000080 |
1628 (u4bRegOffset & 0x7f) |
1629 ((u4bRegValue & 0xff) << 8)));
1632 //=============================================================================
1633 //by amy for antenna
1634 //=============================================================================
1635 //{by amy 080312
1636 #ifdef CONFIG_RTL818X_S
1637 // Config Sw/Hw Combinational Antenna Diversity. Added by Roger, 2008.02.26.
1638 SetAntennaConfig87SE(dev, priv->bDefaultAntenna1, priv->bSwAntennaDiverity);
1639 #endif
1640 //by amy 080312}
1641 #if 0
1642 // Config Sw/Hw Antenna Diversity
1643 if( priv->bSwAntennaDiverity ) // Use SW+Hw Antenna Diversity
1645 if( priv->bDefaultAntenna1 == true ) // aux antenna
1647 // Mac register, aux antenna
1648 write_nic_byte(dev, ANTSEL, 0x00);
1649 // Config CCK RX antenna.
1650 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
1651 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
1652 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
1653 // Config OFDM RX antenna.
1654 write_phy_ofdm(dev, 0x0d, 0x54); // Reg0d : 54
1655 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
1657 else // main antenna
1659 // Mac register, main antenna
1660 write_nic_byte(dev, ANTSEL, 0x03);
1661 //base band
1662 // Config CCK RX antenna.
1663 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
1664 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
1665 write_phy_cck(dev, 0x01, 0xc7); // Reg01 : c7
1666 // Config OFDM RX antenna.
1667 write_phy_ofdm(dev, 0x0d, 0x5c); // Reg0d : 5c
1668 write_phy_ofdm(dev, 0x18, 0xb2); // Reg18 : b2
1671 else // Disable Antenna Diversity
1673 if( priv->bDefaultAntenna1 == true ) // aux Antenna
1675 // Mac register, aux antenna
1676 write_nic_byte(dev, ANTSEL, 0x00);
1677 // Config CCK RX antenna.
1678 write_phy_cck(dev, 0x11, 0xbb); // Reg11 : bb
1679 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
1680 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
1681 // Config OFDM RX antenna.
1682 write_phy_ofdm(dev, 0x0d, 0x54); // Reg0d : 54
1683 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
1685 else // main Antenna
1687 // Mac register, main antenna
1688 write_nic_byte(dev, ANTSEL, 0x03);
1689 // Config CCK RX antenna.
1690 write_phy_cck(dev, 0x11, 0x9b); // Reg11 : 9b
1691 write_phy_cck(dev, 0x0c, 0x09); // Reg0c : 09
1692 write_phy_cck(dev, 0x01, 0x47); // Reg01 : 47
1693 // Config OFDM RX antenna.
1694 write_phy_ofdm(dev, 0x0d, 0x5c); // Reg0d : 5c
1695 write_phy_ofdm(dev, 0x18, 0x32); // Reg18 : 32
1698 #endif
1699 //by amy for antenna
1703 void
1704 UpdateInitialGain(
1705 struct net_device *dev
1708 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1709 //unsigned char* IGTable;
1710 //u8 DIG_CurrentInitialGain = 4;
1711 //unsigned char u1Tmp;
1713 //lzm add 080826
1714 if(priv->eRFPowerState != eRfOn)
1716 //Don't access BB/RF under disable PLL situation.
1717 //RT_TRACE(COMP_DIG, DBG_LOUD, ("UpdateInitialGain - pHalData->eRFPowerState!=eRfOn\n"));
1718 // Back to the original state
1719 priv->InitialGain= priv->InitialGainBackUp;
1720 return;
1723 switch(priv->rf_chip)
1725 #if 0
1726 case RF_ZEBRA2:
1727 // Dynamic set initial gain, by shien chang, 2006.07.14
1728 switch(priv->InitialGain)
1730 case 1: //m861dBm
1731 DMESG("RTL8185B + 8225 Initial Gain State 1: -82 dBm \n");
1732 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1733 write_nic_dword(dev, PhyAddr, 0x86a4); mdelay(1);
1734 write_nic_dword(dev, PhyAddr, 0xfa85); mdelay(1);
1735 break;
1737 case 2: //m862dBm
1738 DMESG("RTL8185B + 8225 Initial Gain State 2: -82 dBm \n");
1739 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1740 write_nic_dword(dev, PhyAddr, 0x86a4); mdelay(1);
1741 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1742 break;
1744 case 3: //m863dBm
1745 DMESG("RTL8185B + 8225 Initial Gain State 3: -82 dBm \n");
1746 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1747 write_nic_dword(dev, PhyAddr, 0x96a4); mdelay(1);
1748 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1749 break;
1751 case 4: //m864dBm
1752 DMESG("RTL8185B + 8225 Initial Gain State 4: -78 dBm \n");
1753 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1754 write_nic_dword(dev, PhyAddr, 0xa6a4); mdelay(1);
1755 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1756 break;
1758 case 5: //m82dBm
1759 DMESG("RTL8185B + 8225 Initial Gain State 5: -74 dBm \n");
1760 write_nic_dword(dev, PhyAddr, 0x3697); mdelay(1);
1761 write_nic_dword(dev, PhyAddr, 0xa6a4); mdelay(1);
1762 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1763 break;
1765 case 6: //m78dBm
1766 DMESG("RTL8185B + 8225 Initial Gain State 6: -70 dBm \n");
1767 write_nic_dword(dev, PhyAddr, 0x4697); mdelay(1);
1768 write_nic_dword(dev, PhyAddr, 0xa6a4); mdelay(1);
1769 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1770 break;
1772 case 7: //m74dBm
1773 DMESG("RTL8185B + 8225 Initial Gain State 7: -66 dBm \n");
1774 write_nic_dword(dev, PhyAddr, 0x5697); mdelay(1);
1775 write_nic_dword(dev, PhyAddr, 0xa6a4); mdelay(1);
1776 write_nic_dword(dev, PhyAddr, 0xfb85); mdelay(1);
1777 break;
1779 default: //MP
1780 DMESG("RTL8185B + 8225 Initial Gain State 1: -82 dBm (default)\n");
1781 write_nic_dword(dev, PhyAddr, 0x2697); mdelay(1);
1782 write_nic_dword(dev, PhyAddr, 0x86a4); mdelay(1);
1783 write_nic_dword(dev, PhyAddr, 0xfa85); mdelay(1);
1784 break;
1786 break;
1787 #endif
1788 case RF_ZEBRA4:
1789 // Dynamic set initial gain, follow 87B
1790 switch(priv->InitialGain)
1792 case 1: //m861dBm
1793 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm \n");
1794 write_phy_ofdm(dev, 0x17, 0x26); mdelay(1);
1795 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1796 write_phy_ofdm(dev, 0x05, 0xfa); mdelay(1);
1797 break;
1799 case 2: //m862dBm
1800 //DMESG("RTL8187 + 8225 Initial Gain State 2: -82 dBm \n");
1801 write_phy_ofdm(dev, 0x17, 0x36); mdelay(1);
1802 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1803 write_phy_ofdm(dev, 0x05, 0xfa); mdelay(1);
1804 break;
1806 case 3: //m863dBm
1807 //DMESG("RTL8187 + 8225 Initial Gain State 3: -82 dBm \n");
1808 write_phy_ofdm(dev, 0x17, 0x36); mdelay(1);
1809 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1810 write_phy_ofdm(dev, 0x05, 0xfb); mdelay(1);
1811 break;
1813 case 4: //m864dBm
1814 //DMESG("RTL8187 + 8225 Initial Gain State 4: -78 dBm \n");
1815 write_phy_ofdm(dev, 0x17, 0x46); mdelay(1);
1816 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1817 write_phy_ofdm(dev, 0x05, 0xfb); mdelay(1);
1818 break;
1820 case 5: //m82dBm
1821 //DMESG("RTL8187 + 8225 Initial Gain State 5: -74 dBm \n");
1822 write_phy_ofdm(dev, 0x17, 0x46); mdelay(1);
1823 write_phy_ofdm(dev, 0x24, 0x96); mdelay(1);
1824 write_phy_ofdm(dev, 0x05, 0xfb); mdelay(1);
1825 break;
1827 case 6: //m78dBm
1828 //DMESG ("RTL8187 + 8225 Initial Gain State 6: -70 dBm \n");
1829 write_phy_ofdm(dev, 0x17, 0x56); mdelay(1);
1830 write_phy_ofdm(dev, 0x24, 0x96); mdelay(1);
1831 write_phy_ofdm(dev, 0x05, 0xfc); mdelay(1);
1832 break;
1834 case 7: //m74dBm
1835 //DMESG("RTL8187 + 8225 Initial Gain State 7: -66 dBm \n");
1836 write_phy_ofdm(dev, 0x17, 0x56); mdelay(1);
1837 write_phy_ofdm(dev, 0x24, 0xa6); mdelay(1);
1838 write_phy_ofdm(dev, 0x05, 0xfc); mdelay(1);
1839 break;
1841 case 8:
1842 //DMESG("RTL8187 + 8225 Initial Gain State 8:\n");
1843 write_phy_ofdm(dev, 0x17, 0x66); mdelay(1);
1844 write_phy_ofdm(dev, 0x24, 0xb6); mdelay(1);
1845 write_phy_ofdm(dev, 0x05, 0xfc); mdelay(1);
1846 break;
1849 default: //MP
1850 //DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm (default)\n");
1851 write_phy_ofdm(dev, 0x17, 0x26); mdelay(1);
1852 write_phy_ofdm(dev, 0x24, 0x86); mdelay(1);
1853 write_phy_ofdm(dev, 0x05, 0xfa); mdelay(1);
1854 break;
1856 break;
1859 default:
1860 DMESG("UpdateInitialGain(): unknown RFChipID: %#X\n", priv->rf_chip);
1861 break;
1864 #ifdef CONFIG_RTL818X_S
1866 // Description:
1867 // Tx Power tracking mechanism routine on 87SE.
1868 // Created by Roger, 2007.12.11.
1870 void
1871 InitTxPwrTracking87SE(
1872 struct net_device *dev
1875 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1876 u32 u4bRfReg;
1878 u4bRfReg = RF_ReadReg(dev, 0x02);
1880 // Enable Thermal meter indication.
1881 //printk("InitTxPwrTracking87SE(): Enable thermal meter indication, Write RF[0x02] = %#x", u4bRfReg|PWR_METER_EN);
1882 RF_WriteReg(dev, 0x02, u4bRfReg|PWR_METER_EN); mdelay(1);
1885 #endif
1886 void
1887 PhyConfig8185(
1888 struct net_device *dev
1891 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1892 write_nic_dword(dev, RCR, priv->ReceiveConfig);
1893 priv->RFProgType = read_nic_byte(dev, CONFIG4) & 0x03;
1894 // RF config
1895 switch(priv->rf_chip)
1897 case RF_ZEBRA2:
1898 case RF_ZEBRA4:
1899 ZEBRA_Config_85BASIC_HardCode( dev);
1900 break;
1902 //{by amy 080312
1903 #ifdef CONFIG_RTL818X_S
1904 // Set default initial gain state to 4, approved by SD3 DZ, by Bruce, 2007-06-06.
1905 if(priv->bDigMechanism)
1907 if(priv->InitialGain == 0)
1908 priv->InitialGain = 4;
1909 //printk("PhyConfig8185(): DIG is enabled, set default initial gain index to %d\n", priv->InitialGain);
1913 // Enable thermal meter indication to implement TxPower tracking on 87SE.
1914 // We initialize thermal meter here to avoid unsuccessful configuration.
1915 // Added by Roger, 2007.12.11.
1917 if(priv->bTxPowerTrack)
1918 InitTxPwrTracking87SE(dev);
1920 #endif
1921 //by amy 080312}
1922 priv->InitialGainBackUp= priv->InitialGain;
1923 UpdateInitialGain(dev);
1925 return;
1931 void
1932 HwConfigureRTL8185(
1933 struct net_device *dev
1936 //RTL8185_TODO: Determine Retrylimit, TxAGC, AutoRateFallback control.
1937 // u8 bUNIVERSAL_CONTROL_RL = 1;
1938 u8 bUNIVERSAL_CONTROL_RL = 0;
1940 u8 bUNIVERSAL_CONTROL_AGC = 1;
1941 u8 bUNIVERSAL_CONTROL_ANT = 1;
1942 u8 bAUTO_RATE_FALLBACK_CTL = 1;
1943 u8 val8;
1944 //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
1945 //struct ieee80211_device *ieee = priv->ieee80211;
1946 //if(IS_WIRELESS_MODE_A(dev) || IS_WIRELESS_MODE_G(dev))
1947 //{by amy 080312 if((ieee->mode == IEEE_G)||(ieee->mode == IEEE_A))
1948 // {
1949 // write_nic_word(dev, BRSR, 0xffff);
1950 // }
1951 // else
1952 // {
1953 // write_nic_word(dev, BRSR, 0x000f);
1954 // }
1955 //by amy 080312}
1956 write_nic_word(dev, BRSR, 0x0fff);
1957 // Retry limit
1958 val8 = read_nic_byte(dev, CW_CONF);
1960 if(bUNIVERSAL_CONTROL_RL)
1961 val8 = val8 & 0xfd;
1962 else
1963 val8 = val8 | 0x02;
1965 write_nic_byte(dev, CW_CONF, val8);
1967 // Tx AGC
1968 val8 = read_nic_byte(dev, TXAGC_CTL);
1969 if(bUNIVERSAL_CONTROL_AGC)
1971 write_nic_byte(dev, CCK_TXAGC, 128);
1972 write_nic_byte(dev, OFDM_TXAGC, 128);
1973 val8 = val8 & 0xfe;
1975 else
1977 val8 = val8 | 0x01 ;
1981 write_nic_byte(dev, TXAGC_CTL, val8);
1983 // Tx Antenna including Feedback control
1984 val8 = read_nic_byte(dev, TXAGC_CTL );
1986 if(bUNIVERSAL_CONTROL_ANT)
1988 write_nic_byte(dev, ANTSEL, 0x00);
1989 val8 = val8 & 0xfd;
1991 else
1993 val8 = val8 & (val8|0x02); //xiong-2006-11-15
1996 write_nic_byte(dev, TXAGC_CTL, val8);
1998 // Auto Rate fallback control
1999 val8 = read_nic_byte(dev, RATE_FALLBACK);
2000 val8 &= 0x7c;
2001 if( bAUTO_RATE_FALLBACK_CTL )
2003 val8 |= RATE_FALLBACK_CTL_ENABLE | RATE_FALLBACK_CTL_AUTO_STEP1;
2005 // <RJ_TODO_8185B> We shall set up the ARFR according to user's setting.
2006 //write_nic_word(dev, ARFR, 0x0fff); // set 1M ~ 54M
2007 //by amy
2008 #if 0
2009 PlatformIOWrite2Byte(dev, ARFR, 0x0fff); // set 1M ~ 54M
2010 #endif
2011 #ifdef CONFIG_RTL818X_S
2012 // Aadded by Roger, 2007.11.15.
2013 PlatformIOWrite2Byte(dev, ARFR, 0x0fff); //set 1M ~ 54Mbps.
2014 #else
2015 PlatformIOWrite2Byte(dev, ARFR, 0x0c00); //set 48Mbps, 54Mbps.
2016 // By SD3 szuyi's request. by Roger, 2007.03.26.
2017 #endif
2018 //by amy
2020 else
2023 write_nic_byte(dev, RATE_FALLBACK, val8);
2028 static void
2029 MacConfig_85BASIC_HardCode(
2030 struct net_device *dev)
2032 //============================================================================
2033 // MACREG.TXT
2034 //============================================================================
2035 int nLinesRead = 0;
2037 u32 u4bRegOffset, u4bRegValue,u4bPageIndex = 0;
2038 int i;
2040 nLinesRead=sizeof(MAC_REG_TABLE)/2;
2042 for(i = 0; i < nLinesRead; i++) //nLinesRead=101
2044 u4bRegOffset=MAC_REG_TABLE[i][0];
2045 u4bRegValue=MAC_REG_TABLE[i][1];
2047 if(u4bRegOffset == 0x5e)
2049 u4bPageIndex = u4bRegValue;
2051 else
2053 u4bRegOffset |= (u4bPageIndex << 8);
2055 //DbgPrint("MAC - 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
2056 write_nic_byte(dev, u4bRegOffset, (u8)u4bRegValue);
2058 //============================================================================
2063 static void
2064 MacConfig_85BASIC(
2065 struct net_device *dev)
2068 u8 u1DA;
2069 MacConfig_85BASIC_HardCode(dev);
2071 //============================================================================
2073 // Follow TID_AC_MAP of WMac.
2074 write_nic_word(dev, TID_AC_MAP, 0xfa50);
2076 // Interrupt Migration, Jong suggested we use set 0x0000 first, 2005.12.14, by rcnjko.
2077 write_nic_word(dev, IntMig, 0x0000);
2079 // Prevent TPC to cause CRC error. Added by Annie, 2006-06-10.
2080 PlatformIOWrite4Byte(dev, 0x1F0, 0x00000000);
2081 PlatformIOWrite4Byte(dev, 0x1F4, 0x00000000);
2082 PlatformIOWrite1Byte(dev, 0x1F8, 0x00);
2084 // Asked for by SD3 CM Lin, 2006.06.27, by rcnjko.
2085 //PlatformIOWrite4Byte(dev, RFTiming, 0x00004001);
2086 //by amy
2087 #if 0
2088 write_nic_dword(dev, RFTiming, 0x00004001);
2089 #endif
2090 #ifdef CONFIG_RTL818X_S
2091 // power save parameter based on "87SE power save parameters 20071127.doc", as follow.
2093 //Enable DA10 TX power saving
2094 u1DA = read_nic_byte(dev, PHYPR);
2095 write_nic_byte(dev, PHYPR, (u1DA | BIT2) );
2097 //POWER:
2098 write_nic_word(dev, 0x360, 0x1000);
2099 write_nic_word(dev, 0x362, 0x1000);
2101 // AFE.
2102 write_nic_word(dev, 0x370, 0x0560);
2103 write_nic_word(dev, 0x372, 0x0560);
2104 write_nic_word(dev, 0x374, 0x0DA4);
2105 write_nic_word(dev, 0x376, 0x0DA4);
2106 write_nic_word(dev, 0x378, 0x0560);
2107 write_nic_word(dev, 0x37A, 0x0560);
2108 write_nic_word(dev, 0x37C, 0x00EC);
2109 // write_nic_word(dev, 0x37E, 0x00FE);//-edward
2110 write_nic_word(dev, 0x37E, 0x00EC);//+edward
2111 #else
2112 write_nic_dword(dev, RFTiming, 0x00004003);
2113 #endif
2114 write_nic_byte(dev, 0x24E,0x01);
2115 //by amy
2123 GetSupportedWirelessMode8185(
2124 struct net_device *dev
2127 u8 btSupportedWirelessMode = 0;
2128 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2130 switch(priv->rf_chip)
2132 case RF_ZEBRA2:
2133 case RF_ZEBRA4:
2134 btSupportedWirelessMode = (WIRELESS_MODE_B | WIRELESS_MODE_G);
2135 break;
2136 default:
2137 btSupportedWirelessMode = WIRELESS_MODE_B;
2138 break;
2141 return btSupportedWirelessMode;
2144 void
2145 ActUpdateChannelAccessSetting(
2146 struct net_device *dev,
2147 WIRELESS_MODE WirelessMode,
2148 PCHANNEL_ACCESS_SETTING ChnlAccessSetting
2151 struct r8180_priv *priv = ieee80211_priv(dev);
2152 struct ieee80211_device *ieee = priv->ieee80211;
2153 AC_CODING eACI;
2154 AC_PARAM AcParam;
2155 //PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
2156 u8 bFollowLegacySetting = 0;
2157 u8 u1bAIFS;
2160 // <RJ_TODO_8185B>
2161 // TODO: We still don't know how to set up these registers, just follow WMAC to
2162 // verify 8185B FPAG.
2164 // <RJ_TODO_8185B>
2165 // Jong said CWmin/CWmax register are not functional in 8185B,
2166 // so we shall fill channel access realted register into AC parameter registers,
2167 // even in nQBss.
2169 ChnlAccessSetting->SIFS_Timer = 0x22; // Suggested by Jong, 2005.12.08.
2170 ChnlAccessSetting->DIFS_Timer = 0x1C; // 2006.06.02, by rcnjko.
2171 ChnlAccessSetting->SlotTimeTimer = 9; // 2006.06.02, by rcnjko.
2172 ChnlAccessSetting->EIFS_Timer = 0x5B; // Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
2173 ChnlAccessSetting->CWminIndex = 3; // 2006.06.02, by rcnjko.
2174 ChnlAccessSetting->CWmaxIndex = 7; // 2006.06.02, by rcnjko.
2176 write_nic_byte(dev, SIFS, ChnlAccessSetting->SIFS_Timer);
2177 //Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SLOT_TIME, &ChnlAccessSetting->SlotTimeTimer ); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
2178 write_nic_byte(dev, SLOT, ChnlAccessSetting->SlotTimeTimer); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
2180 u1bAIFS = aSifsTime + (2 * ChnlAccessSetting->SlotTimeTimer );
2182 //write_nic_byte(dev, AC_VO_PARAM, u1bAIFS);
2183 //write_nic_byte(dev, AC_VI_PARAM, u1bAIFS);
2184 //write_nic_byte(dev, AC_BE_PARAM, u1bAIFS);
2185 //write_nic_byte(dev, AC_BK_PARAM, u1bAIFS);
2187 write_nic_byte(dev, EIFS, ChnlAccessSetting->EIFS_Timer);
2189 write_nic_byte(dev, AckTimeOutReg, 0x5B); // <RJ_EXPR_QOS> Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
2191 #ifdef TODO
2192 // <RJ_TODO_NOW_8185B> Update ECWmin/ECWmax, AIFS, TXOP Limit of each AC to the value defined by SPEC.
2193 if( pStaQos->CurrentQosMode > QOS_DISABLE )
2194 { // QoS mode.
2195 if(pStaQos->QBssWirelessMode == WirelessMode)
2197 // Follow AC Parameters of the QBSS.
2198 for(eACI = 0; eACI < AC_MAX; eACI++)
2200 Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, (pu1Byte)(&(pStaQos->WMMParamEle.AcParam[eACI])) );
2203 else
2205 // Follow Default WMM AC Parameters.
2206 bFollowLegacySetting = 1;
2209 else
2210 #endif
2211 { // Legacy 802.11.
2212 bFollowLegacySetting = 1;
2216 // this setting is copied from rtl8187B. xiong-2006-11-13
2217 if(bFollowLegacySetting)
2222 // Follow 802.11 seeting to AC parameter, all AC shall use the same parameter.
2223 // 2005.12.01, by rcnjko.
2225 AcParam.longData = 0;
2226 AcParam.f.AciAifsn.f.AIFSN = 2; // Follow 802.11 DIFS.
2227 AcParam.f.AciAifsn.f.ACM = 0;
2228 AcParam.f.Ecw.f.ECWmin = ChnlAccessSetting->CWminIndex; // Follow 802.11 CWmin.
2229 AcParam.f.Ecw.f.ECWmax = ChnlAccessSetting->CWmaxIndex; // Follow 802.11 CWmax.
2230 AcParam.f.TXOPLimit = 0;
2232 //lzm reserved 080826
2233 #if 1
2234 #ifdef THOMAS_TURBO
2235 // For turbo mode setting. port from 87B by Isaiah 2008-08-01
2236 if( ieee->current_network.Turbo_Enable == 1 )
2237 AcParam.f.TXOPLimit = 0x01FF;
2238 #endif
2239 // For 87SE with Intel 4965 Ad-Hoc mode have poor throughput (19MB)
2240 if (ieee->iw_mode == IW_MODE_ADHOC)
2241 AcParam.f.TXOPLimit = 0x0020;
2242 #endif
2244 for(eACI = 0; eACI < AC_MAX; eACI++)
2246 AcParam.f.AciAifsn.f.ACI = (u8)eACI;
2248 PAC_PARAM pAcParam = (PAC_PARAM)(&AcParam);
2249 AC_CODING eACI;
2250 u8 u1bAIFS;
2251 u32 u4bAcParam;
2253 // Retrive paramters to udpate.
2254 eACI = pAcParam->f.AciAifsn.f.ACI;
2255 u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * ChnlAccessSetting->SlotTimeTimer + aSifsTime;
2256 u4bAcParam = ( (((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET) |
2257 (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET) |
2258 (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET) |
2259 (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
2261 switch(eACI)
2263 case AC1_BK:
2264 //write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
2265 break;
2267 case AC0_BE:
2268 //write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
2269 break;
2271 case AC2_VI:
2272 //write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
2273 break;
2275 case AC3_VO:
2276 //write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
2277 break;
2279 default:
2280 DMESGW( "SetHwReg8185(): invalid ACI: %d !\n", eACI);
2281 break;
2284 // Cehck ACM bit.
2285 // If it is set, immediately set ACM control bit to downgrading AC for passing WMM testplan. Annie, 2005-12-13.
2286 //write_nic_byte(dev, ACM_CONTROL, pAcParam->f.AciAifsn);
2288 PACI_AIFSN pAciAifsn = (PACI_AIFSN)(&pAcParam->f.AciAifsn);
2289 AC_CODING eACI = pAciAifsn->f.ACI;
2291 //modified Joseph
2292 //for 8187B AsynIORead issue
2293 #ifdef TODO
2294 u8 AcmCtrl = pHalData->AcmControl;
2295 #else
2296 u8 AcmCtrl = 0;
2297 #endif
2298 if( pAciAifsn->f.ACM )
2299 { // ACM bit is 1.
2300 switch(eACI)
2302 case AC0_BE:
2303 AcmCtrl |= (BEQ_ACM_EN|BEQ_ACM_CTL|ACM_HW_EN); // or 0x21
2304 break;
2306 case AC2_VI:
2307 AcmCtrl |= (VIQ_ACM_EN|VIQ_ACM_CTL|ACM_HW_EN); // or 0x42
2308 break;
2310 case AC3_VO:
2311 AcmCtrl |= (VOQ_ACM_EN|VOQ_ACM_CTL|ACM_HW_EN); // or 0x84
2312 break;
2314 default:
2315 DMESGW("SetHwReg8185(): [HW_VAR_ACM_CTRL] ACM set failed: eACI is %d\n", eACI );
2316 break;
2319 else
2320 { // ACM bit is 0.
2321 switch(eACI)
2323 case AC0_BE:
2324 AcmCtrl &= ( (~BEQ_ACM_EN) & (~BEQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0xDE
2325 break;
2327 case AC2_VI:
2328 AcmCtrl &= ( (~VIQ_ACM_EN) & (~VIQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0xBD
2329 break;
2331 case AC3_VO:
2332 AcmCtrl &= ( (~VOQ_ACM_EN) & (~VOQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0x7B
2333 break;
2335 default:
2336 break;
2340 //printk(KERN_WARNING "SetHwReg8185(): [HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl);
2342 #ifdef TO_DO
2343 pHalData->AcmControl = AcmCtrl;
2344 #endif
2345 //write_nic_byte(dev, ACM_CONTROL, AcmCtrl);
2346 write_nic_byte(dev, ACM_CONTROL, 0);
2355 void
2356 ActSetWirelessMode8185(
2357 struct net_device *dev,
2358 u8 btWirelessMode
2361 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2362 struct ieee80211_device *ieee = priv->ieee80211;
2363 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
2364 u8 btSupportedWirelessMode = GetSupportedWirelessMode8185(dev);
2366 if( (btWirelessMode & btSupportedWirelessMode) == 0 )
2367 { // Don't switch to unsupported wireless mode, 2006.02.15, by rcnjko.
2368 DMESGW("ActSetWirelessMode8185(): WirelessMode(%d) is not supported (%d)!\n",
2369 btWirelessMode, btSupportedWirelessMode);
2370 return;
2373 // 1. Assign wireless mode to swtich if necessary.
2374 if (btWirelessMode == WIRELESS_MODE_AUTO)
2376 if((btSupportedWirelessMode & WIRELESS_MODE_A))
2378 btWirelessMode = WIRELESS_MODE_A;
2380 else if((btSupportedWirelessMode & WIRELESS_MODE_G))
2382 btWirelessMode = WIRELESS_MODE_G;
2384 else if((btSupportedWirelessMode & WIRELESS_MODE_B))
2386 btWirelessMode = WIRELESS_MODE_B;
2388 else
2390 DMESGW("ActSetWirelessMode8185(): No valid wireless mode supported, btSupportedWirelessMode(%x)!!!\n",
2391 btSupportedWirelessMode);
2392 btWirelessMode = WIRELESS_MODE_B;
2397 // 2. Swtich band: RF or BB specific actions,
2398 // for example, refresh tables in omc8255, or change initial gain if necessary.
2399 switch(priv->rf_chip)
2401 case RF_ZEBRA2:
2402 case RF_ZEBRA4:
2404 // Nothing to do for Zebra to switch band.
2405 // Update current wireless mode if we swtich to specified band successfully.
2406 ieee->mode = (WIRELESS_MODE)btWirelessMode;
2408 break;
2410 default:
2411 DMESGW("ActSetWirelessMode8185(): unsupported RF: 0x%X !!!\n", priv->rf_chip);
2412 break;
2415 // 3. Change related setting.
2416 if( ieee->mode == WIRELESS_MODE_A ){
2417 DMESG("WIRELESS_MODE_A\n");
2419 else if( ieee->mode == WIRELESS_MODE_B ){
2420 DMESG("WIRELESS_MODE_B\n");
2422 else if( ieee->mode == WIRELESS_MODE_G ){
2423 DMESG("WIRELESS_MODE_G\n");
2426 ActUpdateChannelAccessSetting( dev, ieee->mode, &priv->ChannelAccessSetting);
2429 void rtl8185b_irq_enable(struct net_device *dev)
2431 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2433 priv->irq_enabled = 1;
2434 write_nic_dword(dev, IMR, priv->IntrMask);
2436 //by amy for power save
2437 void
2438 DrvIFIndicateDisassociation(
2439 struct net_device *dev,
2440 u16 reason
2443 //printk("==> DrvIFIndicateDisassociation()\n");
2445 // nothing is needed after disassociation request.
2447 //printk("<== DrvIFIndicateDisassociation()\n");
2449 void
2450 MgntDisconnectIBSS(
2451 struct net_device *dev
2454 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2455 u8 i;
2457 //printk("XXXXXXXXXX MgntDisconnect IBSS\n");
2459 DrvIFIndicateDisassociation(dev, unspec_reason);
2461 // PlatformZeroMemory( pMgntInfo->Bssid, 6 );
2462 for(i=0;i<6;i++) priv->ieee80211->current_network.bssid[i] = 0x55;
2464 priv->ieee80211->state = IEEE80211_NOLINK;
2466 //Stop Beacon.
2468 // Vista add a Adhoc profile, HW radio off untill OID_DOT11_RESET_REQUEST
2469 // Driver would set MSR=NO_LINK, then HW Radio ON, MgntQueue Stuck.
2470 // Because Bcn DMA isn't complete, mgnt queue would stuck until Bcn packet send.
2472 // Disable Beacon Queue Own bit, suggested by jong
2473 // Adapter->HalFunc.SetTxDescOWNHandler(Adapter, BEACON_QUEUE, 0, 0);
2474 ieee80211_stop_send_beacons(priv->ieee80211);
2476 priv->ieee80211->link_change(dev);
2477 notify_wx_assoc_event(priv->ieee80211);
2479 // Stop SW Beacon.Use hw beacon so do not need to do so.by amy
2480 #if 0
2481 if(pMgntInfo->bEnableSwBeaconTimer)
2483 // SwBeaconTimer will stop if pMgntInfo->mIbss==FALSE, see SwBeaconCallback() for details.
2484 // comment out by haich, 2007.10.01
2485 //#if DEV_BUS_TYPE==USB_INTERFACE
2486 PlatformCancelTimer( Adapter, &pMgntInfo->SwBeaconTimer);
2487 //#endif
2489 #endif
2491 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE );
2494 void
2495 MlmeDisassociateRequest(
2496 struct net_device *dev,
2497 u8* asSta,
2498 u8 asRsn
2501 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2502 u8 i;
2504 SendDisassociation(priv->ieee80211, asSta, asRsn );
2506 if( memcmp(priv->ieee80211->current_network.bssid, asSta, 6 ) == 0 ){
2507 //ShuChen TODO: change media status.
2508 //ShuChen TODO: What to do when disassociate.
2509 DrvIFIndicateDisassociation(dev, unspec_reason);
2512 // pMgntInfo->AsocTimestamp = 0;
2513 for(i=0;i<6;i++) priv->ieee80211->current_network.bssid[i] = 0x22;
2514 // pMgntInfo->mBrates.Length = 0;
2515 // Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
2517 ieee80211_disassociate(priv->ieee80211);
2524 void
2525 MgntDisconnectAP(
2526 struct net_device *dev,
2527 u8 asRsn
2530 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2533 // Commented out by rcnjko, 2005.01.27:
2534 // I move SecClearAllKeys() to MgntActSet_802_11_DISASSOCIATE().
2536 // //2004/09/15, kcwu, the key should be cleared, or the new handshaking will not success
2537 // SecClearAllKeys(Adapter);
2539 // In WPA WPA2 need to Clear all key ... because new key will set after new handshaking.
2540 #ifdef TODO
2541 if( pMgntInfo->SecurityInfo.AuthMode > RT_802_11AuthModeAutoSwitch ||
2542 (pMgntInfo->bAPSuportCCKM && pMgntInfo->bCCX8021xenable) ) // In CCKM mode will Clear key
2544 SecClearAllKeys(Adapter);
2545 RT_TRACE(COMP_SEC, DBG_LOUD,("======>CCKM clear key..."))
2547 #endif
2548 // 2004.10.11, by rcnjko.
2549 //MlmeDisassociateRequest( Adapter, pMgntInfo->Bssid, disas_lv_ss );
2550 MlmeDisassociateRequest( dev, priv->ieee80211->current_network.bssid, asRsn );
2552 priv->ieee80211->state = IEEE80211_NOLINK;
2553 // pMgntInfo->AsocTimestamp = 0;
2555 bool
2556 MgntDisconnect(
2557 struct net_device *dev,
2558 u8 asRsn
2561 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2563 // Schedule an workitem to wake up for ps mode, 070109, by rcnjko.
2565 #ifdef TODO
2566 if(pMgntInfo->mPss != eAwake)
2569 // Using AwkaeTimer to prevent mismatch ps state.
2570 // In the timer the state will be changed according to the RF is being awoke or not. By Bruce, 2007-10-31.
2572 // PlatformScheduleWorkItem( &(pMgntInfo->AwakeWorkItem) );
2573 PlatformSetTimer( Adapter, &(pMgntInfo->AwakeTimer), 0 );
2575 #endif
2577 // Indication of disassociation event.
2578 //DrvIFIndicateDisassociation(Adapter, asRsn);
2579 #ifdef ENABLE_DOT11D
2580 if(IS_DOT11D_ENABLE(priv->ieee80211))
2581 Dot11d_Reset(priv->ieee80211);
2582 #endif
2583 // In adhoc mode, update beacon frame.
2584 if( priv->ieee80211->state == IEEE80211_LINKED )
2586 if( priv->ieee80211->iw_mode == IW_MODE_ADHOC )
2588 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectIBSS\n"));
2589 //printk("MgntDisconnect() ===> MgntDisconnectIBSS\n");
2590 MgntDisconnectIBSS(dev);
2592 if( priv->ieee80211->iw_mode == IW_MODE_INFRA )
2594 // We clear key here instead of MgntDisconnectAP() because that
2595 // MgntActSet_802_11_DISASSOCIATE() is an interface called by OS,
2596 // e.g. OID_802_11_DISASSOCIATE in Windows while as MgntDisconnectAP() is
2597 // used to handle disassociation related things to AP, e.g. send Disassoc
2598 // frame to AP. 2005.01.27, by rcnjko.
2599 // SecClearAllKeys(Adapter);
2601 // RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> MgntDisconnectAP\n"));
2602 //printk("MgntDisconnect() ===> MgntDisconnectAP\n");
2603 MgntDisconnectAP(dev, asRsn);
2606 // Inidicate Disconnect, 2005.02.23, by rcnjko.
2607 // MgntIndicateMediaStatus( Adapter, RT_MEDIA_DISCONNECT, GENERAL_INDICATE);
2610 return true;
2613 // Description:
2614 // Chang RF Power State.
2615 // Note that, only MgntActSet_RF_State() is allowed to set HW_VAR_RF_STATE.
2617 // Assumption:
2618 // PASSIVE LEVEL.
2620 bool
2621 SetRFPowerState(
2622 struct net_device *dev,
2623 RT_RF_POWER_STATE eRFPowerState
2626 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2627 bool bResult = false;
2629 // printk("---------> SetRFPowerState(): eRFPowerState(%d)\n", eRFPowerState);
2630 if(eRFPowerState == priv->eRFPowerState)
2632 // printk("<--------- SetRFPowerState(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState);
2633 return bResult;
2636 switch(priv->rf_chip)
2638 case RF_ZEBRA2:
2639 case RF_ZEBRA4:
2640 bResult = SetZebraRFPowerState8185(dev, eRFPowerState);
2641 break;
2643 default:
2644 printk("SetRFPowerState8185(): unknown RFChipID: 0x%X!!!\n", priv->rf_chip);
2645 break;;
2647 // printk("<--------- SetRFPowerState(): bResult(%d)\n", bResult);
2649 return bResult;
2651 void
2652 HalEnableRx8185Dummy(
2653 struct net_device *dev
2657 void
2658 HalDisableRx8185Dummy(
2659 struct net_device *dev
2664 bool
2665 MgntActSet_RF_State(
2666 struct net_device *dev,
2667 RT_RF_POWER_STATE StateToSet,
2668 u32 ChangeSource
2671 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2672 bool bActionAllowed = false;
2673 bool bConnectBySSID = false;
2674 RT_RF_POWER_STATE rtState;
2675 u16 RFWaitCounter = 0;
2676 unsigned long flag;
2677 // printk("===>MgntActSet_RF_State(): StateToSet(%d), ChangeSource(0x%x)\n",StateToSet, ChangeSource);
2679 // Prevent the race condition of RF state change. By Bruce, 2007-11-28.
2680 // Only one thread can change the RF state at one time, and others should wait to be executed.
2682 #if 1
2683 while(true)
2685 // down(&priv->rf_state);
2686 spin_lock_irqsave(&priv->rf_ps_lock,flag);
2687 if(priv->RFChangeInProgress)
2689 // printk("====================>haha111111111\n");
2690 // up(&priv->rf_state);
2691 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): RF Change in progress! Wait to set..StateToSet(%d).\n", StateToSet));
2692 spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
2693 // Set RF after the previous action is done.
2694 while(priv->RFChangeInProgress)
2696 RFWaitCounter ++;
2697 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Wait 1 ms (%d times)...\n", RFWaitCounter));
2698 udelay(1000); // 1 ms
2700 // Wait too long, return FALSE to avoid to be stuck here.
2701 if(RFWaitCounter > 1000) // 1sec
2703 // RT_ASSERT(FALSE, ("MgntActSet_RF_State(): Wait too logn to set RF\n"));
2704 printk("MgntActSet_RF_State(): Wait too long to set RF\n");
2705 // TODO: Reset RF state?
2706 return false;
2710 else
2712 // printk("========================>haha2\n");
2713 priv->RFChangeInProgress = true;
2714 // up(&priv->rf_state);
2715 spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
2716 break;
2719 #endif
2720 rtState = priv->eRFPowerState;
2723 switch(StateToSet)
2725 case eRfOn:
2727 // Turn On RF no matter the IPS setting because we need to update the RF state to Ndis under Vista, or
2728 // the Windows does not allow the driver to perform site survey any more. By Bruce, 2007-10-02.
2730 priv->RfOffReason &= (~ChangeSource);
2732 if(! priv->RfOffReason)
2734 priv->RfOffReason = 0;
2735 bActionAllowed = true;
2737 if(rtState == eRfOff && ChangeSource >=RF_CHANGE_BY_HW && !priv->bInHctTest)
2739 bConnectBySSID = true;
2742 else
2743 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State - eRfon reject pMgntInfo->RfOffReason= 0x%x, ChangeSource=0x%X\n", pMgntInfo->RfOffReason, ChangeSource));
2745 break;
2747 case eRfOff:
2748 // 070125, rcnjko: we always keep connected in AP mode.
2750 if (priv->RfOffReason > RF_CHANGE_BY_IPS)
2753 // 060808, Annie:
2754 // Disconnect to current BSS when radio off. Asked by QuanTa.
2758 // Calling MgntDisconnect() instead of MgntActSet_802_11_DISASSOCIATE(),
2759 // because we do NOT need to set ssid to dummy ones.
2760 // Revised by Roger, 2007.12.04.
2762 MgntDisconnect( dev, disas_lv_ss );
2764 // Clear content of bssDesc[] and bssDesc4Query[] to avoid reporting old bss to UI.
2765 // 2007.05.28, by shien chang.
2766 // PlatformZeroMemory( pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2767 // pMgntInfo->NumBssDesc = 0;
2768 // PlatformZeroMemory( pMgntInfo->bssDesc4Query, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
2769 // pMgntInfo->NumBssDesc4Query = 0;
2774 priv->RfOffReason |= ChangeSource;
2775 bActionAllowed = true;
2776 break;
2778 case eRfSleep:
2779 priv->RfOffReason |= ChangeSource;
2780 bActionAllowed = true;
2781 break;
2783 default:
2784 break;
2787 if(bActionAllowed)
2789 // RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, pMgntInfo->RfOffReason));
2790 // Config HW to the specified mode.
2791 // printk("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, priv->RfOffReason);
2792 SetRFPowerState(dev, StateToSet);
2794 // Turn on RF.
2795 if(StateToSet == eRfOn)
2797 HalEnableRx8185Dummy(dev);
2798 if(bConnectBySSID)
2800 // by amy not supported
2801 // MgntActSet_802_11_SSID(Adapter, Adapter->MgntInfo.Ssid.Octet, Adapter->MgntInfo.Ssid.Length, TRUE );
2804 // Turn off RF.
2805 else if(StateToSet == eRfOff)
2807 HalDisableRx8185Dummy(dev);
2810 else
2812 // printk("MgntActSet_RF_State(): Action is rejected.... StateToSet(%d), ChangeSource(%#X), RfOffReason(%#X)\n", StateToSet, ChangeSource, priv->RfOffReason);
2815 // Release RF spinlock
2816 // down(&priv->rf_state);
2817 spin_lock_irqsave(&priv->rf_ps_lock,flag);
2818 priv->RFChangeInProgress = false;
2819 // up(&priv->rf_state);
2820 spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
2821 // printk("<===MgntActSet_RF_State()\n");
2822 return bActionAllowed;
2824 void
2825 InactivePowerSave(
2826 struct net_device *dev
2829 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2830 //u8 index = 0;
2833 // This flag "bSwRfProcessing", indicates the status of IPS procedure, should be set if the IPS workitem
2834 // is really scheduled.
2835 // The old code, sets this flag before scheduling the IPS workitem and however, at the same time the
2836 // previous IPS workitem did not end yet, fails to schedule the current workitem. Thus, bSwRfProcessing
2837 // blocks the IPS procedure of switching RF.
2838 // By Bruce, 2007-12-25.
2840 priv->bSwRfProcessing = true;
2842 MgntActSet_RF_State(dev, priv->eInactivePowerState, RF_CHANGE_BY_IPS);
2845 // To solve CAM values miss in RF OFF, rewrite CAM values after RF ON. By Bruce, 2007-09-20.
2847 #if 0
2848 while( index < 4 )
2850 if( ( pMgntInfo->SecurityInfo.PairwiseEncAlgorithm == WEP104_Encryption ) ||
2851 (pMgntInfo->SecurityInfo.PairwiseEncAlgorithm == WEP40_Encryption) )
2853 if( pMgntInfo->SecurityInfo.KeyLen[index] != 0)
2854 pAdapter->HalFunc.SetKeyHandler(pAdapter, index, 0, FALSE, pMgntInfo->SecurityInfo.PairwiseEncAlgorithm, TRUE, FALSE);
2857 index++;
2859 #endif
2860 priv->bSwRfProcessing = false;
2864 // Description:
2865 // Enter the inactive power save mode. RF will be off
2866 // 2007.08.17, by shien chang.
2868 void
2869 IPSEnter(
2870 struct net_device *dev
2873 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2874 RT_RF_POWER_STATE rtState;
2875 //printk("==============================>enter IPS\n");
2876 if (priv->bInactivePs)
2878 rtState = priv->eRFPowerState;
2881 // Added by Bruce, 2007-12-25.
2882 // Do not enter IPS in the following conditions:
2883 // (1) RF is already OFF or Sleep
2884 // (2) bSwRfProcessing (indicates the IPS is still under going)
2885 // (3) Connectted (only disconnected can trigger IPS)
2886 // (4) IBSS (send Beacon)
2887 // (5) AP mode (send Beacon)
2889 if (rtState == eRfOn && !priv->bSwRfProcessing
2890 && (priv->ieee80211->state != IEEE80211_LINKED ))
2892 // printk("IPSEnter(): Turn off RF.\n");
2893 priv->eInactivePowerState = eRfOff;
2894 InactivePowerSave(dev);
2897 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2899 void
2900 IPSLeave(
2901 struct net_device *dev
2904 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
2905 RT_RF_POWER_STATE rtState;
2906 //printk("===================================>leave IPS\n");
2907 if (priv->bInactivePs)
2909 rtState = priv->eRFPowerState;
2910 if ((rtState == eRfOff || rtState == eRfSleep) && (!priv->bSwRfProcessing) && priv->RfOffReason <= RF_CHANGE_BY_IPS)
2912 // printk("IPSLeave(): Turn on RF.\n");
2913 priv->eInactivePowerState = eRfOn;
2914 InactivePowerSave(dev);
2917 // printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
2919 //by amy for power save
2920 void rtl8185b_adapter_start(struct net_device *dev)
2922 struct r8180_priv *priv = ieee80211_priv(dev);
2923 struct ieee80211_device *ieee = priv->ieee80211;
2925 u8 SupportedWirelessMode;
2926 u8 InitWirelessMode;
2927 u8 bInvalidWirelessMode = 0;
2928 //int i;
2929 u8 tmpu8;
2930 //u8 u1tmp,u2tmp;
2931 u8 btCR9346;
2932 u8 TmpU1b;
2933 u8 btPSR;
2935 //rtl8180_rtx_disable(dev);
2936 //{by amy 080312
2937 write_nic_byte(dev,0x24e, (BIT5|BIT6|BIT0));
2938 //by amy 080312}
2939 rtl8180_reset(dev);
2941 priv->dma_poll_mask = 0;
2942 priv->dma_poll_stop_mask = 0;
2944 //rtl8180_beacon_tx_disable(dev);
2946 HwConfigureRTL8185(dev);
2948 write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
2949 write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff );
2951 write_nic_byte(dev, MSR, read_nic_byte(dev, MSR) & 0xf3); // default network type to 'No Link'
2953 //write_nic_byte(dev, BRSR, 0x0); // Set BRSR= 1M
2955 write_nic_word(dev, BcnItv, 100);
2956 write_nic_word(dev, AtimWnd, 2);
2958 //PlatformEFIOWrite2Byte(dev, FEMR, 0xFFFF);
2959 PlatformIOWrite2Byte(dev, FEMR, 0xFFFF);
2961 write_nic_byte(dev, WPA_CONFIG, 0);
2963 MacConfig_85BASIC(dev);
2965 // Override the RFSW_CTRL (MAC offset 0x272-0x273), 2006.06.07, by rcnjko.
2966 // BT_DEMO_BOARD type
2967 PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x569a);
2968 //by amy
2969 //#ifdef CONFIG_RTL818X_S
2970 // for jong required
2971 // PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2972 //#endif
2973 //by amy
2974 //BT_QA_BOARD
2975 //PlatformIOWrite2Byte(dev, RFSW_CTRL, 0x9a56);
2977 //-----------------------------------------------------------------------------
2978 // Set up PHY related.
2979 //-----------------------------------------------------------------------------
2980 // Enable Config3.PARAM_En to revise AnaaParm.
2981 write_nic_byte(dev, CR9346, 0xc0); // enable config register write
2982 //by amy
2983 tmpu8 = read_nic_byte(dev, CONFIG3);
2984 #ifdef CONFIG_RTL818X_S
2985 write_nic_byte(dev, CONFIG3, (tmpu8 |CONFIG3_PARM_En) );
2986 #else
2987 write_nic_byte(dev, CONFIG3, (tmpu8 |CONFIG3_PARM_En | CONFIG3_CLKRUN_En) );
2988 #endif
2989 //by amy
2990 // Turn on Analog power.
2991 // Asked for by William, otherwise, MAC 3-wire can't work, 2006.06.27, by rcnjko.
2992 write_nic_dword(dev, ANAPARAM2, ANAPARM2_ASIC_ON);
2993 write_nic_dword(dev, ANAPARAM, ANAPARM_ASIC_ON);
2994 //by amy
2995 #ifdef CONFIG_RTL818X_S
2996 write_nic_word(dev, ANAPARAM3, 0x0010);
2997 #else
2998 write_nic_byte(dev, ANAPARAM3, 0x00);
2999 #endif
3000 //by amy
3002 write_nic_byte(dev, CONFIG3, tmpu8);
3003 write_nic_byte(dev, CR9346, 0x00);
3004 //{by amy 080312 for led
3005 // enable EEM0 and EEM1 in 9346CR
3006 btCR9346 = read_nic_byte(dev, CR9346);
3007 write_nic_byte(dev, CR9346, (btCR9346|0xC0) );
3009 // B cut use LED1 to control HW RF on/off
3010 TmpU1b = read_nic_byte(dev, CONFIG5);
3011 TmpU1b = TmpU1b & ~BIT3;
3012 write_nic_byte(dev,CONFIG5, TmpU1b);
3014 // disable EEM0 and EEM1 in 9346CR
3015 btCR9346 &= ~(0xC0);
3016 write_nic_byte(dev, CR9346, btCR9346);
3018 //Enable Led (suggested by Jong)
3019 // B-cut RF Radio on/off 5e[3]=0
3020 btPSR = read_nic_byte(dev, PSR);
3021 write_nic_byte(dev, PSR, (btPSR | BIT3));
3022 //by amy 080312 for led}
3023 // setup initial timing for RFE.
3024 write_nic_word(dev, RFPinsOutput, 0x0480);
3025 SetOutputEnableOfRfPins(dev);
3026 write_nic_word(dev, RFPinsSelect, 0x2488);
3028 // PHY config.
3029 PhyConfig8185(dev);
3031 // We assume RegWirelessMode has already been initialized before,
3032 // however, we has to validate the wireless mode here and provide a reasonble
3033 // initialized value if necessary. 2005.01.13, by rcnjko.
3034 SupportedWirelessMode = GetSupportedWirelessMode8185(dev);
3035 if( (ieee->mode != WIRELESS_MODE_B) &&
3036 (ieee->mode != WIRELESS_MODE_G) &&
3037 (ieee->mode != WIRELESS_MODE_A) &&
3038 (ieee->mode != WIRELESS_MODE_AUTO))
3039 { // It should be one of B, G, A, or AUTO.
3040 bInvalidWirelessMode = 1;
3042 else
3043 { // One of B, G, A, or AUTO.
3044 // Check if the wireless mode is supported by RF.
3045 if( (ieee->mode != WIRELESS_MODE_AUTO) &&
3046 (ieee->mode & SupportedWirelessMode) == 0 )
3048 bInvalidWirelessMode = 1;
3052 if(bInvalidWirelessMode || ieee->mode==WIRELESS_MODE_AUTO)
3053 { // Auto or other invalid value.
3054 // Assigne a wireless mode to initialize.
3055 if((SupportedWirelessMode & WIRELESS_MODE_A))
3057 InitWirelessMode = WIRELESS_MODE_A;
3059 else if((SupportedWirelessMode & WIRELESS_MODE_G))
3061 InitWirelessMode = WIRELESS_MODE_G;
3063 else if((SupportedWirelessMode & WIRELESS_MODE_B))
3065 InitWirelessMode = WIRELESS_MODE_B;
3067 else
3069 DMESGW("InitializeAdapter8185(): No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n",
3070 SupportedWirelessMode);
3071 InitWirelessMode = WIRELESS_MODE_B;
3074 // Initialize RegWirelessMode if it is not a valid one.
3075 if(bInvalidWirelessMode)
3077 ieee->mode = (WIRELESS_MODE)InitWirelessMode;
3080 else
3081 { // One of B, G, A.
3082 InitWirelessMode = ieee->mode;
3084 //by amy for power save
3085 #ifdef ENABLE_IPS
3086 // printk("initialize ENABLE_IPS\n");
3087 priv->eRFPowerState = eRfOff;
3088 priv->RfOffReason = 0;
3090 // u32 tmp2;
3091 // u32 tmp = jiffies;
3092 MgntActSet_RF_State(dev, eRfOn, 0);
3093 // tmp2 = jiffies;
3094 // printk("rf on cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
3096 // DrvIFIndicateCurrentPhyStatus(priv);
3098 // If inactive power mode is enabled, disable rf while in disconnected state.
3099 // 2007.07.16, by shien chang.
3101 if (priv->bInactivePs)
3103 // u32 tmp2;
3104 // u32 tmp = jiffies;
3105 MgntActSet_RF_State(dev,eRfOff, RF_CHANGE_BY_IPS);
3106 // tmp2 = jiffies;
3107 // printk("rf off cost jiffies:%lx\n", (tmp2-tmp)*1000/HZ);
3110 #endif
3111 // IPSEnter(dev);
3112 //by amy for power save
3113 #ifdef TODO
3114 // Turn off RF if necessary. 2005.08.23, by rcnjko.
3115 // We shall turn off RF after setting CMDR, otherwise,
3116 // RF will be turnned on after we enable MAC Tx/Rx.
3117 if(Adapter->MgntInfo.RegRfOff == TRUE)
3119 SetRFPowerState8185(Adapter, RF_OFF);
3121 else
3123 SetRFPowerState8185(Adapter, RF_ON);
3125 #endif
3127 /* //these is equal with above TODO.
3128 write_nic_byte(dev, CR9346, 0xc0); // enable config register write
3129 write_nic_byte(dev, CONFIG3, read_nic_byte(dev, CONFIG3) | CONFIG3_PARM_En);
3130 RF_WriteReg(dev, 0x4, 0x9FF);
3131 write_nic_dword(dev, ANAPARAM2, ANAPARM2_ASIC_ON);
3132 write_nic_dword(dev, ANAPARAM, ANAPARM_ASIC_ON);
3133 write_nic_byte(dev, CONFIG3, (read_nic_byte(dev, CONFIG3)&(~CONFIG3_PARM_En)));
3134 write_nic_byte(dev, CR9346, 0x00);
3137 ActSetWirelessMode8185(dev, (u8)(InitWirelessMode));
3139 //-----------------------------------------------------------------------------
3141 rtl8185b_irq_enable(dev);
3143 netif_start_queue(dev);
3148 void rtl8185b_rx_enable(struct net_device *dev)
3150 u8 cmd;
3151 //u32 rxconf;
3152 /* for now we accept data, management & ctl frame*/
3153 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3154 #if 0
3155 rxconf=read_nic_dword(dev,RX_CONF);
3156 rxconf = rxconf &~ MAC_FILTER_MASK;
3157 rxconf = rxconf | (1<<ACCEPT_MNG_FRAME_SHIFT);
3158 rxconf = rxconf | (1<<ACCEPT_DATA_FRAME_SHIFT);
3159 rxconf = rxconf | (1<<ACCEPT_BCAST_FRAME_SHIFT);
3160 rxconf = rxconf | (1<<ACCEPT_MCAST_FRAME_SHIFT);
3161 // rxconf = rxconf | (1<<ACCEPT_CRCERR_FRAME_SHIFT);
3162 if (dev->flags & IFF_PROMISC) DMESG ("NIC in promisc mode");
3164 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
3165 dev->flags & IFF_PROMISC){
3166 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
3167 }else{
3168 rxconf = rxconf | (1<<ACCEPT_NICMAC_FRAME_SHIFT);
3169 if(priv->card_8185 == 0)
3170 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
3173 /*if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
3174 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
3175 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
3178 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
3179 rxconf = rxconf | (1<<ACCEPT_CTL_FRAME_SHIFT);
3180 rxconf = rxconf | (1<<ACCEPT_ICVERR_FRAME_SHIFT);
3181 rxconf = rxconf | (1<<ACCEPT_PWR_FRAME_SHIFT);
3184 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
3185 rxconf = rxconf | (1<<ACCEPT_CRCERR_FRAME_SHIFT);
3187 //if(!priv->card_8185){
3188 rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
3189 rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
3192 rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
3193 rxconf = rxconf &~ MAX_RX_DMA_MASK;
3194 rxconf = rxconf | (MAX_RX_DMA_2048<<MAX_RX_DMA_SHIFT);
3196 //if(!priv->card_8185)
3197 rxconf = rxconf | RCR_ONLYERLPKT;
3199 rxconf = rxconf &~ RCR_CS_MASK;
3200 if(!priv->card_8185)
3201 rxconf |= (priv->rcr_csense<<RCR_CS_SHIFT);
3202 // rxconf &=~ 0xfff00000;
3203 // rxconf |= 0x90100000;//9014f76f;
3204 write_nic_dword(dev, RX_CONF, rxconf);
3205 #endif
3207 if (dev->flags & IFF_PROMISC) DMESG ("NIC in promisc mode");
3209 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
3210 dev->flags & IFF_PROMISC){
3211 priv->ReceiveConfig = priv->ReceiveConfig & (~RCR_APM);
3212 priv->ReceiveConfig = priv->ReceiveConfig | RCR_AAP;
3215 /*if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
3216 rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
3217 rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
3220 if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
3221 priv->ReceiveConfig = priv->ReceiveConfig | RCR_ACF | RCR_APWRMGT | RCR_AICV;
3224 if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
3225 priv->ReceiveConfig = priv->ReceiveConfig | RCR_ACRC32;
3227 write_nic_dword(dev, RCR, priv->ReceiveConfig);
3229 fix_rx_fifo(dev);
3231 #ifdef DEBUG_RX
3232 DMESG("rxconf: %x %x",priv->ReceiveConfig ,read_nic_dword(dev,RCR));
3233 #endif
3234 cmd=read_nic_byte(dev,CMD);
3235 write_nic_byte(dev,CMD,cmd | (1<<CMD_RX_ENABLE_SHIFT));
3239 void rtl8185b_tx_enable(struct net_device *dev)
3241 u8 cmd;
3242 //u8 tx_agc_ctl;
3243 u8 byte;
3244 //u32 txconf;
3245 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
3247 #if 0
3248 txconf= read_nic_dword(dev,TX_CONF);
3249 if(priv->card_8185){
3252 byte = read_nic_byte(dev,CW_CONF);
3253 byte &= ~(1<<CW_CONF_PERPACKET_CW_SHIFT);
3254 byte &= ~(1<<CW_CONF_PERPACKET_RETRY_SHIFT);
3255 write_nic_byte(dev, CW_CONF, byte);
3257 tx_agc_ctl = read_nic_byte(dev, TX_AGC_CTL);
3258 tx_agc_ctl &= ~(1<<TX_AGC_CTL_PERPACKET_GAIN_SHIFT);
3259 tx_agc_ctl &= ~(1<<TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT);
3260 tx_agc_ctl |=(1<<TX_AGC_CTL_FEEDBACK_ANT);
3261 write_nic_byte(dev, TX_AGC_CTL, tx_agc_ctl);
3263 write_nic_word(dev, 0x5e, 0x01);
3264 force_pci_posting(dev);
3265 mdelay(1);
3266 write_nic_word(dev, 0xfe, 0x10);
3267 force_pci_posting(dev);
3268 mdelay(1);
3269 write_nic_word(dev, 0x5e, 0x00);
3270 force_pci_posting(dev);
3271 mdelay(1);
3273 write_nic_byte(dev, 0xec, 0x3f); /* Disable early TX */
3276 if(priv->card_8185){
3278 txconf = txconf &~ (1<<TCR_PROBE_NOTIMESTAMP_SHIFT);
3280 }else{
3282 if(hwseqnum)
3283 txconf= txconf &~ (1<<TX_CONF_HEADER_AUTOICREMENT_SHIFT);
3284 else
3285 txconf= txconf | (1<<TX_CONF_HEADER_AUTOICREMENT_SHIFT);
3288 txconf = txconf &~ TX_LOOPBACK_MASK;
3289 txconf = txconf | (TX_LOOPBACK_NONE <<TX_LOOPBACK_SHIFT);
3290 txconf = txconf &~ TCR_DPRETRY_MASK;
3291 txconf = txconf &~ TCR_RTSRETRY_MASK;
3292 txconf = txconf | (priv->retry_data<<TX_DPRETRY_SHIFT);
3293 txconf = txconf | (priv->retry_rts<<TX_RTSRETRY_SHIFT);
3294 txconf = txconf &~ (1<<TX_NOCRC_SHIFT);
3296 if(priv->card_8185){
3297 if(priv->hw_plcp_len)
3298 txconf = txconf &~ TCR_PLCP_LEN;
3299 else
3300 txconf = txconf | TCR_PLCP_LEN;
3301 }else{
3302 txconf = txconf &~ TCR_SAT;
3304 txconf = txconf &~ TCR_MXDMA_MASK;
3305 txconf = txconf | (TCR_MXDMA_2048<<TCR_MXDMA_SHIFT);
3306 txconf = txconf | TCR_CWMIN;
3307 txconf = txconf | TCR_DISCW;
3309 // if(priv->ieee80211->hw_wep)
3310 // txconf=txconf &~ (1<<TX_NOICV_SHIFT);
3311 // else
3312 txconf=txconf | (1<<TX_NOICV_SHIFT);
3314 write_nic_dword(dev,TX_CONF,txconf);
3315 #endif
3317 write_nic_dword(dev, TCR, priv->TransmitConfig);
3318 byte = read_nic_byte(dev, MSR);
3319 byte |= MSR_LINK_ENEDCA;
3320 write_nic_byte(dev, MSR, byte);
3322 fix_tx_fifo(dev);
3324 #ifdef DEBUG_TX
3325 DMESG("txconf: %x %x",priv->TransmitConfig,read_nic_dword(dev,TCR));
3326 #endif
3328 cmd=read_nic_byte(dev,CMD);
3329 write_nic_byte(dev,CMD,cmd | (1<<CMD_TX_ENABLE_SHIFT));
3331 //write_nic_dword(dev,TX_CONF,txconf);
3335 rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
3336 write_nic_byte(dev, TX_DMA_POLLING, priv->dma_poll_mask);
3337 rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
3342 #endif