2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
31 Miniport generic portion header file
35 -------- ---------- ----------------------------------------------
36 Paul Lin 2002-08-01 created
37 John Chang 2004-08-20 RT2561/2661 use scatter-gather scheme
38 Jan Lee 2006-09-15 RT2860. Change for 802.11n , EEPROM, Led, BA, HT.
40 #include "../rt_config.h"
43 UCHAR BIT8[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
44 ULONG BIT32[] = {0x00000001, 0x00000002, 0x00000004, 0x00000008,
45 0x00000010, 0x00000020, 0x00000040, 0x00000080,
46 0x00000100, 0x00000200, 0x00000400, 0x00000800,
47 0x00001000, 0x00002000, 0x00004000, 0x00008000,
48 0x00010000, 0x00020000, 0x00040000, 0x00080000,
49 0x00100000, 0x00200000, 0x00400000, 0x00800000,
50 0x01000000, 0x02000000, 0x04000000, 0x08000000,
51 0x10000000, 0x20000000, 0x40000000, 0x80000000};
53 char* CipherName[] = {"none","wep64","wep128","TKIP","AES","CKIP64","CKIP128"};
55 const unsigned short ccitt_16Table[] = {
56 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
57 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
58 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
59 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
60 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
61 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
62 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
63 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
64 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
65 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
66 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
67 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
68 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
69 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
70 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
71 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
72 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
73 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
74 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
75 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
76 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
77 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
78 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
79 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
80 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
81 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
82 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
83 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
84 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
85 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
86 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
87 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
89 #define ByteCRC16(v, crc) \
90 (unsigned short)((crc << 8) ^ ccitt_16Table[((crc >> 8) ^ (v)) & 255])
92 unsigned char BitReverse(unsigned char x)
98 if(x & 0x80) Temp |= 0x80;
107 // BBP register initialization set
109 REG_PAIR BBPRegTable[] = {
110 {BBP_R65, 0x2C}, // fix rssi issue
111 {BBP_R66, 0x38}, // Also set this default value to pAd->BbpTuning.R66CurrentValue at initial
113 {BBP_R70, 0xa}, // BBP_R70 will change to 0x8 in ApStartUp and LinkUp for rt2860C, otherwise value is 0xa
118 {BBP_R84, 0x99}, // 0x19 is for rt2860E and after. This is for extension channel overlapping IOT. 0x99 is for rt2860D and before
119 {BBP_R86, 0x00}, // middle range issue, Rory @2008-01-28
120 {BBP_R91, 0x04}, // middle range issue, Rory @2008-01-28
121 {BBP_R92, 0x00}, // middle range issue, Rory @2008-01-28
122 {BBP_R103, 0x00}, // near range high-power issue, requested from Gary @2008-0528
123 {BBP_R105, 0x05}, // 0x05 is for rt2860E to turn on FEQ control. It is safe for rt2860D and before, because Bit 7:2 are reserved in rt2860D and before.
125 #define NUM_BBP_REG_PARMS (sizeof(BBPRegTable) / sizeof(REG_PAIR))
128 // RF register initialization set
131 REG_PAIR RT30xx_RFRegTable[] = {
153 #define NUM_RF_REG_PARMS (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR))
157 // ASIC register initialization sets
160 RTMP_REG_PAIR MACRegTable[] = {
161 #if defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x200)
162 {BCN_OFFSET0, 0xf8f0e8e0}, /* 0x3800(e0), 0x3A00(e8), 0x3C00(f0), 0x3E00(f8), 512B for each beacon */
163 {BCN_OFFSET1, 0x6f77d0c8}, /* 0x3200(c8), 0x3400(d0), 0x1DC0(77), 0x1BC0(6f), 512B for each beacon */
164 #elif defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x100)
165 {BCN_OFFSET0, 0xece8e4e0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
166 {BCN_OFFSET1, 0xfcf8f4f0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
168 #error You must re-calculate new value for BCN_OFFSET0 & BCN_OFFSET1 in MACRegTable[]!!!
169 #endif // HW_BEACON_OFFSET //
171 {LEGACY_BASIC_RATE, 0x0000013f}, // Basic rate set bitmap
172 {HT_BASIC_RATE, 0x00008003}, // Basic HT rate set , 20M, MCS=3, MM. Format is the same as in TXWI.
173 {MAC_SYS_CTRL, 0x00}, // 0x1004, , default Disable RX
174 {RX_FILTR_CFG, 0x17f97}, //0x1400 , RX filter control,
175 {BKOFF_SLOT_CFG, 0x209}, // default set short slot time, CC_DELAY_TIME should be 2
176 {TX_SW_CFG0, 0x0}, // Gary,2008-05-21 for CWC test
177 {TX_SW_CFG1, 0x80606}, // Gary,2006-08-23
178 {TX_LINK_CFG, 0x1020}, // Gary,2006-08-23
179 //{TX_TIMEOUT_CFG, 0x00182090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT
180 {TX_TIMEOUT_CFG, 0x000a2090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT , Modify for 2860E ,2007-08-01
181 {MAX_LEN_CFG, MAX_AGGREGATION_SIZE | 0x00001000}, // 0x3018, MAX frame length. Max PSDU = 16kbytes.
182 {LED_CFG, 0x7f031e46}, // Gary, 2006-08-23
183 {PBF_MAX_PCNT, 0x1F3FBF9F}, //0x1F3f7f9f}, //Jan, 2006/04/20
184 //{TX_RTY_CFG, 0x6bb80408}, // Jan, 2006/11/16
185 {TX_RTY_CFG, 0x47d01f0f}, // Jan, 2006/11/16, Set TxWI->ACK =0 in Probe Rsp Modify for 2860E ,2007-08-03
186 {AUTO_RSP_CFG, 0x00000013}, // Initial Auto_Responder, because QA will turn off Auto-Responder
187 {CCK_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled.
188 {OFDM_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled.
190 {PBF_CFG, 0xf40006}, // Only enable Queue 2
191 {MM40_PROT_CFG, 0x3F44084}, // Initial Auto_Responder, because QA will turn off Auto-Responder
192 {WPDMA_GLO_CFG, 0x00000030},
194 {GF20_PROT_CFG, 0x01744004}, // set 19:18 --> Short NAV for MIMO PS
195 {GF40_PROT_CFG, 0x03F44084},
196 {MM20_PROT_CFG, 0x01744004},
197 {TXOP_CTRL_CFG, 0x0000583f, /*0x0000243f*/ /*0x000024bf*/}, //Extension channel backoff.
198 {TX_RTS_CFG, 0x00092b20},
200 {EXP_ACK_TIME, 0x002400ca}, // default value
202 // {EXP_ACK_TIME, 0x005400ca}, // suggested by Gray @ 20070323 for 11n intel-sta throughput
203 //#endif // end - WIFI_TEST //
204 {TXOP_HLDR_ET, 0x00000002},
206 /* Jerry comments 2008/01/16: we use SIFS = 10us in CCK defaultly, but it seems that 10us
207 is too small for INTEL 2200bg card, so in MBSS mode, the delta time between beacon0
208 and beacon1 is SIFS (10us), so if INTEL 2200bg card connects to BSS0, the ping
209 will always lost. So we change the SIFS of CCK from 10us to 16us. */
210 {XIFS_TIME_CFG, 0x33a41010},
211 {PWR_PIN_CFG, 0x00000003}, // patch for 2880-E
215 #ifdef CONFIG_STA_SUPPORT
216 RTMP_REG_PAIR STAMACRegTable[] = {
217 {WMM_AIFSN_CFG, 0x00002273},
218 {WMM_CWMIN_CFG, 0x00002344},
219 {WMM_CWMAX_CFG, 0x000034aa},
221 #endif // CONFIG_STA_SUPPORT //
223 #define NUM_MAC_REG_PARMS (sizeof(MACRegTable) / sizeof(RTMP_REG_PAIR))
224 #ifdef CONFIG_STA_SUPPORT
225 #define NUM_STA_MAC_REG_PARMS (sizeof(STAMACRegTable) / sizeof(RTMP_REG_PAIR))
226 #endif // CONFIG_STA_SUPPORT //
230 // RT2870 Firmware Spec only used 1 oct for version expression
232 #define FIRMWARE_MINOR_VERSION 7
236 // New 8k byte firmware size for RT3071/RT3072
237 #define FIRMWAREIMAGE_MAX_LENGTH 0x2000
238 #define FIRMWAREIMAGE_LENGTH (sizeof (FirmwareImage) / sizeof(UCHAR))
239 #define FIRMWARE_MAJOR_VERSION 0
241 #define FIRMWAREIMAGEV1_LENGTH 0x1000
242 #define FIRMWAREIMAGEV2_LENGTH 0x1000
247 ========================================================================
250 Allocate RTMP_ADAPTER data block and do some initialization
253 Adapter Pointer to our adapter
263 ========================================================================
265 NDIS_STATUS RTMPAllocAdapterBlock(
267 OUT PRTMP_ADAPTER *ppAdapter)
272 UCHAR *pBeaconBuf = NULL;
274 DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocAdapterBlock\n"));
280 // Allocate RTMP_ADAPTER memory block
281 pBeaconBuf = kmalloc(MAX_BEACON_SIZE, MEM_ALLOC_FLAG);
282 if (pBeaconBuf == NULL)
284 Status = NDIS_STATUS_FAILURE;
285 DBGPRINT_ERR(("Failed to allocate memory - BeaconBuf!\n"));
289 Status = AdapterBlockAllocateMemory(handle, (PVOID *)&pAd);
290 if (Status != NDIS_STATUS_SUCCESS)
292 DBGPRINT_ERR(("Failed to allocate memory - ADAPTER\n"));
295 pAd->BeaconBuf = pBeaconBuf;
296 printk("\n\n=== pAd = %p, size = %d ===\n\n", pAd, (UINT32)sizeof(RTMP_ADAPTER));
300 NdisAllocateSpinLock(&pAd->MgmtRingLock);
302 for (index =0 ; index < NUM_OF_TX_RING; index++)
304 NdisAllocateSpinLock(&pAd->TxSwQueueLock[index]);
305 NdisAllocateSpinLock(&pAd->DeQueueLock[index]);
306 pAd->DeQueueRunning[index] = FALSE;
309 NdisAllocateSpinLock(&pAd->irq_lock);
313 if ((Status != NDIS_STATUS_SUCCESS) && (pBeaconBuf))
318 DBGPRINT_S(Status, ("<-- RTMPAllocAdapterBlock, Status=%x\n", Status));
323 ========================================================================
326 Read initial Tx power per MCS and BW from EEPROM
329 Adapter Pointer to our adapter
338 ========================================================================
340 VOID RTMPReadTxPwrPerRate(
341 IN PRTMP_ADAPTER pAd)
343 ULONG data, Adata, Gdata;
344 USHORT i, value, value2;
345 INT Apwrdelta, Gpwrdelta;
347 BOOLEAN bValid, bApwrdeltaMinus = TRUE, bGpwrdeltaMinus = TRUE;
350 // Get power delta for 20MHz and 40MHz.
352 DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n"));
353 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);
357 if ((value2 & 0xff) != 0xff)
360 Gpwrdelta = (value2&0xf);
363 bGpwrdeltaMinus = FALSE;
365 bGpwrdeltaMinus = TRUE;
367 if ((value2 & 0xff00) != 0xff00)
369 if ((value2 & 0x8000))
370 Apwrdelta = ((value2&0xf00)>>8);
372 if ((value2 & 0x4000))
373 bApwrdeltaMinus = FALSE;
375 bApwrdeltaMinus = TRUE;
377 DBGPRINT(RT_DEBUG_TRACE, ("Gpwrdelta = %x, Apwrdelta = %x .\n", Gpwrdelta, Apwrdelta));
380 // Get Txpower per MCS for 20MHz in 2.4G.
384 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4, value);
386 if (bApwrdeltaMinus == FALSE)
388 t1 = (value&0xf)+(Apwrdelta);
391 t2 = ((value&0xf0)>>4)+(Apwrdelta);
394 t3 = ((value&0xf00)>>8)+(Apwrdelta);
397 t4 = ((value&0xf000)>>12)+(Apwrdelta);
403 if ((value&0xf) > Apwrdelta)
404 t1 = (value&0xf)-(Apwrdelta);
407 if (((value&0xf0)>>4) > Apwrdelta)
408 t2 = ((value&0xf0)>>4)-(Apwrdelta);
411 if (((value&0xf00)>>8) > Apwrdelta)
412 t3 = ((value&0xf00)>>8)-(Apwrdelta);
415 if (((value&0xf000)>>12) > Apwrdelta)
416 t4 = ((value&0xf000)>>12)-(Apwrdelta);
420 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
421 if (bGpwrdeltaMinus == FALSE)
423 t1 = (value&0xf)+(Gpwrdelta);
426 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
429 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
432 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
438 if ((value&0xf) > Gpwrdelta)
439 t1 = (value&0xf)-(Gpwrdelta);
442 if (((value&0xf0)>>4) > Gpwrdelta)
443 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
446 if (((value&0xf00)>>8) > Gpwrdelta)
447 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
450 if (((value&0xf000)>>12) > Gpwrdelta)
451 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
455 Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
457 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2, value);
458 if (bApwrdeltaMinus == FALSE)
460 t1 = (value&0xf)+(Apwrdelta);
463 t2 = ((value&0xf0)>>4)+(Apwrdelta);
466 t3 = ((value&0xf00)>>8)+(Apwrdelta);
469 t4 = ((value&0xf000)>>12)+(Apwrdelta);
475 if ((value&0xf) > Apwrdelta)
476 t1 = (value&0xf)-(Apwrdelta);
479 if (((value&0xf0)>>4) > Apwrdelta)
480 t2 = ((value&0xf0)>>4)-(Apwrdelta);
483 if (((value&0xf00)>>8) > Apwrdelta)
484 t3 = ((value&0xf00)>>8)-(Apwrdelta);
487 if (((value&0xf000)>>12) > Apwrdelta)
488 t4 = ((value&0xf000)>>12)-(Apwrdelta);
492 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
493 if (bGpwrdeltaMinus == FALSE)
495 t1 = (value&0xf)+(Gpwrdelta);
498 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
501 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
504 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
510 if ((value&0xf) > Gpwrdelta)
511 t1 = (value&0xf)-(Gpwrdelta);
514 if (((value&0xf0)>>4) > Gpwrdelta)
515 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
518 if (((value&0xf00)>>8) > Gpwrdelta)
519 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
522 if (((value&0xf000)>>12) > Gpwrdelta)
523 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
527 Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
530 pAd->Tx20MPwrCfgABand[i] = pAd->Tx40MPwrCfgABand[i] = Adata;
531 pAd->Tx20MPwrCfgGBand[i] = pAd->Tx40MPwrCfgGBand[i] = Gdata;
533 if (data != 0xffffffff)
534 RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, data);
535 DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 2.4G band-%lx, Adata = %lx, Gdata = %lx \n", data, Adata, Gdata));
539 // Check this block is valid for 40MHz in 2.4G. If invalid, use parameter for 20MHz in 2.4G
544 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + 2 + i*2, value);
545 if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
553 // Get Txpower per MCS for 40MHz in 2.4G.
559 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4, value);
560 if (bGpwrdeltaMinus == FALSE)
562 t1 = (value&0xf)+(Gpwrdelta);
565 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
568 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
571 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
577 if ((value&0xf) > Gpwrdelta)
578 t1 = (value&0xf)-(Gpwrdelta);
581 if (((value&0xf0)>>4) > Gpwrdelta)
582 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
585 if (((value&0xf00)>>8) > Gpwrdelta)
586 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
589 if (((value&0xf000)>>12) > Gpwrdelta)
590 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
594 Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
596 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4 + 2, value);
597 if (bGpwrdeltaMinus == FALSE)
599 t1 = (value&0xf)+(Gpwrdelta);
602 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
605 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
608 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
614 if ((value&0xf) > Gpwrdelta)
615 t1 = (value&0xf)-(Gpwrdelta);
618 if (((value&0xf0)>>4) > Gpwrdelta)
619 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
622 if (((value&0xf00)>>8) > Gpwrdelta)
623 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
626 if (((value&0xf000)>>12) > Gpwrdelta)
627 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
631 Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
634 pAd->Tx40MPwrCfgGBand[i+1] = (pAd->Tx40MPwrCfgGBand[i+1] & 0x0000FFFF) | (Gdata & 0xFFFF0000);
636 pAd->Tx40MPwrCfgGBand[i+1] = Gdata;
638 DBGPRINT_RAW(RT_DEBUG_TRACE, ("40MHz BW, 2.4G band, Gdata = %lx \n", Gdata));
643 // Check this block is valid for 20MHz in 5G. If invalid, use parameter for 20MHz in 2.4G
648 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + 2 + i*2, value);
649 if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
657 // Get Txpower per MCS for 20MHz in 5G.
663 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4, value);
664 if (bApwrdeltaMinus == FALSE)
666 t1 = (value&0xf)+(Apwrdelta);
669 t2 = ((value&0xf0)>>4)+(Apwrdelta);
672 t3 = ((value&0xf00)>>8)+(Apwrdelta);
675 t4 = ((value&0xf000)>>12)+(Apwrdelta);
681 if ((value&0xf) > Apwrdelta)
682 t1 = (value&0xf)-(Apwrdelta);
685 if (((value&0xf0)>>4) > Apwrdelta)
686 t2 = ((value&0xf0)>>4)-(Apwrdelta);
689 if (((value&0xf00)>>8) > Apwrdelta)
690 t3 = ((value&0xf00)>>8)-(Apwrdelta);
693 if (((value&0xf000)>>12) > Apwrdelta)
694 t4 = ((value&0xf000)>>12)-(Apwrdelta);
698 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
700 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4 + 2, value);
701 if (bApwrdeltaMinus == FALSE)
703 t1 = (value&0xf)+(Apwrdelta);
706 t2 = ((value&0xf0)>>4)+(Apwrdelta);
709 t3 = ((value&0xf00)>>8)+(Apwrdelta);
712 t4 = ((value&0xf000)>>12)+(Apwrdelta);
718 if ((value&0xf) > Apwrdelta)
719 t1 = (value&0xf)-(Apwrdelta);
722 if (((value&0xf0)>>4) > Apwrdelta)
723 t2 = ((value&0xf0)>>4)-(Apwrdelta);
726 if (((value&0xf00)>>8) > Apwrdelta)
727 t3 = ((value&0xf00)>>8)-(Apwrdelta);
730 if (((value&0xf000)>>12) > Apwrdelta)
731 t4 = ((value&0xf000)>>12)-(Apwrdelta);
735 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
738 pAd->Tx20MPwrCfgABand[i] = (pAd->Tx20MPwrCfgABand[i] & 0x0000FFFF) | (Adata & 0xFFFF0000);
740 pAd->Tx20MPwrCfgABand[i] = Adata;
742 DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 5GHz band, Adata = %lx \n", Adata));
747 // Check this block is valid for 40MHz in 5G. If invalid, use parameter for 20MHz in 2.4G
752 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + 2 + i*2, value);
753 if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
761 // Get Txpower per MCS for 40MHz in 5G.
767 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4, value);
768 if (bApwrdeltaMinus == FALSE)
770 t1 = (value&0xf)+(Apwrdelta);
773 t2 = ((value&0xf0)>>4)+(Apwrdelta);
776 t3 = ((value&0xf00)>>8)+(Apwrdelta);
779 t4 = ((value&0xf000)>>12)+(Apwrdelta);
785 if ((value&0xf) > Apwrdelta)
786 t1 = (value&0xf)-(Apwrdelta);
789 if (((value&0xf0)>>4) > Apwrdelta)
790 t2 = ((value&0xf0)>>4)-(Apwrdelta);
793 if (((value&0xf00)>>8) > Apwrdelta)
794 t3 = ((value&0xf00)>>8)-(Apwrdelta);
797 if (((value&0xf000)>>12) > Apwrdelta)
798 t4 = ((value&0xf000)>>12)-(Apwrdelta);
802 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
804 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4 + 2, value);
805 if (bApwrdeltaMinus == FALSE)
807 t1 = (value&0xf)+(Apwrdelta);
810 t2 = ((value&0xf0)>>4)+(Apwrdelta);
813 t3 = ((value&0xf00)>>8)+(Apwrdelta);
816 t4 = ((value&0xf000)>>12)+(Apwrdelta);
822 if ((value&0xf) > Apwrdelta)
823 t1 = (value&0xf)-(Apwrdelta);
826 if (((value&0xf0)>>4) > Apwrdelta)
827 t2 = ((value&0xf0)>>4)-(Apwrdelta);
830 if (((value&0xf00)>>8) > Apwrdelta)
831 t3 = ((value&0xf00)>>8)-(Apwrdelta);
834 if (((value&0xf000)>>12) > Apwrdelta)
835 t4 = ((value&0xf000)>>12)-(Apwrdelta);
839 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
842 pAd->Tx40MPwrCfgABand[i+1] = (pAd->Tx40MPwrCfgABand[i+1] & 0x0000FFFF) | (Adata & 0xFFFF0000);
844 pAd->Tx40MPwrCfgABand[i+1] = Adata;
846 DBGPRINT_RAW(RT_DEBUG_TRACE, ("40MHz BW, 5GHz band, Adata = %lx \n", Adata));
853 ========================================================================
856 Read initial channel power parameters from EEPROM
859 Adapter Pointer to our adapter
868 ========================================================================
870 VOID RTMPReadChannelPwr(
871 IN PRTMP_ADAPTER pAd)
874 EEPROM_TX_PWR_STRUC Power;
875 EEPROM_TX_PWR_STRUC Power2;
877 // Read Tx power value for all channels
878 // Value from 1 - 0x7f. Default value is 24.
879 // Power value : 2.4G 0x00 (0) ~ 0x1F (31)
880 // : 5.5G 0xF9 (-7) ~ 0x0F (15)
882 // 0. 11b/g, ch1 - ch 14
883 for (i = 0; i < 7; i++)
885 // Power.word = RTMP_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2);
886 // Power2.word = RTMP_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2);
887 RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2, Power.word);
888 RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2, Power2.word);
889 pAd->TxPower[i * 2].Channel = i * 2 + 1;
890 pAd->TxPower[i * 2 + 1].Channel = i * 2 + 2;
892 if ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0))
893 pAd->TxPower[i * 2].Power = DEFAULT_RF_TX_POWER;
895 pAd->TxPower[i * 2].Power = Power.field.Byte0;
897 if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0))
898 pAd->TxPower[i * 2 + 1].Power = DEFAULT_RF_TX_POWER;
900 pAd->TxPower[i * 2 + 1].Power = Power.field.Byte1;
902 if ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0))
903 pAd->TxPower[i * 2].Power2 = DEFAULT_RF_TX_POWER;
905 pAd->TxPower[i * 2].Power2 = Power2.field.Byte0;
907 if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0))
908 pAd->TxPower[i * 2 + 1].Power2 = DEFAULT_RF_TX_POWER;
910 pAd->TxPower[i * 2 + 1].Power2 = Power2.field.Byte1;
913 // 1. U-NII lower/middle band: 36, 38, 40; 44, 46, 48; 52, 54, 56; 60, 62, 64 (including central frequency in BW 40MHz)
914 // 1.1 Fill up channel
916 for (i = 0; i < 4; i++)
918 pAd->TxPower[3 * i + choffset + 0].Channel = 36 + i * 8 + 0;
919 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
920 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
922 pAd->TxPower[3 * i + choffset + 1].Channel = 36 + i * 8 + 2;
923 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
924 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
926 pAd->TxPower[3 * i + choffset + 2].Channel = 36 + i * 8 + 4;
927 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
928 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
932 for (i = 0; i < 6; i++)
934 // Power.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2);
935 // Power2.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2);
936 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2, Power.word);
937 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2, Power2.word);
939 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
940 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
942 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
943 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
945 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
946 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
948 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
949 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
952 // 2. HipperLAN 2 100, 102 ,104; 108, 110, 112; 116, 118, 120; 124, 126, 128; 132, 134, 136; 140 (including central frequency in BW 40MHz)
953 // 2.1 Fill up channel
955 for (i = 0; i < 5; i++)
957 pAd->TxPower[3 * i + choffset + 0].Channel = 100 + i * 8 + 0;
958 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
959 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
961 pAd->TxPower[3 * i + choffset + 1].Channel = 100 + i * 8 + 2;
962 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
963 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
965 pAd->TxPower[3 * i + choffset + 2].Channel = 100 + i * 8 + 4;
966 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
967 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
969 pAd->TxPower[3 * 5 + choffset + 0].Channel = 140;
970 pAd->TxPower[3 * 5 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
971 pAd->TxPower[3 * 5 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
974 for (i = 0; i < 8; i++)
976 // Power.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2);
977 // Power2.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2);
978 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);
979 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);
981 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
982 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
984 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
985 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
987 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
988 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
990 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
991 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
994 // 3. U-NII upper band: 149, 151, 153; 157, 159, 161; 165 (including central frequency in BW 40MHz)
995 // 3.1 Fill up channel
996 choffset = 14 + 12 + 16;
997 for (i = 0; i < 2; i++)
999 pAd->TxPower[3 * i + choffset + 0].Channel = 149 + i * 8 + 0;
1000 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
1001 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
1003 pAd->TxPower[3 * i + choffset + 1].Channel = 149 + i * 8 + 2;
1004 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
1005 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
1007 pAd->TxPower[3 * i + choffset + 2].Channel = 149 + i * 8 + 4;
1008 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
1009 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
1011 pAd->TxPower[3 * 2 + choffset + 0].Channel = 165;
1012 pAd->TxPower[3 * 2 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
1013 pAd->TxPower[3 * 2 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
1015 // 3.2 Fill up power
1016 for (i = 0; i < 4; i++)
1018 // Power.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2);
1019 // Power2.word = RTMP_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2);
1020 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);
1021 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);
1023 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
1024 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
1026 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
1027 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
1029 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
1030 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
1032 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
1033 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
1036 // 4. Print and Debug
1037 choffset = 14 + 12 + 16 + 7;
1042 ========================================================================
1044 Routine Description:
1045 Read the following from the registry
1046 1. All the parameters
1050 Adapter Pointer to our adapter
1051 WrapperConfigurationContext For use by NdisOpenConfiguration
1056 NDIS_STATUS_RESOURCES
1058 IRQL = PASSIVE_LEVEL
1062 ========================================================================
1064 NDIS_STATUS NICReadRegParameters(
1065 IN PRTMP_ADAPTER pAd,
1066 IN NDIS_HANDLE WrapperConfigurationContext
1069 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
1070 DBGPRINT_S(Status, ("<-- NICReadRegParameters, Status=%x\n", Status));
1077 ========================================================================
1079 Routine Description:
1080 For RF filter calibration purpose
1083 pAd Pointer to our adapter
1088 IRQL = PASSIVE_LEVEL
1090 ========================================================================
1092 VOID RTUSBFilterCalibration(
1093 IN PRTMP_ADAPTER pAd)
1095 UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue;
1096 UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0;
1097 UCHAR RF_R24_Value = 0;
1099 // Give bbp filter initial value
1100 pAd->Mlme.CaliBW20RfR24 = 0x16;
1101 pAd->Mlme.CaliBW40RfR24 = 0x36; //Bit[5] must be 1 for BW 40
1105 if (loop == 1) //BandWidth = 40 MHz
1107 // Write 0x27 to RF_R24 to program filter
1108 RF_R24_Value = 0x27;
1109 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1110 FilterTarget = 0x19;
1112 // when calibrate BW40, BBP mask must set to BW40.
1113 RTUSBReadBBPRegister(pAd, BBP_R4, &BBPValue);
1116 RTUSBWriteBBPRegister(pAd, BBP_R4, BBPValue);
1118 else //BandWidth = 20 MHz
1120 // Write 0x07 to RF_R24 to program filter
1121 RF_R24_Value = 0x07;
1122 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1123 FilterTarget = 0x16;
1126 // Write 0x01 to RF_R22 to enable baseband loopback mode
1127 RT30xxReadRFRegister(pAd, RF_R22, &value);
1129 RT30xxWriteRFRegister(pAd, RF_R22, value);
1131 // Write 0x00 to BBP_R24 to set power & frequency of passband test tone
1132 RTUSBWriteBBPRegister(pAd, BBP_R24, 0);
1136 // Write 0x90 to BBP_R25 to transmit test tone
1137 RTUSBWriteBBPRegister(pAd, BBP_R25, 0x90);
1139 RTMPusecDelay(1000);
1140 // Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0]
1141 RTUSBReadBBPRegister(pAd, BBP_R55, &value);
1142 R55x = value & 0xFF;
1144 } while ((ReTry++ < 100) && (R55x == 0));
1146 // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
1147 RTUSBWriteBBPRegister(pAd, BBP_R24, 0x06);
1151 // Write 0x90 to BBP_R25 to transmit test tone
1152 RTUSBWriteBBPRegister(pAd, BBP_R25, 0x90);
1154 //We need to wait for calibration
1155 RTMPusecDelay(1000);
1156 RTUSBReadBBPRegister(pAd, BBP_R55, &value);
1158 if ((R55x - value) < FilterTarget)
1162 else if ((R55x - value) == FilterTarget)
1172 // prevent infinite loop cause driver hang.
1173 if (loopcnt++ > 100)
1175 DBGPRINT(RT_DEBUG_ERROR, ("RTUSBFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt));
1179 // Write RF_R24 to program filter
1180 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1185 RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));
1188 // Store for future usage
1193 //BandWidth = 20 MHz
1194 pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value;
1198 //BandWidth = 40 MHz
1199 pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value;
1206 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1213 // Set back to initial state
1215 RTUSBWriteBBPRegister(pAd, BBP_R24, 0);
1217 RT30xxReadRFRegister(pAd, RF_R22, &value);
1219 RT30xxWriteRFRegister(pAd, RF_R22, value);
1221 // set BBP back to BW20
1222 RTUSBReadBBPRegister(pAd, BBP_R4, &BBPValue);
1224 RTUSBWriteBBPRegister(pAd, BBP_R4, BBPValue);
1226 DBGPRINT(RT_DEBUG_TRACE, ("RTUSBFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
1230 VOID NICInitRT30xxRFRegisters(IN PRTMP_ADAPTER pAd)
1233 // Driver must read EEPROM to get RfIcType before initial RF registers
1234 // Initialize RF register to default value
1235 if (IS_RT3070(pAd) && ((pAd->RfIcType == RFIC_3020) ||(pAd->RfIcType == RFIC_2020)))
1237 // Init RF calibration
1238 // Driver should toggle RF R30 bit7 before init RF registers
1240 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg);
1242 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1243 RTMPusecDelay(1000);
1245 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1247 // Initialize RF register to default value
1248 for (i = 0; i < NUM_RF_REG_PARMS; i++)
1250 RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
1253 //For RF filter Calibration
1254 RTUSBFilterCalibration(pAd);
1262 ========================================================================
1264 Routine Description:
1265 Read initial parameters from EEPROM
1268 Adapter Pointer to our adapter
1273 IRQL = PASSIVE_LEVEL
1277 ========================================================================
1279 VOID NICReadEEPROMParameters(
1280 IN PRTMP_ADAPTER pAd,
1284 USHORT i, value, value2;
1286 EEPROM_TX_PWR_STRUC Power;
1287 EEPROM_VERSION_STRUC Version;
1288 EEPROM_ANTENNA_STRUC Antenna;
1289 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1291 DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n"));
1293 // Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8
1294 RTMP_IO_READ32(pAd, E2PROM_CSR, &data);
1295 DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%x\n", data));
1297 if((data & 0x30) == 0)
1298 pAd->EEPROMAddressNum = 6; // 93C46
1299 else if((data & 0x30) == 0x10)
1300 pAd->EEPROMAddressNum = 8; // 93C66
1302 pAd->EEPROMAddressNum = 8; // 93C86
1303 DBGPRINT(RT_DEBUG_TRACE, ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum ));
1305 // RT2860 MAC no longer auto load MAC address from E2PROM. Driver has to intialize
1306 // MAC address registers according to E2PROM setting
1307 if (mac_addr == NULL ||
1308 strlen(mac_addr) != 17 ||
1309 mac_addr[2] != ':' || mac_addr[5] != ':' || mac_addr[8] != ':' ||
1310 mac_addr[11] != ':' || mac_addr[14] != ':')
1312 USHORT Addr01,Addr23,Addr45 ;
1314 RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);
1315 RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);
1316 RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);
1318 pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);
1319 pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8);
1320 pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);
1321 pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8);
1322 pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);
1323 pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8);
1325 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from E2PROM \n"));
1334 for (j=0; j<MAC_ADDR_LEN; j++)
1336 AtoH(macptr, &pAd->PermanentAddress[j], 1);
1340 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from module parameter \n"));
1346 USHORT Addr01,Addr23,Addr45 ;
1348 Addr01=RTMP_EEPROM_READ16(pAd, 0x04);
1349 Addr23=RTMP_EEPROM_READ16(pAd, 0x06);
1350 Addr45=RTMP_EEPROM_READ16(pAd, 0x08);
1352 pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);
1353 pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8);
1354 pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);
1355 pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8);
1356 pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);
1357 pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8);
1359 //more conveninet to test mbssid, so ap's bssid &0xf1
1360 if (pAd->PermanentAddress[0] == 0xff)
1361 pAd->PermanentAddress[0] = RandomByte(pAd)&0xf8;
1363 //if (pAd->PermanentAddress[5] == 0xff)
1364 // pAd->PermanentAddress[5] = RandomByte(pAd)&0xf8;
1366 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
1367 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
1368 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
1369 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
1370 if (pAd->bLocalAdminMAC == FALSE)
1374 COPY_MAC_ADDR(pAd->CurrentAddress, pAd->PermanentAddress);
1375 csr2.field.Byte0 = pAd->CurrentAddress[0];
1376 csr2.field.Byte1 = pAd->CurrentAddress[1];
1377 csr2.field.Byte2 = pAd->CurrentAddress[2];
1378 csr2.field.Byte3 = pAd->CurrentAddress[3];
1379 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word);
1381 csr3.field.Byte4 = pAd->CurrentAddress[4];
1382 csr3.field.Byte5 = pAd->CurrentAddress[5];
1383 csr3.field.U2MeMask = 0xff;
1384 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word);
1385 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
1386 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
1387 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
1388 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
1392 // if not return early. cause fail at emulation.
1393 // Init the channel number for TX channel power
1394 RTMPReadChannelPwr(pAd);
1396 // if E2PROM version mismatch with driver's expectation, then skip
1397 // all subsequent E2RPOM retieval and set a system error bit to notify GUI
1398 RT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word);
1399 pAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256;
1400 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: Version = %d, FAE release #%d\n", Version.field.Version, Version.field.FaeReleaseNumber));
1402 if (Version.field.Version > VALID_EEPROM_VERSION)
1404 DBGPRINT_ERR(("E2PROM: WRONG VERSION 0x%x, should be %d\n",Version.field.Version, VALID_EEPROM_VERSION));
1405 /*pAd->SystemErrorBitmap |= 0x00000001;
1407 // hard-code default value when no proper E2PROM installed
1408 pAd->bAutoTxAgcA = FALSE;
1409 pAd->bAutoTxAgcG = FALSE;
1411 // Default the channel power
1412 for (i = 0; i < MAX_NUM_OF_CHANNELS; i++)
1413 pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER;
1415 // Default the channel power
1416 for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++)
1417 pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER;
1419 for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++)
1420 pAd->EEPROMDefaultValue[i] = 0xffff;
1424 // Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd
1425 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value);
1426 pAd->EEPROMDefaultValue[0] = value;
1428 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);
1429 pAd->EEPROMDefaultValue[1] = value;
1431 RT28xx_EEPROM_READ16(pAd, 0x38, value); // Country Region
1432 pAd->EEPROMDefaultValue[2] = value;
1434 for(i = 0; i < 8; i++)
1436 RT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2, value);
1437 pAd->EEPROMDefaultValue[i+3] = value;
1440 // We have to parse NIC configuration 0 at here.
1441 // If TSSI did not have preloaded value, it should reset the TxAutoAgc to false
1442 // Therefore, we have to read TxAutoAgc control beforehand.
1443 // Read Tx AGC control bit
1444 Antenna.word = pAd->EEPROMDefaultValue[0];
1445 if (Antenna.word == 0xFFFF)
1448 Antenna.field.RfIcType = RFIC_2820;
1449 Antenna.field.TxPath = 1;
1450 Antenna.field.RxPath = 2;
1451 DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
1454 // Choose the desired Tx&Rx stream.
1455 if ((pAd->CommonCfg.TxStream == 0) || (pAd->CommonCfg.TxStream > Antenna.field.TxPath))
1456 pAd->CommonCfg.TxStream = Antenna.field.TxPath;
1458 if ((pAd->CommonCfg.RxStream == 0) || (pAd->CommonCfg.RxStream > Antenna.field.RxPath))
1460 pAd->CommonCfg.RxStream = Antenna.field.RxPath;
1462 if ((pAd->MACVersion < RALINK_2883_VERSION) &&
1463 (pAd->CommonCfg.RxStream > 2))
1465 // only 2 Rx streams for RT2860 series
1466 pAd->CommonCfg.RxStream = 2;
1471 // read value from EEPROM and set them to CSR174 ~ 177 in chain0 ~ chain2
1477 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1481 #ifdef CONFIG_STA_SUPPORT
1482 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1484 NicConfig2.word = 0;
1485 if ((NicConfig2.word & 0x00ff) == 0xff)
1487 NicConfig2.word &= 0xff00;
1490 if ((NicConfig2.word >> 8) == 0xff)
1492 NicConfig2.word &= 0x00ff;
1495 #endif // CONFIG_STA_SUPPORT //
1497 if (NicConfig2.field.DynamicTxAgcControl == 1)
1498 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1500 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1502 DBGPRINT_RAW(RT_DEBUG_TRACE, ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n", Antenna.field.RxPath, Antenna.field.TxPath));
1504 // Save the antenna for future use
1505 pAd->Antenna.word = Antenna.word;
1508 // Reset PhyMode if we don't support 802.11a
1509 // Only RFIC_2850 & RFIC_2750 support 802.11a
1511 if ((Antenna.field.RfIcType != RFIC_2850) && (Antenna.field.RfIcType != RFIC_2750))
1513 if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) ||
1514 (pAd->CommonCfg.PhyMode == PHY_11A))
1515 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;
1516 #ifdef DOT11_N_SUPPORT
1517 else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
1518 (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) ||
1519 (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) ||
1520 (pAd->CommonCfg.PhyMode == PHY_11N_5G))
1521 pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED;
1522 #endif // DOT11_N_SUPPORT //
1525 // Read TSSI reference and TSSI boundary for temperature compensation. This is ugly
1528 /* these are tempature reference value (0x00 ~ 0xFE)
1529 ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
1530 TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) +
1531 TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */
1532 RT28xx_EEPROM_READ16(pAd, 0x6E, Power.word);
1533 pAd->TssiMinusBoundaryG[4] = Power.field.Byte0;
1534 pAd->TssiMinusBoundaryG[3] = Power.field.Byte1;
1535 RT28xx_EEPROM_READ16(pAd, 0x70, Power.word);
1536 pAd->TssiMinusBoundaryG[2] = Power.field.Byte0;
1537 pAd->TssiMinusBoundaryG[1] = Power.field.Byte1;
1538 RT28xx_EEPROM_READ16(pAd, 0x72, Power.word);
1539 pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */
1540 pAd->TssiPlusBoundaryG[1] = Power.field.Byte1;
1541 RT28xx_EEPROM_READ16(pAd, 0x74, Power.word);
1542 pAd->TssiPlusBoundaryG[2] = Power.field.Byte0;
1543 pAd->TssiPlusBoundaryG[3] = Power.field.Byte1;
1544 RT28xx_EEPROM_READ16(pAd, 0x76, Power.word);
1545 pAd->TssiPlusBoundaryG[4] = Power.field.Byte0;
1546 pAd->TxAgcStepG = Power.field.Byte1;
1547 pAd->TxAgcCompensateG = 0;
1548 pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;
1549 pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG;
1551 // Disable TxAgc if the based value is not right
1552 if (pAd->TssiRefG == 0xff)
1553 pAd->bAutoTxAgcG = FALSE;
1555 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
1556 pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1],
1558 pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],
1559 pAd->TxAgcStepG, pAd->bAutoTxAgcG));
1563 RT28xx_EEPROM_READ16(pAd, 0xD4, Power.word);
1564 pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;
1565 pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;
1566 RT28xx_EEPROM_READ16(pAd, 0xD6, Power.word);
1567 pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;
1568 pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;
1569 RT28xx_EEPROM_READ16(pAd, 0xD8, Power.word);
1570 pAd->TssiRefA = Power.field.Byte0;
1571 pAd->TssiPlusBoundaryA[1] = Power.field.Byte1;
1572 RT28xx_EEPROM_READ16(pAd, 0xDA, Power.word);
1573 pAd->TssiPlusBoundaryA[2] = Power.field.Byte0;
1574 pAd->TssiPlusBoundaryA[3] = Power.field.Byte1;
1575 RT28xx_EEPROM_READ16(pAd, 0xDC, Power.word);
1576 pAd->TssiPlusBoundaryA[4] = Power.field.Byte0;
1577 pAd->TxAgcStepA = Power.field.Byte1;
1578 pAd->TxAgcCompensateA = 0;
1579 pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;
1580 pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA;
1582 // Disable TxAgc if the based value is not right
1583 if (pAd->TssiRefA == 0xff)
1584 pAd->bAutoTxAgcA = FALSE;
1586 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
1587 pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1],
1589 pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2], pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],
1590 pAd->TxAgcStepA, pAd->bAutoTxAgcA));
1592 pAd->BbpRssiToDbmDelta = 0x0;
1594 // Read frequency offset setting for RF
1595 RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value);
1596 if ((value & 0x00FF) != 0x00FF)
1597 pAd->RfFreqOffset = (ULONG) (value & 0x00FF);
1599 pAd->RfFreqOffset = 0;
1600 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset));
1602 //CountryRegion byte offset (38h)
1603 value = pAd->EEPROMDefaultValue[2] >> 8; // 2.4G band
1604 value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; // 5G band
1606 if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND))
1608 pAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80;
1609 pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;
1610 TmpPhy = pAd->CommonCfg.PhyMode;
1611 pAd->CommonCfg.PhyMode = 0xff;
1612 RTMPSetPhyMode(pAd, TmpPhy);
1613 #ifdef DOT11_N_SUPPORT
1615 #endif // DOT11_N_SUPPORT //
1619 // Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.
1620 // The valid value are (-10 ~ 10)
1622 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value);
1623 pAd->BGRssiOffset0 = value & 0x00ff;
1624 pAd->BGRssiOffset1 = (value >> 8);
1625 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2, value);
1626 pAd->BGRssiOffset2 = value & 0x00ff;
1627 pAd->ALNAGain1 = (value >> 8);
1628 RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value);
1629 pAd->BLNAGain = value & 0x00ff;
1630 pAd->ALNAGain0 = (value >> 8);
1632 // Validate 11b/g RSSI_0 offset.
1633 if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10))
1634 pAd->BGRssiOffset0 = 0;
1636 // Validate 11b/g RSSI_1 offset.
1637 if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))
1638 pAd->BGRssiOffset1 = 0;
1640 // Validate 11b/g RSSI_2 offset.
1641 if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))
1642 pAd->BGRssiOffset2 = 0;
1644 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value);
1645 pAd->ARssiOffset0 = value & 0x00ff;
1646 pAd->ARssiOffset1 = (value >> 8);
1647 RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2), value);
1648 pAd->ARssiOffset2 = value & 0x00ff;
1649 pAd->ALNAGain2 = (value >> 8);
1651 if (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))
1652 pAd->ALNAGain1 = pAd->ALNAGain0;
1653 if (((UCHAR)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00))
1654 pAd->ALNAGain2 = pAd->ALNAGain0;
1656 // Validate 11a RSSI_0 offset.
1657 if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10))
1658 pAd->ARssiOffset0 = 0;
1660 // Validate 11a RSSI_1 offset.
1661 if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))
1662 pAd->ARssiOffset1 = 0;
1664 //Validate 11a RSSI_2 offset.
1665 if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))
1666 pAd->ARssiOffset2 = 0;
1671 RT28xx_EEPROM_READ16(pAd, 0x3a, value);
1672 pAd->LedCntl.word = (value&0xff00) >> 8;
1673 RT28xx_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET, value);
1675 RT28xx_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET, value);
1677 RT28xx_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET, value);
1680 RTMPReadTxPwrPerRate(pAd);
1683 //pAd->CommonCfg.DefineMaxTxPwr = RTMP_EEPROM_READ16(pAd, EEPROM_DEFINE_MAX_TXPWR);
1684 RT28xx_EEPROM_READ16(pAd, EEPROM_DEFINE_MAX_TXPWR, pAd->CommonCfg.DefineMaxTxPwr);
1685 #endif // SINGLE_SKU //
1687 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
1691 ========================================================================
1693 Routine Description:
1694 Set default value from EEPROM
1697 Adapter Pointer to our adapter
1702 IRQL = PASSIVE_LEVEL
1706 ========================================================================
1708 VOID NICInitAsicFromEEPROM(
1709 IN PRTMP_ADAPTER pAd)
1711 #ifdef CONFIG_STA_SUPPORT
1714 #endif // CONFIG_STA_SUPPORT //
1716 EEPROM_ANTENNA_STRUC Antenna;
1717 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1720 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitAsicFromEEPROM\n"));
1721 for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)
1723 UCHAR BbpRegIdx, BbpValue;
1725 if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))
1727 BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);
1728 BbpValue = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);
1729 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);
1733 Antenna.word = pAd->Antenna.word;
1734 pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;
1735 pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;
1737 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1740 // Save the antenna for future use
1741 pAd->NicConfig2.word = NicConfig2.word;
1744 // Send LED Setting to MCU.
1746 if (pAd->LedCntl.word == 0xFF)
1748 pAd->LedCntl.word = 0x01;
1757 AsicSendCommandToMcu(pAd, 0x52, 0xff, (UCHAR)pAd->Led1, (UCHAR)(pAd->Led1 >> 8));
1758 AsicSendCommandToMcu(pAd, 0x53, 0xff, (UCHAR)pAd->Led2, (UCHAR)(pAd->Led2 >> 8));
1759 AsicSendCommandToMcu(pAd, 0x54, 0xff, (UCHAR)pAd->Led3, (UCHAR)(pAd->Led3 >> 8));
1760 pAd->LedIndicatorStregth = 0xFF;
1761 RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, before link up
1763 #ifdef CONFIG_STA_SUPPORT
1764 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1766 // Read Hardware controlled Radio state enable bit
1767 if (NicConfig2.field.HardwareRadioControl == 1)
1769 pAd->StaCfg.bHardwareRadio = TRUE;
1771 // Read GPIO pin2 as Hardware controlled radio state
1772 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
1773 if ((data & 0x04) == 0)
1775 pAd->StaCfg.bHwRadio = FALSE;
1776 pAd->StaCfg.bRadio = FALSE;
1777 // RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);
1778 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
1782 pAd->StaCfg.bHardwareRadio = FALSE;
1784 if (pAd->StaCfg.bRadio == FALSE)
1786 RTMPSetLED(pAd, LED_RADIO_OFF);
1790 RTMPSetLED(pAd, LED_RADIO_ON);
1793 #endif // CONFIG_STA_SUPPORT //
1795 // Turn off patching for cardbus controller
1796 if (NicConfig2.field.CardbusAcceleration == 1)
1798 // pAd->bTest1 = TRUE;
1801 if (NicConfig2.field.DynamicTxAgcControl == 1)
1802 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1804 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1806 // Since BBP has been progamed, to make sure BBP setting will be
1807 // upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND!!
1809 pAd->CommonCfg.BandState = UNKNOWN_BAND;
1811 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
1813 if(pAd->Antenna.field.RxPath == 3)
1817 else if(pAd->Antenna.field.RxPath == 2)
1821 else if(pAd->Antenna.field.RxPath == 1)
1825 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
1827 #ifdef CONFIG_STA_SUPPORT
1828 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1830 // Handle the difference when 1T
1831 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
1832 if(pAd->Antenna.field.TxPath == 1)
1836 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
1838 DBGPRINT(RT_DEBUG_TRACE, ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n", pAd->CommonCfg.bHardwareRadio, pAd->CommonCfg.bHardwareRadio));
1840 #endif // CONFIG_STA_SUPPORT //
1841 DBGPRINT(RT_DEBUG_TRACE, ("TxPath = %d, RxPath = %d, RFIC=%d, Polar+LED mode=%x\n", pAd->Antenna.field.TxPath, pAd->Antenna.field.RxPath, pAd->RfIcType, pAd->LedCntl.word));
1842 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n"));
1846 ========================================================================
1848 Routine Description:
1849 Initialize NIC hardware
1852 Adapter Pointer to our adapter
1857 IRQL = PASSIVE_LEVEL
1861 ========================================================================
1863 NDIS_STATUS NICInitializeAdapter(
1864 IN PRTMP_ADAPTER pAd,
1865 IN BOOLEAN bHardReset)
1867 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
1868 WPDMA_GLO_CFG_STRUC GloCfg;
1869 // INT_MASK_CSR_STRUC IntMask;
1871 AC_TXOP_CSR0_STRUC csr0;
1873 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n"));
1875 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
1880 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
1881 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
1884 RTMPusecDelay(1000);
1887 DBGPRINT(RT_DEBUG_TRACE, ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word));
1888 GloCfg.word &= 0xff0;
1889 GloCfg.field.EnTXWriteBackDDONE =1;
1890 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
1892 // Record HW Beacon offset
1893 pAd->BeaconOffset[0] = HW_BEACON_BASE0;
1894 pAd->BeaconOffset[1] = HW_BEACON_BASE1;
1895 pAd->BeaconOffset[2] = HW_BEACON_BASE2;
1896 pAd->BeaconOffset[3] = HW_BEACON_BASE3;
1897 pAd->BeaconOffset[4] = HW_BEACON_BASE4;
1898 pAd->BeaconOffset[5] = HW_BEACON_BASE5;
1899 pAd->BeaconOffset[6] = HW_BEACON_BASE6;
1900 pAd->BeaconOffset[7] = HW_BEACON_BASE7;
1903 // write all shared Ring's base address into ASIC
1906 // asic simulation sequence put this ahead before loading firmware.
1907 // pbf hardware reset
1909 // Initialze ASIC for TX & Rx operation
1910 if (NICInitializeAsic(pAd , bHardReset) != NDIS_STATUS_SUCCESS)
1914 NICLoadFirmware(pAd);
1917 return NDIS_STATUS_FAILURE;
1925 RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
1926 if (pAd->CommonCfg.PhyMode == PHY_11B)
1928 csr0.field.Ac0Txop = 192; // AC_VI: 192*32us ~= 6ms
1929 csr0.field.Ac1Txop = 96; // AC_VO: 96*32us ~= 3ms
1933 csr0.field.Ac0Txop = 96; // AC_VI: 96*32us ~= 3ms
1934 csr0.field.Ac1Txop = 48; // AC_VO: 48*32us ~= 1.5ms
1936 RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word);
1943 // Status = NICLoadFirmware(pAd);
1945 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n"));
1950 ========================================================================
1952 Routine Description:
1956 Adapter Pointer to our adapter
1961 IRQL = PASSIVE_LEVEL
1965 ========================================================================
1967 NDIS_STATUS NICInitializeAsic(
1968 IN PRTMP_ADAPTER pAd,
1969 IN BOOLEAN bHardReset)
1973 UINT32 MacCsr12 = 0, Counter = 0;
1982 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n"));
1987 // Make sure MAC gets ready after NICLoadFirmware().
1991 //To avoid hang-on issue when interface up in kernel 2.4,
1992 //we use a local variable "MacCsr0" instead of using "pAd->MACVersion" directly.
1995 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
1997 if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
2001 } while (Index++ < 100);
2003 pAd->MACVersion = MacCsr0;
2004 DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
2005 // turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue.
2006 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacCsr12);
2007 MacCsr12 &= (~0x2000);
2008 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacCsr12);
2010 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
2011 RTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);
2012 Status = RTUSBVenderReset(pAd);
2014 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
2016 // Initialize MAC register to default value
2017 for(Index=0; Index<NUM_MAC_REG_PARMS; Index++)
2019 RTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);
2024 // According to Frank Hsu (from Gary Tsao)
2025 RTMP_IO_WRITE32(pAd, (USHORT)TX_SW_CFG0, 0x00000400);
2027 // Initialize RT3070 serial MAC registers which is different from RT2870 serial
2028 RTUSBWriteMACRegister(pAd, TX_SW_CFG1, 0);
2029 RTUSBWriteMACRegister(pAd, TX_SW_CFG2, 0);
2033 #ifdef CONFIG_STA_SUPPORT
2034 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
2036 for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
2038 RTMP_IO_WRITE32(pAd, (USHORT)STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
2041 #endif // CONFIG_STA_SUPPORT //
2045 // Before program BBP, we need to wait BBP/RF get wake up.
2050 RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);
2052 if ((MacCsr12 & 0x03) == 0) // if BB.RF is stable
2055 DBGPRINT(RT_DEBUG_TRACE, ("Check MAC_STATUS_CFG = Busy = %x\n", MacCsr12));
2056 RTMPusecDelay(1000);
2057 } while (Index++ < 100);
2059 // The commands to firmware should be after these commands, these commands will init firmware
2060 // PCI and USB are not the same because PCI driver needs to wait for PCI bus ready
2061 RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); // initialize BBP R/W access agent
2062 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);
2063 RTMPusecDelay(1000);
2065 // Read BBP register, make sure BBP is up and running before write new data
2069 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0);
2070 DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0));
2071 } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00)));
2072 //ASSERT(Index < 20); //this will cause BSOD on Check-build driver
2074 if ((R0 == 0xff) || (R0 == 0x00))
2075 return NDIS_STATUS_FAILURE;
2077 // Initialize BBP register to default value
2078 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
2080 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
2083 // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2084 if ((pAd->MACVersion&0xffff) != 0x0101)
2085 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
2088 //write RT3070 BBP wchich different with 2870 after write RT2870 BBP
2091 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0a);
2092 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x99);
2093 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, 0x05);
2097 if (pAd->MACVersion == 0x28600100)
2099 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2100 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
2103 if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) // 3*3
2105 // enlarge MAX_LEN_CFG
2107 RTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr);
2110 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr);
2115 UCHAR MAC_Value[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0};
2117 //Initialize WCID table
2119 for(Index =0 ;Index < 254;Index++)
2121 RTUSBMultiWrite(pAd, (USHORT)(MAC_WCID_BASE + Index * 8), MAC_Value, 8);
2126 // Add radio off control
2127 #ifdef CONFIG_STA_SUPPORT
2128 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
2130 if (pAd->StaCfg.bRadio == FALSE)
2132 // RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);
2133 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
2134 DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n"));
2137 #endif // CONFIG_STA_SUPPORT //
2139 // Clear raw counters
2140 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
2141 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
2142 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
2143 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
2144 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
2145 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
2147 // ASIC will keep garbage value after boot
2148 // Clear all seared key table when initial
2149 // This routine can be ignored in radio-ON/OFF operation.
2152 for (KeyIdx = 0; KeyIdx < 4; KeyIdx++)
2154 RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0);
2157 // Clear all pairwise key table when initial
2158 for (KeyIdx = 0; KeyIdx < 256; KeyIdx++)
2160 RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
2164 // assert HOST ready bit
2165 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x0); // 2004-09-14 asked by Mark
2166 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x4);
2168 // It isn't necessary to clear this space when not hard reset.
2169 if (bHardReset == TRUE)
2171 // clear all on-chip BEACON frame space
2172 for (apidx = 0; apidx < HW_BEACON_MAX_COUNT; apidx++)
2174 for (i = 0; i < HW_BEACON_OFFSET>>2; i+=4)
2175 RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[apidx] + i, 0x00);
2179 AsicDisableSync(pAd);
2180 // Clear raw counters
2181 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
2182 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
2183 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
2184 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
2185 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
2186 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
2187 // Default PCI clock cycle per ms is different as default setting, which is based on PCI.
2188 RTMP_IO_READ32(pAd, USB_CYC_CFG, &Counter);
2189 Counter&=0xffffff00;
2191 RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
2194 #ifdef CONFIG_STA_SUPPORT
2195 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
2197 // for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT.
2198 if ((pAd->MACVersion&0xffff) != 0x0101)
2199 RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f);
2201 #endif // CONFIG_STA_SUPPORT //
2203 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n"));
2204 return NDIS_STATUS_SUCCESS;
2208 ========================================================================
2210 Routine Description:
2214 Adapter Pointer to our adapter
2219 IRQL = PASSIVE_LEVEL
2222 Reset NIC to initial state AS IS system boot up time.
2224 ========================================================================
2227 IN PRTMP_ADAPTER pAd)
2230 DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n"));
2232 // Abort Tx, prevent ASIC from writing to Host memory
2233 //RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x001f0000);
2235 // Disable Rx, register value supposed will remain after reset
2236 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
2237 Value &= (0xfffffff3);
2238 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
2240 // Issue reset and clear from reset state
2241 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); // 2004-09-17 change from 0x01
2242 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);
2244 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n"));
2248 ========================================================================
2250 Routine Description:
2251 Check ASIC registers and find any reason the system might hang
2254 Adapter Pointer to our adapter
2259 IRQL = DISPATCH_LEVEL
2261 ========================================================================
2263 BOOLEAN NICCheckForHang(
2264 IN PRTMP_ADAPTER pAd)
2269 VOID NICUpdateFifoStaCounters(
2270 IN PRTMP_ADAPTER pAd)
2272 TX_STA_FIFO_STRUC StaFifo;
2273 MAC_TABLE_ENTRY *pEntry;
2275 UCHAR pid = 0, wcid = 0;
2280 /* Nothing to do in ATE mode */
2283 #endif // RALINK_ATE //
2287 RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);
2289 if (StaFifo.field.bValid == 0)
2292 wcid = (UCHAR)StaFifo.field.wcid;
2295 /* ignore NoACK and MGMT frame use 0xFF as WCID */
2296 if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE))
2302 /* PID store Tx MCS Rate */
2303 pid = (UCHAR)StaFifo.field.PidType;
2305 pEntry = &pAd->MacTab.Content[wcid];
2307 pEntry->DebugFIFOCount++;
2309 #ifdef DOT11_N_SUPPORT
2310 if (StaFifo.field.TxBF) // 3*3
2311 pEntry->TxBFCount++;
2312 #endif // DOT11_N_SUPPORT //
2314 #ifdef UAPSD_AP_SUPPORT
2315 UAPSD_SP_AUE_Handle(pAd, pEntry, StaFifo.field.TxSuccess);
2316 #endif // UAPSD_AP_SUPPORT //
2318 if (!StaFifo.field.TxSuccess)
2320 pEntry->FIFOCount++;
2321 pEntry->OneSecTxFailCount++;
2323 if (pEntry->FIFOCount >= 1)
2325 DBGPRINT(RT_DEBUG_TRACE, ("#"));
2327 SendRefreshBAR(pAd, pEntry);
2328 pEntry->NoBADataCountDown = 64;
2330 #ifdef DOT11_N_SUPPORT
2331 pEntry->NoBADataCountDown = 64;
2332 #endif // DOT11_N_SUPPORT //
2334 if(pEntry->PsMode == PWR_ACTIVE)
2336 #ifdef DOT11_N_SUPPORT
2338 for (tid=0; tid<NUM_OF_TID; tid++)
2340 BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, FALSE);
2342 #endif // DOT11_N_SUPPORT //
2344 // Update the continuous transmission counter except PS mode
2345 pEntry->ContinueTxFailCnt++;
2349 // Clear the FIFOCount when sta in Power Save mode. Basically we assume
2350 // this tx error happened due to sta just go to sleep.
2351 pEntry->FIFOCount = 0;
2352 pEntry->ContinueTxFailCnt = 0;
2355 //pEntry->FIFOCount = 0;
2357 //pEntry->bSendBAR = TRUE;
2361 #ifdef DOT11_N_SUPPORT
2362 if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0))
2364 pEntry->NoBADataCountDown--;
2365 if (pEntry->NoBADataCountDown==0)
2367 DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
2370 #endif // DOT11_N_SUPPORT //
2371 pEntry->FIFOCount = 0;
2372 pEntry->OneSecTxNoRetryOkCount++;
2373 // update NoDataIdleCount when sucessful send packet to STA.
2374 pEntry->NoDataIdleCount = 0;
2375 pEntry->ContinueTxFailCnt = 0;
2378 succMCS = StaFifo.field.SuccessRate & 0x7F;
2380 reTry = pid - succMCS;
2382 if (StaFifo.field.TxSuccess)
2384 pEntry->TXMCSExpected[pid]++;
2387 pEntry->TXMCSSuccessful[pid]++;
2391 pEntry->TXMCSAutoFallBack[pid][succMCS]++;
2396 pEntry->TXMCSFailed[pid]++;
2401 if ((pid >= 12) && succMCS <=7)
2405 pEntry->OneSecTxRetryOkCount += reTry;
2409 // ASIC store 16 stack
2410 } while ( i < (2*TX_RING_SIZE) );
2415 ========================================================================
2417 Routine Description:
2418 Read statistical counters from hardware registers and record them
2419 in software variables for later on query
2422 pAd Pointer to our adapter
2427 IRQL = DISPATCH_LEVEL
2429 ========================================================================
2431 VOID NICUpdateRawCounters(
2432 IN PRTMP_ADAPTER pAd)
2435 RX_STA_CNT0_STRUC RxStaCnt0;
2436 RX_STA_CNT1_STRUC RxStaCnt1;
2437 RX_STA_CNT2_STRUC RxStaCnt2;
2438 TX_STA_CNT0_STRUC TxStaCnt0;
2439 TX_STA_CNT1_STRUC StaTx1;
2440 TX_STA_CNT2_STRUC StaTx2;
2441 TX_AGG_CNT_STRUC TxAggCnt;
2442 TX_AGG_CNT0_STRUC TxAggCnt0;
2443 TX_AGG_CNT1_STRUC TxAggCnt1;
2444 TX_AGG_CNT2_STRUC TxAggCnt2;
2445 TX_AGG_CNT3_STRUC TxAggCnt3;
2446 TX_AGG_CNT4_STRUC TxAggCnt4;
2447 TX_AGG_CNT5_STRUC TxAggCnt5;
2448 TX_AGG_CNT6_STRUC TxAggCnt6;
2449 TX_AGG_CNT7_STRUC TxAggCnt7;
2452 RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word);
2453 RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word);
2456 RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);
2457 // Update RX PLCP error counter
2458 pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr;
2459 // Update False CCA counter
2460 pAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca;
2463 // Update FCS counters
2464 OldValue= pAd->WlanCounters.FCSErrorCount.u.LowPart;
2465 pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); // >> 7);
2466 if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue)
2467 pAd->WlanCounters.FCSErrorCount.u.HighPart++;
2469 // Add FCS error count to private counters
2470 pAd->RalinkCounters.OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr;
2471 OldValue = pAd->RalinkCounters.RealFcsErrCount.u.LowPart;
2472 pAd->RalinkCounters.RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr;
2473 if (pAd->RalinkCounters.RealFcsErrCount.u.LowPart < OldValue)
2474 pAd->RalinkCounters.RealFcsErrCount.u.HighPart++;
2476 // Update Duplicate Rcv check
2477 pAd->RalinkCounters.DuplicateRcv += RxStaCnt2.field.RxDupliCount;
2478 pAd->WlanCounters.FrameDuplicateCount.u.LowPart += RxStaCnt2.field.RxDupliCount;
2479 // Update RX Overflow counter
2480 pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount);
2482 //pAd->RalinkCounters.RxCount = 0;
2484 if (pAd->RalinkCounters.RxCount != pAd->watchDogRxCnt)
2486 pAd->watchDogRxCnt = pAd->RalinkCounters.RxCount;
2487 pAd->watchDogRxOverFlowCnt = 0;
2491 if (RxStaCnt2.field.RxFifoOverflowCount)
2492 pAd->watchDogRxOverFlowCnt++;
2494 pAd->watchDogRxOverFlowCnt = 0;
2499 //if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) ||
2500 // (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) && (pAd->MacTab.Size != 1)))
2501 if (!pAd->bUpdateBcnCntDone)
2503 // Update BEACON sent count
2504 RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
2505 RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
2506 RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
2507 pAd->RalinkCounters.OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount;
2508 pAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit;
2509 pAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess;
2510 pAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount;
2511 pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess;
2512 pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit;
2513 pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;
2517 Retry = StaTx1.field.TxRetransmit;
2518 Fail = TxStaCnt0.field.TxFailCount;
2520 OneSecTransmitCount = pAd->WlanCounters.TransmittedFragmentCount.u.LowPart- pAd->WlanCounters.LastTransmittedFragmentCount.u.LowPart;
2521 if ((OneSecTransmitCount+Retry + Fail) > 0)
2522 TxErrorRatio = (( Retry + Fail) *100) / (OneSecTransmitCount+Retry + Fail);
2524 if ((OneSecTransmitCount+Retry + Fail) > 0)
2525 TxErrorRatio = (( Retry + Fail) *100) / (OneSecTransmitCount+Retry + Fail);
2526 DBGPRINT(RT_DEBUG_INFO, ("TX ERROR Rate = %ld %%, Retry = %ld, Fail = %ld, Total = %ld \n",TxErrorRatio, Retry, Fail, (OneSecTransmitCount+Retry + Fail)));
2527 pAd->WlanCounters.LastTransmittedFragmentCount.u.LowPart = pAd->WlanCounters.TransmittedFragmentCount.u.LowPart;
2530 //if (pAd->bStaFifoTest == TRUE)
2532 RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);
2533 RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);
2534 RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);
2535 RTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);
2536 RTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);
2537 RTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word);
2538 RTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word);
2539 RTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word);
2540 RTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word);
2541 pAd->RalinkCounters.TxAggCount += TxAggCnt.field.AggTxCount;
2542 pAd->RalinkCounters.TxNonAggCount += TxAggCnt.field.NonAggTxCount;
2543 pAd->RalinkCounters.TxAgg1MPDUCount += TxAggCnt0.field.AggSize1Count;
2544 pAd->RalinkCounters.TxAgg2MPDUCount += TxAggCnt0.field.AggSize2Count;
2546 pAd->RalinkCounters.TxAgg3MPDUCount += TxAggCnt1.field.AggSize3Count;
2547 pAd->RalinkCounters.TxAgg4MPDUCount += TxAggCnt1.field.AggSize4Count;
2548 pAd->RalinkCounters.TxAgg5MPDUCount += TxAggCnt2.field.AggSize5Count;
2549 pAd->RalinkCounters.TxAgg6MPDUCount += TxAggCnt2.field.AggSize6Count;
2551 pAd->RalinkCounters.TxAgg7MPDUCount += TxAggCnt3.field.AggSize7Count;
2552 pAd->RalinkCounters.TxAgg8MPDUCount += TxAggCnt3.field.AggSize8Count;
2553 pAd->RalinkCounters.TxAgg9MPDUCount += TxAggCnt4.field.AggSize9Count;
2554 pAd->RalinkCounters.TxAgg10MPDUCount += TxAggCnt4.field.AggSize10Count;
2556 pAd->RalinkCounters.TxAgg11MPDUCount += TxAggCnt5.field.AggSize11Count;
2557 pAd->RalinkCounters.TxAgg12MPDUCount += TxAggCnt5.field.AggSize12Count;
2558 pAd->RalinkCounters.TxAgg13MPDUCount += TxAggCnt6.field.AggSize13Count;
2559 pAd->RalinkCounters.TxAgg14MPDUCount += TxAggCnt6.field.AggSize14Count;
2561 pAd->RalinkCounters.TxAgg15MPDUCount += TxAggCnt7.field.AggSize15Count;
2562 pAd->RalinkCounters.TxAgg16MPDUCount += TxAggCnt7.field.AggSize16Count;
2564 // Calculate the transmitted A-MPDU count
2565 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += TxAggCnt0.field.AggSize1Count;
2566 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt0.field.AggSize2Count / 2);
2568 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize3Count / 3);
2569 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize4Count / 4);
2571 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize5Count / 5);
2572 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize6Count / 6);
2574 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize7Count / 7);
2575 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize8Count / 8);
2577 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize9Count / 9);
2578 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize10Count / 10);
2580 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize11Count / 11);
2581 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize12Count / 12);
2583 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize13Count / 13);
2584 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize14Count / 14);
2586 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize15Count / 15);
2587 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count / 16);
2592 RtmpDiagStruct *pDiag;
2593 COUNTER_RALINK *pRalinkCounters;
2594 UCHAR ArrayCurIdx, i;
2596 pDiag = &pAd->DiagStruct;
2597 pRalinkCounters = &pAd->RalinkCounters;
2598 ArrayCurIdx = pDiag->ArrayCurIdx;
2600 if (pDiag->inited == 0)
2602 NdisZeroMemory(pDiag, sizeof(struct _RtmpDiagStrcut_));
2603 pDiag->ArrayStartIdx = pDiag->ArrayCurIdx = 0;
2609 pDiag->TxFailCnt[ArrayCurIdx] = TxStaCnt0.field.TxFailCount;
2610 pDiag->TxAggCnt[ArrayCurIdx] = TxAggCnt.field.AggTxCount;
2611 pDiag->TxNonAggCnt[ArrayCurIdx] = TxAggCnt.field.NonAggTxCount;
2612 pDiag->TxAMPDUCnt[ArrayCurIdx][0] = TxAggCnt0.field.AggSize1Count;
2613 pDiag->TxAMPDUCnt[ArrayCurIdx][1] = TxAggCnt0.field.AggSize2Count;
2614 pDiag->TxAMPDUCnt[ArrayCurIdx][2] = TxAggCnt1.field.AggSize3Count;
2615 pDiag->TxAMPDUCnt[ArrayCurIdx][3] = TxAggCnt1.field.AggSize4Count;
2616 pDiag->TxAMPDUCnt[ArrayCurIdx][4] = TxAggCnt2.field.AggSize5Count;
2617 pDiag->TxAMPDUCnt[ArrayCurIdx][5] = TxAggCnt2.field.AggSize6Count;
2618 pDiag->TxAMPDUCnt[ArrayCurIdx][6] = TxAggCnt3.field.AggSize7Count;
2619 pDiag->TxAMPDUCnt[ArrayCurIdx][7] = TxAggCnt3.field.AggSize8Count;
2620 pDiag->TxAMPDUCnt[ArrayCurIdx][8] = TxAggCnt4.field.AggSize9Count;
2621 pDiag->TxAMPDUCnt[ArrayCurIdx][9] = TxAggCnt4.field.AggSize10Count;
2622 pDiag->TxAMPDUCnt[ArrayCurIdx][10] = TxAggCnt5.field.AggSize11Count;
2623 pDiag->TxAMPDUCnt[ArrayCurIdx][11] = TxAggCnt5.field.AggSize12Count;
2624 pDiag->TxAMPDUCnt[ArrayCurIdx][12] = TxAggCnt6.field.AggSize13Count;
2625 pDiag->TxAMPDUCnt[ArrayCurIdx][13] = TxAggCnt6.field.AggSize14Count;
2626 pDiag->TxAMPDUCnt[ArrayCurIdx][14] = TxAggCnt7.field.AggSize15Count;
2627 pDiag->TxAMPDUCnt[ArrayCurIdx][15] = TxAggCnt7.field.AggSize16Count;
2629 pDiag->RxCrcErrCnt[ArrayCurIdx] = RxStaCnt0.field.CrcErr;
2631 INC_RING_INDEX(pDiag->ArrayCurIdx, DIAGNOSE_TIME);
2632 ArrayCurIdx = pDiag->ArrayCurIdx;
2633 for (i =0; i < 9; i++)
2635 pDiag->TxDescCnt[ArrayCurIdx][i]= 0;
2636 pDiag->TxSWQueCnt[ArrayCurIdx][i] =0;
2637 pDiag->TxMcsCnt[ArrayCurIdx][i] = 0;
2638 pDiag->RxMcsCnt[ArrayCurIdx][i] = 0;
2640 pDiag->TxDataCnt[ArrayCurIdx] = 0;
2641 pDiag->TxFailCnt[ArrayCurIdx] = 0;
2642 pDiag->RxDataCnt[ArrayCurIdx] = 0;
2643 pDiag->RxCrcErrCnt[ArrayCurIdx] = 0;
2644 // for (i = 9; i < 16; i++)
2645 for (i = 9; i < 24; i++) // 3*3
2647 pDiag->TxDescCnt[ArrayCurIdx][i] = 0;
2648 pDiag->TxMcsCnt[ArrayCurIdx][i] = 0;
2649 pDiag->RxMcsCnt[ArrayCurIdx][i] = 0;
2652 if (pDiag->ArrayCurIdx == pDiag->ArrayStartIdx)
2653 INC_RING_INDEX(pDiag->ArrayStartIdx, DIAGNOSE_TIME);
2657 #endif // DBG_DIAGNOSE //
2664 ========================================================================
2666 Routine Description:
2667 Reset NIC from error
2670 Adapter Pointer to our adapter
2675 IRQL = PASSIVE_LEVEL
2678 Reset NIC from error state
2680 ========================================================================
2682 VOID NICResetFromError(
2683 IN PRTMP_ADAPTER pAd)
2685 // Reset BBP (according to alex, reset ASIC will force reset BBP
2686 // Therefore, skip the reset BBP
2687 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x2);
2689 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
2690 // Remove ASIC from reset state
2691 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
2693 NICInitializeAdapter(pAd, FALSE);
2694 NICInitAsicFromEEPROM(pAd);
2696 // Switch to current channel, since during reset process, the connection should remains on.
2697 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2698 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2702 ========================================================================
2704 Routine Description:
2705 erase 8051 firmware image in MAC ASIC
2708 Adapter Pointer to our adapter
2710 IRQL = PASSIVE_LEVEL
2712 ========================================================================
2714 VOID NICEraseFirmware(
2715 IN PRTMP_ADAPTER pAd)
2719 for(i=0; i<MAX_FIRMWARE_IMAGE_SIZE; i+=4)
2720 RTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, 0);
2722 }/* End of NICEraseFirmware */
2725 ========================================================================
2727 Routine Description:
2728 Load 8051 firmware RT2561.BIN file into MAC ASIC
2731 Adapter Pointer to our adapter
2734 NDIS_STATUS_SUCCESS firmware image load ok
2735 NDIS_STATUS_FAILURE image not found
2737 IRQL = PASSIVE_LEVEL
2739 ========================================================================
2741 NDIS_STATUS NICLoadFirmware(
2742 IN PRTMP_ADAPTER pAd)
2744 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
2745 PUCHAR pFirmwareImage;
2746 ULONG FileLength, Index;
2750 UINT32 Version = (pAd->MACVersion >> 16);
2753 pFirmwareImage = FirmwareImage;
2754 FileLength = sizeof(FirmwareImage);
2756 // New 8k byte firmware size for RT3071/RT3072
2757 //printk("Usb Chip\n");
2758 if (FIRMWAREIMAGE_LENGTH == FIRMWAREIMAGE_MAX_LENGTH)
2759 //The firmware image consists of two parts. One is the origianl and the other is the new.
2762 if ((Version != 0x2860) && (Version != 0x2872) && (Version != 0x3070))
2763 { // Use Firmware V2.
2764 //printk("KH:Use New Version,part2\n");
2765 pFirmwareImage = (PUCHAR)&FirmwareImage[FIRMWAREIMAGEV1_LENGTH];
2766 FileLength = FIRMWAREIMAGEV2_LENGTH;
2770 //printk("KH:Use New Version,part1\n");
2771 pFirmwareImage = FirmwareImage;
2772 FileLength = FIRMWAREIMAGEV1_LENGTH;
2777 DBGPRINT(RT_DEBUG_ERROR, ("KH: bin file should be 8KB.\n"));
2778 Status = NDIS_STATUS_FAILURE;
2784 /* enable Host program ram write selection */
2785 RT28XX_FIRMUD_INIT(pAd);
2787 for(i=0; i<FileLength; i+=4)
2789 firm = pFirmwareImage[i] +
2790 (pFirmwareImage[i+3] << 24) +
2791 (pFirmwareImage[i+2] << 16) +
2792 (pFirmwareImage[i+1] << 8);
2794 RTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, firm);
2797 RT28XX_FIRMUD_END(pAd);
2799 RT28XX_WRITE_FIRMWARE(pAd, pFirmwareImage, FileLength);
2802 /* check if MCU is ready */
2806 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg);
2811 RTMPusecDelay(1000);
2812 } while (Index++ < 1000);
2816 Status = NDIS_STATUS_FAILURE;
2817 DBGPRINT(RT_DEBUG_ERROR, ("NICLoadFirmware: MCU is not ready\n\n\n"));
2821 DBGPRINT(RT_DEBUG_TRACE,
2822 ("<=== %s (src=%s, status=%d)\n", __func__, src, Status));
2824 DBGPRINT(RT_DEBUG_TRACE,
2825 ("<=== %s (status=%d)\n", __func__, Status));
2828 } /* End of NICLoadFirmware */
2832 ========================================================================
2834 Routine Description:
2835 Load Tx rate switching parameters
2838 Adapter Pointer to our adapter
2841 NDIS_STATUS_SUCCESS firmware image load ok
2842 NDIS_STATUS_FAILURE image not found
2844 IRQL = PASSIVE_LEVEL
2847 1. (B0: Valid Item number) (B1:Initial item from zero)
2848 2. Item Number(Dec) Mode(Hex) Current MCS(Dec) TrainUp(Dec) TrainDown(Dec)
2850 ========================================================================
2852 NDIS_STATUS NICLoadRateSwitchingParams(
2853 IN PRTMP_ADAPTER pAd)
2858 NDIS_HANDLE FileHandle;
2859 UINT FileLength = 0, i, j;
2860 PUCHAR pFirmwareImage;
2861 NDIS_STRING FileName;
2862 NDIS_PHYSICAL_ADDRESS HighestAcceptableMax = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
2864 DBGPRINT(RT_DEBUG_TRACE,("===> NICLoadRateSwitchingParams \n"));
2865 pAd->CommonCfg.TxRateTableSize = 0;
2867 if ((pAd->DeviceID == NIC2860_PCI_DEVICE_ID) || (pAd->DeviceID == NIC2860_PCIe_DEVICE_ID))
2869 NdisInitializeString(&FileName,"rate.bin");
2870 DBGPRINT(RT_DEBUG_TRACE, ("NICLoadRateSwitchingParams: load file - rate.bin for tx rate switch \n"));
2874 DBGPRINT_ERR(("NICLoadRateSwitchingParams: wrong DeviceID = 0x%04x, can't find Tx rate switch parameters file\n", pAd->DeviceID));
2875 return NDIS_STATUS_SUCCESS;
2877 NdisOpenFile(&Status, &FileHandle, &FileLength, &FileName, HighestAcceptableMax);
2878 NdisFreeString(FileName);
2880 if (Status != NDIS_STATUS_SUCCESS)
2882 DBGPRINT(RT_DEBUG_ERROR, ("NICLoadRateSwitchingParams: NdisOpenFile() failed, used RateSwitchTable instead\n"));
2883 return NDIS_STATUS_SUCCESS;
2886 if ((FileLength == 0) || (FileLength > (MAX_STEP_OF_TX_RATE_SWITCH+1)*16))
2888 DBGPRINT(RT_DEBUG_ERROR, ("NICLoadRateSwitchingParams: file size is not reasonable, used RateSwitchTable instead\n"));
2890 NdisCloseFile(FileHandle);
2891 return NDIS_STATUS_SUCCESS;
2896 // NDIS_STATUS_SUCCESS means
2897 // The handle at FileHandle is valid for a subsequent call to NdisMapFile.
2899 NdisMapFile(&Status, &pFirmwareImage, FileHandle);
2900 DBGPRINT(RT_DEBUG_TRACE, ("NdisMapFile FileLength=%d\n", FileLength));
2903 for (i=0, j=0; i<FileLength; i++)
2905 if ((i%16) <= 4) // trim reserved field
2907 if (i%16 == 1) // deal with DEC and HEX, only row0 is Hex, others are Dec
2909 RateSwitchTable[j] = *(pFirmwareImage + i);
2913 RateSwitchTable[j] = (*(pFirmwareImage + i)>>4) * 10 + (*(pFirmwareImage + i) & 0x0F);
2920 pAd->CommonCfg.TxRateTableSize = RateSwitchTable[0]; // backup table size
2922 if (Status == NDIS_STATUS_SUCCESS)
2924 NdisUnmapFile(FileHandle);
2925 NdisCloseFile(FileHandle);
2928 DBGPRINT(RT_DEBUG_TRACE,("<=== NICLoadRateSwitchingParams(Valid TxRateTable item number=%d)\n", pAd->CommonCfg.TxRateTableSize));
2930 return NDIS_STATUS_SUCCESS;
2934 ========================================================================
2936 Routine Description:
2937 if pSrc1 all zero with length Length, return 0.
2938 If not all zero, return 1
2947 IRQL = DISPATCH_LEVEL
2951 ========================================================================
2953 ULONG RTMPNotAllZero(
2960 pMem1 = (PUCHAR) pSrc1;
2962 for (Index = 0; Index < Length; Index++)
2964 if (pMem1[Index] != 0x0)
2970 if (Index == Length)
2981 ========================================================================
2983 Routine Description:
2984 Compare two memory block
2987 pSrc1 Pointer to first memory address
2988 pSrc2 Pointer to second memory address
2992 1: pSrc1 memory is larger
2993 2: pSrc2 memory is larger
2995 IRQL = DISPATCH_LEVEL
2999 ========================================================================
3001 ULONG RTMPCompareMemory(
3010 pMem1 = (PUCHAR) pSrc1;
3011 pMem2 = (PUCHAR) pSrc2;
3013 for (Index = 0; Index < Length; Index++)
3015 if (pMem1[Index] > pMem2[Index])
3017 else if (pMem1[Index] < pMem2[Index])
3026 ========================================================================
3028 Routine Description:
3029 Zero out memory block
3032 pSrc1 Pointer to memory address
3038 IRQL = PASSIVE_LEVEL
3039 IRQL = DISPATCH_LEVEL
3043 ========================================================================
3045 VOID RTMPZeroMemory(
3052 pMem = (PUCHAR) pSrc;
3054 for (Index = 0; Index < Length; Index++)
3060 VOID RTMPFillMemory(
3068 pMem = (PUCHAR) pSrc;
3070 for (Index = 0; Index < Length; Index++)
3077 ========================================================================
3079 Routine Description:
3080 Copy data from memory block 1 to memory block 2
3083 pDest Pointer to destination memory address
3084 pSrc Pointer to source memory address
3090 IRQL = PASSIVE_LEVEL
3091 IRQL = DISPATCH_LEVEL
3095 ========================================================================
3097 VOID RTMPMoveMemory(
3106 ASSERT((Length==0) || (pDest && pSrc));
3108 pMem1 = (PUCHAR) pDest;
3109 pMem2 = (PUCHAR) pSrc;
3111 for (Index = 0; Index < Length; Index++)
3113 pMem1[Index] = pMem2[Index];
3118 ========================================================================
3120 Routine Description:
3121 Initialize port configuration structure
3124 Adapter Pointer to our adapter
3129 IRQL = PASSIVE_LEVEL
3133 ========================================================================
3136 IN PRTMP_ADAPTER pAd)
3138 // EDCA_PARM DefaultEdcaParm;
3139 UINT key_index, bss_index;
3141 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit\n"));
3144 // part I. intialize common configuration
3147 pAd->BulkOutReq = 0;
3149 pAd->BulkOutComplete = 0;
3150 pAd->BulkOutCompleteOther = 0;
3151 pAd->BulkOutCompleteCancel = 0;
3153 pAd->BulkInComplete = 0;
3154 pAd->BulkInCompleteFail = 0;
3156 //pAd->QuickTimerP = 100;
3157 //pAd->TurnAggrBulkInCount = 0;
3158 pAd->bUsbTxBulkAggre = 0;
3160 // init as unsed value to ensure driver will set to MCU once.
3161 pAd->LedIndicatorStregth = 0xFF;
3163 pAd->CommonCfg.MaxPktOneTxBulk = 2;
3164 pAd->CommonCfg.TxBulkFactor = 1;
3165 pAd->CommonCfg.RxBulkFactor =1;
3167 pAd->CommonCfg.TxPower = 100; //mW
3169 NdisZeroMemory(&pAd->CommonCfg.IOTestParm, sizeof(pAd->CommonCfg.IOTestParm));
3172 for(key_index=0; key_index<SHARE_KEY_NUM; key_index++)
3174 for(bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++)
3176 pAd->SharedKey[bss_index][key_index].KeyLen = 0;
3177 pAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE;
3181 pAd->Antenna.word = 0;
3182 pAd->CommonCfg.BBPCurrentBW = BW_20;
3184 pAd->LedCntl.word = 0;
3186 pAd->bAutoTxAgcA = FALSE; // Default is OFF
3187 pAd->bAutoTxAgcG = FALSE; // Default is OFF
3188 pAd->RfIcType = RFIC_2820;
3190 // Init timer for reset complete event
3191 pAd->CommonCfg.CentralChannel = 1;
3192 pAd->bForcePrintTX = FALSE;
3193 pAd->bForcePrintRX = FALSE;
3194 pAd->bStaFifoTest = FALSE;
3195 pAd->bProtectionTest = FALSE;
3196 pAd->bHCCATest = FALSE;
3197 pAd->bGenOneHCCA = FALSE;
3198 pAd->CommonCfg.Dsifs = 10; // in units of usec
3199 pAd->CommonCfg.TxPower = 100; //mW
3200 pAd->CommonCfg.TxPowerPercentage = 0xffffffff; // AUTO
3201 pAd->CommonCfg.TxPowerDefault = 0xffffffff; // AUTO
3202 pAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; // use Long preamble on TX by defaut
3203 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
3204 pAd->CommonCfg.RtsThreshold = 2347;
3205 pAd->CommonCfg.FragmentThreshold = 2346;
3206 pAd->CommonCfg.UseBGProtection = 0; // 0: AUTO
3207 pAd->CommonCfg.bEnableTxBurst = TRUE; //0;
3208 pAd->CommonCfg.PhyMode = 0xff; // unknown
3209 pAd->CommonCfg.BandState = UNKNOWN_BAND;
3210 pAd->CommonCfg.RadarDetect.CSPeriod = 10;
3211 pAd->CommonCfg.RadarDetect.CSCount = 0;
3212 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
3213 pAd->CommonCfg.RadarDetect.ChMovingTime = 65;
3214 pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 3;
3215 pAd->CommonCfg.bAPSDCapable = FALSE;
3216 pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
3217 pAd->CommonCfg.TriggerTimerCount = 0;
3218 pAd->CommonCfg.bAPSDForcePowerSave = FALSE;
3219 pAd->CommonCfg.bCountryFlag = FALSE;
3220 pAd->CommonCfg.TxStream = 0;
3221 pAd->CommonCfg.RxStream = 0;
3223 NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI));
3225 #ifdef DOT11_N_SUPPORT
3226 NdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
3227 pAd->HTCEnable = FALSE;
3228 pAd->bBroadComHT = FALSE;
3229 pAd->CommonCfg.bRdg = FALSE;
3231 #ifdef DOT11N_DRAFT3
3232 pAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell; // Unit : TU. 5~1000
3233 pAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell; // Unit : TU. 10~1000
3234 pAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval; // Unit : Second
3235 pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel; // Unit : TU. 200~10000
3236 pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel; // Unit : TU. 20~10000
3237 pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor;
3238 pAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold; // Unit : percentage
3239 pAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);
3240 #endif // DOT11N_DRAFT3 //
3242 NdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
3243 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
3244 pAd->CommonCfg.BACapability.field.MpduDensity = 0;
3245 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
3246 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; //32;
3247 pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; //32;
3248 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit. BACapability = 0x%x\n", pAd->CommonCfg.BACapability.word));
3250 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
3251 BATableInit(pAd, &pAd->BATable);
3253 pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
3254 pAd->CommonCfg.bHTProtect = 1;
3255 pAd->CommonCfg.bMIMOPSEnable = TRUE;
3256 pAd->CommonCfg.bBADecline = FALSE;
3257 pAd->CommonCfg.bDisableReordering = FALSE;
3259 pAd->CommonCfg.TxBASize = 7;
3261 pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
3262 #endif // DOT11_N_SUPPORT //
3264 //pAd->CommonCfg.HTPhyMode.field.BW = BW_20;
3265 //pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO;
3266 //pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800;
3267 //pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE;
3268 pAd->CommonCfg.TxRate = RATE_6;
3270 pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;
3271 pAd->CommonCfg.MlmeTransmit.field.BW = BW_20;
3272 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
3274 pAd->CommonCfg.BeaconPeriod = 100; // in mSec
3277 // part II. intialize STA specific configuration
3279 #ifdef CONFIG_STA_SUPPORT
3280 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3282 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT);
3283 RX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST);
3284 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);
3285 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);
3287 pAd->StaCfg.Psm = PWR_ACTIVE;
3289 pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled;
3290 pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;
3291 pAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled;
3292 pAd->StaCfg.bMixCipher = FALSE;
3293 pAd->StaCfg.DefaultKeyId = 0;
3295 // 802.1x port control
3296 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
3297 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
3298 pAd->StaCfg.LastMicErrorTime = 0;
3299 pAd->StaCfg.MicErrCnt = 0;
3300 pAd->StaCfg.bBlockAssoc = FALSE;
3301 pAd->StaCfg.WpaState = SS_NOTUSE;
3303 pAd->CommonCfg.NdisRadioStateOff = FALSE; // New to support microsoft disable radio with OID command
3305 pAd->StaCfg.RssiTrigger = 0;
3306 NdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(RSSI_SAMPLE));
3307 pAd->StaCfg.RssiTriggerMode = RSSI_TRIGGERED_UPON_BELOW_THRESHOLD;
3308 pAd->StaCfg.AtimWin = 0;
3309 pAd->StaCfg.DefaultListenCount = 3;//default listen count;
3310 pAd->StaCfg.BssType = BSS_INFRA; // BSS_INFRA or BSS_ADHOC or BSS_MONITOR
3311 pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
3312 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
3313 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
3315 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
3316 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
3319 #ifdef EXT_BUILD_CHANNEL_LIST
3320 pAd->StaCfg.IEEE80211dClientMode = Rt802_11_D_None;
3321 #endif // EXT_BUILD_CHANNEL_LIST //
3322 #endif // CONFIG_STA_SUPPORT //
3324 // global variables mXXXX used in MAC protocol state machines
3325 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
3326 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
3327 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
3329 // PHY specification
3330 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; // default PHY mode
3331 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); // CCK use LONG preamble
3333 #ifdef CONFIG_STA_SUPPORT
3334 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3336 // user desired power mode
3337 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
3338 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
3339 pAd->StaCfg.bWindowsACCAMEnable = FALSE;
3342 // CCX v1.0 releated init value
3343 RTMPInitTimer(pAd, &pAd->StaCfg.LeapAuthTimer, GET_TIMER_FUNCTION(LeapAuthTimeout), pAd, FALSE);
3344 pAd->StaCfg.LeapAuthMode = CISCO_AuthModeLEAPNone;
3345 pAd->StaCfg.bCkipOn = FALSE;
3346 #endif // LEAP_SUPPORT //
3348 RTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer, GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec), pAd, FALSE);
3349 pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
3352 pAd->StaCfg.ScanCnt = 0;
3354 // CCX 2.0 control flag init
3355 pAd->StaCfg.CCXEnable = FALSE;
3356 pAd->StaCfg.CCXReqType = MSRN_TYPE_UNUSED;
3357 pAd->StaCfg.CCXQosECWMin = 4;
3358 pAd->StaCfg.CCXQosECWMax = 10;
3360 pAd->StaCfg.bHwRadio = TRUE; // Default Hardware Radio status is On
3361 pAd->StaCfg.bSwRadio = TRUE; // Default Software Radio status is On
3362 pAd->StaCfg.bRadio = TRUE; // bHwRadio && bSwRadio
3363 pAd->StaCfg.bHardwareRadio = FALSE; // Default is OFF
3364 pAd->StaCfg.bShowHiddenSSID = FALSE; // Default no show
3366 // Nitro mode control
3367 pAd->StaCfg.bAutoReconnect = TRUE;
3369 // Save the init time as last scan time, the system should do scan after 2 seconds.
3370 // This patch is for driver wake up from standby mode, system will do scan right away.
3371 pAd->StaCfg.LastScanTime = 0;
3372 NdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE+1);
3373 sprintf(pAd->nickname, "%s", STA_NIC_DEVICE_NAME);
3374 RTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer, GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc), pAd, FALSE);
3375 #ifdef WPA_SUPPLICANT_SUPPORT
3376 pAd->StaCfg.IEEE8021X = FALSE;
3377 pAd->StaCfg.IEEE8021x_required_keys = FALSE;
3378 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
3379 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
3380 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
3381 #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
3382 #endif // WPA_SUPPLICANT_SUPPORT //
3385 #endif // CONFIG_STA_SUPPORT //
3387 // Default for extra information is not valid
3388 pAd->ExtraInfo = EXTRA_INFO_CLEAR;
3390 // Default Config change flag
3391 pAd->bConfigChanged = FALSE;
3394 // part III. AP configurations
3401 // dynamic BBP R66:sensibity tuning to overcome background noise
3402 pAd->BbpTuning.bEnable = TRUE;
3403 pAd->BbpTuning.FalseCcaLowerThreshold = 100;
3404 pAd->BbpTuning.FalseCcaUpperThreshold = 512;
3405 pAd->BbpTuning.R66Delta = 4;
3406 pAd->Mlme.bEnableAutoAntennaCheck = TRUE;
3409 // Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value.
3410 // if not initial this value, the default value will be 0.
3412 pAd->BbpTuning.R66CurrentValue = 0x38;
3414 pAd->Bbp94 = BBPR94_DEFAULT;
3415 pAd->BbpForCCK = FALSE;
3417 // Default is FALSE for test bit 1
3418 //pAd->bTest1 = FALSE;
3420 // initialize MAC table and allocate spin lock
3421 NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));
3422 InitializeQueueHeader(&pAd->MacTab.McastPsQueue);
3423 NdisAllocateSpinLock(&pAd->MacTabLock);
3425 //RTMPInitTimer(pAd, &pAd->RECBATimer, RECBATimerTimeout, pAd, TRUE);
3426 //RTMPSetTimer(&pAd->RECBATimer, REORDER_EXEC_INTV);
3429 NdisZeroMemory(&pAd->ate, sizeof(ATE_INFO));
3430 pAd->ate.Mode = ATE_STOP;
3431 pAd->ate.TxCount = 200;/* to exceed TX_RING_SIZE ... */
3432 pAd->ate.TxLength = 1024;
3433 pAd->ate.TxWI.ShortGI = 0;// LONG GI : 800 ns
3434 pAd->ate.TxWI.PHYMODE = MODE_CCK;
3435 pAd->ate.TxWI.MCS = 3;
3436 pAd->ate.TxWI.BW = BW_20;
3437 pAd->ate.Channel = 1;
3438 pAd->ate.QID = QID_AC_BE;
3439 pAd->ate.Addr1[0] = 0x00;
3440 pAd->ate.Addr1[1] = 0x11;
3441 pAd->ate.Addr1[2] = 0x22;
3442 pAd->ate.Addr1[3] = 0xAA;
3443 pAd->ate.Addr1[4] = 0xBB;
3444 pAd->ate.Addr1[5] = 0xCC;
3445 NdisMoveMemory(pAd->ate.Addr2, pAd->ate.Addr1, ETH_LENGTH_OF_ADDRESS);
3446 NdisMoveMemory(pAd->ate.Addr3, pAd->ate.Addr1, ETH_LENGTH_OF_ADDRESS);
3447 pAd->ate.bRxFer = 0;
3448 pAd->ate.bQATxStart = FALSE;
3449 pAd->ate.bQARxStart = FALSE;
3450 #ifdef RALINK_28xx_QA
3451 //pAd->ate.Repeat = 0;
3452 pAd->ate.TxStatus = 0;
3453 pAd->ate.AtePid = NULL;
3454 #endif // RALINK_28xx_QA //
3455 #endif // RALINK_ATE //
3458 pAd->CommonCfg.bWiFiTest = FALSE;
3461 DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
3464 // IRQL = PASSIVE_LEVEL
3467 if (ch >= '0' && ch <= '9') return (ch - '0'); // Handle numerals
3468 if (ch >= 'A' && ch <= 'F') return (ch - 'A' + 0xA); // Handle capitol hex digits
3469 if (ch >= 'a' && ch <= 'f') return (ch - 'a' + 0xA); // Handle small hex digits
3474 // FUNCTION: AtoH(char *, UCHAR *, int)
3476 // PURPOSE: Converts ascii string to network order hex
3479 // src - pointer to input ascii string
3480 // dest - pointer to output hex
3481 // destlen - size of dest
3485 // 2 ascii bytes make a hex byte so must put 1st ascii byte of pair
3486 // into upper nibble and 2nd ascii byte of pair into lower nibble.
3488 // IRQL = PASSIVE_LEVEL
3490 void AtoH(char * src, UCHAR * dest, int destlen)
3496 destTemp = (PUCHAR) dest;
3500 *destTemp = BtoH(*srcptr++) << 4; // Put 1st ascii byte in upper nibble.
3501 *destTemp += BtoH(*srcptr++); // Add 2nd ascii byte to above.
3506 VOID RTMPPatchMacBbpBug(
3507 IN PRTMP_ADAPTER pAd)
3511 // Initialize BBP register to default value
3512 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
3514 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, (UCHAR)BBPRegTable[Index].Value);
3517 // Initialize RF register to default value
3518 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
3519 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
3521 // Re-init BBP register from EEPROM value
3522 NICInitAsicFromEEPROM(pAd);
3526 ========================================================================
3528 Routine Description:
3532 pAd Pointer to our adapter
3533 pTimer Timer structure
3534 pTimerFunc Function to execute when timer expired
3535 Repeat Ture for period timer
3542 ========================================================================
3545 IN PRTMP_ADAPTER pAd,
3546 IN PRALINK_TIMER_STRUCT pTimer,
3547 IN PVOID pTimerFunc,
3552 // Set Valid to TRUE for later used.
3553 // It will crash if we cancel a timer or set a timer
3554 // that we haven't initialize before.
3556 pTimer->Valid = TRUE;
3558 pTimer->PeriodicType = Repeat;
3559 pTimer->State = FALSE;
3560 pTimer->cookie = (ULONG) pData;
3566 RTMP_OS_Init_Timer(pAd, &pTimer->TimerObj, pTimerFunc, (PVOID) pTimer);
3570 ========================================================================
3572 Routine Description:
3576 pTimer Timer structure
3577 Value Timer value in milliseconds
3583 To use this routine, must call RTMPInitTimer before.
3585 ========================================================================
3588 IN PRALINK_TIMER_STRUCT pTimer,
3593 pTimer->TimerValue = Value;
3594 pTimer->State = FALSE;
3595 if (pTimer->PeriodicType == TRUE)
3597 pTimer->Repeat = TRUE;
3598 RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);
3602 pTimer->Repeat = FALSE;
3603 RTMP_OS_Add_Timer(&pTimer->TimerObj, Value);
3608 DBGPRINT_ERR(("RTMPSetTimer failed, Timer hasn't been initialize!\n"));
3614 ========================================================================
3616 Routine Description:
3620 pTimer Timer structure
3621 Value Timer value in milliseconds
3627 To use this routine, must call RTMPInitTimer before.
3629 ========================================================================
3632 IN PRALINK_TIMER_STRUCT pTimer,
3639 pTimer->TimerValue = Value;
3640 pTimer->State = FALSE;
3641 if (pTimer->PeriodicType == TRUE)
3643 RTMPCancelTimer(pTimer, &Cancel);
3644 RTMPSetTimer(pTimer, Value);
3648 RTMP_OS_Mod_Timer(&pTimer->TimerObj, Value);
3653 DBGPRINT_ERR(("RTMPModTimer failed, Timer hasn't been initialize!\n"));
3658 ========================================================================
3660 Routine Description:
3661 Cancel timer objects
3664 Adapter Pointer to our adapter
3669 IRQL = PASSIVE_LEVEL
3670 IRQL = DISPATCH_LEVEL
3673 1.) To use this routine, must call RTMPInitTimer before.
3674 2.) Reset NIC to initial state AS IS system boot up time.
3676 ========================================================================
3678 VOID RTMPCancelTimer(
3679 IN PRALINK_TIMER_STRUCT pTimer,
3680 OUT BOOLEAN *pCancelled)
3684 if (pTimer->State == FALSE)
3685 pTimer->Repeat = FALSE;
3686 RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);
3688 if (*pCancelled == TRUE)
3689 pTimer->State = TRUE;
3692 // We need to go-through the TimerQ to findout this timer handler and remove it if
3693 // it's still waiting for execution.
3695 RT2870_TimerQ_Remove(pTimer->pAd, pTimer);
3701 // NdisMCancelTimer just canced the timer and not mean release the timer.
3702 // And don't set the "Valid" to False. So that we can use this timer again.
3704 DBGPRINT_ERR(("RTMPCancelTimer failed, Timer hasn't been initialize!\n"));
3709 ========================================================================
3711 Routine Description:
3715 pAd Pointer to our adapter
3721 IRQL = PASSIVE_LEVEL
3722 IRQL = DISPATCH_LEVEL
3726 ========================================================================
3729 IN PRTMP_ADAPTER pAd,
3736 // In ATE mode of RT2860 AP/STA, we have erased 8051 firmware.
3737 // So LED mode is not supported when ATE is running.
3741 #endif // RALINK_ATE //
3743 LowByte = pAd->LedCntl.field.LedMode&0x7f;
3748 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3749 pAd->LedIndicatorStregth = 0;
3752 if (pAd->CommonCfg.Channel > 14)
3756 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3760 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3763 LowByte = 0; // Driver sets MAC register and MAC controls LED
3766 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3770 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3772 case LED_ON_SITE_SURVEY:
3774 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3778 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3781 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetLED::Unknown Status %d\n", Status));
3786 // Keep LED status for LED SiteSurvey mode.
3787 // After SiteSurvey, we will set the LED mode to previous status.
3789 if ((Status != LED_ON_SITE_SURVEY) && (Status != LED_POWER_UP))
3790 pAd->LedStatus = Status;
3792 DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetLED::Mode=%d,HighByte=0x%02x,LowByte=0x%02x\n", pAd->LedCntl.field.LedMode, HighByte, LowByte));
3796 ========================================================================
3798 Routine Description:
3799 Set LED Signal Stregth
3802 pAd Pointer to our adapter
3808 IRQL = PASSIVE_LEVEL
3811 Can be run on any IRQL level.
3813 According to Microsoft Zero Config Wireless Signal Stregth definition as belows.
3820 ========================================================================
3822 VOID RTMPSetSignalLED(
3823 IN PRTMP_ADAPTER pAd,
3824 IN NDIS_802_11_RSSI Dbm)
3829 // if not Signal Stregth, then do nothing.
3831 if (pAd->LedCntl.field.LedMode != LED_MODE_SIGNAL_STREGTH)
3838 else if (Dbm <= -81)
3840 else if (Dbm <= -71)
3842 else if (Dbm <= -67)
3844 else if (Dbm <= -57)
3850 // Update Signal Stregth to firmware if changed.
3852 if (pAd->LedIndicatorStregth != nLed)
3854 AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed, pAd->LedCntl.field.Polarity);
3855 pAd->LedIndicatorStregth = nLed;
3860 ========================================================================
3862 Routine Description:
3866 pAd Pointer to our adapter
3871 IRQL <= DISPATCH_LEVEL
3874 Before Enable RX, make sure you have enabled Interrupt.
3875 ========================================================================
3877 VOID RTMPEnableRxTx(
3878 IN PRTMP_ADAPTER pAd)
3880 // WPDMA_GLO_CFG_STRUC GloCfg;
3883 DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n"));
3887 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x4);
3890 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
3891 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
3894 DBGPRINT(RT_DEBUG_TRACE, ("==> DMABusy\n"));
3895 RTMPusecDelay(1000);
3900 RT28XX_DMA_WRITE_INIT(GloCfg);
3901 DBGPRINT(RT_DEBUG_TRACE, ("<== WRITE DMA offset 0x208 = 0x%x\n", GloCfg.word));
3902 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
3904 RT28XX_DMA_POST_WRITE(pAd);
3907 RT28XXDMAEnable(pAd);
3910 // enable RX of MAC block
3911 if (pAd->OpMode == OPMODE_AP)
3913 UINT32 rx_filter_flag = APNORMAL;
3916 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); // enable RX of DMA block
3920 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL); // Staion not drop control frame will fail WiFi Certification.
3923 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);
3924 DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPEnableRxTx\n"));