summaryrefslogtreecommitdiff
path: root/drivers/staging/rt2860/common/rtmp_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/rt2860/common/rtmp_init.c')
-rw-r--r--drivers/staging/rt2860/common/rtmp_init.c3536
1 files changed, 0 insertions, 3536 deletions
diff --git a/drivers/staging/rt2860/common/rtmp_init.c b/drivers/staging/rt2860/common/rtmp_init.c
deleted file mode 100644
index 5fa193eac0d3..000000000000
--- a/drivers/staging/rt2860/common/rtmp_init.c
+++ /dev/null
@@ -1,3536 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- rtmp_init.c
-
- Abstract:
- Miniport generic portion header file
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
-*/
-#include "../rt_config.h"
-
-u8 BIT8[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
-char *CipherName[] =
- { "none", "wep64", "wep128", "TKIP", "AES", "CKIP64", "CKIP128" };
-
-/* */
-/* BBP register initialization set */
-/* */
-struct rt_reg_pair BBPRegTable[] = {
- {BBP_R65, 0x2C}, /* fix rssi issue */
- {BBP_R66, 0x38}, /* Also set this default value to pAd->BbpTuning.R66CurrentValue at initial */
- {BBP_R69, 0x12},
- {BBP_R70, 0xa}, /* BBP_R70 will change to 0x8 in ApStartUp and LinkUp for rt2860C, otherwise value is 0xa */
- {BBP_R73, 0x10},
- {BBP_R81, 0x37},
- {BBP_R82, 0x62},
- {BBP_R83, 0x6A},
- {BBP_R84, 0x99}, /* 0x19 is for rt2860E and after. This is for extension channel overlapping IOT. 0x99 is for rt2860D and before */
- {BBP_R86, 0x00}, /* middle range issue, Rory @2008-01-28 */
- {BBP_R91, 0x04}, /* middle range issue, Rory @2008-01-28 */
- {BBP_R92, 0x00}, /* middle range issue, Rory @2008-01-28 */
- {BBP_R103, 0x00}, /* near range high-power issue, requested from Gary @2008-0528 */
- {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. */
- {BBP_R106, 0x35}, /* for ShortGI throughput */
-};
-
-#define NUM_BBP_REG_PARMS (sizeof(BBPRegTable) / sizeof(struct rt_reg_pair))
-
-/* */
-/* ASIC register initialization sets */
-/* */
-
-struct rt_rtmp_reg_pair MACRegTable[] = {
-#if defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x200)
- {BCN_OFFSET0, 0xf8f0e8e0}, /* 0x3800(e0), 0x3A00(e8), 0x3C00(f0), 0x3E00(f8), 512B for each beacon */
- {BCN_OFFSET1, 0x6f77d0c8}, /* 0x3200(c8), 0x3400(d0), 0x1DC0(77), 0x1BC0(6f), 512B for each beacon */
-#elif defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x100)
- {BCN_OFFSET0, 0xece8e4e0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
- {BCN_OFFSET1, 0xfcf8f4f0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
-#else
-#error You must re-calculate new value for BCN_OFFSET0 & BCN_OFFSET1 in MACRegTable[]!
-#endif /* HW_BEACON_OFFSET // */
-
- {LEGACY_BASIC_RATE, 0x0000013f}, /* Basic rate set bitmap */
- {HT_BASIC_RATE, 0x00008003}, /* Basic HT rate set , 20M, MCS=3, MM. Format is the same as in TXWI. */
- {MAC_SYS_CTRL, 0x00}, /* 0x1004, , default Disable RX */
- {RX_FILTR_CFG, 0x17f97}, /*0x1400 , RX filter control, */
- {BKOFF_SLOT_CFG, 0x209}, /* default set short slot time, CC_DELAY_TIME should be 2 */
- /*{TX_SW_CFG0, 0x40a06}, // Gary,2006-08-23 */
- {TX_SW_CFG0, 0x0}, /* Gary,2008-05-21 for CWC test */
- {TX_SW_CFG1, 0x80606}, /* Gary,2006-08-23 */
- {TX_LINK_CFG, 0x1020}, /* Gary,2006-08-23 */
- /*{TX_TIMEOUT_CFG, 0x00182090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT */
- {TX_TIMEOUT_CFG, 0x000a2090}, /* CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT , Modify for 2860E ,2007-08-01 */
- {MAX_LEN_CFG, MAX_AGGREGATION_SIZE | 0x00001000}, /* 0x3018, MAX frame length. Max PSDU = 16kbytes. */
- {LED_CFG, 0x7f031e46}, /* Gary, 2006-08-23 */
-
- {PBF_MAX_PCNT, 0x1F3FBF9F}, /*0x1F3f7f9f}, //Jan, 2006/04/20 */
-
- {TX_RTY_CFG, 0x47d01f0f}, /* Jan, 2006/11/16, Set TxWI->ACK =0 in Probe Rsp Modify for 2860E ,2007-08-03 */
-
- {AUTO_RSP_CFG, 0x00000013}, /* Initial Auto_Responder, because QA will turn off Auto-Responder */
- {CCK_PROT_CFG, 0x05740003 /*0x01740003 */ }, /* Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled. */
- {OFDM_PROT_CFG, 0x05740003 /*0x01740003 */ }, /* Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled. */
-#ifdef RTMP_MAC_USB
- {PBF_CFG, 0xf40006}, /* Only enable Queue 2 */
- {MM40_PROT_CFG, 0x3F44084}, /* Initial Auto_Responder, because QA will turn off Auto-Responder */
- {WPDMA_GLO_CFG, 0x00000030},
-#endif /* RTMP_MAC_USB // */
- {GF20_PROT_CFG, 0x01744004}, /* set 19:18 --> Short NAV for MIMO PS */
- {GF40_PROT_CFG, 0x03F44084},
- {MM20_PROT_CFG, 0x01744004},
-#ifdef RTMP_MAC_PCI
- {MM40_PROT_CFG, 0x03F54084},
-#endif /* RTMP_MAC_PCI // */
- {TXOP_CTRL_CFG, 0x0000583f, /*0x0000243f *//*0x000024bf */ }, /*Extension channel backoff. */
- {TX_RTS_CFG, 0x00092b20},
- {EXP_ACK_TIME, 0x002400ca}, /* default value */
-
- {TXOP_HLDR_ET, 0x00000002},
-
- /* Jerry comments 2008/01/16: we use SIFS = 10us in CCK defaultly, but it seems that 10us
- is too small for INTEL 2200bg card, so in MBSS mode, the delta time between beacon0
- and beacon1 is SIFS (10us), so if INTEL 2200bg card connects to BSS0, the ping
- will always lost. So we change the SIFS of CCK from 10us to 16us. */
- {XIFS_TIME_CFG, 0x33a41010},
- {PWR_PIN_CFG, 0x00000003}, /* patch for 2880-E */
-};
-
-struct rt_rtmp_reg_pair STAMACRegTable[] = {
- {WMM_AIFSN_CFG, 0x00002273},
- {WMM_CWMIN_CFG, 0x00002344},
- {WMM_CWMAX_CFG, 0x000034aa},
-};
-
-#define NUM_MAC_REG_PARMS (sizeof(MACRegTable) / sizeof(struct rt_rtmp_reg_pair))
-#define NUM_STA_MAC_REG_PARMS (sizeof(STAMACRegTable) / sizeof(struct rt_rtmp_reg_pair))
-
-/*
- ========================================================================
-
- Routine Description:
- Allocate struct rt_rtmp_adapter data block and do some initialization
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- NDIS_STATUS_SUCCESS
- NDIS_STATUS_FAILURE
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int RTMPAllocAdapterBlock(void *handle,
- struct rt_rtmp_adapter * * ppAdapter)
-{
- struct rt_rtmp_adapter *pAd;
- int Status;
- int index;
- u8 *pBeaconBuf = NULL;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocAdapterBlock\n"));
-
- *ppAdapter = NULL;
-
- do {
- /* Allocate struct rt_rtmp_adapter memory block */
- pBeaconBuf = kmalloc(MAX_BEACON_SIZE, MEM_ALLOC_FLAG);
- if (pBeaconBuf == NULL) {
- Status = NDIS_STATUS_FAILURE;
- DBGPRINT_ERR("Failed to allocate memory - BeaconBuf!\n");
- break;
- }
- NdisZeroMemory(pBeaconBuf, MAX_BEACON_SIZE);
-
- Status = AdapterBlockAllocateMemory(handle, (void **) & pAd);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("Failed to allocate memory - ADAPTER\n");
- break;
- }
- pAd->BeaconBuf = pBeaconBuf;
- DBGPRINT(RT_DEBUG_OFF,
- ("=== pAd = %p, size = %d ===\n", pAd,
- (u32)sizeof(struct rt_rtmp_adapter)));
-
- /* Init spin locks */
- NdisAllocateSpinLock(&pAd->MgmtRingLock);
-#ifdef RTMP_MAC_PCI
- NdisAllocateSpinLock(&pAd->RxRingLock);
-#ifdef RT3090
- NdisAllocateSpinLock(&pAd->McuCmdLock);
-#endif /* RT3090 // */
-#endif /* RTMP_MAC_PCI // */
-
- for (index = 0; index < NUM_OF_TX_RING; index++) {
- NdisAllocateSpinLock(&pAd->TxSwQueueLock[index]);
- NdisAllocateSpinLock(&pAd->DeQueueLock[index]);
- pAd->DeQueueRunning[index] = FALSE;
- }
-
- NdisAllocateSpinLock(&pAd->irq_lock);
-
- } while (FALSE);
-
- if ((Status != NDIS_STATUS_SUCCESS) && (pBeaconBuf))
- kfree(pBeaconBuf);
-
- *ppAdapter = pAd;
-
- DBGPRINT_S(Status, ("<-- RTMPAllocAdapterBlock, Status=%x\n", Status));
- return Status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read initial Tx power per MCS and BW from EEPROM
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPReadTxPwrPerRate(struct rt_rtmp_adapter *pAd)
-{
- unsigned long data, Adata, Gdata;
- u16 i, value, value2;
- int Apwrdelta, Gpwrdelta;
- u8 t1, t2, t3, t4;
- BOOLEAN bApwrdeltaMinus = TRUE, bGpwrdeltaMinus = TRUE;
-
- /* */
- /* Get power delta for 20MHz and 40MHz. */
- /* */
- DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n"));
- RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);
- Apwrdelta = 0;
- Gpwrdelta = 0;
-
- if ((value2 & 0xff) != 0xff) {
- if ((value2 & 0x80))
- Gpwrdelta = (value2 & 0xf);
-
- if ((value2 & 0x40))
- bGpwrdeltaMinus = FALSE;
- else
- bGpwrdeltaMinus = TRUE;
- }
- if ((value2 & 0xff00) != 0xff00) {
- if ((value2 & 0x8000))
- Apwrdelta = ((value2 & 0xf00) >> 8);
-
- if ((value2 & 0x4000))
- bApwrdeltaMinus = FALSE;
- else
- bApwrdeltaMinus = TRUE;
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("Gpwrdelta = %x, Apwrdelta = %x .\n", Gpwrdelta, Apwrdelta));
-
- /* */
- /* Get Txpower per MCS for 20MHz in 2.4G. */
- /* */
- for (i = 0; i < 5; i++) {
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i * 4,
- value);
- data = value;
- if (bApwrdeltaMinus == FALSE) {
- t1 = (value & 0xf) + (Apwrdelta);
- if (t1 > 0xf)
- t1 = 0xf;
- t2 = ((value & 0xf0) >> 4) + (Apwrdelta);
- if (t2 > 0xf)
- t2 = 0xf;
- t3 = ((value & 0xf00) >> 8) + (Apwrdelta);
- if (t3 > 0xf)
- t3 = 0xf;
- t4 = ((value & 0xf000) >> 12) + (Apwrdelta);
- if (t4 > 0xf)
- t4 = 0xf;
- } else {
- if ((value & 0xf) > Apwrdelta)
- t1 = (value & 0xf) - (Apwrdelta);
- else
- t1 = 0;
- if (((value & 0xf0) >> 4) > Apwrdelta)
- t2 = ((value & 0xf0) >> 4) - (Apwrdelta);
- else
- t2 = 0;
- if (((value & 0xf00) >> 8) > Apwrdelta)
- t3 = ((value & 0xf00) >> 8) - (Apwrdelta);
- else
- t3 = 0;
- if (((value & 0xf000) >> 12) > Apwrdelta)
- t4 = ((value & 0xf000) >> 12) - (Apwrdelta);
- else
- t4 = 0;
- }
- Adata = t1 + (t2 << 4) + (t3 << 8) + (t4 << 12);
- if (bGpwrdeltaMinus == FALSE) {
- t1 = (value & 0xf) + (Gpwrdelta);
- if (t1 > 0xf)
- t1 = 0xf;
- t2 = ((value & 0xf0) >> 4) + (Gpwrdelta);
- if (t2 > 0xf)
- t2 = 0xf;
- t3 = ((value & 0xf00) >> 8) + (Gpwrdelta);
- if (t3 > 0xf)
- t3 = 0xf;
- t4 = ((value & 0xf000) >> 12) + (Gpwrdelta);
- if (t4 > 0xf)
- t4 = 0xf;
- } else {
- if ((value & 0xf) > Gpwrdelta)
- t1 = (value & 0xf) - (Gpwrdelta);
- else
- t1 = 0;
- if (((value & 0xf0) >> 4) > Gpwrdelta)
- t2 = ((value & 0xf0) >> 4) - (Gpwrdelta);
- else
- t2 = 0;
- if (((value & 0xf00) >> 8) > Gpwrdelta)
- t3 = ((value & 0xf00) >> 8) - (Gpwrdelta);
- else
- t3 = 0;
- if (((value & 0xf000) >> 12) > Gpwrdelta)
- t4 = ((value & 0xf000) >> 12) - (Gpwrdelta);
- else
- t4 = 0;
- }
- Gdata = t1 + (t2 << 4) + (t3 << 8) + (t4 << 12);
-
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i * 4 +
- 2, value);
- if (bApwrdeltaMinus == FALSE) {
- t1 = (value & 0xf) + (Apwrdelta);
- if (t1 > 0xf)
- t1 = 0xf;
- t2 = ((value & 0xf0) >> 4) + (Apwrdelta);
- if (t2 > 0xf)
- t2 = 0xf;
- t3 = ((value & 0xf00) >> 8) + (Apwrdelta);
- if (t3 > 0xf)
- t3 = 0xf;
- t4 = ((value & 0xf000) >> 12) + (Apwrdelta);
- if (t4 > 0xf)
- t4 = 0xf;
- } else {
- if ((value & 0xf) > Apwrdelta)
- t1 = (value & 0xf) - (Apwrdelta);
- else
- t1 = 0;
- if (((value & 0xf0) >> 4) > Apwrdelta)
- t2 = ((value & 0xf0) >> 4) - (Apwrdelta);
- else
- t2 = 0;
- if (((value & 0xf00) >> 8) > Apwrdelta)
- t3 = ((value & 0xf00) >> 8) - (Apwrdelta);
- else
- t3 = 0;
- if (((value & 0xf000) >> 12) > Apwrdelta)
- t4 = ((value & 0xf000) >> 12) - (Apwrdelta);
- else
- t4 = 0;
- }
- Adata |= ((t1 << 16) + (t2 << 20) + (t3 << 24) + (t4 << 28));
- if (bGpwrdeltaMinus == FALSE) {
- t1 = (value & 0xf) + (Gpwrdelta);
- if (t1 > 0xf)
- t1 = 0xf;
- t2 = ((value & 0xf0) >> 4) + (Gpwrdelta);
- if (t2 > 0xf)
- t2 = 0xf;
- t3 = ((value & 0xf00) >> 8) + (Gpwrdelta);
- if (t3 > 0xf)
- t3 = 0xf;
- t4 = ((value & 0xf000) >> 12) + (Gpwrdelta);
- if (t4 > 0xf)
- t4 = 0xf;
- } else {
- if ((value & 0xf) > Gpwrdelta)
- t1 = (value & 0xf) - (Gpwrdelta);
- else
- t1 = 0;
- if (((value & 0xf0) >> 4) > Gpwrdelta)
- t2 = ((value & 0xf0) >> 4) - (Gpwrdelta);
- else
- t2 = 0;
- if (((value & 0xf00) >> 8) > Gpwrdelta)
- t3 = ((value & 0xf00) >> 8) - (Gpwrdelta);
- else
- t3 = 0;
- if (((value & 0xf000) >> 12) > Gpwrdelta)
- t4 = ((value & 0xf000) >> 12) - (Gpwrdelta);
- else
- t4 = 0;
- }
- Gdata |= ((t1 << 16) + (t2 << 20) + (t3 << 24) + (t4 << 28));
- data |= (value << 16);
-
- /* For 20M/40M Power Delta issue */
- pAd->Tx20MPwrCfgABand[i] = data;
- pAd->Tx20MPwrCfgGBand[i] = data;
- pAd->Tx40MPwrCfgABand[i] = Adata;
- pAd->Tx40MPwrCfgGBand[i] = Gdata;
-
- if (data != 0xffffffff)
- RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i * 4, data);
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("20MHz BW, 2.4G band-%lx, Adata = %lx, Gdata = %lx \n",
- data, Adata, Gdata));
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read initial channel power parameters from EEPROM
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPReadChannelPwr(struct rt_rtmp_adapter *pAd)
-{
- u8 i, choffset;
- EEPROM_TX_PWR_STRUC Power;
- EEPROM_TX_PWR_STRUC Power2;
-
- /* Read Tx power value for all channels */
- /* Value from 1 - 0x7f. Default value is 24. */
- /* Power value : 2.4G 0x00 (0) ~ 0x1F (31) */
- /* : 5.5G 0xF9 (-7) ~ 0x0F (15) */
-
- /* 0. 11b/g, ch1 - ch 14 */
- for (i = 0; i < 7; i++) {
- RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2,
- Power.word);
- RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2,
- Power2.word);
- pAd->TxPower[i * 2].Channel = i * 2 + 1;
- pAd->TxPower[i * 2 + 1].Channel = i * 2 + 2;
-
- if ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0))
- pAd->TxPower[i * 2].Power = DEFAULT_RF_TX_POWER;
- else
- pAd->TxPower[i * 2].Power = Power.field.Byte0;
-
- if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0))
- pAd->TxPower[i * 2 + 1].Power = DEFAULT_RF_TX_POWER;
- else
- pAd->TxPower[i * 2 + 1].Power = Power.field.Byte1;
-
- if ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0))
- pAd->TxPower[i * 2].Power2 = DEFAULT_RF_TX_POWER;
- else
- pAd->TxPower[i * 2].Power2 = Power2.field.Byte0;
-
- if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0))
- pAd->TxPower[i * 2 + 1].Power2 = DEFAULT_RF_TX_POWER;
- else
- pAd->TxPower[i * 2 + 1].Power2 = Power2.field.Byte1;
- }
-
- /* 1. U-NII lower/middle band: 36, 38, 40; 44, 46, 48; 52, 54, 56; 60, 62, 64 (including central frequency in BW 40MHz) */
- /* 1.1 Fill up channel */
- choffset = 14;
- for (i = 0; i < 4; i++) {
- pAd->TxPower[3 * i + choffset + 0].Channel = 36 + i * 8 + 0;
- pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 1].Channel = 36 + i * 8 + 2;
- pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 2].Channel = 36 + i * 8 + 4;
- pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
- }
-
- /* 1.2 Fill up power */
- for (i = 0; i < 6; i++) {
- RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2,
- Power.word);
- RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2,
- Power2.word);
-
- if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power =
- Power.field.Byte0;
-
- if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power =
- Power.field.Byte1;
-
- if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power2 =
- Power2.field.Byte0;
-
- if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power2 =
- Power2.field.Byte1;
- }
-
- /* 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) */
- /* 2.1 Fill up channel */
- choffset = 14 + 12;
- for (i = 0; i < 5; i++) {
- pAd->TxPower[3 * i + choffset + 0].Channel = 100 + i * 8 + 0;
- pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 1].Channel = 100 + i * 8 + 2;
- pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 2].Channel = 100 + i * 8 + 4;
- pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
- }
- pAd->TxPower[3 * 5 + choffset + 0].Channel = 140;
- pAd->TxPower[3 * 5 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * 5 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- /* 2.2 Fill up power */
- for (i = 0; i < 8; i++) {
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_A_TX_PWR_OFFSET + (choffset - 14) +
- i * 2, Power.word);
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) +
- i * 2, Power2.word);
-
- if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power =
- Power.field.Byte0;
-
- if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power =
- Power.field.Byte1;
-
- if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power2 =
- Power2.field.Byte0;
-
- if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power2 =
- Power2.field.Byte1;
- }
-
- /* 3. U-NII upper band: 149, 151, 153; 157, 159, 161; 165, 167, 169; 171, 173 (including central frequency in BW 40MHz) */
- /* 3.1 Fill up channel */
- choffset = 14 + 12 + 16;
- /*for (i = 0; i < 2; i++) */
- for (i = 0; i < 3; i++) {
- pAd->TxPower[3 * i + choffset + 0].Channel = 149 + i * 8 + 0;
- pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 1].Channel = 149 + i * 8 + 2;
- pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 2].Channel = 149 + i * 8 + 4;
- pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
- }
- pAd->TxPower[3 * 3 + choffset + 0].Channel = 171;
- pAd->TxPower[3 * 3 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * 3 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * 3 + choffset + 1].Channel = 173;
- pAd->TxPower[3 * 3 + choffset + 1].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * 3 + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
-
- /* 3.2 Fill up power */
- /*for (i = 0; i < 4; i++) */
- for (i = 0; i < 6; i++) {
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_A_TX_PWR_OFFSET + (choffset - 14) +
- i * 2, Power.word);
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) +
- i * 2, Power2.word);
-
- if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power =
- Power.field.Byte0;
-
- if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power =
- Power.field.Byte1;
-
- if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power2 =
- Power2.field.Byte0;
-
- if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power2 =
- Power2.field.Byte1;
- }
-
- /* 4. Print and Debug */
- /*choffset = 14 + 12 + 16 + 7; */
- choffset = 14 + 12 + 16 + 11;
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read the following from the registry
- 1. All the parameters
- 2. NetworkAddres
-
- Arguments:
- Adapter Pointer to our adapter
- WrapperConfigurationContext For use by NdisOpenConfiguration
-
- Return Value:
- NDIS_STATUS_SUCCESS
- NDIS_STATUS_FAILURE
- NDIS_STATUS_RESOURCES
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int NICReadRegParameters(struct rt_rtmp_adapter *pAd,
- void *WrapperConfigurationContext)
-{
- int Status = NDIS_STATUS_SUCCESS;
- DBGPRINT_S(Status, ("<-- NICReadRegParameters, Status=%x\n", Status));
- return Status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read initial parameters from EEPROM
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void NICReadEEPROMParameters(struct rt_rtmp_adapter *pAd, u8 *mac_addr)
-{
- u32 data = 0;
- u16 i, value, value2;
- u8 TmpPhy;
- EEPROM_TX_PWR_STRUC Power;
- EEPROM_VERSION_STRUC Version;
- EEPROM_ANTENNA_STRUC Antenna;
- EEPROM_NIC_CONFIG2_STRUC NicConfig2;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n"));
-
- if (pAd->chipOps.eeinit)
- pAd->chipOps.eeinit(pAd);
-
- /* Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8 */
- RTMP_IO_READ32(pAd, E2PROM_CSR, &data);
- DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%x\n", data));
-
- if ((data & 0x30) == 0)
- pAd->EEPROMAddressNum = 6; /* 93C46 */
- else if ((data & 0x30) == 0x10)
- pAd->EEPROMAddressNum = 8; /* 93C66 */
- else
- pAd->EEPROMAddressNum = 8; /* 93C86 */
- DBGPRINT(RT_DEBUG_TRACE,
- ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum));
-
- /* RT2860 MAC no longer auto load MAC address from E2PROM. Driver has to initialize */
- /* MAC address registers according to E2PROM setting */
- if (mac_addr == NULL ||
- strlen((char *)mac_addr) != 17 ||
- mac_addr[2] != ':' || mac_addr[5] != ':' || mac_addr[8] != ':' ||
- mac_addr[11] != ':' || mac_addr[14] != ':') {
- u16 Addr01, Addr23, Addr45;
-
- RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);
- RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);
- RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);
-
- pAd->PermanentAddress[0] = (u8)(Addr01 & 0xff);
- pAd->PermanentAddress[1] = (u8)(Addr01 >> 8);
- pAd->PermanentAddress[2] = (u8)(Addr23 & 0xff);
- pAd->PermanentAddress[3] = (u8)(Addr23 >> 8);
- pAd->PermanentAddress[4] = (u8)(Addr45 & 0xff);
- pAd->PermanentAddress[5] = (u8)(Addr45 >> 8);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Initialize MAC Address from E2PROM \n"));
- } else {
- int j;
- char *macptr;
-
- macptr = (char *)mac_addr;
-
- for (j = 0; j < MAC_ADDR_LEN; j++) {
- AtoH(macptr, &pAd->PermanentAddress[j], 1);
- macptr = macptr + 3;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Initialize MAC Address from module parameter \n"));
- }
-
- {
- /*more conveninet to test mbssid, so ap's bssid &0xf1 */
- if (pAd->PermanentAddress[0] == 0xff)
- pAd->PermanentAddress[0] = RandomByte(pAd) & 0xf8;
-
- /*if (pAd->PermanentAddress[5] == 0xff) */
- /* pAd->PermanentAddress[5] = RandomByte(pAd)&0xf8; */
-
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("E2PROM MAC: =%pM\n", pAd->PermanentAddress));
- if (pAd->bLocalAdminMAC == FALSE) {
- MAC_DW0_STRUC csr2;
- MAC_DW1_STRUC csr3;
- COPY_MAC_ADDR(pAd->CurrentAddress,
- pAd->PermanentAddress);
- csr2.field.Byte0 = pAd->CurrentAddress[0];
- csr2.field.Byte1 = pAd->CurrentAddress[1];
- csr2.field.Byte2 = pAd->CurrentAddress[2];
- csr2.field.Byte3 = pAd->CurrentAddress[3];
- RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word);
- csr3.word = 0;
- csr3.field.Byte4 = pAd->CurrentAddress[4];
- csr3.field.Byte5 = pAd->CurrentAddress[5];
- csr3.field.U2MeMask = 0xff;
- RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word);
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("E2PROM MAC: =%pM\n",
- pAd->PermanentAddress));
- }
- }
-
- /* if not return early. cause fail at emulation. */
- /* Init the channel number for TX channel power */
- RTMPReadChannelPwr(pAd);
-
- /* if E2PROM version mismatch with driver's expectation, then skip */
- /* all subsequent E2RPOM retieval and set a system error bit to notify GUI */
- RT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word);
- pAd->EepromVersion =
- Version.field.Version + Version.field.FaeReleaseNumber * 256;
- DBGPRINT(RT_DEBUG_TRACE,
- ("E2PROM: Version = %d, FAE release #%d\n",
- Version.field.Version, Version.field.FaeReleaseNumber));
-
- if (Version.field.Version > VALID_EEPROM_VERSION) {
- DBGPRINT_ERR("E2PROM: WRONG VERSION 0x%x, should be %d\n", Version.field.Version, VALID_EEPROM_VERSION);
- /*pAd->SystemErrorBitmap |= 0x00000001;
-
- // hard-code default value when no proper E2PROM installed
- pAd->bAutoTxAgcA = FALSE;
- pAd->bAutoTxAgcG = FALSE;
-
- // Default the channel power
- for (i = 0; i < MAX_NUM_OF_CHANNELS; i++)
- pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER;
-
- // Default the channel power
- for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++)
- pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER;
-
- for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++)
- pAd->EEPROMDefaultValue[i] = 0xffff;
- return; */
- }
- /* Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd */
- RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value);
- pAd->EEPROMDefaultValue[0] = value;
-
- RT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);
- pAd->EEPROMDefaultValue[1] = value;
-
- RT28xx_EEPROM_READ16(pAd, 0x38, value); /* Country Region */
- pAd->EEPROMDefaultValue[2] = value;
-
- for (i = 0; i < 8; i++) {
- RT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i * 2,
- value);
- pAd->EEPROMDefaultValue[i + 3] = value;
- }
-
- /* We have to parse NIC configuration 0 at here. */
- /* If TSSI did not have preloaded value, it should reset the TxAutoAgc to false */
- /* Therefore, we have to read TxAutoAgc control beforehand. */
- /* Read Tx AGC control bit */
- Antenna.word = pAd->EEPROMDefaultValue[0];
- if (Antenna.word == 0xFFFF) {
-#ifdef RT30xx
- if (IS_RT3090(pAd) || IS_RT3390(pAd)) {
- Antenna.word = 0;
- Antenna.field.RfIcType = RFIC_3020;
- Antenna.field.TxPath = 1;
- Antenna.field.RxPath = 1;
- } else
-#endif /* RT30xx // */
- {
-
- Antenna.word = 0;
- Antenna.field.RfIcType = RFIC_2820;
- Antenna.field.TxPath = 1;
- Antenna.field.RxPath = 2;
- DBGPRINT(RT_DEBUG_WARN,
- ("E2PROM error, hard code as 0x%04x\n",
- Antenna.word));
- }
- }
- /* Choose the desired Tx&Rx stream. */
- if ((pAd->CommonCfg.TxStream == 0)
- || (pAd->CommonCfg.TxStream > Antenna.field.TxPath))
- pAd->CommonCfg.TxStream = Antenna.field.TxPath;
-
- if ((pAd->CommonCfg.RxStream == 0)
- || (pAd->CommonCfg.RxStream > Antenna.field.RxPath)) {
- pAd->CommonCfg.RxStream = Antenna.field.RxPath;
-
- if ((pAd->MACVersion < RALINK_2883_VERSION) &&
- (pAd->CommonCfg.RxStream > 2)) {
- /* only 2 Rx streams for RT2860 series */
- pAd->CommonCfg.RxStream = 2;
- }
- }
- /* 3*3 */
- /* read value from EEPROM and set them to CSR174 ~ 177 in chain0 ~ chain2 */
- /* yet implement */
- for (i = 0; i < 3; i++) {
- }
-
- NicConfig2.word = pAd->EEPROMDefaultValue[1];
-
- {
- if ((NicConfig2.word & 0x00ff) == 0xff) {
- NicConfig2.word &= 0xff00;
- }
-
- if ((NicConfig2.word >> 8) == 0xff) {
- NicConfig2.word &= 0x00ff;
- }
- }
-
- if (NicConfig2.field.DynamicTxAgcControl == 1)
- pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
- else
- pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
-
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n",
- Antenna.field.RxPath, Antenna.field.TxPath));
-
- /* Save the antenna for future use */
- pAd->Antenna.word = Antenna.word;
-
- /* Set the RfICType here, then we can initialize RFIC related operation callbacks */
- pAd->Mlme.RealRxPath = (u8)Antenna.field.RxPath;
- pAd->RfIcType = (u8)Antenna.field.RfIcType;
-
-#ifdef RTMP_RF_RW_SUPPORT
- RtmpChipOpsRFHook(pAd);
-#endif /* RTMP_RF_RW_SUPPORT // */
-
-#ifdef RTMP_MAC_PCI
- sprintf((char *)pAd->nickname, "RT2860STA");
-#endif /* RTMP_MAC_PCI // */
-
- /* */
- /* Reset PhyMode if we don't support 802.11a */
- /* Only RFIC_2850 & RFIC_2750 support 802.11a */
- /* */
- if ((Antenna.field.RfIcType != RFIC_2850)
- && (Antenna.field.RfIcType != RFIC_2750)
- && (Antenna.field.RfIcType != RFIC_3052)) {
- if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) ||
- (pAd->CommonCfg.PhyMode == PHY_11A))
- pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;
- else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
- (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) ||
- (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) ||
- (pAd->CommonCfg.PhyMode == PHY_11N_5G))
- pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED;
- }
- /* Read TSSI reference and TSSI boundary for temperature compensation. This is ugly */
- /* 0. 11b/g */
- {
- /* these are tempature reference value (0x00 ~ 0xFE)
- ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
- TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) +
- TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */
- RT28xx_EEPROM_READ16(pAd, 0x6E, Power.word);
- pAd->TssiMinusBoundaryG[4] = Power.field.Byte0;
- pAd->TssiMinusBoundaryG[3] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0x70, Power.word);
- pAd->TssiMinusBoundaryG[2] = Power.field.Byte0;
- pAd->TssiMinusBoundaryG[1] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0x72, Power.word);
- pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */
- pAd->TssiPlusBoundaryG[1] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0x74, Power.word);
- pAd->TssiPlusBoundaryG[2] = Power.field.Byte0;
- pAd->TssiPlusBoundaryG[3] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0x76, Power.word);
- pAd->TssiPlusBoundaryG[4] = Power.field.Byte0;
- pAd->TxAgcStepG = Power.field.Byte1;
- pAd->TxAgcCompensateG = 0;
- pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;
- pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG;
-
- /* Disable TxAgc if the based value is not right */
- if (pAd->TssiRefG == 0xff)
- pAd->bAutoTxAgcG = FALSE;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
- pAd->TssiMinusBoundaryG[4],
- pAd->TssiMinusBoundaryG[3],
- pAd->TssiMinusBoundaryG[2],
- pAd->TssiMinusBoundaryG[1], pAd->TssiRefG,
- pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2],
- pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],
- pAd->TxAgcStepG, pAd->bAutoTxAgcG));
- }
- /* 1. 11a */
- {
- RT28xx_EEPROM_READ16(pAd, 0xD4, Power.word);
- pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;
- pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0xD6, Power.word);
- pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;
- pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0xD8, Power.word);
- pAd->TssiRefA = Power.field.Byte0;
- pAd->TssiPlusBoundaryA[1] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0xDA, Power.word);
- pAd->TssiPlusBoundaryA[2] = Power.field.Byte0;
- pAd->TssiPlusBoundaryA[3] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0xDC, Power.word);
- pAd->TssiPlusBoundaryA[4] = Power.field.Byte0;
- pAd->TxAgcStepA = Power.field.Byte1;
- pAd->TxAgcCompensateA = 0;
- pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;
- pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA;
-
- /* Disable TxAgc if the based value is not right */
- if (pAd->TssiRefA == 0xff)
- pAd->bAutoTxAgcA = FALSE;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
- pAd->TssiMinusBoundaryA[4],
- pAd->TssiMinusBoundaryA[3],
- pAd->TssiMinusBoundaryA[2],
- pAd->TssiMinusBoundaryA[1], pAd->TssiRefA,
- pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2],
- pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],
- pAd->TxAgcStepA, pAd->bAutoTxAgcA));
- }
- pAd->BbpRssiToDbmDelta = 0x0;
-
- /* Read frequency offset setting for RF */
- RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value);
- if ((value & 0x00FF) != 0x00FF)
- pAd->RfFreqOffset = (unsigned long)(value & 0x00FF);
- else
- pAd->RfFreqOffset = 0;
- DBGPRINT(RT_DEBUG_TRACE,
- ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset));
-
- /*CountryRegion byte offset (38h) */
- value = pAd->EEPROMDefaultValue[2] >> 8; /* 2.4G band */
- value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; /* 5G band */
-
- if ((value <= REGION_MAXIMUM_BG_BAND)
- && (value2 <= REGION_MAXIMUM_A_BAND)) {
- pAd->CommonCfg.CountryRegion = ((u8)value) | 0x80;
- pAd->CommonCfg.CountryRegionForABand = ((u8)value2) | 0x80;
- TmpPhy = pAd->CommonCfg.PhyMode;
- pAd->CommonCfg.PhyMode = 0xff;
- RTMPSetPhyMode(pAd, TmpPhy);
- SetCommonHT(pAd);
- }
- /* */
- /* Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch. */
- /* The valid value are (-10 ~ 10) */
- /* */
- RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value);
- pAd->BGRssiOffset0 = value & 0x00ff;
- pAd->BGRssiOffset1 = (value >> 8);
- RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET + 2, value);
- pAd->BGRssiOffset2 = value & 0x00ff;
- pAd->ALNAGain1 = (value >> 8);
- RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value);
- pAd->BLNAGain = value & 0x00ff;
- pAd->ALNAGain0 = (value >> 8);
-
- /* Validate 11b/g RSSI_0 offset. */
- if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10))
- pAd->BGRssiOffset0 = 0;
-
- /* Validate 11b/g RSSI_1 offset. */
- if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))
- pAd->BGRssiOffset1 = 0;
-
- /* Validate 11b/g RSSI_2 offset. */
- if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))
- pAd->BGRssiOffset2 = 0;
-
- RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value);
- pAd->ARssiOffset0 = value & 0x00ff;
- pAd->ARssiOffset1 = (value >> 8);
- RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET + 2), value);
- pAd->ARssiOffset2 = value & 0x00ff;
- pAd->ALNAGain2 = (value >> 8);
-
- if (((u8)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))
- pAd->ALNAGain1 = pAd->ALNAGain0;
- if (((u8)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00))
- pAd->ALNAGain2 = pAd->ALNAGain0;
-
- /* Validate 11a RSSI_0 offset. */
- if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10))
- pAd->ARssiOffset0 = 0;
-
- /* Validate 11a RSSI_1 offset. */
- if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))
- pAd->ARssiOffset1 = 0;
-
- /*Validate 11a RSSI_2 offset. */
- if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))
- pAd->ARssiOffset2 = 0;
-
-#ifdef RT30xx
- /* */
- /* Get TX mixer gain setting */
- /* 0xff are invalid value */
- /* Note: RT30xX default value is 0x00 and will program to RF_R17 only when this value is not zero. */
- /* RT359X default value is 0x02 */
- /* */
- if (IS_RT30xx(pAd) || IS_RT3572(pAd)) {
- RT28xx_EEPROM_READ16(pAd, EEPROM_TXMIXER_GAIN_2_4G, value);
- pAd->TxMixerGain24G = 0;
- value &= 0x00ff;
- if (value != 0xff) {
- value &= 0x07;
- pAd->TxMixerGain24G = (u8)value;
- }
- }
-#endif /* RT30xx // */
-
- /* */
- /* Get LED Setting. */
- /* */
- RT28xx_EEPROM_READ16(pAd, 0x3a, value);
- pAd->LedCntl.word = (value >> 8);
- RT28xx_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET, value);
- pAd->Led1 = value;
- RT28xx_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET, value);
- pAd->Led2 = value;
- RT28xx_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET, value);
- pAd->Led3 = value;
-
- RTMPReadTxPwrPerRate(pAd);
-
-#ifdef RT30xx
-#ifdef RTMP_EFUSE_SUPPORT
- RtmpEfuseSupportCheck(pAd);
-#endif /* RTMP_EFUSE_SUPPORT // */
-#endif /* RT30xx // */
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Set default value from EEPROM
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void NICInitAsicFromEEPROM(struct rt_rtmp_adapter *pAd)
-{
- u32 data = 0;
- u8 BBPR1 = 0;
- u16 i;
-/* EEPROM_ANTENNA_STRUC Antenna; */
- EEPROM_NIC_CONFIG2_STRUC NicConfig2;
- u8 BBPR3 = 0;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitAsicFromEEPROM\n"));
- for (i = 3; i < NUM_EEPROM_BBP_PARMS; i++) {
- u8 BbpRegIdx, BbpValue;
-
- if ((pAd->EEPROMDefaultValue[i] != 0xFFFF)
- && (pAd->EEPROMDefaultValue[i] != 0)) {
- BbpRegIdx = (u8)(pAd->EEPROMDefaultValue[i] >> 8);
- BbpValue = (u8)(pAd->EEPROMDefaultValue[i] & 0xff);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);
- }
- }
-
- NicConfig2.word = pAd->EEPROMDefaultValue[1];
-
- {
- if ((NicConfig2.word & 0x00ff) == 0xff) {
- NicConfig2.word &= 0xff00;
- }
-
- if ((NicConfig2.word >> 8) == 0xff) {
- NicConfig2.word &= 0x00ff;
- }
- }
-
- /* Save the antenna for future use */
- pAd->NicConfig2.word = NicConfig2.word;
-
-#ifdef RT30xx
- /* set default antenna as main */
- if (pAd->RfIcType == RFIC_3020)
- AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
-#endif /* RT30xx // */
-
- /* */
- /* Send LED Setting to MCU. */
- /* */
- if (pAd->LedCntl.word == 0xFF) {
- pAd->LedCntl.word = 0x01;
- pAd->Led1 = 0x5555;
- pAd->Led2 = 0x2221;
-
-#ifdef RTMP_MAC_PCI
- pAd->Led3 = 0xA9F8;
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- pAd->Led3 = 0x5627;
-#endif /* RTMP_MAC_USB // */
- }
-
- AsicSendCommandToMcu(pAd, 0x52, 0xff, (u8)pAd->Led1,
- (u8)(pAd->Led1 >> 8));
- AsicSendCommandToMcu(pAd, 0x53, 0xff, (u8)pAd->Led2,
- (u8)(pAd->Led2 >> 8));
- AsicSendCommandToMcu(pAd, 0x54, 0xff, (u8)pAd->Led3,
- (u8)(pAd->Led3 >> 8));
- AsicSendCommandToMcu(pAd, 0x51, 0xff, 0, pAd->LedCntl.field.Polarity);
-
- pAd->LedIndicatorStrength = 0xFF;
- RTMPSetSignalLED(pAd, -100); /* Force signal strength Led to be turned off, before link up */
-
- {
- /* Read Hardware controlled Radio state enable bit */
- if (NicConfig2.field.HardwareRadioControl == 1) {
- pAd->StaCfg.bHardwareRadio = TRUE;
-
- /* Read GPIO pin2 as Hardware controlled radio state */
- RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
- if ((data & 0x04) == 0) {
- pAd->StaCfg.bHwRadio = FALSE;
- pAd->StaCfg.bRadio = FALSE;
-/* RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818); */
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
- }
- } else
- pAd->StaCfg.bHardwareRadio = FALSE;
-
- if (pAd->StaCfg.bRadio == FALSE) {
- RTMPSetLED(pAd, LED_RADIO_OFF);
- } else {
- RTMPSetLED(pAd, LED_RADIO_ON);
-#ifdef RTMP_MAC_PCI
-#ifdef RT3090
- AsicSendCommandToMcu(pAd, 0x30, PowerRadioOffCID, 0xff,
- 0x02);
- AsicCheckCommanOk(pAd, PowerRadioOffCID);
-#endif /* RT3090 // */
-#ifndef RT3090
- AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);
-#endif /* RT3090 // */
- AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00,
- 0x00);
- /* 2-1. wait command ok. */
- AsicCheckCommanOk(pAd, PowerWakeCID);
-#endif /* RTMP_MAC_PCI // */
- }
- }
-
-#ifdef RTMP_MAC_PCI
-#ifdef RT30xx
- if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
- if (pChipOps->AsicReverseRfFromSleepMode)
- pChipOps->AsicReverseRfFromSleepMode(pAd);
- }
- /* 3090 MCU Wakeup command needs more time to be stable. */
- /* Before stable, don't issue other MCU command to prevent from firmware error. */
-
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
- DBGPRINT(RT_DEBUG_TRACE, ("%s, release Mcu Lock\n", __func__));
- RTMP_SEM_LOCK(&pAd->McuCmdLock);
- pAd->brt30xxBanMcuCmd = FALSE;
- RTMP_SEM_UNLOCK(&pAd->McuCmdLock);
- }
-#endif /* RT30xx // */
-#endif /* RTMP_MAC_PCI // */
-
- /* Turn off patching for cardbus controller */
- if (NicConfig2.field.CardbusAcceleration == 1) {
-/* pAd->bTest1 = TRUE; */
- }
-
- if (NicConfig2.field.DynamicTxAgcControl == 1)
- pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
- else
- pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
- /* */
- /* Since BBP has been progamed, to make sure BBP setting will be */
- /* upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND! */
- /* */
- pAd->CommonCfg.BandState = UNKNOWN_BAND;
-
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
- BBPR3 &= (~0x18);
- if (pAd->Antenna.field.RxPath == 3) {
- BBPR3 |= (0x10);
- } else if (pAd->Antenna.field.RxPath == 2) {
- BBPR3 |= (0x8);
- } else if (pAd->Antenna.field.RxPath == 1) {
- BBPR3 |= (0x0);
- }
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
-
- {
- /* Handle the difference when 1T */
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
- if (pAd->Antenna.field.TxPath == 1) {
- BBPR1 &= (~0x18);
- }
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n",
- pAd->CommonCfg.bHardwareRadio,
- pAd->CommonCfg.bHardwareRadio));
- }
-
-#ifdef RTMP_MAC_USB
-#ifdef RT30xx
- /* update registers from EEPROM for RT3071 or later(3572/3592). */
-
- if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
- u8 RegIdx, RegValue;
- u16 value;
-
- /* after RT3071, write BBP from EEPROM 0xF0 to 0x102 */
- for (i = 0xF0; i <= 0x102; i = i + 2) {
- value = 0xFFFF;
- RT28xx_EEPROM_READ16(pAd, i, value);
- if ((value != 0xFFFF) && (value != 0)) {
- RegIdx = (u8)(value >> 8);
- RegValue = (u8)(value & 0xff);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, RegIdx,
- RegValue);
- DBGPRINT(RT_DEBUG_TRACE,
- ("Update BBP Registers from EEPROM(0x%0x), BBP(0x%x) = 0x%x\n",
- i, RegIdx, RegValue));
- }
- }
-
- /* after RT3071, write RF from EEPROM 0x104 to 0x116 */
- for (i = 0x104; i <= 0x116; i = i + 2) {
- value = 0xFFFF;
- RT28xx_EEPROM_READ16(pAd, i, value);
- if ((value != 0xFFFF) && (value != 0)) {
- RegIdx = (u8)(value >> 8);
- RegValue = (u8)(value & 0xff);
- RT30xxWriteRFRegister(pAd, RegIdx, RegValue);
- DBGPRINT(RT_DEBUG_TRACE,
- ("Update RF Registers from EEPROM0x%x), BBP(0x%x) = 0x%x\n",
- i, RegIdx, RegValue));
- }
- }
- }
-#endif /* RT30xx // */
-#endif /* RTMP_MAC_USB // */
-
- 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));
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n"));
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Initialize NIC hardware
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int NICInitializeAdapter(struct rt_rtmp_adapter *pAd, IN BOOLEAN bHardReset)
-{
- int Status = NDIS_STATUS_SUCCESS;
- WPDMA_GLO_CFG_STRUC GloCfg;
-#ifdef RTMP_MAC_PCI
- u32 Value;
- DELAY_INT_CFG_STRUC IntCfg;
-#endif /* RTMP_MAC_PCI // */
-/* INT_MASK_CSR_STRUC IntMask; */
- unsigned long i = 0, j = 0;
- AC_TXOP_CSR0_STRUC csr0;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n"));
-
- /* 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits: */
-retry:
- i = 0;
- do {
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
- if ((GloCfg.field.TxDMABusy == 0)
- && (GloCfg.field.RxDMABusy == 0))
- break;
-
- RTMPusecDelay(1000);
- i++;
- } while (i < 100);
- DBGPRINT(RT_DEBUG_TRACE,
- ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word));
- GloCfg.word &= 0xff0;
- GloCfg.field.EnTXWriteBackDDONE = 1;
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
-
- /* Record HW Beacon offset */
- pAd->BeaconOffset[0] = HW_BEACON_BASE0;
- pAd->BeaconOffset[1] = HW_BEACON_BASE1;
- pAd->BeaconOffset[2] = HW_BEACON_BASE2;
- pAd->BeaconOffset[3] = HW_BEACON_BASE3;
- pAd->BeaconOffset[4] = HW_BEACON_BASE4;
- pAd->BeaconOffset[5] = HW_BEACON_BASE5;
- pAd->BeaconOffset[6] = HW_BEACON_BASE6;
- pAd->BeaconOffset[7] = HW_BEACON_BASE7;
-
- /* */
- /* write all shared Ring's base address into ASIC */
- /* */
-
- /* asic simulation sequence put this ahead before loading firmware. */
- /* pbf hardware reset */
-#ifdef RTMP_MAC_PCI
- RTMP_IO_WRITE32(pAd, WPDMA_RST_IDX, 0x1003f); /* 0x10000 for reset rx, 0x3f resets all 6 tx rings. */
- RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe1f);
- RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe00);
-#endif /* RTMP_MAC_PCI // */
-
- /* Initialze ASIC for TX & Rx operation */
- if (NICInitializeAsic(pAd, bHardReset) != NDIS_STATUS_SUCCESS) {
- if (j++ == 0) {
- NICLoadFirmware(pAd);
- goto retry;
- }
- return NDIS_STATUS_FAILURE;
- }
-
-#ifdef RTMP_MAC_PCI
- /* Write AC_BK base address register */
- Value =
- RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BK].Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR1, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR1 : 0x%x\n", Value));
-
- /* Write AC_BE base address register */
- Value =
- RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BE].Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR0, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR0 : 0x%x\n", Value));
-
- /* Write AC_VI base address register */
- Value =
- RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VI].Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR2, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR2 : 0x%x\n", Value));
-
- /* Write AC_VO base address register */
- Value =
- RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VO].Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR3, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR3 : 0x%x\n", Value));
-
- /* Write MGMT_BASE_CSR register */
- Value = RTMP_GetPhysicalAddressLow(pAd->MgmtRing.Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR5, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR5 : 0x%x\n", Value));
-
- /* Write RX_BASE_CSR register */
- Value = RTMP_GetPhysicalAddressLow(pAd->RxRing.Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, RX_BASE_PTR, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> RX_BASE_PTR : 0x%x\n", Value));
-
- /* Init RX Ring index pointer */
- pAd->RxRing.RxSwReadIdx = 0;
- pAd->RxRing.RxCpuIdx = RX_RING_SIZE - 1;
- RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
-
- /* Init TX rings index pointer */
- {
- for (i = 0; i < NUM_OF_TX_RING; i++) {
- pAd->TxRing[i].TxSwFreeIdx = 0;
- pAd->TxRing[i].TxCpuIdx = 0;
- RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10),
- pAd->TxRing[i].TxCpuIdx);
- }
- }
-
- /* init MGMT ring index pointer */
- pAd->MgmtRing.TxSwFreeIdx = 0;
- pAd->MgmtRing.TxCpuIdx = 0;
- RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
-
- /* */
- /* set each Ring's SIZE into ASIC. Descriptor Size is fixed by design. */
- /* */
-
- /* Write TX_RING_CSR0 register */
- Value = TX_RING_SIZE;
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT0, Value);
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT1, Value);
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT2, Value);
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT3, Value);
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT4, Value);
- Value = MGMT_RING_SIZE;
- RTMP_IO_WRITE32(pAd, TX_MGMTMAX_CNT, Value);
-
- /* Write RX_RING_CSR register */
- Value = RX_RING_SIZE;
- RTMP_IO_WRITE32(pAd, RX_MAX_CNT, Value);
-#endif /* RTMP_MAC_PCI // */
-
- /* WMM parameter */
- csr0.word = 0;
- RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
- if (pAd->CommonCfg.PhyMode == PHY_11B) {
- csr0.field.Ac0Txop = 192; /* AC_VI: 192*32us ~= 6ms */
- csr0.field.Ac1Txop = 96; /* AC_VO: 96*32us ~= 3ms */
- } else {
- csr0.field.Ac0Txop = 96; /* AC_VI: 96*32us ~= 3ms */
- csr0.field.Ac1Txop = 48; /* AC_VO: 48*32us ~= 1.5ms */
- }
- RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word);
-
-#ifdef RTMP_MAC_PCI
- /* 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits: */
- i = 0;
- do {
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
- if ((GloCfg.field.TxDMABusy == 0)
- && (GloCfg.field.RxDMABusy == 0))
- break;
-
- RTMPusecDelay(1000);
- i++;
- } while (i < 100);
-
- GloCfg.word &= 0xff0;
- GloCfg.field.EnTXWriteBackDDONE = 1;
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
-
- IntCfg.word = 0;
- RTMP_IO_WRITE32(pAd, DELAY_INT_CFG, IntCfg.word);
-#endif /* RTMP_MAC_PCI // */
-
- /* reset action */
- /* Load firmware */
- /* Status = NICLoadFirmware(pAd); */
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n"));
- return Status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Initialize ASIC
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int NICInitializeAsic(struct rt_rtmp_adapter *pAd, IN BOOLEAN bHardReset)
-{
- unsigned long Index = 0;
- u8 R0 = 0xff;
- u32 MacCsr12 = 0, Counter = 0;
-#ifdef RTMP_MAC_USB
- u32 MacCsr0 = 0;
- int Status;
- u8 Value = 0xff;
-#endif /* RTMP_MAC_USB // */
-#ifdef RT30xx
- u8 bbpreg = 0;
- u8 RFValue = 0;
-#endif /* RT30xx // */
- u16 KeyIdx;
- int i, apidx;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n"));
-
-#ifdef RTMP_MAC_PCI
- RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x3); /* To fix driver disable/enable hang issue when radio off */
- if (bHardReset == TRUE) {
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
- } else
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
- /* Initialize MAC register to default value */
- for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++) {
- RTMP_IO_WRITE32(pAd, MACRegTable[Index].Register,
- MACRegTable[Index].Value);
- }
-
- {
- for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++) {
- RTMP_IO_WRITE32(pAd, STAMACRegTable[Index].Register,
- STAMACRegTable[Index].Value);
- }
- }
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- /* */
- /* Make sure MAC gets ready after NICLoadFirmware(). */
- /* */
- Index = 0;
-
- /*To avoid hang-on issue when interface up in kernel 2.4, */
- /*we use a local variable "MacCsr0" instead of using "pAd->MACVersion" directly. */
- do {
- RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
-
- if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
- break;
-
- RTMPusecDelay(10);
- } while (Index++ < 100);
-
- pAd->MACVersion = MacCsr0;
- DBGPRINT(RT_DEBUG_TRACE,
- ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
- /* turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue. */
- RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacCsr12);
- MacCsr12 &= (~0x2000);
- RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacCsr12);
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
- RTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);
- Status = RTUSBVenderReset(pAd);
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
-
- /* Initialize MAC register to default value */
- for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++) {
-#ifdef RT30xx
- if ((MACRegTable[Index].Register == TX_SW_CFG0)
- && (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd)
- || IS_RT3090(pAd) || IS_RT3390(pAd))) {
- MACRegTable[Index].Value = 0x00000400;
- }
-#endif /* RT30xx // */
- RTMP_IO_WRITE32(pAd, (u16)MACRegTable[Index].Register,
- MACRegTable[Index].Value);
- }
-
- {
- for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++) {
- RTMP_IO_WRITE32(pAd,
- (u16)STAMACRegTable[Index].Register,
- STAMACRegTable[Index].Value);
- }
- }
-#endif /* RTMP_MAC_USB // */
-
-#ifdef RT30xx
- /* Initialize RT3070 serial MAC registers which is different from RT2870 serial */
- if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
-
- /* RT3071 version E has fixed this issue */
- if ((pAd->MACVersion & 0xffff) < 0x0211) {
- if (pAd->NicConfig2.field.DACTestBit == 1) {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); /* To fix throughput drop drastically */
- } else {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F); /* To fix throughput drop drastically */
- }
- } else {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);
- }
- } else if (IS_RT3070(pAd)) {
- if (((pAd->MACVersion & 0xffff) < 0x0201)) {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); /* To fix throughput drop drastically */
- } else {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0);
- }
- }
-#endif /* RT30xx // */
-
- /* */
- /* Before program BBP, we need to wait BBP/RF get wake up. */
- /* */
- Index = 0;
- do {
- RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);
-
- if ((MacCsr12 & 0x03) == 0) /* if BB.RF is stable */
- break;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Check MAC_STATUS_CFG = Busy = %x\n", MacCsr12));
- RTMPusecDelay(1000);
- } while (Index++ < 100);
-
- /* The commands to firmware should be after these commands, these commands will init firmware */
- /* PCI and USB are not the same because PCI driver needs to wait for PCI bus ready */
- RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); /* initialize BBP R/W access agent */
- RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);
-#ifdef RT3090
- /*2008/11/28:KH add to fix the dead rf frequency offset bug<-- */
- AsicSendCommandToMcu(pAd, 0x72, 0, 0, 0);
- /*2008/11/28:KH add to fix the dead rf frequency offset bug--> */
-#endif /* RT3090 // */
- RTMPusecDelay(1000);
-
- /* Read BBP register, make sure BBP is up and running before write new data */
- Index = 0;
- do {
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0);
- DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0));
- } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00)));
- /*ASSERT(Index < 20); //this will cause BSOD on Check-build driver */
-
- if ((R0 == 0xff) || (R0 == 0x00))
- return NDIS_STATUS_FAILURE;
-
- /* Initialize BBP register to default value */
- for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register,
- BBPRegTable[Index].Value);
- }
-
-#ifdef RTMP_MAC_PCI
- /* TODO: shiang, check MACVersion, currently, rbus-based chip use this. */
- if (pAd->MACVersion == 0x28720200) {
- /*u8 value; */
- unsigned long value2;
-
- /*disable MLD by Bruce 20080704 */
- /*BBP_IO_READ8_BY_REG_ID(pAd, BBP_R105, &value); */
- /*BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, value | 4); */
-
- /*Maximum PSDU length from 16K to 32K bytes */
- RTMP_IO_READ32(pAd, MAX_LEN_CFG, &value2);
- value2 &= ~(0x3 << 12);
- value2 |= (0x2 << 12);
- RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, value2);
- }
-#endif /* RTMP_MAC_PCI // */
-
- /* for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT. */
- /* RT3090 should not program BBP R84 to 0x19, otherwise TX will block. */
- /*3070/71/72,3090,3090A( are included in RT30xx),3572,3390 */
- if (((pAd->MACVersion & 0xffff) != 0x0101)
- && !(IS_RT30xx(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)))
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
-
-#ifdef RT30xx
-/* add by johnli, RF power sequence setup */
- if (IS_RT30xx(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) { /*update for RT3070/71/72/90/91/92,3572,3390. */
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R79, 0x13);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R80, 0x05);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R81, 0x33);
- }
-
- if (IS_RT3090(pAd) || IS_RT3390(pAd)) /* RT309x, RT3071/72 */
- {
- /* enable DC filter */
- if ((pAd->MACVersion & 0xffff) >= 0x0211) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
- }
- /* improve power consumption */
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R138, &bbpreg);
- if (pAd->Antenna.field.TxPath == 1) {
- /* turn off tx DAC_1 */
- bbpreg = (bbpreg | 0x20);
- }
-
- if (pAd->Antenna.field.RxPath == 1) {
- /* turn off tx ADC_1 */
- bbpreg &= (~0x2);
- }
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R138, bbpreg);
-
- /* improve power consumption in RT3071 Ver.E */
- if ((pAd->MACVersion & 0xffff) >= 0x0211) {
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
- bbpreg &= (~0x3);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
- }
- } else if (IS_RT3070(pAd)) {
- if ((pAd->MACVersion & 0xffff) >= 0x0201) {
- /* enable DC filter */
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
-
- /* improve power consumption in RT3070 Ver.F */
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
- bbpreg &= (~0x3);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
- }
- /* TX_LO1_en, RF R17 register Bit 3 to 0 */
- RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
- RFValue &= (~0x08);
- /* to fix rx long range issue */
- if (pAd->NicConfig2.field.ExternalLNAForG == 0) {
- RFValue |= 0x20;
- }
- /* set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h */
- if (pAd->TxMixerGain24G >= 1) {
- RFValue &= (~0x7); /* clean bit [2:0] */
- RFValue |= pAd->TxMixerGain24G;
- }
- RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
- }
-/* end johnli */
-#endif /* RT30xx // */
-
- if (pAd->MACVersion == 0x28600100) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
- }
-
- if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) /* 3*3 */
- {
- /* enlarge MAX_LEN_CFG */
- u32 csr;
- RTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr);
- csr &= 0xFFF;
- csr |= 0x2000;
- RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr);
- }
-#ifdef RTMP_MAC_USB
- {
- u8 MAC_Value[] =
- { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0 };
-
- /*Initialize WCID table */
- Value = 0xff;
- for (Index = 0; Index < 254; Index++) {
- RTUSBMultiWrite(pAd,
- (u16)(MAC_WCID_BASE + Index * 8),
- MAC_Value, 8);
- }
- }
-#endif /* RTMP_MAC_USB // */
-
- /* Add radio off control */
- {
- if (pAd->StaCfg.bRadio == FALSE) {
-/* RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818); */
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
- DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n"));
- }
- }
-
- /* Clear raw counters */
- RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
- RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
- RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
-
- /* ASIC will keep garbage value after boot */
- /* Clear all shared key table when initial */
- /* This routine can be ignored in radio-ON/OFF operation. */
- if (bHardReset) {
- for (KeyIdx = 0; KeyIdx < 4; KeyIdx++) {
- RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4 * KeyIdx,
- 0);
- }
-
- /* Clear all pairwise key table when initial */
- for (KeyIdx = 0; KeyIdx < 256; KeyIdx++) {
- RTMP_IO_WRITE32(pAd,
- MAC_WCID_ATTRIBUTE_BASE +
- (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
- }
- }
- /* assert HOST ready bit */
-/* RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x0); // 2004-09-14 asked by Mark */
-/* RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x4); */
-
- /* It isn't necessary to clear this space when not hard reset. */
- if (bHardReset == TRUE) {
- /* clear all on-chip BEACON frame space */
- for (apidx = 0; apidx < HW_BEACON_MAX_COUNT; apidx++) {
- for (i = 0; i < HW_BEACON_OFFSET >> 2; i += 4)
- RTMP_IO_WRITE32(pAd,
- pAd->BeaconOffset[apidx] + i,
- 0x00);
- }
- }
-#ifdef RTMP_MAC_USB
- AsicDisableSync(pAd);
- /* Clear raw counters */
- RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
- RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
- RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
- /* Default PCI clock cycle per ms is different as default setting, which is based on PCI. */
- RTMP_IO_READ32(pAd, USB_CYC_CFG, &Counter);
- Counter &= 0xffffff00;
- Counter |= 0x000001e;
- RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
-#endif /* RTMP_MAC_USB // */
-
- {
- /* for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT. */
- if ((pAd->MACVersion & 0xffff) != 0x0101)
- RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f);
- }
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n"));
- return NDIS_STATUS_SUCCESS;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Reset NIC Asics
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
- Reset NIC to initial state AS IS system boot up time.
-
- ========================================================================
-*/
-void NICIssueReset(struct rt_rtmp_adapter *pAd)
-{
- u32 Value = 0;
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n"));
-
- /* Abort Tx, prevent ASIC from writing to Host memory */
- /*RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x001f0000); */
-
- /* Disable Rx, register value supposed will remain after reset */
- RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
- Value &= (0xfffffff3);
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
-
- /* Issue reset and clear from reset state */
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); /* 2004-09-17 change from 0x01 */
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n"));
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Check ASIC registers and find any reason the system might hang
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-BOOLEAN NICCheckForHang(struct rt_rtmp_adapter *pAd)
-{
- return (FALSE);
-}
-
-void NICUpdateFifoStaCounters(struct rt_rtmp_adapter *pAd)
-{
- TX_STA_FIFO_STRUC StaFifo;
- struct rt_mac_table_entry *pEntry;
- u8 i = 0;
- u8 pid = 0, wcid = 0;
- char reTry;
- u8 succMCS;
-
- do {
- RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);
-
- if (StaFifo.field.bValid == 0)
- break;
-
- wcid = (u8)StaFifo.field.wcid;
-
- /* ignore NoACK and MGMT frame use 0xFF as WCID */
- if ((StaFifo.field.TxAckRequired == 0)
- || (wcid >= MAX_LEN_OF_MAC_TABLE)) {
- i++;
- continue;
- }
-
- /* PID store Tx MCS Rate */
- pid = (u8)StaFifo.field.PidType;
-
- pEntry = &pAd->MacTab.Content[wcid];
-
- pEntry->DebugFIFOCount++;
-
- if (StaFifo.field.TxBF) /* 3*3 */
- pEntry->TxBFCount++;
-
- if (!StaFifo.field.TxSuccess) {
- pEntry->FIFOCount++;
- pEntry->OneSecTxFailCount++;
-
- if (pEntry->FIFOCount >= 1) {
- DBGPRINT(RT_DEBUG_TRACE, ("#"));
- pEntry->NoBADataCountDown = 64;
-
- if (pEntry->PsMode == PWR_ACTIVE) {
- int tid;
- for (tid = 0; tid < NUM_OF_TID; tid++) {
- BAOriSessionTearDown(pAd,
- pEntry->
- Aid, tid,
- FALSE,
- FALSE);
- }
-
- /* Update the continuous transmission counter except PS mode */
- pEntry->ContinueTxFailCnt++;
- } else {
- /* Clear the FIFOCount when sta in Power Save mode. Basically we assume */
- /* this tx error happened due to sta just go to sleep. */
- pEntry->FIFOCount = 0;
- pEntry->ContinueTxFailCnt = 0;
- }
- /*pEntry->FIFOCount = 0; */
- }
- /*pEntry->bSendBAR = TRUE; */
- } else {
- if ((pEntry->PsMode != PWR_SAVE)
- && (pEntry->NoBADataCountDown > 0)) {
- pEntry->NoBADataCountDown--;
- if (pEntry->NoBADataCountDown == 0) {
- DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
- }
- }
-
- pEntry->FIFOCount = 0;
- pEntry->OneSecTxNoRetryOkCount++;
- /* update NoDataIdleCount when successful send packet to STA. */
- pEntry->NoDataIdleCount = 0;
- pEntry->ContinueTxFailCnt = 0;
- }
-
- succMCS = StaFifo.field.SuccessRate & 0x7F;
-
- reTry = pid - succMCS;
-
- if (StaFifo.field.TxSuccess) {
- pEntry->TXMCSExpected[pid]++;
- if (pid == succMCS) {
- pEntry->TXMCSSuccessful[pid]++;
- } else {
- pEntry->TXMCSAutoFallBack[pid][succMCS]++;
- }
- } else {
- pEntry->TXMCSFailed[pid]++;
- }
-
- if (reTry > 0) {
- if ((pid >= 12) && succMCS <= 7) {
- reTry -= 4;
- }
- pEntry->OneSecTxRetryOkCount += reTry;
- }
-
- i++;
- /* ASIC store 16 stack */
- } while (i < (2 * TX_RING_SIZE));
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read statistical counters from hardware registers and record them
- in software variables for later on query
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-void NICUpdateRawCounters(struct rt_rtmp_adapter *pAd)
-{
- u32 OldValue; /*, Value2; */
- /*unsigned long PageSum, OneSecTransmitCount; */
- /*unsigned long TxErrorRatio, Retry, Fail; */
- RX_STA_CNT0_STRUC RxStaCnt0;
- RX_STA_CNT1_STRUC RxStaCnt1;
- RX_STA_CNT2_STRUC RxStaCnt2;
- TX_STA_CNT0_STRUC TxStaCnt0;
- TX_STA_CNT1_STRUC StaTx1;
- TX_STA_CNT2_STRUC StaTx2;
- TX_AGG_CNT_STRUC TxAggCnt;
- TX_AGG_CNT0_STRUC TxAggCnt0;
- TX_AGG_CNT1_STRUC TxAggCnt1;
- TX_AGG_CNT2_STRUC TxAggCnt2;
- TX_AGG_CNT3_STRUC TxAggCnt3;
- TX_AGG_CNT4_STRUC TxAggCnt4;
- TX_AGG_CNT5_STRUC TxAggCnt5;
- TX_AGG_CNT6_STRUC TxAggCnt6;
- TX_AGG_CNT7_STRUC TxAggCnt7;
- struct rt_counter_ralink *pRalinkCounters;
-
- pRalinkCounters = &pAd->RalinkCounters;
-
- RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word);
- RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word);
-
- {
- RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);
- /* Update RX PLCP error counter */
- pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr;
- /* Update False CCA counter */
- pAd->RalinkCounters.OneSecFalseCCACnt +=
- RxStaCnt1.field.FalseCca;
- }
-
- /* Update FCS counters */
- OldValue = pAd->WlanCounters.FCSErrorCount.u.LowPart;
- pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); /* >> 7); */
- if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue)
- pAd->WlanCounters.FCSErrorCount.u.HighPart++;
-
- /* Add FCS error count to private counters */
- pRalinkCounters->OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr;
- OldValue = pRalinkCounters->RealFcsErrCount.u.LowPart;
- pRalinkCounters->RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr;
- if (pRalinkCounters->RealFcsErrCount.u.LowPart < OldValue)
- pRalinkCounters->RealFcsErrCount.u.HighPart++;
-
- /* Update Duplicate Rcv check */
- pRalinkCounters->DuplicateRcv += RxStaCnt2.field.RxDupliCount;
- pAd->WlanCounters.FrameDuplicateCount.u.LowPart +=
- RxStaCnt2.field.RxDupliCount;
- /* Update RX Overflow counter */
- pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount);
-
- /*pAd->RalinkCounters.RxCount = 0; */
-#ifdef RTMP_MAC_USB
- if (pRalinkCounters->RxCount != pAd->watchDogRxCnt) {
- pAd->watchDogRxCnt = pRalinkCounters->RxCount;
- pAd->watchDogRxOverFlowCnt = 0;
- } else {
- if (RxStaCnt2.field.RxFifoOverflowCount)
- pAd->watchDogRxOverFlowCnt++;
- else
- pAd->watchDogRxOverFlowCnt = 0;
- }
-#endif /* RTMP_MAC_USB // */
-
- /*if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) || */
- /* (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) && (pAd->MacTab.Size != 1))) */
- if (!pAd->bUpdateBcnCntDone) {
- /* Update BEACON sent count */
- RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
- RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
- RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
- pRalinkCounters->OneSecBeaconSentCnt +=
- TxStaCnt0.field.TxBeaconCount;
- pRalinkCounters->OneSecTxRetryOkCount +=
- StaTx1.field.TxRetransmit;
- pRalinkCounters->OneSecTxNoRetryOkCount +=
- StaTx1.field.TxSuccess;
- pRalinkCounters->OneSecTxFailCount +=
- TxStaCnt0.field.TxFailCount;
- pAd->WlanCounters.TransmittedFragmentCount.u.LowPart +=
- StaTx1.field.TxSuccess;
- pAd->WlanCounters.RetryCount.u.LowPart +=
- StaTx1.field.TxRetransmit;
- pAd->WlanCounters.FailedCount.u.LowPart +=
- TxStaCnt0.field.TxFailCount;
- }
-
- /*if (pAd->bStaFifoTest == TRUE) */
- {
- RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word);
- pRalinkCounters->TxAggCount += TxAggCnt.field.AggTxCount;
- pRalinkCounters->TxNonAggCount += TxAggCnt.field.NonAggTxCount;
- pRalinkCounters->TxAgg1MPDUCount +=
- TxAggCnt0.field.AggSize1Count;
- pRalinkCounters->TxAgg2MPDUCount +=
- TxAggCnt0.field.AggSize2Count;
-
- pRalinkCounters->TxAgg3MPDUCount +=
- TxAggCnt1.field.AggSize3Count;
- pRalinkCounters->TxAgg4MPDUCount +=
- TxAggCnt1.field.AggSize4Count;
- pRalinkCounters->TxAgg5MPDUCount +=
- TxAggCnt2.field.AggSize5Count;
- pRalinkCounters->TxAgg6MPDUCount +=
- TxAggCnt2.field.AggSize6Count;
-
- pRalinkCounters->TxAgg7MPDUCount +=
- TxAggCnt3.field.AggSize7Count;
- pRalinkCounters->TxAgg8MPDUCount +=
- TxAggCnt3.field.AggSize8Count;
- pRalinkCounters->TxAgg9MPDUCount +=
- TxAggCnt4.field.AggSize9Count;
- pRalinkCounters->TxAgg10MPDUCount +=
- TxAggCnt4.field.AggSize10Count;
-
- pRalinkCounters->TxAgg11MPDUCount +=
- TxAggCnt5.field.AggSize11Count;
- pRalinkCounters->TxAgg12MPDUCount +=
- TxAggCnt5.field.AggSize12Count;
- pRalinkCounters->TxAgg13MPDUCount +=
- TxAggCnt6.field.AggSize13Count;
- pRalinkCounters->TxAgg14MPDUCount +=
- TxAggCnt6.field.AggSize14Count;
-
- pRalinkCounters->TxAgg15MPDUCount +=
- TxAggCnt7.field.AggSize15Count;
- pRalinkCounters->TxAgg16MPDUCount +=
- TxAggCnt7.field.AggSize16Count;
-
- /* Calculate the transmitted A-MPDU count */
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- TxAggCnt0.field.AggSize1Count;
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt0.field.AggSize2Count / 2);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt1.field.AggSize3Count / 3);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt1.field.AggSize4Count / 4);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt2.field.AggSize5Count / 5);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt2.field.AggSize6Count / 6);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt3.field.AggSize7Count / 7);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt3.field.AggSize8Count / 8);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt4.field.AggSize9Count / 9);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt4.field.AggSize10Count / 10);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt5.field.AggSize11Count / 11);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt5.field.AggSize12Count / 12);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt6.field.AggSize13Count / 13);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt6.field.AggSize14Count / 14);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt7.field.AggSize15Count / 15);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt7.field.AggSize16Count / 16);
- }
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Reset NIC from error
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
- Reset NIC from error state
-
- ========================================================================
-*/
-void NICResetFromError(struct rt_rtmp_adapter *pAd)
-{
- /* Reset BBP (according to alex, reset ASIC will force reset BBP */
- /* Therefore, skip the reset BBP */
- /* RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x2); */
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
- /* Remove ASIC from reset state */
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
-
- NICInitializeAdapter(pAd, FALSE);
- NICInitAsicFromEEPROM(pAd);
-
- /* Switch to current channel, since during reset process, the connection should remains on. */
- AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
- AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
-}
-
-int NICLoadFirmware(struct rt_rtmp_adapter *pAd)
-{
- int status = NDIS_STATUS_SUCCESS;
- if (pAd->chipOps.loadFirmware)
- status = pAd->chipOps.loadFirmware(pAd);
-
- return status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- erase 8051 firmware image in MAC ASIC
-
- Arguments:
- Adapter Pointer to our adapter
-
- IRQL = PASSIVE_LEVEL
-
- ========================================================================
-*/
-void NICEraseFirmware(struct rt_rtmp_adapter *pAd)
-{
- if (pAd->chipOps.eraseFirmware)
- pAd->chipOps.eraseFirmware(pAd);
-
-} /* End of NICEraseFirmware */
-
-/*
- ========================================================================
-
- Routine Description:
- Load Tx rate switching parameters
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- NDIS_STATUS_SUCCESS firmware image load ok
- NDIS_STATUS_FAILURE image not found
-
- IRQL = PASSIVE_LEVEL
-
- Rate Table Format:
- 1. (B0: Valid Item number) (B1:Initial item from zero)
- 2. Item Number(Dec) Mode(Hex) Current MCS(Dec) TrainUp(Dec) TrainDown(Dec)
-
- ========================================================================
-*/
-int NICLoadRateSwitchingParams(struct rt_rtmp_adapter *pAd)
-{
- return NDIS_STATUS_SUCCESS;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Compare two memory block
-
- Arguments:
- pSrc1 Pointer to first memory address
- pSrc2 Pointer to second memory address
-
- Return Value:
- 0: memory is equal
- 1: pSrc1 memory is larger
- 2: pSrc2 memory is larger
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-unsigned long RTMPCompareMemory(void *pSrc1, void *pSrc2, unsigned long Length)
-{
- u8 *pMem1;
- u8 *pMem2;
- unsigned long Index = 0;
-
- pMem1 = (u8 *)pSrc1;
- pMem2 = (u8 *)pSrc2;
-
- for (Index = 0; Index < Length; Index++) {
- if (pMem1[Index] > pMem2[Index])
- return (1);
- else if (pMem1[Index] < pMem2[Index])
- return (2);
- }
-
- /* Equal */
- return (0);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Zero out memory block
-
- Arguments:
- pSrc1 Pointer to memory address
- Length Size
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPZeroMemory(void *pSrc, unsigned long Length)
-{
- u8 *pMem;
- unsigned long Index = 0;
-
- pMem = (u8 *)pSrc;
-
- for (Index = 0; Index < Length; Index++) {
- pMem[Index] = 0x00;
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Copy data from memory block 1 to memory block 2
-
- Arguments:
- pDest Pointer to destination memory address
- pSrc Pointer to source memory address
- Length Copy size
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPMoveMemory(void *pDest, void *pSrc, unsigned long Length)
-{
- u8 *pMem1;
- u8 *pMem2;
- u32 Index;
-
- ASSERT((Length == 0) || (pDest && pSrc));
-
- pMem1 = (u8 *)pDest;
- pMem2 = (u8 *)pSrc;
-
- for (Index = 0; Index < Length; Index++) {
- pMem1[Index] = pMem2[Index];
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Initialize port configuration structure
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void UserCfgInit(struct rt_rtmp_adapter *pAd)
-{
- u32 key_index, bss_index;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit\n"));
-
- /* */
- /* part I. initialize common configuration */
- /* */
-#ifdef RTMP_MAC_USB
- pAd->BulkOutReq = 0;
-
- pAd->BulkOutComplete = 0;
- pAd->BulkOutCompleteOther = 0;
- pAd->BulkOutCompleteCancel = 0;
- pAd->BulkInReq = 0;
- pAd->BulkInComplete = 0;
- pAd->BulkInCompleteFail = 0;
-
- /*pAd->QuickTimerP = 100; */
- /*pAd->TurnAggrBulkInCount = 0; */
- pAd->bUsbTxBulkAggre = 0;
-
- /* init as unused value to ensure driver will set to MCU once. */
- pAd->LedIndicatorStrength = 0xFF;
-
- pAd->CommonCfg.MaxPktOneTxBulk = 2;
- pAd->CommonCfg.TxBulkFactor = 1;
- pAd->CommonCfg.RxBulkFactor = 1;
-
- pAd->CommonCfg.TxPower = 100; /*mW */
-
- NdisZeroMemory(&pAd->CommonCfg.IOTestParm,
- sizeof(pAd->CommonCfg.IOTestParm));
-#endif /* RTMP_MAC_USB // */
-
- for (key_index = 0; key_index < SHARE_KEY_NUM; key_index++) {
- for (bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++) {
- pAd->SharedKey[bss_index][key_index].KeyLen = 0;
- pAd->SharedKey[bss_index][key_index].CipherAlg =
- CIPHER_NONE;
- }
- }
-
- pAd->EepromAccess = FALSE;
-
- pAd->Antenna.word = 0;
- pAd->CommonCfg.BBPCurrentBW = BW_20;
-
- pAd->LedCntl.word = 0;
-#ifdef RTMP_MAC_PCI
- pAd->LedIndicatorStrength = 0;
- pAd->RLnkCtrlOffset = 0;
- pAd->HostLnkCtrlOffset = 0;
- pAd->StaCfg.PSControl.field.EnableNewPS = TRUE;
- pAd->CheckDmaBusyCount = 0;
-#endif /* RTMP_MAC_PCI // */
-
- pAd->bAutoTxAgcA = FALSE; /* Default is OFF */
- pAd->bAutoTxAgcG = FALSE; /* Default is OFF */
- pAd->RfIcType = RFIC_2820;
-
- /* Init timer for reset complete event */
- pAd->CommonCfg.CentralChannel = 1;
- pAd->bForcePrintTX = FALSE;
- pAd->bForcePrintRX = FALSE;
- pAd->bStaFifoTest = FALSE;
- pAd->bProtectionTest = FALSE;
- pAd->CommonCfg.Dsifs = 10; /* in units of usec */
- pAd->CommonCfg.TxPower = 100; /*mW */
- pAd->CommonCfg.TxPowerPercentage = 0xffffffff; /* AUTO */
- pAd->CommonCfg.TxPowerDefault = 0xffffffff; /* AUTO */
- pAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; /* use Long preamble on TX by defaut */
- pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
- pAd->CommonCfg.RtsThreshold = 2347;
- pAd->CommonCfg.FragmentThreshold = 2346;
- pAd->CommonCfg.UseBGProtection = 0; /* 0: AUTO */
- pAd->CommonCfg.bEnableTxBurst = TRUE; /*0; */
- pAd->CommonCfg.PhyMode = 0xff; /* unknown */
- pAd->CommonCfg.BandState = UNKNOWN_BAND;
- pAd->CommonCfg.RadarDetect.CSPeriod = 10;
- pAd->CommonCfg.RadarDetect.CSCount = 0;
- pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
-
- pAd->CommonCfg.RadarDetect.ChMovingTime = 65;
- pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 3;
- pAd->CommonCfg.bAPSDCapable = FALSE;
- pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
- pAd->CommonCfg.TriggerTimerCount = 0;
- pAd->CommonCfg.bAPSDForcePowerSave = FALSE;
- pAd->CommonCfg.bCountryFlag = FALSE;
- pAd->CommonCfg.TxStream = 0;
- pAd->CommonCfg.RxStream = 0;
-
- NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI));
-
- NdisZeroMemory(&pAd->CommonCfg.HtCapability,
- sizeof(pAd->CommonCfg.HtCapability));
- pAd->HTCEnable = FALSE;
- pAd->bBroadComHT = FALSE;
- pAd->CommonCfg.bRdg = FALSE;
-
- NdisZeroMemory(&pAd->CommonCfg.AddHTInfo,
- sizeof(pAd->CommonCfg.AddHTInfo));
- pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
- pAd->CommonCfg.BACapability.field.MpduDensity = 0;
- pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
- pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; /*32; */
- pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; /*32; */
- DBGPRINT(RT_DEBUG_TRACE,
- ("--> UserCfgInit. BACapability = 0x%x\n",
- pAd->CommonCfg.BACapability.word));
-
- pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
- BATableInit(pAd, &pAd->BATable);
-
- pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
- pAd->CommonCfg.bHTProtect = 1;
- pAd->CommonCfg.bMIMOPSEnable = TRUE;
- /*2008/11/05:KH add to support Antenna power-saving of AP<-- */
- pAd->CommonCfg.bGreenAPEnable = FALSE;
- /*2008/11/05:KH add to support Antenna power-saving of AP--> */
- pAd->CommonCfg.bBADecline = FALSE;
- pAd->CommonCfg.bDisableReordering = FALSE;
-
- if (pAd->MACVersion == 0x28720200) {
- pAd->CommonCfg.TxBASize = 13; /*by Jerry recommend */
- } else {
- pAd->CommonCfg.TxBASize = 7;
- }
-
- pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
-
- /*pAd->CommonCfg.HTPhyMode.field.BW = BW_20; */
- /*pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO; */
- /*pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800; */
- /*pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE; */
- pAd->CommonCfg.TxRate = RATE_6;
-
- pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;
- pAd->CommonCfg.MlmeTransmit.field.BW = BW_20;
- pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
-
- pAd->CommonCfg.BeaconPeriod = 100; /* in mSec */
-
- /* */
- /* part II. initialize STA specific configuration */
- /* */
- {
- RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT);
- RX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST);
- RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);
- RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);
-
- pAd->StaCfg.Psm = PWR_ACTIVE;
-
- pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled;
- pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;
- pAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled;
- pAd->StaCfg.bMixCipher = FALSE;
- pAd->StaCfg.DefaultKeyId = 0;
-
- /* 802.1x port control */
- pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
- pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
- pAd->StaCfg.LastMicErrorTime = 0;
- pAd->StaCfg.MicErrCnt = 0;
- pAd->StaCfg.bBlockAssoc = FALSE;
- pAd->StaCfg.WpaState = SS_NOTUSE;
-
- pAd->CommonCfg.NdisRadioStateOff = FALSE; /* New to support microsoft disable radio with OID command */
-
- pAd->StaCfg.RssiTrigger = 0;
- NdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(struct rt_rssi_sample));
- pAd->StaCfg.RssiTriggerMode =
- RSSI_TRIGGERED_UPON_BELOW_THRESHOLD;
- pAd->StaCfg.AtimWin = 0;
- pAd->StaCfg.DefaultListenCount = 3; /*default listen count; */
- pAd->StaCfg.BssType = BSS_INFRA; /* BSS_INFRA or BSS_ADHOC or BSS_MONITOR */
- pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
-
- pAd->StaCfg.bAutoTxRateSwitch = TRUE;
- pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
- }
-
-#ifdef PCIE_PS_SUPPORT
- pAd->brt30xxBanMcuCmd = FALSE;
- pAd->b3090ESpecialChip = FALSE;
-/*KH Debug:the following must be removed */
- pAd->StaCfg.PSControl.field.rt30xxPowerMode = 3;
- pAd->StaCfg.PSControl.field.rt30xxForceASPMTest = 0;
- pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM = 1;
-#endif /* PCIE_PS_SUPPORT // */
-
- /* global variables mXXXX used in MAC protocol state machines */
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
-
- /* PHY specification */
- pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; /* default PHY mode */
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); /* CCK use long preamble */
-
- {
- /* user desired power mode */
- pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
- pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
- pAd->StaCfg.bWindowsACCAMEnable = FALSE;
-
- RTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer,
- GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec),
- pAd, FALSE);
- pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
-
- /* Patch for Ndtest */
- pAd->StaCfg.ScanCnt = 0;
-
- pAd->StaCfg.bHwRadio = TRUE; /* Default Hardware Radio status is On */
- pAd->StaCfg.bSwRadio = TRUE; /* Default Software Radio status is On */
- pAd->StaCfg.bRadio = TRUE; /* bHwRadio && bSwRadio */
- pAd->StaCfg.bHardwareRadio = FALSE; /* Default is OFF */
- pAd->StaCfg.bShowHiddenSSID = FALSE; /* Default no show */
-
- /* Nitro mode control */
- pAd->StaCfg.bAutoReconnect = TRUE;
-
- /* Save the init time as last scan time, the system should do scan after 2 seconds. */
- /* This patch is for driver wake up from standby mode, system will do scan right away. */
- NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);
- if (pAd->StaCfg.LastScanTime > 10 * OS_HZ)
- pAd->StaCfg.LastScanTime -= (10 * OS_HZ);
-
- NdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE + 1);
-#ifdef RTMP_MAC_PCI
- sprintf((char *)pAd->nickname, "RT2860STA");
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- sprintf((char *)pAd->nickname, "RT2870STA");
-#endif /* RTMP_MAC_USB // */
- RTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer,
- GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc),
- pAd, FALSE);
- pAd->StaCfg.IEEE8021X = FALSE;
- pAd->StaCfg.IEEE8021x_required_keys = FALSE;
- pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
- pAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE;
- pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
-
- NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);
-
- pAd->StaCfg.bAutoConnectByBssid = FALSE;
- pAd->StaCfg.BeaconLostTime = BEACON_LOST_TIME;
- NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);
- pAd->StaCfg.WpaPassPhraseLen = 0;
- pAd->StaCfg.bAutoRoaming = FALSE;
- pAd->StaCfg.bForceTxBurst = FALSE;
- }
-
- /* Default for extra information is not valid */
- pAd->ExtraInfo = EXTRA_INFO_CLEAR;
-
- /* Default Config change flag */
- pAd->bConfigChanged = FALSE;
-
- /* */
- /* part III. AP configurations */
- /* */
-
- /* */
- /* part IV. others */
- /* */
- /* dynamic BBP R66:sensibity tuning to overcome background noise */
- pAd->BbpTuning.bEnable = TRUE;
- pAd->BbpTuning.FalseCcaLowerThreshold = 100;
- pAd->BbpTuning.FalseCcaUpperThreshold = 512;
- pAd->BbpTuning.R66Delta = 4;
- pAd->Mlme.bEnableAutoAntennaCheck = TRUE;
-
- /* */
- /* Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value. */
- /* if not initial this value, the default value will be 0. */
- /* */
- pAd->BbpTuning.R66CurrentValue = 0x38;
-
- pAd->Bbp94 = BBPR94_DEFAULT;
- pAd->BbpForCCK = FALSE;
-
- /* Default is FALSE for test bit 1 */
- /*pAd->bTest1 = FALSE; */
-
- /* initialize MAC table and allocate spin lock */
- NdisZeroMemory(&pAd->MacTab, sizeof(struct rt_mac_table));
- InitializeQueueHeader(&pAd->MacTab.McastPsQueue);
- NdisAllocateSpinLock(&pAd->MacTabLock);
-
- /*RTMPInitTimer(pAd, &pAd->RECBATimer, RECBATimerTimeout, pAd, TRUE); */
- /*RTMPSetTimer(&pAd->RECBATimer, REORDER_EXEC_INTV); */
-
- pAd->CommonCfg.bWiFiTest = FALSE;
-#ifdef RTMP_MAC_PCI
- pAd->bPCIclkOff = FALSE;
-#endif /* RTMP_MAC_PCI // */
-
- RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
- DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
-}
-
-/* IRQL = PASSIVE_LEVEL */
-/* */
-/* FUNCTION: AtoH(char *, u8 *, int) */
-/* */
-/* PURPOSE: Converts ascii string to network order hex */
-/* */
-/* PARAMETERS: */
-/* src - pointer to input ascii string */
-/* dest - pointer to output hex */
-/* destlen - size of dest */
-/* */
-/* COMMENTS: */
-/* */
-/* 2 ascii bytes make a hex byte so must put 1st ascii byte of pair */
-/* into upper nibble and 2nd ascii byte of pair into lower nibble. */
-/* */
-/* IRQL = PASSIVE_LEVEL */
-
-void AtoH(char *src, u8 *dest, int destlen)
-{
- char *srcptr;
- u8 *destTemp;
-
- srcptr = src;
- destTemp = (u8 *)dest;
-
- while (destlen--) {
- *destTemp = hex_to_bin(*srcptr++) << 4; /* Put 1st ascii byte in upper nibble. */
- *destTemp += hex_to_bin(*srcptr++); /* Add 2nd ascii byte to above. */
- destTemp++;
- }
-}
-
-/*+++Mark by shiang, not use now, need to remove after confirm */
-/*---Mark by shiang, not use now, need to remove after confirm */
-
-/*
- ========================================================================
-
- Routine Description:
- Init timer objects
-
- Arguments:
- pAd Pointer to our adapter
- pTimer Timer structure
- pTimerFunc Function to execute when timer expired
- Repeat Ture for period timer
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void RTMPInitTimer(struct rt_rtmp_adapter *pAd,
- struct rt_ralink_timer *pTimer,
- void *pTimerFunc, void *pData, IN BOOLEAN Repeat)
-{
- /* */
- /* Set Valid to TRUE for later used. */
- /* It will crash if we cancel a timer or set a timer */
- /* that we haven't initialize before. */
- /* */
- pTimer->Valid = TRUE;
-
- pTimer->PeriodicType = Repeat;
- pTimer->State = FALSE;
- pTimer->cookie = (unsigned long)pData;
-
-#ifdef RTMP_TIMER_TASK_SUPPORT
- pTimer->pAd = pAd;
-#endif /* RTMP_TIMER_TASK_SUPPORT // */
-
- RTMP_OS_Init_Timer(pAd, &pTimer->TimerObj, pTimerFunc, (void *)pTimer);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Init timer objects
-
- Arguments:
- pTimer Timer structure
- Value Timer value in milliseconds
-
- Return Value:
- None
-
- Note:
- To use this routine, must call RTMPInitTimer before.
-
- ========================================================================
-*/
-void RTMPSetTimer(struct rt_ralink_timer *pTimer, unsigned long Value)
-{
- if (pTimer->Valid) {
- pTimer->TimerValue = Value;
- pTimer->State = FALSE;
- if (pTimer->PeriodicType == TRUE) {
- pTimer->Repeat = TRUE;
- RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);
- } else {
- pTimer->Repeat = FALSE;
- RTMP_OS_Add_Timer(&pTimer->TimerObj, Value);
- }
- } else {
- DBGPRINT_ERR("RTMPSetTimer failed, Timer hasn't been initialize!\n");
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Init timer objects
-
- Arguments:
- pTimer Timer structure
- Value Timer value in milliseconds
-
- Return Value:
- None
-
- Note:
- To use this routine, must call RTMPInitTimer before.
-
- ========================================================================
-*/
-void RTMPModTimer(struct rt_ralink_timer *pTimer, unsigned long Value)
-{
- BOOLEAN Cancel;
-
- if (pTimer->Valid) {
- pTimer->TimerValue = Value;
- pTimer->State = FALSE;
- if (pTimer->PeriodicType == TRUE) {
- RTMPCancelTimer(pTimer, &Cancel);
- RTMPSetTimer(pTimer, Value);
- } else {
- RTMP_OS_Mod_Timer(&pTimer->TimerObj, Value);
- }
- } else {
- DBGPRINT_ERR("RTMPModTimer failed, Timer hasn't been initialize!\n");
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Cancel timer objects
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
- 1.) To use this routine, must call RTMPInitTimer before.
- 2.) Reset NIC to initial state AS IS system boot up time.
-
- ========================================================================
-*/
-void RTMPCancelTimer(struct rt_ralink_timer *pTimer, OUT BOOLEAN * pCancelled)
-{
- if (pTimer->Valid) {
- if (pTimer->State == FALSE)
- pTimer->Repeat = FALSE;
-
- RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);
-
- if (*pCancelled == TRUE)
- pTimer->State = TRUE;
-
-#ifdef RTMP_TIMER_TASK_SUPPORT
- /* We need to go-through the TimerQ to findout this timer handler and remove it if */
- /* it's still waiting for execution. */
- RtmpTimerQRemove(pTimer->pAd, pTimer);
-#endif /* RTMP_TIMER_TASK_SUPPORT // */
- } else {
- DBGPRINT_ERR("RTMPCancelTimer failed, Timer hasn't been initialize!\n");
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Set LED Status
-
- Arguments:
- pAd Pointer to our adapter
- Status LED Status
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPSetLED(struct rt_rtmp_adapter *pAd, u8 Status)
-{
- /*unsigned long data; */
- u8 HighByte = 0;
- u8 LowByte;
-
- LowByte = pAd->LedCntl.field.LedMode & 0x7f;
- switch (Status) {
- case LED_LINK_DOWN:
- HighByte = 0x20;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- pAd->LedIndicatorStrength = 0;
- break;
- case LED_LINK_UP:
- if (pAd->CommonCfg.Channel > 14)
- HighByte = 0xa0;
- else
- HighByte = 0x60;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_RADIO_ON:
- HighByte = 0x20;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_HALT:
- LowByte = 0; /* Driver sets MAC register and MAC controls LED */
- case LED_RADIO_OFF:
- HighByte = 0;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_WPS:
- HighByte = 0x10;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_ON_SITE_SURVEY:
- HighByte = 0x08;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_POWER_UP:
- HighByte = 0x04;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- default:
- DBGPRINT(RT_DEBUG_WARN,
- ("RTMPSetLED::Unknown Status %d\n", Status));
- break;
- }
-
- /* */
- /* Keep LED status for LED SiteSurvey mode. */
- /* After SiteSurvey, we will set the LED mode to previous status. */
- /* */
- if ((Status != LED_ON_SITE_SURVEY) && (Status != LED_POWER_UP))
- pAd->LedStatus = Status;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPSetLED::Mode=%d,HighByte=0x%02x,LowByte=0x%02x\n",
- pAd->LedCntl.field.LedMode, HighByte, LowByte));
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Set LED Signal Strength
-
- Arguments:
- pAd Pointer to our adapter
- Dbm Signal Strength
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
- Can be run on any IRQL level.
-
- According to Microsoft Zero Config Wireless Signal Strength definition as belows.
- <= -90 No Signal
- <= -81 Very Low
- <= -71 Low
- <= -67 Good
- <= -57 Very Good
- > -57 Excellent
- ========================================================================
-*/
-void RTMPSetSignalLED(struct rt_rtmp_adapter *pAd, IN NDIS_802_11_RSSI Dbm)
-{
- u8 nLed = 0;
-
- if (pAd->LedCntl.field.LedMode == LED_MODE_SIGNAL_STREGTH) {
- if (Dbm <= -90)
- nLed = 0;
- else if (Dbm <= -81)
- nLed = 1;
- else if (Dbm <= -71)
- nLed = 3;
- else if (Dbm <= -67)
- nLed = 7;
- else if (Dbm <= -57)
- nLed = 15;
- else
- nLed = 31;
-
- /* */
- /* Update Signal Strength to firmware if changed. */
- /* */
- if (pAd->LedIndicatorStrength != nLed) {
- AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed,
- pAd->LedCntl.field.Polarity);
- pAd->LedIndicatorStrength = nLed;
- }
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Enable RX
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL <= DISPATCH_LEVEL
-
- Note:
- Before Enable RX, make sure you have enabled Interrupt.
- ========================================================================
-*/
-void RTMPEnableRxTx(struct rt_rtmp_adapter *pAd)
-{
-/* WPDMA_GLO_CFG_STRUC GloCfg; */
-/* unsigned long i = 0; */
- u32 rx_filter_flag;
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n"));
-
- /* Enable Rx DMA. */
- RT28XXDMAEnable(pAd);
-
- /* enable RX of MAC block */
- if (pAd->OpMode == OPMODE_AP) {
- rx_filter_flag = APNORMAL;
-
- RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); /* enable RX of DMA block */
- } else {
- if (pAd->CommonCfg.PSPXlink)
- rx_filter_flag = PSPXLINK;
- else
- rx_filter_flag = STANORMAL; /* Station not drop control frame will fail WiFi Certification. */
- RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);
- }
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);
- DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPEnableRxTx\n"));
-}
-
-/*+++Add by shiang, move from os/linux/rt_main_dev.c */
-void CfgInitHook(struct rt_rtmp_adapter *pAd)
-{
- pAd->bBroadComHT = TRUE;
-}
-
-int rt28xx_init(struct rt_rtmp_adapter *pAd,
- char *pDefaultMac, char *pHostName)
-{
- u32 index;
- u8 TmpPhy;
- int Status;
- u32 MacCsr0 = 0;
-
-#ifdef RTMP_MAC_PCI
- {
- /* If dirver doesn't wake up firmware here, */
- /* NICLoadFirmware will hang forever when interface is up again. */
- /* RT2860 PCI */
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) &&
- OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
- AUTO_WAKEUP_STRUC AutoWakeupCfg;
- AsicForceWakeup(pAd, TRUE);
- AutoWakeupCfg.word = 0;
- RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG,
- AutoWakeupCfg.word);
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
- }
- }
-#endif /* RTMP_MAC_PCI // */
-
- /* reset Adapter flags */
- RTMP_CLEAR_FLAGS(pAd);
-
- /* Init BssTab & ChannelInfo tabbles for auto channel select. */
-
- /* Allocate BA Reordering memory */
- ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM);
-
- /* Make sure MAC gets ready. */
- index = 0;
- do {
- RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
- pAd->MACVersion = MacCsr0;
-
- if ((pAd->MACVersion != 0x00)
- && (pAd->MACVersion != 0xFFFFFFFF))
- break;
-
- RTMPusecDelay(10);
- } while (index++ < 100);
- DBGPRINT(RT_DEBUG_TRACE,
- ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
-
-#ifdef RTMP_MAC_PCI
-#ifdef PCIE_PS_SUPPORT
- /*Iverson patch PCIE L1 issue to make sure that driver can be read,write ,BBP and RF register at pcie L.1 level */
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
- RTMP_IO_READ32(pAd, AUX_CTRL, &MacCsr0);
- MacCsr0 |= 0x402;
- RTMP_IO_WRITE32(pAd, AUX_CTRL, MacCsr0);
- DBGPRINT(RT_DEBUG_TRACE, ("AUX_CTRL = 0x%x\n", MacCsr0));
- }
-#endif /* PCIE_PS_SUPPORT // */
-
- /* To fix driver disable/enable hang issue when radio off */
- RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x2);
-#endif /* RTMP_MAC_PCI // */
-
- /* Disable DMA */
- RT28XXDMADisable(pAd);
-
- /* Load 8051 firmware */
- Status = NICLoadFirmware(pAd);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("NICLoadFirmware failed, Status[=0x%08x]\n", Status);
- goto err1;
- }
-
- NICLoadRateSwitchingParams(pAd);
-
- /* Disable interrupts here which is as soon as possible */
- /* This statement should never be true. We might consider to remove it later */
-#ifdef RTMP_MAC_PCI
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) {
- RTMP_ASIC_INTERRUPT_DISABLE(pAd);
- }
-#endif /* RTMP_MAC_PCI // */
-
- Status = RTMPAllocTxRxRingMemory(pAd);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("RTMPAllocDMAMemory failed, Status[=0x%08x]\n", Status);
- goto err1;
- }
-
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
-
- /* initialize MLME */
- /* */
-
- Status = RtmpMgmtTaskInit(pAd);
- if (Status != NDIS_STATUS_SUCCESS)
- goto err2;
-
- Status = MlmeInit(pAd);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("MlmeInit failed, Status[=0x%08x]\n", Status);
- goto err2;
- }
- /* Initialize pAd->StaCfg, pAd->ApCfg, pAd->CommonCfg to manufacture default */
- /* */
- UserCfgInit(pAd);
- Status = RtmpNetTaskInit(pAd);
- if (Status != NDIS_STATUS_SUCCESS)
- goto err3;
-
-/* COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].Bssid, netif->hwaddr); */
-/* pAd->bForcePrintTX = TRUE; */
-
- CfgInitHook(pAd);
-
- NdisAllocateSpinLock(&pAd->MacTabLock);
-
- MeasureReqTabInit(pAd);
- TpcReqTabInit(pAd);
-
- /* */
- /* Init the hardware, we need to init asic before read registry, otherwise mac register will be reset */
- /* */
- Status = NICInitializeAdapter(pAd, TRUE);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("NICInitializeAdapter failed, Status[=0x%08x]\n", Status);
- if (Status != NDIS_STATUS_SUCCESS)
- goto err3;
- }
-
- DBGPRINT(RT_DEBUG_OFF, ("1. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
-
-#ifdef RTMP_MAC_USB
- pAd->CommonCfg.bMultipleIRP = FALSE;
-
- if (pAd->CommonCfg.bMultipleIRP)
- pAd->CommonCfg.NumOfBulkInIRP = RX_RING_SIZE;
- else
- pAd->CommonCfg.NumOfBulkInIRP = 1;
-#endif /* RTMP_MAC_USB // */
-
- /*Init Ba Capability parameters. */
-/* RT28XX_BA_INIT(pAd); */
- pAd->CommonCfg.DesiredHtPhy.MpduDensity =
- (u8)pAd->CommonCfg.BACapability.field.MpduDensity;
- pAd->CommonCfg.DesiredHtPhy.AmsduEnable =
- (u16)pAd->CommonCfg.BACapability.field.AmsduEnable;
- pAd->CommonCfg.DesiredHtPhy.AmsduSize =
- (u16)pAd->CommonCfg.BACapability.field.AmsduSize;
- pAd->CommonCfg.DesiredHtPhy.MimoPs =
- (u16)pAd->CommonCfg.BACapability.field.MMPSmode;
- /* UPdata to HT IE */
- pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs =
- (u16)pAd->CommonCfg.BACapability.field.MMPSmode;
- pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize =
- (u16)pAd->CommonCfg.BACapability.field.AmsduSize;
- pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity =
- (u8)pAd->CommonCfg.BACapability.field.MpduDensity;
-
- /* after reading Registry, we now know if in AP mode or STA mode */
-
- /* Load 8051 firmware; crash when FW image not existent */
- /* Status = NICLoadFirmware(pAd); */
- /* if (Status != NDIS_STATUS_SUCCESS) */
- /* break; */
-
- DBGPRINT(RT_DEBUG_OFF, ("2. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
-
- /* We should read EEPROM for all cases. rt2860b */
- NICReadEEPROMParameters(pAd, (u8 *)pDefaultMac);
-
- DBGPRINT(RT_DEBUG_OFF, ("3. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
-
- NICInitAsicFromEEPROM(pAd); /*rt2860b */
-
- /* Set PHY to appropriate mode */
- TmpPhy = pAd->CommonCfg.PhyMode;
- pAd->CommonCfg.PhyMode = 0xff;
- RTMPSetPhyMode(pAd, TmpPhy);
- SetCommonHT(pAd);
-
- /* No valid channels. */
- if (pAd->ChannelListNum == 0) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Wrong configuration. No valid channel found. Check \"ContryCode\" and \"ChannelGeography\" setting.\n"));
- goto err4;
- }
-
- DBGPRINT(RT_DEBUG_OFF,
- ("MCS Set = %02x %02x %02x %02x %02x\n",
- pAd->CommonCfg.HtCapability.MCSSet[0],
- pAd->CommonCfg.HtCapability.MCSSet[1],
- pAd->CommonCfg.HtCapability.MCSSet[2],
- pAd->CommonCfg.HtCapability.MCSSet[3],
- pAd->CommonCfg.HtCapability.MCSSet[4]));
-
-#ifdef RTMP_RF_RW_SUPPORT
- /*Init RT30xx RFRegisters after read RFIC type from EEPROM */
- NICInitRFRegisters(pAd);
-#endif /* RTMP_RF_RW_SUPPORT // */
-
-/* APInitialize(pAd); */
-
- /* */
- /* Initialize RF register to default value */
- /* */
- AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
- AsicLockChannel(pAd, pAd->CommonCfg.Channel);
-
- /* 8051 firmware require the signal during booting time. */
- /*2008/11/28:KH marked the following codes to patch Frequency offset bug */
- /*AsicSendCommandToMcu(pAd, 0x72, 0xFF, 0x00, 0x00); */
-
- if (pAd && (Status != NDIS_STATUS_SUCCESS)) {
- /* */
- /* Undo everything if it failed */
- /* */
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
-/* NdisMDeregisterInterrupt(&pAd->Interrupt); */
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
- }
-/* RTMPFreeAdapter(pAd); // we will free it in disconnect() */
- } else if (pAd) {
- /* Microsoft HCT require driver send a disconnect event after driver initialization. */
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
-/* pAd->IndicateMediaState = NdisMediaStateDisconnected; */
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("NDIS_STATUS_MEDIA_DISCONNECT Event B!\n"));
-
-#ifdef RTMP_MAC_USB
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
-
- /* */
- /* Support multiple BulkIn IRP, */
- /* the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1. */
- /* */
- for (index = 0; index < pAd->CommonCfg.NumOfBulkInIRP; index++) {
- RTUSBBulkReceive(pAd);
- DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBulkReceive!\n"));
- }
-#endif /* RTMP_MAC_USB // */
- } /* end of else */
-
- /* Set up the Mac address */
- RtmpOSNetDevAddrSet(pAd->net_dev, &pAd->CurrentAddress[0]);
-
- DBGPRINT_S(Status, ("<==== rt28xx_init, Status=%x\n", Status));
-
- return TRUE;
-
-err4:
-err3:
- MlmeHalt(pAd);
-err2:
- RTMPFreeTxRxRingMemory(pAd);
-err1:
-
- os_free_mem(pAd, pAd->mpdu_blk_pool.mem); /* free BA pool */
-
- /* shall not set priv to NULL here because the priv didn't been free yet. */
- /*net_dev->ml_priv = 0; */
-#ifdef ST
-err0:
-#endif /* ST // */
-
- DBGPRINT(RT_DEBUG_ERROR, ("rt28xx Initialized fail!\n"));
- return FALSE;
-}
-
-/*---Add by shiang, move from os/linux/rt_main_dev.c */
-
-static int RtmpChipOpsRegister(struct rt_rtmp_adapter *pAd, int infType)
-{
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
- int status;
-
- memset(pChipOps, 0, sizeof(struct rt_rtmp_chip_op));
-
- /* set eeprom related hook functions */
- status = RtmpChipOpsEepromHook(pAd, infType);
-
- /* set mcu related hook functions */
- switch (infType) {
-#ifdef RTMP_PCI_SUPPORT
- case RTMP_DEV_INF_PCI:
- pChipOps->loadFirmware = RtmpAsicLoadFirmware;
- pChipOps->eraseFirmware = RtmpAsicEraseFirmware;
- pChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu;
- break;
-#endif /* RTMP_PCI_SUPPORT // */
-#ifdef RTMP_USB_SUPPORT
- case RTMP_DEV_INF_USB:
- pChipOps->loadFirmware = RtmpAsicLoadFirmware;
- pChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu;
- break;
-#endif /* RTMP_USB_SUPPORT // */
- default:
- break;
- }
-
- return status;
-}
-
-int RtmpRaDevCtrlInit(struct rt_rtmp_adapter *pAd, IN RTMP_INF_TYPE infType)
-{
- /*void *handle; */
-
- /* Assign the interface type. We need use it when do register/EEPROM access. */
- pAd->infType = infType;
-
- pAd->OpMode = OPMODE_STA;
- DBGPRINT(RT_DEBUG_TRACE,
- ("STA Driver version-%s\n", STA_DRIVER_VERSION));
-
-#ifdef RTMP_MAC_USB
- sema_init(&(pAd->UsbVendorReq_semaphore), 1);
- os_alloc_mem(pAd, (u8 **) & pAd->UsbVendorReqBuf,
- MAX_PARAM_BUFFER_SIZE - 1);
- if (pAd->UsbVendorReqBuf == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Allocate vendor request temp buffer failed!\n"));
- return FALSE;
- }
-#endif /* RTMP_MAC_USB // */
-
- RtmpChipOpsRegister(pAd, infType);
-
- return 0;
-}
-
-BOOLEAN RtmpRaDevCtrlExit(struct rt_rtmp_adapter *pAd)
-{
-
- RTMPFreeAdapter(pAd);
-
- return TRUE;
-}
-
-/* not yet support MBSS */
-struct net_device *get_netdev_from_bssid(struct rt_rtmp_adapter *pAd, u8 FromWhichBSSID)
-{
- struct net_device *dev_p = NULL;
-
- {
- dev_p = pAd->net_dev;
- }
-
- ASSERT(dev_p);
- return dev_p; /* return one of MBSS */
-}