⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtmp_init.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/* ************************************************************************* * 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 + -