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 -------- ---------- ----------------------------------------------
37 #include "../rt_config.h"
39 UCHAR BIT8[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
40 char* CipherName[] = {"none","wep64","wep128","TKIP","AES","CKIP64","CKIP128"};
43 // BBP register initialization set
45 REG_PAIR BBPRegTable[] = {
46 {BBP_R65, 0x2C}, // fix rssi issue
47 {BBP_R66, 0x38}, // Also set this default value to pAd->BbpTuning.R66CurrentValue at initial
49 {BBP_R70, 0xa}, // BBP_R70 will change to 0x8 in ApStartUp and LinkUp for rt2860C, otherwise value is 0xa
54 {BBP_R84, 0x99}, // 0x19 is for rt2860E and after. This is for extension channel overlapping IOT. 0x99 is for rt2860D and before
55 {BBP_R86, 0x00}, // middle range issue, Rory @2008-01-28
56 {BBP_R91, 0x04}, // middle range issue, Rory @2008-01-28
57 {BBP_R92, 0x00}, // middle range issue, Rory @2008-01-28
58 {BBP_R103, 0x00}, // near range high-power issue, requested from Gary @2008-0528
59 {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.
60 {BBP_R106, 0x35}, // for ShortGI throughput
62 #define NUM_BBP_REG_PARMS (sizeof(BBPRegTable) / sizeof(REG_PAIR))
66 // ASIC register initialization sets
69 RTMP_REG_PAIR MACRegTable[] = {
70 #if defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x200)
71 {BCN_OFFSET0, 0xf8f0e8e0}, /* 0x3800(e0), 0x3A00(e8), 0x3C00(f0), 0x3E00(f8), 512B for each beacon */
72 {BCN_OFFSET1, 0x6f77d0c8}, /* 0x3200(c8), 0x3400(d0), 0x1DC0(77), 0x1BC0(6f), 512B for each beacon */
73 #elif defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x100)
74 {BCN_OFFSET0, 0xece8e4e0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
75 {BCN_OFFSET1, 0xfcf8f4f0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
77 #error You must re-calculate new value for BCN_OFFSET0 & BCN_OFFSET1 in MACRegTable[]!!!
78 #endif // HW_BEACON_OFFSET //
80 {LEGACY_BASIC_RATE, 0x0000013f}, // Basic rate set bitmap
81 {HT_BASIC_RATE, 0x00008003}, // Basic HT rate set , 20M, MCS=3, MM. Format is the same as in TXWI.
82 {MAC_SYS_CTRL, 0x00}, // 0x1004, , default Disable RX
83 {RX_FILTR_CFG, 0x17f97}, //0x1400 , RX filter control,
84 {BKOFF_SLOT_CFG, 0x209}, // default set short slot time, CC_DELAY_TIME should be 2
85 //{TX_SW_CFG0, 0x40a06}, // Gary,2006-08-23
86 {TX_SW_CFG0, 0x0}, // Gary,2008-05-21 for CWC test
87 {TX_SW_CFG1, 0x80606}, // Gary,2006-08-23
88 {TX_LINK_CFG, 0x1020}, // Gary,2006-08-23
89 //{TX_TIMEOUT_CFG, 0x00182090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT
90 {TX_TIMEOUT_CFG, 0x000a2090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT , Modify for 2860E ,2007-08-01
91 {MAX_LEN_CFG, MAX_AGGREGATION_SIZE | 0x00001000}, // 0x3018, MAX frame length. Max PSDU = 16kbytes.
92 {LED_CFG, 0x7f031e46}, // Gary, 2006-08-23
94 {PBF_MAX_PCNT, 0x1F3FBF9F}, //0x1F3f7f9f}, //Jan, 2006/04/20
96 {TX_RTY_CFG, 0x47d01f0f}, // Jan, 2006/11/16, Set TxWI->ACK =0 in Probe Rsp Modify for 2860E ,2007-08-03
98 {AUTO_RSP_CFG, 0x00000013}, // Initial Auto_Responder, because QA will turn off Auto-Responder
99 {CCK_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled.
100 {OFDM_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled.
102 {PBF_CFG, 0xf40006}, // Only enable Queue 2
103 {MM40_PROT_CFG, 0x3F44084}, // Initial Auto_Responder, because QA will turn off Auto-Responder
104 {WPDMA_GLO_CFG, 0x00000030},
105 #endif // RTMP_MAC_USB //
106 {GF20_PROT_CFG, 0x01744004}, // set 19:18 --> Short NAV for MIMO PS
107 {GF40_PROT_CFG, 0x03F44084},
108 {MM20_PROT_CFG, 0x01744004},
110 {MM40_PROT_CFG, 0x03F54084},
111 #endif // RTMP_MAC_PCI //
112 {TXOP_CTRL_CFG, 0x0000583f, /*0x0000243f*/ /*0x000024bf*/}, //Extension channel backoff.
113 {TX_RTS_CFG, 0x00092b20},
114 {EXP_ACK_TIME, 0x002400ca}, // default value
116 {TXOP_HLDR_ET, 0x00000002},
118 /* Jerry comments 2008/01/16: we use SIFS = 10us in CCK defaultly, but it seems that 10us
119 is too small for INTEL 2200bg card, so in MBSS mode, the delta time between beacon0
120 and beacon1 is SIFS (10us), so if INTEL 2200bg card connects to BSS0, the ping
121 will always lost. So we change the SIFS of CCK from 10us to 16us. */
122 {XIFS_TIME_CFG, 0x33a41010},
123 {PWR_PIN_CFG, 0x00000003}, // patch for 2880-E
126 RTMP_REG_PAIR STAMACRegTable[] = {
127 {WMM_AIFSN_CFG, 0x00002273},
128 {WMM_CWMIN_CFG, 0x00002344},
129 {WMM_CWMAX_CFG, 0x000034aa},
132 #define NUM_MAC_REG_PARMS (sizeof(MACRegTable) / sizeof(RTMP_REG_PAIR))
133 #define NUM_STA_MAC_REG_PARMS (sizeof(STAMACRegTable) / sizeof(RTMP_REG_PAIR))
137 ========================================================================
140 Allocate RTMP_ADAPTER data block and do some initialization
143 Adapter Pointer to our adapter
153 ========================================================================
155 NDIS_STATUS RTMPAllocAdapterBlock(
157 OUT PRTMP_ADAPTER *ppAdapter)
162 UCHAR *pBeaconBuf = NULL;
164 DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocAdapterBlock\n"));
170 // Allocate RTMP_ADAPTER memory block
171 pBeaconBuf = kmalloc(MAX_BEACON_SIZE, MEM_ALLOC_FLAG);
172 if (pBeaconBuf == NULL)
174 Status = NDIS_STATUS_FAILURE;
175 DBGPRINT_ERR(("Failed to allocate memory - BeaconBuf!\n"));
178 NdisZeroMemory(pBeaconBuf, MAX_BEACON_SIZE);
180 Status = AdapterBlockAllocateMemory(handle, (PVOID *)&pAd);
181 if (Status != NDIS_STATUS_SUCCESS)
183 DBGPRINT_ERR(("Failed to allocate memory - ADAPTER\n"));
186 pAd->BeaconBuf = pBeaconBuf;
187 DBGPRINT(RT_DEBUG_OFF, ("\n\n=== pAd = %p, size = %d ===\n\n", pAd, (UINT32)sizeof(RTMP_ADAPTER)));
191 NdisAllocateSpinLock(&pAd->MgmtRingLock);
193 NdisAllocateSpinLock(&pAd->RxRingLock);
195 NdisAllocateSpinLock(&pAd->McuCmdLock);
197 #endif // RTMP_MAC_PCI //
199 for (index =0 ; index < NUM_OF_TX_RING; index++)
201 NdisAllocateSpinLock(&pAd->TxSwQueueLock[index]);
202 NdisAllocateSpinLock(&pAd->DeQueueLock[index]);
203 pAd->DeQueueRunning[index] = FALSE;
206 NdisAllocateSpinLock(&pAd->irq_lock);
210 if ((Status != NDIS_STATUS_SUCCESS) && (pBeaconBuf))
215 DBGPRINT_S(Status, ("<-- RTMPAllocAdapterBlock, Status=%x\n", Status));
220 ========================================================================
223 Read initial Tx power per MCS and BW from EEPROM
226 Adapter Pointer to our adapter
235 ========================================================================
237 VOID RTMPReadTxPwrPerRate(
238 IN PRTMP_ADAPTER pAd)
240 ULONG data, Adata, Gdata;
241 USHORT i, value, value2;
242 INT Apwrdelta, Gpwrdelta;
244 BOOLEAN bApwrdeltaMinus = TRUE, bGpwrdeltaMinus = TRUE;
247 // Get power delta for 20MHz and 40MHz.
249 DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n"));
250 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);
254 if ((value2 & 0xff) != 0xff)
257 Gpwrdelta = (value2&0xf);
260 bGpwrdeltaMinus = FALSE;
262 bGpwrdeltaMinus = TRUE;
264 if ((value2 & 0xff00) != 0xff00)
266 if ((value2 & 0x8000))
267 Apwrdelta = ((value2&0xf00)>>8);
269 if ((value2 & 0x4000))
270 bApwrdeltaMinus = FALSE;
272 bApwrdeltaMinus = TRUE;
274 DBGPRINT(RT_DEBUG_TRACE, ("Gpwrdelta = %x, Apwrdelta = %x .\n", Gpwrdelta, Apwrdelta));
277 // Get Txpower per MCS for 20MHz in 2.4G.
281 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4, value);
283 if (bApwrdeltaMinus == FALSE)
285 t1 = (value&0xf)+(Apwrdelta);
288 t2 = ((value&0xf0)>>4)+(Apwrdelta);
291 t3 = ((value&0xf00)>>8)+(Apwrdelta);
294 t4 = ((value&0xf000)>>12)+(Apwrdelta);
300 if ((value&0xf) > Apwrdelta)
301 t1 = (value&0xf)-(Apwrdelta);
304 if (((value&0xf0)>>4) > Apwrdelta)
305 t2 = ((value&0xf0)>>4)-(Apwrdelta);
308 if (((value&0xf00)>>8) > Apwrdelta)
309 t3 = ((value&0xf00)>>8)-(Apwrdelta);
312 if (((value&0xf000)>>12) > Apwrdelta)
313 t4 = ((value&0xf000)>>12)-(Apwrdelta);
317 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
318 if (bGpwrdeltaMinus == FALSE)
320 t1 = (value&0xf)+(Gpwrdelta);
323 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
326 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
329 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
335 if ((value&0xf) > Gpwrdelta)
336 t1 = (value&0xf)-(Gpwrdelta);
339 if (((value&0xf0)>>4) > Gpwrdelta)
340 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
343 if (((value&0xf00)>>8) > Gpwrdelta)
344 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
347 if (((value&0xf000)>>12) > Gpwrdelta)
348 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
352 Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
354 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2, value);
355 if (bApwrdeltaMinus == FALSE)
357 t1 = (value&0xf)+(Apwrdelta);
360 t2 = ((value&0xf0)>>4)+(Apwrdelta);
363 t3 = ((value&0xf00)>>8)+(Apwrdelta);
366 t4 = ((value&0xf000)>>12)+(Apwrdelta);
372 if ((value&0xf) > Apwrdelta)
373 t1 = (value&0xf)-(Apwrdelta);
376 if (((value&0xf0)>>4) > Apwrdelta)
377 t2 = ((value&0xf0)>>4)-(Apwrdelta);
380 if (((value&0xf00)>>8) > Apwrdelta)
381 t3 = ((value&0xf00)>>8)-(Apwrdelta);
384 if (((value&0xf000)>>12) > Apwrdelta)
385 t4 = ((value&0xf000)>>12)-(Apwrdelta);
389 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
390 if (bGpwrdeltaMinus == FALSE)
392 t1 = (value&0xf)+(Gpwrdelta);
395 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
398 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
401 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
407 if ((value&0xf) > Gpwrdelta)
408 t1 = (value&0xf)-(Gpwrdelta);
411 if (((value&0xf0)>>4) > Gpwrdelta)
412 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
415 if (((value&0xf00)>>8) > Gpwrdelta)
416 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
419 if (((value&0xf000)>>12) > Gpwrdelta)
420 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
424 Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
427 /* For 20M/40M Power Delta issue */
428 pAd->Tx20MPwrCfgABand[i] = data;
429 pAd->Tx20MPwrCfgGBand[i] = data;
430 pAd->Tx40MPwrCfgABand[i] = Adata;
431 pAd->Tx40MPwrCfgGBand[i] = Gdata;
433 if (data != 0xffffffff)
434 RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, data);
435 DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 2.4G band-%lx, Adata = %lx, Gdata = %lx \n", data, Adata, Gdata));
441 ========================================================================
444 Read initial channel power parameters from EEPROM
447 Adapter Pointer to our adapter
456 ========================================================================
458 VOID RTMPReadChannelPwr(
459 IN PRTMP_ADAPTER pAd)
462 EEPROM_TX_PWR_STRUC Power;
463 EEPROM_TX_PWR_STRUC Power2;
465 // Read Tx power value for all channels
466 // Value from 1 - 0x7f. Default value is 24.
467 // Power value : 2.4G 0x00 (0) ~ 0x1F (31)
468 // : 5.5G 0xF9 (-7) ~ 0x0F (15)
470 // 0. 11b/g, ch1 - ch 14
471 for (i = 0; i < 7; i++)
473 RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2, Power.word);
474 RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2, Power2.word);
475 pAd->TxPower[i * 2].Channel = i * 2 + 1;
476 pAd->TxPower[i * 2 + 1].Channel = i * 2 + 2;
478 if ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0))
479 pAd->TxPower[i * 2].Power = DEFAULT_RF_TX_POWER;
481 pAd->TxPower[i * 2].Power = Power.field.Byte0;
483 if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0))
484 pAd->TxPower[i * 2 + 1].Power = DEFAULT_RF_TX_POWER;
486 pAd->TxPower[i * 2 + 1].Power = Power.field.Byte1;
488 if ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0))
489 pAd->TxPower[i * 2].Power2 = DEFAULT_RF_TX_POWER;
491 pAd->TxPower[i * 2].Power2 = Power2.field.Byte0;
493 if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0))
494 pAd->TxPower[i * 2 + 1].Power2 = DEFAULT_RF_TX_POWER;
496 pAd->TxPower[i * 2 + 1].Power2 = Power2.field.Byte1;
499 // 1. U-NII lower/middle band: 36, 38, 40; 44, 46, 48; 52, 54, 56; 60, 62, 64 (including central frequency in BW 40MHz)
500 // 1.1 Fill up channel
502 for (i = 0; i < 4; i++)
504 pAd->TxPower[3 * i + choffset + 0].Channel = 36 + i * 8 + 0;
505 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
506 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
508 pAd->TxPower[3 * i + choffset + 1].Channel = 36 + i * 8 + 2;
509 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
510 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
512 pAd->TxPower[3 * i + choffset + 2].Channel = 36 + i * 8 + 4;
513 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
514 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
518 for (i = 0; i < 6; i++)
520 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2, Power.word);
521 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2, Power2.word);
523 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
524 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
526 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
527 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
529 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
530 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
532 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
533 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
536 // 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)
537 // 2.1 Fill up channel
539 for (i = 0; i < 5; i++)
541 pAd->TxPower[3 * i + choffset + 0].Channel = 100 + i * 8 + 0;
542 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
543 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
545 pAd->TxPower[3 * i + choffset + 1].Channel = 100 + i * 8 + 2;
546 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
547 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
549 pAd->TxPower[3 * i + choffset + 2].Channel = 100 + i * 8 + 4;
550 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
551 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
553 pAd->TxPower[3 * 5 + choffset + 0].Channel = 140;
554 pAd->TxPower[3 * 5 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
555 pAd->TxPower[3 * 5 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
558 for (i = 0; i < 8; i++)
560 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);
561 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);
563 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
564 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
566 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
567 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
569 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
570 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
572 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
573 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
576 // 3. U-NII upper band: 149, 151, 153; 157, 159, 161; 165, 167, 169; 171, 173 (including central frequency in BW 40MHz)
577 // 3.1 Fill up channel
578 choffset = 14 + 12 + 16;
579 /*for (i = 0; i < 2; i++)*/
580 for (i = 0; i < 3; i++)
582 pAd->TxPower[3 * i + choffset + 0].Channel = 149 + i * 8 + 0;
583 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
584 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
586 pAd->TxPower[3 * i + choffset + 1].Channel = 149 + i * 8 + 2;
587 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
588 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
590 pAd->TxPower[3 * i + choffset + 2].Channel = 149 + i * 8 + 4;
591 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
592 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
594 pAd->TxPower[3 * 3 + choffset + 0].Channel = 171;
595 pAd->TxPower[3 * 3 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
596 pAd->TxPower[3 * 3 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
598 pAd->TxPower[3 * 3 + choffset + 1].Channel = 173;
599 pAd->TxPower[3 * 3 + choffset + 1].Power = DEFAULT_RF_TX_POWER;
600 pAd->TxPower[3 * 3 + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
603 /*for (i = 0; i < 4; i++)*/
604 for (i = 0; i < 6; i++)
606 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);
607 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);
609 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
610 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
612 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
613 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
615 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
616 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
618 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
619 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
622 // 4. Print and Debug
623 /*choffset = 14 + 12 + 16 + 7;*/
624 choffset = 14 + 12 + 16 + 11;
630 ========================================================================
633 Read the following from the registry
634 1. All the parameters
638 Adapter Pointer to our adapter
639 WrapperConfigurationContext For use by NdisOpenConfiguration
644 NDIS_STATUS_RESOURCES
650 ========================================================================
652 NDIS_STATUS NICReadRegParameters(
653 IN PRTMP_ADAPTER pAd,
654 IN NDIS_HANDLE WrapperConfigurationContext
657 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
658 DBGPRINT_S(Status, ("<-- NICReadRegParameters, Status=%x\n", Status));
664 ========================================================================
667 Read initial parameters from EEPROM
670 Adapter Pointer to our adapter
679 ========================================================================
681 VOID NICReadEEPROMParameters(
682 IN PRTMP_ADAPTER pAd,
686 USHORT i, value, value2;
688 EEPROM_TX_PWR_STRUC Power;
689 EEPROM_VERSION_STRUC Version;
690 EEPROM_ANTENNA_STRUC Antenna;
691 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
693 DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n"));
695 if (pAd->chipOps.eeinit)
696 pAd->chipOps.eeinit(pAd);
697 #ifdef RTMP_EFUSE_SUPPORT
699 if(!pAd->bFroceEEPROMBuffer && pAd->bEEPROMFile)
701 DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters::(Efuse)Load to EEPROM Buffer Mode\n"));
702 eFuseLoadEEPROM(pAd);
705 #endif // RTMP_EFUSE_SUPPORT //
707 // Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8
708 RTMP_IO_READ32(pAd, E2PROM_CSR, &data);
709 DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%x\n", data));
711 if((data & 0x30) == 0)
712 pAd->EEPROMAddressNum = 6; // 93C46
713 else if((data & 0x30) == 0x10)
714 pAd->EEPROMAddressNum = 8; // 93C66
716 pAd->EEPROMAddressNum = 8; // 93C86
717 DBGPRINT(RT_DEBUG_TRACE, ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum ));
719 // RT2860 MAC no longer auto load MAC address from E2PROM. Driver has to intialize
720 // MAC address registers according to E2PROM setting
721 if (mac_addr == NULL ||
722 strlen((PSTRING) mac_addr) != 17 ||
723 mac_addr[2] != ':' || mac_addr[5] != ':' || mac_addr[8] != ':' ||
724 mac_addr[11] != ':' || mac_addr[14] != ':')
726 USHORT Addr01,Addr23,Addr45 ;
728 RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);
729 RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);
730 RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);
732 pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);
733 pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8);
734 pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);
735 pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8);
736 pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);
737 pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8);
739 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from E2PROM \n"));
746 macptr = (PSTRING) mac_addr;
748 for (j=0; j<MAC_ADDR_LEN; j++)
750 AtoH(macptr, &pAd->PermanentAddress[j], 1);
754 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from module parameter \n"));
759 //more conveninet to test mbssid, so ap's bssid &0xf1
760 if (pAd->PermanentAddress[0] == 0xff)
761 pAd->PermanentAddress[0] = RandomByte(pAd)&0xf8;
763 //if (pAd->PermanentAddress[5] == 0xff)
764 // pAd->PermanentAddress[5] = RandomByte(pAd)&0xf8;
766 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
767 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
768 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
769 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
770 if (pAd->bLocalAdminMAC == FALSE)
774 COPY_MAC_ADDR(pAd->CurrentAddress, pAd->PermanentAddress);
775 csr2.field.Byte0 = pAd->CurrentAddress[0];
776 csr2.field.Byte1 = pAd->CurrentAddress[1];
777 csr2.field.Byte2 = pAd->CurrentAddress[2];
778 csr2.field.Byte3 = pAd->CurrentAddress[3];
779 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word);
781 csr3.field.Byte4 = pAd->CurrentAddress[4];
782 csr3.field.Byte5 = pAd->CurrentAddress[5];
783 csr3.field.U2MeMask = 0xff;
784 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word);
785 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
786 PRINT_MAC(pAd->PermanentAddress)));
790 // if not return early. cause fail at emulation.
791 // Init the channel number for TX channel power
792 RTMPReadChannelPwr(pAd);
794 // if E2PROM version mismatch with driver's expectation, then skip
795 // all subsequent E2RPOM retieval and set a system error bit to notify GUI
796 RT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word);
797 pAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256;
798 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: Version = %d, FAE release #%d\n", Version.field.Version, Version.field.FaeReleaseNumber));
800 if (Version.field.Version > VALID_EEPROM_VERSION)
802 DBGPRINT_ERR(("E2PROM: WRONG VERSION 0x%x, should be %d\n",Version.field.Version, VALID_EEPROM_VERSION));
803 /*pAd->SystemErrorBitmap |= 0x00000001;
805 // hard-code default value when no proper E2PROM installed
806 pAd->bAutoTxAgcA = FALSE;
807 pAd->bAutoTxAgcG = FALSE;
809 // Default the channel power
810 for (i = 0; i < MAX_NUM_OF_CHANNELS; i++)
811 pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER;
813 // Default the channel power
814 for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++)
815 pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER;
817 for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++)
818 pAd->EEPROMDefaultValue[i] = 0xffff;
822 // Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd
823 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value);
824 pAd->EEPROMDefaultValue[0] = value;
826 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);
827 pAd->EEPROMDefaultValue[1] = value;
829 RT28xx_EEPROM_READ16(pAd, 0x38, value); // Country Region
830 pAd->EEPROMDefaultValue[2] = value;
832 for(i = 0; i < 8; i++)
834 RT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2, value);
835 pAd->EEPROMDefaultValue[i+3] = value;
838 // We have to parse NIC configuration 0 at here.
839 // If TSSI did not have preloaded value, it should reset the TxAutoAgc to false
840 // Therefore, we have to read TxAutoAgc control beforehand.
841 // Read Tx AGC control bit
842 Antenna.word = pAd->EEPROMDefaultValue[0];
843 if (Antenna.word == 0xFFFF)
846 if(IS_RT3090(pAd)|| IS_RT3390(pAd))
849 Antenna.field.RfIcType = RFIC_3020;
850 Antenna.field.TxPath = 1;
851 Antenna.field.RxPath = 1;
858 Antenna.field.RfIcType = RFIC_2820;
859 Antenna.field.TxPath = 1;
860 Antenna.field.RxPath = 2;
861 DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
865 // Choose the desired Tx&Rx stream.
866 if ((pAd->CommonCfg.TxStream == 0) || (pAd->CommonCfg.TxStream > Antenna.field.TxPath))
867 pAd->CommonCfg.TxStream = Antenna.field.TxPath;
869 if ((pAd->CommonCfg.RxStream == 0) || (pAd->CommonCfg.RxStream > Antenna.field.RxPath))
871 pAd->CommonCfg.RxStream = Antenna.field.RxPath;
873 if ((pAd->MACVersion < RALINK_2883_VERSION) &&
874 (pAd->CommonCfg.RxStream > 2))
876 // only 2 Rx streams for RT2860 series
877 pAd->CommonCfg.RxStream = 2;
882 // read value from EEPROM and set them to CSR174 ~ 177 in chain0 ~ chain2
888 NicConfig2.word = pAd->EEPROMDefaultValue[1];
891 if ((NicConfig2.word & 0x00ff) == 0xff)
893 NicConfig2.word &= 0xff00;
896 if ((NicConfig2.word >> 8) == 0xff)
898 NicConfig2.word &= 0x00ff;
902 if (NicConfig2.field.DynamicTxAgcControl == 1)
903 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
905 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
907 DBGPRINT_RAW(RT_DEBUG_TRACE, ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n", Antenna.field.RxPath, Antenna.field.TxPath));
909 // Save the antenna for future use
910 pAd->Antenna.word = Antenna.word;
912 // Set the RfICType here, then we can initialize RFIC related operation callbacks
913 pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;
914 pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;
916 #ifdef RTMP_RF_RW_SUPPORT
917 RtmpChipOpsRFHook(pAd);
918 #endif // RTMP_RF_RW_SUPPORT //
921 sprintf((PSTRING) pAd->nickname, "RT2860STA");
922 #endif // RTMP_MAC_PCI //
926 // Reset PhyMode if we don't support 802.11a
927 // Only RFIC_2850 & RFIC_2750 support 802.11a
929 if ((Antenna.field.RfIcType != RFIC_2850)
930 && (Antenna.field.RfIcType != RFIC_2750)
931 && (Antenna.field.RfIcType != RFIC_3052))
933 if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) ||
934 (pAd->CommonCfg.PhyMode == PHY_11A))
935 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;
936 else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
937 (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) ||
938 (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) ||
939 (pAd->CommonCfg.PhyMode == PHY_11N_5G))
940 pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED;
943 // Read TSSI reference and TSSI boundary for temperature compensation. This is ugly
946 /* these are tempature reference value (0x00 ~ 0xFE)
947 ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
948 TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) +
949 TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */
950 RT28xx_EEPROM_READ16(pAd, 0x6E, Power.word);
951 pAd->TssiMinusBoundaryG[4] = Power.field.Byte0;
952 pAd->TssiMinusBoundaryG[3] = Power.field.Byte1;
953 RT28xx_EEPROM_READ16(pAd, 0x70, Power.word);
954 pAd->TssiMinusBoundaryG[2] = Power.field.Byte0;
955 pAd->TssiMinusBoundaryG[1] = Power.field.Byte1;
956 RT28xx_EEPROM_READ16(pAd, 0x72, Power.word);
957 pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */
958 pAd->TssiPlusBoundaryG[1] = Power.field.Byte1;
959 RT28xx_EEPROM_READ16(pAd, 0x74, Power.word);
960 pAd->TssiPlusBoundaryG[2] = Power.field.Byte0;
961 pAd->TssiPlusBoundaryG[3] = Power.field.Byte1;
962 RT28xx_EEPROM_READ16(pAd, 0x76, Power.word);
963 pAd->TssiPlusBoundaryG[4] = Power.field.Byte0;
964 pAd->TxAgcStepG = Power.field.Byte1;
965 pAd->TxAgcCompensateG = 0;
966 pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;
967 pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG;
969 // Disable TxAgc if the based value is not right
970 if (pAd->TssiRefG == 0xff)
971 pAd->bAutoTxAgcG = FALSE;
973 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
974 pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1],
976 pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],
977 pAd->TxAgcStepG, pAd->bAutoTxAgcG));
981 RT28xx_EEPROM_READ16(pAd, 0xD4, Power.word);
982 pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;
983 pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;
984 RT28xx_EEPROM_READ16(pAd, 0xD6, Power.word);
985 pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;
986 pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;
987 RT28xx_EEPROM_READ16(pAd, 0xD8, Power.word);
988 pAd->TssiRefA = Power.field.Byte0;
989 pAd->TssiPlusBoundaryA[1] = Power.field.Byte1;
990 RT28xx_EEPROM_READ16(pAd, 0xDA, Power.word);
991 pAd->TssiPlusBoundaryA[2] = Power.field.Byte0;
992 pAd->TssiPlusBoundaryA[3] = Power.field.Byte1;
993 RT28xx_EEPROM_READ16(pAd, 0xDC, Power.word);
994 pAd->TssiPlusBoundaryA[4] = Power.field.Byte0;
995 pAd->TxAgcStepA = Power.field.Byte1;
996 pAd->TxAgcCompensateA = 0;
997 pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;
998 pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA;
1000 // Disable TxAgc if the based value is not right
1001 if (pAd->TssiRefA == 0xff)
1002 pAd->bAutoTxAgcA = FALSE;
1004 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
1005 pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1],
1007 pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2], pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],
1008 pAd->TxAgcStepA, pAd->bAutoTxAgcA));
1010 pAd->BbpRssiToDbmDelta = 0x0;
1012 // Read frequency offset setting for RF
1013 RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value);
1014 if ((value & 0x00FF) != 0x00FF)
1015 pAd->RfFreqOffset = (ULONG) (value & 0x00FF);
1017 pAd->RfFreqOffset = 0;
1018 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset));
1020 //CountryRegion byte offset (38h)
1021 value = pAd->EEPROMDefaultValue[2] >> 8; // 2.4G band
1022 value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; // 5G band
1024 if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND))
1026 pAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80;
1027 pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;
1028 TmpPhy = pAd->CommonCfg.PhyMode;
1029 pAd->CommonCfg.PhyMode = 0xff;
1030 RTMPSetPhyMode(pAd, TmpPhy);
1035 // Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.
1036 // The valid value are (-10 ~ 10)
1038 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value);
1039 pAd->BGRssiOffset0 = value & 0x00ff;
1040 pAd->BGRssiOffset1 = (value >> 8);
1041 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2, value);
1042 pAd->BGRssiOffset2 = value & 0x00ff;
1043 pAd->ALNAGain1 = (value >> 8);
1044 RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value);
1045 pAd->BLNAGain = value & 0x00ff;
1046 pAd->ALNAGain0 = (value >> 8);
1048 // Validate 11b/g RSSI_0 offset.
1049 if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10))
1050 pAd->BGRssiOffset0 = 0;
1052 // Validate 11b/g RSSI_1 offset.
1053 if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))
1054 pAd->BGRssiOffset1 = 0;
1056 // Validate 11b/g RSSI_2 offset.
1057 if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))
1058 pAd->BGRssiOffset2 = 0;
1060 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value);
1061 pAd->ARssiOffset0 = value & 0x00ff;
1062 pAd->ARssiOffset1 = (value >> 8);
1063 RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2), value);
1064 pAd->ARssiOffset2 = value & 0x00ff;
1065 pAd->ALNAGain2 = (value >> 8);
1067 if (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))
1068 pAd->ALNAGain1 = pAd->ALNAGain0;
1069 if (((UCHAR)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00))
1070 pAd->ALNAGain2 = pAd->ALNAGain0;
1072 // Validate 11a RSSI_0 offset.
1073 if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10))
1074 pAd->ARssiOffset0 = 0;
1076 // Validate 11a RSSI_1 offset.
1077 if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))
1078 pAd->ARssiOffset1 = 0;
1080 //Validate 11a RSSI_2 offset.
1081 if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))
1082 pAd->ARssiOffset2 = 0;
1086 // Get TX mixer gain setting
1087 // 0xff are invalid value
1088 // Note: RT30xX default value is 0x00 and will program to RF_R17 only when this value is not zero.
1089 // RT359X default value is 0x02
1091 if (IS_RT30xx(pAd) || IS_RT3572(pAd))
1093 RT28xx_EEPROM_READ16(pAd, EEPROM_TXMIXER_GAIN_2_4G, value);
1094 pAd->TxMixerGain24G = 0;
1099 pAd->TxMixerGain24G = (UCHAR)value;
1107 RT28xx_EEPROM_READ16(pAd, 0x3a, value);
1108 pAd->LedCntl.word = (value>>8);
1109 RT28xx_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET, value);
1111 RT28xx_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET, value);
1113 RT28xx_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET, value);
1116 RTMPReadTxPwrPerRate(pAd);
1119 #ifdef RTMP_EFUSE_SUPPORT
1120 RtmpEfuseSupportCheck(pAd);
1121 #endif // RTMP_EFUSE_SUPPORT //
1124 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
1128 ========================================================================
1130 Routine Description:
1131 Set default value from EEPROM
1134 Adapter Pointer to our adapter
1139 IRQL = PASSIVE_LEVEL
1143 ========================================================================
1145 VOID NICInitAsicFromEEPROM(
1146 IN PRTMP_ADAPTER pAd)
1151 // EEPROM_ANTENNA_STRUC Antenna;
1152 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1155 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitAsicFromEEPROM\n"));
1156 for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)
1158 UCHAR BbpRegIdx, BbpValue;
1160 if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))
1162 BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);
1163 BbpValue = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);
1164 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);
1169 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1172 if ((NicConfig2.word & 0x00ff) == 0xff)
1174 NicConfig2.word &= 0xff00;
1177 if ((NicConfig2.word >> 8) == 0xff)
1179 NicConfig2.word &= 0x00ff;
1183 // Save the antenna for future use
1184 pAd->NicConfig2.word = NicConfig2.word;
1187 // set default antenna as main
1188 if (pAd->RfIcType == RFIC_3020)
1189 AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
1193 // Send LED Setting to MCU.
1195 if (pAd->LedCntl.word == 0xFF)
1197 pAd->LedCntl.word = 0x01;
1203 #endif // RTMP_MAC_PCI //
1206 #endif // RTMP_MAC_USB //
1209 AsicSendCommandToMcu(pAd, 0x52, 0xff, (UCHAR)pAd->Led1, (UCHAR)(pAd->Led1 >> 8));
1210 AsicSendCommandToMcu(pAd, 0x53, 0xff, (UCHAR)pAd->Led2, (UCHAR)(pAd->Led2 >> 8));
1211 AsicSendCommandToMcu(pAd, 0x54, 0xff, (UCHAR)pAd->Led3, (UCHAR)(pAd->Led3 >> 8));
1212 AsicSendCommandToMcu(pAd, 0x51, 0xff, 0, pAd->LedCntl.field.Polarity);
1214 pAd->LedIndicatorStrength = 0xFF;
1215 RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, before link up
1218 // Read Hardware controlled Radio state enable bit
1219 if (NicConfig2.field.HardwareRadioControl == 1)
1221 pAd->StaCfg.bHardwareRadio = TRUE;
1223 // Read GPIO pin2 as Hardware controlled radio state
1224 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
1225 if ((data & 0x04) == 0)
1227 pAd->StaCfg.bHwRadio = FALSE;
1228 pAd->StaCfg.bRadio = FALSE;
1229 // RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);
1230 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
1234 pAd->StaCfg.bHardwareRadio = FALSE;
1236 if (pAd->StaCfg.bRadio == FALSE)
1238 RTMPSetLED(pAd, LED_RADIO_OFF);
1242 RTMPSetLED(pAd, LED_RADIO_ON);
1245 AsicSendCommandToMcu(pAd, 0x30, PowerRadioOffCID, 0xff, 0x02);
1246 AsicCheckCommanOk(pAd, PowerRadioOffCID);
1249 AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);
1251 AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x00);
1252 // 2-1. wait command ok.
1253 AsicCheckCommanOk(pAd, PowerWakeCID);
1254 #endif // RTMP_MAC_PCI //
1260 if (IS_RT3090(pAd)|| IS_RT3572(pAd) || IS_RT3390(pAd))
1262 RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
1263 if (pChipOps->AsicReverseRfFromSleepMode)
1264 pChipOps->AsicReverseRfFromSleepMode(pAd);
1266 // 3090 MCU Wakeup command needs more time to be stable.
1267 // Before stable, don't issue other MCU command to prevent from firmware error.
1269 if ((IS_RT3090(pAd)|| IS_RT3572(pAd) || IS_RT3390(pAd)) && IS_VERSION_AFTER_F(pAd)
1270 && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
1271 && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE))
1273 DBGPRINT(RT_DEBUG_TRACE,("%s::%d,release Mcu Lock\n",__FUNCTION__,__LINE__));
1274 RTMP_SEM_LOCK(&pAd->McuCmdLock);
1275 pAd->brt30xxBanMcuCmd = FALSE;
1276 RTMP_SEM_UNLOCK(&pAd->McuCmdLock);
1279 #endif // RTMP_MAC_PCI //
1281 // Turn off patching for cardbus controller
1282 if (NicConfig2.field.CardbusAcceleration == 1)
1284 // pAd->bTest1 = TRUE;
1287 if (NicConfig2.field.DynamicTxAgcControl == 1)
1288 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1290 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1292 // Since BBP has been progamed, to make sure BBP setting will be
1293 // upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND!!
1295 pAd->CommonCfg.BandState = UNKNOWN_BAND;
1297 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
1299 if(pAd->Antenna.field.RxPath == 3)
1303 else if(pAd->Antenna.field.RxPath == 2)
1307 else if(pAd->Antenna.field.RxPath == 1)
1311 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
1314 // Handle the difference when 1T
1315 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
1316 if(pAd->Antenna.field.TxPath == 1)
1320 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
1322 DBGPRINT(RT_DEBUG_TRACE, ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n",
1323 pAd->CommonCfg.bHardwareRadio, pAd->CommonCfg.bHardwareRadio));
1328 // update registers from EEPROM for RT3071 or later(3572/3592).
1330 if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
1332 UCHAR RegIdx, RegValue;
1335 // after RT3071, write BBP from EEPROM 0xF0 to 0x102
1336 for (i = 0xF0; i <= 0x102; i = i+2)
1339 RT28xx_EEPROM_READ16(pAd, i, value);
1340 if ((value != 0xFFFF) && (value != 0))
1342 RegIdx = (UCHAR)(value >> 8);
1343 RegValue = (UCHAR)(value & 0xff);
1344 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, RegIdx, RegValue);
1345 DBGPRINT(RT_DEBUG_TRACE, ("Update BBP Registers from EEPROM(0x%0x), BBP(0x%x) = 0x%x\n", i, RegIdx, RegValue));
1349 // after RT3071, write RF from EEPROM 0x104 to 0x116
1350 for (i = 0x104; i <= 0x116; i = i+2)
1353 RT28xx_EEPROM_READ16(pAd, i, value);
1354 if ((value != 0xFFFF) && (value != 0))
1356 RegIdx = (UCHAR)(value >> 8);
1357 RegValue = (UCHAR)(value & 0xff);
1358 RT30xxWriteRFRegister(pAd, RegIdx, RegValue);
1359 DBGPRINT(RT_DEBUG_TRACE, ("Update RF Registers from EEPROM0x%x), BBP(0x%x) = 0x%x\n", i, RegIdx, RegValue));
1364 #endif // RTMP_MAC_USB //
1366 DBGPRINT(RT_DEBUG_TRACE, ("TxPath = %d, RxPath = %d, RFIC=%d, Polar+LED mode=%x\n",
1367 pAd->Antenna.field.TxPath, pAd->Antenna.field.RxPath,
1368 pAd->RfIcType, pAd->LedCntl.word));
1369 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n"));
1373 ========================================================================
1375 Routine Description:
1376 Initialize NIC hardware
1379 Adapter Pointer to our adapter
1384 IRQL = PASSIVE_LEVEL
1388 ========================================================================
1390 NDIS_STATUS NICInitializeAdapter(
1391 IN PRTMP_ADAPTER pAd,
1392 IN BOOLEAN bHardReset)
1394 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
1395 WPDMA_GLO_CFG_STRUC GloCfg;
1398 DELAY_INT_CFG_STRUC IntCfg;
1399 #endif // RTMP_MAC_PCI //
1400 // INT_MASK_CSR_STRUC IntMask;
1402 AC_TXOP_CSR0_STRUC csr0;
1404 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n"));
1406 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
1411 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
1412 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
1415 RTMPusecDelay(1000);
1418 DBGPRINT(RT_DEBUG_TRACE, ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word));
1419 GloCfg.word &= 0xff0;
1420 GloCfg.field.EnTXWriteBackDDONE =1;
1421 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
1423 // Record HW Beacon offset
1424 pAd->BeaconOffset[0] = HW_BEACON_BASE0;
1425 pAd->BeaconOffset[1] = HW_BEACON_BASE1;
1426 pAd->BeaconOffset[2] = HW_BEACON_BASE2;
1427 pAd->BeaconOffset[3] = HW_BEACON_BASE3;
1428 pAd->BeaconOffset[4] = HW_BEACON_BASE4;
1429 pAd->BeaconOffset[5] = HW_BEACON_BASE5;
1430 pAd->BeaconOffset[6] = HW_BEACON_BASE6;
1431 pAd->BeaconOffset[7] = HW_BEACON_BASE7;
1434 // write all shared Ring's base address into ASIC
1437 // asic simulation sequence put this ahead before loading firmware.
1438 // pbf hardware reset
1440 RTMP_IO_WRITE32(pAd, WPDMA_RST_IDX, 0x1003f); // 0x10000 for reset rx, 0x3f resets all 6 tx rings.
1441 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe1f);
1442 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe00);
1443 #endif // RTMP_MAC_PCI //
1445 // Initialze ASIC for TX & Rx operation
1446 if (NICInitializeAsic(pAd , bHardReset) != NDIS_STATUS_SUCCESS)
1450 NICLoadFirmware(pAd);
1453 return NDIS_STATUS_FAILURE;
1458 // Write AC_BK base address register
1459 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BK].Cell[0].AllocPa);
1460 RTMP_IO_WRITE32(pAd, TX_BASE_PTR1, Value);
1461 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR1 : 0x%x\n", Value));
1463 // Write AC_BE base address register
1464 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BE].Cell[0].AllocPa);
1465 RTMP_IO_WRITE32(pAd, TX_BASE_PTR0, Value);
1466 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR0 : 0x%x\n", Value));
1468 // Write AC_VI base address register
1469 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VI].Cell[0].AllocPa);
1470 RTMP_IO_WRITE32(pAd, TX_BASE_PTR2, Value);
1471 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR2 : 0x%x\n", Value));
1473 // Write AC_VO base address register
1474 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VO].Cell[0].AllocPa);
1475 RTMP_IO_WRITE32(pAd, TX_BASE_PTR3, Value);
1476 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR3 : 0x%x\n", Value));
1478 // Write MGMT_BASE_CSR register
1479 Value = RTMP_GetPhysicalAddressLow(pAd->MgmtRing.Cell[0].AllocPa);
1480 RTMP_IO_WRITE32(pAd, TX_BASE_PTR5, Value);
1481 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR5 : 0x%x\n", Value));
1483 // Write RX_BASE_CSR register
1484 Value = RTMP_GetPhysicalAddressLow(pAd->RxRing.Cell[0].AllocPa);
1485 RTMP_IO_WRITE32(pAd, RX_BASE_PTR, Value);
1486 DBGPRINT(RT_DEBUG_TRACE, ("--> RX_BASE_PTR : 0x%x\n", Value));
1488 // Init RX Ring index pointer
1489 pAd->RxRing.RxSwReadIdx = 0;
1490 pAd->RxRing.RxCpuIdx = RX_RING_SIZE-1;
1491 RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
1493 // Init TX rings index pointer
1495 for (i=0; i<NUM_OF_TX_RING; i++)
1497 pAd->TxRing[i].TxSwFreeIdx = 0;
1498 pAd->TxRing[i].TxCpuIdx = 0;
1499 RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10) , pAd->TxRing[i].TxCpuIdx);
1503 // init MGMT ring index pointer
1504 pAd->MgmtRing.TxSwFreeIdx = 0;
1505 pAd->MgmtRing.TxCpuIdx = 0;
1506 RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
1509 // set each Ring's SIZE into ASIC. Descriptor Size is fixed by design.
1512 // Write TX_RING_CSR0 register
1513 Value = TX_RING_SIZE;
1514 RTMP_IO_WRITE32(pAd, TX_MAX_CNT0, Value);
1515 RTMP_IO_WRITE32(pAd, TX_MAX_CNT1, Value);
1516 RTMP_IO_WRITE32(pAd, TX_MAX_CNT2, Value);
1517 RTMP_IO_WRITE32(pAd, TX_MAX_CNT3, Value);
1518 RTMP_IO_WRITE32(pAd, TX_MAX_CNT4, Value);
1519 Value = MGMT_RING_SIZE;
1520 RTMP_IO_WRITE32(pAd, TX_MGMTMAX_CNT, Value);
1522 // Write RX_RING_CSR register
1523 Value = RX_RING_SIZE;
1524 RTMP_IO_WRITE32(pAd, RX_MAX_CNT, Value);
1525 #endif // RTMP_MAC_PCI //
1530 RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
1531 if (pAd->CommonCfg.PhyMode == PHY_11B)
1533 csr0.field.Ac0Txop = 192; // AC_VI: 192*32us ~= 6ms
1534 csr0.field.Ac1Txop = 96; // AC_VO: 96*32us ~= 3ms
1538 csr0.field.Ac0Txop = 96; // AC_VI: 96*32us ~= 3ms
1539 csr0.field.Ac1Txop = 48; // AC_VO: 48*32us ~= 1.5ms
1541 RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word);
1545 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
1549 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
1550 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
1553 RTMPusecDelay(1000);
1557 GloCfg.word &= 0xff0;
1558 GloCfg.field.EnTXWriteBackDDONE =1;
1559 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
1562 RTMP_IO_WRITE32(pAd, DELAY_INT_CFG, IntCfg.word);
1563 #endif // RTMP_MAC_PCI //
1568 // Status = NICLoadFirmware(pAd);
1570 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n"));
1575 ========================================================================
1577 Routine Description:
1581 Adapter Pointer to our adapter
1586 IRQL = PASSIVE_LEVEL
1590 ========================================================================
1592 NDIS_STATUS NICInitializeAsic(
1593 IN PRTMP_ADAPTER pAd,
1594 IN BOOLEAN bHardReset)
1598 UINT32 MacCsr12 = 0, Counter = 0;
1603 #endif // RTMP_MAC_USB //
1611 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n"));
1614 RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x3); // To fix driver disable/enable hang issue when radio off
1615 if (bHardReset == TRUE)
1617 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
1620 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
1622 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
1623 // Initialize MAC register to default value
1624 for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++)
1626 RTMP_IO_WRITE32(pAd, MACRegTable[Index].Register, MACRegTable[Index].Value);
1630 for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
1632 RTMP_IO_WRITE32(pAd, STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
1635 #endif // RTMP_MAC_PCI //
1638 // Make sure MAC gets ready after NICLoadFirmware().
1642 //To avoid hang-on issue when interface up in kernel 2.4,
1643 //we use a local variable "MacCsr0" instead of using "pAd->MACVersion" directly.
1646 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
1648 if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
1652 } while (Index++ < 100);
1654 pAd->MACVersion = MacCsr0;
1655 DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
1656 // turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue.
1657 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacCsr12);
1658 MacCsr12 &= (~0x2000);
1659 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacCsr12);
1661 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
1662 RTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);
1663 Status = RTUSBVenderReset(pAd);
1665 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
1667 // Initialize MAC register to default value
1668 for(Index=0; Index<NUM_MAC_REG_PARMS; Index++)
1671 if ((MACRegTable[Index].Register == TX_SW_CFG0) && (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd) || IS_RT3090(pAd) || IS_RT3390(pAd)))
1673 MACRegTable[Index].Value = 0x00000400;
1676 RTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);
1680 for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
1682 RTMP_IO_WRITE32(pAd, (USHORT)STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
1685 #endif // RTMP_MAC_USB //
1688 // Initialize RT3070 serial MAC registers which is different from RT2870 serial
1689 if (IS_RT3090(pAd) || IS_RT3572(pAd)||IS_RT3390(pAd))
1691 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
1693 // RT3071 version E has fixed this issue
1694 if ((pAd->MACVersion & 0xffff) < 0x0211)
1696 if (pAd->NicConfig2.field.DACTestBit == 1)
1698 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); // To fix throughput drop drastically
1702 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F); // To fix throughput drop drastically
1707 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);
1710 else if (IS_RT3070(pAd))
1712 if (((pAd->MACVersion & 0xffff) < 0x0201))
1714 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
1715 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); // To fix throughput drop drastically
1719 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0);
1725 // Before program BBP, we need to wait BBP/RF get wake up.
1730 RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);
1732 if ((MacCsr12 & 0x03) == 0) // if BB.RF is stable
1735 DBGPRINT(RT_DEBUG_TRACE, ("Check MAC_STATUS_CFG = Busy = %x\n", MacCsr12));
1736 RTMPusecDelay(1000);
1737 } while (Index++ < 100);
1739 // The commands to firmware should be after these commands, these commands will init firmware
1740 // PCI and USB are not the same because PCI driver needs to wait for PCI bus ready
1741 RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); // initialize BBP R/W access agent
1742 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);
1744 //2008/11/28:KH add to fix the dead rf frequency offset bug<--
1745 AsicSendCommandToMcu(pAd, 0x72, 0, 0, 0);
1746 //2008/11/28:KH add to fix the dead rf frequency offset bug-->
1748 RTMPusecDelay(1000);
1750 // Read BBP register, make sure BBP is up and running before write new data
1754 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0);
1755 DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0));
1756 } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00)));
1757 //ASSERT(Index < 20); //this will cause BSOD on Check-build driver
1759 if ((R0 == 0xff) || (R0 == 0x00))
1760 return NDIS_STATUS_FAILURE;
1762 // Initialize BBP register to default value
1763 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
1765 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
1769 // TODO: shiang, check MACVersion, currently, rbus-based chip use this.
1770 if (pAd->MACVersion == 0x28720200)
1775 //disable MLD by Bruce 20080704
1776 //BBP_IO_READ8_BY_REG_ID(pAd, BBP_R105, &value);
1777 //BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, value | 4);
1779 //Maximum PSDU length from 16K to 32K bytes
1780 RTMP_IO_READ32(pAd, MAX_LEN_CFG, &value2);
1781 value2 &= ~(0x3<<12);
1782 value2 |= (0x2<<12);
1783 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, value2);
1785 #endif // RTMP_MAC_PCI //
1787 // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
1788 // RT3090 should not program BBP R84 to 0x19, otherwise TX will block.
1789 //3070/71/72,3090,3090A( are included in RT30xx),3572,3390
1790 if (((pAd->MACVersion & 0xffff) != 0x0101) && !(IS_RT30xx(pAd)|| IS_RT3572(pAd) || IS_RT3390(pAd)))
1791 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
1794 // add by johnli, RF power sequence setup
1795 if (IS_RT30xx(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
1796 { //update for RT3070/71/72/90/91/92,3572,3390.
1797 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R79, 0x13);
1798 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R80, 0x05);
1799 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R81, 0x33);
1802 if (IS_RT3090(pAd)||IS_RT3390(pAd)) // RT309x, RT3071/72
1805 if ((pAd->MACVersion & 0xffff) >= 0x0211)
1807 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
1810 // improve power consumption
1811 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R138, &bbpreg);
1812 if (pAd->Antenna.field.TxPath == 1)
1814 // turn off tx DAC_1
1815 bbpreg = (bbpreg | 0x20);
1818 if (pAd->Antenna.field.RxPath == 1)
1820 // turn off tx ADC_1
1823 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R138, bbpreg);
1825 // improve power consumption in RT3071 Ver.E
1826 if ((pAd->MACVersion & 0xffff) >= 0x0211)
1828 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
1830 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
1833 else if (IS_RT3070(pAd))
1835 if ((pAd->MACVersion & 0xffff) >= 0x0201)
1838 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
1840 // improve power consumption in RT3070 Ver.F
1841 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
1843 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
1846 // TX_LO1_en, RF R17 register Bit 3 to 0
1847 RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
1849 // to fix rx long range issue
1850 if (pAd->NicConfig2.field.ExternalLNAForG == 0)
1854 // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h
1855 if (pAd->TxMixerGain24G >= 1)
1857 RFValue &= (~0x7); // clean bit [2:0]
1858 RFValue |= pAd->TxMixerGain24G;
1860 RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
1865 if (pAd->MACVersion == 0x28600100)
1867 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
1868 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
1871 if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) // 3*3
1873 // enlarge MAX_LEN_CFG
1875 RTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr);
1878 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr);
1883 UCHAR MAC_Value[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0};
1885 //Initialize WCID table
1887 for(Index =0 ;Index < 254;Index++)
1889 RTUSBMultiWrite(pAd, (USHORT)(MAC_WCID_BASE + Index * 8), MAC_Value, 8);
1892 #endif // RTMP_MAC_USB //
1894 // Add radio off control
1896 if (pAd->StaCfg.bRadio == FALSE)
1898 // RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);
1899 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
1900 DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n"));
1904 // Clear raw counters
1905 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
1906 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
1907 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
1908 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
1909 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
1910 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
1912 // ASIC will keep garbage value after boot
1913 // Clear all shared key table when initial
1914 // This routine can be ignored in radio-ON/OFF operation.
1917 for (KeyIdx = 0; KeyIdx < 4; KeyIdx++)
1919 RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0);
1922 // Clear all pairwise key table when initial
1923 for (KeyIdx = 0; KeyIdx < 256; KeyIdx++)
1925 RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
1929 // assert HOST ready bit
1930 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x0); // 2004-09-14 asked by Mark
1931 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x4);
1933 // It isn't necessary to clear this space when not hard reset.
1934 if (bHardReset == TRUE)
1936 // clear all on-chip BEACON frame space
1937 for (apidx = 0; apidx < HW_BEACON_MAX_COUNT; apidx++)
1939 for (i = 0; i < HW_BEACON_OFFSET>>2; i+=4)
1940 RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[apidx] + i, 0x00);
1945 AsicDisableSync(pAd);
1946 // Clear raw counters
1947 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
1948 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
1949 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
1950 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
1951 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
1952 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
1953 // Default PCI clock cycle per ms is different as default setting, which is based on PCI.
1954 RTMP_IO_READ32(pAd, USB_CYC_CFG, &Counter);
1955 Counter&=0xffffff00;
1957 RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
1958 #endif // RTMP_MAC_USB //
1961 // for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT.
1962 if ((pAd->MACVersion&0xffff) != 0x0101)
1963 RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f);
1966 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n"));
1967 return NDIS_STATUS_SUCCESS;
1971 ========================================================================
1973 Routine Description:
1977 Adapter Pointer to our adapter
1982 IRQL = PASSIVE_LEVEL
1985 Reset NIC to initial state AS IS system boot up time.
1987 ========================================================================
1990 IN PRTMP_ADAPTER pAd)
1993 DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n"));
1995 // Abort Tx, prevent ASIC from writing to Host memory
1996 //RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x001f0000);
1998 // Disable Rx, register value supposed will remain after reset
1999 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
2000 Value &= (0xfffffff3);
2001 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
2003 // Issue reset and clear from reset state
2004 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); // 2004-09-17 change from 0x01
2005 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);
2007 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n"));
2011 ========================================================================
2013 Routine Description:
2014 Check ASIC registers and find any reason the system might hang
2017 Adapter Pointer to our adapter
2022 IRQL = DISPATCH_LEVEL
2024 ========================================================================
2026 BOOLEAN NICCheckForHang(
2027 IN PRTMP_ADAPTER pAd)
2032 VOID NICUpdateFifoStaCounters(
2033 IN PRTMP_ADAPTER pAd)
2035 TX_STA_FIFO_STRUC StaFifo;
2036 MAC_TABLE_ENTRY *pEntry;
2038 UCHAR pid = 0, wcid = 0;
2044 RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);
2046 if (StaFifo.field.bValid == 0)
2049 wcid = (UCHAR)StaFifo.field.wcid;
2052 /* ignore NoACK and MGMT frame use 0xFF as WCID */
2053 if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE))
2059 /* PID store Tx MCS Rate */
2060 pid = (UCHAR)StaFifo.field.PidType;
2062 pEntry = &pAd->MacTab.Content[wcid];
2064 pEntry->DebugFIFOCount++;
2066 if (StaFifo.field.TxBF) // 3*3
2067 pEntry->TxBFCount++;
2069 if (!StaFifo.field.TxSuccess)
2071 pEntry->FIFOCount++;
2072 pEntry->OneSecTxFailCount++;
2074 if (pEntry->FIFOCount >= 1)
2076 DBGPRINT(RT_DEBUG_TRACE, ("#"));
2077 pEntry->NoBADataCountDown = 64;
2079 if(pEntry->PsMode == PWR_ACTIVE)
2082 for (tid=0; tid<NUM_OF_TID; tid++)
2084 BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, FALSE);
2087 // Update the continuous transmission counter except PS mode
2088 pEntry->ContinueTxFailCnt++;
2092 // Clear the FIFOCount when sta in Power Save mode. Basically we assume
2093 // this tx error happened due to sta just go to sleep.
2094 pEntry->FIFOCount = 0;
2095 pEntry->ContinueTxFailCnt = 0;
2097 //pEntry->FIFOCount = 0;
2099 //pEntry->bSendBAR = TRUE;
2103 if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0))
2105 pEntry->NoBADataCountDown--;
2106 if (pEntry->NoBADataCountDown==0)
2108 DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
2112 pEntry->FIFOCount = 0;
2113 pEntry->OneSecTxNoRetryOkCount++;
2114 // update NoDataIdleCount when sucessful send packet to STA.
2115 pEntry->NoDataIdleCount = 0;
2116 pEntry->ContinueTxFailCnt = 0;
2119 succMCS = StaFifo.field.SuccessRate & 0x7F;
2121 reTry = pid - succMCS;
2123 if (StaFifo.field.TxSuccess)
2125 pEntry->TXMCSExpected[pid]++;
2128 pEntry->TXMCSSuccessful[pid]++;
2132 pEntry->TXMCSAutoFallBack[pid][succMCS]++;
2137 pEntry->TXMCSFailed[pid]++;
2142 if ((pid >= 12) && succMCS <=7)
2146 pEntry->OneSecTxRetryOkCount += reTry;
2150 // ASIC store 16 stack
2151 } while ( i < (2*TX_RING_SIZE) );
2156 ========================================================================
2158 Routine Description:
2159 Read statistical counters from hardware registers and record them
2160 in software variables for later on query
2163 pAd Pointer to our adapter
2168 IRQL = DISPATCH_LEVEL
2170 ========================================================================
2172 VOID NICUpdateRawCounters(
2173 IN PRTMP_ADAPTER pAd)
2175 UINT32 OldValue;//, Value2;
2176 //ULONG PageSum, OneSecTransmitCount;
2177 //ULONG TxErrorRatio, Retry, Fail;
2178 RX_STA_CNT0_STRUC RxStaCnt0;
2179 RX_STA_CNT1_STRUC RxStaCnt1;
2180 RX_STA_CNT2_STRUC RxStaCnt2;
2181 TX_STA_CNT0_STRUC TxStaCnt0;
2182 TX_STA_CNT1_STRUC StaTx1;
2183 TX_STA_CNT2_STRUC StaTx2;
2184 TX_AGG_CNT_STRUC TxAggCnt;
2185 TX_AGG_CNT0_STRUC TxAggCnt0;
2186 TX_AGG_CNT1_STRUC TxAggCnt1;
2187 TX_AGG_CNT2_STRUC TxAggCnt2;
2188 TX_AGG_CNT3_STRUC TxAggCnt3;
2189 TX_AGG_CNT4_STRUC TxAggCnt4;
2190 TX_AGG_CNT5_STRUC TxAggCnt5;
2191 TX_AGG_CNT6_STRUC TxAggCnt6;
2192 TX_AGG_CNT7_STRUC TxAggCnt7;
2193 COUNTER_RALINK *pRalinkCounters;
2196 pRalinkCounters = &pAd->RalinkCounters;
2198 RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word);
2199 RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word);
2202 RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);
2203 // Update RX PLCP error counter
2204 pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr;
2205 // Update False CCA counter
2206 pAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca;
2209 // Update FCS counters
2210 OldValue= pAd->WlanCounters.FCSErrorCount.u.LowPart;
2211 pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); // >> 7);
2212 if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue)
2213 pAd->WlanCounters.FCSErrorCount.u.HighPart++;
2215 // Add FCS error count to private counters
2216 pRalinkCounters->OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr;
2217 OldValue = pRalinkCounters->RealFcsErrCount.u.LowPart;
2218 pRalinkCounters->RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr;
2219 if (pRalinkCounters->RealFcsErrCount.u.LowPart < OldValue)
2220 pRalinkCounters->RealFcsErrCount.u.HighPart++;
2222 // Update Duplicate Rcv check
2223 pRalinkCounters->DuplicateRcv += RxStaCnt2.field.RxDupliCount;
2224 pAd->WlanCounters.FrameDuplicateCount.u.LowPart += RxStaCnt2.field.RxDupliCount;
2225 // Update RX Overflow counter
2226 pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount);
2228 //pAd->RalinkCounters.RxCount = 0;
2230 if (pRalinkCounters->RxCount != pAd->watchDogRxCnt)
2232 pAd->watchDogRxCnt = pRalinkCounters->RxCount;
2233 pAd->watchDogRxOverFlowCnt = 0;
2237 if (RxStaCnt2.field.RxFifoOverflowCount)
2238 pAd->watchDogRxOverFlowCnt++;
2240 pAd->watchDogRxOverFlowCnt = 0;
2242 #endif // RTMP_MAC_USB //
2245 //if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) ||
2246 // (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) && (pAd->MacTab.Size != 1)))
2247 if (!pAd->bUpdateBcnCntDone)
2249 // Update BEACON sent count
2250 RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
2251 RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
2252 RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
2253 pRalinkCounters->OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount;
2254 pRalinkCounters->OneSecTxRetryOkCount += StaTx1.field.TxRetransmit;
2255 pRalinkCounters->OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess;
2256 pRalinkCounters->OneSecTxFailCount += TxStaCnt0.field.TxFailCount;
2257 pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess;
2258 pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit;
2259 pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;
2263 //if (pAd->bStaFifoTest == TRUE)
2265 RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);
2266 RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);
2267 RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);
2268 RTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);
2269 RTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);
2270 RTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word);
2271 RTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word);
2272 RTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word);
2273 RTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word);
2274 pRalinkCounters->TxAggCount += TxAggCnt.field.AggTxCount;
2275 pRalinkCounters->TxNonAggCount += TxAggCnt.field.NonAggTxCount;
2276 pRalinkCounters->TxAgg1MPDUCount += TxAggCnt0.field.AggSize1Count;
2277 pRalinkCounters->TxAgg2MPDUCount += TxAggCnt0.field.AggSize2Count;
2279 pRalinkCounters->TxAgg3MPDUCount += TxAggCnt1.field.AggSize3Count;
2280 pRalinkCounters->TxAgg4MPDUCount += TxAggCnt1.field.AggSize4Count;
2281 pRalinkCounters->TxAgg5MPDUCount += TxAggCnt2.field.AggSize5Count;
2282 pRalinkCounters->TxAgg6MPDUCount += TxAggCnt2.field.AggSize6Count;
2284 pRalinkCounters->TxAgg7MPDUCount += TxAggCnt3.field.AggSize7Count;
2285 pRalinkCounters->TxAgg8MPDUCount += TxAggCnt3.field.AggSize8Count;
2286 pRalinkCounters->TxAgg9MPDUCount += TxAggCnt4.field.AggSize9Count;
2287 pRalinkCounters->TxAgg10MPDUCount += TxAggCnt4.field.AggSize10Count;
2289 pRalinkCounters->TxAgg11MPDUCount += TxAggCnt5.field.AggSize11Count;
2290 pRalinkCounters->TxAgg12MPDUCount += TxAggCnt5.field.AggSize12Count;
2291 pRalinkCounters->TxAgg13MPDUCount += TxAggCnt6.field.AggSize13Count;
2292 pRalinkCounters->TxAgg14MPDUCount += TxAggCnt6.field.AggSize14Count;
2294 pRalinkCounters->TxAgg15MPDUCount += TxAggCnt7.field.AggSize15Count;
2295 pRalinkCounters->TxAgg16MPDUCount += TxAggCnt7.field.AggSize16Count;
2297 // Calculate the transmitted A-MPDU count
2298 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += TxAggCnt0.field.AggSize1Count;
2299 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt0.field.AggSize2Count / 2);
2301 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize3Count / 3);
2302 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize4Count / 4);
2304 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize5Count / 5);
2305 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize6Count / 6);
2307 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize7Count / 7);
2308 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize8Count / 8);
2310 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize9Count / 9);
2311 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize10Count / 10);
2313 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize11Count / 11);
2314 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize12Count / 12);
2316 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize13Count / 13);
2317 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize14Count / 14);
2319 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize15Count / 15);
2320 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count / 16);
2329 ========================================================================
2331 Routine Description:
2332 Reset NIC from error
2335 Adapter Pointer to our adapter
2340 IRQL = PASSIVE_LEVEL
2343 Reset NIC from error state
2345 ========================================================================
2347 VOID NICResetFromError(
2348 IN PRTMP_ADAPTER pAd)
2350 // Reset BBP (according to alex, reset ASIC will force reset BBP
2351 // Therefore, skip the reset BBP
2352 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x2);
2354 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
2355 // Remove ASIC from reset state
2356 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
2358 NICInitializeAdapter(pAd, FALSE);
2359 NICInitAsicFromEEPROM(pAd);
2361 // Switch to current channel, since during reset process, the connection should remains on.
2362 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2363 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2367 NDIS_STATUS NICLoadFirmware(
2368 IN PRTMP_ADAPTER pAd)
2370 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2371 if (pAd->chipOps.loadFirmware)
2372 status = pAd->chipOps.loadFirmware(pAd);
2379 ========================================================================
2381 Routine Description:
2382 erase 8051 firmware image in MAC ASIC
2385 Adapter Pointer to our adapter
2387 IRQL = PASSIVE_LEVEL
2389 ========================================================================
2391 VOID NICEraseFirmware(
2392 IN PRTMP_ADAPTER pAd)
2394 if (pAd->chipOps.eraseFirmware)
2395 pAd->chipOps.eraseFirmware(pAd);
2397 }/* End of NICEraseFirmware */
2401 ========================================================================
2403 Routine Description:
2404 Load Tx rate switching parameters
2407 Adapter Pointer to our adapter
2410 NDIS_STATUS_SUCCESS firmware image load ok
2411 NDIS_STATUS_FAILURE image not found
2413 IRQL = PASSIVE_LEVEL
2416 1. (B0: Valid Item number) (B1:Initial item from zero)
2417 2. Item Number(Dec) Mode(Hex) Current MCS(Dec) TrainUp(Dec) TrainDown(Dec)
2419 ========================================================================
2421 NDIS_STATUS NICLoadRateSwitchingParams(
2422 IN PRTMP_ADAPTER pAd)
2424 return NDIS_STATUS_SUCCESS;
2429 ========================================================================
2431 Routine Description:
2432 Compare two memory block
2435 pSrc1 Pointer to first memory address
2436 pSrc2 Pointer to second memory address
2440 1: pSrc1 memory is larger
2441 2: pSrc2 memory is larger
2443 IRQL = DISPATCH_LEVEL
2447 ========================================================================
2449 ULONG RTMPCompareMemory(
2458 pMem1 = (PUCHAR) pSrc1;
2459 pMem2 = (PUCHAR) pSrc2;
2461 for (Index = 0; Index < Length; Index++)
2463 if (pMem1[Index] > pMem2[Index])
2465 else if (pMem1[Index] < pMem2[Index])
2474 ========================================================================
2476 Routine Description:
2477 Zero out memory block
2480 pSrc1 Pointer to memory address
2486 IRQL = PASSIVE_LEVEL
2487 IRQL = DISPATCH_LEVEL
2491 ========================================================================
2493 VOID RTMPZeroMemory(
2500 pMem = (PUCHAR) pSrc;
2502 for (Index = 0; Index < Length; Index++)
2510 ========================================================================
2512 Routine Description:
2513 Copy data from memory block 1 to memory block 2
2516 pDest Pointer to destination memory address
2517 pSrc Pointer to source memory address
2523 IRQL = PASSIVE_LEVEL
2524 IRQL = DISPATCH_LEVEL
2528 ========================================================================
2530 VOID RTMPMoveMemory(
2539 ASSERT((Length==0) || (pDest && pSrc));
2541 pMem1 = (PUCHAR) pDest;
2542 pMem2 = (PUCHAR) pSrc;
2544 for (Index = 0; Index < Length; Index++)
2546 pMem1[Index] = pMem2[Index];
2551 ========================================================================
2553 Routine Description:
2554 Initialize port configuration structure
2557 Adapter Pointer to our adapter
2562 IRQL = PASSIVE_LEVEL
2566 ========================================================================
2569 IN PRTMP_ADAPTER pAd)
2571 UINT key_index, bss_index;
2573 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit\n"));
2576 // part I. intialize common configuration
2579 pAd->BulkOutReq = 0;
2581 pAd->BulkOutComplete = 0;
2582 pAd->BulkOutCompleteOther = 0;
2583 pAd->BulkOutCompleteCancel = 0;
2585 pAd->BulkInComplete = 0;
2586 pAd->BulkInCompleteFail = 0;
2588 //pAd->QuickTimerP = 100;
2589 //pAd->TurnAggrBulkInCount = 0;
2590 pAd->bUsbTxBulkAggre = 0;
2592 // init as unsed value to ensure driver will set to MCU once.
2593 pAd->LedIndicatorStrength = 0xFF;
2595 pAd->CommonCfg.MaxPktOneTxBulk = 2;
2596 pAd->CommonCfg.TxBulkFactor = 1;
2597 pAd->CommonCfg.RxBulkFactor =1;
2599 pAd->CommonCfg.TxPower = 100; //mW
2601 NdisZeroMemory(&pAd->CommonCfg.IOTestParm, sizeof(pAd->CommonCfg.IOTestParm));
2602 #endif // RTMP_MAC_USB //
2604 for(key_index=0; key_index<SHARE_KEY_NUM; key_index++)
2606 for(bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++)
2608 pAd->SharedKey[bss_index][key_index].KeyLen = 0;
2609 pAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE;
2613 pAd->EepromAccess = FALSE;
2615 pAd->Antenna.word = 0;
2616 pAd->CommonCfg.BBPCurrentBW = BW_20;
2618 pAd->LedCntl.word = 0;
2620 pAd->LedIndicatorStrength = 0;
2621 pAd->RLnkCtrlOffset = 0;
2622 pAd->HostLnkCtrlOffset = 0;
2623 pAd->StaCfg.PSControl.field.EnableNewPS=TRUE;
2624 pAd->CheckDmaBusyCount = 0;
2625 #endif // RTMP_MAC_PCI //
2627 pAd->bAutoTxAgcA = FALSE; // Default is OFF
2628 pAd->bAutoTxAgcG = FALSE; // Default is OFF
2629 pAd->RfIcType = RFIC_2820;
2631 // Init timer for reset complete event
2632 pAd->CommonCfg.CentralChannel = 1;
2633 pAd->bForcePrintTX = FALSE;
2634 pAd->bForcePrintRX = FALSE;
2635 pAd->bStaFifoTest = FALSE;
2636 pAd->bProtectionTest = FALSE;
2637 pAd->CommonCfg.Dsifs = 10; // in units of usec
2638 pAd->CommonCfg.TxPower = 100; //mW
2639 pAd->CommonCfg.TxPowerPercentage = 0xffffffff; // AUTO
2640 pAd->CommonCfg.TxPowerDefault = 0xffffffff; // AUTO
2641 pAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; // use Long preamble on TX by defaut
2642 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
2643 pAd->CommonCfg.RtsThreshold = 2347;
2644 pAd->CommonCfg.FragmentThreshold = 2346;
2645 pAd->CommonCfg.UseBGProtection = 0; // 0: AUTO
2646 pAd->CommonCfg.bEnableTxBurst = TRUE; //0;
2647 pAd->CommonCfg.PhyMode = 0xff; // unknown
2648 pAd->CommonCfg.BandState = UNKNOWN_BAND;
2649 pAd->CommonCfg.RadarDetect.CSPeriod = 10;
2650 pAd->CommonCfg.RadarDetect.CSCount = 0;
2651 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
2656 pAd->CommonCfg.RadarDetect.ChMovingTime = 65;
2657 pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 3;
2658 pAd->CommonCfg.bAPSDCapable = FALSE;
2659 pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
2660 pAd->CommonCfg.TriggerTimerCount = 0;
2661 pAd->CommonCfg.bAPSDForcePowerSave = FALSE;
2662 pAd->CommonCfg.bCountryFlag = FALSE;
2663 pAd->CommonCfg.TxStream = 0;
2664 pAd->CommonCfg.RxStream = 0;
2666 NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI));
2668 NdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
2669 pAd->HTCEnable = FALSE;
2670 pAd->bBroadComHT = FALSE;
2671 pAd->CommonCfg.bRdg = FALSE;
2673 NdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
2674 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
2675 pAd->CommonCfg.BACapability.field.MpduDensity = 0;
2676 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
2677 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; //32;
2678 pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; //32;
2679 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit. BACapability = 0x%x\n", pAd->CommonCfg.BACapability.word));
2681 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
2682 BATableInit(pAd, &pAd->BATable);
2684 pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
2685 pAd->CommonCfg.bHTProtect = 1;
2686 pAd->CommonCfg.bMIMOPSEnable = TRUE;
2687 //2008/11/05:KH add to support Antenna power-saving of AP<--
2688 pAd->CommonCfg.bGreenAPEnable=FALSE;
2689 //2008/11/05:KH add to support Antenna power-saving of AP-->
2690 pAd->CommonCfg.bBADecline = FALSE;
2691 pAd->CommonCfg.bDisableReordering = FALSE;
2693 if (pAd->MACVersion == 0x28720200)
2695 pAd->CommonCfg.TxBASize = 13; //by Jerry recommend
2697 pAd->CommonCfg.TxBASize = 7;
2700 pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
2702 //pAd->CommonCfg.HTPhyMode.field.BW = BW_20;
2703 //pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO;
2704 //pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800;
2705 //pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE;
2706 pAd->CommonCfg.TxRate = RATE_6;
2708 pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;
2709 pAd->CommonCfg.MlmeTransmit.field.BW = BW_20;
2710 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
2712 pAd->CommonCfg.BeaconPeriod = 100; // in mSec
2715 // part II. intialize STA specific configuration
2718 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT);
2719 RX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST);
2720 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);
2721 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);
2723 pAd->StaCfg.Psm = PWR_ACTIVE;
2725 pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled;
2726 pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;
2727 pAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled;
2728 pAd->StaCfg.bMixCipher = FALSE;
2729 pAd->StaCfg.DefaultKeyId = 0;
2731 // 802.1x port control
2732 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
2733 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
2734 pAd->StaCfg.LastMicErrorTime = 0;
2735 pAd->StaCfg.MicErrCnt = 0;
2736 pAd->StaCfg.bBlockAssoc = FALSE;
2737 pAd->StaCfg.WpaState = SS_NOTUSE;
2739 pAd->CommonCfg.NdisRadioStateOff = FALSE; // New to support microsoft disable radio with OID command
2741 pAd->StaCfg.RssiTrigger = 0;
2742 NdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(RSSI_SAMPLE));
2743 pAd->StaCfg.RssiTriggerMode = RSSI_TRIGGERED_UPON_BELOW_THRESHOLD;
2744 pAd->StaCfg.AtimWin = 0;
2745 pAd->StaCfg.DefaultListenCount = 3;//default listen count;
2746 pAd->StaCfg.BssType = BSS_INFRA; // BSS_INFRA or BSS_ADHOC or BSS_MONITOR
2747 pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
2748 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
2749 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
2751 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
2752 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
2755 #ifdef PCIE_PS_SUPPORT
2756 pAd->brt30xxBanMcuCmd = FALSE;
2757 pAd->b3090ESpecialChip = FALSE;
2758 //KH Debug:the following must be removed
2759 pAd->StaCfg.PSControl.field.rt30xxPowerMode=3;
2760 pAd->StaCfg.PSControl.field.rt30xxForceASPMTest=0;
2761 pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM=1;
2762 #endif // PCIE_PS_SUPPORT //
2764 // global variables mXXXX used in MAC protocol state machines
2765 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
2766 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
2767 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
2769 // PHY specification
2770 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; // default PHY mode
2771 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); // CCK use LONG preamble
2774 // user desired power mode
2775 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
2776 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
2777 pAd->StaCfg.bWindowsACCAMEnable = FALSE;
2779 RTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer, GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec), pAd, FALSE);
2780 pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
2783 pAd->StaCfg.ScanCnt = 0;
2785 pAd->StaCfg.bHwRadio = TRUE; // Default Hardware Radio status is On
2786 pAd->StaCfg.bSwRadio = TRUE; // Default Software Radio status is On
2787 pAd->StaCfg.bRadio = TRUE; // bHwRadio && bSwRadio
2788 pAd->StaCfg.bHardwareRadio = FALSE; // Default is OFF
2789 pAd->StaCfg.bShowHiddenSSID = FALSE; // Default no show
2791 // Nitro mode control
2792 pAd->StaCfg.bAutoReconnect = TRUE;
2794 // Save the init time as last scan time, the system should do scan after 2 seconds.
2795 // This patch is for driver wake up from standby mode, system will do scan right away.
2796 NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);
2797 if (pAd->StaCfg.LastScanTime > 10 * OS_HZ)
2798 pAd->StaCfg.LastScanTime -= (10 * OS_HZ);
2800 NdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE+1);
2802 sprintf((PSTRING) pAd->nickname, "RT2860STA");
2803 #endif // RTMP_MAC_PCI //
2805 sprintf((PSTRING) pAd->nickname, "RT2870STA");
2806 #endif // RTMP_MAC_USB //
2807 RTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer, GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc), pAd, FALSE);
2808 pAd->StaCfg.IEEE8021X = FALSE;
2809 pAd->StaCfg.IEEE8021x_required_keys = FALSE;
2810 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
2811 pAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE;
2812 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
2814 NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);
2817 pAd->StaCfg.bAutoConnectByBssid = FALSE;
2818 pAd->StaCfg.BeaconLostTime = BEACON_LOST_TIME;
2819 NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);
2820 pAd->StaCfg.WpaPassPhraseLen = 0;
2821 pAd->StaCfg.bAutoRoaming = FALSE;
2822 pAd->StaCfg.bForceTxBurst = FALSE;
2825 // Default for extra information is not valid
2826 pAd->ExtraInfo = EXTRA_INFO_CLEAR;
2828 // Default Config change flag
2829 pAd->bConfigChanged = FALSE;
2832 // part III. AP configurations
2839 // dynamic BBP R66:sensibity tuning to overcome background noise
2840 pAd->BbpTuning.bEnable = TRUE;
2841 pAd->BbpTuning.FalseCcaLowerThreshold = 100;
2842 pAd->BbpTuning.FalseCcaUpperThreshold = 512;
2843 pAd->BbpTuning.R66Delta = 4;
2844 pAd->Mlme.bEnableAutoAntennaCheck = TRUE;
2847 // Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value.
2848 // if not initial this value, the default value will be 0.
2850 pAd->BbpTuning.R66CurrentValue = 0x38;
2852 pAd->Bbp94 = BBPR94_DEFAULT;
2853 pAd->BbpForCCK = FALSE;
2855 // Default is FALSE for test bit 1
2856 //pAd->bTest1 = FALSE;
2858 // initialize MAC table and allocate spin lock
2859 NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));
2860 InitializeQueueHeader(&pAd->MacTab.McastPsQueue);
2861 NdisAllocateSpinLock(&pAd->MacTabLock);
2863 //RTMPInitTimer(pAd, &pAd->RECBATimer, RECBATimerTimeout, pAd, TRUE);
2864 //RTMPSetTimer(&pAd->RECBATimer, REORDER_EXEC_INTV);
2868 pAd->CommonCfg.bWiFiTest = FALSE;
2870 pAd->bPCIclkOff = FALSE;
2871 #endif // RTMP_MAC_PCI //
2873 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
2874 DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
2877 // IRQL = PASSIVE_LEVEL
2878 UCHAR BtoH(STRING ch)
2880 if (ch >= '0' && ch <= '9') return (ch - '0'); // Handle numerals
2881 if (ch >= 'A' && ch <= 'F') return (ch - 'A' + 0xA); // Handle capitol hex digits
2882 if (ch >= 'a' && ch <= 'f') return (ch - 'a' + 0xA); // Handle small hex digits
2887 // FUNCTION: AtoH(char *, UCHAR *, int)
2889 // PURPOSE: Converts ascii string to network order hex
2892 // src - pointer to input ascii string
2893 // dest - pointer to output hex
2894 // destlen - size of dest
2898 // 2 ascii bytes make a hex byte so must put 1st ascii byte of pair
2899 // into upper nibble and 2nd ascii byte of pair into lower nibble.
2901 // IRQL = PASSIVE_LEVEL
2903 void AtoH(PSTRING src, PUCHAR dest, int destlen)
2909 destTemp = (PUCHAR) dest;
2913 *destTemp = BtoH(*srcptr++) << 4; // Put 1st ascii byte in upper nibble.
2914 *destTemp += BtoH(*srcptr++); // Add 2nd ascii byte to above.
2920 //+++Mark by shiang, not use now, need to remove after confirm
2921 //---Mark by shiang, not use now, need to remove after confirm
2925 ========================================================================
2927 Routine Description:
2931 pAd Pointer to our adapter
2932 pTimer Timer structure
2933 pTimerFunc Function to execute when timer expired
2934 Repeat Ture for period timer
2941 ========================================================================
2944 IN PRTMP_ADAPTER pAd,
2945 IN PRALINK_TIMER_STRUCT pTimer,
2946 IN PVOID pTimerFunc,
2951 // Set Valid to TRUE for later used.
2952 // It will crash if we cancel a timer or set a timer
2953 // that we haven't initialize before.
2955 pTimer->Valid = TRUE;
2957 pTimer->PeriodicType = Repeat;
2958 pTimer->State = FALSE;
2959 pTimer->cookie = (ULONG) pData;
2961 #ifdef RTMP_TIMER_TASK_SUPPORT
2963 #endif // RTMP_TIMER_TASK_SUPPORT //
2965 RTMP_OS_Init_Timer(pAd, &pTimer->TimerObj, pTimerFunc, (PVOID) pTimer);
2969 ========================================================================
2971 Routine Description:
2975 pTimer Timer structure
2976 Value Timer value in milliseconds
2982 To use this routine, must call RTMPInitTimer before.
2984 ========================================================================
2987 IN PRALINK_TIMER_STRUCT pTimer,
2992 pTimer->TimerValue = Value;
2993 pTimer->State = FALSE;
2994 if (pTimer->PeriodicType == TRUE)
2996 pTimer->Repeat = TRUE;
2997 RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);
3001 pTimer->Repeat = FALSE;
3002 RTMP_OS_Add_Timer(&pTimer->TimerObj, Value);
3007 DBGPRINT_ERR(("RTMPSetTimer failed, Timer hasn't been initialize!\n"));
3013 ========================================================================
3015 Routine Description:
3019 pTimer Timer structure
3020 Value Timer value in milliseconds
3026 To use this routine, must call RTMPInitTimer before.
3028 ========================================================================
3031 IN PRALINK_TIMER_STRUCT pTimer,
3038 pTimer->TimerValue = Value;
3039 pTimer->State = FALSE;
3040 if (pTimer->PeriodicType == TRUE)
3042 RTMPCancelTimer(pTimer, &Cancel);
3043 RTMPSetTimer(pTimer, Value);
3047 RTMP_OS_Mod_Timer(&pTimer->TimerObj, Value);
3052 DBGPRINT_ERR(("RTMPModTimer failed, Timer hasn't been initialize!\n"));
3057 ========================================================================
3059 Routine Description:
3060 Cancel timer objects
3063 Adapter Pointer to our adapter
3068 IRQL = PASSIVE_LEVEL
3069 IRQL = DISPATCH_LEVEL
3072 1.) To use this routine, must call RTMPInitTimer before.
3073 2.) Reset NIC to initial state AS IS system boot up time.
3075 ========================================================================
3077 VOID RTMPCancelTimer(
3078 IN PRALINK_TIMER_STRUCT pTimer,
3079 OUT BOOLEAN *pCancelled)
3083 if (pTimer->State == FALSE)
3084 pTimer->Repeat = FALSE;
3086 RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);
3088 if (*pCancelled == TRUE)
3089 pTimer->State = TRUE;
3091 #ifdef RTMP_TIMER_TASK_SUPPORT
3092 // We need to go-through the TimerQ to findout this timer handler and remove it if
3093 // it's still waiting for execution.
3094 RtmpTimerQRemove(pTimer->pAd, pTimer);
3095 #endif // RTMP_TIMER_TASK_SUPPORT //
3099 DBGPRINT_ERR(("RTMPCancelTimer failed, Timer hasn't been initialize!\n"));
3104 ========================================================================
3106 Routine Description:
3110 pAd Pointer to our adapter
3116 IRQL = PASSIVE_LEVEL
3117 IRQL = DISPATCH_LEVEL
3121 ========================================================================
3124 IN PRTMP_ADAPTER pAd,
3131 LowByte = pAd->LedCntl.field.LedMode&0x7f;
3136 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3137 pAd->LedIndicatorStrength = 0;
3140 if (pAd->CommonCfg.Channel > 14)
3144 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3148 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3151 LowByte = 0; // Driver sets MAC register and MAC controls LED
3154 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3158 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3160 case LED_ON_SITE_SURVEY:
3162 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3166 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3169 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetLED::Unknown Status %d\n", Status));
3174 // Keep LED status for LED SiteSurvey mode.
3175 // After SiteSurvey, we will set the LED mode to previous status.
3177 if ((Status != LED_ON_SITE_SURVEY) && (Status != LED_POWER_UP))
3178 pAd->LedStatus = Status;
3180 DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetLED::Mode=%d,HighByte=0x%02x,LowByte=0x%02x\n", pAd->LedCntl.field.LedMode, HighByte, LowByte));
3184 ========================================================================
3186 Routine Description:
3187 Set LED Signal Stregth
3190 pAd Pointer to our adapter
3196 IRQL = PASSIVE_LEVEL
3199 Can be run on any IRQL level.
3201 According to Microsoft Zero Config Wireless Signal Stregth definition as belows.
3208 ========================================================================
3210 VOID RTMPSetSignalLED(
3211 IN PRTMP_ADAPTER pAd,
3212 IN NDIS_802_11_RSSI Dbm)
3216 if (pAd->LedCntl.field.LedMode == LED_MODE_SIGNAL_STREGTH)
3220 else if (Dbm <= -81)
3222 else if (Dbm <= -71)
3224 else if (Dbm <= -67)
3226 else if (Dbm <= -57)
3232 // Update Signal Stregth to firmware if changed.
3234 if (pAd->LedIndicatorStrength != nLed)
3236 AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed, pAd->LedCntl.field.Polarity);
3237 pAd->LedIndicatorStrength = nLed;
3243 ========================================================================
3245 Routine Description:
3249 pAd Pointer to our adapter
3254 IRQL <= DISPATCH_LEVEL
3257 Before Enable RX, make sure you have enabled Interrupt.
3258 ========================================================================
3260 VOID RTMPEnableRxTx(
3261 IN PRTMP_ADAPTER pAd)
3263 // WPDMA_GLO_CFG_STRUC GloCfg;
3265 UINT32 rx_filter_flag;
3267 DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n"));
3270 RT28XXDMAEnable(pAd);
3272 // enable RX of MAC block
3273 if (pAd->OpMode == OPMODE_AP)
3275 rx_filter_flag = APNORMAL;
3278 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); // enable RX of DMA block
3282 if (pAd->CommonCfg.PSPXlink)
3283 rx_filter_flag = PSPXLINK;
3285 rx_filter_flag = STANORMAL; // Staion not drop control frame will fail WiFi Certification.
3286 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);
3289 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);
3290 DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPEnableRxTx\n"));
3294 //+++Add by shiang, move from os/linux/rt_main_dev.c
3295 void CfgInitHook(PRTMP_ADAPTER pAd)
3297 pAd->bBroadComHT = TRUE;
3302 IN PRTMP_ADAPTER pAd,
3303 IN PSTRING pDefaultMac,
3304 IN PSTRING pHostName)
3314 // If dirver doesn't wake up firmware here,
3315 // NICLoadFirmware will hang forever when interface is up again.
3317 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) &&
3318 OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
3320 AUTO_WAKEUP_STRUC AutoWakeupCfg;
3321 AsicForceWakeup(pAd, TRUE);
3322 AutoWakeupCfg.word = 0;
3323 RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
3324 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
3327 #endif // RTMP_MAC_PCI //
3330 // reset Adapter flags
3331 RTMP_CLEAR_FLAGS(pAd);
3333 // Init BssTab & ChannelInfo tabbles for auto channel select.
3335 // Allocate BA Reordering memory
3336 ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM);
3338 // Make sure MAC gets ready.
3342 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
3343 pAd->MACVersion = MacCsr0;
3345 if ((pAd->MACVersion != 0x00) && (pAd->MACVersion != 0xFFFFFFFF))
3349 } while (index++ < 100);
3350 DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
3353 #ifdef PCIE_PS_SUPPORT
3354 /*Iverson patch PCIE L1 issue to make sure that driver can be read,write ,BBP and RF register at pcie L.1 level */
3355 if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))&&OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
3357 RTMP_IO_READ32(pAd, AUX_CTRL, &MacCsr0);
3359 RTMP_IO_WRITE32(pAd, AUX_CTRL, MacCsr0);
3360 DBGPRINT(RT_DEBUG_TRACE, ("AUX_CTRL = 0x%x\n", MacCsr0));
3362 #endif // PCIE_PS_SUPPORT //
3364 // To fix driver disable/enable hang issue when radio off
3365 RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x2);
3366 #endif // RTMP_MAC_PCI //
3369 RT28XXDMADisable(pAd);
3372 // Load 8051 firmware
3373 Status = NICLoadFirmware(pAd);
3374 if (Status != NDIS_STATUS_SUCCESS)
3376 DBGPRINT_ERR(("NICLoadFirmware failed, Status[=0x%08x]\n", Status));
3380 NICLoadRateSwitchingParams(pAd);
3382 // Disable interrupts here which is as soon as possible
3383 // This statement should never be true. We might consider to remove it later
3385 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE))
3387 RTMP_ASIC_INTERRUPT_DISABLE(pAd);
3389 #endif // RTMP_MAC_PCI //
3391 Status = RTMPAllocTxRxRingMemory(pAd);
3392 if (Status != NDIS_STATUS_SUCCESS)
3394 DBGPRINT_ERR(("RTMPAllocDMAMemory failed, Status[=0x%08x]\n", Status));
3398 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
3403 Status = RtmpMgmtTaskInit(pAd);
3404 if (Status != NDIS_STATUS_SUCCESS)
3407 Status = MlmeInit(pAd);
3408 if (Status != NDIS_STATUS_SUCCESS)
3410 DBGPRINT_ERR(("MlmeInit failed, Status[=0x%08x]\n", Status));
3414 // Initialize pAd->StaCfg, pAd->ApCfg, pAd->CommonCfg to manufacture default
3417 Status = RtmpNetTaskInit(pAd);
3418 if (Status != NDIS_STATUS_SUCCESS)
3421 // COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].Bssid, netif->hwaddr);
3422 // pAd->bForcePrintTX = TRUE;
3426 NdisAllocateSpinLock(&pAd->MacTabLock);
3428 MeasureReqTabInit(pAd);
3432 // Init the hardware, we need to init asic before read registry, otherwise mac register will be reset
3434 Status = NICInitializeAdapter(pAd, TRUE);
3435 if (Status != NDIS_STATUS_SUCCESS)
3437 DBGPRINT_ERR(("NICInitializeAdapter failed, Status[=0x%08x]\n", Status));
3438 if (Status != NDIS_STATUS_SUCCESS)
3442 DBGPRINT(RT_DEBUG_OFF, ("1. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
3445 pAd->CommonCfg.bMultipleIRP = FALSE;
3447 if (pAd->CommonCfg.bMultipleIRP)
3448 pAd->CommonCfg.NumOfBulkInIRP = RX_RING_SIZE;
3450 pAd->CommonCfg.NumOfBulkInIRP = 1;
3451 #endif // RTMP_MAC_USB //
3453 //Init Ba Capability parameters.
3454 // RT28XX_BA_INIT(pAd);
3455 pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
3456 pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable;
3457 pAd->CommonCfg.DesiredHtPhy.AmsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;
3458 pAd->CommonCfg.DesiredHtPhy.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;
3460 pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;
3461 pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;
3462 pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
3464 // after reading Registry, we now know if in AP mode or STA mode
3466 // Load 8051 firmware; crash when FW image not existent
3467 // Status = NICLoadFirmware(pAd);
3468 // if (Status != NDIS_STATUS_SUCCESS)
3471 DBGPRINT(RT_DEBUG_OFF, ("2. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
3473 // We should read EEPROM for all cases. rt2860b
3474 NICReadEEPROMParameters(pAd, (PUCHAR)pDefaultMac);
3476 DBGPRINT(RT_DEBUG_OFF, ("3. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
3478 NICInitAsicFromEEPROM(pAd); //rt2860b
3480 // Set PHY to appropriate mode
3481 TmpPhy = pAd->CommonCfg.PhyMode;
3482 pAd->CommonCfg.PhyMode = 0xff;
3483 RTMPSetPhyMode(pAd, TmpPhy);
3486 // No valid channels.
3487 if (pAd->ChannelListNum == 0)
3489 DBGPRINT(RT_DEBUG_ERROR, ("Wrong configuration. No valid channel found. Check \"ContryCode\" and \"ChannelGeography\" setting.\n"));
3493 DBGPRINT(RT_DEBUG_OFF, ("MCS Set = %02x %02x %02x %02x %02x\n", pAd->CommonCfg.HtCapability.MCSSet[0],
3494 pAd->CommonCfg.HtCapability.MCSSet[1], pAd->CommonCfg.HtCapability.MCSSet[2],
3495 pAd->CommonCfg.HtCapability.MCSSet[3], pAd->CommonCfg.HtCapability.MCSSet[4]));
3497 #ifdef RTMP_RF_RW_SUPPORT
3498 //Init RT30xx RFRegisters after read RFIC type from EEPROM
3499 NICInitRFRegisters(pAd);
3500 #endif // RTMP_RF_RW_SUPPORT //
3502 // APInitialize(pAd);
3506 // Initialize RF register to default value
3508 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
3509 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
3511 // 8051 firmware require the signal during booting time.
3512 //2008/11/28:KH marked the following codes to patch Frequency offset bug
3513 //AsicSendCommandToMcu(pAd, 0x72, 0xFF, 0x00, 0x00);
3515 if (pAd && (Status != NDIS_STATUS_SUCCESS))
3518 // Undo everything if it failed
3520 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
3522 // NdisMDeregisterInterrupt(&pAd->Interrupt);
3523 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
3525 // RTMPFreeAdapter(pAd); // we will free it in disconnect()
3529 // Microsoft HCT require driver send a disconnect event after driver initialization.
3530 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
3531 // pAd->IndicateMediaState = NdisMediaStateDisconnected;
3532 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE);
3534 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event B!\n"));
3537 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);
3538 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
3541 // Support multiple BulkIn IRP,
3542 // the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1.
3544 for(index=0; index<pAd->CommonCfg.NumOfBulkInIRP; index++)
3546 RTUSBBulkReceive(pAd);
3547 DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBulkReceive!\n" ));
3549 #endif // RTMP_MAC_USB //
3553 // Set up the Mac address
3554 RtmpOSNetDevAddrSet(pAd->net_dev, &pAd->CurrentAddress[0]);
3556 DBGPRINT_S(Status, ("<==== rt28xx_init, Status=%x\n", Status));
3565 RTMPFreeTxRxRingMemory(pAd);
3568 os_free_mem(pAd, pAd->mpdu_blk_pool.mem); // free BA pool
3570 // shall not set priv to NULL here because the priv didn't been free yet.
3571 //net_dev->ml_priv = 0;
3576 DBGPRINT(RT_DEBUG_ERROR, ("!!! rt28xx Initialized fail !!!\n"));
3579 //---Add by shiang, move from os/linux/rt_main_dev.c
3582 static INT RtmpChipOpsRegister(
3583 IN RTMP_ADAPTER *pAd,
3586 RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
3589 memset(pChipOps, 0, sizeof(RTMP_CHIP_OP));
3591 /* set eeprom related hook functions */
3592 status = RtmpChipOpsEepromHook(pAd, infType);
3594 /* set mcu related hook functions */
3597 #ifdef RTMP_PCI_SUPPORT
3598 case RTMP_DEV_INF_PCI:
3599 pChipOps->loadFirmware = RtmpAsicLoadFirmware;
3600 pChipOps->eraseFirmware = RtmpAsicEraseFirmware;
3601 pChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu;
3603 #endif // RTMP_PCI_SUPPORT //
3604 #ifdef RTMP_USB_SUPPORT
3605 case RTMP_DEV_INF_USB:
3606 pChipOps->loadFirmware = RtmpAsicLoadFirmware;
3607 pChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu;
3609 #endif // RTMP_USB_SUPPORT //
3618 INT RtmpRaDevCtrlInit(
3619 IN RTMP_ADAPTER *pAd,
3620 IN RTMP_INF_TYPE infType)
3624 // Assign the interface type. We need use it when do register/EEPROM access.
3625 pAd->infType = infType;
3628 pAd->OpMode = OPMODE_STA;
3629 DBGPRINT(RT_DEBUG_TRACE, ("STA Driver version-%s\n", STA_DRIVER_VERSION));
3632 init_MUTEX(&(pAd->UsbVendorReq_semaphore));
3633 os_alloc_mem(pAd, (PUCHAR)&pAd->UsbVendorReqBuf, MAX_PARAM_BUFFER_SIZE - 1);
3634 if (pAd->UsbVendorReqBuf == NULL)
3636 DBGPRINT(RT_DEBUG_ERROR, ("Allocate vendor request temp buffer failed!\n"));
3639 #endif // RTMP_MAC_USB //
3641 RtmpChipOpsRegister(pAd, infType);
3648 BOOLEAN RtmpRaDevCtrlExit(IN RTMP_ADAPTER *pAd)
3652 RTMPFreeAdapter(pAd);
3658 // not yet support MBSS
3659 PNET_DEV get_netdev_from_bssid(
3660 IN PRTMP_ADAPTER pAd,
3661 IN UCHAR FromWhichBSSID)
3663 PNET_DEV dev_p = NULL;
3666 dev_p = pAd->net_dev;
3670 return dev_p; /* return one of MBSS */