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

📄 rtmp_init.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 5 页
字号:
	Arguments:		Adapter						Pointer to our adapter	Return Value:		None	IRQL = PASSIVE_LEVEL	Note:			========================================================================*/VOID	NICReadEEPROMParameters(	IN	PRTMP_ADAPTER	pAd){	ULONG			data, Adata40M, Gdata40M;	USHORT			i, value, value2;	INT			 Apwrdelta, Gpwrdelta;	BOOLEAN			 bApwrdeltaMinus = FALSE, bGpwrdeltaMinus = FALSE;	UCHAR			TmpPhy;	EEPROM_TX_PWR_STRUC	    Power;	EEPROM_VERSION_STRUC    Version;	EEPROM_ANTENNA_STRUC	Antenna;	EEPROM_NIC_CONFIG2_STRUC    NicConfig2;	UCHAR			t1,t2,t3,t4;//#ifdef WIFI_TEST		ULONG			default_tx_power = 0x66666666;//#endif // WIFI_TEST //	DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n"));		// 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%lx\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 intialize	// MAC address registers according to E2PROM setting	{		USHORT  Addr01,Addr23,Addr45 ;		Addr01=RTMP_EEPROM_READ16(pAd, 0x04);		Addr23=RTMP_EEPROM_READ16(pAd, 0x06);		Addr45=RTMP_EEPROM_READ16(pAd, 0x08);		pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);		pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8);		pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);		pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8);		pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);		pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8);		//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: =%02x:%02x:%02x:%02x:%02x:%02x\n",			pAd->PermanentAddress[0], pAd->PermanentAddress[1], 			pAd->PermanentAddress[2], pAd->PermanentAddress[3], 			pAd->PermanentAddress[4], pAd->PermanentAddress[5]));		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: =%02x:%02x:%02x:%02x:%02x:%02x\n",				pAd->PermanentAddress[0], pAd->PermanentAddress[1], 				pAd->PermanentAddress[2], pAd->PermanentAddress[3], 				pAd->PermanentAddress[4], pAd->PermanentAddress[5]));		}	}   	// 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	Version.word = RTMP_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET);	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	value = RTMP_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET);	pAd->EEPROMDefaultValue[0] = value;	value = RTMP_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET);	pAd->EEPROMDefaultValue[1] = value;	value = RTMP_EEPROM_READ16(pAd, 0x38);	// Country Region	pAd->EEPROMDefaultValue[2] = value;	for(i = 0; i < 8; i++)	{		value = RTMP_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2);		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)	{		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;		NicConfig2.word = pAd->EEPROMDefaultValue[1];#ifdef CONFIG_STA_SUPPORT	NicConfig2.word = 0;    if ((NicConfig2.word & 0x00ff) == 0xff)	{		NicConfig2.word &= 0xff00;	}	if ((NicConfig2.word >> 8) == 0xff)	{		NicConfig2.word &= 0x00ff;	}#endif // CONFIG_STA_SUPPORT //	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;	//	// Reset PhyMode if we don't support 802.11a	//	if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||		(pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED))	{		//		// Only RFIC_2850 & RFIC_2750 support 802.11a		//		if ((Antenna.field.RfIcType != RFIC_2850) && (Antenna.field.RfIcType != RFIC_2750))			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) */		Power.word = RTMP_EEPROM_READ16(pAd, 0x6E);		pAd->TssiMinusBoundaryG[4] = Power.field.Byte0;		pAd->TssiMinusBoundaryG[3] = Power.field.Byte1;		Power.word = RTMP_EEPROM_READ16(pAd, 0x70);		pAd->TssiMinusBoundaryG[2] = Power.field.Byte0;		pAd->TssiMinusBoundaryG[1] = Power.field.Byte1;		Power.word = RTMP_EEPROM_READ16(pAd, 0x72);		pAd->TssiRefG   = Power.field.Byte0; /* reference value [0] */		pAd->TssiPlusBoundaryG[1] = Power.field.Byte1;		Power.word = RTMP_EEPROM_READ16(pAd, 0x74);		pAd->TssiPlusBoundaryG[2] = Power.field.Byte0;		pAd->TssiPlusBoundaryG[3] = Power.field.Byte1;		Power.word = RTMP_EEPROM_READ16(pAd, 0x76);		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	{		Power.word = RTMP_EEPROM_READ16(pAd, 0xD4);		pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;		pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;		Power.word = RTMP_EEPROM_READ16(pAd, 0xD6);		pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;		pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;		Power.word = RTMP_EEPROM_READ16(pAd, 0xD8);		pAd->TssiRefA   = Power.field.Byte0;		pAd->TssiPlusBoundaryA[1] = Power.field.Byte1;		Power.word = RTMP_EEPROM_READ16(pAd, 0xDA);		pAd->TssiPlusBoundaryA[2] = Power.field.Byte0;		pAd->TssiPlusBoundaryA[3] = Power.field.Byte1;		Power.word = RTMP_EEPROM_READ16(pAd, 0xDC);		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	value = RTMP_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET);	if ((value & 0x00FF) != 0x00FF)		pAd->RfFreqOffset = (ULONG) (value & 0x00FF);	else		pAd->RfFreqOffset = 0;	DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset));	//CountryRegion byte offset = 0x25	value = pAd->EEPROMDefaultValue[2] >> 8;	value2 = pAd->EEPROMDefaultValue[2] & 0x00FF;		if ((value <= 6) && (value2 <= 8))	{		pAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80;		pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;		TmpPhy = pAd->CommonCfg.PhyMode;		pAd->CommonCfg.PhyMode = 0xff;		RTMPSetPhyMode(pAd, TmpPhy);	}	//	// Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.	// The valid value are (-10 ~ 10) 	// 	value = RTMP_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET);	pAd->BGRssiOffset0 = value & 0x00ff;	pAd->BGRssiOffset1 = (value >> 8);	value = RTMP_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2);	pAd->BGRssiOffset2 = value & 0x00ff;	pAd->ALNAGain1 = (value >> 8);	value = RTMP_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET);	pAd->BLNAGain = value & 0x00ff;	pAd->ALNAGain0 = (value >> 8);	#ifdef RALINK_ATE    if (pAd->ate.Mode != ATE_STOP)    {		pAd->ALNAGain = (value >> 8);    }#endif // RALINK_ATE //	// 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;			value = RTMP_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET);	pAd->ARssiOffset0 = value & 0x00ff;	pAd->ARssiOffset1 = (value >> 8);	value = RTMP_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2));	pAd->ARssiOffset2 = value & 0x00ff;	pAd->ALNAGain2 = (value >> 8);	if (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))		pAd->ALNAGain1 = pAd->ALNAGain0;	if (((UCHAR)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;	//	// Get LED Setting.	//	value = RTMP_EEPROM_READ16(pAd, 0x3a);	pAd->LedCntl.word = (value&0xff00) >> 8;	value = RTMP_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET);	pAd->Led1 = value;	value = RTMP_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET);	pAd->Led2 = value;	value = RTMP_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET);	pAd->Led3 = value;			//	// Get Txpower per Rate & power delta for 40MHz.	//	DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n"));	/* default tx power =	   0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666	   adjust delta power based on reference tempature =	   0x66666666, 0x77776666, 0x77775566, 0x66665566, 0xffff6666,	   only 11N rate is adjusted */	value2 = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA);	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));	for (i=0; i<5; i++)	{		value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE + i*4);		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)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -