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

📄 rtmp_init.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		if (IS_RT3071(pAd))		{			// add by johnli, RF power sequence setup, load RF normal operation-mode setup			RT30xxLoadRFNormalModeSetup(pAd);		}	}	}#endif // RT3070 ///*	========================================================================		Routine Description:		Read initial parameters from EEPROM			Arguments:		Adapter						Pointer to our adapter	Return Value:		None	IRQL = PASSIVE_LEVEL	Note:			========================================================================*/VOID	NICReadEEPROMParameters(	IN	PRTMP_ADAPTER	pAd,	IN	PUCHAR			mac_addr){	UINT32			data = 0;	USHORT			i, value, value2;	UCHAR			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"));		// 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 intialize	// MAC address registers according to E2PROM setting	if (mac_addr == NULL ||		strlen(mac_addr) != 17 || 		mac_addr[2] != ':'  || mac_addr[5] != ':'  || mac_addr[8] != ':' ||		mac_addr[11] != ':' || mac_addr[14] != ':')	{		USHORT  Addr01,Addr23,Addr45 ;		RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);		RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);		RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);		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);		DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from E2PROM \n"));	}	else	{		INT		j;		PUCHAR	macptr;		macptr = 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: =%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	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))		{			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));#ifdef RT30xx		}#endif // RT30xx //	}	// 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];#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{		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	// Only RFIC_2850 & RFIC_2750 support 802.11a	//	if ((Antenna.field.RfIcType != RFIC_2850) && (Antenna.field.RfIcType != RFIC_2750))	{		if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) || 			(pAd->CommonCfg.PhyMode == PHY_11A))			pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;#ifdef DOT11_N_SUPPORT		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;#endif // DOT11_N_SUPPORT //	}		// 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 = (ULONG) (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 = ((UCHAR) value) | 0x80;		pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;		TmpPhy = pAd->CommonCfg.PhyMode;		pAd->CommonCfg.PhyMode = 0xff;		RTMPSetPhyMode(pAd, TmpPhy);#ifdef DOT11_N_SUPPORT		SetCommonHT(pAd);#endif // DOT11_N_SUPPORT //	}	//	// 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 (((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.	//	RT28xx_EEPROM_READ16(pAd, 0x3a, value);	pAd->LedCntl.word = (value&0xff00) >> 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 SINGLE_SKU	//pAd->CommonCfg.DefineMaxTxPwr = RTMP_EEPROM_READ16(pAd, EEPROM_DEFINE_MAX_TXPWR);	RT28xx_EEPROM_READ16(pAd, EEPROM_DEFINE_MAX_TXPWR, pAd->CommonCfg.DefineMaxTxPwr);#endif // SINGLE_SKU //#ifdef RT30xx	if (IS_RT30xx(pAd))	{		eFusePhysicalReadRegisters(pAd, EFUSE_TAG, 2, &value);		pAd->EFuseTag = (value & 0xff);	}#endif // RT30xx //	DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));}

⌨️ 快捷键说明

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