📄 rtmp_init.c
字号:
/* ************************************************************************* * 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 -------- ---------- ---------------------------------------------- Paul Lin 2002-08-01 created John Chang 2004-08-20 RT2561/2661 use scatter-gather scheme Jan Lee 2006-09-15 RT2860. Change for 802.11n , EEPROM, Led, BA, HT.*/#include "rt_config.h"#include "firmware.h"//#define BIN_IN_FILE /* use *.bin firmware */UCHAR BIT8[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};ULONG BIT32[] = {0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000};char* CipherName[] = {"none","wep64","wep128","TKIP","AES","CKIP64","CKIP128"};const unsigned short ccitt_16Table[] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0};#define ByteCRC16(v, crc) \ (unsigned short)((crc << 8) ^ ccitt_16Table[((crc >> 8) ^ (v)) & 255])unsigned char BitReverse(unsigned char x){ int i; unsigned char Temp=0; for(i=0; ; i++) { if(x & 0x80) Temp |= 0x80; if(i==7) break; x <<= 1; Temp >>= 1; } return Temp;}//// BBP register initialization set//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.};#define NUM_BBP_REG_PARMS (sizeof(BBPRegTable) / sizeof(REG_PAIR))//// RF register initialization set//#ifdef RT30xxREG_PAIR RT30xx_RFRegTable[] = { {RF_R04, 0x40}, {RF_R05, 0x03}, {RF_R06, 0x02}, {RF_R07, 0x70}, {RF_R09, 0x0F}, {RF_R10, 0x41}, {RF_R11, 0x21}, {RF_R12, 0x7B}, {RF_R14, 0x90}, {RF_R15, 0x58}, {RF_R16, 0xB3}, {RF_R17, 0x92}, {RF_R18, 0x2C}, {RF_R19, 0x02}, {RF_R20, 0xBA}, {RF_R21, 0xDB}, {RF_R24, 0x16}, {RF_R25, 0x01}, {RF_R29, 0x1F},};#define NUM_RF_REG_PARMS (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR))#endif // RT30xx ////// ASIC register initialization sets//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, 0x000a2090}, {MAX_LEN_CFG, MAX_AGGREGATION_SIZE | 0x00001000}, // 0x3018, MAX frame length. Max PSDU = 16kbytes. {LED_CFG, 0x7f031e46}, // Gary, 2006-08-23//#ifdef CONFIG_STA_SUPPORT// {WMM_AIFSN_CFG, 0x00002273},// {WMM_CWMIN_CFG, 0x00002344},// {WMM_CWMAX_CFG, 0x000034aa},//#endif // CONFIG_STA_SUPPORT //#ifdef INF_AMAZON_SE {PBF_MAX_PCNT, 0x1F3F6F6F}, //iverson modify for usb issue, 2008/09/19 // 6F + 6F < total page count FE // so that RX doesn't occupy TX's buffer space when WMM congestion.#else {PBF_MAX_PCNT, 0x1F3FBF9F}, //0x1F3f7f9f}, //Jan, 2006/04/20#endif // INF_AMAZON_SE // //{TX_RTY_CFG, 0x6bb80408}, // Jan, 2006/11/16 {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. //PS packets use Tx1Q (for HCCA) when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)#ifdef RT2870#ifdef CONFIG_STA_SUPPORT {PBF_CFG, 0xf40006}, // Only enable Queue 2#endif // CONFIG_STA_SUPPORT // {MM40_PROT_CFG, 0x3F44084}, // Initial Auto_Responder, because QA will turn off Auto-Responder {WPDMA_GLO_CFG, 0x00000030},#endif // RT2870 // {GF20_PROT_CFG, 0x01744004}, // set 19:18 --> Short NAV for MIMO PS {GF40_PROT_CFG, 0x03F44084}, {MM20_PROT_CFG, 0x01744004}, {TXOP_CTRL_CFG, 0x0000583f, /*0x0000243f*/ /*0x000024bf*/}, //Extension channel backoff. {TX_RTS_CFG, 0x00092b20}, //#ifdef WIFI_TEST {EXP_ACK_TIME, 0x002400ca}, // default value//#else// {EXP_ACK_TIME, 0x005400ca}, // suggested by Gray @ 20070323 for 11n intel-sta throughput//#endif // end - WIFI_TEST // {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};#ifdef CONFIG_STA_SUPPORTRTMP_REG_PAIR STAMACRegTable[] = { {WMM_AIFSN_CFG, 0x00002273}, {WMM_CWMIN_CFG, 0x00002344}, {WMM_CWMAX_CFG, 0x000034aa},};#endif // CONFIG_STA_SUPPORT //#define NUM_MAC_REG_PARMS (sizeof(MACRegTable) / sizeof(RTMP_REG_PAIR))#ifdef CONFIG_STA_SUPPORT#define NUM_STA_MAC_REG_PARMS (sizeof(STAMACRegTable) / sizeof(RTMP_REG_PAIR))#endif // CONFIG_STA_SUPPORT //#ifdef RT2870//// RT2870 Firmware Spec only used 1 oct for version expression//#define FIRMWARE_MINOR_VERSION 7#endif // RT2870 //// New 8k byte firmware size for RT3071/RT3072#define FIRMWAREIMAGE_MAX_LENGTH 0x2000#define FIRMWAREIMAGE_LENGTH (sizeof (FirmwareImage) / sizeof(UCHAR))#define FIRMWARE_MAJOR_VERSION 0#define FIRMWAREIMAGEV1_LENGTH 0x1000#define FIRMWAREIMAGEV2_LENGTH 0x1000/* ======================================================================== Routine Description: Allocate 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: ========================================================================*/NDIS_STATUS RTMPAllocAdapterBlock( IN PVOID handle, OUT PRTMP_ADAPTER *ppAdapter){ PRTMP_ADAPTER pAd; NDIS_STATUS Status; INT index; UCHAR *pBeaconBuf = NULL; DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocAdapterBlock\n")); *ppAdapter = NULL; do { // Allocate 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; } Status = AdapterBlockAllocateMemory(handle, (PVOID *)&pAd); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("Failed to allocate memory - ADAPTER\n")); break; } pAd->BeaconBuf = pBeaconBuf; printk("\n\n=== pAd = %p, size = %d ===\n\n", pAd, (UINT32)sizeof(RTMP_ADAPTER)); // Init spin locks NdisAllocateSpinLock(&pAd->MgmtRingLock); 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( IN PRTMP_ADAPTER pAd){ ULONG data, Adata, Gdata; USHORT i, value, value2; INT Apwrdelta, Gpwrdelta; UCHAR t1,t2,t3,t4; BOOLEAN bValid, 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -