2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
31 Miniport generic portion header file
35 -------- ---------- ----------------------------------------------
36 Paul Lin 2002-08-01 created
37 John Chang 2004-08-20 RT2561/2661 use scatter-gather scheme
38 Jan Lee 2006-09-15 RT2860. Change for 802.11n , EEPROM, Led, BA, HT.
40 #include "../rt_config.h"
44 #include <linux/bitrev.h>
47 #include "../../rt2870/common/firmware.h"
51 #include "../../rt3070/firmware.h"
54 UCHAR BIT8[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
55 ULONG BIT32[] = {0x00000001, 0x00000002, 0x00000004, 0x00000008,
56 0x00000010, 0x00000020, 0x00000040, 0x00000080,
57 0x00000100, 0x00000200, 0x00000400, 0x00000800,
58 0x00001000, 0x00002000, 0x00004000, 0x00008000,
59 0x00010000, 0x00020000, 0x00040000, 0x00080000,
60 0x00100000, 0x00200000, 0x00400000, 0x00800000,
61 0x01000000, 0x02000000, 0x04000000, 0x08000000,
62 0x10000000, 0x20000000, 0x40000000, 0x80000000};
64 char* CipherName[] = {"none","wep64","wep128","TKIP","AES","CKIP64","CKIP128"};
66 const unsigned short ccitt_16Table[] = {
67 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
68 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
69 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
70 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
71 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
72 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
73 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
74 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
75 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
76 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
77 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
78 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
79 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
80 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
81 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
82 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
83 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
84 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
85 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
86 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
87 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
88 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
89 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
90 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
91 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
92 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
93 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
94 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
95 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
96 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
97 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
98 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
100 #define ByteCRC16(v, crc) \
101 (unsigned short)((crc << 8) ^ ccitt_16Table[((crc >> 8) ^ (v)) & 255])
104 unsigned char BitReverse(unsigned char x)
107 unsigned char Temp=0;
110 if(x & 0x80) Temp |= 0x80;
120 // BBP register initialization set
122 REG_PAIR BBPRegTable[] = {
123 {BBP_R65, 0x2C}, // fix rssi issue
124 {BBP_R66, 0x38}, // Also set this default value to pAd->BbpTuning.R66CurrentValue at initial
126 {BBP_R70, 0xa}, // BBP_R70 will change to 0x8 in ApStartUp and LinkUp for rt2860C, otherwise value is 0xa
131 {BBP_R84, 0x99}, // 0x19 is for rt2860E and after. This is for extension channel overlapping IOT. 0x99 is for rt2860D and before
132 {BBP_R86, 0x00}, // middle range issue, Rory @2008-01-28
133 {BBP_R91, 0x04}, // middle range issue, Rory @2008-01-28
134 {BBP_R92, 0x00}, // middle range issue, Rory @2008-01-28
135 {BBP_R103, 0x00}, // near range high-power issue, requested from Gary @2008-0528
136 {BBP_R105, 0x05}, // 0x05 is for rt2860E to turn on FEQ control. It is safe for rt2860D and before, because Bit 7:2 are reserved in rt2860D and before.
138 #define NUM_BBP_REG_PARMS (sizeof(BBPRegTable) / sizeof(REG_PAIR))
141 // RF register initialization set
144 REG_PAIR RT30xx_RFRegTable[] = {
173 #define NUM_RF_REG_PARMS (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR))
177 // ASIC register initialization sets
180 RTMP_REG_PAIR MACRegTable[] = {
181 #if defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x200)
182 {BCN_OFFSET0, 0xf8f0e8e0}, /* 0x3800(e0), 0x3A00(e8), 0x3C00(f0), 0x3E00(f8), 512B for each beacon */
183 {BCN_OFFSET1, 0x6f77d0c8}, /* 0x3200(c8), 0x3400(d0), 0x1DC0(77), 0x1BC0(6f), 512B for each beacon */
184 #elif defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x100)
185 {BCN_OFFSET0, 0xece8e4e0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
186 {BCN_OFFSET1, 0xfcf8f4f0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
188 #error You must re-calculate new value for BCN_OFFSET0 & BCN_OFFSET1 in MACRegTable[]!!!
189 #endif // HW_BEACON_OFFSET //
191 {LEGACY_BASIC_RATE, 0x0000013f}, // Basic rate set bitmap
192 {HT_BASIC_RATE, 0x00008003}, // Basic HT rate set , 20M, MCS=3, MM. Format is the same as in TXWI.
193 {MAC_SYS_CTRL, 0x00}, // 0x1004, , default Disable RX
194 {RX_FILTR_CFG, 0x17f97}, //0x1400 , RX filter control,
195 {BKOFF_SLOT_CFG, 0x209}, // default set short slot time, CC_DELAY_TIME should be 2
196 {TX_SW_CFG0, 0x0}, // Gary,2008-05-21 for CWC test
197 {TX_SW_CFG1, 0x80606}, // Gary,2006-08-23
198 {TX_LINK_CFG, 0x1020}, // Gary,2006-08-23
199 {TX_TIMEOUT_CFG, 0x000a2090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT , Modify for 2860E ,2007-08-01
200 {MAX_LEN_CFG, MAX_AGGREGATION_SIZE | 0x00001000}, // 0x3018, MAX frame length. Max PSDU = 16kbytes.
201 {LED_CFG, 0x7f031e46}, // Gary, 2006-08-23
202 {PBF_MAX_PCNT, 0x1F3FBF9F}, //0x1F3f7f9f}, //Jan, 2006/04/20
203 {TX_RTY_CFG, 0x47d01f0f}, // Jan, 2006/11/16, Set TxWI->ACK =0 in Probe Rsp Modify for 2860E ,2007-08-03
204 {AUTO_RSP_CFG, 0x00000013}, // Initial Auto_Responder, because QA will turn off Auto-Responder
205 {CCK_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled.
206 {OFDM_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled.
207 //PS packets use Tx1Q (for HCCA) when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)
209 {PBF_CFG, 0xf40006}, // Only enable Queue 2
210 {MM40_PROT_CFG, 0x3F44084}, // Initial Auto_Responder, because QA will turn off Auto-Responder
211 {WPDMA_GLO_CFG, 0x00000030},
213 {GF20_PROT_CFG, 0x01744004}, // set 19:18 --> Short NAV for MIMO PS
214 {GF40_PROT_CFG, 0x03F44084},
215 {MM20_PROT_CFG, 0x01744004},
217 {MM40_PROT_CFG, 0x03F54084},
219 {TXOP_CTRL_CFG, 0x0000583f, /*0x0000243f*/ /*0x000024bf*/}, //Extension channel backoff.
220 {TX_RTS_CFG, 0x00092b20},
221 {EXP_ACK_TIME, 0x002400ca}, // default value
222 {TXOP_HLDR_ET, 0x00000002},
224 /* Jerry comments 2008/01/16: we use SIFS = 10us in CCK defaultly, but it seems that 10us
225 is too small for INTEL 2200bg card, so in MBSS mode, the delta time between beacon0
226 and beacon1 is SIFS (10us), so if INTEL 2200bg card connects to BSS0, the ping
227 will always lost. So we change the SIFS of CCK from 10us to 16us. */
228 {XIFS_TIME_CFG, 0x33a41010},
229 {PWR_PIN_CFG, 0x00000003}, // patch for 2880-E
232 RTMP_REG_PAIR STAMACRegTable[] = {
233 {WMM_AIFSN_CFG, 0x00002273},
234 {WMM_CWMIN_CFG, 0x00002344},
235 {WMM_CWMAX_CFG, 0x000034aa},
238 #define NUM_MAC_REG_PARMS (sizeof(MACRegTable) / sizeof(RTMP_REG_PAIR))
239 #define NUM_STA_MAC_REG_PARMS (sizeof(STAMACRegTable) / sizeof(RTMP_REG_PAIR))
243 // RT2870 Firmware Spec only used 1 oct for version expression
245 #define FIRMWARE_MINOR_VERSION 7
249 // New 8k byte firmware size for RT3071/RT3072
250 #define FIRMWAREIMAGE_MAX_LENGTH 0x2000
251 #define FIRMWAREIMAGE_LENGTH (sizeof (FirmwareImage) / sizeof(UCHAR))
252 #define FIRMWARE_MAJOR_VERSION 0
254 #define FIRMWAREIMAGEV1_LENGTH 0x1000
255 #define FIRMWAREIMAGEV2_LENGTH 0x1000
258 #define FIRMWARE_MINOR_VERSION 2
263 ========================================================================
266 Allocate RTMP_ADAPTER data block and do some initialization
269 Adapter Pointer to our adapter
279 ========================================================================
281 NDIS_STATUS RTMPAllocAdapterBlock(
283 OUT PRTMP_ADAPTER *ppAdapter)
288 UCHAR *pBeaconBuf = NULL;
290 DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocAdapterBlock\n"));
296 // Allocate RTMP_ADAPTER memory block
297 pBeaconBuf = kmalloc(MAX_BEACON_SIZE, MEM_ALLOC_FLAG);
298 if (pBeaconBuf == NULL)
300 Status = NDIS_STATUS_FAILURE;
301 DBGPRINT_ERR(("Failed to allocate memory - BeaconBuf!\n"));
305 Status = AdapterBlockAllocateMemory(handle, (PVOID *)&pAd);
306 if (Status != NDIS_STATUS_SUCCESS)
308 DBGPRINT_ERR(("Failed to allocate memory - ADAPTER\n"));
311 pAd->BeaconBuf = pBeaconBuf;
312 printk("\n\n=== pAd = %p, size = %d ===\n\n", pAd, (UINT32)sizeof(RTMP_ADAPTER));
316 NdisAllocateSpinLock(&pAd->MgmtRingLock);
318 NdisAllocateSpinLock(&pAd->RxRingLock);
321 for (index =0 ; index < NUM_OF_TX_RING; index++)
323 NdisAllocateSpinLock(&pAd->TxSwQueueLock[index]);
324 NdisAllocateSpinLock(&pAd->DeQueueLock[index]);
325 pAd->DeQueueRunning[index] = FALSE;
328 NdisAllocateSpinLock(&pAd->irq_lock);
332 if ((Status != NDIS_STATUS_SUCCESS) && (pBeaconBuf))
337 DBGPRINT_S(Status, ("<-- RTMPAllocAdapterBlock, Status=%x\n", Status));
342 ========================================================================
345 Read initial Tx power per MCS and BW from EEPROM
348 Adapter Pointer to our adapter
357 ========================================================================
359 VOID RTMPReadTxPwrPerRate(
360 IN PRTMP_ADAPTER pAd)
362 ULONG data, Adata, Gdata;
363 USHORT i, value, value2;
364 INT Apwrdelta, Gpwrdelta;
366 BOOLEAN bValid, bApwrdeltaMinus = TRUE, bGpwrdeltaMinus = TRUE;
369 // Get power delta for 20MHz and 40MHz.
371 DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n"));
372 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);
376 if ((value2 & 0xff) != 0xff)
379 Gpwrdelta = (value2&0xf);
382 bGpwrdeltaMinus = FALSE;
384 bGpwrdeltaMinus = TRUE;
386 if ((value2 & 0xff00) != 0xff00)
388 if ((value2 & 0x8000))
389 Apwrdelta = ((value2&0xf00)>>8);
391 if ((value2 & 0x4000))
392 bApwrdeltaMinus = FALSE;
394 bApwrdeltaMinus = TRUE;
396 DBGPRINT(RT_DEBUG_TRACE, ("Gpwrdelta = %x, Apwrdelta = %x .\n", Gpwrdelta, Apwrdelta));
399 // Get Txpower per MCS for 20MHz in 2.4G.
403 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4, value);
405 if (bApwrdeltaMinus == FALSE)
407 t1 = (value&0xf)+(Apwrdelta);
410 t2 = ((value&0xf0)>>4)+(Apwrdelta);
413 t3 = ((value&0xf00)>>8)+(Apwrdelta);
416 t4 = ((value&0xf000)>>12)+(Apwrdelta);
422 if ((value&0xf) > Apwrdelta)
423 t1 = (value&0xf)-(Apwrdelta);
426 if (((value&0xf0)>>4) > Apwrdelta)
427 t2 = ((value&0xf0)>>4)-(Apwrdelta);
430 if (((value&0xf00)>>8) > Apwrdelta)
431 t3 = ((value&0xf00)>>8)-(Apwrdelta);
434 if (((value&0xf000)>>12) > Apwrdelta)
435 t4 = ((value&0xf000)>>12)-(Apwrdelta);
439 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
440 if (bGpwrdeltaMinus == FALSE)
442 t1 = (value&0xf)+(Gpwrdelta);
445 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
448 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
451 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
457 if ((value&0xf) > Gpwrdelta)
458 t1 = (value&0xf)-(Gpwrdelta);
461 if (((value&0xf0)>>4) > Gpwrdelta)
462 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
465 if (((value&0xf00)>>8) > Gpwrdelta)
466 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
469 if (((value&0xf000)>>12) > Gpwrdelta)
470 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
474 Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
476 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2, value);
477 if (bApwrdeltaMinus == FALSE)
479 t1 = (value&0xf)+(Apwrdelta);
482 t2 = ((value&0xf0)>>4)+(Apwrdelta);
485 t3 = ((value&0xf00)>>8)+(Apwrdelta);
488 t4 = ((value&0xf000)>>12)+(Apwrdelta);
494 if ((value&0xf) > Apwrdelta)
495 t1 = (value&0xf)-(Apwrdelta);
498 if (((value&0xf0)>>4) > Apwrdelta)
499 t2 = ((value&0xf0)>>4)-(Apwrdelta);
502 if (((value&0xf00)>>8) > Apwrdelta)
503 t3 = ((value&0xf00)>>8)-(Apwrdelta);
506 if (((value&0xf000)>>12) > Apwrdelta)
507 t4 = ((value&0xf000)>>12)-(Apwrdelta);
511 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
512 if (bGpwrdeltaMinus == FALSE)
514 t1 = (value&0xf)+(Gpwrdelta);
517 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
520 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
523 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
529 if ((value&0xf) > Gpwrdelta)
530 t1 = (value&0xf)-(Gpwrdelta);
533 if (((value&0xf0)>>4) > Gpwrdelta)
534 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
537 if (((value&0xf00)>>8) > Gpwrdelta)
538 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
541 if (((value&0xf000)>>12) > Gpwrdelta)
542 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
546 Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
549 pAd->Tx20MPwrCfgABand[i] = pAd->Tx40MPwrCfgABand[i] = Adata;
550 pAd->Tx20MPwrCfgGBand[i] = pAd->Tx40MPwrCfgGBand[i] = Gdata;
552 if (data != 0xffffffff)
553 RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, data);
554 DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 2.4G band-%lx, Adata = %lx, Gdata = %lx \n", data, Adata, Gdata));
558 // Check this block is valid for 40MHz in 2.4G. If invalid, use parameter for 20MHz in 2.4G
563 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + 2 + i*2, value);
564 if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
572 // Get Txpower per MCS for 40MHz in 2.4G.
578 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4, value);
579 if (bGpwrdeltaMinus == FALSE)
581 t1 = (value&0xf)+(Gpwrdelta);
584 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
587 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
590 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
596 if ((value&0xf) > Gpwrdelta)
597 t1 = (value&0xf)-(Gpwrdelta);
600 if (((value&0xf0)>>4) > Gpwrdelta)
601 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
604 if (((value&0xf00)>>8) > Gpwrdelta)
605 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
608 if (((value&0xf000)>>12) > Gpwrdelta)
609 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
613 Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
615 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4 + 2, value);
616 if (bGpwrdeltaMinus == FALSE)
618 t1 = (value&0xf)+(Gpwrdelta);
621 t2 = ((value&0xf0)>>4)+(Gpwrdelta);
624 t3 = ((value&0xf00)>>8)+(Gpwrdelta);
627 t4 = ((value&0xf000)>>12)+(Gpwrdelta);
633 if ((value&0xf) > Gpwrdelta)
634 t1 = (value&0xf)-(Gpwrdelta);
637 if (((value&0xf0)>>4) > Gpwrdelta)
638 t2 = ((value&0xf0)>>4)-(Gpwrdelta);
641 if (((value&0xf00)>>8) > Gpwrdelta)
642 t3 = ((value&0xf00)>>8)-(Gpwrdelta);
645 if (((value&0xf000)>>12) > Gpwrdelta)
646 t4 = ((value&0xf000)>>12)-(Gpwrdelta);
650 Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
653 pAd->Tx40MPwrCfgGBand[i+1] = (pAd->Tx40MPwrCfgGBand[i+1] & 0x0000FFFF) | (Gdata & 0xFFFF0000);
655 pAd->Tx40MPwrCfgGBand[i+1] = Gdata;
657 DBGPRINT_RAW(RT_DEBUG_TRACE, ("40MHz BW, 2.4G band, Gdata = %lx \n", Gdata));
662 // Check this block is valid for 20MHz in 5G. If invalid, use parameter for 20MHz in 2.4G
667 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + 2 + i*2, value);
668 if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
676 // Get Txpower per MCS for 20MHz in 5G.
682 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4, value);
683 if (bApwrdeltaMinus == FALSE)
685 t1 = (value&0xf)+(Apwrdelta);
688 t2 = ((value&0xf0)>>4)+(Apwrdelta);
691 t3 = ((value&0xf00)>>8)+(Apwrdelta);
694 t4 = ((value&0xf000)>>12)+(Apwrdelta);
700 if ((value&0xf) > Apwrdelta)
701 t1 = (value&0xf)-(Apwrdelta);
704 if (((value&0xf0)>>4) > Apwrdelta)
705 t2 = ((value&0xf0)>>4)-(Apwrdelta);
708 if (((value&0xf00)>>8) > Apwrdelta)
709 t3 = ((value&0xf00)>>8)-(Apwrdelta);
712 if (((value&0xf000)>>12) > Apwrdelta)
713 t4 = ((value&0xf000)>>12)-(Apwrdelta);
717 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
719 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4 + 2, value);
720 if (bApwrdeltaMinus == FALSE)
722 t1 = (value&0xf)+(Apwrdelta);
725 t2 = ((value&0xf0)>>4)+(Apwrdelta);
728 t3 = ((value&0xf00)>>8)+(Apwrdelta);
731 t4 = ((value&0xf000)>>12)+(Apwrdelta);
737 if ((value&0xf) > Apwrdelta)
738 t1 = (value&0xf)-(Apwrdelta);
741 if (((value&0xf0)>>4) > Apwrdelta)
742 t2 = ((value&0xf0)>>4)-(Apwrdelta);
745 if (((value&0xf00)>>8) > Apwrdelta)
746 t3 = ((value&0xf00)>>8)-(Apwrdelta);
749 if (((value&0xf000)>>12) > Apwrdelta)
750 t4 = ((value&0xf000)>>12)-(Apwrdelta);
754 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
757 pAd->Tx20MPwrCfgABand[i] = (pAd->Tx20MPwrCfgABand[i] & 0x0000FFFF) | (Adata & 0xFFFF0000);
759 pAd->Tx20MPwrCfgABand[i] = Adata;
761 DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 5GHz band, Adata = %lx \n", Adata));
766 // Check this block is valid for 40MHz in 5G. If invalid, use parameter for 20MHz in 2.4G
771 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + 2 + i*2, value);
772 if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
780 // Get Txpower per MCS for 40MHz in 5G.
786 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4, value);
787 if (bApwrdeltaMinus == FALSE)
789 t1 = (value&0xf)+(Apwrdelta);
792 t2 = ((value&0xf0)>>4)+(Apwrdelta);
795 t3 = ((value&0xf00)>>8)+(Apwrdelta);
798 t4 = ((value&0xf000)>>12)+(Apwrdelta);
804 if ((value&0xf) > Apwrdelta)
805 t1 = (value&0xf)-(Apwrdelta);
808 if (((value&0xf0)>>4) > Apwrdelta)
809 t2 = ((value&0xf0)>>4)-(Apwrdelta);
812 if (((value&0xf00)>>8) > Apwrdelta)
813 t3 = ((value&0xf00)>>8)-(Apwrdelta);
816 if (((value&0xf000)>>12) > Apwrdelta)
817 t4 = ((value&0xf000)>>12)-(Apwrdelta);
821 Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
823 RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4 + 2, value);
824 if (bApwrdeltaMinus == FALSE)
826 t1 = (value&0xf)+(Apwrdelta);
829 t2 = ((value&0xf0)>>4)+(Apwrdelta);
832 t3 = ((value&0xf00)>>8)+(Apwrdelta);
835 t4 = ((value&0xf000)>>12)+(Apwrdelta);
841 if ((value&0xf) > Apwrdelta)
842 t1 = (value&0xf)-(Apwrdelta);
845 if (((value&0xf0)>>4) > Apwrdelta)
846 t2 = ((value&0xf0)>>4)-(Apwrdelta);
849 if (((value&0xf00)>>8) > Apwrdelta)
850 t3 = ((value&0xf00)>>8)-(Apwrdelta);
853 if (((value&0xf000)>>12) > Apwrdelta)
854 t4 = ((value&0xf000)>>12)-(Apwrdelta);
858 Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28));
861 pAd->Tx40MPwrCfgABand[i+1] = (pAd->Tx40MPwrCfgABand[i+1] & 0x0000FFFF) | (Adata & 0xFFFF0000);
863 pAd->Tx40MPwrCfgABand[i+1] = Adata;
865 DBGPRINT_RAW(RT_DEBUG_TRACE, ("40MHz BW, 5GHz band, Adata = %lx \n", Adata));
872 ========================================================================
875 Read initial channel power parameters from EEPROM
878 Adapter Pointer to our adapter
887 ========================================================================
889 VOID RTMPReadChannelPwr(
890 IN PRTMP_ADAPTER pAd)
893 EEPROM_TX_PWR_STRUC Power;
894 EEPROM_TX_PWR_STRUC Power2;
896 // Read Tx power value for all channels
897 // Value from 1 - 0x7f. Default value is 24.
898 // Power value : 2.4G 0x00 (0) ~ 0x1F (31)
899 // : 5.5G 0xF9 (-7) ~ 0x0F (15)
901 // 0. 11b/g, ch1 - ch 14
902 for (i = 0; i < 7; i++)
904 RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2, Power.word);
905 RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2, Power2.word);
906 pAd->TxPower[i * 2].Channel = i * 2 + 1;
907 pAd->TxPower[i * 2 + 1].Channel = i * 2 + 2;
909 if ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0))
910 pAd->TxPower[i * 2].Power = DEFAULT_RF_TX_POWER;
912 pAd->TxPower[i * 2].Power = Power.field.Byte0;
914 if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0))
915 pAd->TxPower[i * 2 + 1].Power = DEFAULT_RF_TX_POWER;
917 pAd->TxPower[i * 2 + 1].Power = Power.field.Byte1;
919 if ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0))
920 pAd->TxPower[i * 2].Power2 = DEFAULT_RF_TX_POWER;
922 pAd->TxPower[i * 2].Power2 = Power2.field.Byte0;
924 if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0))
925 pAd->TxPower[i * 2 + 1].Power2 = DEFAULT_RF_TX_POWER;
927 pAd->TxPower[i * 2 + 1].Power2 = Power2.field.Byte1;
930 // 1. U-NII lower/middle band: 36, 38, 40; 44, 46, 48; 52, 54, 56; 60, 62, 64 (including central frequency in BW 40MHz)
931 // 1.1 Fill up channel
933 for (i = 0; i < 4; i++)
935 pAd->TxPower[3 * i + choffset + 0].Channel = 36 + i * 8 + 0;
936 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
937 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
939 pAd->TxPower[3 * i + choffset + 1].Channel = 36 + i * 8 + 2;
940 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
941 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
943 pAd->TxPower[3 * i + choffset + 2].Channel = 36 + i * 8 + 4;
944 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
945 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
949 for (i = 0; i < 6; i++)
951 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2, Power.word);
952 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2, Power2.word);
954 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
955 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
957 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
958 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
960 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
961 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
963 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
964 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
967 // 2. HipperLAN 2 100, 102 ,104; 108, 110, 112; 116, 118, 120; 124, 126, 128; 132, 134, 136; 140 (including central frequency in BW 40MHz)
968 // 2.1 Fill up channel
970 for (i = 0; i < 5; i++)
972 pAd->TxPower[3 * i + choffset + 0].Channel = 100 + i * 8 + 0;
973 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
974 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
976 pAd->TxPower[3 * i + choffset + 1].Channel = 100 + i * 8 + 2;
977 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
978 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
980 pAd->TxPower[3 * i + choffset + 2].Channel = 100 + i * 8 + 4;
981 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
982 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
984 pAd->TxPower[3 * 5 + choffset + 0].Channel = 140;
985 pAd->TxPower[3 * 5 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
986 pAd->TxPower[3 * 5 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
989 for (i = 0; i < 8; i++)
991 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);
992 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);
994 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
995 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
997 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
998 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
1000 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
1001 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
1003 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
1004 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
1007 // 3. U-NII upper band: 149, 151, 153; 157, 159, 161; 165 (including central frequency in BW 40MHz)
1008 // 3.1 Fill up channel
1009 choffset = 14 + 12 + 16;
1010 for (i = 0; i < 2; i++)
1012 pAd->TxPower[3 * i + choffset + 0].Channel = 149 + i * 8 + 0;
1013 pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
1014 pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
1016 pAd->TxPower[3 * i + choffset + 1].Channel = 149 + i * 8 + 2;
1017 pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
1018 pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
1020 pAd->TxPower[3 * i + choffset + 2].Channel = 149 + i * 8 + 4;
1021 pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
1022 pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
1024 pAd->TxPower[3 * 2 + choffset + 0].Channel = 165;
1025 pAd->TxPower[3 * 2 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
1026 pAd->TxPower[3 * 2 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
1028 // 3.2 Fill up power
1029 for (i = 0; i < 4; i++)
1031 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word);
1032 RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word);
1034 if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
1035 pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0;
1037 if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
1038 pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1;
1040 if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
1041 pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0;
1043 if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
1044 pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1;
1047 // 4. Print and Debug
1048 choffset = 14 + 12 + 16 + 7;
1052 ========================================================================
1054 Routine Description:
1055 Read the following from the registry
1056 1. All the parameters
1060 Adapter Pointer to our adapter
1061 WrapperConfigurationContext For use by NdisOpenConfiguration
1066 NDIS_STATUS_RESOURCES
1068 IRQL = PASSIVE_LEVEL
1072 ========================================================================
1074 NDIS_STATUS NICReadRegParameters(
1075 IN PRTMP_ADAPTER pAd,
1076 IN NDIS_HANDLE WrapperConfigurationContext
1079 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
1080 DBGPRINT_S(Status, ("<-- NICReadRegParameters, Status=%x\n", Status));
1087 ========================================================================
1089 Routine Description:
1090 For RF filter calibration purpose
1093 pAd Pointer to our adapter
1098 IRQL = PASSIVE_LEVEL
1100 ========================================================================
1102 VOID RTMPFilterCalibration(
1103 IN PRTMP_ADAPTER pAd)
1105 UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue=0;
1106 UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0;
1107 UCHAR RF_R24_Value = 0;
1109 // Give bbp filter initial value
1111 pAd->Mlme.CaliBW20RfR24 = 0x16;
1112 pAd->Mlme.CaliBW40RfR24 = 0x36; //Bit[5] must be 1 for BW 40
1114 pAd->Mlme.CaliBW20RfR24 = 0x1F;
1115 pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40
1119 if (loop == 1) //BandWidth = 40 MHz
1121 // Write 0x27 to RF_R24 to program filter
1122 RF_R24_Value = 0x27;
1123 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1125 FilterTarget = 0x15;
1127 FilterTarget = 0x19;
1129 // when calibrate BW40, BBP mask must set to BW40.
1130 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1133 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1136 RT30xxReadRFRegister(pAd, RF_R31, &value);
1138 RT30xxWriteRFRegister(pAd, RF_R31, value);
1141 else //BandWidth = 20 MHz
1143 // Write 0x07 to RF_R24 to program filter
1144 RF_R24_Value = 0x07;
1145 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1147 FilterTarget = 0x13;
1149 FilterTarget = 0x16;
1152 RT30xxReadRFRegister(pAd, RF_R31, &value);
1154 RT30xxWriteRFRegister(pAd, RF_R31, value);
1158 // Write 0x01 to RF_R22 to enable baseband loopback mode
1159 RT30xxReadRFRegister(pAd, RF_R22, &value);
1161 RT30xxWriteRFRegister(pAd, RF_R22, value);
1163 // Write 0x00 to BBP_R24 to set power & frequency of passband test tone
1164 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
1168 // Write 0x90 to BBP_R25 to transmit test tone
1169 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
1171 RTMPusecDelay(1000);
1172 // Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0]
1173 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
1174 R55x = value & 0xFF;
1176 } while ((ReTry++ < 100) && (R55x == 0));
1178 // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
1179 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06);
1183 // Write 0x90 to BBP_R25 to transmit test tone
1184 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
1186 //We need to wait for calibration
1187 RTMPusecDelay(1000);
1188 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
1190 if ((R55x - value) < FilterTarget)
1194 else if ((R55x - value) == FilterTarget)
1204 // prevent infinite loop cause driver hang.
1205 if (loopcnt++ > 100)
1207 DBGPRINT(RT_DEBUG_ERROR, ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt));
1211 // Write RF_R24 to program filter
1212 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1217 RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));
1220 // Store for future usage
1225 //BandWidth = 20 MHz
1226 pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value;
1230 //BandWidth = 40 MHz
1231 pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value;
1238 RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1245 // Set back to initial state
1247 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
1249 RT30xxReadRFRegister(pAd, RF_R22, &value);
1251 RT30xxWriteRFRegister(pAd, RF_R22, value);
1253 // set BBP back to BW20
1254 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1256 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1258 DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
1261 VOID NICInitRT30xxRFRegisters(IN PRTMP_ADAPTER pAd)
1264 // Driver must read EEPROM to get RfIcType before initial RF registers
1265 // Initialize RF register to default value
1270 && (pAd->RfIcType == RFIC_3020 || pAd->RfIcType == RFIC_2020)
1274 // Init RF calibration
1275 // Driver should toggle RF R30 bit7 before init RF registers
1280 RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg);
1282 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1283 RTMPusecDelay(1000);
1285 RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1287 // Initialize RF register to default value
1288 for (i = 0; i < NUM_RF_REG_PARMS; i++)
1290 RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
1296 // Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate
1297 RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
1298 data = ((data & 0xF0FFFFFF) | 0x0D000000);
1299 RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
1301 else if (IS_RT3071(pAd))
1303 // Driver should set RF R6 bit6 on before init RF registers
1304 RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg);
1306 RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg);
1309 RT30xxWriteRFRegister(pAd, RF_R31, 0x14);
1311 // RT3071 version E has fixed this issue
1312 if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211))
1314 // patch tx EVM issue temporarily
1315 RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
1316 data = ((data & 0xE0FFFFFF) | 0x0D000000);
1317 RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
1321 RTMP_IO_READ32(pAd, LDO_CFG0, &data);
1322 data = ((data & 0xE0FFFFFF) | 0x01000000);
1323 RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
1326 // patch LNA_PE_G1 failed issue
1327 RTUSBReadMACRegister(pAd, GPIO_SWITCH, &data);
1329 RTUSBWriteMACRegister(pAd, GPIO_SWITCH, data);
1332 //For RF filter Calibration
1333 RTMPFilterCalibration(pAd);
1335 // Initialize RF R27 register, set RF R27 must be behind RTMPFilterCalibration()
1336 if ((pAd->MACVersion & 0xffff) < 0x0211)
1337 RT30xxWriteRFRegister(pAd, RF_R27, 0x3);
1339 // set led open drain enable
1340 RTUSBReadMACRegister(pAd, OPT_14, &data);
1342 RTUSBWriteMACRegister(pAd, OPT_14, data);
1346 // add by johnli, RF power sequence setup, load RF normal operation-mode setup
1347 RT30xxLoadRFNormalModeSetup(pAd);
1356 ========================================================================
1358 Routine Description:
1359 Read initial parameters from EEPROM
1362 Adapter Pointer to our adapter
1367 IRQL = PASSIVE_LEVEL
1371 ========================================================================
1373 VOID NICReadEEPROMParameters(
1374 IN PRTMP_ADAPTER pAd,
1378 USHORT i, value, value2;
1380 EEPROM_TX_PWR_STRUC Power;
1381 EEPROM_VERSION_STRUC Version;
1382 EEPROM_ANTENNA_STRUC Antenna;
1383 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1385 DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n"));
1387 // Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8
1388 RTMP_IO_READ32(pAd, E2PROM_CSR, &data);
1389 DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%x\n", data));
1391 if((data & 0x30) == 0)
1392 pAd->EEPROMAddressNum = 6; // 93C46
1393 else if((data & 0x30) == 0x10)
1394 pAd->EEPROMAddressNum = 8; // 93C66
1396 pAd->EEPROMAddressNum = 8; // 93C86
1397 DBGPRINT(RT_DEBUG_TRACE, ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum ));
1399 // RT2860 MAC no longer auto load MAC address from E2PROM. Driver has to intialize
1400 // MAC address registers according to E2PROM setting
1401 if (mac_addr == NULL ||
1402 strlen(mac_addr) != 17 ||
1403 mac_addr[2] != ':' || mac_addr[5] != ':' || mac_addr[8] != ':' ||
1404 mac_addr[11] != ':' || mac_addr[14] != ':')
1406 USHORT Addr01,Addr23,Addr45 ;
1408 RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);
1409 RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);
1410 RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);
1412 pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);
1413 pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8);
1414 pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);
1415 pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8);
1416 pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);
1417 pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8);
1419 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from E2PROM \n"));
1428 for (j=0; j<MAC_ADDR_LEN; j++)
1430 AtoH(macptr, &pAd->PermanentAddress[j], 1);
1434 DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from module parameter \n"));
1439 //more conveninet to test mbssid, so ap's bssid &0xf1
1440 if (pAd->PermanentAddress[0] == 0xff)
1441 pAd->PermanentAddress[0] = RandomByte(pAd)&0xf8;
1443 //if (pAd->PermanentAddress[5] == 0xff)
1444 // pAd->PermanentAddress[5] = RandomByte(pAd)&0xf8;
1446 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
1447 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
1448 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
1449 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
1450 if (pAd->bLocalAdminMAC == FALSE)
1454 COPY_MAC_ADDR(pAd->CurrentAddress, pAd->PermanentAddress);
1455 csr2.field.Byte0 = pAd->CurrentAddress[0];
1456 csr2.field.Byte1 = pAd->CurrentAddress[1];
1457 csr2.field.Byte2 = pAd->CurrentAddress[2];
1458 csr2.field.Byte3 = pAd->CurrentAddress[3];
1459 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word);
1461 csr3.field.Byte4 = pAd->CurrentAddress[4];
1462 csr3.field.Byte5 = pAd->CurrentAddress[5];
1463 csr3.field.U2MeMask = 0xff;
1464 RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word);
1465 DBGPRINT_RAW(RT_DEBUG_TRACE,("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n",
1466 pAd->PermanentAddress[0], pAd->PermanentAddress[1],
1467 pAd->PermanentAddress[2], pAd->PermanentAddress[3],
1468 pAd->PermanentAddress[4], pAd->PermanentAddress[5]));
1472 // if not return early. cause fail at emulation.
1473 // Init the channel number for TX channel power
1474 RTMPReadChannelPwr(pAd);
1476 // if E2PROM version mismatch with driver's expectation, then skip
1477 // all subsequent E2RPOM retieval and set a system error bit to notify GUI
1478 RT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word);
1479 pAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256;
1480 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: Version = %d, FAE release #%d\n", Version.field.Version, Version.field.FaeReleaseNumber));
1482 if (Version.field.Version > VALID_EEPROM_VERSION)
1484 DBGPRINT_ERR(("E2PROM: WRONG VERSION 0x%x, should be %d\n",Version.field.Version, VALID_EEPROM_VERSION));
1485 /*pAd->SystemErrorBitmap |= 0x00000001;
1487 // hard-code default value when no proper E2PROM installed
1488 pAd->bAutoTxAgcA = FALSE;
1489 pAd->bAutoTxAgcG = FALSE;
1491 // Default the channel power
1492 for (i = 0; i < MAX_NUM_OF_CHANNELS; i++)
1493 pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER;
1495 // Default the channel power
1496 for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++)
1497 pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER;
1499 for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++)
1500 pAd->EEPROMDefaultValue[i] = 0xffff;
1504 // Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd
1505 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value);
1506 pAd->EEPROMDefaultValue[0] = value;
1508 RT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);
1509 pAd->EEPROMDefaultValue[1] = value;
1511 RT28xx_EEPROM_READ16(pAd, 0x38, value); // Country Region
1512 pAd->EEPROMDefaultValue[2] = value;
1514 for(i = 0; i < 8; i++)
1516 RT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2, value);
1517 pAd->EEPROMDefaultValue[i+3] = value;
1520 // We have to parse NIC configuration 0 at here.
1521 // If TSSI did not have preloaded value, it should reset the TxAutoAgc to false
1522 // Therefore, we have to read TxAutoAgc control beforehand.
1523 // Read Tx AGC control bit
1524 Antenna.word = pAd->EEPROMDefaultValue[0];
1525 if (Antenna.word == 0xFFFF)
1530 Antenna.field.RfIcType = RFIC_3020;
1531 Antenna.field.TxPath = 1;
1532 Antenna.field.RxPath = 1;
1537 Antenna.field.RfIcType = RFIC_2820;
1538 Antenna.field.TxPath = 1;
1539 Antenna.field.RxPath = 2;
1540 DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
1544 // Choose the desired Tx&Rx stream.
1545 if ((pAd->CommonCfg.TxStream == 0) || (pAd->CommonCfg.TxStream > Antenna.field.TxPath))
1546 pAd->CommonCfg.TxStream = Antenna.field.TxPath;
1548 if ((pAd->CommonCfg.RxStream == 0) || (pAd->CommonCfg.RxStream > Antenna.field.RxPath))
1550 pAd->CommonCfg.RxStream = Antenna.field.RxPath;
1552 if ((pAd->MACVersion < RALINK_2883_VERSION) &&
1553 (pAd->CommonCfg.RxStream > 2))
1555 // only 2 Rx streams for RT2860 series
1556 pAd->CommonCfg.RxStream = 2;
1561 // read value from EEPROM and set them to CSR174 ~ 177 in chain0 ~ chain2
1567 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1571 NicConfig2.word = 0;
1573 if ((NicConfig2.word & 0x00ff) == 0xff)
1575 NicConfig2.word &= 0xff00;
1578 if ((NicConfig2.word >> 8) == 0xff)
1580 NicConfig2.word &= 0x00ff;
1584 if (NicConfig2.field.DynamicTxAgcControl == 1)
1585 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1587 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1589 DBGPRINT_RAW(RT_DEBUG_TRACE, ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n", Antenna.field.RxPath, Antenna.field.TxPath));
1591 // Save the antenna for future use
1592 pAd->Antenna.word = Antenna.word;
1595 // Reset PhyMode if we don't support 802.11a
1596 // Only RFIC_2850 & RFIC_2750 support 802.11a
1598 if ((Antenna.field.RfIcType != RFIC_2850) && (Antenna.field.RfIcType != RFIC_2750))
1600 if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) ||
1601 (pAd->CommonCfg.PhyMode == PHY_11A))
1602 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;
1603 else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
1604 (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) ||
1605 (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) ||
1606 (pAd->CommonCfg.PhyMode == PHY_11N_5G))
1607 pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED;
1610 // Read TSSI reference and TSSI boundary for temperature compensation. This is ugly
1613 /* these are tempature reference value (0x00 ~ 0xFE)
1614 ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
1615 TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) +
1616 TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */
1617 RT28xx_EEPROM_READ16(pAd, 0x6E, Power.word);
1618 pAd->TssiMinusBoundaryG[4] = Power.field.Byte0;
1619 pAd->TssiMinusBoundaryG[3] = Power.field.Byte1;
1620 RT28xx_EEPROM_READ16(pAd, 0x70, Power.word);
1621 pAd->TssiMinusBoundaryG[2] = Power.field.Byte0;
1622 pAd->TssiMinusBoundaryG[1] = Power.field.Byte1;
1623 RT28xx_EEPROM_READ16(pAd, 0x72, Power.word);
1624 pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */
1625 pAd->TssiPlusBoundaryG[1] = Power.field.Byte1;
1626 RT28xx_EEPROM_READ16(pAd, 0x74, Power.word);
1627 pAd->TssiPlusBoundaryG[2] = Power.field.Byte0;
1628 pAd->TssiPlusBoundaryG[3] = Power.field.Byte1;
1629 RT28xx_EEPROM_READ16(pAd, 0x76, Power.word);
1630 pAd->TssiPlusBoundaryG[4] = Power.field.Byte0;
1631 pAd->TxAgcStepG = Power.field.Byte1;
1632 pAd->TxAgcCompensateG = 0;
1633 pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;
1634 pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG;
1636 // Disable TxAgc if the based value is not right
1637 if (pAd->TssiRefG == 0xff)
1638 pAd->bAutoTxAgcG = FALSE;
1640 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
1641 pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1],
1643 pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],
1644 pAd->TxAgcStepG, pAd->bAutoTxAgcG));
1648 RT28xx_EEPROM_READ16(pAd, 0xD4, Power.word);
1649 pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;
1650 pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;
1651 RT28xx_EEPROM_READ16(pAd, 0xD6, Power.word);
1652 pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;
1653 pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;
1654 RT28xx_EEPROM_READ16(pAd, 0xD8, Power.word);
1655 pAd->TssiRefA = Power.field.Byte0;
1656 pAd->TssiPlusBoundaryA[1] = Power.field.Byte1;
1657 RT28xx_EEPROM_READ16(pAd, 0xDA, Power.word);
1658 pAd->TssiPlusBoundaryA[2] = Power.field.Byte0;
1659 pAd->TssiPlusBoundaryA[3] = Power.field.Byte1;
1660 RT28xx_EEPROM_READ16(pAd, 0xDC, Power.word);
1661 pAd->TssiPlusBoundaryA[4] = Power.field.Byte0;
1662 pAd->TxAgcStepA = Power.field.Byte1;
1663 pAd->TxAgcCompensateA = 0;
1664 pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;
1665 pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA;
1667 // Disable TxAgc if the based value is not right
1668 if (pAd->TssiRefA == 0xff)
1669 pAd->bAutoTxAgcA = FALSE;
1671 DBGPRINT(RT_DEBUG_TRACE,("E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
1672 pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1],
1674 pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2], pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],
1675 pAd->TxAgcStepA, pAd->bAutoTxAgcA));
1677 pAd->BbpRssiToDbmDelta = 0x0;
1679 // Read frequency offset setting for RF
1680 RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value);
1681 if ((value & 0x00FF) != 0x00FF)
1682 pAd->RfFreqOffset = (ULONG) (value & 0x00FF);
1684 pAd->RfFreqOffset = 0;
1685 DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset));
1687 //CountryRegion byte offset (38h)
1688 value = pAd->EEPROMDefaultValue[2] >> 8; // 2.4G band
1689 value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; // 5G band
1691 if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND))
1693 pAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80;
1694 pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;
1695 TmpPhy = pAd->CommonCfg.PhyMode;
1696 pAd->CommonCfg.PhyMode = 0xff;
1697 RTMPSetPhyMode(pAd, TmpPhy);
1702 // Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.
1703 // The valid value are (-10 ~ 10)
1705 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value);
1706 pAd->BGRssiOffset0 = value & 0x00ff;
1707 pAd->BGRssiOffset1 = (value >> 8);
1708 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2, value);
1709 pAd->BGRssiOffset2 = value & 0x00ff;
1710 pAd->ALNAGain1 = (value >> 8);
1711 RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value);
1712 pAd->BLNAGain = value & 0x00ff;
1713 pAd->ALNAGain0 = (value >> 8);
1715 // Validate 11b/g RSSI_0 offset.
1716 if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10))
1717 pAd->BGRssiOffset0 = 0;
1719 // Validate 11b/g RSSI_1 offset.
1720 if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))
1721 pAd->BGRssiOffset1 = 0;
1723 // Validate 11b/g RSSI_2 offset.
1724 if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))
1725 pAd->BGRssiOffset2 = 0;
1727 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value);
1728 pAd->ARssiOffset0 = value & 0x00ff;
1729 pAd->ARssiOffset1 = (value >> 8);
1730 RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2), value);
1731 pAd->ARssiOffset2 = value & 0x00ff;
1732 pAd->ALNAGain2 = (value >> 8);
1734 if (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))
1735 pAd->ALNAGain1 = pAd->ALNAGain0;
1736 if (((UCHAR)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00))
1737 pAd->ALNAGain2 = pAd->ALNAGain0;
1739 // Validate 11a RSSI_0 offset.
1740 if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10))
1741 pAd->ARssiOffset0 = 0;
1743 // Validate 11a RSSI_1 offset.
1744 if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))
1745 pAd->ARssiOffset1 = 0;
1747 //Validate 11a RSSI_2 offset.
1748 if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))
1749 pAd->ARssiOffset2 = 0;
1754 RT28xx_EEPROM_READ16(pAd, 0x3a, value);
1755 pAd->LedCntl.word = (value&0xff00) >> 8;
1756 RT28xx_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET, value);
1758 RT28xx_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET, value);
1760 RT28xx_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET, value);
1763 RTMPReadTxPwrPerRate(pAd);
1768 eFusePhysicalReadRegisters(pAd, EFUSE_TAG, 2, &value);
1769 pAd->EFuseTag = (value & 0xff);
1773 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
1777 ========================================================================
1779 Routine Description:
1780 Set default value from EEPROM
1783 Adapter Pointer to our adapter
1788 IRQL = PASSIVE_LEVEL
1792 ========================================================================
1794 VOID NICInitAsicFromEEPROM(
1795 IN PRTMP_ADAPTER pAd)
1800 EEPROM_ANTENNA_STRUC Antenna;
1801 EEPROM_NIC_CONFIG2_STRUC NicConfig2;
1804 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitAsicFromEEPROM\n"));
1805 for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)
1807 UCHAR BbpRegIdx, BbpValue;
1809 if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))
1811 BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);
1812 BbpValue = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);
1813 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);
1818 Antenna.word = pAd->Antenna.word;
1821 Antenna.word = pAd->EEPROMDefaultValue[0];
1822 if (Antenna.word == 0xFFFF)
1824 DBGPRINT(RT_DEBUG_ERROR, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
1825 BUG_ON(Antenna.word == 0xFFFF);
1828 pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;
1829 pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;
1832 DBGPRINT(RT_DEBUG_WARN, ("pAd->RfIcType = %d, RealRxPath=%d, TxPath = %d\n", pAd->RfIcType, pAd->Mlme.RealRxPath,Antenna.field.TxPath));
1834 // Save the antenna for future use
1835 pAd->Antenna.word = Antenna.word;
1837 NicConfig2.word = pAd->EEPROMDefaultValue[1];
1841 if ((NicConfig2.word & 0x00ff) == 0xff)
1843 NicConfig2.word &= 0xff00;
1846 if ((NicConfig2.word >> 8) == 0xff)
1848 NicConfig2.word &= 0x00ff;
1852 // Save the antenna for future use
1853 pAd->NicConfig2.word = NicConfig2.word;
1856 // set default antenna as main
1857 if (pAd->RfIcType == RFIC_3020)
1858 AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
1861 // Send LED Setting to MCU.
1863 if (pAd->LedCntl.word == 0xFF)
1865 pAd->LedCntl.word = 0x01;
1877 AsicSendCommandToMcu(pAd, 0x52, 0xff, (UCHAR)pAd->Led1, (UCHAR)(pAd->Led1 >> 8));
1878 AsicSendCommandToMcu(pAd, 0x53, 0xff, (UCHAR)pAd->Led2, (UCHAR)(pAd->Led2 >> 8));
1879 AsicSendCommandToMcu(pAd, 0x54, 0xff, (UCHAR)pAd->Led3, (UCHAR)(pAd->Led3 >> 8));
1880 pAd->LedIndicatorStregth = 0xFF;
1881 RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, before link up
1884 // Read Hardware controlled Radio state enable bit
1885 if (NicConfig2.field.HardwareRadioControl == 1)
1887 pAd->StaCfg.bHardwareRadio = TRUE;
1889 // Read GPIO pin2 as Hardware controlled radio state
1890 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
1891 if ((data & 0x04) == 0)
1893 pAd->StaCfg.bHwRadio = FALSE;
1894 pAd->StaCfg.bRadio = FALSE;
1895 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
1899 pAd->StaCfg.bHardwareRadio = FALSE;
1901 if (pAd->StaCfg.bRadio == FALSE)
1903 RTMPSetLED(pAd, LED_RADIO_OFF);
1907 RTMPSetLED(pAd, LED_RADIO_ON);
1909 AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);
1910 AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x00);
1911 // 2-1. wait command ok.
1912 AsicCheckCommanOk(pAd, PowerWakeCID);
1917 // Turn off patching for cardbus controller
1918 if (NicConfig2.field.CardbusAcceleration == 1)
1922 if (NicConfig2.field.DynamicTxAgcControl == 1)
1923 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1925 pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1927 // Since BBP has been progamed, to make sure BBP setting will be
1928 // upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND!!
1930 pAd->CommonCfg.BandState = UNKNOWN_BAND;
1932 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
1934 if(pAd->Antenna.field.RxPath == 3)
1938 else if(pAd->Antenna.field.RxPath == 2)
1942 else if(pAd->Antenna.field.RxPath == 1)
1946 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
1949 // Handle the difference when 1T
1950 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
1951 if(pAd->Antenna.field.TxPath == 1)
1955 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
1957 DBGPRINT(RT_DEBUG_TRACE, ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n", pAd->CommonCfg.bHardwareRadio, pAd->CommonCfg.bHardwareRadio));
1960 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));
1961 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n"));
1965 ========================================================================
1967 Routine Description:
1968 Initialize NIC hardware
1971 Adapter Pointer to our adapter
1976 IRQL = PASSIVE_LEVEL
1980 ========================================================================
1982 NDIS_STATUS NICInitializeAdapter(
1983 IN PRTMP_ADAPTER pAd,
1984 IN BOOLEAN bHardReset)
1986 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
1987 WPDMA_GLO_CFG_STRUC GloCfg;
1990 DELAY_INT_CFG_STRUC IntCfg;
1993 AC_TXOP_CSR0_STRUC csr0;
1995 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n"));
1997 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
2002 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
2003 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
2006 RTMPusecDelay(1000);
2009 DBGPRINT(RT_DEBUG_TRACE, ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word));
2010 GloCfg.word &= 0xff0;
2011 GloCfg.field.EnTXWriteBackDDONE =1;
2012 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
2014 // Record HW Beacon offset
2015 pAd->BeaconOffset[0] = HW_BEACON_BASE0;
2016 pAd->BeaconOffset[1] = HW_BEACON_BASE1;
2017 pAd->BeaconOffset[2] = HW_BEACON_BASE2;
2018 pAd->BeaconOffset[3] = HW_BEACON_BASE3;
2019 pAd->BeaconOffset[4] = HW_BEACON_BASE4;
2020 pAd->BeaconOffset[5] = HW_BEACON_BASE5;
2021 pAd->BeaconOffset[6] = HW_BEACON_BASE6;
2022 pAd->BeaconOffset[7] = HW_BEACON_BASE7;
2025 // write all shared Ring's base address into ASIC
2028 // asic simulation sequence put this ahead before loading firmware.
2029 // pbf hardware reset
2031 RTMP_IO_WRITE32(pAd, WPDMA_RST_IDX, 0x1003f); // 0x10000 for reset rx, 0x3f resets all 6 tx rings.
2032 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe1f);
2033 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe00);
2036 // Initialze ASIC for TX & Rx operation
2037 if (NICInitializeAsic(pAd , bHardReset) != NDIS_STATUS_SUCCESS)
2041 NICLoadFirmware(pAd);
2044 return NDIS_STATUS_FAILURE;
2049 // Write AC_BK base address register
2050 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BK].Cell[0].AllocPa);
2051 RTMP_IO_WRITE32(pAd, TX_BASE_PTR1, Value);
2052 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR1 : 0x%x\n", Value));
2054 // Write AC_BE base address register
2055 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BE].Cell[0].AllocPa);
2056 RTMP_IO_WRITE32(pAd, TX_BASE_PTR0, Value);
2057 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR0 : 0x%x\n", Value));
2059 // Write AC_VI base address register
2060 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VI].Cell[0].AllocPa);
2061 RTMP_IO_WRITE32(pAd, TX_BASE_PTR2, Value);
2062 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR2 : 0x%x\n", Value));
2064 // Write AC_VO base address register
2065 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VO].Cell[0].AllocPa);
2066 RTMP_IO_WRITE32(pAd, TX_BASE_PTR3, Value);
2067 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR3 : 0x%x\n", Value));
2069 // Write HCCA base address register
2070 Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_HCCA].Cell[0].AllocPa);
2071 RTMP_IO_WRITE32(pAd, TX_BASE_PTR4, Value);
2072 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR4 : 0x%x\n", Value));
2074 // Write MGMT_BASE_CSR register
2075 Value = RTMP_GetPhysicalAddressLow(pAd->MgmtRing.Cell[0].AllocPa);
2076 RTMP_IO_WRITE32(pAd, TX_BASE_PTR5, Value);
2077 DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR5 : 0x%x\n", Value));
2079 // Write RX_BASE_CSR register
2080 Value = RTMP_GetPhysicalAddressLow(pAd->RxRing.Cell[0].AllocPa);
2081 RTMP_IO_WRITE32(pAd, RX_BASE_PTR, Value);
2082 DBGPRINT(RT_DEBUG_TRACE, ("--> RX_BASE_PTR : 0x%x\n", Value));
2084 // Init RX Ring index pointer
2085 pAd->RxRing.RxSwReadIdx = 0;
2086 pAd->RxRing.RxCpuIdx = RX_RING_SIZE-1;
2087 RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
2089 // Init TX rings index pointer
2091 for (i=0; i<NUM_OF_TX_RING; i++)
2093 pAd->TxRing[i].TxSwFreeIdx = 0;
2094 pAd->TxRing[i].TxCpuIdx = 0;
2095 RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10) , pAd->TxRing[i].TxCpuIdx);
2099 // init MGMT ring index pointer
2100 pAd->MgmtRing.TxSwFreeIdx = 0;
2101 pAd->MgmtRing.TxCpuIdx = 0;
2102 RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
2105 // set each Ring's SIZE into ASIC. Descriptor Size is fixed by design.
2108 // Write TX_RING_CSR0 register
2109 Value = TX_RING_SIZE;
2110 RTMP_IO_WRITE32(pAd, TX_MAX_CNT0, Value);
2111 RTMP_IO_WRITE32(pAd, TX_MAX_CNT1, Value);
2112 RTMP_IO_WRITE32(pAd, TX_MAX_CNT2, Value);
2113 RTMP_IO_WRITE32(pAd, TX_MAX_CNT3, Value);
2114 RTMP_IO_WRITE32(pAd, TX_MAX_CNT4, Value);
2115 Value = MGMT_RING_SIZE;
2116 RTMP_IO_WRITE32(pAd, TX_MGMTMAX_CNT, Value);
2118 // Write RX_RING_CSR register
2119 Value = RX_RING_SIZE;
2120 RTMP_IO_WRITE32(pAd, RX_MAX_CNT, Value);
2126 RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
2127 if (pAd->CommonCfg.PhyMode == PHY_11B)
2129 csr0.field.Ac0Txop = 192; // AC_VI: 192*32us ~= 6ms
2130 csr0.field.Ac1Txop = 96; // AC_VO: 96*32us ~= 3ms
2134 csr0.field.Ac0Txop = 96; // AC_VI: 96*32us ~= 3ms
2135 csr0.field.Ac1Txop = 48; // AC_VO: 48*32us ~= 1.5ms
2137 RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word);
2141 // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:
2145 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
2146 if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
2149 RTMPusecDelay(1000);
2153 GloCfg.word &= 0xff0;
2154 GloCfg.field.EnTXWriteBackDDONE =1;
2155 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
2158 RTMP_IO_WRITE32(pAd, DELAY_INT_CFG, IntCfg.word);
2164 // Status = NICLoadFirmware(pAd);
2166 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n"));
2171 ========================================================================
2173 Routine Description:
2177 Adapter Pointer to our adapter
2182 IRQL = PASSIVE_LEVEL
2186 ========================================================================
2188 NDIS_STATUS NICInitializeAsic(
2189 IN PRTMP_ADAPTER pAd,
2190 IN BOOLEAN bHardReset)
2194 UINT32 MacCsr12 = 0, Counter = 0;
2206 DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n"));
2209 if (bHardReset == TRUE)
2211 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
2214 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
2218 // Make sure MAC gets ready after NICLoadFirmware().
2222 //To avoid hang-on issue when interface up in kernel 2.4,
2223 //we use a local variable "MacCsr0" instead of using "pAd->MACVersion" directly.
2226 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
2228 if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
2232 } while (Index++ < 100);
2234 pAd->MACVersion = MacCsr0;
2235 DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
2236 // turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue.
2237 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacCsr12);
2238 MacCsr12 &= (~0x2000);
2239 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacCsr12);
2241 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
2242 RTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);
2243 Status = RTUSBVenderReset(pAd);
2246 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
2248 // Initialize MAC register to default value
2250 for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++)
2252 RTMP_IO_WRITE32(pAd, MACRegTable[Index].Register, MACRegTable[Index].Value);
2256 for(Index=0; Index<NUM_MAC_REG_PARMS; Index++)
2259 if ((MACRegTable[Index].Register == TX_SW_CFG0) && (IS_RT3070(pAd) || IS_RT3071(pAd)))
2261 MACRegTable[Index].Value = 0x00000400;
2264 RTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);
2270 // According to Frank Hsu (from Gary Tsao)
2271 RTMP_IO_WRITE32(pAd, (USHORT)TX_SW_CFG0, 0x00000400);
2273 // Initialize RT3070 serial MAC registers which is different from RT2870 serial
2274 RTUSBWriteMACRegister(pAd, TX_SW_CFG1, 0);
2275 RTUSBWriteMACRegister(pAd, TX_SW_CFG2, 0);
2282 for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
2285 RTMP_IO_WRITE32(pAd, STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
2288 RTMP_IO_WRITE32(pAd, (USHORT)STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);
2293 // Initialize RT3070 serial MAc registers which is different from RT2870 serial
2296 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
2298 // RT3071 version E has fixed this issue
2299 if ((pAd->MACVersion & 0xffff) < 0x0211)
2301 if (pAd->NicConfig2.field.DACTestBit == 1)
2303 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x1F); // To fix throughput drop drastically
2307 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F); // To fix throughput drop drastically
2312 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);
2316 else if (IS_RT3070(pAd))
2318 RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
2319 RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x1F); // To fix throughput drop drastically
2324 // Before program BBP, we need to wait BBP/RF get wake up.
2329 RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);
2331 if ((MacCsr12 & 0x03) == 0) // if BB.RF is stable
2334 DBGPRINT(RT_DEBUG_TRACE, ("Check MAC_STATUS_CFG = Busy = %x\n", MacCsr12));
2335 RTMPusecDelay(1000);
2336 } while (Index++ < 100);
2338 // The commands to firmware should be after these commands, these commands will init firmware
2339 // PCI and USB are not the same because PCI driver needs to wait for PCI bus ready
2340 RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); // initialize BBP R/W access agent
2341 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);
2342 RTMPusecDelay(1000);
2344 // Read BBP register, make sure BBP is up and running before write new data
2348 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0);
2349 DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0));
2350 } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00)));
2351 //ASSERT(Index < 20); //this will cause BSOD on Check-build driver
2353 if ((R0 == 0xff) || (R0 == 0x00))
2354 return NDIS_STATUS_FAILURE;
2356 // Initialize BBP register to default value
2357 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
2359 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
2363 // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2364 if ((pAd->MACVersion&0xffff) != 0x0101)
2365 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
2368 //write RT3070 BBP wchich different with 2870 after write RT2870 BBP
2371 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0a);
2372 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x99);
2373 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, 0x05);
2378 // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2379 // RT3090 should not program BBP R84 to 0x19, otherwise TX will block.
2380 if (((pAd->MACVersion&0xffff) != 0x0101) && (!IS_RT30xx(pAd)))
2381 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
2383 // add by johnli, RF power sequence setup
2385 { //update for RT3070/71/72/90/91/92.
2386 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R79, 0x13);
2387 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R80, 0x05);
2388 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R81, 0x33);
2396 if ((pAd->MACVersion & 0xffff) >= 0x0211)
2398 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
2401 // improve power consumption
2402 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R138, &bbpreg);
2403 if (pAd->Antenna.field.TxPath == 1)
2405 // turn off tx DAC_1
2406 bbpreg = (bbpreg | 0x20);
2409 if (pAd->Antenna.field.RxPath == 1)
2411 // turn off tx ADC_1
2414 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R138, bbpreg);
2416 // improve power consumption in RT3071 Ver.E
2417 if ((pAd->MACVersion & 0xffff) >= 0x0211)
2419 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
2421 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
2425 if (pAd->MACVersion == 0x28600100)
2427 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2428 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
2431 if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) // 3*3
2433 // enlarge MAX_LEN_CFG
2435 RTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr);
2438 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr);
2443 UCHAR MAC_Value[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0};
2445 //Initialize WCID table
2447 for(Index =0 ;Index < 254;Index++)
2449 RTUSBMultiWrite(pAd, (USHORT)(MAC_WCID_BASE + Index * 8), MAC_Value, 8);
2454 // Add radio off control
2456 if (pAd->StaCfg.bRadio == FALSE)
2458 // RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);
2459 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
2460 DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n"));
2464 // Clear raw counters
2465 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
2466 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
2467 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
2468 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
2469 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
2470 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
2472 // ASIC will keep garbage value after boot
2473 // Clear all seared key table when initial
2474 // This routine can be ignored in radio-ON/OFF operation.
2477 for (KeyIdx = 0; KeyIdx < 4; KeyIdx++)
2479 RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0);
2482 // Clear all pairwise key table when initial
2483 for (KeyIdx = 0; KeyIdx < 256; KeyIdx++)
2485 RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
2490 // It isn't necessary to clear this space when not hard reset.
2491 if (bHardReset == TRUE)
2493 // clear all on-chip BEACON frame space
2494 for (apidx = 0; apidx < HW_BEACON_MAX_COUNT; apidx++)
2496 for (i = 0; i < HW_BEACON_OFFSET>>2; i+=4)
2497 RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[apidx] + i, 0x00);
2501 AsicDisableSync(pAd);
2502 // Clear raw counters
2503 RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
2504 RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
2505 RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
2506 RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
2507 RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
2508 RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
2509 // Default PCI clock cycle per ms is different as default setting, which is based on PCI.
2510 RTMP_IO_READ32(pAd, USB_CYC_CFG, &Counter);
2511 Counter&=0xffffff00;
2513 RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
2516 pAd->bUseEfuse=FALSE;
2517 RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrl);
2518 pAd->bUseEfuse = ( (eFuseCtrl & 0x80000000) == 0x80000000) ? 1 : 0;
2521 DBGPRINT(RT_DEBUG_TRACE, ("NVM is Efuse\n"));
2525 DBGPRINT(RT_DEBUG_TRACE, ("NVM is EEPROM\n"));
2531 // for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT.
2532 if ((pAd->MACVersion&0xffff) != 0x0101)
2533 RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f);
2536 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n"));
2537 return NDIS_STATUS_SUCCESS;
2542 VOID NICRestoreBBPValue(
2543 IN PRTMP_ADAPTER pAd)
2549 DBGPRINT(RT_DEBUG_TRACE, ("---> NICRestoreBBPValue !!!!!!!!!!!!!!!!!!!!!!! \n"));
2550 // Initialize BBP register to default value (rtmp_init.c)
2551 for (index = 0; index < NUM_BBP_REG_PARMS; index++)
2553 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[index].Register, BBPRegTable[index].Value);
2555 // copy from (rtmp_init.c)
2556 if (pAd->MACVersion == 0x28600100)
2558 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2559 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
2562 // copy from (connect.c LinkUp function)
2565 // Change to AP channel
2566 if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
2568 // Must using 40MHz.
2569 pAd->CommonCfg.BBPCurrentBW = BW_40;
2570 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2571 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2573 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2576 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2578 // RX : control channel at lower
2579 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2581 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2582 // Record BBPR3 setting, But don't keep R Antenna # information.
2583 pAd->StaCfg.BBPR3 = Value;
2585 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2587 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2589 if (pAd->MACVersion == 0x28600100)
2591 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
2592 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
2593 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
2594 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2597 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel ));
2599 else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
2601 // Must using 40MHz.
2602 pAd->CommonCfg.BBPCurrentBW = BW_40;
2603 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2604 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2606 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2609 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2611 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2613 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2615 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2617 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2618 // Record BBPR3 setting, But don't keep R Antenna # information.
2619 pAd->StaCfg.BBPR3 = Value;
2621 if (pAd->MACVersion == 0x28600100)
2623 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
2624 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
2625 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
2626 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2629 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel ));
2633 pAd->CommonCfg.BBPCurrentBW = BW_20;
2634 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2635 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2637 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2639 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2641 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2643 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2645 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2647 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2648 // Record BBPR3 setting, But don't keep R Antenna # information.
2649 pAd->StaCfg.BBPR3 = Value;
2651 if (pAd->MACVersion == 0x28600100)
2653 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2654 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
2655 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
2656 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2659 DBGPRINT(RT_DEBUG_TRACE, ("!!!20MHz LINK UP !!! \n" ));
2663 DBGPRINT(RT_DEBUG_TRACE, ("<--- NICRestoreBBPValue !!!!!!!!!!!!!!!!!!!!!!! \n"));
2668 ========================================================================
2670 Routine Description:
2674 Adapter Pointer to our adapter
2679 IRQL = PASSIVE_LEVEL
2682 Reset NIC to initial state AS IS system boot up time.
2684 ========================================================================
2687 IN PRTMP_ADAPTER pAd)
2690 DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n"));
2692 // Disable Rx, register value supposed will remain after reset
2693 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
2694 Value &= (0xfffffff3);
2695 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
2697 // Issue reset and clear from reset state
2698 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); // 2004-09-17 change from 0x01
2699 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);
2701 DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n"));
2705 ========================================================================
2707 Routine Description:
2708 Check ASIC registers and find any reason the system might hang
2711 Adapter Pointer to our adapter
2716 IRQL = DISPATCH_LEVEL
2718 ========================================================================
2720 BOOLEAN NICCheckForHang(
2721 IN PRTMP_ADAPTER pAd)
2726 VOID NICUpdateFifoStaCounters(
2727 IN PRTMP_ADAPTER pAd)
2729 TX_STA_FIFO_STRUC StaFifo;
2730 MAC_TABLE_ENTRY *pEntry;
2732 UCHAR pid = 0, wcid = 0;
2738 RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);
2740 if (StaFifo.field.bValid == 0)
2743 wcid = (UCHAR)StaFifo.field.wcid;
2746 /* ignore NoACK and MGMT frame use 0xFF as WCID */
2747 if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE))
2753 /* PID store Tx MCS Rate */
2754 pid = (UCHAR)StaFifo.field.PidType;
2756 pEntry = &pAd->MacTab.Content[wcid];
2758 pEntry->DebugFIFOCount++;
2760 if (StaFifo.field.TxBF) // 3*3
2761 pEntry->TxBFCount++;
2763 #ifdef UAPSD_AP_SUPPORT
2764 UAPSD_SP_AUE_Handle(pAd, pEntry, StaFifo.field.TxSuccess);
2765 #endif // UAPSD_AP_SUPPORT //
2767 if (!StaFifo.field.TxSuccess)
2769 pEntry->FIFOCount++;
2770 pEntry->OneSecTxFailCount++;
2772 if (pEntry->FIFOCount >= 1)
2774 DBGPRINT(RT_DEBUG_TRACE, ("#"));
2775 pEntry->NoBADataCountDown = 64;
2777 if(pEntry->PsMode == PWR_ACTIVE)
2780 for (tid=0; tid<NUM_OF_TID; tid++)
2782 BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, FALSE);
2785 // Update the continuous transmission counter except PS mode
2786 pEntry->ContinueTxFailCnt++;
2790 // Clear the FIFOCount when sta in Power Save mode. Basically we assume
2791 // this tx error happened due to sta just go to sleep.
2792 pEntry->FIFOCount = 0;
2793 pEntry->ContinueTxFailCnt = 0;
2799 if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0))
2801 pEntry->NoBADataCountDown--;
2802 if (pEntry->NoBADataCountDown==0)
2804 DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
2808 pEntry->FIFOCount = 0;
2809 pEntry->OneSecTxNoRetryOkCount++;
2810 // update NoDataIdleCount when sucessful send packet to STA.
2811 pEntry->NoDataIdleCount = 0;
2812 pEntry->ContinueTxFailCnt = 0;
2815 succMCS = StaFifo.field.SuccessRate & 0x7F;
2817 reTry = pid - succMCS;
2819 if (StaFifo.field.TxSuccess)
2821 pEntry->TXMCSExpected[pid]++;
2824 pEntry->TXMCSSuccessful[pid]++;
2828 pEntry->TXMCSAutoFallBack[pid][succMCS]++;
2833 pEntry->TXMCSFailed[pid]++;
2838 if ((pid >= 12) && succMCS <=7)
2842 pEntry->OneSecTxRetryOkCount += reTry;
2846 // ASIC store 16 stack
2847 } while ( i < (2*TX_RING_SIZE) );
2852 ========================================================================
2854 Routine Description:
2855 Read statistical counters from hardware registers and record them
2856 in software variables for later on query
2859 pAd Pointer to our adapter
2864 IRQL = DISPATCH_LEVEL
2866 ========================================================================
2868 VOID NICUpdateRawCounters(
2869 IN PRTMP_ADAPTER pAd)
2872 RX_STA_CNT0_STRUC RxStaCnt0;
2873 RX_STA_CNT1_STRUC RxStaCnt1;
2874 RX_STA_CNT2_STRUC RxStaCnt2;
2875 TX_STA_CNT0_STRUC TxStaCnt0;
2876 TX_STA_CNT1_STRUC StaTx1;
2877 TX_STA_CNT2_STRUC StaTx2;
2878 TX_AGG_CNT_STRUC TxAggCnt;
2879 TX_AGG_CNT0_STRUC TxAggCnt0;
2880 TX_AGG_CNT1_STRUC TxAggCnt1;
2881 TX_AGG_CNT2_STRUC TxAggCnt2;
2882 TX_AGG_CNT3_STRUC TxAggCnt3;
2883 TX_AGG_CNT4_STRUC TxAggCnt4;
2884 TX_AGG_CNT5_STRUC TxAggCnt5;
2885 TX_AGG_CNT6_STRUC TxAggCnt6;
2886 TX_AGG_CNT7_STRUC TxAggCnt7;
2888 RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word);
2889 RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word);
2892 RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);
2893 // Update RX PLCP error counter
2894 pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr;
2895 // Update False CCA counter
2896 pAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca;
2899 // Update FCS counters
2900 OldValue= pAd->WlanCounters.FCSErrorCount.u.LowPart;
2901 pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); // >> 7);
2902 if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue)
2903 pAd->WlanCounters.FCSErrorCount.u.HighPart++;
2905 // Add FCS error count to private counters
2906 pAd->RalinkCounters.OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr;
2907 OldValue = pAd->RalinkCounters.RealFcsErrCount.u.LowPart;
2908 pAd->RalinkCounters.RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr;
2909 if (pAd->RalinkCounters.RealFcsErrCount.u.LowPart < OldValue)
2910 pAd->RalinkCounters.RealFcsErrCount.u.HighPart++;
2912 // Update Duplicate Rcv check
2913 pAd->RalinkCounters.DuplicateRcv += RxStaCnt2.field.RxDupliCount;
2914 pAd->WlanCounters.FrameDuplicateCount.u.LowPart += RxStaCnt2.field.RxDupliCount;
2915 // Update RX Overflow counter
2916 pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount);
2919 if (pAd->RalinkCounters.RxCount != pAd->watchDogRxCnt)
2921 pAd->watchDogRxCnt = pAd->RalinkCounters.RxCount;
2922 pAd->watchDogRxOverFlowCnt = 0;
2926 if (RxStaCnt2.field.RxFifoOverflowCount)
2927 pAd->watchDogRxOverFlowCnt++;
2929 pAd->watchDogRxOverFlowCnt = 0;
2934 if (!pAd->bUpdateBcnCntDone)
2936 // Update BEACON sent count
2937 RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
2938 RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
2939 RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
2940 pAd->RalinkCounters.OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount;
2941 pAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit;
2942 pAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess;
2943 pAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount;
2944 pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess;
2945 pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit;
2946 pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;
2950 RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);
2951 RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);
2952 RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);
2953 RTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);
2954 RTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);
2955 RTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word);
2956 RTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word);
2957 RTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word);
2958 RTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word);
2959 pAd->RalinkCounters.TxAggCount += TxAggCnt.field.AggTxCount;
2960 pAd->RalinkCounters.TxNonAggCount += TxAggCnt.field.NonAggTxCount;
2961 pAd->RalinkCounters.TxAgg1MPDUCount += TxAggCnt0.field.AggSize1Count;
2962 pAd->RalinkCounters.TxAgg2MPDUCount += TxAggCnt0.field.AggSize2Count;
2964 pAd->RalinkCounters.TxAgg3MPDUCount += TxAggCnt1.field.AggSize3Count;
2965 pAd->RalinkCounters.TxAgg4MPDUCount += TxAggCnt1.field.AggSize4Count;
2966 pAd->RalinkCounters.TxAgg5MPDUCount += TxAggCnt2.field.AggSize5Count;
2967 pAd->RalinkCounters.TxAgg6MPDUCount += TxAggCnt2.field.AggSize6Count;
2969 pAd->RalinkCounters.TxAgg7MPDUCount += TxAggCnt3.field.AggSize7Count;
2970 pAd->RalinkCounters.TxAgg8MPDUCount += TxAggCnt3.field.AggSize8Count;
2971 pAd->RalinkCounters.TxAgg9MPDUCount += TxAggCnt4.field.AggSize9Count;
2972 pAd->RalinkCounters.TxAgg10MPDUCount += TxAggCnt4.field.AggSize10Count;
2974 pAd->RalinkCounters.TxAgg11MPDUCount += TxAggCnt5.field.AggSize11Count;
2975 pAd->RalinkCounters.TxAgg12MPDUCount += TxAggCnt5.field.AggSize12Count;
2976 pAd->RalinkCounters.TxAgg13MPDUCount += TxAggCnt6.field.AggSize13Count;
2977 pAd->RalinkCounters.TxAgg14MPDUCount += TxAggCnt6.field.AggSize14Count;
2979 pAd->RalinkCounters.TxAgg15MPDUCount += TxAggCnt7.field.AggSize15Count;
2980 pAd->RalinkCounters.TxAgg16MPDUCount += TxAggCnt7.field.AggSize16Count;
2982 // Calculate the transmitted A-MPDU count
2983 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += TxAggCnt0.field.AggSize1Count;
2984 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt0.field.AggSize2Count / 2);
2986 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize3Count / 3);
2987 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize4Count / 4);
2989 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize5Count / 5);
2990 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize6Count / 6);
2992 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize7Count / 7);
2993 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize8Count / 8);
2995 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize9Count / 9);
2996 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize10Count / 10);
2998 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize11Count / 11);
2999 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize12Count / 12);
3001 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize13Count / 13);
3002 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize14Count / 14);
3004 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize15Count / 15);
3005 pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count / 16);
3014 ========================================================================
3016 Routine Description:
3017 Reset NIC from error
3020 Adapter Pointer to our adapter
3025 IRQL = PASSIVE_LEVEL
3028 Reset NIC from error state
3030 ========================================================================
3032 VOID NICResetFromError(
3033 IN PRTMP_ADAPTER pAd)
3035 // Reset BBP (according to alex, reset ASIC will force reset BBP
3036 // Therefore, skip the reset BBP
3037 // RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x2);
3039 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
3040 // Remove ASIC from reset state
3041 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
3043 NICInitializeAdapter(pAd, FALSE);
3044 NICInitAsicFromEEPROM(pAd);
3046 // Switch to current channel, since during reset process, the connection should remains on.
3047 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
3048 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
3052 ========================================================================
3054 Routine Description:
3055 erase 8051 firmware image in MAC ASIC
3058 Adapter Pointer to our adapter
3060 IRQL = PASSIVE_LEVEL
3062 ========================================================================
3064 VOID NICEraseFirmware(
3065 IN PRTMP_ADAPTER pAd)
3069 for(i=0; i<MAX_FIRMWARE_IMAGE_SIZE; i+=4)
3070 RTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, 0);
3072 }/* End of NICEraseFirmware */
3075 ========================================================================
3077 Routine Description:
3078 Load 8051 firmware RT2561.BIN file into MAC ASIC
3081 Adapter Pointer to our adapter
3084 NDIS_STATUS_SUCCESS firmware image load ok
3085 NDIS_STATUS_FAILURE image not found
3087 IRQL = PASSIVE_LEVEL
3089 ========================================================================
3091 NDIS_STATUS NICLoadFirmware(
3092 IN PRTMP_ADAPTER pAd)
3094 NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
3095 PUCHAR pFirmwareImage;
3096 ULONG FileLength, Index;
3100 UINT32 Version = (pAd->MACVersion >> 16);
3103 pFirmwareImage = FirmwareImage;
3104 FileLength = sizeof(FirmwareImage);
3106 // New 8k byte firmware size for RT3071/RT3072
3107 //printk("Usb Chip\n");
3108 if (FIRMWAREIMAGE_LENGTH == FIRMWAREIMAGE_MAX_LENGTH)
3109 //The firmware image consists of two parts. One is the origianl and the other is the new.
3112 if ((Version != 0x2860) && (Version != 0x2872) && (Version != 0x3070))
3113 { // Use Firmware V2.
3114 //printk("KH:Use New Version,part2\n");
3115 pFirmwareImage = (PUCHAR)&FirmwareImage[FIRMWAREIMAGEV1_LENGTH];
3116 FileLength = FIRMWAREIMAGEV2_LENGTH;
3120 //printk("KH:Use New Version,part1\n");
3121 pFirmwareImage = FirmwareImage;
3122 FileLength = FIRMWAREIMAGEV1_LENGTH;
3127 DBGPRINT(RT_DEBUG_ERROR, ("KH: bin file should be 8KB.\n"));
3128 Status = NDIS_STATUS_FAILURE;
3133 RT28XX_WRITE_FIRMWARE(pAd, pFirmwareImage, FileLength);
3135 /* check if MCU is ready */
3139 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg);
3144 RTMPusecDelay(1000);
3145 } while (Index++ < 1000);
3149 Status = NDIS_STATUS_FAILURE;
3150 DBGPRINT(RT_DEBUG_ERROR, ("NICLoadFirmware: MCU is not ready\n\n\n"));
3153 DBGPRINT(RT_DEBUG_TRACE,
3154 ("<=== %s (status=%d)\n", __func__, Status));
3156 } /* End of NICLoadFirmware */
3160 ========================================================================
3162 Routine Description:
3163 Load Tx rate switching parameters
3166 Adapter Pointer to our adapter
3169 NDIS_STATUS_SUCCESS firmware image load ok
3170 NDIS_STATUS_FAILURE image not found
3172 IRQL = PASSIVE_LEVEL
3175 1. (B0: Valid Item number) (B1:Initial item from zero)
3176 2. Item Number(Dec) Mode(Hex) Current MCS(Dec) TrainUp(Dec) TrainDown(Dec)
3178 ========================================================================
3180 NDIS_STATUS NICLoadRateSwitchingParams(
3181 IN PRTMP_ADAPTER pAd)
3183 return NDIS_STATUS_SUCCESS;
3187 ========================================================================
3189 Routine Description:
3190 if pSrc1 all zero with length Length, return 0.
3191 If not all zero, return 1
3200 IRQL = DISPATCH_LEVEL
3204 ========================================================================
3206 ULONG RTMPNotAllZero(
3213 pMem1 = (PUCHAR) pSrc1;
3215 for (Index = 0; Index < Length; Index++)
3217 if (pMem1[Index] != 0x0)
3223 if (Index == Length)
3234 ========================================================================
3236 Routine Description:
3237 Compare two memory block
3240 pSrc1 Pointer to first memory address
3241 pSrc2 Pointer to second memory address
3245 1: pSrc1 memory is larger
3246 2: pSrc2 memory is larger
3248 IRQL = DISPATCH_LEVEL
3252 ========================================================================
3254 ULONG RTMPCompareMemory(
3263 pMem1 = (PUCHAR) pSrc1;
3264 pMem2 = (PUCHAR) pSrc2;
3266 for (Index = 0; Index < Length; Index++)
3268 if (pMem1[Index] > pMem2[Index])
3270 else if (pMem1[Index] < pMem2[Index])
3279 ========================================================================
3281 Routine Description:
3282 Zero out memory block
3285 pSrc1 Pointer to memory address
3291 IRQL = PASSIVE_LEVEL
3292 IRQL = DISPATCH_LEVEL
3296 ========================================================================
3298 VOID RTMPZeroMemory(
3305 pMem = (PUCHAR) pSrc;
3307 for (Index = 0; Index < Length; Index++)
3313 VOID RTMPFillMemory(
3321 pMem = (PUCHAR) pSrc;
3323 for (Index = 0; Index < Length; Index++)
3330 ========================================================================
3332 Routine Description:
3333 Copy data from memory block 1 to memory block 2
3336 pDest Pointer to destination memory address
3337 pSrc Pointer to source memory address
3343 IRQL = PASSIVE_LEVEL
3344 IRQL = DISPATCH_LEVEL
3348 ========================================================================
3350 VOID RTMPMoveMemory(
3359 ASSERT((Length==0) || (pDest && pSrc));
3361 pMem1 = (PUCHAR) pDest;
3362 pMem2 = (PUCHAR) pSrc;
3364 for (Index = 0; Index < Length; Index++)
3366 pMem1[Index] = pMem2[Index];
3371 ========================================================================
3373 Routine Description:
3374 Initialize port configuration structure
3377 Adapter Pointer to our adapter
3382 IRQL = PASSIVE_LEVEL
3386 ========================================================================
3389 IN PRTMP_ADAPTER pAd)
3391 UINT key_index, bss_index;
3393 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit\n"));
3396 // part I. intialize common configuration
3399 pAd->BulkOutReq = 0;
3401 pAd->BulkOutComplete = 0;
3402 pAd->BulkOutCompleteOther = 0;
3403 pAd->BulkOutCompleteCancel = 0;
3405 pAd->BulkInComplete = 0;
3406 pAd->BulkInCompleteFail = 0;
3408 //pAd->QuickTimerP = 100;
3409 //pAd->TurnAggrBulkInCount = 0;
3410 pAd->bUsbTxBulkAggre = 0;
3412 // init as unsed value to ensure driver will set to MCU once.
3413 pAd->LedIndicatorStregth = 0xFF;
3415 pAd->CommonCfg.MaxPktOneTxBulk = 2;
3416 pAd->CommonCfg.TxBulkFactor = 1;
3417 pAd->CommonCfg.RxBulkFactor =1;
3419 pAd->CommonCfg.TxPower = 100; //mW
3421 NdisZeroMemory(&pAd->CommonCfg.IOTestParm, sizeof(pAd->CommonCfg.IOTestParm));
3424 for(key_index=0; key_index<SHARE_KEY_NUM; key_index++)
3426 for(bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++)
3428 pAd->SharedKey[bss_index][key_index].KeyLen = 0;
3429 pAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE;
3434 pAd->EepromAccess = FALSE;
3436 pAd->Antenna.word = 0;
3437 pAd->CommonCfg.BBPCurrentBW = BW_20;
3439 pAd->LedCntl.word = 0;
3441 pAd->LedIndicatorStregth = 0;
3442 pAd->RLnkCtrlOffset = 0;
3443 pAd->HostLnkCtrlOffset = 0;
3444 pAd->CheckDmaBusyCount = 0;
3447 pAd->bAutoTxAgcA = FALSE; // Default is OFF
3448 pAd->bAutoTxAgcG = FALSE; // Default is OFF
3449 pAd->RfIcType = RFIC_2820;
3451 // Init timer for reset complete event
3452 pAd->CommonCfg.CentralChannel = 1;
3453 pAd->bForcePrintTX = FALSE;
3454 pAd->bForcePrintRX = FALSE;
3455 pAd->bStaFifoTest = FALSE;
3456 pAd->bProtectionTest = FALSE;
3457 pAd->bHCCATest = FALSE;
3458 pAd->bGenOneHCCA = FALSE;
3459 pAd->CommonCfg.Dsifs = 10; // in units of usec
3460 pAd->CommonCfg.TxPower = 100; //mW
3461 pAd->CommonCfg.TxPowerPercentage = 0xffffffff; // AUTO
3462 pAd->CommonCfg.TxPowerDefault = 0xffffffff; // AUTO
3463 pAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; // use Long preamble on TX by defaut
3464 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
3465 pAd->CommonCfg.RtsThreshold = 2347;
3466 pAd->CommonCfg.FragmentThreshold = 2346;
3467 pAd->CommonCfg.UseBGProtection = 0; // 0: AUTO
3468 pAd->CommonCfg.bEnableTxBurst = TRUE; //0;
3469 pAd->CommonCfg.PhyMode = 0xff; // unknown
3470 pAd->CommonCfg.BandState = UNKNOWN_BAND;
3471 pAd->CommonCfg.RadarDetect.CSPeriod = 10;
3472 pAd->CommonCfg.RadarDetect.CSCount = 0;
3473 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
3474 pAd->CommonCfg.RadarDetect.ChMovingTime = 65;
3475 pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 3;
3476 pAd->CommonCfg.bAPSDCapable = FALSE;
3477 pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
3478 pAd->CommonCfg.TriggerTimerCount = 0;
3479 pAd->CommonCfg.bAPSDForcePowerSave = FALSE;
3480 pAd->CommonCfg.bCountryFlag = FALSE;
3481 pAd->CommonCfg.TxStream = 0;
3482 pAd->CommonCfg.RxStream = 0;
3484 NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI));
3486 NdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
3487 pAd->HTCEnable = FALSE;
3488 pAd->bBroadComHT = FALSE;
3489 pAd->CommonCfg.bRdg = FALSE;
3491 NdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
3492 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
3493 pAd->CommonCfg.BACapability.field.MpduDensity = 0;
3494 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
3495 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; //32;
3496 pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; //32;
3497 DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit. BACapability = 0x%x\n", pAd->CommonCfg.BACapability.word));
3499 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
3500 BATableInit(pAd, &pAd->BATable);
3502 pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
3503 pAd->CommonCfg.bHTProtect = 1;
3504 pAd->CommonCfg.bMIMOPSEnable = TRUE;
3505 pAd->CommonCfg.bBADecline = FALSE;
3506 pAd->CommonCfg.bDisableReordering = FALSE;
3508 pAd->CommonCfg.TxBASize = 7;
3510 pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
3512 //pAd->CommonCfg.HTPhyMode.field.BW = BW_20;
3513 //pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO;
3514 //pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800;
3515 //pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE;
3516 pAd->CommonCfg.TxRate = RATE_6;
3518 pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;
3519 pAd->CommonCfg.MlmeTransmit.field.BW = BW_20;
3520 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
3522 pAd->CommonCfg.BeaconPeriod = 100; // in mSec
3525 // part II. intialize STA specific configuration
3528 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT);
3529 RX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST);
3530 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);
3531 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);
3533 pAd->StaCfg.Psm = PWR_ACTIVE;
3535 pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled;
3536 pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;
3537 pAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled;
3538 pAd->StaCfg.bMixCipher = FALSE;
3539 pAd->StaCfg.DefaultKeyId = 0;
3541 // 802.1x port control
3542 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
3543 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
3544 pAd->StaCfg.LastMicErrorTime = 0;
3545 pAd->StaCfg.MicErrCnt = 0;
3546 pAd->StaCfg.bBlockAssoc = FALSE;
3547 pAd->StaCfg.WpaState = SS_NOTUSE;
3549 pAd->CommonCfg.NdisRadioStateOff = FALSE; // New to support microsoft disable radio with OID command
3551 pAd->StaCfg.RssiTrigger = 0;
3552 NdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(RSSI_SAMPLE));
3553 pAd->StaCfg.RssiTriggerMode = RSSI_TRIGGERED_UPON_BELOW_THRESHOLD;
3554 pAd->StaCfg.AtimWin = 0;
3555 pAd->StaCfg.DefaultListenCount = 3;//default listen count;
3556 pAd->StaCfg.BssType = BSS_INFRA; // BSS_INFRA or BSS_ADHOC or BSS_MONITOR
3557 pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
3558 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
3559 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
3561 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
3562 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
3565 // global variables mXXXX used in MAC protocol state machines
3566 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
3567 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
3568 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
3570 // PHY specification
3571 pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; // default PHY mode
3572 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); // CCK use LONG preamble
3575 // user desired power mode
3576 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
3577 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
3578 pAd->StaCfg.bWindowsACCAMEnable = FALSE;
3580 RTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer, GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec), pAd, FALSE);
3581 pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
3584 pAd->StaCfg.ScanCnt = 0;
3586 // CCX 2.0 control flag init
3587 pAd->StaCfg.CCXEnable = FALSE;
3588 pAd->StaCfg.CCXReqType = MSRN_TYPE_UNUSED;
3589 pAd->StaCfg.CCXQosECWMin = 4;
3590 pAd->StaCfg.CCXQosECWMax = 10;
3592 pAd->StaCfg.bHwRadio = TRUE; // Default Hardware Radio status is On
3593 pAd->StaCfg.bSwRadio = TRUE; // Default Software Radio status is On
3594 pAd->StaCfg.bRadio = TRUE; // bHwRadio && bSwRadio
3595 pAd->StaCfg.bHardwareRadio = FALSE; // Default is OFF
3596 pAd->StaCfg.bShowHiddenSSID = FALSE; // Default no show
3598 // Nitro mode control
3599 pAd->StaCfg.bAutoReconnect = TRUE;
3601 // Save the init time as last scan time, the system should do scan after 2 seconds.
3602 // This patch is for driver wake up from standby mode, system will do scan right away.
3603 pAd->StaCfg.LastScanTime = 0;
3604 NdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE+1);
3605 sprintf(pAd->nickname, "%s", STA_NIC_DEVICE_NAME);
3606 RTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer, GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc), pAd, FALSE);
3607 pAd->StaCfg.IEEE8021X = FALSE;
3608 pAd->StaCfg.IEEE8021x_required_keys = FALSE;
3609 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
3610 pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
3613 // Default for extra information is not valid
3614 pAd->ExtraInfo = EXTRA_INFO_CLEAR;
3616 // Default Config change flag
3617 pAd->bConfigChanged = FALSE;
3620 // part III. AP configurations
3627 // dynamic BBP R66:sensibity tuning to overcome background noise
3628 pAd->BbpTuning.bEnable = TRUE;
3629 pAd->BbpTuning.FalseCcaLowerThreshold = 100;
3630 pAd->BbpTuning.FalseCcaUpperThreshold = 512;
3631 pAd->BbpTuning.R66Delta = 4;
3632 pAd->Mlme.bEnableAutoAntennaCheck = TRUE;
3635 // Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value.
3636 // if not initial this value, the default value will be 0.
3638 pAd->BbpTuning.R66CurrentValue = 0x38;
3640 pAd->Bbp94 = BBPR94_DEFAULT;
3641 pAd->BbpForCCK = FALSE;
3643 // initialize MAC table and allocate spin lock
3644 NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));
3645 InitializeQueueHeader(&pAd->MacTab.McastPsQueue);
3646 NdisAllocateSpinLock(&pAd->MacTabLock);
3648 pAd->CommonCfg.bWiFiTest = FALSE;
3650 pAd->bPCIclkOff = FALSE;
3652 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
3654 DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
3657 // IRQL = PASSIVE_LEVEL
3660 if (ch >= '0' && ch <= '9') return (ch - '0'); // Handle numerals
3661 if (ch >= 'A' && ch <= 'F') return (ch - 'A' + 0xA); // Handle capitol hex digits
3662 if (ch >= 'a' && ch <= 'f') return (ch - 'a' + 0xA); // Handle small hex digits
3667 // FUNCTION: AtoH(char *, UCHAR *, int)
3669 // PURPOSE: Converts ascii string to network order hex
3672 // src - pointer to input ascii string
3673 // dest - pointer to output hex
3674 // destlen - size of dest
3678 // 2 ascii bytes make a hex byte so must put 1st ascii byte of pair
3679 // into upper nibble and 2nd ascii byte of pair into lower nibble.
3681 // IRQL = PASSIVE_LEVEL
3683 void AtoH(char * src, UCHAR * dest, int destlen)
3689 destTemp = (PUCHAR) dest;
3693 *destTemp = BtoH(*srcptr++) << 4; // Put 1st ascii byte in upper nibble.
3694 *destTemp += BtoH(*srcptr++); // Add 2nd ascii byte to above.
3699 VOID RTMPPatchMacBbpBug(
3700 IN PRTMP_ADAPTER pAd)
3704 // Initialize BBP register to default value
3705 for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
3707 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, (UCHAR)BBPRegTable[Index].Value);
3710 // Initialize RF register to default value
3711 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
3712 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
3714 // Re-init BBP register from EEPROM value
3715 NICInitAsicFromEEPROM(pAd);
3719 ========================================================================
3721 Routine Description:
3725 pAd Pointer to our adapter
3726 pTimer Timer structure
3727 pTimerFunc Function to execute when timer expired
3728 Repeat Ture for period timer
3735 ========================================================================
3738 IN PRTMP_ADAPTER pAd,
3739 IN PRALINK_TIMER_STRUCT pTimer,
3740 IN PVOID pTimerFunc,
3745 // Set Valid to TRUE for later used.
3746 // It will crash if we cancel a timer or set a timer
3747 // that we haven't initialize before.
3749 pTimer->Valid = TRUE;
3751 pTimer->PeriodicType = Repeat;
3752 pTimer->State = FALSE;
3753 pTimer->cookie = (ULONG) pData;
3759 RTMP_OS_Init_Timer(pAd, &pTimer->TimerObj, pTimerFunc, (PVOID) pTimer);
3763 ========================================================================
3765 Routine Description:
3769 pTimer Timer structure
3770 Value Timer value in milliseconds
3776 To use this routine, must call RTMPInitTimer before.
3778 ========================================================================
3781 IN PRALINK_TIMER_STRUCT pTimer,
3786 pTimer->TimerValue = Value;
3787 pTimer->State = FALSE;
3788 if (pTimer->PeriodicType == TRUE)
3790 pTimer->Repeat = TRUE;
3791 RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);
3795 pTimer->Repeat = FALSE;
3796 RTMP_OS_Add_Timer(&pTimer->TimerObj, Value);
3801 DBGPRINT_ERR(("RTMPSetTimer failed, Timer hasn't been initialize!\n"));
3807 ========================================================================
3809 Routine Description:
3813 pTimer Timer structure
3814 Value Timer value in milliseconds
3820 To use this routine, must call RTMPInitTimer before.
3822 ========================================================================
3825 IN PRALINK_TIMER_STRUCT pTimer,
3832 pTimer->TimerValue = Value;
3833 pTimer->State = FALSE;
3834 if (pTimer->PeriodicType == TRUE)
3836 RTMPCancelTimer(pTimer, &Cancel);
3837 RTMPSetTimer(pTimer, Value);
3841 RTMP_OS_Mod_Timer(&pTimer->TimerObj, Value);
3846 DBGPRINT_ERR(("RTMPModTimer failed, Timer hasn't been initialize!\n"));
3851 ========================================================================
3853 Routine Description:
3854 Cancel timer objects
3857 Adapter Pointer to our adapter
3862 IRQL = PASSIVE_LEVEL
3863 IRQL = DISPATCH_LEVEL
3866 1.) To use this routine, must call RTMPInitTimer before.
3867 2.) Reset NIC to initial state AS IS system boot up time.
3869 ========================================================================
3871 VOID RTMPCancelTimer(
3872 IN PRALINK_TIMER_STRUCT pTimer,
3873 OUT BOOLEAN *pCancelled)
3877 if (pTimer->State == FALSE)
3878 pTimer->Repeat = FALSE;
3879 RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);
3881 if (*pCancelled == TRUE)
3882 pTimer->State = TRUE;
3885 // We need to go-through the TimerQ to findout this timer handler and remove it if
3886 // it's still waiting for execution.
3888 RT2870_TimerQ_Remove(pTimer->pAd, pTimer);
3894 // NdisMCancelTimer just canced the timer and not mean release the timer.
3895 // And don't set the "Valid" to False. So that we can use this timer again.
3897 DBGPRINT_ERR(("RTMPCancelTimer failed, Timer hasn't been initialize!\n"));
3902 ========================================================================
3904 Routine Description:
3908 pAd Pointer to our adapter
3914 IRQL = PASSIVE_LEVEL
3915 IRQL = DISPATCH_LEVEL
3919 ========================================================================
3922 IN PRTMP_ADAPTER pAd,
3929 LowByte = pAd->LedCntl.field.LedMode&0x7f;
3934 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3935 pAd->LedIndicatorStregth = 0;
3938 if (pAd->CommonCfg.Channel > 14)
3942 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3946 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3949 LowByte = 0; // Driver sets MAC register and MAC controls LED
3952 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3956 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3958 case LED_ON_SITE_SURVEY:
3960 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3964 AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
3967 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetLED::Unknown Status %d\n", Status));
3972 // Keep LED status for LED SiteSurvey mode.
3973 // After SiteSurvey, we will set the LED mode to previous status.
3975 if ((Status != LED_ON_SITE_SURVEY) && (Status != LED_POWER_UP))
3976 pAd->LedStatus = Status;
3978 DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetLED::Mode=%d,HighByte=0x%02x,LowByte=0x%02x\n", pAd->LedCntl.field.LedMode, HighByte, LowByte));
3982 ========================================================================
3984 Routine Description:
3985 Set LED Signal Stregth
3988 pAd Pointer to our adapter
3994 IRQL = PASSIVE_LEVEL
3997 Can be run on any IRQL level.
3999 According to Microsoft Zero Config Wireless Signal Stregth definition as belows.
4006 ========================================================================
4008 VOID RTMPSetSignalLED(
4009 IN PRTMP_ADAPTER pAd,
4010 IN NDIS_802_11_RSSI Dbm)
4015 // if not Signal Stregth, then do nothing.
4017 if (pAd->LedCntl.field.LedMode != LED_MODE_SIGNAL_STREGTH)
4024 else if (Dbm <= -81)
4026 else if (Dbm <= -71)
4028 else if (Dbm <= -67)
4030 else if (Dbm <= -57)
4036 // Update Signal Stregth to firmware if changed.
4038 if (pAd->LedIndicatorStregth != nLed)
4040 AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed, pAd->LedCntl.field.Polarity);
4041 pAd->LedIndicatorStregth = nLed;
4046 ========================================================================
4048 Routine Description:
4052 pAd Pointer to our adapter
4057 IRQL <= DISPATCH_LEVEL
4060 Before Enable RX, make sure you have enabled Interrupt.
4061 ========================================================================
4063 VOID RTMPEnableRxTx(
4064 IN PRTMP_ADAPTER pAd)
4066 DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n"));
4069 RT28XXDMAEnable(pAd);
4071 // enable RX of MAC block
4072 if (pAd->OpMode == OPMODE_AP)
4074 UINT32 rx_filter_flag = APNORMAL;
4077 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); // enable RX of DMA block
4081 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL); // Staion not drop control frame will fail WiFi Certification.
4084 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);
4085 DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPEnableRxTx\n"));