rtmp_init.c

来自「RT73无线网络芯片最新linux下驱动 支持到linux2.6.24 并向下兼」· C语言 代码 · 共 2,076 行 · 第 1/5 页

C
2,076
字号
	// 1. 11a	{		RTUSBReadEEPROM(pAd, EEPROM_A_TSSI_CALIBRAION, ChannelTxPower, 10);		pAd->TssiMinusBoundaryA[4] = ChannelTxPower[0];		pAd->TssiMinusBoundaryA[3] = ChannelTxPower[1];		pAd->TssiMinusBoundaryA[2] = ChannelTxPower[2];		pAd->TssiMinusBoundaryA[1] = ChannelTxPower[3];		pAd->TssiPlusBoundaryA[1] = ChannelTxPower[4];		pAd->TssiPlusBoundaryA[2] = ChannelTxPower[5];		pAd->TssiPlusBoundaryA[3] = ChannelTxPower[6];		pAd->TssiPlusBoundaryA[4] = ChannelTxPower[7];		pAd->TssiRefA	= ChannelTxPower[8];		pAd->TxAgcStepA = ChannelTxPower[9]; 		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 = 0x79;	RTUSBReadEEPROM(pAd, EEPROM_FREQ_OFFSET, (PUCHAR) &value, 2);	if ((value & 0xFF00) == 0xFF00)	{		pAd->RFProgSeq = 0;	}	else	{		pAd->RFProgSeq = (value & 0x0300) >> 8;	// bit 8,9	}	value &= 0x00FF;	if (value != 0x00FF)		pAd->RfFreqOffset = (ULONG) value;	else		pAd->RfFreqOffset = 0;	DBGPRINT(RT_DEBUG_TRACE, "E2PROM: RF freq offset=0x%x\n", pAd->RfFreqOffset);	//CountryRegion byte offset = 0x25	value = pAd->EEPROMDefaultValue[2] >> 8;	value2 = pAd->EEPROMDefaultValue[2] & 0x00FF;    if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND))	{		pAd->PortCfg.CountryRegion = ((UCHAR) value) | 0x80;		pAd->PortCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80;	}	//	// Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch.	// The valid value are (-10 ~ 10) 	// 	RTUSBReadEEPROM(pAd, EEPROM_RSSI_BG_OFFSET, (PUCHAR) &value, 2);	pAd->BGRssiOffset1 = value & 0x00ff;	pAd->BGRssiOffset2 = (value >> 8);	// 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;			RTUSBReadEEPROM(pAd, EEPROM_RSSI_A_OFFSET, (PUCHAR) &value, 2);	pAd->ARssiOffset1 = value & 0x00ff;	pAd->ARssiOffset2 = (value >> 8);	// 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.	//	RTUSBReadEEPROM(pAd, EEPROM_LED_OFFSET, (PUCHAR)&LedSetting.word, 2);	if (LedSetting.word == 0xFFFF)	{		//		// Set it to Default.		//		LedSetting.field.PolarityRDY_G = 0;   // Active High.		LedSetting.field.PolarityRDY_A = 0;   // Active High.		LedSetting.field.PolarityACT = 0;	 // Active High.		LedSetting.field.PolarityGPIO_0 = 0; // Active High.		LedSetting.field.PolarityGPIO_1 = 0; // Active High.		LedSetting.field.PolarityGPIO_2 = 0; // Active High.		LedSetting.field.PolarityGPIO_3 = 0; // Active High.		LedSetting.field.PolarityGPIO_4 = 0; // Active High.		LedSetting.field.LedMode = LED_MODE_DEFAULT;			}	pAd->LedCntl.word = 0;	pAd->LedCntl.field.LedMode = LedSetting.field.LedMode;	pAd->LedCntl.field.PolarityRDY_G = LedSetting.field.PolarityRDY_G;	pAd->LedCntl.field.PolarityRDY_A = LedSetting.field.PolarityRDY_A;	pAd->LedCntl.field.PolarityACT = LedSetting.field.PolarityACT;	pAd->LedCntl.field.PolarityGPIO_0 = LedSetting.field.PolarityGPIO_0;	pAd->LedCntl.field.PolarityGPIO_1 = LedSetting.field.PolarityGPIO_1;	pAd->LedCntl.field.PolarityGPIO_2 = LedSetting.field.PolarityGPIO_2;	pAd->LedCntl.field.PolarityGPIO_3 = LedSetting.field.PolarityGPIO_3;	pAd->LedCntl.field.PolarityGPIO_4 = LedSetting.field.PolarityGPIO_4;	RTUSBReadEEPROM(pAd, EEPROM_TXPOWER_DELTA_OFFSET, (PUCHAR)&value, 2);	value = value & 0x00ff;	if (value != 0xff)	{		pAd->TxPowerDeltaConfig.value = (UCHAR) value;		if (pAd->TxPowerDeltaConfig.field.DeltaValue > 0x04)			pAd->TxPowerDeltaConfig.field.DeltaValue = 0x04;	}	else		pAd->TxPowerDeltaConfig.field.TxPowerEnable = FALSE;			DBGPRINT(RT_DEBUG_TRACE, "<-- NICReadEEPROMParameters\n");}/*	========================================================================		Routine Description:		Set default value from EEPROM			Arguments:		Adapter						Pointer to our adapter	Return Value:		None	Note:			========================================================================*/VOID NICInitAsicFromEEPROM(	IN	PRTMP_ADAPTER	pAd){	ULONG					data;	USHORT					i;	ULONG					MiscMode;	EEPROM_ANTENNA_STRUC	Antenna;	EEPROM_NIC_CONFIG2_STRUC	NicConfig2;	DBGPRINT(RT_DEBUG_TRACE, "--> NICInitAsicFromEEPROM\n");	for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)	{		UCHAR BbpRegIdx, BbpValue;			if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0))		{			BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8);			BbpValue  = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff);			RTUSBWriteBBPRegister(pAd, BbpRegIdx, BbpValue);		}	}	#ifdef BIG_ENDIAN	Antenna.word = SWAP16(pAd->EEPROMDefaultValue[0]);#else	Antenna.word = pAd->EEPROMDefaultValue[0];#endif	if (Antenna.word == 0xFFFF)	{		Antenna.word = 0;		Antenna.field.RfIcType = RFIC_5226;		Antenna.field.HardwareRadioControl = 0; 	// no hardware control		Antenna.field.DynamicTxAgcControl = 0;		Antenna.field.FrameType = 0;		Antenna.field.RxDefaultAntenna = 2; 		// Ant-B		Antenna.field.TxDefaultAntenna = 2; 		// Ant-B		Antenna.field.NumOfAntenna = 2;		DBGPRINT(RT_DEBUG_WARN, "E2PROM error, hard code as 0x%04x\n", Antenna.word);	}	pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;	DBGPRINT(RT_DEBUG_WARN, "pAd->RfIcType = %d\n", pAd->RfIcType);	//	// For RFIC RFIC_5225 & RFIC_2527	// Must enable RF RPI mode on PHY_CSR1 bit 16.	//	if ((pAd->RfIcType == RFIC_5225) || (pAd->RfIcType == RFIC_2527) || (pAd->RfIcType == RFIC_3020))	{		RTUSBReadMACRegister(pAd, PHY_CSR1, &MiscMode);		MiscMode |= 0x10000;		RTUSBWriteMACRegister(pAd, PHY_CSR1, MiscMode);	}		// Save the antenna for future use	pAd->Antenna.word = Antenna.word;		// Read Hardware controlled Radio state enable bit	if (Antenna.field.HardwareRadioControl == 1)	{		pAd->PortCfg.bHardwareRadio = TRUE;				// Read GPIO pin7 as Hardware controlled radio state		RTUSBReadMACRegister(pAd, MAC_CSR13, &data);		//		// The GPIO pin7 default is 1:Pull-High, means HW Radio Enable.		// When the value is 0, means HW Radio disable.		//		if ((data & 0x80) == 0)		{			pAd->PortCfg.bHwRadio = FALSE;			// Update extra information to link is up			pAd->ExtraInfo = HW_RADIO_OFF;		}	}	else		pAd->PortCfg.bHardwareRadio = FALSE;				pAd->PortCfg.bRadio = pAd->PortCfg.bSwRadio && pAd->PortCfg.bHwRadio;		if (pAd->PortCfg.bRadio == FALSE)	{		RTUSBWriteMACRegister(pAd, MAC_CSR10, 0x00001818);		RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);			RTMPSetLED(pAd, LED_RADIO_OFF);	}	else	{		RTMPSetLED(pAd, LED_RADIO_ON);	}	#ifdef BIG_ENDIAN	NicConfig2.word = SWAP16(pAd->EEPROMDefaultValue[1]);#else	NicConfig2.word = pAd->EEPROMDefaultValue[1];#endif	if (NicConfig2.word == 0xffff)	{		NicConfig2.word = 0;	}	// Save the antenna for future use	pAd->NicConfig2.word = NicConfig2.word;	DBGPRINT(RT_DEBUG_TRACE, "Use Hw Radio Control Pin=%d; if used Pin=%d;\n",		pAd->PortCfg.bHardwareRadio, pAd->PortCfg.bHardwareRadio);		DBGPRINT(RT_DEBUG_TRACE, "RFIC=%d, LED mode=%d\n", pAd->RfIcType, pAd->LedCntl.field.LedMode);	pAd->PortCfg.BandState = UNKNOWN_BAND;	DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitAsicFromEEPROM\n");}/*	========================================================================		Routine Description:		Initialize NIC hardware	Arguments:		Adapter						Pointer to our adapter	Return Value:		None	Note:			========================================================================*/NDIS_STATUS	NICInitializeAsic(	IN	PRTMP_ADAPTER	pAd){	ULONG			Index, Counter;	UCHAR			Value = 0xff;	ULONG			Version;	MAC_CSR12_STRUC	MacCsr12;	DBGPRINT(RT_DEBUG_TRACE, "--> NICInitializeAsic\n");	RTUSBReadMACRegister(pAd, MAC_CSR0, &Version);		// Initialize MAC register to default value	for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++)	{		RTUSBWriteMACRegister(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);	}		// Set Host ready before kicking Rx	RTUSBWriteMACRegister(pAd, MAC_CSR1, 0x3);	RTUSBWriteMACRegister(pAd, MAC_CSR1, 0x0);			//	// Before program BBP, we need to wait BBP/RF get wake up.	//	Index = 0;	do	{		RTUSBReadMACRegister(pAd, MAC_CSR12, &MacCsr12.word);		if (MacCsr12.field.BbpRfStatus == 1)			break;		RTUSBWriteMACRegister(pAd, MAC_CSR12, 0x4); //Force wake up.		RTMPusecDelay(1000);	} while (Index++ < 1000);	// Read BBP register, make sure BBP is up and running before write new data	Index = 0;	do 	{		RTUSBReadBBPRegister(pAd, BBP_R0, &Value);		DBGPRINT(RT_DEBUG_TRACE, "BBP version = %d\n", Value);	} while ((++Index < 100) && ((Value == 0xff) || (Value == 0x00)));		  	// Initialize BBP register to default value	for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)	{		RTUSBWriteBBPRegister(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);	}	// Clear raw counters	RTUSBReadMACRegister(pAd, STA_CSR0, &Counter);	RTUSBReadMACRegister(pAd, STA_CSR1, &Counter);	RTUSBReadMACRegister(pAd, STA_CSR2, &Counter);	// assert HOST ready bit	RTUSBWriteMACRegister(pAd, MAC_CSR1, 0x4);		DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitializeAsic\n");	return NDIS_STATUS_SUCCESS;}/*	========================================================================		Routine Description:		Reset NIC Asics	Arguments:		Adapter						Pointer to our adapter	Return Value:		None	Note:		Reset NIC to initial state AS IS system boot up time.			========================================================================*/VOID NICIssueReset(	IN	PRTMP_ADAPTER	pAd){}/*	========================================================================		Routine Description:		Check ASIC registers and find any reason the system might hang	Arguments:		Adapter						Pointer to our adapter	Return Value:		None		========================================================================*/BOOLEAN	NICCheckForHang(	IN	PRTMP_ADAPTER	pAd){	return (FALSE);}/*	========================================================================		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	========================================================================*/VOID NICUpdateRawCounters(	IN PRTMP_ADAPTER pAd){	ULONG	OldValue;	STA_CSR0_STRUC StaCsr0;	STA_CSR1_STRUC StaCsr1;	STA_CSR2_STRUC StaCsr2;	STA_CSR3_STRUC StaCsr3;	STA_CSR4_STRUC StaCsr4;	STA_CSR5_STRUC StaCsr5;	RTUSBReadMACRegister(pAd, STA_CSR0, &StaCsr0.word);	// Update RX PLCP error counter	pAd->PrivateInfo.PhyRxErrCnt += StaCsr0.field.PlcpErr;	// Update FCS counters

⌨️ 快捷键说明

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