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 ========================================================================
1103 VOID RTUSBFilterCalibration(
1104 IN PRTMP_ADAPTER pAd)
1106 UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue;
1107 UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0;
1108 UCHAR RF_R24_Value = 0;
1110 // Give bbp filter initial value
1111 pAd->Mlme.CaliBW20RfR24 = 0x16;
1112 pAd->Mlme.CaliBW40RfR24 = 0x36; //Bit[5] must be 1 for BW 40
1116 if (loop == 1) //BandWidth = 40 MHz
1118 // Write 0x27 to RF_R24 to program filter
1119 RF_R24_Value = 0x27;
1120 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1121 FilterTarget = 0x19;
1123 // when calibrate BW40, BBP mask must set to BW40.
1124 RTUSBReadBBPRegister(pAd, BBP_R4, &BBPValue);
1127 RTUSBWriteBBPRegister(pAd, BBP_R4, BBPValue);
1129 else //BandWidth = 20 MHz
1131 // Write 0x07 to RF_R24 to program filter
1132 RF_R24_Value = 0x07;
1133 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1134 FilterTarget = 0x16;
1137 // Write 0x01 to RF_R22 to enable baseband loopback mode
1138 RT30xxReadRFRegister(pAd, RF_R22, &value);
1140 RT30xxWriteRFRegister(pAd, RF_R22, value);
1142 // Write 0x00 to BBP_R24 to set power & frequency of passband test tone
1143 RTUSBWriteBBPRegister(pAd, BBP_R24, 0);
1147 // Write 0x90 to BBP_R25 to transmit test tone
1148 RTUSBWriteBBPRegister(pAd, BBP_R25, 0x90);
1150 RTMPusecDelay(1000);
1151 // Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0]
1152 RTUSBReadBBPRegister(pAd, BBP_R55, &value);
1153 R55x = value & 0xFF;
1155 } while ((ReTry++ < 100) && (R55x == 0));
1157 // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
1158 RTUSBWriteBBPRegister(pAd, BBP_R24, 0x06);
1162 // Write 0x90 to BBP_R25 to transmit test tone
1163 RTUSBWriteBBPRegister(pAd, BBP_R25, 0x90);
1165 //We need to wait for calibration
1166 RTMPusecDelay(1000);
1167 RTUSBReadBBPRegister(pAd, BBP_R55, &value);
1169 if ((R55x - value) < FilterTarget)
1173 else if ((R55x - value) == FilterTarget)
1183 // prevent infinite loop cause driver hang.
1184 if (loopcnt++ > 100)
1186 DBGPRINT(RT_DEBUG_ERROR, ("RTUSBFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt));
1190 // Write RF_R24 to program filter
1191 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1196 RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));
1199 // Store for future usage
1204 //BandWidth = 20 MHz
1205 pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value;
1209 //BandWidth = 40 MHz
1210 pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value;
1217 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1224 // Set back to initial state
1226 RTUSBWriteBBPRegister(pAd, BBP_R24, 0);
1228 RT30xxReadRFRegister(pAd, RF_R22, &value);
1230 RT30xxWriteRFRegister(pAd, RF_R22, value);
1232 // set BBP back to BW20
1233 RTUSBReadBBPRegister(pAd, BBP_R4, &BBPValue);
1235 RTUSBWriteBBPRegister(pAd, BBP_R4, BBPValue);
1237 DBGPRINT(RT_DEBUG_TRACE, ("RTUSBFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
1241 VOID RTMPFilterCalibration(
1242 IN PRTMP_ADAPTER pAd)
1244 UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue=0;
1245 UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0;
1246 UCHAR RF_R24_Value = 0;
1248 // Give bbp filter initial value
1249 pAd->Mlme.CaliBW20RfR24 = 0x1F;
1250 pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40
1254 if (loop == 1) //BandWidth = 40 MHz
1256 // Write 0x27 to RF_R24 to program filter
1257 RF_R24_Value = 0x27;
1258 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1260 FilterTarget = 0x15;
1262 FilterTarget = 0x19;
1264 // when calibrate BW40, BBP mask must set to BW40.
1265 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1268 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1271 RT30xxReadRFRegister(pAd, RF_R31, &value);
1273 RT30xxWriteRFRegister(pAd, RF_R31, value);
1275 else //BandWidth = 20 MHz
1277 // Write 0x07 to RF_R24 to program filter
1278 RF_R24_Value = 0x07;
1279 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1281 FilterTarget = 0x13;
1283 FilterTarget = 0x16;
1286 RT30xxReadRFRegister(pAd, RF_R31, &value);
1288 RT30xxWriteRFRegister(pAd, RF_R31, value);
1291 // Write 0x01 to RF_R22 to enable baseband loopback mode
1292 RT30xxReadRFRegister(pAd, RF_R22, &value);
1294 RT30xxWriteRFRegister(pAd, RF_R22, value);
1296 // Write 0x00 to BBP_R24 to set power & frequency of passband test tone
1297 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
1301 // Write 0x90 to BBP_R25 to transmit test tone
1302 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
1304 RTMPusecDelay(1000);
1305 // Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0]
1306 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
1307 R55x = value & 0xFF;
1309 } while ((ReTry++ < 100) && (R55x == 0));
1311 // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
1312 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06);
1316 // Write 0x90 to BBP_R25 to transmit test tone
1317 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
1319 //We need to wait for calibration
1320 RTMPusecDelay(1000);
1321 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
1323 if ((R55x - value) < FilterTarget)
1327 else if ((R55x - value) == FilterTarget)
1337 // prevent infinite loop cause driver hang.
1338 if (loopcnt++ > 100)
1340 DBGPRINT(RT_DEBUG_ERROR, ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt));
1344 // Write RF_R24 to program filter
1345 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1350 RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));
1353 // Store for future usage
1358 //BandWidth = 20 MHz
1359 pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value;
1363 //BandWidth = 40 MHz
1364 pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value;
1371 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1378 // Set back to initial state
1380 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
1382 RT30xxReadRFRegister(pAd, RF_R22, &value);
1384 RT30xxWriteRFRegister(pAd, RF_R22, value);
1386 // set BBP back to BW20
1387 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1389 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1391 DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
1395 VOID NICInitRT30xxRFRegisters(IN PRTMP_ADAPTER pAd)
1398 // Driver must read EEPROM to get RfIcType before initial RF registers
1399 // Initialize RF register to default value
1401 if (IS_RT3070(pAd) && ((pAd->RfIcType == RFIC_3020) ||(pAd->RfIcType == RFIC_2020)))
1403 // Init RF calibration
1404 // Driver should toggle RF R30 bit7 before init RF registers
1406 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg);
1408 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1409 RTMPusecDelay(1000);
1411 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1413 // Initialize RF register to default value
1414 for (i = 0; i < NUM_RF_REG_PARMS; i++)
1416 RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
1419 //For RF filter Calibration
1420 RTUSBFilterCalibration(pAd);
1424 if (IS_RT3070(pAd) || IS_RT3071(pAd))
1426 // Init RF calibration
1427 // Driver should toggle RF R30 bit7 before init RF registers
1431 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg);
1433 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1434 RTMPusecDelay(1000);
1436 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1438 // Initialize RF register to default value
1439 for (i = 0; i < NUM_RF_REG_PARMS; i++)
1441 RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
1447 // Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate
1448 RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
1449 data = ((data & 0xF0FFFFFF) | 0x0D000000);
1450 RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
1452 else if (IS_RT3071(pAd))
1454 // Driver should set RF R6 bit6 on before init RF registers
1455 RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg);
1457 RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg);
1460 RT30xxWriteRFRegister(pAd, RF_R31, 0x14);
1462 // RT3071 version E has fixed this issue
1463 if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211))
1465 // patch tx EVM issue temporarily
1466 RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
1467 data = ((data & 0xE0FFFFFF) | 0x0D000000);
1468 RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
1472 RTMP_IO_READ32(pAd, LDO_CFG0, &data);
1473 data = ((data & 0xE0FFFFFF) | 0x01000000);
1474 RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
1477 // patch LNA_PE_G1 failed issue
1478 RTUSBReadMACRegister(pAd, GPIO_SWITCH, &data);
1480 RTUSBWriteMACRegister(pAd, GPIO_SWITCH, data);
1483 //For RF filter Calibration
1484 RTMPFilterCalibration(pAd);
1486 // Initialize RF R27 register, set RF R27 must be behind RTMPFilterCalibration()
1487 if ((pAd->MACVersion & 0xffff) < 0x0211)
1488 RT30xxWriteRFRegister(pAd, RF_R27, 0x3);
1490 // set led open drain enable
1491 RTUSBReadMACRegister(pAd, OPT_14, &data);
1493 RTUSBWriteMACRegister(pAd, OPT_14, data);
1497 // add by johnli, RF power sequence setup, load RF normal operation-mode setup
1498 RT30xxLoadRFNormalModeSetup(pAd);
1507 ========================================================================
1509 Routine Description:
1510 Read initial parameters from EEPROM
1513 Adapter Pointer to our adapter
1518 IRQL = PASSIVE_LEVEL
1522 ========================================================================
1524 VOID NICReadEEPROMParameters(
1525 IN PRTMP_ADAPTER pAd,
1529 USHORT i, value, value2;
1531 EEPROM_TX_PWR_STRUC Power;
1532 EEPROM_VERSION_STRUC Version;
1533 EEPROM_ANTENNA_STRUC Antenna;
1534 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1536 DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n"));
1538 // Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8
1539 RTMP_IO_READ32(pAd, E2PROM_CSR, &data);
1540 DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%x\n", data));
1542 if((data & 0x30) == 0)
1543 pAd->EEPROMAddressNum = 6; // 93C46
1544 else if((data & 0x30) == 0x10)
1545 pAd->EEPROMAddressNum = 8; // 93C66
1547 pAd->EEPROMAddressNum = 8; // 93C86
1548 DBGPRINT(RT_DEBUG_TRACE, ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum ));
1550 // RT2860 MAC no longer auto load MAC address from E2PROM. Driver has to intialize
1551 // MAC address registers according to E2PROM setting
1552 if (mac_addr == NULL ||
1553 strlen(mac_addr) != 17 ||
1554 mac_addr[2] != ':' || mac_addr[5] != ':' || mac_addr[8] != ':' ||
1555 mac_addr[11] != ':' || mac_addr[14] != ':')
1557 USHORT Addr01,Addr23,Addr45 ;
1559 RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);
1560 RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);
1561 RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);
1563 pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);
1564 pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8);
1565 pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);
1566 pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8);
1567 pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);
1568 pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8);
1570 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from E2PROM \n"));
1579 for (j=0; j<MAC_ADDR_LEN; j++)
1581 AtoH(macptr, &pAd->PermanentAddress[j], 1);
1585 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from module parameter \n"));
1590 //more conveninet to test mbssid, so ap's bssid &0xf1
1591 if (pAd->PermanentAddress[0] == 0xff)
1592 pAd->PermanentAddress[0] = RandomByte(pAd)&0xf8;
1594 //if (pAd->PermanentAddress[5] == 0xff)
1595 // pAd->PermanentAddress[5] = RandomByte(pAd)&0xf8;
1597 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
1598 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
1599 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
1600 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
1601 if (pAd->bLocalAdminMAC == FALSE)
1605 COPY_MAC_ADDR(pAd->CurrentAddress, pAd->PermanentAddress);
1606 csr2.field.Byte0 = pAd->CurrentAddress[0];
1607 csr2.field.Byte1 = pAd->CurrentAddress[1];
1608 csr2.field.Byte2 = pAd->CurrentAddress[2];
1609 csr2.field.Byte3 = pAd->CurrentAddress[3];
1610 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word);
1612 csr3.field.Byte4 = pAd->CurrentAddress[4];
1613 csr3.field.Byte5 = pAd->CurrentAddress[5];
1614 csr3.field.U2MeMask = 0xff;
1615 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word);
1616 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
1617 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
1618 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
1619 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
1623 // if not return early. cause fail at emulation.
1624 // Init the channel number for TX channel power
1625 RTMPReadChannelPwr(pAd);
1627 // if E2PROM version mismatch with driver's expectation, then skip
1628 // all subsequent E2RPOM retieval and set a system error bit to notify GUI
1629 RT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word);
1630 pAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256;
1631 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: Version = %d, FAE release #%d\n", Version.field.Version, Version.field.FaeReleaseNumber));
1633 if (Version.field.Version > VALID_EEPROM_VERSION)
1635 DBGPRINT_ERR(("E2PROM: WRONG VERSION 0x%x, should be %d\n",Version.field.Version, VALID_EEPROM_VERSION));
1636 /*pAd->SystemErrorBitmap |= 0x00000001;
1638 // hard-code default value when no proper E2PROM installed
1639 pAd->bAutoTxAgcA = FALSE;
1640 pAd->bAutoTxAgcG = FALSE;
1642 // Default the channel power
1643 for (i = 0; i < MAX_NUM_OF_CHANNELS; i++)
1644 pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER;
1646 // Default the channel power
1647 for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++)
1648 pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER;
1650 for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++)
1651 pAd->EEPROMDefaultValue[i] = 0xffff;
1655 // Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd
1656 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value);
1657 pAd->EEPROMDefaultValue[0] = value;
1659 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);
1660 pAd->EEPROMDefaultValue[1] = value;
1662 RT28xx_EEPROM_READ16(pAd, 0x38, value); // Country Region
1663 pAd->EEPROMDefaultValue[2] = value;
1665 for(i = 0; i < 8; i++)
1667 RT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2, value);
1668 pAd->EEPROMDefaultValue[i+3] = value;
1671 // We have to parse NIC configuration 0 at here.
1672 // If TSSI did not have preloaded value, it should reset the TxAutoAgc to false
1673 // Therefore, we have to read TxAutoAgc control beforehand.
1674 // Read Tx AGC control bit
1675 Antenna.word = pAd->EEPROMDefaultValue[0];
1676 if (Antenna.word == 0xFFFF)
1681 Antenna.field.RfIcType = RFIC_3020;
1682 Antenna.field.TxPath = 1;
1683 Antenna.field.RxPath = 1;
1688 Antenna.field.RfIcType = RFIC_2820;
1689 Antenna.field.TxPath = 1;
1690 Antenna.field.RxPath = 2;
1691 DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
1695 // Choose the desired Tx&Rx stream.
1696 if ((pAd->CommonCfg.TxStream == 0) || (pAd->CommonCfg.TxStream > Antenna.field.TxPath))
1697 pAd->CommonCfg.TxStream = Antenna.field.TxPath;
1699 if ((pAd->CommonCfg.RxStream == 0) || (pAd->CommonCfg.RxStream > Antenna.field.RxPath))
1701 pAd->CommonCfg.RxStream = Antenna.field.RxPath;
1703 if ((pAd->MACVersion < RALINK_2883_VERSION) &&
1704 (pAd->CommonCfg.RxStream > 2))
1706 // only 2 Rx streams for RT2860 series
1707 pAd->CommonCfg.RxStream = 2;
1712 // read value from EEPROM and set them to CSR174 ~ 177 in chain0 ~ chain2
1718 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1722 NicConfig2.word = 0;
1724 if ((NicConfig2.word & 0x00ff) == 0xff)
1726 NicConfig2.word &= 0xff00;
1729 if ((NicConfig2.word >> 8) == 0xff)
1731 NicConfig2.word &= 0x00ff;
1735 if (NicConfig2.field.DynamicTxAgcControl == 1)
1736 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1738 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1740 DBGPRINT_RAW(RT_DEBUG_TRACE, ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n", Antenna.field.RxPath, Antenna.field.TxPath));
1742 // Save the antenna for future use
1743 pAd->Antenna.word = Antenna.word;
1746 // Reset PhyMode if we don't support 802.11a
1747 // Only RFIC_2850 & RFIC_2750 support 802.11a
1749 if ((Antenna.field.RfIcType != RFIC_2850) && (Antenna.field.RfIcType != RFIC_2750))
1751 if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) ||
1752 (pAd->CommonCfg.PhyMode == PHY_11A))
1753 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;
1754 else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
1755 (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) ||
1756 (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) ||
1757 (pAd->CommonCfg.PhyMode == PHY_11N_5G))
1758 pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED;
1761 // Read TSSI reference and TSSI boundary for temperature compensation. This is ugly
1764 /* these are tempature reference value (0x00 ~ 0xFE)
1765 ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
1766 TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) +
1767 TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */
1768 RT28xx_EEPROM_READ16(pAd, 0x6E, Power.word);
1769 pAd->TssiMinusBoundaryG[4] = Power.field.Byte0;
1770 pAd->TssiMinusBoundaryG[3] = Power.field.Byte1;
1771 RT28xx_EEPROM_READ16(pAd, 0x70, Power.word);
1772 pAd->TssiMinusBoundaryG[2] = Power.field.Byte0;
1773 pAd->TssiMinusBoundaryG[1] = Power.field.Byte1;
1774 RT28xx_EEPROM_READ16(pAd, 0x72, Power.word);
1775 pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */
1776 pAd->TssiPlusBoundaryG[1] = Power.field.Byte1;
1777 RT28xx_EEPROM_READ16(pAd, 0x74, Power.word);
1778 pAd->TssiPlusBoundaryG[2] = Power.field.Byte0;
1779 pAd->TssiPlusBoundaryG[3] = Power.field.Byte1;
1780 RT28xx_EEPROM_READ16(pAd, 0x76, Power.word);
1781 pAd->TssiPlusBoundaryG[4] = Power.field.Byte0;
1782 pAd->TxAgcStepG = Power.field.Byte1;
1783 pAd->TxAgcCompensateG = 0;
1784 pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;
1785 pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG;
1787 // Disable TxAgc if the based value is not right
1788 if (pAd->TssiRefG == 0xff)
1789 pAd->bAutoTxAgcG = FALSE;
1791 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
1792 pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1],
1794 pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],
1795 pAd->TxAgcStepG, pAd->bAutoTxAgcG));
1799 RT28xx_EEPROM_READ16(pAd, 0xD4, Power.word);
1800 pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;
1801 pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;
1802 RT28xx_EEPROM_READ16(pAd, 0xD6, Power.word);
1803 pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;
1804 pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;
1805 RT28xx_EEPROM_READ16(pAd, 0xD8, Power.word);
1806 pAd->TssiRefA = Power.field.Byte0;
1807 pAd->TssiPlusBoundaryA[1] = Power.field.Byte1;
1808 RT28xx_EEPROM_READ16(pAd, 0xDA, Power.word);
1809 pAd->TssiPlusBoundaryA[2] = Power.field.Byte0;
1810 pAd->TssiPlusBoundaryA[3] = Power.field.Byte1;
1811 RT28xx_EEPROM_READ16(pAd, 0xDC, Power.word);
1812 pAd->TssiPlusBoundaryA[4] = Power.field.Byte0;
1813 pAd->TxAgcStepA = Power.field.Byte1;
1814 pAd->TxAgcCompensateA = 0;
1815 pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;
1816 pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA;
1818 // Disable TxAgc if the based value is not right
1819 if (pAd->TssiRefA == 0xff)
1820 pAd->bAutoTxAgcA = FALSE;
1822 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
1823 pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1],
1825 pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2], pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],
1826 pAd->TxAgcStepA, pAd->bAutoTxAgcA));
1828 pAd->BbpRssiToDbmDelta = 0x0;
1830 // Read frequency offset setting for RF
1831 RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value);
1832 if ((value & 0x00FF) != 0x00FF)
1833 pAd->RfFreqOffset = (ULONG) (value & 0x00FF);
1835 pAd->RfFreqOffset = 0;
1836 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset));
1838 //CountryRegion byte offset (38h)
1839 value = pAd->EEPROMDefaultValue[2] >> 8; // 2.4G band
1840 value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; // 5G band
1842 if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND))
1844 pAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80;
1845 pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;
1846 TmpPhy = pAd->CommonCfg.PhyMode;
1847 pAd->CommonCfg.PhyMode = 0xff;
1848 RTMPSetPhyMode(pAd, TmpPhy);
1853 // Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.
1854 // The valid value are (-10 ~ 10)
1856 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value);
1857 pAd->BGRssiOffset0 = value & 0x00ff;
1858 pAd->BGRssiOffset1 = (value >> 8);
1859 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2, value);
1860 pAd->BGRssiOffset2 = value & 0x00ff;
1861 pAd->ALNAGain1 = (value >> 8);
1862 RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value);
1863 pAd->BLNAGain = value & 0x00ff;
1864 pAd->ALNAGain0 = (value >> 8);
1866 // Validate 11b/g RSSI_0 offset.
1867 if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10))
1868 pAd->BGRssiOffset0 = 0;
1870 // Validate 11b/g RSSI_1 offset.
1871 if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))
1872 pAd->BGRssiOffset1 = 0;
1874 // Validate 11b/g RSSI_2 offset.
1875 if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))
1876 pAd->BGRssiOffset2 = 0;
1878 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value);
1879 pAd->ARssiOffset0 = value & 0x00ff;
1880 pAd->ARssiOffset1 = (value >> 8);
1881 RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2), value);
1882 pAd->ARssiOffset2 = value & 0x00ff;
1883 pAd->ALNAGain2 = (value >> 8);
1885 if (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))
1886 pAd->ALNAGain1 = pAd->ALNAGain0;
1887 if (((UCHAR)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00))
1888 pAd->ALNAGain2 = pAd->ALNAGain0;
1890 // Validate 11a RSSI_0 offset.
1891 if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10))
1892 pAd->ARssiOffset0 = 0;
1894 // Validate 11a RSSI_1 offset.
1895 if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))
1896 pAd->ARssiOffset1 = 0;
1898 //Validate 11a RSSI_2 offset.
1899 if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))
1900 pAd->ARssiOffset2 = 0;
1905 RT28xx_EEPROM_READ16(pAd, 0x3a, value);
1906 pAd->LedCntl.word = (value&0xff00) >> 8;
1907 RT28xx_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET, value);
1909 RT28xx_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET, value);
1911 RT28xx_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET, value);
1914 RTMPReadTxPwrPerRate(pAd);
1919 eFusePhysicalReadRegisters(pAd, EFUSE_TAG, 2, &value);
1920 pAd->EFuseTag = (value & 0xff);
1924 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
1928 ========================================================================
1930 Routine Description:
1931 Set default value from EEPROM
1934 Adapter Pointer to our adapter
1939 IRQL = PASSIVE_LEVEL
1943 ========================================================================
1945 VOID NICInitAsicFromEEPROM(
1946 IN PRTMP_ADAPTER pAd)
1951 EEPROM_ANTENNA_STRUC Antenna;
1952 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1955 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitAsicFromEEPROM\n"));
1956 for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)
1958 UCHAR BbpRegIdx, BbpValue;
1960 if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))
1962 BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);
1963 BbpValue = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);
1964 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);
1969 Antenna.word = pAd->Antenna.word;
1972 Antenna.word = pAd->EEPROMDefaultValue[0];
1973 if (Antenna.word == 0xFFFF)
1975 DBGPRINT(RT_DEBUG_ERROR, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
1976 BUG_ON(Antenna.word == 0xFFFF);
1979 pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;
1980 pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;
1983 DBGPRINT(RT_DEBUG_WARN, ("pAd->RfIcType = %d, RealRxPath=%d, TxPath = %d\n", pAd->RfIcType, pAd->Mlme.RealRxPath,Antenna.field.TxPath));
1985 // Save the antenna for future use
1986 pAd->Antenna.word = Antenna.word;
1988 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1992 if ((NicConfig2.word & 0x00ff) == 0xff)
1994 NicConfig2.word &= 0xff00;
1997 if ((NicConfig2.word >> 8) == 0xff)
1999 NicConfig2.word &= 0x00ff;
2003 // Save the antenna for future use
2004 pAd->NicConfig2.word = NicConfig2.word;
2007 // set default antenna as main
2008 if (pAd->RfIcType == RFIC_3020)
2009 AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
2012 // Send LED Setting to MCU.
2014 if (pAd->LedCntl.word == 0xFF)
2016 pAd->LedCntl.word = 0x01;
2028 AsicSendCommandToMcu(pAd, 0x52, 0xff, (UCHAR)pAd->Led1, (UCHAR)(pAd->Led1 >> 8));
2029 AsicSendCommandToMcu(pAd, 0x53, 0xff, (UCHAR)pAd->Led2, (UCHAR)(pAd->Led2 >> 8));
2030 AsicSendCommandToMcu(pAd, 0x54, 0xff, (UCHAR)pAd->Led3, (UCHAR)(pAd->Led3 >> 8));
2031 pAd->LedIndicatorStregth = 0xFF;
2032 RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, before link up
2035 // Read Hardware controlled Radio state enable bit
2036 if (NicConfig2.field.HardwareRadioControl == 1)
2038 pAd->StaCfg.bHardwareRadio = TRUE;
2040 // Read GPIO pin2 as Hardware controlled radio state
2041 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
2042 if ((data & 0x04) == 0)
2044 pAd->StaCfg.bHwRadio = FALSE;
2045 pAd->StaCfg.bRadio = FALSE;
2046 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
2050 pAd->StaCfg.bHardwareRadio = FALSE;
2052 if (pAd->StaCfg.bRadio == FALSE)
2054 RTMPSetLED(pAd, LED_RADIO_OFF);
2058 RTMPSetLED(pAd, LED_RADIO_ON);
2060 AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);
2061 AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x00);
2062 // 2-1. wait command ok.
2063 AsicCheckCommanOk(pAd, PowerWakeCID);
2068 // Turn off patching for cardbus controller
2069 if (NicConfig2.field.CardbusAcceleration == 1)
2073 if (NicConfig2.field.DynamicTxAgcControl == 1)
2074 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
2076 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
2078 // Since BBP has been progamed, to make sure BBP setting will be
2079 // upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND!!
2081 pAd->CommonCfg.BandState = UNKNOWN_BAND;
2083 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
2085 if(pAd->Antenna.field.RxPath == 3)
2089 else if(pAd->Antenna.field.RxPath == 2)
2093 else if(pAd->Antenna.field.RxPath == 1)
2097 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
2100 // Handle the difference when 1T
2101 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
2102 if(pAd->Antenna.field.TxPath == 1)
2106 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
2108 DBGPRINT(RT_DEBUG_TRACE, ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n", pAd->CommonCfg.bHardwareRadio, pAd->CommonCfg.bHardwareRadio));
2111 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));
2112 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n"));
2116 ========================================================================
2118 Routine Description:
2119 Initialize NIC hardware
2122 Adapter Pointer to our adapter
2127 IRQL = PASSIVE_LEVEL
2131 ========================================================================
2133 NDIS_STATUS NICInitializeAdapter(
2134 IN PRTMP_ADAPTER pAd,
2135 IN BOOLEAN bHardReset)
2137 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
2138 WPDMA_GLO_CFG_STRUC GloCfg;
2141 DELAY_INT_CFG_STRUC IntCfg;
2144 AC_TXOP_CSR0_STRUC csr0;
2146 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n"));
2148 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
2153 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
2154 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
2157 RTMPusecDelay(1000);
2160 DBGPRINT(RT_DEBUG_TRACE, ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word));
2161 GloCfg.word &= 0xff0;
2162 GloCfg.field.EnTXWriteBackDDONE =1;
2163 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
2165 // Record HW Beacon offset
2166 pAd->BeaconOffset[0] = HW_BEACON_BASE0;
2167 pAd->BeaconOffset[1] = HW_BEACON_BASE1;
2168 pAd->BeaconOffset[2] = HW_BEACON_BASE2;
2169 pAd->BeaconOffset[3] = HW_BEACON_BASE3;
2170 pAd->BeaconOffset[4] = HW_BEACON_BASE4;
2171 pAd->BeaconOffset[5] = HW_BEACON_BASE5;
2172 pAd->BeaconOffset[6] = HW_BEACON_BASE6;
2173 pAd->BeaconOffset[7] = HW_BEACON_BASE7;
2176 // write all shared Ring's base address into ASIC
2179 // asic simulation sequence put this ahead before loading firmware.
2180 // pbf hardware reset
2182 RTMP_IO_WRITE32(pAd, WPDMA_RST_IDX, 0x1003f); // 0x10000 for reset rx, 0x3f resets all 6 tx rings.
2183 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe1f);
2184 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe00);
2187 // Initialze ASIC for TX & Rx operation
2188 if (NICInitializeAsic(pAd , bHardReset) != NDIS_STATUS_SUCCESS)
2192 NICLoadFirmware(pAd);
2195 return NDIS_STATUS_FAILURE;
2200 // Write AC_BK base address register
2201 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BK].Cell[0].AllocPa);
2202 RTMP_IO_WRITE32(pAd, TX_BASE_PTR1, Value);
2203 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR1 : 0x%x\n", Value));
2205 // Write AC_BE base address register
2206 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BE].Cell[0].AllocPa);
2207 RTMP_IO_WRITE32(pAd, TX_BASE_PTR0, Value);
2208 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR0 : 0x%x\n", Value));
2210 // Write AC_VI base address register
2211 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VI].Cell[0].AllocPa);
2212 RTMP_IO_WRITE32(pAd, TX_BASE_PTR2, Value);
2213 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR2 : 0x%x\n", Value));
2215 // Write AC_VO base address register
2216 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VO].Cell[0].AllocPa);
2217 RTMP_IO_WRITE32(pAd, TX_BASE_PTR3, Value);
2218 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR3 : 0x%x\n", Value));
2220 // Write HCCA base address register
2221 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_HCCA].Cell[0].AllocPa);
2222 RTMP_IO_WRITE32(pAd, TX_BASE_PTR4, Value);
2223 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR4 : 0x%x\n", Value));
2225 // Write MGMT_BASE_CSR register
2226 Value = RTMP_GetPhysicalAddressLow(pAd->MgmtRing.Cell[0].AllocPa);
2227 RTMP_IO_WRITE32(pAd, TX_BASE_PTR5, Value);
2228 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR5 : 0x%x\n", Value));
2230 // Write RX_BASE_CSR register
2231 Value = RTMP_GetPhysicalAddressLow(pAd->RxRing.Cell[0].AllocPa);
2232 RTMP_IO_WRITE32(pAd, RX_BASE_PTR, Value);
2233 DBGPRINT(RT_DEBUG_TRACE, ("--> RX_BASE_PTR : 0x%x\n", Value));
2235 // Init RX Ring index pointer
2236 pAd->RxRing.RxSwReadIdx = 0;
2237 pAd->RxRing.RxCpuIdx = RX_RING_SIZE-1;
2238 RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
2240 // Init TX rings index pointer
2242 for (i=0; i<NUM_OF_TX_RING; i++)
2244 pAd->TxRing[i].TxSwFreeIdx = 0;
2245 pAd->TxRing[i].TxCpuIdx = 0;
2246 RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10) , pAd->TxRing[i].TxCpuIdx);
2250 // init MGMT ring index pointer
2251 pAd->MgmtRing.TxSwFreeIdx = 0;
2252 pAd->MgmtRing.TxCpuIdx = 0;
2253 RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
2256 // set each Ring's SIZE into ASIC. Descriptor Size is fixed by design.
2259 // Write TX_RING_CSR0 register
2260 Value = TX_RING_SIZE;
2261 RTMP_IO_WRITE32(pAd, TX_MAX_CNT0, Value);
2262 RTMP_IO_WRITE32(pAd, TX_MAX_CNT1, Value);
2263 RTMP_IO_WRITE32(pAd, TX_MAX_CNT2, Value);
2264 RTMP_IO_WRITE32(pAd, TX_MAX_CNT3, Value);
2265 RTMP_IO_WRITE32(pAd, TX_MAX_CNT4, Value);
2266 Value = MGMT_RING_SIZE;
2267 RTMP_IO_WRITE32(pAd, TX_MGMTMAX_CNT, Value);
2269 // Write RX_RING_CSR register
2270 Value = RX_RING_SIZE;
2271 RTMP_IO_WRITE32(pAd, RX_MAX_CNT, Value);
2277 RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
2278 if (pAd->CommonCfg.PhyMode == PHY_11B)
2280 csr0.field.Ac0Txop = 192; // AC_VI: 192*32us ~= 6ms
2281 csr0.field.Ac1Txop = 96; // AC_VO: 96*32us ~= 3ms
2285 csr0.field.Ac0Txop = 96; // AC_VI: 96*32us ~= 3ms
2286 csr0.field.Ac1Txop = 48; // AC_VO: 48*32us ~= 1.5ms
2288 RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word);
2292 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
2296 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
2297 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
2300 RTMPusecDelay(1000);
2304 GloCfg.word &= 0xff0;
2305 GloCfg.field.EnTXWriteBackDDONE =1;
2306 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
2309 RTMP_IO_WRITE32(pAd, DELAY_INT_CFG, IntCfg.word);
2315 // Status = NICLoadFirmware(pAd);
2317 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n"));
2322 ========================================================================
2324 Routine Description:
2328 Adapter Pointer to our adapter
2333 IRQL = PASSIVE_LEVEL
2337 ========================================================================
2339 NDIS_STATUS NICInitializeAsic(
2340 IN PRTMP_ADAPTER pAd,
2341 IN BOOLEAN bHardReset)
2345 UINT32 MacCsr12 = 0, Counter = 0;
2357 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n"));
2360 if (bHardReset == TRUE)
2362 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
2365 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
2369 // Make sure MAC gets ready after NICLoadFirmware().
2373 //To avoid hang-on issue when interface up in kernel 2.4,
2374 //we use a local variable "MacCsr0" instead of using "pAd->MACVersion" directly.
2377 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
2379 if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
2383 } while (Index++ < 100);
2385 pAd->MACVersion = MacCsr0;
2386 DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
2387 // turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue.
2388 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacCsr12);
2389 MacCsr12 &= (~0x2000);
2390 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacCsr12);
2392 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
2393 RTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);
2394 Status = RTUSBVenderReset(pAd);
2397 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
2399 // Initialize MAC register to default value
2401 for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++)
2403 RTMP_IO_WRITE32(pAd, MACRegTable[Index].Register, MACRegTable[Index].Value);
2407 for(Index=0; Index<NUM_MAC_REG_PARMS; Index++)
2410 if ((MACRegTable[Index].Register == TX_SW_CFG0) && (IS_RT3070(pAd) || IS_RT3071(pAd)))
2412 MACRegTable[Index].Value = 0x00000400;
2415 RTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);
2421 // According to Frank Hsu (from Gary Tsao)
2422 RTMP_IO_WRITE32(pAd, (USHORT)TX_SW_CFG0, 0x00000400);
2424 // Initialize RT3070 serial MAC registers which is different from RT2870 serial
2425 RTUSBWriteMACRegister(pAd, TX_SW_CFG1, 0);
2426 RTUSBWriteMACRegister(pAd, TX_SW_CFG2, 0);
2433 for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
2436 RTMP_IO_WRITE32(pAd, STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
2439 RTMP_IO_WRITE32(pAd, (USHORT)STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
2444 // Initialize RT3070 serial MAc registers which is different from RT2870 serial
2447 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
2449 // RT3071 version E has fixed this issue
2450 if ((pAd->MACVersion & 0xffff) < 0x0211)
2452 if (pAd->NicConfig2.field.DACTestBit == 1)
2454 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x1F); // To fix throughput drop drastically
2458 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F); // To fix throughput drop drastically
2463 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);
2467 else if (IS_RT3070(pAd))
2469 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
2470 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x1F); // To fix throughput drop drastically
2475 // Before program BBP, we need to wait BBP/RF get wake up.
2480 RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);
2482 if ((MacCsr12 & 0x03) == 0) // if BB.RF is stable
2485 DBGPRINT(RT_DEBUG_TRACE, ("Check MAC_STATUS_CFG = Busy = %x\n", MacCsr12));
2486 RTMPusecDelay(1000);
2487 } while (Index++ < 100);
2489 // The commands to firmware should be after these commands, these commands will init firmware
2490 // PCI and USB are not the same because PCI driver needs to wait for PCI bus ready
2491 RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); // initialize BBP R/W access agent
2492 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);
2493 RTMPusecDelay(1000);
2495 // Read BBP register, make sure BBP is up and running before write new data
2499 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0);
2500 DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0));
2501 } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00)));
2502 //ASSERT(Index < 20); //this will cause BSOD on Check-build driver
2504 if ((R0 == 0xff) || (R0 == 0x00))
2505 return NDIS_STATUS_FAILURE;
2507 // Initialize BBP register to default value
2508 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
2510 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
2514 // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2515 if ((pAd->MACVersion&0xffff) != 0x0101)
2516 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
2519 //write RT3070 BBP wchich different with 2870 after write RT2870 BBP
2522 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0a);
2523 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x99);
2524 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, 0x05);
2529 // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2530 // RT3090 should not program BBP R84 to 0x19, otherwise TX will block.
2531 if (((pAd->MACVersion&0xffff) != 0x0101) && (!IS_RT30xx(pAd)))
2532 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
2534 // add by johnli, RF power sequence setup
2536 { //update for RT3070/71/72/90/91/92.
2537 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R79, 0x13);
2538 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R80, 0x05);
2539 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R81, 0x33);
2547 if ((pAd->MACVersion & 0xffff) >= 0x0211)
2549 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
2552 // improve power consumption
2553 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R138, &bbpreg);
2554 if (pAd->Antenna.field.TxPath == 1)
2556 // turn off tx DAC_1
2557 bbpreg = (bbpreg | 0x20);
2560 if (pAd->Antenna.field.RxPath == 1)
2562 // turn off tx ADC_1
2565 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R138, bbpreg);
2567 // improve power consumption in RT3071 Ver.E
2568 if ((pAd->MACVersion & 0xffff) >= 0x0211)
2570 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
2572 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
2576 if (pAd->MACVersion == 0x28600100)
2578 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2579 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
2582 if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) // 3*3
2584 // enlarge MAX_LEN_CFG
2586 RTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr);
2589 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr);
2594 UCHAR MAC_Value[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0};
2596 //Initialize WCID table
2598 for(Index =0 ;Index < 254;Index++)
2600 RTUSBMultiWrite(pAd, (USHORT)(MAC_WCID_BASE + Index * 8), MAC_Value, 8);
2605 // Add radio off control
2607 if (pAd->StaCfg.bRadio == FALSE)
2609 // RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);
2610 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
2611 DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n"));
2615 // Clear raw counters
2616 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
2617 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
2618 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
2619 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
2620 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
2621 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
2623 // ASIC will keep garbage value after boot
2624 // Clear all seared key table when initial
2625 // This routine can be ignored in radio-ON/OFF operation.
2628 for (KeyIdx = 0; KeyIdx < 4; KeyIdx++)
2630 RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0);
2633 // Clear all pairwise key table when initial
2634 for (KeyIdx = 0; KeyIdx < 256; KeyIdx++)
2636 RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
2641 // It isn't necessary to clear this space when not hard reset.
2642 if (bHardReset == TRUE)
2644 // clear all on-chip BEACON frame space
2645 for (apidx = 0; apidx < HW_BEACON_MAX_COUNT; apidx++)
2647 for (i = 0; i < HW_BEACON_OFFSET>>2; i+=4)
2648 RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[apidx] + i, 0x00);
2652 AsicDisableSync(pAd);
2653 // Clear raw counters
2654 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
2655 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
2656 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
2657 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
2658 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
2659 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
2660 // Default PCI clock cycle per ms is different as default setting, which is based on PCI.
2661 RTMP_IO_READ32(pAd, USB_CYC_CFG, &Counter);
2662 Counter&=0xffffff00;
2664 RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
2667 pAd->bUseEfuse=FALSE;
2668 RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrl);
2669 pAd->bUseEfuse = ( (eFuseCtrl & 0x80000000) == 0x80000000) ? 1 : 0;
2672 DBGPRINT(RT_DEBUG_TRACE, ("NVM is Efuse\n"));
2676 DBGPRINT(RT_DEBUG_TRACE, ("NVM is EEPROM\n"));
2682 // for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT.
2683 if ((pAd->MACVersion&0xffff) != 0x0101)
2684 RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f);
2687 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n"));
2688 return NDIS_STATUS_SUCCESS;
2693 VOID NICRestoreBBPValue(
2694 IN PRTMP_ADAPTER pAd)
2700 DBGPRINT(RT_DEBUG_TRACE, ("---> NICRestoreBBPValue !!!!!!!!!!!!!!!!!!!!!!! \n"));
2701 // Initialize BBP register to default value (rtmp_init.c)
2702 for (index = 0; index < NUM_BBP_REG_PARMS; index++)
2704 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[index].Register, BBPRegTable[index].Value);
2706 // copy from (rtmp_init.c)
2707 if (pAd->MACVersion == 0x28600100)
2709 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2710 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
2713 // copy from (connect.c LinkUp function)
2716 // Change to AP channel
2717 if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
2719 // Must using 40MHz.
2720 pAd->CommonCfg.BBPCurrentBW = BW_40;
2721 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2722 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2724 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2727 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2729 // RX : control channel at lower
2730 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2732 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2733 // Record BBPR3 setting, But don't keep R Antenna # information.
2734 pAd->StaCfg.BBPR3 = Value;
2736 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2738 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2740 if (pAd->MACVersion == 0x28600100)
2742 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
2743 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
2744 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
2745 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2748 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel ));
2750 else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
2752 // Must using 40MHz.
2753 pAd->CommonCfg.BBPCurrentBW = BW_40;
2754 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2755 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2757 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2760 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2762 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2764 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2766 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2768 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2769 // Record BBPR3 setting, But don't keep R Antenna # information.
2770 pAd->StaCfg.BBPR3 = Value;
2772 if (pAd->MACVersion == 0x28600100)
2774 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
2775 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
2776 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
2777 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2780 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel ));
2784 pAd->CommonCfg.BBPCurrentBW = BW_20;
2785 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2786 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2788 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2790 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2792 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2794 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2796 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2798 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2799 // Record BBPR3 setting, But don't keep R Antenna # information.
2800 pAd->StaCfg.BBPR3 = Value;
2802 if (pAd->MACVersion == 0x28600100)
2804 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2805 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
2806 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
2807 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2810 DBGPRINT(RT_DEBUG_TRACE, ("!!!20MHz LINK UP !!! \n" ));
2814 DBGPRINT(RT_DEBUG_TRACE, ("<--- NICRestoreBBPValue !!!!!!!!!!!!!!!!!!!!!!! \n"));
2819 ========================================================================
2821 Routine Description:
2825 Adapter Pointer to our adapter
2830 IRQL = PASSIVE_LEVEL
2833 Reset NIC to initial state AS IS system boot up time.
2835 ========================================================================
2838 IN PRTMP_ADAPTER pAd)
2841 DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n"));
2843 // Disable Rx, register value supposed will remain after reset
2844 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
2845 Value &= (0xfffffff3);
2846 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
2848 // Issue reset and clear from reset state
2849 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); // 2004-09-17 change from 0x01
2850 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);
2852 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n"));
2856 ========================================================================
2858 Routine Description:
2859 Check ASIC registers and find any reason the system might hang
2862 Adapter Pointer to our adapter
2867 IRQL = DISPATCH_LEVEL
2869 ========================================================================
2871 BOOLEAN NICCheckForHang(
2872 IN PRTMP_ADAPTER pAd)
2877 VOID NICUpdateFifoStaCounters(
2878 IN PRTMP_ADAPTER pAd)
2880 TX_STA_FIFO_STRUC StaFifo;
2881 MAC_TABLE_ENTRY *pEntry;
2883 UCHAR pid = 0, wcid = 0;
2889 RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);
2891 if (StaFifo.field.bValid == 0)
2894 wcid = (UCHAR)StaFifo.field.wcid;
2897 /* ignore NoACK and MGMT frame use 0xFF as WCID */
2898 if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE))
2904 /* PID store Tx MCS Rate */
2905 pid = (UCHAR)StaFifo.field.PidType;
2907 pEntry = &pAd->MacTab.Content[wcid];
2909 pEntry->DebugFIFOCount++;
2911 if (StaFifo.field.TxBF) // 3*3
2912 pEntry->TxBFCount++;
2914 #ifdef UAPSD_AP_SUPPORT
2915 UAPSD_SP_AUE_Handle(pAd, pEntry, StaFifo.field.TxSuccess);
2916 #endif // UAPSD_AP_SUPPORT //
2918 if (!StaFifo.field.TxSuccess)
2920 pEntry->FIFOCount++;
2921 pEntry->OneSecTxFailCount++;
2923 if (pEntry->FIFOCount >= 1)
2925 DBGPRINT(RT_DEBUG_TRACE, ("#"));
2926 pEntry->NoBADataCountDown = 64;
2928 if(pEntry->PsMode == PWR_ACTIVE)
2931 for (tid=0; tid<NUM_OF_TID; tid++)
2933 BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, FALSE);
2936 // Update the continuous transmission counter except PS mode
2937 pEntry->ContinueTxFailCnt++;
2941 // Clear the FIFOCount when sta in Power Save mode. Basically we assume
2942 // this tx error happened due to sta just go to sleep.
2943 pEntry->FIFOCount = 0;
2944 pEntry->ContinueTxFailCnt = 0;
2950 if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0))
2952 pEntry->NoBADataCountDown--;
2953 if (pEntry->NoBADataCountDown==0)
2955 DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
2959 pEntry->FIFOCount = 0;
2960 pEntry->OneSecTxNoRetryOkCount++;
2961 // update NoDataIdleCount when sucessful send packet to STA.
2962 pEntry->NoDataIdleCount = 0;
2963 pEntry->ContinueTxFailCnt = 0;
2966 succMCS = StaFifo.field.SuccessRate & 0x7F;
2968 reTry = pid - succMCS;
2970 if (StaFifo.field.TxSuccess)
2972 pEntry->TXMCSExpected[pid]++;
2975 pEntry->TXMCSSuccessful[pid]++;
2979 pEntry->TXMCSAutoFallBack[pid][succMCS]++;
2984 pEntry->TXMCSFailed[pid]++;
2989 if ((pid >= 12) && succMCS <=7)
2993 pEntry->OneSecTxRetryOkCount += reTry;
2997 // ASIC store 16 stack
2998 } while ( i < (2*TX_RING_SIZE) );
3003 ========================================================================
3005 Routine Description:
3006 Read statistical counters from hardware registers and record them
3007 in software variables for later on query
3010 pAd Pointer to our adapter
3015 IRQL = DISPATCH_LEVEL
3017 ========================================================================
3019 VOID NICUpdateRawCounters(
3020 IN PRTMP_ADAPTER pAd)
3023 RX_STA_CNT0_STRUC RxStaCnt0;
3024 RX_STA_CNT1_STRUC RxStaCnt1;
3025 RX_STA_CNT2_STRUC RxStaCnt2;
3026 TX_STA_CNT0_STRUC TxStaCnt0;
3027 TX_STA_CNT1_STRUC StaTx1;
3028 TX_STA_CNT2_STRUC StaTx2;
3029 TX_AGG_CNT_STRUC TxAggCnt;
3030 TX_AGG_CNT0_STRUC TxAggCnt0;
3031 TX_AGG_CNT1_STRUC TxAggCnt1;
3032 TX_AGG_CNT2_STRUC TxAggCnt2;
3033 TX_AGG_CNT3_STRUC TxAggCnt3;
3034 TX_AGG_CNT4_STRUC TxAggCnt4;
3035 TX_AGG_CNT5_STRUC TxAggCnt5;
3036 TX_AGG_CNT6_STRUC TxAggCnt6;
3037 TX_AGG_CNT7_STRUC TxAggCnt7;
3039 RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word);
3040 RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word);
3043 RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);
3044 // Update RX PLCP error counter
3045 pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr;
3046 // Update False CCA counter
3047 pAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca;
3050 // Update FCS counters
3051 OldValue= pAd->WlanCounters.FCSErrorCount.u.LowPart;
3052 pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); // >> 7);
3053 if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue)
3054 pAd->WlanCounters.FCSErrorCount.u.HighPart++;
3056 // Add FCS error count to private counters
3057 pAd->RalinkCounters.OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr;
3058 OldValue = pAd->RalinkCounters.RealFcsErrCount.u.LowPart;
3059 pAd->RalinkCounters.RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr;
3060 if (pAd->RalinkCounters.RealFcsErrCount.u.LowPart < OldValue)
3061 pAd->RalinkCounters.RealFcsErrCount.u.HighPart++;
3063 // Update Duplicate Rcv check
3064 pAd->RalinkCounters.DuplicateRcv += RxStaCnt2.field.RxDupliCount;
3065 pAd->WlanCounters.FrameDuplicateCount.u.LowPart += RxStaCnt2.field.RxDupliCount;
3066 // Update RX Overflow counter
3067 pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount);
3070 if (pAd->RalinkCounters.RxCount != pAd->watchDogRxCnt)
3072 pAd->watchDogRxCnt = pAd->RalinkCounters.RxCount;
3073 pAd->watchDogRxOverFlowCnt = 0;
3077 if (RxStaCnt2.field.RxFifoOverflowCount)
3078 pAd->watchDogRxOverFlowCnt++;
3080 pAd->watchDogRxOverFlowCnt = 0;
3085 if (!pAd->bUpdateBcnCntDone)
3087 // Update BEACON sent count
3088 RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
3089 RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
3090 RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
3091 pAd->RalinkCounters.OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount;
3092 pAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit;
3093 pAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess;
3094 pAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount;
3095 pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess;
3096 pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit;
3097 pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;
3101 RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);
3102 RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);
3103 RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);
3104 RTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);
3105 RTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);
3106 RTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word);
3107 RTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word);
3108 RTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word);
3109 RTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word);
3110 pAd->RalinkCounters.TxAggCount += TxAggCnt.field.AggTxCount;
3111 pAd->RalinkCounters.TxNonAggCount += TxAggCnt.field.NonAggTxCount;
3112 pAd->RalinkCounters.TxAgg1MPDUCount += TxAggCnt0.field.AggSize1Count;
3113 pAd->RalinkCounters.TxAgg2MPDUCount += TxAggCnt0.field.AggSize2Count;
3115 pAd->RalinkCounters.TxAgg3MPDUCount += TxAggCnt1.field.AggSize3Count;
3116 pAd->RalinkCounters.TxAgg4MPDUCount += TxAggCnt1.field.AggSize4Count;
3117 pAd->RalinkCounters.TxAgg5MPDUCount += TxAggCnt2.field.AggSize5Count;
3118 pAd->RalinkCounters.TxAgg6MPDUCount += TxAggCnt2.field.AggSize6Count;
3120 pAd->RalinkCounters.TxAgg7MPDUCount += TxAggCnt3.field.AggSize7Count;
3121 pAd->RalinkCounters.TxAgg8MPDUCount += TxAggCnt3.field.AggSize8Count;
3122 pAd->RalinkCounters.TxAgg9MPDUCount += TxAggCnt4.field.AggSize9Count;
3123 pAd->RalinkCounters.TxAgg10MPDUCount += TxAggCnt4.field.AggSize10Count;
3125 pAd->RalinkCounters.TxAgg11MPDUCount += TxAggCnt5.field.AggSize11Count;
3126 pAd->RalinkCounters.TxAgg12MPDUCount += TxAggCnt5.field.AggSize12Count;
3127 pAd->RalinkCounters.TxAgg13MPDUCount += TxAggCnt6.field.AggSize13Count;
3128 pAd->RalinkCounters.TxAgg14MPDUCount += TxAggCnt6.field.AggSize14Count;
3130 pAd->RalinkCounters.TxAgg15MPDUCount += TxAggCnt7.field.AggSize15Count;
3131 pAd->RalinkCounters.TxAgg16MPDUCount += TxAggCnt7.field.AggSize16Count;
3133 // Calculate the transmitted A-MPDU count
3134 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += TxAggCnt0.field.AggSize1Count;
3135 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt0.field.AggSize2Count / 2);
3137 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize3Count / 3);
3138 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize4Count / 4);
3140 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize5Count / 5);
3141 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize6Count / 6);
3143 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize7Count / 7);
3144 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize8Count / 8);
3146 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize9Count / 9);
3147 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize10Count / 10);
3149 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize11Count / 11);
3150 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize12Count / 12);
3152 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize13Count / 13);
3153 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize14Count / 14);
3155 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize15Count / 15);
3156 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count / 16);
3161 RtmpDiagStruct *pDiag;
3162 COUNTER_RALINK *pRalinkCounters;
3163 UCHAR ArrayCurIdx, i;
3165 pDiag = &pAd->DiagStruct;
3166 pRalinkCounters = &pAd->RalinkCounters;
3167 ArrayCurIdx = pDiag->ArrayCurIdx;
3169 if (pDiag->inited == 0)
3171 NdisZeroMemory(pDiag, sizeof(struct _RtmpDiagStrcut_));
3172 pDiag->ArrayStartIdx = pDiag->ArrayCurIdx = 0;
3178 pDiag->TxFailCnt[ArrayCurIdx] = TxStaCnt0.field.TxFailCount;
3179 pDiag->TxAggCnt[ArrayCurIdx] = TxAggCnt.field.AggTxCount;
3180 pDiag->TxNonAggCnt[ArrayCurIdx] = TxAggCnt.field.NonAggTxCount;
3181 pDiag->TxAMPDUCnt[ArrayCurIdx][0] = TxAggCnt0.field.AggSize1Count;
3182 pDiag->TxAMPDUCnt[ArrayCurIdx][1] = TxAggCnt0.field.AggSize2Count;
3183 pDiag->TxAMPDUCnt[ArrayCurIdx][2] = TxAggCnt1.field.AggSize3Count;
3184 pDiag->TxAMPDUCnt[ArrayCurIdx][3] = TxAggCnt1.field.AggSize4Count;
3185 pDiag->TxAMPDUCnt[ArrayCurIdx][4] = TxAggCnt2.field.AggSize5Count;
3186 pDiag->TxAMPDUCnt[ArrayCurIdx][5] = TxAggCnt2.field.AggSize6Count;
3187 pDiag->TxAMPDUCnt[ArrayCurIdx][6] = TxAggCnt3.field.AggSize7Count;
3188 pDiag->TxAMPDUCnt[ArrayCurIdx][7] = TxAggCnt3.field.AggSize8Count;
3189 pDiag->TxAMPDUCnt[ArrayCurIdx][8] = TxAggCnt4.field.AggSize9Count;
3190 pDiag->TxAMPDUCnt[ArrayCurIdx][9] = TxAggCnt4.field.AggSize10Count;
3191 pDiag->TxAMPDUCnt[ArrayCurIdx][10] = TxAggCnt5.field.AggSize11Count;
3192 pDiag->TxAMPDUCnt[ArrayCurIdx][11] = TxAggCnt5.field.AggSize12Count;
3193 pDiag->TxAMPDUCnt[ArrayCurIdx][12] = TxAggCnt6.field.AggSize13Count;
3194 pDiag->TxAMPDUCnt[ArrayCurIdx][13] = TxAggCnt6.field.AggSize14Count;
3195 pDiag->TxAMPDUCnt[ArrayCurIdx][14] = TxAggCnt7.field.AggSize15Count;
3196 pDiag->TxAMPDUCnt[ArrayCurIdx][15] = TxAggCnt7.field.AggSize16Count;
3198 pDiag->RxCrcErrCnt[ArrayCurIdx] = RxStaCnt0.field.CrcErr;
3200 INC_RING_INDEX(pDiag->ArrayCurIdx, DIAGNOSE_TIME);
3201 ArrayCurIdx = pDiag->ArrayCurIdx;
3202 for (i =0; i < 9; i++)
3204 pDiag->TxDescCnt[ArrayCurIdx][i]= 0;
3205 pDiag->TxSWQueCnt[ArrayCurIdx][i] =0;
3206 pDiag->TxMcsCnt[ArrayCurIdx][i] = 0;
3207 pDiag->RxMcsCnt[ArrayCurIdx][i] = 0;
3209 pDiag->TxDataCnt[ArrayCurIdx] = 0;
3210 pDiag->TxFailCnt[ArrayCurIdx] = 0;
3211 pDiag->RxDataCnt[ArrayCurIdx] = 0;
3212 pDiag->RxCrcErrCnt[ArrayCurIdx] = 0;
3213 for (i = 9; i < 24; i++) // 3*3
3215 pDiag->TxDescCnt[ArrayCurIdx][i] = 0;
3216 pDiag->TxMcsCnt[ArrayCurIdx][i] = 0;
3217 pDiag->RxMcsCnt[ArrayCurIdx][i] = 0;
3220 if (pDiag->ArrayCurIdx == pDiag->ArrayStartIdx)
3221 INC_RING_INDEX(pDiag->ArrayStartIdx, DIAGNOSE_TIME);
3225 #endif // DBG_DIAGNOSE //
3232 ========================================================================
3234 Routine Description:
3235 Reset NIC from error
3238 Adapter Pointer to our adapter
3243 IRQL = PASSIVE_LEVEL
3246 Reset NIC from error state
3248 ========================================================================
3250 VOID NICResetFromError(
3251 IN PRTMP_ADAPTER pAd)
3253 // Reset BBP (according to alex, reset ASIC will force reset BBP
3254 // Therefore, skip the reset BBP
3255 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x2);
3257 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
3258 // Remove ASIC from reset state
3259 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
3261 NICInitializeAdapter(pAd, FALSE);
3262 NICInitAsicFromEEPROM(pAd);
3264 // Switch to current channel, since during reset process, the connection should remains on.
3265 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
3266 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
3270 ========================================================================
3272 Routine Description:
3273 erase 8051 firmware image in MAC ASIC
3276 Adapter Pointer to our adapter
3278 IRQL = PASSIVE_LEVEL
3280 ========================================================================
3282 VOID NICEraseFirmware(
3283 IN PRTMP_ADAPTER pAd)
3287 for(i=0; i<MAX_FIRMWARE_IMAGE_SIZE; i+=4)
3288 RTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, 0);
3290 }/* End of NICEraseFirmware */
3293 ========================================================================
3295 Routine Description:
3296 Load 8051 firmware RT2561.BIN file into MAC ASIC
3299 Adapter Pointer to our adapter
3302 NDIS_STATUS_SUCCESS firmware image load ok
3303 NDIS_STATUS_FAILURE image not found
3305 IRQL = PASSIVE_LEVEL
3307 ========================================================================
3309 NDIS_STATUS NICLoadFirmware(
3310 IN PRTMP_ADAPTER pAd)
3312 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
3313 PUCHAR pFirmwareImage;
3314 ULONG FileLength, Index;
3318 UINT32 Version = (pAd->MACVersion >> 16);
3321 pFirmwareImage = FirmwareImage;
3322 FileLength = sizeof(FirmwareImage);
3324 // New 8k byte firmware size for RT3071/RT3072
3325 //printk("Usb Chip\n");
3326 if (FIRMWAREIMAGE_LENGTH == FIRMWAREIMAGE_MAX_LENGTH)
3327 //The firmware image consists of two parts. One is the origianl and the other is the new.
3330 if ((Version != 0x2860) && (Version != 0x2872) && (Version != 0x3070))
3331 { // Use Firmware V2.
3332 //printk("KH:Use New Version,part2\n");
3333 pFirmwareImage = (PUCHAR)&FirmwareImage[FIRMWAREIMAGEV1_LENGTH];
3334 FileLength = FIRMWAREIMAGEV2_LENGTH;
3338 //printk("KH:Use New Version,part1\n");
3339 pFirmwareImage = FirmwareImage;
3340 FileLength = FIRMWAREIMAGEV1_LENGTH;
3345 DBGPRINT(RT_DEBUG_ERROR, ("KH: bin file should be 8KB.\n"));
3346 Status = NDIS_STATUS_FAILURE;
3351 RT28XX_WRITE_FIRMWARE(pAd, pFirmwareImage, FileLength);
3353 /* check if MCU is ready */
3357 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg);
3362 RTMPusecDelay(1000);
3363 } while (Index++ < 1000);
3367 Status = NDIS_STATUS_FAILURE;
3368 DBGPRINT(RT_DEBUG_ERROR, ("NICLoadFirmware: MCU is not ready\n\n\n"));
3371 DBGPRINT(RT_DEBUG_TRACE,
3372 ("<=== %s (status=%d)\n", __func__, Status));
3374 } /* End of NICLoadFirmware */
3378 ========================================================================
3380 Routine Description:
3381 Load Tx rate switching parameters
3384 Adapter Pointer to our adapter
3387 NDIS_STATUS_SUCCESS firmware image load ok
3388 NDIS_STATUS_FAILURE image not found
3390 IRQL = PASSIVE_LEVEL
3393 1. (B0: Valid Item number) (B1:Initial item from zero)
3394 2. Item Number(Dec) Mode(Hex) Current MCS(Dec) TrainUp(Dec) TrainDown(Dec)
3396 ========================================================================
3398 NDIS_STATUS NICLoadRateSwitchingParams(
3399 IN PRTMP_ADAPTER pAd)
3401 return NDIS_STATUS_SUCCESS;
3405 ========================================================================
3407 Routine Description:
3408 if pSrc1 all zero with length Length, return 0.
3409 If not all zero, return 1
3418 IRQL = DISPATCH_LEVEL
3422 ========================================================================
3424 ULONG RTMPNotAllZero(
3431 pMem1 = (PUCHAR) pSrc1;
3433 for (Index = 0; Index < Length; Index++)
3435 if (pMem1[Index] != 0x0)
3441 if (Index == Length)
3452 ========================================================================
3454 Routine Description:
3455 Compare two memory block
3458 pSrc1 Pointer to first memory address
3459 pSrc2 Pointer to second memory address
3463 1: pSrc1 memory is larger
3464 2: pSrc2 memory is larger
3466 IRQL = DISPATCH_LEVEL
3470 ========================================================================
3472 ULONG RTMPCompareMemory(
3481 pMem1 = (PUCHAR) pSrc1;
3482 pMem2 = (PUCHAR) pSrc2;
3484 for (Index = 0; Index < Length; Index++)
3486 if (pMem1[Index] > pMem2[Index])
3488 else if (pMem1[Index] < pMem2[Index])
3497 ========================================================================
3499 Routine Description:
3500 Zero out memory block
3503 pSrc1 Pointer to memory address
3509 IRQL = PASSIVE_LEVEL
3510 IRQL = DISPATCH_LEVEL
3514 ========================================================================
3516 VOID RTMPZeroMemory(
3523 pMem = (PUCHAR) pSrc;
3525 for (Index = 0; Index < Length; Index++)
3531 VOID RTMPFillMemory(
3539 pMem = (PUCHAR) pSrc;
3541 for (Index = 0; Index < Length; Index++)
3548 ========================================================================
3550 Routine Description:
3551 Copy data from memory block 1 to memory block 2
3554 pDest Pointer to destination memory address
3555 pSrc Pointer to source memory address
3561 IRQL = PASSIVE_LEVEL
3562 IRQL = DISPATCH_LEVEL
3566 ========================================================================
3568 VOID RTMPMoveMemory(
3577 ASSERT((Length==0) || (pDest && pSrc));
3579 pMem1 = (PUCHAR) pDest;
3580 pMem2 = (PUCHAR) pSrc;
3582 for (Index = 0; Index < Length; Index++)
3584 pMem1[Index] = pMem2[Index];
3589 ========================================================================
3591 Routine Description:
3592 Initialize port configuration structure
3595 Adapter Pointer to our adapter
3600 IRQL = PASSIVE_LEVEL
3604 ========================================================================
3607 IN PRTMP_ADAPTER pAd)
3609 UINT key_index, bss_index;
3611 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit\n"));
3614 // part I. intialize common configuration
3617 pAd->BulkOutReq = 0;
3619 pAd->BulkOutComplete = 0;
3620 pAd->BulkOutCompleteOther = 0;
3621 pAd->BulkOutCompleteCancel = 0;
3623 pAd->BulkInComplete = 0;
3624 pAd->BulkInCompleteFail = 0;
3626 //pAd->QuickTimerP = 100;
3627 //pAd->TurnAggrBulkInCount = 0;
3628 pAd->bUsbTxBulkAggre = 0;
3630 // init as unsed value to ensure driver will set to MCU once.
3631 pAd->LedIndicatorStregth = 0xFF;
3633 pAd->CommonCfg.MaxPktOneTxBulk = 2;
3634 pAd->CommonCfg.TxBulkFactor = 1;
3635 pAd->CommonCfg.RxBulkFactor =1;
3637 pAd->CommonCfg.TxPower = 100; //mW
3639 NdisZeroMemory(&pAd->CommonCfg.IOTestParm, sizeof(pAd->CommonCfg.IOTestParm));
3642 for(key_index=0; key_index<SHARE_KEY_NUM; key_index++)
3644 for(bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++)
3646 pAd->SharedKey[bss_index][key_index].KeyLen = 0;
3647 pAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE;
3652 pAd->EepromAccess = FALSE;
3654 pAd->Antenna.word = 0;
3655 pAd->CommonCfg.BBPCurrentBW = BW_20;
3657 pAd->LedCntl.word = 0;
3659 pAd->LedIndicatorStregth = 0;
3660 pAd->RLnkCtrlOffset = 0;
3661 pAd->HostLnkCtrlOffset = 0;
3662 pAd->CheckDmaBusyCount = 0;
3665 pAd->bAutoTxAgcA = FALSE; // Default is OFF
3666 pAd->bAutoTxAgcG = FALSE; // Default is OFF
3667 pAd->RfIcType = RFIC_2820;
3669 // Init timer for reset complete event
3670 pAd->CommonCfg.CentralChannel = 1;
3671 pAd->bForcePrintTX = FALSE;
3672 pAd->bForcePrintRX = FALSE;
3673 pAd->bStaFifoTest = FALSE;
3674 pAd->bProtectionTest = FALSE;
3675 pAd->bHCCATest = FALSE;
3676 pAd->bGenOneHCCA = FALSE;
3677 pAd->CommonCfg.Dsifs = 10; // in units of usec
3678 pAd->CommonCfg.TxPower = 100; //mW
3679 pAd->CommonCfg.TxPowerPercentage = 0xffffffff; // AUTO
3680 pAd->CommonCfg.TxPowerDefault = 0xffffffff; // AUTO
3681 pAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; // use Long preamble on TX by defaut
3682 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
3683 pAd->CommonCfg.RtsThreshold = 2347;
3684 pAd->CommonCfg.FragmentThreshold = 2346;
3685 pAd->CommonCfg.UseBGProtection = 0; // 0: AUTO
3686 pAd->CommonCfg.bEnableTxBurst = TRUE; //0;
3687 pAd->CommonCfg.PhyMode = 0xff; // unknown
3688 pAd->CommonCfg.BandState = UNKNOWN_BAND;
3689 pAd->CommonCfg.RadarDetect.CSPeriod = 10;
3690 pAd->CommonCfg.RadarDetect.CSCount = 0;
3691 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
3692 pAd->CommonCfg.RadarDetect.ChMovingTime = 65;
3693 pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 3;
3694 pAd->CommonCfg.bAPSDCapable = FALSE;
3695 pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
3696 pAd->CommonCfg.TriggerTimerCount = 0;
3697 pAd->CommonCfg.bAPSDForcePowerSave = FALSE;
3698 pAd->CommonCfg.bCountryFlag = FALSE;
3699 pAd->CommonCfg.TxStream = 0;
3700 pAd->CommonCfg.RxStream = 0;
3702 NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI));
3704 NdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
3705 pAd->HTCEnable = FALSE;
3706 pAd->bBroadComHT = FALSE;
3707 pAd->CommonCfg.bRdg = FALSE;
3709 NdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
3710 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
3711 pAd->CommonCfg.BACapability.field.MpduDensity = 0;
3712 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
3713 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; //32;
3714 pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; //32;
3715 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit. BACapability = 0x%x\n", pAd->CommonCfg.BACapability.word));
3717 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
3718 BATableInit(pAd, &pAd->BATable);
3720 pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
3721 pAd->CommonCfg.bHTProtect = 1;
3722 pAd->CommonCfg.bMIMOPSEnable = TRUE;
3723 pAd->CommonCfg.bBADecline = FALSE;
3724 pAd->CommonCfg.bDisableReordering = FALSE;
3726 pAd->CommonCfg.TxBASize = 7;
3728 pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
3730 //pAd->CommonCfg.HTPhyMode.field.BW = BW_20;
3731 //pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO;
3732 //pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800;
3733 //pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE;
3734 pAd->CommonCfg.TxRate = RATE_6;
3736 pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;
3737 pAd->CommonCfg.MlmeTransmit.field.BW = BW_20;
3738 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
3740 pAd->CommonCfg.BeaconPeriod = 100; // in mSec
3743 // part II. intialize STA specific configuration
3746 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT);
3747 RX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST);
3748 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);
3749 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);
3751 pAd->StaCfg.Psm = PWR_ACTIVE;
3753 pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled;
3754 pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;
3755 pAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled;
3756 pAd->StaCfg.bMixCipher = FALSE;
3757 pAd->StaCfg.DefaultKeyId = 0;
3759 // 802.1x port control
3760 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
3761 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
3762 pAd->StaCfg.LastMicErrorTime = 0;
3763 pAd->StaCfg.MicErrCnt = 0;
3764 pAd->StaCfg.bBlockAssoc = FALSE;
3765 pAd->StaCfg.WpaState = SS_NOTUSE;
3767 pAd->CommonCfg.NdisRadioStateOff = FALSE; // New to support microsoft disable radio with OID command
3769 pAd->StaCfg.RssiTrigger = 0;
3770 NdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(RSSI_SAMPLE));
3771 pAd->StaCfg.RssiTriggerMode = RSSI_TRIGGERED_UPON_BELOW_THRESHOLD;
3772 pAd->StaCfg.AtimWin = 0;
3773 pAd->StaCfg.DefaultListenCount = 3;//default listen count;
3774 pAd->StaCfg.BssType = BSS_INFRA; // BSS_INFRA or BSS_ADHOC or BSS_MONITOR
3775 pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
3776 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
3777 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
3779 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
3780 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
3783 // global variables mXXXX used in MAC protocol state machines
3784 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
3785 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
3786 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
3788 // PHY specification
3789 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; // default PHY mode
3790 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); // CCK use LONG preamble
3793 // user desired power mode
3794 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
3795 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
3796 pAd->StaCfg.bWindowsACCAMEnable = FALSE;
3798 RTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer, GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec), pAd, FALSE);
3799 pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
3802 pAd->StaCfg.ScanCnt = 0;
3804 // CCX 2.0 control flag init
3805 pAd->StaCfg.CCXEnable = FALSE;
3806 pAd->StaCfg.CCXReqType = MSRN_TYPE_UNUSED;
3807 pAd->StaCfg.CCXQosECWMin = 4;
3808 pAd->StaCfg.CCXQosECWMax = 10;
3810 pAd->StaCfg.bHwRadio = TRUE; // Default Hardware Radio status is On
3811 pAd->StaCfg.bSwRadio = TRUE; // Default Software Radio status is On
3812 pAd->StaCfg.bRadio = TRUE; // bHwRadio && bSwRadio
3813 pAd->StaCfg.bHardwareRadio = FALSE; // Default is OFF
3814 pAd->StaCfg.bShowHiddenSSID = FALSE; // Default no show
3816 // Nitro mode control
3817 pAd->StaCfg.bAutoReconnect = TRUE;
3819 // Save the init time as last scan time, the system should do scan after 2 seconds.
3820 // This patch is for driver wake up from standby mode, system will do scan right away.
3821 pAd->StaCfg.LastScanTime = 0;
3822 NdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE+1);
3823 sprintf(pAd->nickname, "%s", STA_NIC_DEVICE_NAME);
3824 RTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer, GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc), pAd, FALSE);
3825 pAd->StaCfg.IEEE8021X = FALSE;
3826 pAd->StaCfg.IEEE8021x_required_keys = FALSE;
3827 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
3828 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
3831 // Default for extra information is not valid
3832 pAd->ExtraInfo = EXTRA_INFO_CLEAR;
3834 // Default Config change flag
3835 pAd->bConfigChanged = FALSE;
3838 // part III. AP configurations
3845 // dynamic BBP R66:sensibity tuning to overcome background noise
3846 pAd->BbpTuning.bEnable = TRUE;
3847 pAd->BbpTuning.FalseCcaLowerThreshold = 100;
3848 pAd->BbpTuning.FalseCcaUpperThreshold = 512;
3849 pAd->BbpTuning.R66Delta = 4;
3850 pAd->Mlme.bEnableAutoAntennaCheck = TRUE;
3853 // Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value.
3854 // if not initial this value, the default value will be 0.
3856 pAd->BbpTuning.R66CurrentValue = 0x38;
3858 pAd->Bbp94 = BBPR94_DEFAULT;
3859 pAd->BbpForCCK = FALSE;
3861 // initialize MAC table and allocate spin lock
3862 NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));
3863 InitializeQueueHeader(&pAd->MacTab.McastPsQueue);
3864 NdisAllocateSpinLock(&pAd->MacTabLock);
3866 pAd->CommonCfg.bWiFiTest = FALSE;
3868 pAd->bPCIclkOff = FALSE;
3870 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
3872 DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
3875 // IRQL = PASSIVE_LEVEL
3878 if (ch >= '0' && ch <= '9') return (ch - '0'); // Handle numerals
3879 if (ch >= 'A' && ch <= 'F') return (ch - 'A' + 0xA); // Handle capitol hex digits
3880 if (ch >= 'a' && ch <= 'f') return (ch - 'a' + 0xA); // Handle small hex digits
3885 // FUNCTION: AtoH(char *, UCHAR *, int)
3887 // PURPOSE: Converts ascii string to network order hex
3890 // src - pointer to input ascii string
3891 // dest - pointer to output hex
3892 // destlen - size of dest
3896 // 2 ascii bytes make a hex byte so must put 1st ascii byte of pair
3897 // into upper nibble and 2nd ascii byte of pair into lower nibble.
3899 // IRQL = PASSIVE_LEVEL
3901 void AtoH(char * src, UCHAR * dest, int destlen)
3907 destTemp = (PUCHAR) dest;
3911 *destTemp = BtoH(*srcptr++) << 4; // Put 1st ascii byte in upper nibble.
3912 *destTemp += BtoH(*srcptr++); // Add 2nd ascii byte to above.
3917 VOID RTMPPatchMacBbpBug(
3918 IN PRTMP_ADAPTER pAd)
3922 // Initialize BBP register to default value
3923 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
3925 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, (UCHAR)BBPRegTable[Index].Value);
3928 // Initialize RF register to default value
3929 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
3930 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
3932 // Re-init BBP register from EEPROM value
3933 NICInitAsicFromEEPROM(pAd);
3937 ========================================================================
3939 Routine Description:
3943 pAd Pointer to our adapter
3944 pTimer Timer structure
3945 pTimerFunc Function to execute when timer expired
3946 Repeat Ture for period timer
3953 ========================================================================
3956 IN PRTMP_ADAPTER pAd,
3957 IN PRALINK_TIMER_STRUCT pTimer,
3958 IN PVOID pTimerFunc,
3963 // Set Valid to TRUE for later used.
3964 // It will crash if we cancel a timer or set a timer
3965 // that we haven't initialize before.
3967 pTimer->Valid = TRUE;
3969 pTimer->PeriodicType = Repeat;
3970 pTimer->State = FALSE;
3971 pTimer->cookie = (ULONG) pData;
3977 RTMP_OS_Init_Timer(pAd, &pTimer->TimerObj, pTimerFunc, (PVOID) pTimer);
3981 ========================================================================
3983 Routine Description:
3987 pTimer Timer structure
3988 Value Timer value in milliseconds
3994 To use this routine, must call RTMPInitTimer before.
3996 ========================================================================
3999 IN PRALINK_TIMER_STRUCT pTimer,
4004 pTimer->TimerValue = Value;
4005 pTimer->State = FALSE;
4006 if (pTimer->PeriodicType == TRUE)
4008 pTimer->Repeat = TRUE;
4009 RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);
4013 pTimer->Repeat = FALSE;
4014 RTMP_OS_Add_Timer(&pTimer->TimerObj, Value);
4019 DBGPRINT_ERR(("RTMPSetTimer failed, Timer hasn't been initialize!\n"));
4025 ========================================================================
4027 Routine Description:
4031 pTimer Timer structure
4032 Value Timer value in milliseconds
4038 To use this routine, must call RTMPInitTimer before.
4040 ========================================================================
4043 IN PRALINK_TIMER_STRUCT pTimer,
4050 pTimer->TimerValue = Value;
4051 pTimer->State = FALSE;
4052 if (pTimer->PeriodicType == TRUE)
4054 RTMPCancelTimer(pTimer, &Cancel);
4055 RTMPSetTimer(pTimer, Value);
4059 RTMP_OS_Mod_Timer(&pTimer->TimerObj, Value);
4064 DBGPRINT_ERR(("RTMPModTimer failed, Timer hasn't been initialize!\n"));
4069 ========================================================================
4071 Routine Description:
4072 Cancel timer objects
4075 Adapter Pointer to our adapter
4080 IRQL = PASSIVE_LEVEL
4081 IRQL = DISPATCH_LEVEL
4084 1.) To use this routine, must call RTMPInitTimer before.
4085 2.) Reset NIC to initial state AS IS system boot up time.
4087 ========================================================================
4089 VOID RTMPCancelTimer(
4090 IN PRALINK_TIMER_STRUCT pTimer,
4091 OUT BOOLEAN *pCancelled)
4095 if (pTimer->State == FALSE)
4096 pTimer->Repeat = FALSE;
4097 RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);
4099 if (*pCancelled == TRUE)
4100 pTimer->State = TRUE;
4103 // We need to go-through the TimerQ to findout this timer handler and remove it if
4104 // it's still waiting for execution.
4106 RT2870_TimerQ_Remove(pTimer->pAd, pTimer);
4112 // NdisMCancelTimer just canced the timer and not mean release the timer.
4113 // And don't set the "Valid" to False. So that we can use this timer again.
4115 DBGPRINT_ERR(("RTMPCancelTimer failed, Timer hasn't been initialize!\n"));
4120 ========================================================================
4122 Routine Description:
4126 pAd Pointer to our adapter
4132 IRQL = PASSIVE_LEVEL
4133 IRQL = DISPATCH_LEVEL
4137 ========================================================================
4140 IN PRTMP_ADAPTER pAd,
4147 LowByte = pAd->LedCntl.field.LedMode&0x7f;
4152 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4153 pAd->LedIndicatorStregth = 0;
4156 if (pAd->CommonCfg.Channel > 14)
4160 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4164 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4167 LowByte = 0; // Driver sets MAC register and MAC controls LED
4170 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4174 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4176 case LED_ON_SITE_SURVEY:
4178 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4182 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
4185 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetLED::Unknown Status %d\n", Status));
4190 // Keep LED status for LED SiteSurvey mode.
4191 // After SiteSurvey, we will set the LED mode to previous status.
4193 if ((Status != LED_ON_SITE_SURVEY) && (Status != LED_POWER_UP))
4194 pAd->LedStatus = Status;
4196 DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetLED::Mode=%d,HighByte=0x%02x,LowByte=0x%02x\n", pAd->LedCntl.field.LedMode, HighByte, LowByte));
4200 ========================================================================
4202 Routine Description:
4203 Set LED Signal Stregth
4206 pAd Pointer to our adapter
4212 IRQL = PASSIVE_LEVEL
4215 Can be run on any IRQL level.
4217 According to Microsoft Zero Config Wireless Signal Stregth definition as belows.
4224 ========================================================================
4226 VOID RTMPSetSignalLED(
4227 IN PRTMP_ADAPTER pAd,
4228 IN NDIS_802_11_RSSI Dbm)
4233 // if not Signal Stregth, then do nothing.
4235 if (pAd->LedCntl.field.LedMode != LED_MODE_SIGNAL_STREGTH)
4242 else if (Dbm <= -81)
4244 else if (Dbm <= -71)
4246 else if (Dbm <= -67)
4248 else if (Dbm <= -57)
4254 // Update Signal Stregth to firmware if changed.
4256 if (pAd->LedIndicatorStregth != nLed)
4258 AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed, pAd->LedCntl.field.Polarity);
4259 pAd->LedIndicatorStregth = nLed;
4264 ========================================================================
4266 Routine Description:
4270 pAd Pointer to our adapter
4275 IRQL <= DISPATCH_LEVEL
4278 Before Enable RX, make sure you have enabled Interrupt.
4279 ========================================================================
4281 VOID RTMPEnableRxTx(
4282 IN PRTMP_ADAPTER pAd)
4284 DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n"));
4287 RT28XXDMAEnable(pAd);
4289 // enable RX of MAC block
4290 if (pAd->OpMode == OPMODE_AP)
4292 UINT32 rx_filter_flag = APNORMAL;
4295 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); // enable RX of DMA block
4299 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL); // Staion not drop control frame will fail WiFi Certification.
4302 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);
4303 DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPEnableRxTx\n"));