2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
31 Miniport generic portion header file
35 -------- ---------- ----------------------------------------------
36 Paul Lin 2002-08-01 created
37 John Chang 2004-08-20 RT2561/2661 use scatter-gather scheme
38 Jan Lee 2006-09-15 RT2860. Change for 802.11n , EEPROM, Led, BA, HT.
40 #include "../rt_config.h"
44 #include <linux/bitrev.h>
47 #include "../../rt2870/common/firmware.h"
51 #include "../../rt3070/firmware.h"
54 UCHAR BIT8[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
55 ULONG BIT32[] = {0x00000001, 0x00000002, 0x00000004, 0x00000008,
56 0x00000010, 0x00000020, 0x00000040, 0x00000080,
57 0x00000100, 0x00000200, 0x00000400, 0x00000800,
58 0x00001000, 0x00002000, 0x00004000, 0x00008000,
59 0x00010000, 0x00020000, 0x00040000, 0x00080000,
60 0x00100000, 0x00200000, 0x00400000, 0x00800000,
61 0x01000000, 0x02000000, 0x04000000, 0x08000000,
62 0x10000000, 0x20000000, 0x40000000, 0x80000000};
64 char* CipherName[] = {"none","wep64","wep128","TKIP","AES","CKIP64","CKIP128"};
66 const unsigned short ccitt_16Table[] = {
67 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
68 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
69 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
70 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
71 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
72 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
73 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
74 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
75 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
76 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
77 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
78 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
79 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
80 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
81 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
82 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
83 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
84 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
85 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
86 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
87 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
88 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
89 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
90 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
91 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
92 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
93 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
94 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
95 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
96 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
97 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
98 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
100 #define ByteCRC16(v, crc) \
101 (unsigned short)((crc << 8) ^ ccitt_16Table[((crc >> 8) ^ (v)) & 255])
104 unsigned char BitReverse(unsigned char x)
107 unsigned char Temp=0;
110 if(x & 0x80) Temp |= 0x80;
120 // BBP register initialization set
122 REG_PAIR BBPRegTable[] = {
123 {BBP_R65, 0x2C}, // fix rssi issue
124 {BBP_R66, 0x38}, // Also set this default value to pAd->BbpTuning.R66CurrentValue at initial
126 {BBP_R70, 0xa}, // BBP_R70 will change to 0x8 in ApStartUp and LinkUp for rt2860C, otherwise value is 0xa
131 {BBP_R84, 0x99}, // 0x19 is for rt2860E and after. This is for extension channel overlapping IOT. 0x99 is for rt2860D and before
132 {BBP_R86, 0x00}, // middle range issue, Rory @2008-01-28
133 {BBP_R91, 0x04}, // middle range issue, Rory @2008-01-28
134 {BBP_R92, 0x00}, // middle range issue, Rory @2008-01-28
135 {BBP_R103, 0x00}, // near range high-power issue, requested from Gary @2008-0528
136 {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.
138 #define NUM_BBP_REG_PARMS (sizeof(BBPRegTable) / sizeof(REG_PAIR))
141 // RF register initialization set
144 REG_PAIR RT30xx_RFRegTable[] = {
173 #define NUM_RF_REG_PARMS (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR))
177 // ASIC register initialization sets
180 RTMP_REG_PAIR MACRegTable[] = {
181 #if defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x200)
182 {BCN_OFFSET0, 0xf8f0e8e0}, /* 0x3800(e0), 0x3A00(e8), 0x3C00(f0), 0x3E00(f8), 512B for each beacon */
183 {BCN_OFFSET1, 0x6f77d0c8}, /* 0x3200(c8), 0x3400(d0), 0x1DC0(77), 0x1BC0(6f), 512B for each beacon */
184 #elif defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x100)
185 {BCN_OFFSET0, 0xece8e4e0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
186 {BCN_OFFSET1, 0xfcf8f4f0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
188 #error You must re-calculate new value for BCN_OFFSET0 & BCN_OFFSET1 in MACRegTable[]!!!
189 #endif // HW_BEACON_OFFSET //
191 {LEGACY_BASIC_RATE, 0x0000013f}, // Basic rate set bitmap
192 {HT_BASIC_RATE, 0x00008003}, // Basic HT rate set , 20M, MCS=3, MM. Format is the same as in TXWI.
193 {MAC_SYS_CTRL, 0x00}, // 0x1004, , default Disable RX
194 {RX_FILTR_CFG, 0x17f97}, //0x1400 , RX filter control,
195 {BKOFF_SLOT_CFG, 0x209}, // default set short slot time, CC_DELAY_TIME should be 2
196 {TX_SW_CFG0, 0x0}, // Gary,2008-05-21 for CWC test
197 {TX_SW_CFG1, 0x80606}, // Gary,2006-08-23
198 {TX_LINK_CFG, 0x1020}, // Gary,2006-08-23
199 {TX_TIMEOUT_CFG, 0x000a2090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT , Modify for 2860E ,2007-08-01
200 {MAX_LEN_CFG, MAX_AGGREGATION_SIZE | 0x00001000}, // 0x3018, MAX frame length. Max PSDU = 16kbytes.
201 {LED_CFG, 0x7f031e46}, // Gary, 2006-08-23
202 {PBF_MAX_PCNT, 0x1F3FBF9F}, //0x1F3f7f9f}, //Jan, 2006/04/20
203 {TX_RTY_CFG, 0x47d01f0f}, // Jan, 2006/11/16, Set TxWI->ACK =0 in Probe Rsp Modify for 2860E ,2007-08-03
204 {AUTO_RSP_CFG, 0x00000013}, // Initial Auto_Responder, because QA will turn off Auto-Responder
205 {CCK_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled.
206 {OFDM_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled.
207 //PS packets use Tx1Q (for HCCA) when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)
209 {PBF_CFG, 0xf40006}, // Only enable Queue 2
210 {MM40_PROT_CFG, 0x3F44084}, // Initial Auto_Responder, because QA will turn off Auto-Responder
211 {WPDMA_GLO_CFG, 0x00000030},
213 {GF20_PROT_CFG, 0x01744004}, // set 19:18 --> Short NAV for MIMO PS
214 {GF40_PROT_CFG, 0x03F44084},
215 {MM20_PROT_CFG, 0x01744004},
217 {MM40_PROT_CFG, 0x03F54084},
219 {TXOP_CTRL_CFG, 0x0000583f, /*0x0000243f*/ /*0x000024bf*/}, //Extension channel backoff.
220 {TX_RTS_CFG, 0x00092b20},
221 {EXP_ACK_TIME, 0x002400ca}, // default value
222 {TXOP_HLDR_ET, 0x00000002},
224 /* Jerry comments 2008/01/16: we use SIFS = 10us in CCK defaultly, but it seems that 10us
225 is too small for INTEL 2200bg card, so in MBSS mode, the delta time between beacon0
226 and beacon1 is SIFS (10us), so if INTEL 2200bg card connects to BSS0, the ping
227 will always lost. So we change the SIFS of CCK from 10us to 16us. */
228 {XIFS_TIME_CFG, 0x33a41010},
229 {PWR_PIN_CFG, 0x00000003}, // patch for 2880-E
232 RTMP_REG_PAIR STAMACRegTable[] = {
233 {WMM_AIFSN_CFG, 0x00002273},
234 {WMM_CWMIN_CFG, 0x00002344},
235 {WMM_CWMAX_CFG, 0x000034aa},
238 #define NUM_MAC_REG_PARMS (sizeof(MACRegTable) / sizeof(RTMP_REG_PAIR))
239 #define NUM_STA_MAC_REG_PARMS (sizeof(STAMACRegTable) / sizeof(RTMP_REG_PAIR))
243 // RT2870 Firmware Spec only used 1 oct for version expression
245 #define FIRMWARE_MINOR_VERSION 7
249 // New 8k byte firmware size for RT3071/RT3072
250 #define FIRMWAREIMAGE_MAX_LENGTH 0x2000
251 #define FIRMWAREIMAGE_LENGTH (sizeof (FirmwareImage) / sizeof(UCHAR))
252 #define FIRMWARE_MAJOR_VERSION 0
254 #define FIRMWAREIMAGEV1_LENGTH 0x1000
255 #define FIRMWAREIMAGEV2_LENGTH 0x1000
258 #define FIRMWARE_MINOR_VERSION 2
263 ========================================================================
266 Allocate RTMP_ADAPTER data block and do some initialization
269 Adapter Pointer to our adapter
279 ========================================================================
281 NDIS_STATUS RTMPAllocAdapterBlock(
283 OUT PRTMP_ADAPTER *ppAdapter)
288 UCHAR *pBeaconBuf = NULL;
290 DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocAdapterBlock\n"));
296 // Allocate RTMP_ADAPTER memory block
297 pBeaconBuf = kmalloc(MAX_BEACON_SIZE, MEM_ALLOC_FLAG);
298 if (pBeaconBuf == NULL)
300 Status = NDIS_STATUS_FAILURE;
301 DBGPRINT_ERR(("Failed to allocate memory - BeaconBuf!\n"));
305 Status = AdapterBlockAllocateMemory(handle, (PVOID *)&pAd);
306 if (Status != NDIS_STATUS_SUCCESS)
308 DBGPRINT_ERR(("Failed to allocate memory - ADAPTER\n"));
311 pAd->BeaconBuf = pBeaconBuf;
312 printk("\n\n=== pAd = %p, size = %d ===\n\n", pAd, (UINT32)sizeof(RTMP_ADAPTER));
316 NdisAllocateSpinLock(&pAd->MgmtRingLock);
318 NdisAllocateSpinLock(&pAd->RxRingLock);
321 for (index =0 ; index < NUM_OF_TX_RING; index++)
323 NdisAllocateSpinLock(&pAd->TxSwQueueLock[index]);
324 NdisAllocateSpinLock(&pAd->DeQueueLock[index]);
325 pAd->DeQueueRunning[index] = FALSE;
328 NdisAllocateSpinLock(&pAd->irq_lock);
332 if ((Status != NDIS_STATUS_SUCCESS) && (pBeaconBuf))
337 DBGPRINT_S(Status, ("<-- RTMPAllocAdapterBlock, Status=%x\n", Status));
342 ========================================================================
345 Read initial Tx power per MCS and BW from EEPROM
348 Adapter Pointer to our adapter
357 ========================================================================
359 VOID RTMPReadTxPwrPerRate(
360 IN PRTMP_ADAPTER pAd)
362 ULONG data, Adata, Gdata;
363 USHORT i, value, value2;
364 INT Apwrdelta, Gpwrdelta;
366 BOOLEAN bValid, bApwrdeltaMinus = TRUE, bGpwrdeltaMinus = TRUE;
369 // Get power delta for 20MHz and 40MHz.
371 DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n"));
372 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);
376 if ((value2 & 0xff) != 0xff)
379 Gpwrdelta = (value2&0xf);
382 bGpwrdeltaMinus = FALSE;
384 bGpwrdeltaMinus = TRUE;
386 if ((value2 & 0xff00) != 0xff00)
388 if ((value2 & 0x8000))
389 Apwrdelta = ((value2&0xf00)>>8);
391 if ((value2 & 0x4000))
392 bApwrdeltaMinus = FALSE;
394 bApwrdeltaMinus = TRUE;
396 DBGPRINT(RT_DEBUG_TRACE, ("Gpwrdelta = %x, Apwrdelta = %x .\n", Gpwrdelta, Apwrdelta));
399 // Get Txpower per MCS for 20MHz in 2.4G.
403 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4, value);
405 if (bApwrdeltaMinus == FALSE)
407 t1 = (value&0xf)+(Apwrdelta);
410 t2 = ((value&0xf0)>>4)+(Apwrdelta);
413 t3 = ((value&0xf00)>>8)+(Apwrdelta);
416 t4 = ((value&0xf000)>>12)+(Apwrdelta);
422 if ((value&0xf) > Apwrdelta)
423 t1 = (value&0xf)-(Apwrdelta);
426 if (((value&0xf0)>>4) > Apwrdelta)
427 t2 = ((value&0xf0)>>4)-(Apwrdelta);
430 if (((value&0xf00)>>8) > Apwrdelta)
431 t3 = ((value&0xf00)>>8)-(Apwrdelta);
434 if (((value&0xf000)>>12) > Apwrdelta)
435 t4 = ((value&0xf000)>>12)-(Apwrdelta);
439 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
440 if (bGpwrdeltaMinus == FALSE)
442 t1 = (value&0xf)+(Gpwrdelta);
445 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
448 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
451 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
457 if ((value&0xf) > Gpwrdelta)
458 t1 = (value&0xf)-(Gpwrdelta);
461 if (((value&0xf0)>>4) > Gpwrdelta)
462 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
465 if (((value&0xf00)>>8) > Gpwrdelta)
466 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
469 if (((value&0xf000)>>12) > Gpwrdelta)
470 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
474 Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
476 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2, value);
477 if (bApwrdeltaMinus == FALSE)
479 t1 = (value&0xf)+(Apwrdelta);
482 t2 = ((value&0xf0)>>4)+(Apwrdelta);
485 t3 = ((value&0xf00)>>8)+(Apwrdelta);
488 t4 = ((value&0xf000)>>12)+(Apwrdelta);
494 if ((value&0xf) > Apwrdelta)
495 t1 = (value&0xf)-(Apwrdelta);
498 if (((value&0xf0)>>4) > Apwrdelta)
499 t2 = ((value&0xf0)>>4)-(Apwrdelta);
502 if (((value&0xf00)>>8) > Apwrdelta)
503 t3 = ((value&0xf00)>>8)-(Apwrdelta);
506 if (((value&0xf000)>>12) > Apwrdelta)
507 t4 = ((value&0xf000)>>12)-(Apwrdelta);
511 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
512 if (bGpwrdeltaMinus == FALSE)
514 t1 = (value&0xf)+(Gpwrdelta);
517 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
520 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
523 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
529 if ((value&0xf) > Gpwrdelta)
530 t1 = (value&0xf)-(Gpwrdelta);
533 if (((value&0xf0)>>4) > Gpwrdelta)
534 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
537 if (((value&0xf00)>>8) > Gpwrdelta)
538 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
541 if (((value&0xf000)>>12) > Gpwrdelta)
542 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
546 Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
549 pAd->Tx20MPwrCfgABand[i] = pAd->Tx40MPwrCfgABand[i] = Adata;
550 pAd->Tx20MPwrCfgGBand[i] = pAd->Tx40MPwrCfgGBand[i] = Gdata;
552 if (data != 0xffffffff)
553 RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, data);
554 DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 2.4G band-%lx, Adata = %lx, Gdata = %lx \n", data, Adata, Gdata));
558 // Check this block is valid for 40MHz in 2.4G. If invalid, use parameter for 20MHz in 2.4G
563 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + 2 + i*2, value);
564 if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
572 // Get Txpower per MCS for 40MHz in 2.4G.
578 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4, value);
579 if (bGpwrdeltaMinus == FALSE)
581 t1 = (value&0xf)+(Gpwrdelta);
584 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
587 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
590 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
596 if ((value&0xf) > Gpwrdelta)
597 t1 = (value&0xf)-(Gpwrdelta);
600 if (((value&0xf0)>>4) > Gpwrdelta)
601 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
604 if (((value&0xf00)>>8) > Gpwrdelta)
605 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
608 if (((value&0xf000)>>12) > Gpwrdelta)
609 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
613 Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
615 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4 + 2, value);
616 if (bGpwrdeltaMinus == FALSE)
618 t1 = (value&0xf)+(Gpwrdelta);
621 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
624 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
627 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
633 if ((value&0xf) > Gpwrdelta)
634 t1 = (value&0xf)-(Gpwrdelta);
637 if (((value&0xf0)>>4) > Gpwrdelta)
638 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
641 if (((value&0xf00)>>8) > Gpwrdelta)
642 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
645 if (((value&0xf000)>>12) > Gpwrdelta)
646 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
650 Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
653 pAd->Tx40MPwrCfgGBand[i+1] = (pAd->Tx40MPwrCfgGBand[i+1] & 0x0000FFFF) | (Gdata & 0xFFFF0000);
655 pAd->Tx40MPwrCfgGBand[i+1] = Gdata;
657 DBGPRINT_RAW(RT_DEBUG_TRACE, ("40MHz BW, 2.4G band, Gdata = %lx \n", Gdata));
662 // Check this block is valid for 20MHz in 5G. If invalid, use parameter for 20MHz in 2.4G
667 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + 2 + i*2, value);
668 if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
676 // Get Txpower per MCS for 20MHz in 5G.
682 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4, value);
683 if (bApwrdeltaMinus == FALSE)
685 t1 = (value&0xf)+(Apwrdelta);
688 t2 = ((value&0xf0)>>4)+(Apwrdelta);
691 t3 = ((value&0xf00)>>8)+(Apwrdelta);
694 t4 = ((value&0xf000)>>12)+(Apwrdelta);
700 if ((value&0xf) > Apwrdelta)
701 t1 = (value&0xf)-(Apwrdelta);
704 if (((value&0xf0)>>4) > Apwrdelta)
705 t2 = ((value&0xf0)>>4)-(Apwrdelta);
708 if (((value&0xf00)>>8) > Apwrdelta)
709 t3 = ((value&0xf00)>>8)-(Apwrdelta);
712 if (((value&0xf000)>>12) > Apwrdelta)
713 t4 = ((value&0xf000)>>12)-(Apwrdelta);
717 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
719 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4 + 2, value);
720 if (bApwrdeltaMinus == FALSE)
722 t1 = (value&0xf)+(Apwrdelta);
725 t2 = ((value&0xf0)>>4)+(Apwrdelta);
728 t3 = ((value&0xf00)>>8)+(Apwrdelta);
731 t4 = ((value&0xf000)>>12)+(Apwrdelta);
737 if ((value&0xf) > Apwrdelta)
738 t1 = (value&0xf)-(Apwrdelta);
741 if (((value&0xf0)>>4) > Apwrdelta)
742 t2 = ((value&0xf0)>>4)-(Apwrdelta);
745 if (((value&0xf00)>>8) > Apwrdelta)
746 t3 = ((value&0xf00)>>8)-(Apwrdelta);
749 if (((value&0xf000)>>12) > Apwrdelta)
750 t4 = ((value&0xf000)>>12)-(Apwrdelta);
754 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
757 pAd->Tx20MPwrCfgABand[i] = (pAd->Tx20MPwrCfgABand[i] & 0x0000FFFF) | (Adata & 0xFFFF0000);
759 pAd->Tx20MPwrCfgABand[i] = Adata;
761 DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 5GHz band, Adata = %lx \n", Adata));
766 // Check this block is valid for 40MHz in 5G. If invalid, use parameter for 20MHz in 2.4G
771 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + 2 + i*2, value);
772 if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
780 // Get Txpower per MCS for 40MHz in 5G.
786 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4, value);
787 if (bApwrdeltaMinus == FALSE)
789 t1 = (value&0xf)+(Apwrdelta);
792 t2 = ((value&0xf0)>>4)+(Apwrdelta);
795 t3 = ((value&0xf00)>>8)+(Apwrdelta);
798 t4 = ((value&0xf000)>>12)+(Apwrdelta);
804 if ((value&0xf) > Apwrdelta)
805 t1 = (value&0xf)-(Apwrdelta);
808 if (((value&0xf0)>>4) > Apwrdelta)
809 t2 = ((value&0xf0)>>4)-(Apwrdelta);
812 if (((value&0xf00)>>8) > Apwrdelta)
813 t3 = ((value&0xf00)>>8)-(Apwrdelta);
816 if (((value&0xf000)>>12) > Apwrdelta)
817 t4 = ((value&0xf000)>>12)-(Apwrdelta);
821 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
823 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4 + 2, value);
824 if (bApwrdeltaMinus == FALSE)
826 t1 = (value&0xf)+(Apwrdelta);
829 t2 = ((value&0xf0)>>4)+(Apwrdelta);
832 t3 = ((value&0xf00)>>8)+(Apwrdelta);
835 t4 = ((value&0xf000)>>12)+(Apwrdelta);
841 if ((value&0xf) > Apwrdelta)
842 t1 = (value&0xf)-(Apwrdelta);
845 if (((value&0xf0)>>4) > Apwrdelta)
846 t2 = ((value&0xf0)>>4)-(Apwrdelta);
849 if (((value&0xf00)>>8) > Apwrdelta)
850 t3 = ((value&0xf00)>>8)-(Apwrdelta);
853 if (((value&0xf000)>>12) > Apwrdelta)
854 t4 = ((value&0xf000)>>12)-(Apwrdelta);
858 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
861 pAd->Tx40MPwrCfgABand[i+1] = (pAd->Tx40MPwrCfgABand[i+1] & 0x0000FFFF) | (Adata & 0xFFFF0000);
863 pAd->Tx40MPwrCfgABand[i+1] = Adata;
865 DBGPRINT_RAW(RT_DEBUG_TRACE, ("40MHz BW, 5GHz band, Adata = %lx \n", Adata));
872 ========================================================================
875 Read initial channel power parameters from EEPROM
878 Adapter Pointer to our adapter
887 ========================================================================
889 VOID RTMPReadChannelPwr(
890 IN PRTMP_ADAPTER pAd)
893 EEPROM_TX_PWR_STRUC Power;
894 EEPROM_TX_PWR_STRUC Power2;
896 // Read Tx power value for all channels
897 // Value from 1 - 0x7f. Default value is 24.
898 // Power value : 2.4G 0x00 (0) ~ 0x1F (31)
899 // : 5.5G 0xF9 (-7) ~ 0x0F (15)
901 // 0. 11b/g, ch1 - ch 14
902 for (i = 0; i < 7; i++)
904 RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2, Power.word);
905 RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2, Power2.word);
906 pAd->TxPower[i * 2].Channel = i * 2 + 1;
907 pAd->TxPower[i * 2 + 1].Channel = i * 2 + 2;
909 if ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0))
910 pAd->TxPower[i * 2].Power = DEFAULT_RF_TX_POWER;
912 pAd->TxPower[i * 2].Power = Power.field.Byte0;
914 if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0))
915 pAd->TxPower[i * 2 + 1].Power = DEFAULT_RF_TX_POWER;
917 pAd->TxPower[i * 2 + 1].Power = Power.field.Byte1;
919 if ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0))
920 pAd->TxPower[i * 2].Power2 = DEFAULT_RF_TX_POWER;
922 pAd->TxPower[i * 2].Power2 = Power2.field.Byte0;
924 if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0))
925 pAd->TxPower[i * 2 + 1].Power2 = DEFAULT_RF_TX_POWER;
927 pAd->TxPower[i * 2 + 1].Power2 = Power2.field.Byte1;
930 // 1. U-NII lower/middle band: 36, 38, 40; 44, 46, 48; 52, 54, 56; 60, 62, 64 (including central frequency in BW 40MHz)
931 // 1.1 Fill up channel
933 for (i = 0; i < 4; i++)
935 pAd->TxPower[3 * i + choffset + 0].Channel = 36 + i * 8 + 0;
936 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
937 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
939 pAd->TxPower[3 * i + choffset + 1].Channel = 36 + i * 8 + 2;
940 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
941 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
943 pAd->TxPower[3 * i + choffset + 2].Channel = 36 + i * 8 + 4;
944 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
945 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
949 for (i = 0; i < 6; i++)
951 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2, Power.word);
952 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2, Power2.word);
954 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
955 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
957 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
958 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
960 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
961 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
963 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
964 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
967 // 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)
968 // 2.1 Fill up channel
970 for (i = 0; i < 5; i++)
972 pAd->TxPower[3 * i + choffset + 0].Channel = 100 + i * 8 + 0;
973 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
974 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
976 pAd->TxPower[3 * i + choffset + 1].Channel = 100 + i * 8 + 2;
977 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
978 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
980 pAd->TxPower[3 * i + choffset + 2].Channel = 100 + i * 8 + 4;
981 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
982 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
984 pAd->TxPower[3 * 5 + choffset + 0].Channel = 140;
985 pAd->TxPower[3 * 5 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
986 pAd->TxPower[3 * 5 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
989 for (i = 0; i < 8; i++)
991 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);
992 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);
994 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
995 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
997 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
998 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
1000 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
1001 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
1003 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
1004 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
1007 // 3. U-NII upper band: 149, 151, 153; 157, 159, 161; 165 (including central frequency in BW 40MHz)
1008 // 3.1 Fill up channel
1009 choffset = 14 + 12 + 16;
1010 for (i = 0; i < 2; i++)
1012 pAd->TxPower[3 * i + choffset + 0].Channel = 149 + i * 8 + 0;
1013 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
1014 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
1016 pAd->TxPower[3 * i + choffset + 1].Channel = 149 + i * 8 + 2;
1017 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
1018 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
1020 pAd->TxPower[3 * i + choffset + 2].Channel = 149 + i * 8 + 4;
1021 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
1022 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
1024 pAd->TxPower[3 * 2 + choffset + 0].Channel = 165;
1025 pAd->TxPower[3 * 2 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
1026 pAd->TxPower[3 * 2 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
1028 // 3.2 Fill up power
1029 for (i = 0; i < 4; i++)
1031 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);
1032 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);
1034 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
1035 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
1037 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
1038 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
1040 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
1041 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
1043 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
1044 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
1047 // 4. Print and Debug
1048 choffset = 14 + 12 + 16 + 7;
1052 ========================================================================
1054 Routine Description:
1055 Read the following from the registry
1056 1. All the parameters
1060 Adapter Pointer to our adapter
1061 WrapperConfigurationContext For use by NdisOpenConfiguration
1066 NDIS_STATUS_RESOURCES
1068 IRQL = PASSIVE_LEVEL
1072 ========================================================================
1074 NDIS_STATUS NICReadRegParameters(
1075 IN PRTMP_ADAPTER pAd,
1076 IN NDIS_HANDLE WrapperConfigurationContext
1079 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
1080 DBGPRINT_S(Status, ("<-- NICReadRegParameters, Status=%x\n", Status));
1087 ========================================================================
1089 Routine Description:
1090 For RF filter calibration purpose
1093 pAd Pointer to our adapter
1098 IRQL = PASSIVE_LEVEL
1100 ========================================================================
1102 VOID RTMPFilterCalibration(
1103 IN PRTMP_ADAPTER pAd)
1105 UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue=0;
1106 UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0;
1107 UCHAR RF_R24_Value = 0;
1109 // Give bbp filter initial value
1111 pAd->Mlme.CaliBW20RfR24 = 0x16;
1112 pAd->Mlme.CaliBW40RfR24 = 0x36; //Bit[5] must be 1 for BW 40
1114 pAd->Mlme.CaliBW20RfR24 = 0x1F;
1115 pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40
1119 if (loop == 1) //BandWidth = 40 MHz
1121 // Write 0x27 to RF_R24 to program filter
1122 RF_R24_Value = 0x27;
1123 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1125 FilterTarget = 0x15;
1127 FilterTarget = 0x19;
1129 // when calibrate BW40, BBP mask must set to BW40.
1130 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1133 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1136 RT30xxReadRFRegister(pAd, RF_R31, &value);
1138 RT30xxWriteRFRegister(pAd, RF_R31, value);
1141 else //BandWidth = 20 MHz
1143 // Write 0x07 to RF_R24 to program filter
1144 RF_R24_Value = 0x07;
1145 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1147 FilterTarget = 0x13;
1149 FilterTarget = 0x16;
1152 RT30xxReadRFRegister(pAd, RF_R31, &value);
1154 RT30xxWriteRFRegister(pAd, RF_R31, value);
1158 // Write 0x01 to RF_R22 to enable baseband loopback mode
1159 RT30xxReadRFRegister(pAd, RF_R22, &value);
1161 RT30xxWriteRFRegister(pAd, RF_R22, value);
1163 // Write 0x00 to BBP_R24 to set power & frequency of passband test tone
1164 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
1168 // Write 0x90 to BBP_R25 to transmit test tone
1169 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
1171 RTMPusecDelay(1000);
1172 // Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0]
1173 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
1174 R55x = value & 0xFF;
1176 } while ((ReTry++ < 100) && (R55x == 0));
1178 // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
1179 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06);
1183 // Write 0x90 to BBP_R25 to transmit test tone
1184 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
1186 //We need to wait for calibration
1187 RTMPusecDelay(1000);
1188 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
1190 if ((R55x - value) < FilterTarget)
1194 else if ((R55x - value) == FilterTarget)
1204 // prevent infinite loop cause driver hang.
1205 if (loopcnt++ > 100)
1207 DBGPRINT(RT_DEBUG_ERROR, ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt));
1211 // Write RF_R24 to program filter
1212 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1217 RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));
1220 // Store for future usage
1225 //BandWidth = 20 MHz
1226 pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value;
1230 //BandWidth = 40 MHz
1231 pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value;
1238 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1245 // Set back to initial state
1247 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
1249 RT30xxReadRFRegister(pAd, RF_R22, &value);
1251 RT30xxWriteRFRegister(pAd, RF_R22, value);
1253 // set BBP back to BW20
1254 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1256 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1258 DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
1261 VOID NICInitRT30xxRFRegisters(IN PRTMP_ADAPTER pAd)
1264 // Driver must read EEPROM to get RfIcType before initial RF registers
1265 // Initialize RF register to default value
1267 if (IS_RT3070(pAd) && ((pAd->RfIcType == RFIC_3020) ||(pAd->RfIcType == RFIC_2020)))
1269 // Init RF calibration
1270 // Driver should toggle RF R30 bit7 before init RF registers
1272 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg);
1274 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1275 RTMPusecDelay(1000);
1277 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1279 // Initialize RF register to default value
1280 for (i = 0; i < NUM_RF_REG_PARMS; i++)
1282 RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
1285 //For RF filter Calibration
1286 RTMPFilterCalibration(pAd);
1290 if (IS_RT3070(pAd) || IS_RT3071(pAd))
1292 // Init RF calibration
1293 // Driver should toggle RF R30 bit7 before init RF registers
1297 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg);
1299 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1300 RTMPusecDelay(1000);
1302 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1304 // Initialize RF register to default value
1305 for (i = 0; i < NUM_RF_REG_PARMS; i++)
1307 RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
1313 // Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate
1314 RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
1315 data = ((data & 0xF0FFFFFF) | 0x0D000000);
1316 RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
1318 else if (IS_RT3071(pAd))
1320 // Driver should set RF R6 bit6 on before init RF registers
1321 RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg);
1323 RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg);
1326 RT30xxWriteRFRegister(pAd, RF_R31, 0x14);
1328 // RT3071 version E has fixed this issue
1329 if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211))
1331 // patch tx EVM issue temporarily
1332 RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
1333 data = ((data & 0xE0FFFFFF) | 0x0D000000);
1334 RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
1338 RTMP_IO_READ32(pAd, LDO_CFG0, &data);
1339 data = ((data & 0xE0FFFFFF) | 0x01000000);
1340 RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
1343 // patch LNA_PE_G1 failed issue
1344 RTUSBReadMACRegister(pAd, GPIO_SWITCH, &data);
1346 RTUSBWriteMACRegister(pAd, GPIO_SWITCH, data);
1349 //For RF filter Calibration
1350 RTMPFilterCalibration(pAd);
1352 // Initialize RF R27 register, set RF R27 must be behind RTMPFilterCalibration()
1353 if ((pAd->MACVersion & 0xffff) < 0x0211)
1354 RT30xxWriteRFRegister(pAd, RF_R27, 0x3);
1356 // set led open drain enable
1357 RTUSBReadMACRegister(pAd, OPT_14, &data);
1359 RTUSBWriteMACRegister(pAd, OPT_14, data);
1363 // add by johnli, RF power sequence setup, load RF normal operation-mode setup
1364 RT30xxLoadRFNormalModeSetup(pAd);
1373 ========================================================================
1375 Routine Description:
1376 Read initial parameters from EEPROM
1379 Adapter Pointer to our adapter
1384 IRQL = PASSIVE_LEVEL
1388 ========================================================================
1390 VOID NICReadEEPROMParameters(
1391 IN PRTMP_ADAPTER pAd,
1395 USHORT i, value, value2;
1397 EEPROM_TX_PWR_STRUC Power;
1398 EEPROM_VERSION_STRUC Version;
1399 EEPROM_ANTENNA_STRUC Antenna;
1400 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1402 DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n"));
1404 // Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8
1405 RTMP_IO_READ32(pAd, E2PROM_CSR, &data);
1406 DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%x\n", data));
1408 if((data & 0x30) == 0)
1409 pAd->EEPROMAddressNum = 6; // 93C46
1410 else if((data & 0x30) == 0x10)
1411 pAd->EEPROMAddressNum = 8; // 93C66
1413 pAd->EEPROMAddressNum = 8; // 93C86
1414 DBGPRINT(RT_DEBUG_TRACE, ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum ));
1416 // RT2860 MAC no longer auto load MAC address from E2PROM. Driver has to intialize
1417 // MAC address registers according to E2PROM setting
1418 if (mac_addr == NULL ||
1419 strlen(mac_addr) != 17 ||
1420 mac_addr[2] != ':' || mac_addr[5] != ':' || mac_addr[8] != ':' ||
1421 mac_addr[11] != ':' || mac_addr[14] != ':')
1423 USHORT Addr01,Addr23,Addr45 ;
1425 RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);
1426 RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);
1427 RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);
1429 pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);
1430 pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8);
1431 pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);
1432 pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8);
1433 pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);
1434 pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8);
1436 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from E2PROM \n"));
1445 for (j=0; j<MAC_ADDR_LEN; j++)
1447 AtoH(macptr, &pAd->PermanentAddress[j], 1);
1451 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from module parameter \n"));
1456 //more conveninet to test mbssid, so ap's bssid &0xf1
1457 if (pAd->PermanentAddress[0] == 0xff)
1458 pAd->PermanentAddress[0] = RandomByte(pAd)&0xf8;
1460 //if (pAd->PermanentAddress[5] == 0xff)
1461 // pAd->PermanentAddress[5] = RandomByte(pAd)&0xf8;
1463 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
1464 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
1465 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
1466 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
1467 if (pAd->bLocalAdminMAC == FALSE)
1471 COPY_MAC_ADDR(pAd->CurrentAddress, pAd->PermanentAddress);
1472 csr2.field.Byte0 = pAd->CurrentAddress[0];
1473 csr2.field.Byte1 = pAd->CurrentAddress[1];
1474 csr2.field.Byte2 = pAd->CurrentAddress[2];
1475 csr2.field.Byte3 = pAd->CurrentAddress[3];
1476 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word);
1478 csr3.field.Byte4 = pAd->CurrentAddress[4];
1479 csr3.field.Byte5 = pAd->CurrentAddress[5];
1480 csr3.field.U2MeMask = 0xff;
1481 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word);
1482 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
1483 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
1484 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
1485 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
1489 // if not return early. cause fail at emulation.
1490 // Init the channel number for TX channel power
1491 RTMPReadChannelPwr(pAd);
1493 // if E2PROM version mismatch with driver's expectation, then skip
1494 // all subsequent E2RPOM retieval and set a system error bit to notify GUI
1495 RT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word);
1496 pAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256;
1497 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: Version = %d, FAE release #%d\n", Version.field.Version, Version.field.FaeReleaseNumber));
1499 if (Version.field.Version > VALID_EEPROM_VERSION)
1501 DBGPRINT_ERR(("E2PROM: WRONG VERSION 0x%x, should be %d\n",Version.field.Version, VALID_EEPROM_VERSION));
1502 /*pAd->SystemErrorBitmap |= 0x00000001;
1504 // hard-code default value when no proper E2PROM installed
1505 pAd->bAutoTxAgcA = FALSE;
1506 pAd->bAutoTxAgcG = FALSE;
1508 // Default the channel power
1509 for (i = 0; i < MAX_NUM_OF_CHANNELS; i++)
1510 pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER;
1512 // Default the channel power
1513 for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++)
1514 pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER;
1516 for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++)
1517 pAd->EEPROMDefaultValue[i] = 0xffff;
1521 // Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd
1522 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value);
1523 pAd->EEPROMDefaultValue[0] = value;
1525 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);
1526 pAd->EEPROMDefaultValue[1] = value;
1528 RT28xx_EEPROM_READ16(pAd, 0x38, value); // Country Region
1529 pAd->EEPROMDefaultValue[2] = value;
1531 for(i = 0; i < 8; i++)
1533 RT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2, value);
1534 pAd->EEPROMDefaultValue[i+3] = value;
1537 // We have to parse NIC configuration 0 at here.
1538 // If TSSI did not have preloaded value, it should reset the TxAutoAgc to false
1539 // Therefore, we have to read TxAutoAgc control beforehand.
1540 // Read Tx AGC control bit
1541 Antenna.word = pAd->EEPROMDefaultValue[0];
1542 if (Antenna.word == 0xFFFF)
1547 Antenna.field.RfIcType = RFIC_3020;
1548 Antenna.field.TxPath = 1;
1549 Antenna.field.RxPath = 1;
1554 Antenna.field.RfIcType = RFIC_2820;
1555 Antenna.field.TxPath = 1;
1556 Antenna.field.RxPath = 2;
1557 DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
1561 // Choose the desired Tx&Rx stream.
1562 if ((pAd->CommonCfg.TxStream == 0) || (pAd->CommonCfg.TxStream > Antenna.field.TxPath))
1563 pAd->CommonCfg.TxStream = Antenna.field.TxPath;
1565 if ((pAd->CommonCfg.RxStream == 0) || (pAd->CommonCfg.RxStream > Antenna.field.RxPath))
1567 pAd->CommonCfg.RxStream = Antenna.field.RxPath;
1569 if ((pAd->MACVersion < RALINK_2883_VERSION) &&
1570 (pAd->CommonCfg.RxStream > 2))
1572 // only 2 Rx streams for RT2860 series
1573 pAd->CommonCfg.RxStream = 2;
1578 // read value from EEPROM and set them to CSR174 ~ 177 in chain0 ~ chain2
1584 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1588 NicConfig2.word = 0;
1590 if ((NicConfig2.word & 0x00ff) == 0xff)
1592 NicConfig2.word &= 0xff00;
1595 if ((NicConfig2.word >> 8) == 0xff)
1597 NicConfig2.word &= 0x00ff;
1601 if (NicConfig2.field.DynamicTxAgcControl == 1)
1602 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1604 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1606 DBGPRINT_RAW(RT_DEBUG_TRACE, ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n", Antenna.field.RxPath, Antenna.field.TxPath));
1608 // Save the antenna for future use
1609 pAd->Antenna.word = Antenna.word;
1612 // Reset PhyMode if we don't support 802.11a
1613 // Only RFIC_2850 & RFIC_2750 support 802.11a
1615 if ((Antenna.field.RfIcType != RFIC_2850) && (Antenna.field.RfIcType != RFIC_2750))
1617 if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) ||
1618 (pAd->CommonCfg.PhyMode == PHY_11A))
1619 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;
1620 else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
1621 (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) ||
1622 (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) ||
1623 (pAd->CommonCfg.PhyMode == PHY_11N_5G))
1624 pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED;
1627 // Read TSSI reference and TSSI boundary for temperature compensation. This is ugly
1630 /* these are tempature reference value (0x00 ~ 0xFE)
1631 ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
1632 TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) +
1633 TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */
1634 RT28xx_EEPROM_READ16(pAd, 0x6E, Power.word);
1635 pAd->TssiMinusBoundaryG[4] = Power.field.Byte0;
1636 pAd->TssiMinusBoundaryG[3] = Power.field.Byte1;
1637 RT28xx_EEPROM_READ16(pAd, 0x70, Power.word);
1638 pAd->TssiMinusBoundaryG[2] = Power.field.Byte0;
1639 pAd->TssiMinusBoundaryG[1] = Power.field.Byte1;
1640 RT28xx_EEPROM_READ16(pAd, 0x72, Power.word);
1641 pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */
1642 pAd->TssiPlusBoundaryG[1] = Power.field.Byte1;
1643 RT28xx_EEPROM_READ16(pAd, 0x74, Power.word);
1644 pAd->TssiPlusBoundaryG[2] = Power.field.Byte0;
1645 pAd->TssiPlusBoundaryG[3] = Power.field.Byte1;
1646 RT28xx_EEPROM_READ16(pAd, 0x76, Power.word);
1647 pAd->TssiPlusBoundaryG[4] = Power.field.Byte0;
1648 pAd->TxAgcStepG = Power.field.Byte1;
1649 pAd->TxAgcCompensateG = 0;
1650 pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;
1651 pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG;
1653 // Disable TxAgc if the based value is not right
1654 if (pAd->TssiRefG == 0xff)
1655 pAd->bAutoTxAgcG = FALSE;
1657 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
1658 pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1],
1660 pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],
1661 pAd->TxAgcStepG, pAd->bAutoTxAgcG));
1665 RT28xx_EEPROM_READ16(pAd, 0xD4, Power.word);
1666 pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;
1667 pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;
1668 RT28xx_EEPROM_READ16(pAd, 0xD6, Power.word);
1669 pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;
1670 pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;
1671 RT28xx_EEPROM_READ16(pAd, 0xD8, Power.word);
1672 pAd->TssiRefA = Power.field.Byte0;
1673 pAd->TssiPlusBoundaryA[1] = Power.field.Byte1;
1674 RT28xx_EEPROM_READ16(pAd, 0xDA, Power.word);
1675 pAd->TssiPlusBoundaryA[2] = Power.field.Byte0;
1676 pAd->TssiPlusBoundaryA[3] = Power.field.Byte1;
1677 RT28xx_EEPROM_READ16(pAd, 0xDC, Power.word);
1678 pAd->TssiPlusBoundaryA[4] = Power.field.Byte0;
1679 pAd->TxAgcStepA = Power.field.Byte1;
1680 pAd->TxAgcCompensateA = 0;
1681 pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;
1682 pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA;
1684 // Disable TxAgc if the based value is not right
1685 if (pAd->TssiRefA == 0xff)
1686 pAd->bAutoTxAgcA = FALSE;
1688 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
1689 pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1],
1691 pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2], pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],
1692 pAd->TxAgcStepA, pAd->bAutoTxAgcA));
1694 pAd->BbpRssiToDbmDelta = 0x0;
1696 // Read frequency offset setting for RF
1697 RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value);
1698 if ((value & 0x00FF) != 0x00FF)
1699 pAd->RfFreqOffset = (ULONG) (value & 0x00FF);
1701 pAd->RfFreqOffset = 0;
1702 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset));
1704 //CountryRegion byte offset (38h)
1705 value = pAd->EEPROMDefaultValue[2] >> 8; // 2.4G band
1706 value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; // 5G band
1708 if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND))
1710 pAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80;
1711 pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;
1712 TmpPhy = pAd->CommonCfg.PhyMode;
1713 pAd->CommonCfg.PhyMode = 0xff;
1714 RTMPSetPhyMode(pAd, TmpPhy);
1719 // Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.
1720 // The valid value are (-10 ~ 10)
1722 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value);
1723 pAd->BGRssiOffset0 = value & 0x00ff;
1724 pAd->BGRssiOffset1 = (value >> 8);
1725 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2, value);
1726 pAd->BGRssiOffset2 = value & 0x00ff;
1727 pAd->ALNAGain1 = (value >> 8);
1728 RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value);
1729 pAd->BLNAGain = value & 0x00ff;
1730 pAd->ALNAGain0 = (value >> 8);
1732 // Validate 11b/g RSSI_0 offset.
1733 if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10))
1734 pAd->BGRssiOffset0 = 0;
1736 // Validate 11b/g RSSI_1 offset.
1737 if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))
1738 pAd->BGRssiOffset1 = 0;
1740 // Validate 11b/g RSSI_2 offset.
1741 if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))
1742 pAd->BGRssiOffset2 = 0;
1744 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value);
1745 pAd->ARssiOffset0 = value & 0x00ff;
1746 pAd->ARssiOffset1 = (value >> 8);
1747 RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2), value);
1748 pAd->ARssiOffset2 = value & 0x00ff;
1749 pAd->ALNAGain2 = (value >> 8);
1751 if (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))
1752 pAd->ALNAGain1 = pAd->ALNAGain0;
1753 if (((UCHAR)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00))
1754 pAd->ALNAGain2 = pAd->ALNAGain0;
1756 // Validate 11a RSSI_0 offset.
1757 if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10))
1758 pAd->ARssiOffset0 = 0;
1760 // Validate 11a RSSI_1 offset.
1761 if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))
1762 pAd->ARssiOffset1 = 0;
1764 //Validate 11a RSSI_2 offset.
1765 if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))
1766 pAd->ARssiOffset2 = 0;
1771 RT28xx_EEPROM_READ16(pAd, 0x3a, value);
1772 pAd->LedCntl.word = (value&0xff00) >> 8;
1773 RT28xx_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET, value);
1775 RT28xx_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET, value);
1777 RT28xx_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET, value);
1780 RTMPReadTxPwrPerRate(pAd);
1785 eFusePhysicalReadRegisters(pAd, EFUSE_TAG, 2, &value);
1786 pAd->EFuseTag = (value & 0xff);
1790 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
1794 ========================================================================
1796 Routine Description:
1797 Set default value from EEPROM
1800 Adapter Pointer to our adapter
1805 IRQL = PASSIVE_LEVEL
1809 ========================================================================
1811 VOID NICInitAsicFromEEPROM(
1812 IN PRTMP_ADAPTER pAd)
1817 EEPROM_ANTENNA_STRUC Antenna;
1818 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1821 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitAsicFromEEPROM\n"));
1822 for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)
1824 UCHAR BbpRegIdx, BbpValue;
1826 if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))
1828 BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);
1829 BbpValue = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);
1830 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);
1835 Antenna.word = pAd->Antenna.word;
1838 Antenna.word = pAd->EEPROMDefaultValue[0];
1839 if (Antenna.word == 0xFFFF)
1841 DBGPRINT(RT_DEBUG_ERROR, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
1842 BUG_ON(Antenna.word == 0xFFFF);
1845 pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;
1846 pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;
1849 DBGPRINT(RT_DEBUG_WARN, ("pAd->RfIcType = %d, RealRxPath=%d, TxPath = %d\n", pAd->RfIcType, pAd->Mlme.RealRxPath,Antenna.field.TxPath));
1851 // Save the antenna for future use
1852 pAd->Antenna.word = Antenna.word;
1854 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1858 if ((NicConfig2.word & 0x00ff) == 0xff)
1860 NicConfig2.word &= 0xff00;
1863 if ((NicConfig2.word >> 8) == 0xff)
1865 NicConfig2.word &= 0x00ff;
1869 // Save the antenna for future use
1870 pAd->NicConfig2.word = NicConfig2.word;
1873 // set default antenna as main
1874 if (pAd->RfIcType == RFIC_3020)
1875 AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
1878 // Send LED Setting to MCU.
1880 if (pAd->LedCntl.word == 0xFF)
1882 pAd->LedCntl.word = 0x01;
1894 AsicSendCommandToMcu(pAd, 0x52, 0xff, (UCHAR)pAd->Led1, (UCHAR)(pAd->Led1 >> 8));
1895 AsicSendCommandToMcu(pAd, 0x53, 0xff, (UCHAR)pAd->Led2, (UCHAR)(pAd->Led2 >> 8));
1896 AsicSendCommandToMcu(pAd, 0x54, 0xff, (UCHAR)pAd->Led3, (UCHAR)(pAd->Led3 >> 8));
1897 pAd->LedIndicatorStregth = 0xFF;
1898 RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, before link up
1901 // Read Hardware controlled Radio state enable bit
1902 if (NicConfig2.field.HardwareRadioControl == 1)
1904 pAd->StaCfg.bHardwareRadio = TRUE;
1906 // Read GPIO pin2 as Hardware controlled radio state
1907 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
1908 if ((data & 0x04) == 0)
1910 pAd->StaCfg.bHwRadio = FALSE;
1911 pAd->StaCfg.bRadio = FALSE;
1912 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
1916 pAd->StaCfg.bHardwareRadio = FALSE;
1918 if (pAd->StaCfg.bRadio == FALSE)
1920 RTMPSetLED(pAd, LED_RADIO_OFF);
1924 RTMPSetLED(pAd, LED_RADIO_ON);
1926 AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);
1927 AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x00);
1928 // 2-1. wait command ok.
1929 AsicCheckCommanOk(pAd, PowerWakeCID);
1934 // Turn off patching for cardbus controller
1935 if (NicConfig2.field.CardbusAcceleration == 1)
1939 if (NicConfig2.field.DynamicTxAgcControl == 1)
1940 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1942 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1944 // Since BBP has been progamed, to make sure BBP setting will be
1945 // upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND!!
1947 pAd->CommonCfg.BandState = UNKNOWN_BAND;
1949 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
1951 if(pAd->Antenna.field.RxPath == 3)
1955 else if(pAd->Antenna.field.RxPath == 2)
1959 else if(pAd->Antenna.field.RxPath == 1)
1963 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
1966 // Handle the difference when 1T
1967 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
1968 if(pAd->Antenna.field.TxPath == 1)
1972 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
1974 DBGPRINT(RT_DEBUG_TRACE, ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n", pAd->CommonCfg.bHardwareRadio, pAd->CommonCfg.bHardwareRadio));
1977 DBGPRINT(RT_DEBUG_TRACE, ("TxPath = %d, RxPath = %d, RFIC=%d, Polar+LED mode=%x\n", pAd->Antenna.field.TxPath, pAd->Antenna.field.RxPath, pAd->RfIcType, pAd->LedCntl.word));
1978 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n"));
1982 ========================================================================
1984 Routine Description:
1985 Initialize NIC hardware
1988 Adapter Pointer to our adapter
1993 IRQL = PASSIVE_LEVEL
1997 ========================================================================
1999 NDIS_STATUS NICInitializeAdapter(
2000 IN PRTMP_ADAPTER pAd,
2001 IN BOOLEAN bHardReset)
2003 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
2004 WPDMA_GLO_CFG_STRUC GloCfg;
2007 DELAY_INT_CFG_STRUC IntCfg;
2010 AC_TXOP_CSR0_STRUC csr0;
2012 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n"));
2014 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
2019 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
2020 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
2023 RTMPusecDelay(1000);
2026 DBGPRINT(RT_DEBUG_TRACE, ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word));
2027 GloCfg.word &= 0xff0;
2028 GloCfg.field.EnTXWriteBackDDONE =1;
2029 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
2031 // Record HW Beacon offset
2032 pAd->BeaconOffset[0] = HW_BEACON_BASE0;
2033 pAd->BeaconOffset[1] = HW_BEACON_BASE1;
2034 pAd->BeaconOffset[2] = HW_BEACON_BASE2;
2035 pAd->BeaconOffset[3] = HW_BEACON_BASE3;
2036 pAd->BeaconOffset[4] = HW_BEACON_BASE4;
2037 pAd->BeaconOffset[5] = HW_BEACON_BASE5;
2038 pAd->BeaconOffset[6] = HW_BEACON_BASE6;
2039 pAd->BeaconOffset[7] = HW_BEACON_BASE7;
2042 // write all shared Ring's base address into ASIC
2045 // asic simulation sequence put this ahead before loading firmware.
2046 // pbf hardware reset
2048 RTMP_IO_WRITE32(pAd, WPDMA_RST_IDX, 0x1003f); // 0x10000 for reset rx, 0x3f resets all 6 tx rings.
2049 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe1f);
2050 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe00);
2053 // Initialze ASIC for TX & Rx operation
2054 if (NICInitializeAsic(pAd , bHardReset) != NDIS_STATUS_SUCCESS)
2058 NICLoadFirmware(pAd);
2061 return NDIS_STATUS_FAILURE;
2066 // Write AC_BK base address register
2067 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BK].Cell[0].AllocPa);
2068 RTMP_IO_WRITE32(pAd, TX_BASE_PTR1, Value);
2069 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR1 : 0x%x\n", Value));
2071 // Write AC_BE base address register
2072 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BE].Cell[0].AllocPa);
2073 RTMP_IO_WRITE32(pAd, TX_BASE_PTR0, Value);
2074 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR0 : 0x%x\n", Value));
2076 // Write AC_VI base address register
2077 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VI].Cell[0].AllocPa);
2078 RTMP_IO_WRITE32(pAd, TX_BASE_PTR2, Value);
2079 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR2 : 0x%x\n", Value));
2081 // Write AC_VO base address register
2082 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VO].Cell[0].AllocPa);
2083 RTMP_IO_WRITE32(pAd, TX_BASE_PTR3, Value);
2084 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR3 : 0x%x\n", Value));
2086 // Write HCCA base address register
2087 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_HCCA].Cell[0].AllocPa);
2088 RTMP_IO_WRITE32(pAd, TX_BASE_PTR4, Value);
2089 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR4 : 0x%x\n", Value));
2091 // Write MGMT_BASE_CSR register
2092 Value = RTMP_GetPhysicalAddressLow(pAd->MgmtRing.Cell[0].AllocPa);
2093 RTMP_IO_WRITE32(pAd, TX_BASE_PTR5, Value);
2094 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR5 : 0x%x\n", Value));
2096 // Write RX_BASE_CSR register
2097 Value = RTMP_GetPhysicalAddressLow(pAd->RxRing.Cell[0].AllocPa);
2098 RTMP_IO_WRITE32(pAd, RX_BASE_PTR, Value);
2099 DBGPRINT(RT_DEBUG_TRACE, ("--> RX_BASE_PTR : 0x%x\n", Value));
2101 // Init RX Ring index pointer
2102 pAd->RxRing.RxSwReadIdx = 0;
2103 pAd->RxRing.RxCpuIdx = RX_RING_SIZE-1;
2104 RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
2106 // Init TX rings index pointer
2108 for (i=0; i<NUM_OF_TX_RING; i++)
2110 pAd->TxRing[i].TxSwFreeIdx = 0;
2111 pAd->TxRing[i].TxCpuIdx = 0;
2112 RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10) , pAd->TxRing[i].TxCpuIdx);
2116 // init MGMT ring index pointer
2117 pAd->MgmtRing.TxSwFreeIdx = 0;
2118 pAd->MgmtRing.TxCpuIdx = 0;
2119 RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
2122 // set each Ring's SIZE into ASIC. Descriptor Size is fixed by design.
2125 // Write TX_RING_CSR0 register
2126 Value = TX_RING_SIZE;
2127 RTMP_IO_WRITE32(pAd, TX_MAX_CNT0, Value);
2128 RTMP_IO_WRITE32(pAd, TX_MAX_CNT1, Value);
2129 RTMP_IO_WRITE32(pAd, TX_MAX_CNT2, Value);
2130 RTMP_IO_WRITE32(pAd, TX_MAX_CNT3, Value);
2131 RTMP_IO_WRITE32(pAd, TX_MAX_CNT4, Value);
2132 Value = MGMT_RING_SIZE;
2133 RTMP_IO_WRITE32(pAd, TX_MGMTMAX_CNT, Value);
2135 // Write RX_RING_CSR register
2136 Value = RX_RING_SIZE;
2137 RTMP_IO_WRITE32(pAd, RX_MAX_CNT, Value);
2143 RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
2144 if (pAd->CommonCfg.PhyMode == PHY_11B)
2146 csr0.field.Ac0Txop = 192; // AC_VI: 192*32us ~= 6ms
2147 csr0.field.Ac1Txop = 96; // AC_VO: 96*32us ~= 3ms
2151 csr0.field.Ac0Txop = 96; // AC_VI: 96*32us ~= 3ms
2152 csr0.field.Ac1Txop = 48; // AC_VO: 48*32us ~= 1.5ms
2154 RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word);
2158 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
2162 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
2163 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
2166 RTMPusecDelay(1000);
2170 GloCfg.word &= 0xff0;
2171 GloCfg.field.EnTXWriteBackDDONE =1;
2172 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
2175 RTMP_IO_WRITE32(pAd, DELAY_INT_CFG, IntCfg.word);
2181 // Status = NICLoadFirmware(pAd);
2183 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n"));
2188 ========================================================================
2190 Routine Description:
2194 Adapter Pointer to our adapter
2199 IRQL = PASSIVE_LEVEL
2203 ========================================================================
2205 NDIS_STATUS NICInitializeAsic(
2206 IN PRTMP_ADAPTER pAd,
2207 IN BOOLEAN bHardReset)
2211 UINT32 MacCsr12 = 0, Counter = 0;
2223 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n"));
2226 if (bHardReset == TRUE)
2228 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
2231 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
2235 // Make sure MAC gets ready after NICLoadFirmware().
2239 //To avoid hang-on issue when interface up in kernel 2.4,
2240 //we use a local variable "MacCsr0" instead of using "pAd->MACVersion" directly.
2243 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
2245 if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
2249 } while (Index++ < 100);
2251 pAd->MACVersion = MacCsr0;
2252 DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
2253 // turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue.
2254 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacCsr12);
2255 MacCsr12 &= (~0x2000);
2256 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacCsr12);
2258 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
2259 RTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);
2260 Status = RTUSBVenderReset(pAd);
2263 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
2265 // Initialize MAC register to default value
2267 for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++)
2269 RTMP_IO_WRITE32(pAd, MACRegTable[Index].Register, MACRegTable[Index].Value);
2273 for(Index=0; Index<NUM_MAC_REG_PARMS; Index++)
2276 if ((MACRegTable[Index].Register == TX_SW_CFG0) && (IS_RT3070(pAd) || IS_RT3071(pAd)))
2278 MACRegTable[Index].Value = 0x00000400;
2281 RTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);
2287 // According to Frank Hsu (from Gary Tsao)
2288 RTMP_IO_WRITE32(pAd, (USHORT)TX_SW_CFG0, 0x00000400);
2290 // Initialize RT3070 serial MAC registers which is different from RT2870 serial
2291 RTUSBWriteMACRegister(pAd, TX_SW_CFG1, 0);
2292 RTUSBWriteMACRegister(pAd, TX_SW_CFG2, 0);
2299 for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
2302 RTMP_IO_WRITE32(pAd, STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
2305 RTMP_IO_WRITE32(pAd, (USHORT)STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
2310 // Initialize RT3070 serial MAc registers which is different from RT2870 serial
2313 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
2315 // RT3071 version E has fixed this issue
2316 if ((pAd->MACVersion & 0xffff) < 0x0211)
2318 if (pAd->NicConfig2.field.DACTestBit == 1)
2320 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x1F); // To fix throughput drop drastically
2324 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F); // To fix throughput drop drastically
2329 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);
2333 else if (IS_RT3070(pAd))
2335 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
2336 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x1F); // To fix throughput drop drastically
2341 // Before program BBP, we need to wait BBP/RF get wake up.
2346 RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);
2348 if ((MacCsr12 & 0x03) == 0) // if BB.RF is stable
2351 DBGPRINT(RT_DEBUG_TRACE, ("Check MAC_STATUS_CFG = Busy = %x\n", MacCsr12));
2352 RTMPusecDelay(1000);
2353 } while (Index++ < 100);
2355 // The commands to firmware should be after these commands, these commands will init firmware
2356 // PCI and USB are not the same because PCI driver needs to wait for PCI bus ready
2357 RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); // initialize BBP R/W access agent
2358 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);
2359 RTMPusecDelay(1000);
2361 // Read BBP register, make sure BBP is up and running before write new data
2365 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0);
2366 DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0));
2367 } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00)));
2368 //ASSERT(Index < 20); //this will cause BSOD on Check-build driver
2370 if ((R0 == 0xff) || (R0 == 0x00))
2371 return NDIS_STATUS_FAILURE;
2373 // Initialize BBP register to default value
2374 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
2376 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
2380 // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2381 if ((pAd->MACVersion&0xffff) != 0x0101)
2382 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
2385 //write RT3070 BBP wchich different with 2870 after write RT2870 BBP
2388 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0a);
2389 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x99);
2390 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, 0x05);
2395 // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2396 // RT3090 should not program BBP R84 to 0x19, otherwise TX will block.
2397 if (((pAd->MACVersion&0xffff) != 0x0101) && (!IS_RT30xx(pAd)))
2398 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
2400 // add by johnli, RF power sequence setup
2402 { //update for RT3070/71/72/90/91/92.
2403 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R79, 0x13);
2404 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R80, 0x05);
2405 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R81, 0x33);
2413 if ((pAd->MACVersion & 0xffff) >= 0x0211)
2415 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
2418 // improve power consumption
2419 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R138, &bbpreg);
2420 if (pAd->Antenna.field.TxPath == 1)
2422 // turn off tx DAC_1
2423 bbpreg = (bbpreg | 0x20);
2426 if (pAd->Antenna.field.RxPath == 1)
2428 // turn off tx ADC_1
2431 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R138, bbpreg);
2433 // improve power consumption in RT3071 Ver.E
2434 if ((pAd->MACVersion & 0xffff) >= 0x0211)
2436 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
2438 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
2442 if (pAd->MACVersion == 0x28600100)
2444 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2445 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
2448 if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) // 3*3
2450 // enlarge MAX_LEN_CFG
2452 RTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr);
2455 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr);
2460 UCHAR MAC_Value[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0};
2462 //Initialize WCID table
2464 for(Index =0 ;Index < 254;Index++)
2466 RTUSBMultiWrite(pAd, (USHORT)(MAC_WCID_BASE + Index * 8), MAC_Value, 8);
2471 // Add radio off control
2473 if (pAd->StaCfg.bRadio == FALSE)
2475 // RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);
2476 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
2477 DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n"));
2481 // Clear raw counters
2482 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
2483 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
2484 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
2485 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
2486 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
2487 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
2489 // ASIC will keep garbage value after boot
2490 // Clear all seared key table when initial
2491 // This routine can be ignored in radio-ON/OFF operation.
2494 for (KeyIdx = 0; KeyIdx < 4; KeyIdx++)
2496 RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0);
2499 // Clear all pairwise key table when initial
2500 for (KeyIdx = 0; KeyIdx < 256; KeyIdx++)
2502 RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
2507 // It isn't necessary to clear this space when not hard reset.
2508 if (bHardReset == TRUE)
2510 // clear all on-chip BEACON frame space
2511 for (apidx = 0; apidx < HW_BEACON_MAX_COUNT; apidx++)
2513 for (i = 0; i < HW_BEACON_OFFSET>>2; i+=4)
2514 RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[apidx] + i, 0x00);
2518 AsicDisableSync(pAd);
2519 // Clear raw counters
2520 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
2521 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
2522 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
2523 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
2524 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
2525 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
2526 // Default PCI clock cycle per ms is different as default setting, which is based on PCI.
2527 RTMP_IO_READ32(pAd, USB_CYC_CFG, &Counter);
2528 Counter&=0xffffff00;
2530 RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
2533 pAd->bUseEfuse=FALSE;
2534 RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrl);
2535 pAd->bUseEfuse = ( (eFuseCtrl & 0x80000000) == 0x80000000) ? 1 : 0;
2538 DBGPRINT(RT_DEBUG_TRACE, ("NVM is Efuse\n"));
2542 DBGPRINT(RT_DEBUG_TRACE, ("NVM is EEPROM\n"));
2548 // for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT.
2549 if ((pAd->MACVersion&0xffff) != 0x0101)
2550 RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f);
2553 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n"));
2554 return NDIS_STATUS_SUCCESS;
2559 VOID NICRestoreBBPValue(
2560 IN PRTMP_ADAPTER pAd)
2566 DBGPRINT(RT_DEBUG_TRACE, ("---> NICRestoreBBPValue !!!!!!!!!!!!!!!!!!!!!!! \n"));
2567 // Initialize BBP register to default value (rtmp_init.c)
2568 for (index = 0; index < NUM_BBP_REG_PARMS; index++)
2570 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[index].Register, BBPRegTable[index].Value);
2572 // copy from (rtmp_init.c)
2573 if (pAd->MACVersion == 0x28600100)
2575 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2576 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
2579 // copy from (connect.c LinkUp function)
2582 // Change to AP channel
2583 if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
2585 // Must using 40MHz.
2586 pAd->CommonCfg.BBPCurrentBW = BW_40;
2587 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2588 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2590 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2593 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2595 // RX : control channel at lower
2596 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2598 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2599 // Record BBPR3 setting, But don't keep R Antenna # information.
2600 pAd->StaCfg.BBPR3 = Value;
2602 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2604 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2606 if (pAd->MACVersion == 0x28600100)
2608 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
2609 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
2610 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
2611 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2614 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel ));
2616 else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
2618 // Must using 40MHz.
2619 pAd->CommonCfg.BBPCurrentBW = BW_40;
2620 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2621 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2623 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2626 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2628 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2630 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2632 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2634 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2635 // Record BBPR3 setting, But don't keep R Antenna # information.
2636 pAd->StaCfg.BBPR3 = Value;
2638 if (pAd->MACVersion == 0x28600100)
2640 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
2641 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
2642 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
2643 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2646 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel ));
2650 pAd->CommonCfg.BBPCurrentBW = BW_20;
2651 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2652 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2654 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2656 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2658 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2660 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2662 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2664 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2665 // Record BBPR3 setting, But don't keep R Antenna # information.
2666 pAd->StaCfg.BBPR3 = Value;
2668 if (pAd->MACVersion == 0x28600100)
2670 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2671 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
2672 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
2673 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2676 DBGPRINT(RT_DEBUG_TRACE, ("!!!20MHz LINK UP !!! \n" ));
2680 DBGPRINT(RT_DEBUG_TRACE, ("<--- NICRestoreBBPValue !!!!!!!!!!!!!!!!!!!!!!! \n"));
2685 ========================================================================
2687 Routine Description:
2691 Adapter Pointer to our adapter
2696 IRQL = PASSIVE_LEVEL
2699 Reset NIC to initial state AS IS system boot up time.
2701 ========================================================================
2704 IN PRTMP_ADAPTER pAd)
2707 DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n"));
2709 // Disable Rx, register value supposed will remain after reset
2710 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
2711 Value &= (0xfffffff3);
2712 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
2714 // Issue reset and clear from reset state
2715 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); // 2004-09-17 change from 0x01
2716 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);
2718 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n"));
2722 ========================================================================
2724 Routine Description:
2725 Check ASIC registers and find any reason the system might hang
2728 Adapter Pointer to our adapter
2733 IRQL = DISPATCH_LEVEL
2735 ========================================================================
2737 BOOLEAN NICCheckForHang(
2738 IN PRTMP_ADAPTER pAd)
2743 VOID NICUpdateFifoStaCounters(
2744 IN PRTMP_ADAPTER pAd)
2746 TX_STA_FIFO_STRUC StaFifo;
2747 MAC_TABLE_ENTRY *pEntry;
2749 UCHAR pid = 0, wcid = 0;
2755 RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);
2757 if (StaFifo.field.bValid == 0)
2760 wcid = (UCHAR)StaFifo.field.wcid;
2763 /* ignore NoACK and MGMT frame use 0xFF as WCID */
2764 if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE))
2770 /* PID store Tx MCS Rate */
2771 pid = (UCHAR)StaFifo.field.PidType;
2773 pEntry = &pAd->MacTab.Content[wcid];
2775 pEntry->DebugFIFOCount++;
2777 if (StaFifo.field.TxBF) // 3*3
2778 pEntry->TxBFCount++;
2780 #ifdef UAPSD_AP_SUPPORT
2781 UAPSD_SP_AUE_Handle(pAd, pEntry, StaFifo.field.TxSuccess);
2782 #endif // UAPSD_AP_SUPPORT //
2784 if (!StaFifo.field.TxSuccess)
2786 pEntry->FIFOCount++;
2787 pEntry->OneSecTxFailCount++;
2789 if (pEntry->FIFOCount >= 1)
2791 DBGPRINT(RT_DEBUG_TRACE, ("#"));
2792 pEntry->NoBADataCountDown = 64;
2794 if(pEntry->PsMode == PWR_ACTIVE)
2797 for (tid=0; tid<NUM_OF_TID; tid++)
2799 BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, FALSE);
2802 // Update the continuous transmission counter except PS mode
2803 pEntry->ContinueTxFailCnt++;
2807 // Clear the FIFOCount when sta in Power Save mode. Basically we assume
2808 // this tx error happened due to sta just go to sleep.
2809 pEntry->FIFOCount = 0;
2810 pEntry->ContinueTxFailCnt = 0;
2816 if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0))
2818 pEntry->NoBADataCountDown--;
2819 if (pEntry->NoBADataCountDown==0)
2821 DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
2825 pEntry->FIFOCount = 0;
2826 pEntry->OneSecTxNoRetryOkCount++;
2827 // update NoDataIdleCount when sucessful send packet to STA.
2828 pEntry->NoDataIdleCount = 0;
2829 pEntry->ContinueTxFailCnt = 0;
2832 succMCS = StaFifo.field.SuccessRate & 0x7F;
2834 reTry = pid - succMCS;
2836 if (StaFifo.field.TxSuccess)
2838 pEntry->TXMCSExpected[pid]++;
2841 pEntry->TXMCSSuccessful[pid]++;
2845 pEntry->TXMCSAutoFallBack[pid][succMCS]++;
2850 pEntry->TXMCSFailed[pid]++;
2855 if ((pid >= 12) && succMCS <=7)
2859 pEntry->OneSecTxRetryOkCount += reTry;
2863 // ASIC store 16 stack
2864 } while ( i < (2*TX_RING_SIZE) );
2869 ========================================================================
2871 Routine Description:
2872 Read statistical counters from hardware registers and record them
2873 in software variables for later on query
2876 pAd Pointer to our adapter
2881 IRQL = DISPATCH_LEVEL
2883 ========================================================================
2885 VOID NICUpdateRawCounters(
2886 IN PRTMP_ADAPTER pAd)
2889 RX_STA_CNT0_STRUC RxStaCnt0;
2890 RX_STA_CNT1_STRUC RxStaCnt1;
2891 RX_STA_CNT2_STRUC RxStaCnt2;
2892 TX_STA_CNT0_STRUC TxStaCnt0;
2893 TX_STA_CNT1_STRUC StaTx1;
2894 TX_STA_CNT2_STRUC StaTx2;
2895 TX_AGG_CNT_STRUC TxAggCnt;
2896 TX_AGG_CNT0_STRUC TxAggCnt0;
2897 TX_AGG_CNT1_STRUC TxAggCnt1;
2898 TX_AGG_CNT2_STRUC TxAggCnt2;
2899 TX_AGG_CNT3_STRUC TxAggCnt3;
2900 TX_AGG_CNT4_STRUC TxAggCnt4;
2901 TX_AGG_CNT5_STRUC TxAggCnt5;
2902 TX_AGG_CNT6_STRUC TxAggCnt6;
2903 TX_AGG_CNT7_STRUC TxAggCnt7;
2905 RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word);
2906 RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word);
2909 RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);
2910 // Update RX PLCP error counter
2911 pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr;
2912 // Update False CCA counter
2913 pAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca;
2916 // Update FCS counters
2917 OldValue= pAd->WlanCounters.FCSErrorCount.u.LowPart;
2918 pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); // >> 7);
2919 if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue)
2920 pAd->WlanCounters.FCSErrorCount.u.HighPart++;
2922 // Add FCS error count to private counters
2923 pAd->RalinkCounters.OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr;
2924 OldValue = pAd->RalinkCounters.RealFcsErrCount.u.LowPart;
2925 pAd->RalinkCounters.RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr;
2926 if (pAd->RalinkCounters.RealFcsErrCount.u.LowPart < OldValue)
2927 pAd->RalinkCounters.RealFcsErrCount.u.HighPart++;
2929 // Update Duplicate Rcv check
2930 pAd->RalinkCounters.DuplicateRcv += RxStaCnt2.field.RxDupliCount;
2931 pAd->WlanCounters.FrameDuplicateCount.u.LowPart += RxStaCnt2.field.RxDupliCount;
2932 // Update RX Overflow counter
2933 pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount);
2936 if (pAd->RalinkCounters.RxCount != pAd->watchDogRxCnt)
2938 pAd->watchDogRxCnt = pAd->RalinkCounters.RxCount;
2939 pAd->watchDogRxOverFlowCnt = 0;
2943 if (RxStaCnt2.field.RxFifoOverflowCount)
2944 pAd->watchDogRxOverFlowCnt++;
2946 pAd->watchDogRxOverFlowCnt = 0;
2951 if (!pAd->bUpdateBcnCntDone)
2953 // Update BEACON sent count
2954 RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
2955 RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
2956 RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
2957 pAd->RalinkCounters.OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount;
2958 pAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit;
2959 pAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess;
2960 pAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount;
2961 pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess;
2962 pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit;
2963 pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;
2967 RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);
2968 RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);
2969 RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);
2970 RTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);
2971 RTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);
2972 RTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word);
2973 RTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word);
2974 RTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word);
2975 RTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word);
2976 pAd->RalinkCounters.TxAggCount += TxAggCnt.field.AggTxCount;
2977 pAd->RalinkCounters.TxNonAggCount += TxAggCnt.field.NonAggTxCount;
2978 pAd->RalinkCounters.TxAgg1MPDUCount += TxAggCnt0.field.AggSize1Count;
2979 pAd->RalinkCounters.TxAgg2MPDUCount += TxAggCnt0.field.AggSize2Count;
2981 pAd->RalinkCounters.TxAgg3MPDUCount += TxAggCnt1.field.AggSize3Count;
2982 pAd->RalinkCounters.TxAgg4MPDUCount += TxAggCnt1.field.AggSize4Count;
2983 pAd->RalinkCounters.TxAgg5MPDUCount += TxAggCnt2.field.AggSize5Count;
2984 pAd->RalinkCounters.TxAgg6MPDUCount += TxAggCnt2.field.AggSize6Count;
2986 pAd->RalinkCounters.TxAgg7MPDUCount += TxAggCnt3.field.AggSize7Count;
2987 pAd->RalinkCounters.TxAgg8MPDUCount += TxAggCnt3.field.AggSize8Count;
2988 pAd->RalinkCounters.TxAgg9MPDUCount += TxAggCnt4.field.AggSize9Count;
2989 pAd->RalinkCounters.TxAgg10MPDUCount += TxAggCnt4.field.AggSize10Count;
2991 pAd->RalinkCounters.TxAgg11MPDUCount += TxAggCnt5.field.AggSize11Count;
2992 pAd->RalinkCounters.TxAgg12MPDUCount += TxAggCnt5.field.AggSize12Count;
2993 pAd->RalinkCounters.TxAgg13MPDUCount += TxAggCnt6.field.AggSize13Count;
2994 pAd->RalinkCounters.TxAgg14MPDUCount += TxAggCnt6.field.AggSize14Count;
2996 pAd->RalinkCounters.TxAgg15MPDUCount += TxAggCnt7.field.AggSize15Count;
2997 pAd->RalinkCounters.TxAgg16MPDUCount += TxAggCnt7.field.AggSize16Count;
2999 // Calculate the transmitted A-MPDU count
3000 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += TxAggCnt0.field.AggSize1Count;
3001 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt0.field.AggSize2Count / 2);
3003 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize3Count / 3);
3004 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize4Count / 4);
3006 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize5Count / 5);
3007 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize6Count / 6);
3009 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize7Count / 7);
3010 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize8Count / 8);
3012 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize9Count / 9);
3013 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize10Count / 10);
3015 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize11Count / 11);
3016 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize12Count / 12);
3018 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize13Count / 13);
3019 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize14Count / 14);
3021 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize15Count / 15);
3022 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count / 16);
3027 RtmpDiagStruct *pDiag;
3028 COUNTER_RALINK *pRalinkCounters;
3029 UCHAR ArrayCurIdx, i;
3031 pDiag = &pAd->DiagStruct;
3032 pRalinkCounters = &pAd->RalinkCounters;
3033 ArrayCurIdx = pDiag->ArrayCurIdx;
3035 if (pDiag->inited == 0)
3037 NdisZeroMemory(pDiag, sizeof(struct _RtmpDiagStrcut_));
3038 pDiag->ArrayStartIdx = pDiag->ArrayCurIdx = 0;
3044 pDiag->TxFailCnt[ArrayCurIdx] = TxStaCnt0.field.TxFailCount;
3045 pDiag->TxAggCnt[ArrayCurIdx] = TxAggCnt.field.AggTxCount;
3046 pDiag->TxNonAggCnt[ArrayCurIdx] = TxAggCnt.field.NonAggTxCount;
3047 pDiag->TxAMPDUCnt[ArrayCurIdx][0] = TxAggCnt0.field.AggSize1Count;
3048 pDiag->TxAMPDUCnt[ArrayCurIdx][1] = TxAggCnt0.field.AggSize2Count;
3049 pDiag->TxAMPDUCnt[ArrayCurIdx][2] = TxAggCnt1.field.AggSize3Count;
3050 pDiag->TxAMPDUCnt[ArrayCurIdx][3] = TxAggCnt1.field.AggSize4Count;
3051 pDiag->TxAMPDUCnt[ArrayCurIdx][4] = TxAggCnt2.field.AggSize5Count;
3052 pDiag->TxAMPDUCnt[ArrayCurIdx][5] = TxAggCnt2.field.AggSize6Count;
3053 pDiag->TxAMPDUCnt[ArrayCurIdx][6] = TxAggCnt3.field.AggSize7Count;
3054 pDiag->TxAMPDUCnt[ArrayCurIdx][7] = TxAggCnt3.field.AggSize8Count;
3055 pDiag->TxAMPDUCnt[ArrayCurIdx][8] = TxAggCnt4.field.AggSize9Count;
3056 pDiag->TxAMPDUCnt[ArrayCurIdx][9] = TxAggCnt4.field.AggSize10Count;
3057 pDiag->TxAMPDUCnt[ArrayCurIdx][10] = TxAggCnt5.field.AggSize11Count;
3058 pDiag->TxAMPDUCnt[ArrayCurIdx][11] = TxAggCnt5.field.AggSize12Count;
3059 pDiag->TxAMPDUCnt[ArrayCurIdx][12] = TxAggCnt6.field.AggSize13Count;
3060 pDiag->TxAMPDUCnt[ArrayCurIdx][13] = TxAggCnt6.field.AggSize14Count;
3061 pDiag->TxAMPDUCnt[ArrayCurIdx][14] = TxAggCnt7.field.AggSize15Count;
3062 pDiag->TxAMPDUCnt[ArrayCurIdx][15] = TxAggCnt7.field.AggSize16Count;
3064 pDiag->RxCrcErrCnt[ArrayCurIdx] = RxStaCnt0.field.CrcErr;
3066 INC_RING_INDEX(pDiag->ArrayCurIdx, DIAGNOSE_TIME);
3067 ArrayCurIdx = pDiag->ArrayCurIdx;
3068 for (i =0; i < 9; i++)
3070 pDiag->TxDescCnt[ArrayCurIdx][i]= 0;
3071 pDiag->TxSWQueCnt[ArrayCurIdx][i] =0;
3072 pDiag->TxMcsCnt[ArrayCurIdx][i] = 0;
3073 pDiag->RxMcsCnt[ArrayCurIdx][i] = 0;
3075 pDiag->TxDataCnt[ArrayCurIdx] = 0;
3076 pDiag->TxFailCnt[ArrayCurIdx] = 0;
3077 pDiag->RxDataCnt[ArrayCurIdx] = 0;
3078 pDiag->RxCrcErrCnt[ArrayCurIdx] = 0;
3079 for (i = 9; i < 24; i++) // 3*3
3081 pDiag->TxDescCnt[ArrayCurIdx][i] = 0;
3082 pDiag->TxMcsCnt[ArrayCurIdx][i] = 0;
3083 pDiag->RxMcsCnt[ArrayCurIdx][i] = 0;
3086 if (pDiag->ArrayCurIdx == pDiag->ArrayStartIdx)
3087 INC_RING_INDEX(pDiag->ArrayStartIdx, DIAGNOSE_TIME);
3091 #endif // DBG_DIAGNOSE //
3098 ========================================================================
3100 Routine Description:
3101 Reset NIC from error
3104 Adapter Pointer to our adapter
3109 IRQL = PASSIVE_LEVEL
3112 Reset NIC from error state
3114 ========================================================================
3116 VOID NICResetFromError(
3117 IN PRTMP_ADAPTER pAd)
3119 // Reset BBP (according to alex, reset ASIC will force reset BBP
3120 // Therefore, skip the reset BBP
3121 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x2);
3123 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
3124 // Remove ASIC from reset state
3125 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
3127 NICInitializeAdapter(pAd, FALSE);
3128 NICInitAsicFromEEPROM(pAd);
3130 // Switch to current channel, since during reset process, the connection should remains on.
3131 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
3132 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
3136 ========================================================================
3138 Routine Description:
3139 erase 8051 firmware image in MAC ASIC
3142 Adapter Pointer to our adapter
3144 IRQL = PASSIVE_LEVEL
3146 ========================================================================
3148 VOID NICEraseFirmware(
3149 IN PRTMP_ADAPTER pAd)
3153 for(i=0; i<MAX_FIRMWARE_IMAGE_SIZE; i+=4)
3154 RTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, 0);
3156 }/* End of NICEraseFirmware */
3159 ========================================================================
3161 Routine Description:
3162 Load 8051 firmware RT2561.BIN file into MAC ASIC
3165 Adapter Pointer to our adapter
3168 NDIS_STATUS_SUCCESS firmware image load ok
3169 NDIS_STATUS_FAILURE image not found
3171 IRQL = PASSIVE_LEVEL
3173 ========================================================================
3175 NDIS_STATUS NICLoadFirmware(
3176 IN PRTMP_ADAPTER pAd)
3178 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
3179 PUCHAR pFirmwareImage;
3180 ULONG FileLength, Index;
3184 UINT32 Version = (pAd->MACVersion >> 16);
3187 pFirmwareImage = FirmwareImage;
3188 FileLength = sizeof(FirmwareImage);
3190 // New 8k byte firmware size for RT3071/RT3072
3191 //printk("Usb Chip\n");
3192 if (FIRMWAREIMAGE_LENGTH == FIRMWAREIMAGE_MAX_LENGTH)
3193 //The firmware image consists of two parts. One is the origianl and the other is the new.
3196 if ((Version != 0x2860) && (Version != 0x2872) && (Version != 0x3070))
3197 { // Use Firmware V2.
3198 //printk("KH:Use New Version,part2\n");
3199 pFirmwareImage = (PUCHAR)&FirmwareImage[FIRMWAREIMAGEV1_LENGTH];
3200 FileLength = FIRMWAREIMAGEV2_LENGTH;
3204 //printk("KH:Use New Version,part1\n");
3205 pFirmwareImage = FirmwareImage;
3206 FileLength = FIRMWAREIMAGEV1_LENGTH;
3211 DBGPRINT(RT_DEBUG_ERROR, ("KH: bin file should be 8KB.\n"));
3212 Status = NDIS_STATUS_FAILURE;
3217 RT28XX_WRITE_FIRMWARE(pAd, pFirmwareImage, FileLength);
3219 /* check if MCU is ready */
3223 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg);
3228 RTMPusecDelay(1000);
3229 } while (Index++ < 1000);
3233 Status = NDIS_STATUS_FAILURE;
3234 DBGPRINT(RT_DEBUG_ERROR, ("NICLoadFirmware: MCU is not ready\n\n\n"));
3237 DBGPRINT(RT_DEBUG_TRACE,
3238 ("<=== %s (status=%d)\n", __func__, Status));
3240 } /* End of NICLoadFirmware */
3244 ========================================================================
3246 Routine Description:
3247 Load Tx rate switching parameters
3250 Adapter Pointer to our adapter
3253 NDIS_STATUS_SUCCESS firmware image load ok
3254 NDIS_STATUS_FAILURE image not found
3256 IRQL = PASSIVE_LEVEL
3259 1. (B0: Valid Item number) (B1:Initial item from zero)
3260 2. Item Number(Dec) Mode(Hex) Current MCS(Dec) TrainUp(Dec) TrainDown(Dec)
3262 ========================================================================
3264 NDIS_STATUS NICLoadRateSwitchingParams(
3265 IN PRTMP_ADAPTER pAd)
3267 return NDIS_STATUS_SUCCESS;
3271 ========================================================================
3273 Routine Description:
3274 if pSrc1 all zero with length Length, return 0.
3275 If not all zero, return 1
3284 IRQL = DISPATCH_LEVEL
3288 ========================================================================
3290 ULONG RTMPNotAllZero(
3297 pMem1 = (PUCHAR) pSrc1;
3299 for (Index = 0; Index < Length; Index++)
3301 if (pMem1[Index] != 0x0)
3307 if (Index == Length)
3318 ========================================================================
3320 Routine Description:
3321 Compare two memory block
3324 pSrc1 Pointer to first memory address
3325 pSrc2 Pointer to second memory address
3329 1: pSrc1 memory is larger
3330 2: pSrc2 memory is larger
3332 IRQL = DISPATCH_LEVEL
3336 ========================================================================
3338 ULONG RTMPCompareMemory(
3347 pMem1 = (PUCHAR) pSrc1;
3348 pMem2 = (PUCHAR) pSrc2;
3350 for (Index = 0; Index < Length; Index++)
3352 if (pMem1[Index] > pMem2[Index])
3354 else if (pMem1[Index] < pMem2[Index])
3363 ========================================================================
3365 Routine Description:
3366 Zero out memory block
3369 pSrc1 Pointer to memory address
3375 IRQL = PASSIVE_LEVEL
3376 IRQL = DISPATCH_LEVEL
3380 ========================================================================
3382 VOID RTMPZeroMemory(
3389 pMem = (PUCHAR) pSrc;
3391 for (Index = 0; Index < Length; Index++)
3397 VOID RTMPFillMemory(
3405 pMem = (PUCHAR) pSrc;
3407 for (Index = 0; Index < Length; Index++)
3414 ========================================================================
3416 Routine Description:
3417 Copy data from memory block 1 to memory block 2
3420 pDest Pointer to destination memory address
3421 pSrc Pointer to source memory address
3427 IRQL = PASSIVE_LEVEL
3428 IRQL = DISPATCH_LEVEL
3432 ========================================================================
3434 VOID RTMPMoveMemory(
3443 ASSERT((Length==0) || (pDest && pSrc));
3445 pMem1 = (PUCHAR) pDest;
3446 pMem2 = (PUCHAR) pSrc;
3448 for (Index = 0; Index < Length; Index++)
3450 pMem1[Index] = pMem2[Index];
3455 ========================================================================
3457 Routine Description:
3458 Initialize port configuration structure
3461 Adapter Pointer to our adapter
3466 IRQL = PASSIVE_LEVEL
3470 ========================================================================
3473 IN PRTMP_ADAPTER pAd)
3475 UINT key_index, bss_index;
3477 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit\n"));
3480 // part I. intialize common configuration
3483 pAd->BulkOutReq = 0;
3485 pAd->BulkOutComplete = 0;
3486 pAd->BulkOutCompleteOther = 0;
3487 pAd->BulkOutCompleteCancel = 0;
3489 pAd->BulkInComplete = 0;
3490 pAd->BulkInCompleteFail = 0;
3492 //pAd->QuickTimerP = 100;
3493 //pAd->TurnAggrBulkInCount = 0;
3494 pAd->bUsbTxBulkAggre = 0;
3496 // init as unsed value to ensure driver will set to MCU once.
3497 pAd->LedIndicatorStregth = 0xFF;
3499 pAd->CommonCfg.MaxPktOneTxBulk = 2;
3500 pAd->CommonCfg.TxBulkFactor = 1;
3501 pAd->CommonCfg.RxBulkFactor =1;
3503 pAd->CommonCfg.TxPower = 100; //mW
3505 NdisZeroMemory(&pAd->CommonCfg.IOTestParm, sizeof(pAd->CommonCfg.IOTestParm));
3508 for(key_index=0; key_index<SHARE_KEY_NUM; key_index++)
3510 for(bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++)
3512 pAd->SharedKey[bss_index][key_index].KeyLen = 0;
3513 pAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE;
3518 pAd->EepromAccess = FALSE;
3520 pAd->Antenna.word = 0;
3521 pAd->CommonCfg.BBPCurrentBW = BW_20;
3523 pAd->LedCntl.word = 0;
3525 pAd->LedIndicatorStregth = 0;
3526 pAd->RLnkCtrlOffset = 0;
3527 pAd->HostLnkCtrlOffset = 0;
3528 pAd->CheckDmaBusyCount = 0;
3531 pAd->bAutoTxAgcA = FALSE; // Default is OFF
3532 pAd->bAutoTxAgcG = FALSE; // Default is OFF
3533 pAd->RfIcType = RFIC_2820;
3535 // Init timer for reset complete event
3536 pAd->CommonCfg.CentralChannel = 1;
3537 pAd->bForcePrintTX = FALSE;
3538 pAd->bForcePrintRX = FALSE;
3539 pAd->bStaFifoTest = FALSE;
3540 pAd->bProtectionTest = FALSE;
3541 pAd->bHCCATest = FALSE;
3542 pAd->bGenOneHCCA = FALSE;
3543 pAd->CommonCfg.Dsifs = 10; // in units of usec
3544 pAd->CommonCfg.TxPower = 100; //mW
3545 pAd->CommonCfg.TxPowerPercentage = 0xffffffff; // AUTO
3546 pAd->CommonCfg.TxPowerDefault = 0xffffffff; // AUTO
3547 pAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; // use Long preamble on TX by defaut
3548 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
3549 pAd->CommonCfg.RtsThreshold = 2347;
3550 pAd->CommonCfg.FragmentThreshold = 2346;
3551 pAd->CommonCfg.UseBGProtection = 0; // 0: AUTO
3552 pAd->CommonCfg.bEnableTxBurst = TRUE; //0;
3553 pAd->CommonCfg.PhyMode = 0xff; // unknown
3554 pAd->CommonCfg.BandState = UNKNOWN_BAND;
3555 pAd->CommonCfg.RadarDetect.CSPeriod = 10;
3556 pAd->CommonCfg.RadarDetect.CSCount = 0;
3557 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
3558 pAd->CommonCfg.RadarDetect.ChMovingTime = 65;
3559 pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 3;
3560 pAd->CommonCfg.bAPSDCapable = FALSE;
3561 pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
3562 pAd->CommonCfg.TriggerTimerCount = 0;
3563 pAd->CommonCfg.bAPSDForcePowerSave = FALSE;
3564 pAd->CommonCfg.bCountryFlag = FALSE;
3565 pAd->CommonCfg.TxStream = 0;
3566 pAd->CommonCfg.RxStream = 0;
3568 NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI));
3570 NdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
3571 pAd->HTCEnable = FALSE;
3572 pAd->bBroadComHT = FALSE;
3573 pAd->CommonCfg.bRdg = FALSE;
3575 NdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
3576 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
3577 pAd->CommonCfg.BACapability.field.MpduDensity = 0;
3578 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
3579 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; //32;
3580 pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; //32;
3581 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit. BACapability = 0x%x\n", pAd->CommonCfg.BACapability.word));
3583 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
3584 BATableInit(pAd, &pAd->BATable);
3586 pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
3587 pAd->CommonCfg.bHTProtect = 1;
3588 pAd->CommonCfg.bMIMOPSEnable = TRUE;
3589 pAd->CommonCfg.bBADecline = FALSE;
3590 pAd->CommonCfg.bDisableReordering = FALSE;
3592 pAd->CommonCfg.TxBASize = 7;
3594 pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
3596 //pAd->CommonCfg.HTPhyMode.field.BW = BW_20;
3597 //pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO;
3598 //pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800;
3599 //pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE;
3600 pAd->CommonCfg.TxRate = RATE_6;
3602 pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;
3603 pAd->CommonCfg.MlmeTransmit.field.BW = BW_20;
3604 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
3606 pAd->CommonCfg.BeaconPeriod = 100; // in mSec
3609 // part II. intialize STA specific configuration
3612 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT);
3613 RX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST);
3614 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);
3615 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);
3617 pAd->StaCfg.Psm = PWR_ACTIVE;
3619 pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled;
3620 pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;
3621 pAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled;
3622 pAd->StaCfg.bMixCipher = FALSE;
3623 pAd->StaCfg.DefaultKeyId = 0;
3625 // 802.1x port control
3626 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
3627 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
3628 pAd->StaCfg.LastMicErrorTime = 0;
3629 pAd->StaCfg.MicErrCnt = 0;
3630 pAd->StaCfg.bBlockAssoc = FALSE;
3631 pAd->StaCfg.WpaState = SS_NOTUSE;
3633 pAd->CommonCfg.NdisRadioStateOff = FALSE; // New to support microsoft disable radio with OID command
3635 pAd->StaCfg.RssiTrigger = 0;
3636 NdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(RSSI_SAMPLE));
3637 pAd->StaCfg.RssiTriggerMode = RSSI_TRIGGERED_UPON_BELOW_THRESHOLD;
3638 pAd->StaCfg.AtimWin = 0;
3639 pAd->StaCfg.DefaultListenCount = 3;//default listen count;
3640 pAd->StaCfg.BssType = BSS_INFRA; // BSS_INFRA or BSS_ADHOC or BSS_MONITOR
3641 pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
3642 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
3643 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
3645 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
3646 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
3649 // global variables mXXXX used in MAC protocol state machines
3650 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
3651 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
3652 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
3654 // PHY specification
3655 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; // default PHY mode
3656 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); // CCK use LONG preamble
3659 // user desired power mode
3660 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
3661 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
3662 pAd->StaCfg.bWindowsACCAMEnable = FALSE;
3664 RTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer, GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec), pAd, FALSE);
3665 pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
3668 pAd->StaCfg.ScanCnt = 0;
3670 // CCX 2.0 control flag init
3671 pAd->StaCfg.CCXEnable = FALSE;
3672 pAd->StaCfg.CCXReqType = MSRN_TYPE_UNUSED;
3673 pAd->StaCfg.CCXQosECWMin = 4;
3674 pAd->StaCfg.CCXQosECWMax = 10;
3676 pAd->StaCfg.bHwRadio = TRUE; // Default Hardware Radio status is On
3677 pAd->StaCfg.bSwRadio = TRUE; // Default Software Radio status is On
3678 pAd->StaCfg.bRadio = TRUE; // bHwRadio && bSwRadio
3679 pAd->StaCfg.bHardwareRadio = FALSE; // Default is OFF
3680 pAd->StaCfg.bShowHiddenSSID = FALSE; // Default no show
3682 // Nitro mode control
3683 pAd->StaCfg.bAutoReconnect = TRUE;
3685 // Save the init time as last scan time, the system should do scan after 2 seconds.
3686 // This patch is for driver wake up from standby mode, system will do scan right away.
3687 pAd->StaCfg.LastScanTime = 0;
3688 NdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE+1);
3689 sprintf(pAd->nickname, "%s", STA_NIC_DEVICE_NAME);
3690 RTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer, GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc), pAd, FALSE);
3691 pAd->StaCfg.IEEE8021X = FALSE;
3692 pAd->StaCfg.IEEE8021x_required_keys = FALSE;
3693 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
3694 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
3697 // Default for extra information is not valid
3698 pAd->ExtraInfo = EXTRA_INFO_CLEAR;
3700 // Default Config change flag
3701 pAd->bConfigChanged = FALSE;
3704 // part III. AP configurations
3711 // dynamic BBP R66:sensibity tuning to overcome background noise
3712 pAd->BbpTuning.bEnable = TRUE;
3713 pAd->BbpTuning.FalseCcaLowerThreshold = 100;
3714 pAd->BbpTuning.FalseCcaUpperThreshold = 512;
3715 pAd->BbpTuning.R66Delta = 4;
3716 pAd->Mlme.bEnableAutoAntennaCheck = TRUE;
3719 // Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value.
3720 // if not initial this value, the default value will be 0.
3722 pAd->BbpTuning.R66CurrentValue = 0x38;
3724 pAd->Bbp94 = BBPR94_DEFAULT;
3725 pAd->BbpForCCK = FALSE;
3727 // initialize MAC table and allocate spin lock
3728 NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));
3729 InitializeQueueHeader(&pAd->MacTab.McastPsQueue);
3730 NdisAllocateSpinLock(&pAd->MacTabLock);
3732 pAd->CommonCfg.bWiFiTest = FALSE;
3734 pAd->bPCIclkOff = FALSE;
3736 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
3738 DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
3741 // IRQL = PASSIVE_LEVEL
3744 if (ch >= '0' && ch <= '9') return (ch - '0'); // Handle numerals
3745 if (ch >= 'A' && ch <= 'F') return (ch - 'A' + 0xA); // Handle capitol hex digits
3746 if (ch >= 'a' && ch <= 'f') return (ch - 'a' + 0xA); // Handle small hex digits
3751 // FUNCTION: AtoH(char *, UCHAR *, int)
3753 // PURPOSE: Converts ascii string to network order hex
3756 // src - pointer to input ascii string
3757 // dest - pointer to output hex
3758 // destlen - size of dest
3762 // 2 ascii bytes make a hex byte so must put 1st ascii byte of pair
3763 // into upper nibble and 2nd ascii byte of pair into lower nibble.
3765 // IRQL = PASSIVE_LEVEL
3767 void AtoH(char * src, UCHAR * dest, int destlen)
3773 destTemp = (PUCHAR) dest;
3777 *destTemp = BtoH(*srcptr++) << 4; // Put 1st ascii byte in upper nibble.
3778 *destTemp += BtoH(*srcptr++); // Add 2nd ascii byte to above.
3783 VOID RTMPPatchMacBbpBug(
3784 IN PRTMP_ADAPTER pAd)
3788 // Initialize BBP register to default value
3789 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
3791 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, (UCHAR)BBPRegTable[Index].Value);
3794 // Initialize RF register to default value
3795 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
3796 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
3798 // Re-init BBP register from EEPROM value
3799 NICInitAsicFromEEPROM(pAd);
3803 ========================================================================
3805 Routine Description:
3809 pAd Pointer to our adapter
3810 pTimer Timer structure
3811 pTimerFunc Function to execute when timer expired
3812 Repeat Ture for period timer
3819 ========================================================================
3822 IN PRTMP_ADAPTER pAd,
3823 IN PRALINK_TIMER_STRUCT pTimer,
3824 IN PVOID pTimerFunc,
3829 // Set Valid to TRUE for later used.
3830 // It will crash if we cancel a timer or set a timer
3831 // that we haven't initialize before.
3833 pTimer->Valid = TRUE;
3835 pTimer->PeriodicType = Repeat;
3836 pTimer->State = FALSE;
3837 pTimer->cookie = (ULONG) pData;
3843 RTMP_OS_Init_Timer(pAd, &pTimer->TimerObj, pTimerFunc, (PVOID) pTimer);
3847 ========================================================================
3849 Routine Description:
3853 pTimer Timer structure
3854 Value Timer value in milliseconds
3860 To use this routine, must call RTMPInitTimer before.
3862 ========================================================================
3865 IN PRALINK_TIMER_STRUCT pTimer,
3870 pTimer->TimerValue = Value;
3871 pTimer->State = FALSE;
3872 if (pTimer->PeriodicType == TRUE)
3874 pTimer->Repeat = TRUE;
3875 RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);
3879 pTimer->Repeat = FALSE;
3880 RTMP_OS_Add_Timer(&pTimer->TimerObj, Value);
3885 DBGPRINT_ERR(("RTMPSetTimer failed, Timer hasn't been initialize!\n"));
3891 ========================================================================
3893 Routine Description:
3897 pTimer Timer structure
3898 Value Timer value in milliseconds
3904 To use this routine, must call RTMPInitTimer before.
3906 ========================================================================
3909 IN PRALINK_TIMER_STRUCT pTimer,
3916 pTimer->TimerValue = Value;
3917 pTimer->State = FALSE;
3918 if (pTimer->PeriodicType == TRUE)
3920 RTMPCancelTimer(pTimer, &Cancel);
3921 RTMPSetTimer(pTimer, Value);
3925 RTMP_OS_Mod_Timer(&pTimer->TimerObj, Value);
3930 DBGPRINT_ERR(("RTMPModTimer failed, Timer hasn't been initialize!\n"));
3935 ========================================================================
3937 Routine Description:
3938 Cancel timer objects
3941 Adapter Pointer to our adapter
3946 IRQL = PASSIVE_LEVEL
3947 IRQL = DISPATCH_LEVEL
3950 1.) To use this routine, must call RTMPInitTimer before.
3951 2.) Reset NIC to initial state AS IS system boot up time.
3953 ========================================================================
3955 VOID RTMPCancelTimer(
3956 IN PRALINK_TIMER_STRUCT pTimer,
3957 OUT BOOLEAN *pCancelled)
3961 if (pTimer->State == FALSE)
3962 pTimer->Repeat = FALSE;
3963 RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);
3965 if (*pCancelled == TRUE)
3966 pTimer->State = TRUE;
3969 // We need to go-through the TimerQ to findout this timer handler and remove it if
3970 // it's still waiting for execution.
3972 RT2870_TimerQ_Remove(pTimer->pAd, pTimer);
3978 // NdisMCancelTimer just canced the timer and not mean release the timer.
3979 // And don't set the "Valid" to False. So that we can use this timer again.
3981 DBGPRINT_ERR(("RTMPCancelTimer failed, Timer hasn't been initialize!\n"));
3986 ========================================================================
3988 Routine Description:
3992 pAd Pointer to our adapter
3998 IRQL = PASSIVE_LEVEL
3999 IRQL = DISPATCH_LEVEL
4003 ========================================================================
4006 IN PRTMP_ADAPTER pAd,
4013 LowByte = pAd->LedCntl.field.LedMode&0x7f;
4018 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4019 pAd->LedIndicatorStregth = 0;
4022 if (pAd->CommonCfg.Channel > 14)
4026 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4030 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4033 LowByte = 0; // Driver sets MAC register and MAC controls LED
4036 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4040 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4042 case LED_ON_SITE_SURVEY:
4044 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4048 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4051 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetLED::Unknown Status %d\n", Status));
4056 // Keep LED status for LED SiteSurvey mode.
4057 // After SiteSurvey, we will set the LED mode to previous status.
4059 if ((Status != LED_ON_SITE_SURVEY) && (Status != LED_POWER_UP))
4060 pAd->LedStatus = Status;
4062 DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetLED::Mode=%d,HighByte=0x%02x,LowByte=0x%02x\n", pAd->LedCntl.field.LedMode, HighByte, LowByte));
4066 ========================================================================
4068 Routine Description:
4069 Set LED Signal Stregth
4072 pAd Pointer to our adapter
4078 IRQL = PASSIVE_LEVEL
4081 Can be run on any IRQL level.
4083 According to Microsoft Zero Config Wireless Signal Stregth definition as belows.
4090 ========================================================================
4092 VOID RTMPSetSignalLED(
4093 IN PRTMP_ADAPTER pAd,
4094 IN NDIS_802_11_RSSI Dbm)
4099 // if not Signal Stregth, then do nothing.
4101 if (pAd->LedCntl.field.LedMode != LED_MODE_SIGNAL_STREGTH)
4108 else if (Dbm <= -81)
4110 else if (Dbm <= -71)
4112 else if (Dbm <= -67)
4114 else if (Dbm <= -57)
4120 // Update Signal Stregth to firmware if changed.
4122 if (pAd->LedIndicatorStregth != nLed)
4124 AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed, pAd->LedCntl.field.Polarity);
4125 pAd->LedIndicatorStregth = nLed;
4130 ========================================================================
4132 Routine Description:
4136 pAd Pointer to our adapter
4141 IRQL <= DISPATCH_LEVEL
4144 Before Enable RX, make sure you have enabled Interrupt.
4145 ========================================================================
4147 VOID RTMPEnableRxTx(
4148 IN PRTMP_ADAPTER pAd)
4150 DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n"));
4153 RT28XXDMAEnable(pAd);
4155 // enable RX of MAC block
4156 if (pAd->OpMode == OPMODE_AP)
4158 UINT32 rx_filter_flag = APNORMAL;
4161 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); // enable RX of DMA block
4165 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL); // Staion not drop control frame will fail WiFi Certification.
4168 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);
4169 DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPEnableRxTx\n"));