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);
698 // Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8
699 RTMP_IO_READ32(pAd, E2PROM_CSR, &data);
700 DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%x\n", data));
702 if((data & 0x30) == 0)
703 pAd->EEPROMAddressNum = 6; // 93C46
704 else if((data & 0x30) == 0x10)
705 pAd->EEPROMAddressNum = 8; // 93C66
707 pAd->EEPROMAddressNum = 8; // 93C86
708 DBGPRINT(RT_DEBUG_TRACE, ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum ));
710 // RT2860 MAC no longer auto load MAC address from E2PROM. Driver has to intialize
711 // MAC address registers according to E2PROM setting
712 if (mac_addr == NULL ||
713 strlen((PSTRING) mac_addr) != 17 ||
714 mac_addr[2] != ':' || mac_addr[5] != ':' || mac_addr[8] != ':' ||
715 mac_addr[11] != ':' || mac_addr[14] != ':')
717 USHORT Addr01,Addr23,Addr45 ;
719 RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);
720 RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);
721 RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);
723 pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);
724 pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8);
725 pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);
726 pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8);
727 pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);
728 pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8);
730 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from E2PROM \n"));
737 macptr = (PSTRING) mac_addr;
739 for (j=0; j<MAC_ADDR_LEN; j++)
741 AtoH(macptr, &pAd->PermanentAddress[j], 1);
745 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from module parameter \n"));
750 //more conveninet to test mbssid, so ap's bssid &0xf1
751 if (pAd->PermanentAddress[0] == 0xff)
752 pAd->PermanentAddress[0] = RandomByte(pAd)&0xf8;
754 //if (pAd->PermanentAddress[5] == 0xff)
755 // pAd->PermanentAddress[5] = RandomByte(pAd)&0xf8;
757 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
758 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
759 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
760 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
761 if (pAd->bLocalAdminMAC == FALSE)
765 COPY_MAC_ADDR(pAd->CurrentAddress, pAd->PermanentAddress);
766 csr2.field.Byte0 = pAd->CurrentAddress[0];
767 csr2.field.Byte1 = pAd->CurrentAddress[1];
768 csr2.field.Byte2 = pAd->CurrentAddress[2];
769 csr2.field.Byte3 = pAd->CurrentAddress[3];
770 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word);
772 csr3.field.Byte4 = pAd->CurrentAddress[4];
773 csr3.field.Byte5 = pAd->CurrentAddress[5];
774 csr3.field.U2MeMask = 0xff;
775 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word);
776 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
777 PRINT_MAC(pAd->PermanentAddress)));
781 // if not return early. cause fail at emulation.
782 // Init the channel number for TX channel power
783 RTMPReadChannelPwr(pAd);
785 // if E2PROM version mismatch with driver's expectation, then skip
786 // all subsequent E2RPOM retieval and set a system error bit to notify GUI
787 RT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word);
788 pAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256;
789 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: Version = %d, FAE release #%d\n", Version.field.Version, Version.field.FaeReleaseNumber));
791 if (Version.field.Version > VALID_EEPROM_VERSION)
793 DBGPRINT_ERR(("E2PROM: WRONG VERSION 0x%x, should be %d\n",Version.field.Version, VALID_EEPROM_VERSION));
794 /*pAd->SystemErrorBitmap |= 0x00000001;
796 // hard-code default value when no proper E2PROM installed
797 pAd->bAutoTxAgcA = FALSE;
798 pAd->bAutoTxAgcG = FALSE;
800 // Default the channel power
801 for (i = 0; i < MAX_NUM_OF_CHANNELS; i++)
802 pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER;
804 // Default the channel power
805 for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++)
806 pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER;
808 for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++)
809 pAd->EEPROMDefaultValue[i] = 0xffff;
813 // Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd
814 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value);
815 pAd->EEPROMDefaultValue[0] = value;
817 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);
818 pAd->EEPROMDefaultValue[1] = value;
820 RT28xx_EEPROM_READ16(pAd, 0x38, value); // Country Region
821 pAd->EEPROMDefaultValue[2] = value;
823 for(i = 0; i < 8; i++)
825 RT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2, value);
826 pAd->EEPROMDefaultValue[i+3] = value;
829 // We have to parse NIC configuration 0 at here.
830 // If TSSI did not have preloaded value, it should reset the TxAutoAgc to false
831 // Therefore, we have to read TxAutoAgc control beforehand.
832 // Read Tx AGC control bit
833 Antenna.word = pAd->EEPROMDefaultValue[0];
834 if (Antenna.word == 0xFFFF)
837 if(IS_RT3090(pAd)|| IS_RT3390(pAd))
840 Antenna.field.RfIcType = RFIC_3020;
841 Antenna.field.TxPath = 1;
842 Antenna.field.RxPath = 1;
849 Antenna.field.RfIcType = RFIC_2820;
850 Antenna.field.TxPath = 1;
851 Antenna.field.RxPath = 2;
852 DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
856 // Choose the desired Tx&Rx stream.
857 if ((pAd->CommonCfg.TxStream == 0) || (pAd->CommonCfg.TxStream > Antenna.field.TxPath))
858 pAd->CommonCfg.TxStream = Antenna.field.TxPath;
860 if ((pAd->CommonCfg.RxStream == 0) || (pAd->CommonCfg.RxStream > Antenna.field.RxPath))
862 pAd->CommonCfg.RxStream = Antenna.field.RxPath;
864 if ((pAd->MACVersion < RALINK_2883_VERSION) &&
865 (pAd->CommonCfg.RxStream > 2))
867 // only 2 Rx streams for RT2860 series
868 pAd->CommonCfg.RxStream = 2;
873 // read value from EEPROM and set them to CSR174 ~ 177 in chain0 ~ chain2
879 NicConfig2.word = pAd->EEPROMDefaultValue[1];
882 if ((NicConfig2.word & 0x00ff) == 0xff)
884 NicConfig2.word &= 0xff00;
887 if ((NicConfig2.word >> 8) == 0xff)
889 NicConfig2.word &= 0x00ff;
893 if (NicConfig2.field.DynamicTxAgcControl == 1)
894 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
896 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
898 DBGPRINT_RAW(RT_DEBUG_TRACE, ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n", Antenna.field.RxPath, Antenna.field.TxPath));
900 // Save the antenna for future use
901 pAd->Antenna.word = Antenna.word;
903 // Set the RfICType here, then we can initialize RFIC related operation callbacks
904 pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;
905 pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;
907 #ifdef RTMP_RF_RW_SUPPORT
908 RtmpChipOpsRFHook(pAd);
909 #endif // RTMP_RF_RW_SUPPORT //
912 sprintf((PSTRING) pAd->nickname, "RT2860STA");
913 #endif // RTMP_MAC_PCI //
917 // Reset PhyMode if we don't support 802.11a
918 // Only RFIC_2850 & RFIC_2750 support 802.11a
920 if ((Antenna.field.RfIcType != RFIC_2850)
921 && (Antenna.field.RfIcType != RFIC_2750)
922 && (Antenna.field.RfIcType != RFIC_3052))
924 if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) ||
925 (pAd->CommonCfg.PhyMode == PHY_11A))
926 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;
927 else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
928 (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) ||
929 (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) ||
930 (pAd->CommonCfg.PhyMode == PHY_11N_5G))
931 pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED;
934 // Read TSSI reference and TSSI boundary for temperature compensation. This is ugly
937 /* these are tempature reference value (0x00 ~ 0xFE)
938 ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
939 TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) +
940 TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */
941 RT28xx_EEPROM_READ16(pAd, 0x6E, Power.word);
942 pAd->TssiMinusBoundaryG[4] = Power.field.Byte0;
943 pAd->TssiMinusBoundaryG[3] = Power.field.Byte1;
944 RT28xx_EEPROM_READ16(pAd, 0x70, Power.word);
945 pAd->TssiMinusBoundaryG[2] = Power.field.Byte0;
946 pAd->TssiMinusBoundaryG[1] = Power.field.Byte1;
947 RT28xx_EEPROM_READ16(pAd, 0x72, Power.word);
948 pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */
949 pAd->TssiPlusBoundaryG[1] = Power.field.Byte1;
950 RT28xx_EEPROM_READ16(pAd, 0x74, Power.word);
951 pAd->TssiPlusBoundaryG[2] = Power.field.Byte0;
952 pAd->TssiPlusBoundaryG[3] = Power.field.Byte1;
953 RT28xx_EEPROM_READ16(pAd, 0x76, Power.word);
954 pAd->TssiPlusBoundaryG[4] = Power.field.Byte0;
955 pAd->TxAgcStepG = Power.field.Byte1;
956 pAd->TxAgcCompensateG = 0;
957 pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;
958 pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG;
960 // Disable TxAgc if the based value is not right
961 if (pAd->TssiRefG == 0xff)
962 pAd->bAutoTxAgcG = FALSE;
964 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
965 pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1],
967 pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],
968 pAd->TxAgcStepG, pAd->bAutoTxAgcG));
972 RT28xx_EEPROM_READ16(pAd, 0xD4, Power.word);
973 pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;
974 pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;
975 RT28xx_EEPROM_READ16(pAd, 0xD6, Power.word);
976 pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;
977 pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;
978 RT28xx_EEPROM_READ16(pAd, 0xD8, Power.word);
979 pAd->TssiRefA = Power.field.Byte0;
980 pAd->TssiPlusBoundaryA[1] = Power.field.Byte1;
981 RT28xx_EEPROM_READ16(pAd, 0xDA, Power.word);
982 pAd->TssiPlusBoundaryA[2] = Power.field.Byte0;
983 pAd->TssiPlusBoundaryA[3] = Power.field.Byte1;
984 RT28xx_EEPROM_READ16(pAd, 0xDC, Power.word);
985 pAd->TssiPlusBoundaryA[4] = Power.field.Byte0;
986 pAd->TxAgcStepA = Power.field.Byte1;
987 pAd->TxAgcCompensateA = 0;
988 pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;
989 pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA;
991 // Disable TxAgc if the based value is not right
992 if (pAd->TssiRefA == 0xff)
993 pAd->bAutoTxAgcA = FALSE;
995 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
996 pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1],
998 pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2], pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],
999 pAd->TxAgcStepA, pAd->bAutoTxAgcA));
1001 pAd->BbpRssiToDbmDelta = 0x0;
1003 // Read frequency offset setting for RF
1004 RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value);
1005 if ((value & 0x00FF) != 0x00FF)
1006 pAd->RfFreqOffset = (ULONG) (value & 0x00FF);
1008 pAd->RfFreqOffset = 0;
1009 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset));
1011 //CountryRegion byte offset (38h)
1012 value = pAd->EEPROMDefaultValue[2] >> 8; // 2.4G band
1013 value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; // 5G band
1015 if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND))
1017 pAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80;
1018 pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;
1019 TmpPhy = pAd->CommonCfg.PhyMode;
1020 pAd->CommonCfg.PhyMode = 0xff;
1021 RTMPSetPhyMode(pAd, TmpPhy);
1026 // Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.
1027 // The valid value are (-10 ~ 10)
1029 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value);
1030 pAd->BGRssiOffset0 = value & 0x00ff;
1031 pAd->BGRssiOffset1 = (value >> 8);
1032 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2, value);
1033 pAd->BGRssiOffset2 = value & 0x00ff;
1034 pAd->ALNAGain1 = (value >> 8);
1035 RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value);
1036 pAd->BLNAGain = value & 0x00ff;
1037 pAd->ALNAGain0 = (value >> 8);
1039 // Validate 11b/g RSSI_0 offset.
1040 if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10))
1041 pAd->BGRssiOffset0 = 0;
1043 // Validate 11b/g RSSI_1 offset.
1044 if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))
1045 pAd->BGRssiOffset1 = 0;
1047 // Validate 11b/g RSSI_2 offset.
1048 if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))
1049 pAd->BGRssiOffset2 = 0;
1051 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value);
1052 pAd->ARssiOffset0 = value & 0x00ff;
1053 pAd->ARssiOffset1 = (value >> 8);
1054 RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2), value);
1055 pAd->ARssiOffset2 = value & 0x00ff;
1056 pAd->ALNAGain2 = (value >> 8);
1058 if (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))
1059 pAd->ALNAGain1 = pAd->ALNAGain0;
1060 if (((UCHAR)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00))
1061 pAd->ALNAGain2 = pAd->ALNAGain0;
1063 // Validate 11a RSSI_0 offset.
1064 if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10))
1065 pAd->ARssiOffset0 = 0;
1067 // Validate 11a RSSI_1 offset.
1068 if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))
1069 pAd->ARssiOffset1 = 0;
1071 //Validate 11a RSSI_2 offset.
1072 if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))
1073 pAd->ARssiOffset2 = 0;
1077 // Get TX mixer gain setting
1078 // 0xff are invalid value
1079 // Note: RT30xX default value is 0x00 and will program to RF_R17 only when this value is not zero.
1080 // RT359X default value is 0x02
1082 if (IS_RT30xx(pAd) || IS_RT3572(pAd))
1084 RT28xx_EEPROM_READ16(pAd, EEPROM_TXMIXER_GAIN_2_4G, value);
1085 pAd->TxMixerGain24G = 0;
1090 pAd->TxMixerGain24G = (UCHAR)value;
1098 RT28xx_EEPROM_READ16(pAd, 0x3a, value);
1099 pAd->LedCntl.word = (value>>8);
1100 RT28xx_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET, value);
1102 RT28xx_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET, value);
1104 RT28xx_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET, value);
1107 RTMPReadTxPwrPerRate(pAd);
1110 #ifdef RTMP_EFUSE_SUPPORT
1111 RtmpEfuseSupportCheck(pAd);
1112 #endif // RTMP_EFUSE_SUPPORT //
1115 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
1119 ========================================================================
1121 Routine Description:
1122 Set default value from EEPROM
1125 Adapter Pointer to our adapter
1130 IRQL = PASSIVE_LEVEL
1134 ========================================================================
1136 VOID NICInitAsicFromEEPROM(
1137 IN PRTMP_ADAPTER pAd)
1142 // EEPROM_ANTENNA_STRUC Antenna;
1143 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1146 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitAsicFromEEPROM\n"));
1147 for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)
1149 UCHAR BbpRegIdx, BbpValue;
1151 if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))
1153 BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);
1154 BbpValue = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);
1155 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);
1160 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1163 if ((NicConfig2.word & 0x00ff) == 0xff)
1165 NicConfig2.word &= 0xff00;
1168 if ((NicConfig2.word >> 8) == 0xff)
1170 NicConfig2.word &= 0x00ff;
1174 // Save the antenna for future use
1175 pAd->NicConfig2.word = NicConfig2.word;
1178 // set default antenna as main
1179 if (pAd->RfIcType == RFIC_3020)
1180 AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
1184 // Send LED Setting to MCU.
1186 if (pAd->LedCntl.word == 0xFF)
1188 pAd->LedCntl.word = 0x01;
1194 #endif // RTMP_MAC_PCI //
1197 #endif // RTMP_MAC_USB //
1200 AsicSendCommandToMcu(pAd, 0x52, 0xff, (UCHAR)pAd->Led1, (UCHAR)(pAd->Led1 >> 8));
1201 AsicSendCommandToMcu(pAd, 0x53, 0xff, (UCHAR)pAd->Led2, (UCHAR)(pAd->Led2 >> 8));
1202 AsicSendCommandToMcu(pAd, 0x54, 0xff, (UCHAR)pAd->Led3, (UCHAR)(pAd->Led3 >> 8));
1203 AsicSendCommandToMcu(pAd, 0x51, 0xff, 0, pAd->LedCntl.field.Polarity);
1205 pAd->LedIndicatorStrength = 0xFF;
1206 RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, before link up
1209 // Read Hardware controlled Radio state enable bit
1210 if (NicConfig2.field.HardwareRadioControl == 1)
1212 pAd->StaCfg.bHardwareRadio = TRUE;
1214 // Read GPIO pin2 as Hardware controlled radio state
1215 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
1216 if ((data & 0x04) == 0)
1218 pAd->StaCfg.bHwRadio = FALSE;
1219 pAd->StaCfg.bRadio = FALSE;
1220 // RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);
1221 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
1225 pAd->StaCfg.bHardwareRadio = FALSE;
1227 if (pAd->StaCfg.bRadio == FALSE)
1229 RTMPSetLED(pAd, LED_RADIO_OFF);
1233 RTMPSetLED(pAd, LED_RADIO_ON);
1236 AsicSendCommandToMcu(pAd, 0x30, PowerRadioOffCID, 0xff, 0x02);
1237 AsicCheckCommanOk(pAd, PowerRadioOffCID);
1240 AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);
1242 AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x00);
1243 // 2-1. wait command ok.
1244 AsicCheckCommanOk(pAd, PowerWakeCID);
1245 #endif // RTMP_MAC_PCI //
1251 if (IS_RT3090(pAd)|| IS_RT3572(pAd) || IS_RT3390(pAd))
1253 RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
1254 if (pChipOps->AsicReverseRfFromSleepMode)
1255 pChipOps->AsicReverseRfFromSleepMode(pAd);
1257 // 3090 MCU Wakeup command needs more time to be stable.
1258 // Before stable, don't issue other MCU command to prevent from firmware error.
1260 if ((IS_RT3090(pAd)|| IS_RT3572(pAd) || IS_RT3390(pAd)) && IS_VERSION_AFTER_F(pAd)
1261 && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
1262 && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE))
1264 DBGPRINT(RT_DEBUG_TRACE,("%s::%d,release Mcu Lock\n",__FUNCTION__,__LINE__));
1265 RTMP_SEM_LOCK(&pAd->McuCmdLock);
1266 pAd->brt30xxBanMcuCmd = FALSE;
1267 RTMP_SEM_UNLOCK(&pAd->McuCmdLock);
1270 #endif // RTMP_MAC_PCI //
1272 // Turn off patching for cardbus controller
1273 if (NicConfig2.field.CardbusAcceleration == 1)
1275 // pAd->bTest1 = TRUE;
1278 if (NicConfig2.field.DynamicTxAgcControl == 1)
1279 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1281 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1283 // Since BBP has been progamed, to make sure BBP setting will be
1284 // upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND!!
1286 pAd->CommonCfg.BandState = UNKNOWN_BAND;
1288 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
1290 if(pAd->Antenna.field.RxPath == 3)
1294 else if(pAd->Antenna.field.RxPath == 2)
1298 else if(pAd->Antenna.field.RxPath == 1)
1302 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
1305 // Handle the difference when 1T
1306 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
1307 if(pAd->Antenna.field.TxPath == 1)
1311 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
1313 DBGPRINT(RT_DEBUG_TRACE, ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n",
1314 pAd->CommonCfg.bHardwareRadio, pAd->CommonCfg.bHardwareRadio));
1319 // update registers from EEPROM for RT3071 or later(3572/3592).
1321 if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
1323 UCHAR RegIdx, RegValue;
1326 // after RT3071, write BBP from EEPROM 0xF0 to 0x102
1327 for (i = 0xF0; i <= 0x102; i = i+2)
1330 RT28xx_EEPROM_READ16(pAd, i, value);
1331 if ((value != 0xFFFF) && (value != 0))
1333 RegIdx = (UCHAR)(value >> 8);
1334 RegValue = (UCHAR)(value & 0xff);
1335 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, RegIdx, RegValue);
1336 DBGPRINT(RT_DEBUG_TRACE, ("Update BBP Registers from EEPROM(0x%0x), BBP(0x%x) = 0x%x\n", i, RegIdx, RegValue));
1340 // after RT3071, write RF from EEPROM 0x104 to 0x116
1341 for (i = 0x104; i <= 0x116; i = i+2)
1344 RT28xx_EEPROM_READ16(pAd, i, value);
1345 if ((value != 0xFFFF) && (value != 0))
1347 RegIdx = (UCHAR)(value >> 8);
1348 RegValue = (UCHAR)(value & 0xff);
1349 RT30xxWriteRFRegister(pAd, RegIdx, RegValue);
1350 DBGPRINT(RT_DEBUG_TRACE, ("Update RF Registers from EEPROM0x%x), BBP(0x%x) = 0x%x\n", i, RegIdx, RegValue));
1355 #endif // RTMP_MAC_USB //
1357 DBGPRINT(RT_DEBUG_TRACE, ("TxPath = %d, RxPath = %d, RFIC=%d, Polar+LED mode=%x\n",
1358 pAd->Antenna.field.TxPath, pAd->Antenna.field.RxPath,
1359 pAd->RfIcType, pAd->LedCntl.word));
1360 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n"));
1364 ========================================================================
1366 Routine Description:
1367 Initialize NIC hardware
1370 Adapter Pointer to our adapter
1375 IRQL = PASSIVE_LEVEL
1379 ========================================================================
1381 NDIS_STATUS NICInitializeAdapter(
1382 IN PRTMP_ADAPTER pAd,
1383 IN BOOLEAN bHardReset)
1385 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
1386 WPDMA_GLO_CFG_STRUC GloCfg;
1389 DELAY_INT_CFG_STRUC IntCfg;
1390 #endif // RTMP_MAC_PCI //
1391 // INT_MASK_CSR_STRUC IntMask;
1393 AC_TXOP_CSR0_STRUC csr0;
1395 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n"));
1397 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
1402 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
1403 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
1406 RTMPusecDelay(1000);
1409 DBGPRINT(RT_DEBUG_TRACE, ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word));
1410 GloCfg.word &= 0xff0;
1411 GloCfg.field.EnTXWriteBackDDONE =1;
1412 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
1414 // Record HW Beacon offset
1415 pAd->BeaconOffset[0] = HW_BEACON_BASE0;
1416 pAd->BeaconOffset[1] = HW_BEACON_BASE1;
1417 pAd->BeaconOffset[2] = HW_BEACON_BASE2;
1418 pAd->BeaconOffset[3] = HW_BEACON_BASE3;
1419 pAd->BeaconOffset[4] = HW_BEACON_BASE4;
1420 pAd->BeaconOffset[5] = HW_BEACON_BASE5;
1421 pAd->BeaconOffset[6] = HW_BEACON_BASE6;
1422 pAd->BeaconOffset[7] = HW_BEACON_BASE7;
1425 // write all shared Ring's base address into ASIC
1428 // asic simulation sequence put this ahead before loading firmware.
1429 // pbf hardware reset
1431 RTMP_IO_WRITE32(pAd, WPDMA_RST_IDX, 0x1003f); // 0x10000 for reset rx, 0x3f resets all 6 tx rings.
1432 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe1f);
1433 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe00);
1434 #endif // RTMP_MAC_PCI //
1436 // Initialze ASIC for TX & Rx operation
1437 if (NICInitializeAsic(pAd , bHardReset) != NDIS_STATUS_SUCCESS)
1441 NICLoadFirmware(pAd);
1444 return NDIS_STATUS_FAILURE;
1449 // Write AC_BK base address register
1450 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BK].Cell[0].AllocPa);
1451 RTMP_IO_WRITE32(pAd, TX_BASE_PTR1, Value);
1452 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR1 : 0x%x\n", Value));
1454 // Write AC_BE base address register
1455 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BE].Cell[0].AllocPa);
1456 RTMP_IO_WRITE32(pAd, TX_BASE_PTR0, Value);
1457 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR0 : 0x%x\n", Value));
1459 // Write AC_VI base address register
1460 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VI].Cell[0].AllocPa);
1461 RTMP_IO_WRITE32(pAd, TX_BASE_PTR2, Value);
1462 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR2 : 0x%x\n", Value));
1464 // Write AC_VO base address register
1465 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VO].Cell[0].AllocPa);
1466 RTMP_IO_WRITE32(pAd, TX_BASE_PTR3, Value);
1467 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR3 : 0x%x\n", Value));
1469 // Write MGMT_BASE_CSR register
1470 Value = RTMP_GetPhysicalAddressLow(pAd->MgmtRing.Cell[0].AllocPa);
1471 RTMP_IO_WRITE32(pAd, TX_BASE_PTR5, Value);
1472 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR5 : 0x%x\n", Value));
1474 // Write RX_BASE_CSR register
1475 Value = RTMP_GetPhysicalAddressLow(pAd->RxRing.Cell[0].AllocPa);
1476 RTMP_IO_WRITE32(pAd, RX_BASE_PTR, Value);
1477 DBGPRINT(RT_DEBUG_TRACE, ("--> RX_BASE_PTR : 0x%x\n", Value));
1479 // Init RX Ring index pointer
1480 pAd->RxRing.RxSwReadIdx = 0;
1481 pAd->RxRing.RxCpuIdx = RX_RING_SIZE-1;
1482 RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
1484 // Init TX rings index pointer
1486 for (i=0; i<NUM_OF_TX_RING; i++)
1488 pAd->TxRing[i].TxSwFreeIdx = 0;
1489 pAd->TxRing[i].TxCpuIdx = 0;
1490 RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10) , pAd->TxRing[i].TxCpuIdx);
1494 // init MGMT ring index pointer
1495 pAd->MgmtRing.TxSwFreeIdx = 0;
1496 pAd->MgmtRing.TxCpuIdx = 0;
1497 RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
1500 // set each Ring's SIZE into ASIC. Descriptor Size is fixed by design.
1503 // Write TX_RING_CSR0 register
1504 Value = TX_RING_SIZE;
1505 RTMP_IO_WRITE32(pAd, TX_MAX_CNT0, Value);
1506 RTMP_IO_WRITE32(pAd, TX_MAX_CNT1, Value);
1507 RTMP_IO_WRITE32(pAd, TX_MAX_CNT2, Value);
1508 RTMP_IO_WRITE32(pAd, TX_MAX_CNT3, Value);
1509 RTMP_IO_WRITE32(pAd, TX_MAX_CNT4, Value);
1510 Value = MGMT_RING_SIZE;
1511 RTMP_IO_WRITE32(pAd, TX_MGMTMAX_CNT, Value);
1513 // Write RX_RING_CSR register
1514 Value = RX_RING_SIZE;
1515 RTMP_IO_WRITE32(pAd, RX_MAX_CNT, Value);
1516 #endif // RTMP_MAC_PCI //
1521 RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
1522 if (pAd->CommonCfg.PhyMode == PHY_11B)
1524 csr0.field.Ac0Txop = 192; // AC_VI: 192*32us ~= 6ms
1525 csr0.field.Ac1Txop = 96; // AC_VO: 96*32us ~= 3ms
1529 csr0.field.Ac0Txop = 96; // AC_VI: 96*32us ~= 3ms
1530 csr0.field.Ac1Txop = 48; // AC_VO: 48*32us ~= 1.5ms
1532 RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word);
1536 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
1540 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
1541 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
1544 RTMPusecDelay(1000);
1548 GloCfg.word &= 0xff0;
1549 GloCfg.field.EnTXWriteBackDDONE =1;
1550 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
1553 RTMP_IO_WRITE32(pAd, DELAY_INT_CFG, IntCfg.word);
1554 #endif // RTMP_MAC_PCI //
1559 // Status = NICLoadFirmware(pAd);
1561 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n"));
1566 ========================================================================
1568 Routine Description:
1572 Adapter Pointer to our adapter
1577 IRQL = PASSIVE_LEVEL
1581 ========================================================================
1583 NDIS_STATUS NICInitializeAsic(
1584 IN PRTMP_ADAPTER pAd,
1585 IN BOOLEAN bHardReset)
1589 UINT32 MacCsr12 = 0, Counter = 0;
1594 #endif // RTMP_MAC_USB //
1602 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n"));
1605 RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x3); // To fix driver disable/enable hang issue when radio off
1606 if (bHardReset == TRUE)
1608 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
1611 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
1613 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
1614 // Initialize MAC register to default value
1615 for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++)
1617 RTMP_IO_WRITE32(pAd, MACRegTable[Index].Register, MACRegTable[Index].Value);
1621 for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
1623 RTMP_IO_WRITE32(pAd, STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
1626 #endif // RTMP_MAC_PCI //
1629 // Make sure MAC gets ready after NICLoadFirmware().
1633 //To avoid hang-on issue when interface up in kernel 2.4,
1634 //we use a local variable "MacCsr0" instead of using "pAd->MACVersion" directly.
1637 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
1639 if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
1643 } while (Index++ < 100);
1645 pAd->MACVersion = MacCsr0;
1646 DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
1647 // turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue.
1648 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacCsr12);
1649 MacCsr12 &= (~0x2000);
1650 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacCsr12);
1652 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
1653 RTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);
1654 Status = RTUSBVenderReset(pAd);
1656 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
1658 // Initialize MAC register to default value
1659 for(Index=0; Index<NUM_MAC_REG_PARMS; Index++)
1662 if ((MACRegTable[Index].Register == TX_SW_CFG0) && (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd) || IS_RT3090(pAd) || IS_RT3390(pAd)))
1664 MACRegTable[Index].Value = 0x00000400;
1667 RTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);
1671 for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
1673 RTMP_IO_WRITE32(pAd, (USHORT)STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
1676 #endif // RTMP_MAC_USB //
1679 // Initialize RT3070 serial MAC registers which is different from RT2870 serial
1680 if (IS_RT3090(pAd) || IS_RT3572(pAd)||IS_RT3390(pAd))
1682 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
1684 // RT3071 version E has fixed this issue
1685 if ((pAd->MACVersion & 0xffff) < 0x0211)
1687 if (pAd->NicConfig2.field.DACTestBit == 1)
1689 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); // To fix throughput drop drastically
1693 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F); // To fix throughput drop drastically
1698 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);
1701 else if (IS_RT3070(pAd))
1703 if (((pAd->MACVersion & 0xffff) < 0x0201))
1705 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
1706 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); // To fix throughput drop drastically
1710 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0);
1716 // Before program BBP, we need to wait BBP/RF get wake up.
1721 RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);
1723 if ((MacCsr12 & 0x03) == 0) // if BB.RF is stable
1726 DBGPRINT(RT_DEBUG_TRACE, ("Check MAC_STATUS_CFG = Busy = %x\n", MacCsr12));
1727 RTMPusecDelay(1000);
1728 } while (Index++ < 100);
1730 // The commands to firmware should be after these commands, these commands will init firmware
1731 // PCI and USB are not the same because PCI driver needs to wait for PCI bus ready
1732 RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); // initialize BBP R/W access agent
1733 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);
1735 //2008/11/28:KH add to fix the dead rf frequency offset bug<--
1736 AsicSendCommandToMcu(pAd, 0x72, 0, 0, 0);
1737 //2008/11/28:KH add to fix the dead rf frequency offset bug-->
1739 RTMPusecDelay(1000);
1741 // Read BBP register, make sure BBP is up and running before write new data
1745 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0);
1746 DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0));
1747 } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00)));
1748 //ASSERT(Index < 20); //this will cause BSOD on Check-build driver
1750 if ((R0 == 0xff) || (R0 == 0x00))
1751 return NDIS_STATUS_FAILURE;
1753 // Initialize BBP register to default value
1754 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
1756 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
1760 // TODO: shiang, check MACVersion, currently, rbus-based chip use this.
1761 if (pAd->MACVersion == 0x28720200)
1766 //disable MLD by Bruce 20080704
1767 //BBP_IO_READ8_BY_REG_ID(pAd, BBP_R105, &value);
1768 //BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, value | 4);
1770 //Maximum PSDU length from 16K to 32K bytes
1771 RTMP_IO_READ32(pAd, MAX_LEN_CFG, &value2);
1772 value2 &= ~(0x3<<12);
1773 value2 |= (0x2<<12);
1774 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, value2);
1776 #endif // RTMP_MAC_PCI //
1778 // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
1779 // RT3090 should not program BBP R84 to 0x19, otherwise TX will block.
1780 //3070/71/72,3090,3090A( are included in RT30xx),3572,3390
1781 if (((pAd->MACVersion & 0xffff) != 0x0101) && !(IS_RT30xx(pAd)|| IS_RT3572(pAd) || IS_RT3390(pAd)))
1782 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
1785 // add by johnli, RF power sequence setup
1786 if (IS_RT30xx(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
1787 { //update for RT3070/71/72/90/91/92,3572,3390.
1788 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R79, 0x13);
1789 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R80, 0x05);
1790 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R81, 0x33);
1793 if (IS_RT3090(pAd)||IS_RT3390(pAd)) // RT309x, RT3071/72
1796 if ((pAd->MACVersion & 0xffff) >= 0x0211)
1798 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
1801 // improve power consumption
1802 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R138, &bbpreg);
1803 if (pAd->Antenna.field.TxPath == 1)
1805 // turn off tx DAC_1
1806 bbpreg = (bbpreg | 0x20);
1809 if (pAd->Antenna.field.RxPath == 1)
1811 // turn off tx ADC_1
1814 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R138, bbpreg);
1816 // improve power consumption in RT3071 Ver.E
1817 if ((pAd->MACVersion & 0xffff) >= 0x0211)
1819 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
1821 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
1824 else if (IS_RT3070(pAd))
1826 if ((pAd->MACVersion & 0xffff) >= 0x0201)
1829 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
1831 // improve power consumption in RT3070 Ver.F
1832 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
1834 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
1837 // TX_LO1_en, RF R17 register Bit 3 to 0
1838 RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
1840 // to fix rx long range issue
1841 if (pAd->NicConfig2.field.ExternalLNAForG == 0)
1845 // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h
1846 if (pAd->TxMixerGain24G >= 1)
1848 RFValue &= (~0x7); // clean bit [2:0]
1849 RFValue |= pAd->TxMixerGain24G;
1851 RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
1856 if (pAd->MACVersion == 0x28600100)
1858 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
1859 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
1862 if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) // 3*3
1864 // enlarge MAX_LEN_CFG
1866 RTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr);
1869 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr);
1874 UCHAR MAC_Value[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0};
1876 //Initialize WCID table
1878 for(Index =0 ;Index < 254;Index++)
1880 RTUSBMultiWrite(pAd, (USHORT)(MAC_WCID_BASE + Index * 8), MAC_Value, 8);
1883 #endif // RTMP_MAC_USB //
1885 // Add radio off control
1887 if (pAd->StaCfg.bRadio == FALSE)
1889 // RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);
1890 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
1891 DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n"));
1895 // Clear raw counters
1896 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
1897 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
1898 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
1899 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
1900 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
1901 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
1903 // ASIC will keep garbage value after boot
1904 // Clear all shared key table when initial
1905 // This routine can be ignored in radio-ON/OFF operation.
1908 for (KeyIdx = 0; KeyIdx < 4; KeyIdx++)
1910 RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0);
1913 // Clear all pairwise key table when initial
1914 for (KeyIdx = 0; KeyIdx < 256; KeyIdx++)
1916 RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
1920 // assert HOST ready bit
1921 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x0); // 2004-09-14 asked by Mark
1922 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x4);
1924 // It isn't necessary to clear this space when not hard reset.
1925 if (bHardReset == TRUE)
1927 // clear all on-chip BEACON frame space
1928 for (apidx = 0; apidx < HW_BEACON_MAX_COUNT; apidx++)
1930 for (i = 0; i < HW_BEACON_OFFSET>>2; i+=4)
1931 RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[apidx] + i, 0x00);
1936 AsicDisableSync(pAd);
1937 // Clear raw counters
1938 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
1939 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
1940 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
1941 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
1942 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
1943 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
1944 // Default PCI clock cycle per ms is different as default setting, which is based on PCI.
1945 RTMP_IO_READ32(pAd, USB_CYC_CFG, &Counter);
1946 Counter&=0xffffff00;
1948 RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
1949 #endif // RTMP_MAC_USB //
1952 // for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT.
1953 if ((pAd->MACVersion&0xffff) != 0x0101)
1954 RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f);
1957 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n"));
1958 return NDIS_STATUS_SUCCESS;
1962 ========================================================================
1964 Routine Description:
1968 Adapter Pointer to our adapter
1973 IRQL = PASSIVE_LEVEL
1976 Reset NIC to initial state AS IS system boot up time.
1978 ========================================================================
1981 IN PRTMP_ADAPTER pAd)
1984 DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n"));
1986 // Abort Tx, prevent ASIC from writing to Host memory
1987 //RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x001f0000);
1989 // Disable Rx, register value supposed will remain after reset
1990 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1991 Value &= (0xfffffff3);
1992 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1994 // Issue reset and clear from reset state
1995 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); // 2004-09-17 change from 0x01
1996 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);
1998 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n"));
2002 ========================================================================
2004 Routine Description:
2005 Check ASIC registers and find any reason the system might hang
2008 Adapter Pointer to our adapter
2013 IRQL = DISPATCH_LEVEL
2015 ========================================================================
2017 BOOLEAN NICCheckForHang(
2018 IN PRTMP_ADAPTER pAd)
2023 VOID NICUpdateFifoStaCounters(
2024 IN PRTMP_ADAPTER pAd)
2026 TX_STA_FIFO_STRUC StaFifo;
2027 MAC_TABLE_ENTRY *pEntry;
2029 UCHAR pid = 0, wcid = 0;
2035 RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);
2037 if (StaFifo.field.bValid == 0)
2040 wcid = (UCHAR)StaFifo.field.wcid;
2043 /* ignore NoACK and MGMT frame use 0xFF as WCID */
2044 if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE))
2050 /* PID store Tx MCS Rate */
2051 pid = (UCHAR)StaFifo.field.PidType;
2053 pEntry = &pAd->MacTab.Content[wcid];
2055 pEntry->DebugFIFOCount++;
2057 if (StaFifo.field.TxBF) // 3*3
2058 pEntry->TxBFCount++;
2060 if (!StaFifo.field.TxSuccess)
2062 pEntry->FIFOCount++;
2063 pEntry->OneSecTxFailCount++;
2065 if (pEntry->FIFOCount >= 1)
2067 DBGPRINT(RT_DEBUG_TRACE, ("#"));
2068 pEntry->NoBADataCountDown = 64;
2070 if(pEntry->PsMode == PWR_ACTIVE)
2073 for (tid=0; tid<NUM_OF_TID; tid++)
2075 BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, FALSE);
2078 // Update the continuous transmission counter except PS mode
2079 pEntry->ContinueTxFailCnt++;
2083 // Clear the FIFOCount when sta in Power Save mode. Basically we assume
2084 // this tx error happened due to sta just go to sleep.
2085 pEntry->FIFOCount = 0;
2086 pEntry->ContinueTxFailCnt = 0;
2088 //pEntry->FIFOCount = 0;
2090 //pEntry->bSendBAR = TRUE;
2094 if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0))
2096 pEntry->NoBADataCountDown--;
2097 if (pEntry->NoBADataCountDown==0)
2099 DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
2103 pEntry->FIFOCount = 0;
2104 pEntry->OneSecTxNoRetryOkCount++;
2105 // update NoDataIdleCount when sucessful send packet to STA.
2106 pEntry->NoDataIdleCount = 0;
2107 pEntry->ContinueTxFailCnt = 0;
2110 succMCS = StaFifo.field.SuccessRate & 0x7F;
2112 reTry = pid - succMCS;
2114 if (StaFifo.field.TxSuccess)
2116 pEntry->TXMCSExpected[pid]++;
2119 pEntry->TXMCSSuccessful[pid]++;
2123 pEntry->TXMCSAutoFallBack[pid][succMCS]++;
2128 pEntry->TXMCSFailed[pid]++;
2133 if ((pid >= 12) && succMCS <=7)
2137 pEntry->OneSecTxRetryOkCount += reTry;
2141 // ASIC store 16 stack
2142 } while ( i < (2*TX_RING_SIZE) );
2147 ========================================================================
2149 Routine Description:
2150 Read statistical counters from hardware registers and record them
2151 in software variables for later on query
2154 pAd Pointer to our adapter
2159 IRQL = DISPATCH_LEVEL
2161 ========================================================================
2163 VOID NICUpdateRawCounters(
2164 IN PRTMP_ADAPTER pAd)
2166 UINT32 OldValue;//, Value2;
2167 //ULONG PageSum, OneSecTransmitCount;
2168 //ULONG TxErrorRatio, Retry, Fail;
2169 RX_STA_CNT0_STRUC RxStaCnt0;
2170 RX_STA_CNT1_STRUC RxStaCnt1;
2171 RX_STA_CNT2_STRUC RxStaCnt2;
2172 TX_STA_CNT0_STRUC TxStaCnt0;
2173 TX_STA_CNT1_STRUC StaTx1;
2174 TX_STA_CNT2_STRUC StaTx2;
2175 TX_AGG_CNT_STRUC TxAggCnt;
2176 TX_AGG_CNT0_STRUC TxAggCnt0;
2177 TX_AGG_CNT1_STRUC TxAggCnt1;
2178 TX_AGG_CNT2_STRUC TxAggCnt2;
2179 TX_AGG_CNT3_STRUC TxAggCnt3;
2180 TX_AGG_CNT4_STRUC TxAggCnt4;
2181 TX_AGG_CNT5_STRUC TxAggCnt5;
2182 TX_AGG_CNT6_STRUC TxAggCnt6;
2183 TX_AGG_CNT7_STRUC TxAggCnt7;
2184 COUNTER_RALINK *pRalinkCounters;
2187 pRalinkCounters = &pAd->RalinkCounters;
2189 RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word);
2190 RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word);
2193 RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);
2194 // Update RX PLCP error counter
2195 pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr;
2196 // Update False CCA counter
2197 pAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca;
2200 // Update FCS counters
2201 OldValue= pAd->WlanCounters.FCSErrorCount.u.LowPart;
2202 pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); // >> 7);
2203 if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue)
2204 pAd->WlanCounters.FCSErrorCount.u.HighPart++;
2206 // Add FCS error count to private counters
2207 pRalinkCounters->OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr;
2208 OldValue = pRalinkCounters->RealFcsErrCount.u.LowPart;
2209 pRalinkCounters->RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr;
2210 if (pRalinkCounters->RealFcsErrCount.u.LowPart < OldValue)
2211 pRalinkCounters->RealFcsErrCount.u.HighPart++;
2213 // Update Duplicate Rcv check
2214 pRalinkCounters->DuplicateRcv += RxStaCnt2.field.RxDupliCount;
2215 pAd->WlanCounters.FrameDuplicateCount.u.LowPart += RxStaCnt2.field.RxDupliCount;
2216 // Update RX Overflow counter
2217 pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount);
2219 //pAd->RalinkCounters.RxCount = 0;
2221 if (pRalinkCounters->RxCount != pAd->watchDogRxCnt)
2223 pAd->watchDogRxCnt = pRalinkCounters->RxCount;
2224 pAd->watchDogRxOverFlowCnt = 0;
2228 if (RxStaCnt2.field.RxFifoOverflowCount)
2229 pAd->watchDogRxOverFlowCnt++;
2231 pAd->watchDogRxOverFlowCnt = 0;
2233 #endif // RTMP_MAC_USB //
2236 //if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) ||
2237 // (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) && (pAd->MacTab.Size != 1)))
2238 if (!pAd->bUpdateBcnCntDone)
2240 // Update BEACON sent count
2241 RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
2242 RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
2243 RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
2244 pRalinkCounters->OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount;
2245 pRalinkCounters->OneSecTxRetryOkCount += StaTx1.field.TxRetransmit;
2246 pRalinkCounters->OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess;
2247 pRalinkCounters->OneSecTxFailCount += TxStaCnt0.field.TxFailCount;
2248 pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess;
2249 pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit;
2250 pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;
2254 //if (pAd->bStaFifoTest == TRUE)
2256 RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);
2257 RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);
2258 RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);
2259 RTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);
2260 RTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);
2261 RTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word);
2262 RTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word);
2263 RTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word);
2264 RTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word);
2265 pRalinkCounters->TxAggCount += TxAggCnt.field.AggTxCount;
2266 pRalinkCounters->TxNonAggCount += TxAggCnt.field.NonAggTxCount;
2267 pRalinkCounters->TxAgg1MPDUCount += TxAggCnt0.field.AggSize1Count;
2268 pRalinkCounters->TxAgg2MPDUCount += TxAggCnt0.field.AggSize2Count;
2270 pRalinkCounters->TxAgg3MPDUCount += TxAggCnt1.field.AggSize3Count;
2271 pRalinkCounters->TxAgg4MPDUCount += TxAggCnt1.field.AggSize4Count;
2272 pRalinkCounters->TxAgg5MPDUCount += TxAggCnt2.field.AggSize5Count;
2273 pRalinkCounters->TxAgg6MPDUCount += TxAggCnt2.field.AggSize6Count;
2275 pRalinkCounters->TxAgg7MPDUCount += TxAggCnt3.field.AggSize7Count;
2276 pRalinkCounters->TxAgg8MPDUCount += TxAggCnt3.field.AggSize8Count;
2277 pRalinkCounters->TxAgg9MPDUCount += TxAggCnt4.field.AggSize9Count;
2278 pRalinkCounters->TxAgg10MPDUCount += TxAggCnt4.field.AggSize10Count;
2280 pRalinkCounters->TxAgg11MPDUCount += TxAggCnt5.field.AggSize11Count;
2281 pRalinkCounters->TxAgg12MPDUCount += TxAggCnt5.field.AggSize12Count;
2282 pRalinkCounters->TxAgg13MPDUCount += TxAggCnt6.field.AggSize13Count;
2283 pRalinkCounters->TxAgg14MPDUCount += TxAggCnt6.field.AggSize14Count;
2285 pRalinkCounters->TxAgg15MPDUCount += TxAggCnt7.field.AggSize15Count;
2286 pRalinkCounters->TxAgg16MPDUCount += TxAggCnt7.field.AggSize16Count;
2288 // Calculate the transmitted A-MPDU count
2289 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += TxAggCnt0.field.AggSize1Count;
2290 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt0.field.AggSize2Count / 2);
2292 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize3Count / 3);
2293 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize4Count / 4);
2295 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize5Count / 5);
2296 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize6Count / 6);
2298 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize7Count / 7);
2299 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize8Count / 8);
2301 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize9Count / 9);
2302 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize10Count / 10);
2304 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize11Count / 11);
2305 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize12Count / 12);
2307 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize13Count / 13);
2308 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize14Count / 14);
2310 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize15Count / 15);
2311 pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count / 16);
2320 ========================================================================
2322 Routine Description:
2323 Reset NIC from error
2326 Adapter Pointer to our adapter
2331 IRQL = PASSIVE_LEVEL
2334 Reset NIC from error state
2336 ========================================================================
2338 VOID NICResetFromError(
2339 IN PRTMP_ADAPTER pAd)
2341 // Reset BBP (according to alex, reset ASIC will force reset BBP
2342 // Therefore, skip the reset BBP
2343 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x2);
2345 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
2346 // Remove ASIC from reset state
2347 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
2349 NICInitializeAdapter(pAd, FALSE);
2350 NICInitAsicFromEEPROM(pAd);
2352 // Switch to current channel, since during reset process, the connection should remains on.
2353 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2354 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2358 NDIS_STATUS NICLoadFirmware(
2359 IN PRTMP_ADAPTER pAd)
2361 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2362 if (pAd->chipOps.loadFirmware)
2363 status = pAd->chipOps.loadFirmware(pAd);
2370 ========================================================================
2372 Routine Description:
2373 erase 8051 firmware image in MAC ASIC
2376 Adapter Pointer to our adapter
2378 IRQL = PASSIVE_LEVEL
2380 ========================================================================
2382 VOID NICEraseFirmware(
2383 IN PRTMP_ADAPTER pAd)
2385 if (pAd->chipOps.eraseFirmware)
2386 pAd->chipOps.eraseFirmware(pAd);
2388 }/* End of NICEraseFirmware */
2392 ========================================================================
2394 Routine Description:
2395 Load Tx rate switching parameters
2398 Adapter Pointer to our adapter
2401 NDIS_STATUS_SUCCESS firmware image load ok
2402 NDIS_STATUS_FAILURE image not found
2404 IRQL = PASSIVE_LEVEL
2407 1. (B0: Valid Item number) (B1:Initial item from zero)
2408 2. Item Number(Dec) Mode(Hex) Current MCS(Dec) TrainUp(Dec) TrainDown(Dec)
2410 ========================================================================
2412 NDIS_STATUS NICLoadRateSwitchingParams(
2413 IN PRTMP_ADAPTER pAd)
2415 return NDIS_STATUS_SUCCESS;
2420 ========================================================================
2422 Routine Description:
2423 Compare two memory block
2426 pSrc1 Pointer to first memory address
2427 pSrc2 Pointer to second memory address
2431 1: pSrc1 memory is larger
2432 2: pSrc2 memory is larger
2434 IRQL = DISPATCH_LEVEL
2438 ========================================================================
2440 ULONG RTMPCompareMemory(
2449 pMem1 = (PUCHAR) pSrc1;
2450 pMem2 = (PUCHAR) pSrc2;
2452 for (Index = 0; Index < Length; Index++)
2454 if (pMem1[Index] > pMem2[Index])
2456 else if (pMem1[Index] < pMem2[Index])
2465 ========================================================================
2467 Routine Description:
2468 Zero out memory block
2471 pSrc1 Pointer to memory address
2477 IRQL = PASSIVE_LEVEL
2478 IRQL = DISPATCH_LEVEL
2482 ========================================================================
2484 VOID RTMPZeroMemory(
2491 pMem = (PUCHAR) pSrc;
2493 for (Index = 0; Index < Length; Index++)
2501 ========================================================================
2503 Routine Description:
2504 Copy data from memory block 1 to memory block 2
2507 pDest Pointer to destination memory address
2508 pSrc Pointer to source memory address
2514 IRQL = PASSIVE_LEVEL
2515 IRQL = DISPATCH_LEVEL
2519 ========================================================================
2521 VOID RTMPMoveMemory(
2530 ASSERT((Length==0) || (pDest && pSrc));
2532 pMem1 = (PUCHAR) pDest;
2533 pMem2 = (PUCHAR) pSrc;
2535 for (Index = 0; Index < Length; Index++)
2537 pMem1[Index] = pMem2[Index];
2542 ========================================================================
2544 Routine Description:
2545 Initialize port configuration structure
2548 Adapter Pointer to our adapter
2553 IRQL = PASSIVE_LEVEL
2557 ========================================================================
2560 IN PRTMP_ADAPTER pAd)
2562 UINT key_index, bss_index;
2564 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit\n"));
2567 // part I. intialize common configuration
2570 pAd->BulkOutReq = 0;
2572 pAd->BulkOutComplete = 0;
2573 pAd->BulkOutCompleteOther = 0;
2574 pAd->BulkOutCompleteCancel = 0;
2576 pAd->BulkInComplete = 0;
2577 pAd->BulkInCompleteFail = 0;
2579 //pAd->QuickTimerP = 100;
2580 //pAd->TurnAggrBulkInCount = 0;
2581 pAd->bUsbTxBulkAggre = 0;
2583 // init as unsed value to ensure driver will set to MCU once.
2584 pAd->LedIndicatorStrength = 0xFF;
2586 pAd->CommonCfg.MaxPktOneTxBulk = 2;
2587 pAd->CommonCfg.TxBulkFactor = 1;
2588 pAd->CommonCfg.RxBulkFactor =1;
2590 pAd->CommonCfg.TxPower = 100; //mW
2592 NdisZeroMemory(&pAd->CommonCfg.IOTestParm, sizeof(pAd->CommonCfg.IOTestParm));
2593 #endif // RTMP_MAC_USB //
2595 for(key_index=0; key_index<SHARE_KEY_NUM; key_index++)
2597 for(bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++)
2599 pAd->SharedKey[bss_index][key_index].KeyLen = 0;
2600 pAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE;
2604 pAd->EepromAccess = FALSE;
2606 pAd->Antenna.word = 0;
2607 pAd->CommonCfg.BBPCurrentBW = BW_20;
2609 pAd->LedCntl.word = 0;
2611 pAd->LedIndicatorStrength = 0;
2612 pAd->RLnkCtrlOffset = 0;
2613 pAd->HostLnkCtrlOffset = 0;
2614 pAd->StaCfg.PSControl.field.EnableNewPS=TRUE;
2615 pAd->CheckDmaBusyCount = 0;
2616 #endif // RTMP_MAC_PCI //
2618 pAd->bAutoTxAgcA = FALSE; // Default is OFF
2619 pAd->bAutoTxAgcG = FALSE; // Default is OFF
2620 pAd->RfIcType = RFIC_2820;
2622 // Init timer for reset complete event
2623 pAd->CommonCfg.CentralChannel = 1;
2624 pAd->bForcePrintTX = FALSE;
2625 pAd->bForcePrintRX = FALSE;
2626 pAd->bStaFifoTest = FALSE;
2627 pAd->bProtectionTest = FALSE;
2628 pAd->CommonCfg.Dsifs = 10; // in units of usec
2629 pAd->CommonCfg.TxPower = 100; //mW
2630 pAd->CommonCfg.TxPowerPercentage = 0xffffffff; // AUTO
2631 pAd->CommonCfg.TxPowerDefault = 0xffffffff; // AUTO
2632 pAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; // use Long preamble on TX by defaut
2633 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
2634 pAd->CommonCfg.RtsThreshold = 2347;
2635 pAd->CommonCfg.FragmentThreshold = 2346;
2636 pAd->CommonCfg.UseBGProtection = 0; // 0: AUTO
2637 pAd->CommonCfg.bEnableTxBurst = TRUE; //0;
2638 pAd->CommonCfg.PhyMode = 0xff; // unknown
2639 pAd->CommonCfg.BandState = UNKNOWN_BAND;
2640 pAd->CommonCfg.RadarDetect.CSPeriod = 10;
2641 pAd->CommonCfg.RadarDetect.CSCount = 0;
2642 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
2647 pAd->CommonCfg.RadarDetect.ChMovingTime = 65;
2648 pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 3;
2649 pAd->CommonCfg.bAPSDCapable = FALSE;
2650 pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
2651 pAd->CommonCfg.TriggerTimerCount = 0;
2652 pAd->CommonCfg.bAPSDForcePowerSave = FALSE;
2653 pAd->CommonCfg.bCountryFlag = FALSE;
2654 pAd->CommonCfg.TxStream = 0;
2655 pAd->CommonCfg.RxStream = 0;
2657 NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI));
2659 NdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
2660 pAd->HTCEnable = FALSE;
2661 pAd->bBroadComHT = FALSE;
2662 pAd->CommonCfg.bRdg = FALSE;
2664 NdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
2665 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
2666 pAd->CommonCfg.BACapability.field.MpduDensity = 0;
2667 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
2668 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; //32;
2669 pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; //32;
2670 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit. BACapability = 0x%x\n", pAd->CommonCfg.BACapability.word));
2672 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
2673 BATableInit(pAd, &pAd->BATable);
2675 pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
2676 pAd->CommonCfg.bHTProtect = 1;
2677 pAd->CommonCfg.bMIMOPSEnable = TRUE;
2678 //2008/11/05:KH add to support Antenna power-saving of AP<--
2679 pAd->CommonCfg.bGreenAPEnable=FALSE;
2680 //2008/11/05:KH add to support Antenna power-saving of AP-->
2681 pAd->CommonCfg.bBADecline = FALSE;
2682 pAd->CommonCfg.bDisableReordering = FALSE;
2684 if (pAd->MACVersion == 0x28720200)
2686 pAd->CommonCfg.TxBASize = 13; //by Jerry recommend
2688 pAd->CommonCfg.TxBASize = 7;
2691 pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
2693 //pAd->CommonCfg.HTPhyMode.field.BW = BW_20;
2694 //pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO;
2695 //pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800;
2696 //pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE;
2697 pAd->CommonCfg.TxRate = RATE_6;
2699 pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;
2700 pAd->CommonCfg.MlmeTransmit.field.BW = BW_20;
2701 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
2703 pAd->CommonCfg.BeaconPeriod = 100; // in mSec
2706 // part II. intialize STA specific configuration
2709 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT);
2710 RX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST);
2711 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);
2712 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);
2714 pAd->StaCfg.Psm = PWR_ACTIVE;
2716 pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled;
2717 pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;
2718 pAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled;
2719 pAd->StaCfg.bMixCipher = FALSE;
2720 pAd->StaCfg.DefaultKeyId = 0;
2722 // 802.1x port control
2723 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
2724 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
2725 pAd->StaCfg.LastMicErrorTime = 0;
2726 pAd->StaCfg.MicErrCnt = 0;
2727 pAd->StaCfg.bBlockAssoc = FALSE;
2728 pAd->StaCfg.WpaState = SS_NOTUSE;
2730 pAd->CommonCfg.NdisRadioStateOff = FALSE; // New to support microsoft disable radio with OID command
2732 pAd->StaCfg.RssiTrigger = 0;
2733 NdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(RSSI_SAMPLE));
2734 pAd->StaCfg.RssiTriggerMode = RSSI_TRIGGERED_UPON_BELOW_THRESHOLD;
2735 pAd->StaCfg.AtimWin = 0;
2736 pAd->StaCfg.DefaultListenCount = 3;//default listen count;
2737 pAd->StaCfg.BssType = BSS_INFRA; // BSS_INFRA or BSS_ADHOC or BSS_MONITOR
2738 pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
2739 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
2740 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
2742 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
2743 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
2746 #ifdef PCIE_PS_SUPPORT
2747 pAd->brt30xxBanMcuCmd = FALSE;
2748 pAd->b3090ESpecialChip = FALSE;
2749 //KH Debug:the following must be removed
2750 pAd->StaCfg.PSControl.field.rt30xxPowerMode=3;
2751 pAd->StaCfg.PSControl.field.rt30xxForceASPMTest=0;
2752 pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM=1;
2753 #endif // PCIE_PS_SUPPORT //
2755 // global variables mXXXX used in MAC protocol state machines
2756 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
2757 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
2758 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
2760 // PHY specification
2761 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; // default PHY mode
2762 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); // CCK use LONG preamble
2765 // user desired power mode
2766 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
2767 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
2768 pAd->StaCfg.bWindowsACCAMEnable = FALSE;
2770 RTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer, GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec), pAd, FALSE);
2771 pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
2774 pAd->StaCfg.ScanCnt = 0;
2776 pAd->StaCfg.bHwRadio = TRUE; // Default Hardware Radio status is On
2777 pAd->StaCfg.bSwRadio = TRUE; // Default Software Radio status is On
2778 pAd->StaCfg.bRadio = TRUE; // bHwRadio && bSwRadio
2779 pAd->StaCfg.bHardwareRadio = FALSE; // Default is OFF
2780 pAd->StaCfg.bShowHiddenSSID = FALSE; // Default no show
2782 // Nitro mode control
2783 pAd->StaCfg.bAutoReconnect = TRUE;
2785 // Save the init time as last scan time, the system should do scan after 2 seconds.
2786 // This patch is for driver wake up from standby mode, system will do scan right away.
2787 NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);
2788 if (pAd->StaCfg.LastScanTime > 10 * OS_HZ)
2789 pAd->StaCfg.LastScanTime -= (10 * OS_HZ);
2791 NdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE+1);
2793 sprintf((PSTRING) pAd->nickname, "RT2860STA");
2794 #endif // RTMP_MAC_PCI //
2796 sprintf((PSTRING) pAd->nickname, "RT2870STA");
2797 #endif // RTMP_MAC_USB //
2798 RTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer, GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc), pAd, FALSE);
2799 pAd->StaCfg.IEEE8021X = FALSE;
2800 pAd->StaCfg.IEEE8021x_required_keys = FALSE;
2801 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
2802 pAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE;
2803 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
2805 NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);
2808 pAd->StaCfg.bAutoConnectByBssid = FALSE;
2809 pAd->StaCfg.BeaconLostTime = BEACON_LOST_TIME;
2810 NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);
2811 pAd->StaCfg.WpaPassPhraseLen = 0;
2812 pAd->StaCfg.bAutoRoaming = FALSE;
2813 pAd->StaCfg.bForceTxBurst = FALSE;
2816 // Default for extra information is not valid
2817 pAd->ExtraInfo = EXTRA_INFO_CLEAR;
2819 // Default Config change flag
2820 pAd->bConfigChanged = FALSE;
2823 // part III. AP configurations
2830 // dynamic BBP R66:sensibity tuning to overcome background noise
2831 pAd->BbpTuning.bEnable = TRUE;
2832 pAd->BbpTuning.FalseCcaLowerThreshold = 100;
2833 pAd->BbpTuning.FalseCcaUpperThreshold = 512;
2834 pAd->BbpTuning.R66Delta = 4;
2835 pAd->Mlme.bEnableAutoAntennaCheck = TRUE;
2838 // Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value.
2839 // if not initial this value, the default value will be 0.
2841 pAd->BbpTuning.R66CurrentValue = 0x38;
2843 pAd->Bbp94 = BBPR94_DEFAULT;
2844 pAd->BbpForCCK = FALSE;
2846 // Default is FALSE for test bit 1
2847 //pAd->bTest1 = FALSE;
2849 // initialize MAC table and allocate spin lock
2850 NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));
2851 InitializeQueueHeader(&pAd->MacTab.McastPsQueue);
2852 NdisAllocateSpinLock(&pAd->MacTabLock);
2854 //RTMPInitTimer(pAd, &pAd->RECBATimer, RECBATimerTimeout, pAd, TRUE);
2855 //RTMPSetTimer(&pAd->RECBATimer, REORDER_EXEC_INTV);
2859 pAd->CommonCfg.bWiFiTest = FALSE;
2861 pAd->bPCIclkOff = FALSE;
2862 #endif // RTMP_MAC_PCI //
2864 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
2865 DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
2868 // IRQL = PASSIVE_LEVEL
2869 UCHAR BtoH(STRING ch)
2871 if (ch >= '0' && ch <= '9') return (ch - '0'); // Handle numerals
2872 if (ch >= 'A' && ch <= 'F') return (ch - 'A' + 0xA); // Handle capitol hex digits
2873 if (ch >= 'a' && ch <= 'f') return (ch - 'a' + 0xA); // Handle small hex digits
2878 // FUNCTION: AtoH(char *, UCHAR *, int)
2880 // PURPOSE: Converts ascii string to network order hex
2883 // src - pointer to input ascii string
2884 // dest - pointer to output hex
2885 // destlen - size of dest
2889 // 2 ascii bytes make a hex byte so must put 1st ascii byte of pair
2890 // into upper nibble and 2nd ascii byte of pair into lower nibble.
2892 // IRQL = PASSIVE_LEVEL
2894 void AtoH(PSTRING src, PUCHAR dest, int destlen)
2900 destTemp = (PUCHAR) dest;
2904 *destTemp = BtoH(*srcptr++) << 4; // Put 1st ascii byte in upper nibble.
2905 *destTemp += BtoH(*srcptr++); // Add 2nd ascii byte to above.
2911 //+++Mark by shiang, not use now, need to remove after confirm
2912 //---Mark by shiang, not use now, need to remove after confirm
2916 ========================================================================
2918 Routine Description:
2922 pAd Pointer to our adapter
2923 pTimer Timer structure
2924 pTimerFunc Function to execute when timer expired
2925 Repeat Ture for period timer
2932 ========================================================================
2935 IN PRTMP_ADAPTER pAd,
2936 IN PRALINK_TIMER_STRUCT pTimer,
2937 IN PVOID pTimerFunc,
2942 // Set Valid to TRUE for later used.
2943 // It will crash if we cancel a timer or set a timer
2944 // that we haven't initialize before.
2946 pTimer->Valid = TRUE;
2948 pTimer->PeriodicType = Repeat;
2949 pTimer->State = FALSE;
2950 pTimer->cookie = (ULONG) pData;
2952 #ifdef RTMP_TIMER_TASK_SUPPORT
2954 #endif // RTMP_TIMER_TASK_SUPPORT //
2956 RTMP_OS_Init_Timer(pAd, &pTimer->TimerObj, pTimerFunc, (PVOID) pTimer);
2960 ========================================================================
2962 Routine Description:
2966 pTimer Timer structure
2967 Value Timer value in milliseconds
2973 To use this routine, must call RTMPInitTimer before.
2975 ========================================================================
2978 IN PRALINK_TIMER_STRUCT pTimer,
2983 pTimer->TimerValue = Value;
2984 pTimer->State = FALSE;
2985 if (pTimer->PeriodicType == TRUE)
2987 pTimer->Repeat = TRUE;
2988 RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);
2992 pTimer->Repeat = FALSE;
2993 RTMP_OS_Add_Timer(&pTimer->TimerObj, Value);
2998 DBGPRINT_ERR(("RTMPSetTimer failed, Timer hasn't been initialize!\n"));
3004 ========================================================================
3006 Routine Description:
3010 pTimer Timer structure
3011 Value Timer value in milliseconds
3017 To use this routine, must call RTMPInitTimer before.
3019 ========================================================================
3022 IN PRALINK_TIMER_STRUCT pTimer,
3029 pTimer->TimerValue = Value;
3030 pTimer->State = FALSE;
3031 if (pTimer->PeriodicType == TRUE)
3033 RTMPCancelTimer(pTimer, &Cancel);
3034 RTMPSetTimer(pTimer, Value);
3038 RTMP_OS_Mod_Timer(&pTimer->TimerObj, Value);
3043 DBGPRINT_ERR(("RTMPModTimer failed, Timer hasn't been initialize!\n"));
3048 ========================================================================
3050 Routine Description:
3051 Cancel timer objects
3054 Adapter Pointer to our adapter
3059 IRQL = PASSIVE_LEVEL
3060 IRQL = DISPATCH_LEVEL
3063 1.) To use this routine, must call RTMPInitTimer before.
3064 2.) Reset NIC to initial state AS IS system boot up time.
3066 ========================================================================
3068 VOID RTMPCancelTimer(
3069 IN PRALINK_TIMER_STRUCT pTimer,
3070 OUT BOOLEAN *pCancelled)
3074 if (pTimer->State == FALSE)
3075 pTimer->Repeat = FALSE;
3077 RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);
3079 if (*pCancelled == TRUE)
3080 pTimer->State = TRUE;
3082 #ifdef RTMP_TIMER_TASK_SUPPORT
3083 // We need to go-through the TimerQ to findout this timer handler and remove it if
3084 // it's still waiting for execution.
3085 RtmpTimerQRemove(pTimer->pAd, pTimer);
3086 #endif // RTMP_TIMER_TASK_SUPPORT //
3090 DBGPRINT_ERR(("RTMPCancelTimer failed, Timer hasn't been initialize!\n"));
3095 ========================================================================
3097 Routine Description:
3101 pAd Pointer to our adapter
3107 IRQL = PASSIVE_LEVEL
3108 IRQL = DISPATCH_LEVEL
3112 ========================================================================
3115 IN PRTMP_ADAPTER pAd,
3122 LowByte = pAd->LedCntl.field.LedMode&0x7f;
3127 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3128 pAd->LedIndicatorStrength = 0;
3131 if (pAd->CommonCfg.Channel > 14)
3135 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3139 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3142 LowByte = 0; // Driver sets MAC register and MAC controls LED
3145 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3149 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3151 case LED_ON_SITE_SURVEY:
3153 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3157 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3160 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetLED::Unknown Status %d\n", Status));
3165 // Keep LED status for LED SiteSurvey mode.
3166 // After SiteSurvey, we will set the LED mode to previous status.
3168 if ((Status != LED_ON_SITE_SURVEY) && (Status != LED_POWER_UP))
3169 pAd->LedStatus = Status;
3171 DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetLED::Mode=%d,HighByte=0x%02x,LowByte=0x%02x\n", pAd->LedCntl.field.LedMode, HighByte, LowByte));
3175 ========================================================================
3177 Routine Description:
3178 Set LED Signal Stregth
3181 pAd Pointer to our adapter
3187 IRQL = PASSIVE_LEVEL
3190 Can be run on any IRQL level.
3192 According to Microsoft Zero Config Wireless Signal Stregth definition as belows.
3199 ========================================================================
3201 VOID RTMPSetSignalLED(
3202 IN PRTMP_ADAPTER pAd,
3203 IN NDIS_802_11_RSSI Dbm)
3207 if (pAd->LedCntl.field.LedMode == LED_MODE_SIGNAL_STREGTH)
3211 else if (Dbm <= -81)
3213 else if (Dbm <= -71)
3215 else if (Dbm <= -67)
3217 else if (Dbm <= -57)
3223 // Update Signal Stregth to firmware if changed.
3225 if (pAd->LedIndicatorStrength != nLed)
3227 AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed, pAd->LedCntl.field.Polarity);
3228 pAd->LedIndicatorStrength = nLed;
3234 ========================================================================
3236 Routine Description:
3240 pAd Pointer to our adapter
3245 IRQL <= DISPATCH_LEVEL
3248 Before Enable RX, make sure you have enabled Interrupt.
3249 ========================================================================
3251 VOID RTMPEnableRxTx(
3252 IN PRTMP_ADAPTER pAd)
3254 // WPDMA_GLO_CFG_STRUC GloCfg;
3256 UINT32 rx_filter_flag;
3258 DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n"));
3261 RT28XXDMAEnable(pAd);
3263 // enable RX of MAC block
3264 if (pAd->OpMode == OPMODE_AP)
3266 rx_filter_flag = APNORMAL;
3269 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); // enable RX of DMA block
3273 if (pAd->CommonCfg.PSPXlink)
3274 rx_filter_flag = PSPXLINK;
3276 rx_filter_flag = STANORMAL; // Staion not drop control frame will fail WiFi Certification.
3277 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);
3280 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);
3281 DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPEnableRxTx\n"));
3285 //+++Add by shiang, move from os/linux/rt_main_dev.c
3286 void CfgInitHook(PRTMP_ADAPTER pAd)
3288 pAd->bBroadComHT = TRUE;
3293 IN PRTMP_ADAPTER pAd,
3294 IN PSTRING pDefaultMac,
3295 IN PSTRING pHostName)
3305 // If dirver doesn't wake up firmware here,
3306 // NICLoadFirmware will hang forever when interface is up again.
3308 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) &&
3309 OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
3311 AUTO_WAKEUP_STRUC AutoWakeupCfg;
3312 AsicForceWakeup(pAd, TRUE);
3313 AutoWakeupCfg.word = 0;
3314 RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
3315 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
3318 #endif // RTMP_MAC_PCI //
3321 // reset Adapter flags
3322 RTMP_CLEAR_FLAGS(pAd);
3324 // Init BssTab & ChannelInfo tabbles for auto channel select.
3326 // Allocate BA Reordering memory
3327 ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM);
3329 // Make sure MAC gets ready.
3333 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
3334 pAd->MACVersion = MacCsr0;
3336 if ((pAd->MACVersion != 0x00) && (pAd->MACVersion != 0xFFFFFFFF))
3340 } while (index++ < 100);
3341 DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
3344 #ifdef PCIE_PS_SUPPORT
3345 /*Iverson patch PCIE L1 issue to make sure that driver can be read,write ,BBP and RF register at pcie L.1 level */
3346 if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))&&OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
3348 RTMP_IO_READ32(pAd, AUX_CTRL, &MacCsr0);
3350 RTMP_IO_WRITE32(pAd, AUX_CTRL, MacCsr0);
3351 DBGPRINT(RT_DEBUG_TRACE, ("AUX_CTRL = 0x%x\n", MacCsr0));
3353 #endif // PCIE_PS_SUPPORT //
3355 // To fix driver disable/enable hang issue when radio off
3356 RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x2);
3357 #endif // RTMP_MAC_PCI //
3360 RT28XXDMADisable(pAd);
3363 // Load 8051 firmware
3364 Status = NICLoadFirmware(pAd);
3365 if (Status != NDIS_STATUS_SUCCESS)
3367 DBGPRINT_ERR(("NICLoadFirmware failed, Status[=0x%08x]\n", Status));
3371 NICLoadRateSwitchingParams(pAd);
3373 // Disable interrupts here which is as soon as possible
3374 // This statement should never be true. We might consider to remove it later
3376 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE))
3378 RTMP_ASIC_INTERRUPT_DISABLE(pAd);
3380 #endif // RTMP_MAC_PCI //
3382 Status = RTMPAllocTxRxRingMemory(pAd);
3383 if (Status != NDIS_STATUS_SUCCESS)
3385 DBGPRINT_ERR(("RTMPAllocDMAMemory failed, Status[=0x%08x]\n", Status));
3389 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
3394 Status = RtmpMgmtTaskInit(pAd);
3395 if (Status != NDIS_STATUS_SUCCESS)
3398 Status = MlmeInit(pAd);
3399 if (Status != NDIS_STATUS_SUCCESS)
3401 DBGPRINT_ERR(("MlmeInit failed, Status[=0x%08x]\n", Status));
3405 // Initialize pAd->StaCfg, pAd->ApCfg, pAd->CommonCfg to manufacture default
3408 Status = RtmpNetTaskInit(pAd);
3409 if (Status != NDIS_STATUS_SUCCESS)
3412 // COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].Bssid, netif->hwaddr);
3413 // pAd->bForcePrintTX = TRUE;
3417 NdisAllocateSpinLock(&pAd->MacTabLock);
3419 MeasureReqTabInit(pAd);
3423 // Init the hardware, we need to init asic before read registry, otherwise mac register will be reset
3425 Status = NICInitializeAdapter(pAd, TRUE);
3426 if (Status != NDIS_STATUS_SUCCESS)
3428 DBGPRINT_ERR(("NICInitializeAdapter failed, Status[=0x%08x]\n", Status));
3429 if (Status != NDIS_STATUS_SUCCESS)
3433 DBGPRINT(RT_DEBUG_OFF, ("1. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
3436 pAd->CommonCfg.bMultipleIRP = FALSE;
3438 if (pAd->CommonCfg.bMultipleIRP)
3439 pAd->CommonCfg.NumOfBulkInIRP = RX_RING_SIZE;
3441 pAd->CommonCfg.NumOfBulkInIRP = 1;
3442 #endif // RTMP_MAC_USB //
3444 //Init Ba Capability parameters.
3445 // RT28XX_BA_INIT(pAd);
3446 pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
3447 pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable;
3448 pAd->CommonCfg.DesiredHtPhy.AmsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;
3449 pAd->CommonCfg.DesiredHtPhy.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;
3451 pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;
3452 pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;
3453 pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
3455 // after reading Registry, we now know if in AP mode or STA mode
3457 // Load 8051 firmware; crash when FW image not existent
3458 // Status = NICLoadFirmware(pAd);
3459 // if (Status != NDIS_STATUS_SUCCESS)
3462 DBGPRINT(RT_DEBUG_OFF, ("2. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
3464 // We should read EEPROM for all cases. rt2860b
3465 NICReadEEPROMParameters(pAd, (PUCHAR)pDefaultMac);
3467 DBGPRINT(RT_DEBUG_OFF, ("3. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
3469 NICInitAsicFromEEPROM(pAd); //rt2860b
3471 // Set PHY to appropriate mode
3472 TmpPhy = pAd->CommonCfg.PhyMode;
3473 pAd->CommonCfg.PhyMode = 0xff;
3474 RTMPSetPhyMode(pAd, TmpPhy);
3477 // No valid channels.
3478 if (pAd->ChannelListNum == 0)
3480 DBGPRINT(RT_DEBUG_ERROR, ("Wrong configuration. No valid channel found. Check \"ContryCode\" and \"ChannelGeography\" setting.\n"));
3484 DBGPRINT(RT_DEBUG_OFF, ("MCS Set = %02x %02x %02x %02x %02x\n", pAd->CommonCfg.HtCapability.MCSSet[0],
3485 pAd->CommonCfg.HtCapability.MCSSet[1], pAd->CommonCfg.HtCapability.MCSSet[2],
3486 pAd->CommonCfg.HtCapability.MCSSet[3], pAd->CommonCfg.HtCapability.MCSSet[4]));
3488 #ifdef RTMP_RF_RW_SUPPORT
3489 //Init RT30xx RFRegisters after read RFIC type from EEPROM
3490 NICInitRFRegisters(pAd);
3491 #endif // RTMP_RF_RW_SUPPORT //
3493 // APInitialize(pAd);
3497 // Initialize RF register to default value
3499 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
3500 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
3502 // 8051 firmware require the signal during booting time.
3503 //2008/11/28:KH marked the following codes to patch Frequency offset bug
3504 //AsicSendCommandToMcu(pAd, 0x72, 0xFF, 0x00, 0x00);
3506 if (pAd && (Status != NDIS_STATUS_SUCCESS))
3509 // Undo everything if it failed
3511 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
3513 // NdisMDeregisterInterrupt(&pAd->Interrupt);
3514 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
3516 // RTMPFreeAdapter(pAd); // we will free it in disconnect()
3520 // Microsoft HCT require driver send a disconnect event after driver initialization.
3521 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
3522 // pAd->IndicateMediaState = NdisMediaStateDisconnected;
3523 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE);
3525 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event B!\n"));
3528 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);
3529 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
3532 // Support multiple BulkIn IRP,
3533 // the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1.
3535 for(index=0; index<pAd->CommonCfg.NumOfBulkInIRP; index++)
3537 RTUSBBulkReceive(pAd);
3538 DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBulkReceive!\n" ));
3540 #endif // RTMP_MAC_USB //
3544 // Set up the Mac address
3545 RtmpOSNetDevAddrSet(pAd->net_dev, &pAd->CurrentAddress[0]);
3547 DBGPRINT_S(Status, ("<==== rt28xx_init, Status=%x\n", Status));
3556 RTMPFreeTxRxRingMemory(pAd);
3559 os_free_mem(pAd, pAd->mpdu_blk_pool.mem); // free BA pool
3561 // shall not set priv to NULL here because the priv didn't been free yet.
3562 //net_dev->ml_priv = 0;
3567 DBGPRINT(RT_DEBUG_ERROR, ("!!! rt28xx Initialized fail !!!\n"));
3570 //---Add by shiang, move from os/linux/rt_main_dev.c
3573 static INT RtmpChipOpsRegister(
3574 IN RTMP_ADAPTER *pAd,
3577 RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
3580 memset(pChipOps, 0, sizeof(RTMP_CHIP_OP));
3582 /* set eeprom related hook functions */
3583 status = RtmpChipOpsEepromHook(pAd, infType);
3585 /* set mcu related hook functions */
3588 #ifdef RTMP_PCI_SUPPORT
3589 case RTMP_DEV_INF_PCI:
3590 pChipOps->loadFirmware = RtmpAsicLoadFirmware;
3591 pChipOps->eraseFirmware = RtmpAsicEraseFirmware;
3592 pChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu;
3594 #endif // RTMP_PCI_SUPPORT //
3595 #ifdef RTMP_USB_SUPPORT
3596 case RTMP_DEV_INF_USB:
3597 pChipOps->loadFirmware = RtmpAsicLoadFirmware;
3598 pChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu;
3600 #endif // RTMP_USB_SUPPORT //
3609 INT RtmpRaDevCtrlInit(
3610 IN RTMP_ADAPTER *pAd,
3611 IN RTMP_INF_TYPE infType)
3615 // Assign the interface type. We need use it when do register/EEPROM access.
3616 pAd->infType = infType;
3619 pAd->OpMode = OPMODE_STA;
3620 DBGPRINT(RT_DEBUG_TRACE, ("STA Driver version-%s\n", STA_DRIVER_VERSION));
3623 init_MUTEX(&(pAd->UsbVendorReq_semaphore));
3624 os_alloc_mem(pAd, (PUCHAR)&pAd->UsbVendorReqBuf, MAX_PARAM_BUFFER_SIZE - 1);
3625 if (pAd->UsbVendorReqBuf == NULL)
3627 DBGPRINT(RT_DEBUG_ERROR, ("Allocate vendor request temp buffer failed!\n"));
3630 #endif // RTMP_MAC_USB //
3632 RtmpChipOpsRegister(pAd, infType);
3639 BOOLEAN RtmpRaDevCtrlExit(IN RTMP_ADAPTER *pAd)
3643 RTMPFreeAdapter(pAd);
3649 // not yet support MBSS
3650 PNET_DEV get_netdev_from_bssid(
3651 IN PRTMP_ADAPTER pAd,
3652 IN UCHAR FromWhichBSSID)
3654 PNET_DEV dev_p = NULL;
3657 dev_p = pAd->net_dev;
3661 return dev_p; /* return one of MBSS */