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

📄 rtusb_init.c

📁 台湾RALink公司的 rt2570无线 802.11g 网卡的 驱动的源代码 ,支持linux2.4以上的 内河
💻 C
📖 第 1 页 / 共 5 页
字号:
	if ((pAdapter->EEPROMBBPTuningParameters[6] != 0xffff) && (pAdapter->EEPROMBBPTuningParameters[6] != 0))
	{
		pAdapter->BBPTuningParameters.RSSIToDbmOffset = (UCHAR)(pAdapter->EEPROMBBPTuningParameters[6] & 0xff);
		DBGPRINT_RAW(RT_DEBUG_INFO, "RSSIToDbmOffset = 0x%x\n", pAdapter->BBPTuningParameters.RSSIToDbmOffset);
	}

	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	PRT2570ADAPTER	pAdapter)
{
	USHORT					i, value;
	USHORT	Value5, Value6;
	UCHAR					TxValue,RxValue;
	EEPROM_ANTENNA_STRUC	Antenna;
	EEPROM_NIC_CONFIG2_STRUC	NicConfig2;

	DBGPRINT(RT_DEBUG_TRACE,"--> NICInitAsicFromEEPROM\n");

	//Initialize BBP registers.
	for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++)
	{
		value = pAdapter->EEPROMDefaultValue[i];
		
		if((value != 0xFFFF) && (value != 0))
		{
			//blue,RTUSBWriteMACRegister(pAdapter, PHY_CSR7, value);
			USHORT	id;
			id = ((value & 0xff00) >> 8);
			{
				USHORT	temp;
				UINT	j = 0;
				do
				{
					RTUSBReadMACRegister(pAdapter, PHY_CSR8, &temp);
					if (!(temp & BUSY))
						break;
					j++;
				}
				while (j < RETRY_LIMIT);
				
				RTUSBWriteMACRegister(pAdapter, PHY_CSR7, value);
			}
				
		}
	}

	DBGPRINT(RT_DEBUG_INFO,"pAdapter->BBPTuningParameters.R24LowerValue = %x\n", pAdapter->BBPTuningParameters.R24LowerValue);
	DBGPRINT(RT_DEBUG_INFO, "pAdapter->BBPTuningParameters.R25LowerValue = %x\n", pAdapter->BBPTuningParameters.R25LowerValue);
	DBGPRINT(RT_DEBUG_INFO, "pAdapter->BBPTuningParameters.R61LowerValue = %x\n", pAdapter->BBPTuningParameters.R61LowerValue);
	RTUSBWriteBBPRegister(pAdapter, 24, pAdapter->BBPTuningParameters.R24LowerValue);
	RTUSBWriteBBPRegister(pAdapter, 25, pAdapter->BBPTuningParameters.R25LowerValue);
	RTUSBWriteBBPRegister(pAdapter, 61, pAdapter->BBPTuningParameters.R61LowerValue);


	//Select antennas.
	Antenna.word = pAdapter->EEPROMDefaultValue[0];

	if ((Antenna.word == 0xFFFF) || (Antenna.field.TxDefaultAntenna > 2) || (Antenna.field.RxDefaultAntenna > 2))
	{
		DBGPRINT(RT_DEBUG_ERROR,"E2PROM error(=0x%04x), hard code as 0x0002\n", Antenna.word);
		Antenna.word = 0x0002;
	}

	DBGPRINT(RT_DEBUG_TRACE,"Antenna.word = 0x%x \n", Antenna.word);
	pAdapter->PortCfg.NumberOfAntenna = 2;	// (UCHAR)Antenna.field.NumOfAntenna;
	pAdapter->PortCfg.CurrentTxAntenna = (UCHAR)Antenna.field.TxDefaultAntenna;
	pAdapter->PortCfg.CurrentRxAntenna = (UCHAR)Antenna.field.RxDefaultAntenna;
	   pAdapter->PortCfg.RfType = (UCHAR) Antenna.field.RfType;//blue
	DBGPRINT(RT_DEBUG_TRACE,"pAdapter->PortCfg.RfType = 0x%x \n", pAdapter->PortCfg.RfType);
	RTUSBReadBBPRegister(pAdapter, BBP_Tx_Configure, &TxValue);
	RTUSBReadBBPRegister(pAdapter, BBP_Rx_Configure, &RxValue);
	RTUSBReadMACRegister(pAdapter, PHY_CSR5, &Value5);
	RTUSBReadMACRegister(pAdapter, PHY_CSR6, &Value6);

	// Tx antenna select
	if(Antenna.field.TxDefaultAntenna == 1)   
	{
		TxValue = (TxValue & 0xFC) | 0x00; // Antenna A
		Value5 = (Value5 & 0xFFFC) | 0x0000;
		Value6 = (Value6 & 0xFFFC) | 0x0000;
	}
	else if(Antenna.field.TxDefaultAntenna == 2)  
	{
		TxValue = (TxValue & 0xFC) | 0x02; // Antenna B
		Value5 = (Value5 & 0xFFFC) | 0x0002;
		Value6 = (Value6 & 0xFFFC) | 0x0002;
	}
	else
	{
		TxValue = (TxValue & 0xFC) | 0x01; // Antenna Diversity
		Value5 = (Value5 & 0xFFFC) | 0x0001;
		Value6 = (Value6 & 0xFFFC) | 0x0001;
	}


	// Rx antenna select
	if(Antenna.field.RxDefaultAntenna == 1)
		RxValue = (RxValue & 0xFC) | 0x00; // Antenna A
	else if(Antenna.field.RxDefaultAntenna == 2)
		RxValue = (RxValue & 0xFC) | 0x02; // Antenna B
	else
		RxValue = (RxValue & 0xFC) | 0x01; // Antenna Diversity


	DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitAsicFromEEPROM pAdapter->PortCfg.RfType = %d\n", pAdapter->PortCfg.RfType);
	// RT5222 needs special treatment to swap TX I/Q
	if (pAdapter->PortCfg.RfType == RFIC_5222)
	{
		Value5 |= 0x0004;
		Value6 |= 0x0004;
		TxValue |= 0x04;		 // TX I/Q flip
	}
	// RT2525E need to flip TX I/Q but not RX I/Q
	else if (pAdapter->PortCfg.RfType == RFIC_2525E)	
	{
		Value5 |= 0x0004;
		Value6 |= 0x0004;
		TxValue |= 0x04;		 // TX I/Q flip
		RxValue &= 0xfb;		 // RX I/Q no flip
	}
	
	RTUSBWriteMACRegister(pAdapter, PHY_CSR5, Value5);
	RTUSBWriteMACRegister(pAdapter, PHY_CSR6, Value6);
			
	// Change to match microsoft definition, 0xff: diversity, 0: A, 1: B
	pAdapter->PortCfg.CurrentTxAntenna--;
	pAdapter->PortCfg.CurrentRxAntenna--;

	RTUSBWriteBBPRegister(pAdapter, BBP_Tx_Configure, TxValue);
	RTUSBWriteBBPRegister(pAdapter, BBP_Rx_Configure, RxValue);

	
	//Set LED mode.
	if (Antenna.field.LedMode == LED_MODE_TXRX_ACTIVITY)
		pAdapter->PortCfg.LedMode = LED_MODE_TXRX_ACTIVITY;
	else if (Antenna.field.LedMode == LED_MODE_SINGLE)
	{
		pAdapter->PortCfg.LedMode = LED_MODE_SINGLE;
		ASIC_LED_ACT_ON(pAdapter);
	}
	else if (Antenna.field.LedMode == LED_MODE_ASUS)
	{
		pAdapter->PortCfg.LedMode = LED_MODE_ASUS;
		RTUSBWriteMACRegister(pAdapter, MAC_CSR20, 0x0002);
	}
	else if (Antenna.field.LedMode == LED_MODE_ALPHA)
	{
		pAdapter->PortCfg.LedMode = LED_MODE_ALPHA;
		RTUSBWriteMACRegister(pAdapter, MAC_CSR20, 1);
		pAdapter->PortCfg.LedCntl.fOdd = FALSE;
	}	 
	else
		pAdapter->PortCfg.LedMode = LED_MODE_DEFAULT;


	// Read Hardware controlled Radio state enable bit
	if (Antenna.field.HardwareRadioControl == 1)
	{
		pAdapter->PortCfg.bHardwareRadio = TRUE;
		RTUSBWriteMACRegister(pAdapter, MAC_CSR19, 0);

		// Read GPIO pin0 as Hardware controlled radio state
		RTUSBReadMACRegister(pAdapter, MAC_CSR19, &value);
		if ((value & 0x80) == 0)
		{
			pAdapter->PortCfg.bHwRadio = FALSE;
			pAdapter->PortCfg.bRadio = FALSE;
			RTUSBWriteMACRegister(pAdapter, MAC_CSR13, 0);
			RTUSBWriteMACRegister(pAdapter, MAC_CSR14, 0);
			RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF);
        	DBGPRINT(RT_DEBUG_ERROR, "2Set fRTMP_ADAPTER_RADIO_OFF ");
			if (pAdapter->PortCfg.LedMode == LED_MODE_ASUS)
			{
				// Turn bit 17 for Radio OFF
				RTUSBWriteMACRegister(pAdapter, MAC_CSR20, 1);
			}
		}
	}
	else
		pAdapter->PortCfg.bHardwareRadio = FALSE;		
	
	NicConfig2.word = pAdapter->EEPROMDefaultValue[1];
	if (NicConfig2.word == 0xffff)
		NicConfig2.word = 0;	// empty E2PROM, use default
	
	// for dynamic BBP R17:RX sensibility tuning
	{
		UCHAR r17;
		RTUSBReadBBPRegister(pAdapter, 17, &r17);
		pAdapter->PortCfg.BbpTuningEnable = (NicConfig2.field.DynamicBbpTuning==0)? 1:0;
		pAdapter->PortCfg.VgcLowerBound   = r17;

		// 2004-3-4 per David's request, R7 starts at upper bound
		r17 = pAdapter->PortCfg.BbpTuning.VgcUpperBound;
		pAdapter->PortCfg.LastR17Value = r17;
		RTUSBWriteBBPRegister(pAdapter, 17, r17);

		// 2004-2-2 per David's request, lower R17 low-bound for very good quality NIC
		pAdapter->PortCfg.VgcLowerBound -= 6;  
		DBGPRINT(RT_DEBUG_TRACE,"R17 tuning enable=%d, R17=0x%02x, range=<0x%02x, 0x%02x>\n",
			pAdapter->PortCfg.BbpTuningEnable, r17, pAdapter->PortCfg.VgcLowerBound, pAdapter->PortCfg.BbpTuning.VgcUpperBound);
	}

	    AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel);
	DBGPRINT(RT_DEBUG_TRACE,"RF IC=%d, LED mode=%d\n", pAdapter->PortCfg.RfType, pAdapter->PortCfg.LedMode);

	DBGPRINT(RT_DEBUG_TRACE,"<-- NICInitAsicFromEEPROM\n");
}

VOID	RT2570InitializeAsic(
	IN	PRT2570ADAPTER	pAdapter)
{
	ULONG			Index;
	UCHAR			buffer[22];
	USHORT			temp;
	UCHAR			Value = 0xff;
	UINT			i;

	DBGPRINT(RT_DEBUG_TRACE, "--> NICInitializeAsic\n");

	do
	{
		//NdisMSleep(1000);
		RTUSB_VendorRequest(pAdapter,
			0,
			DEVICE_VENDOR_REQUEST_OUT,
			0x1,
			0x4,
			0x1,
			NULL,
			0);

		RTUSBSingleWrite(pAdapter, 0x308, 0xf0);//asked by MAX

		// Disable RX at first beginning. Before BulkInReceive, we will enable RX.
		RTUSBWriteMACRegister(pAdapter, TXRX_CSR2, 1);
		RTUSBWriteMACRegister(pAdapter, MAC_CSR13, 0x1111);//requested by Jerry
		RTUSBWriteMACRegister(pAdapter, MAC_CSR14, 0x1E11);
		RTUSBWriteMACRegister(pAdapter, MAC_CSR1, 3); // reset MAC state machine, requested by Kevin 2003-2-11
		RTUSBWriteMACRegister(pAdapter, MAC_CSR1, 0); // reset MAC state machine, requested by Kevin 2003-2-11
		RTUSBWriteMACRegister(pAdapter, TXRX_CSR5, 0x8C8D);
		RTUSBWriteMACRegister(pAdapter, TXRX_CSR6, 0x8B8A);
		RTUSBWriteMACRegister(pAdapter, TXRX_CSR7, 0x8687);
		RTUSBWriteMACRegister(pAdapter, TXRX_CSR8, 0x0085);
		RTUSBWriteMACRegister(pAdapter, TXRX_CSR21, 0xe78f);
		RTUSBWriteMACRegister(pAdapter, MAC_CSR9, 0xFF1D);

		i = 0;
		RTUSBReadMACRegister(pAdapter, MAC_CSR17, &temp);
		while (((temp & 0x01e0 ) != 0x01e0) && (i < 50))
		{
			NdisMSleep(1000);
			RTUSBReadMACRegister(pAdapter, MAC_CSR17, &temp);

			i++;
		}
		if (i == 50)
		{
			if (RTUSB_ResetDevice(pAdapter) == FALSE)
			{
			//RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
				DBGPRINT(RT_DEBUG_TRACE, "<== NICInitializeAsic ERROR\n");
			return;
			}
			else
				continue;
		}
	
		RTUSBWriteMACRegister(pAdapter, MAC_CSR1, 4);
		RTUSBReadMACRegister(pAdapter, MAC_CSR0, &temp);
		if ( temp >= 3){
		   RTUSBReadMACRegister(pAdapter, PHY_CSR2, &temp);
		   RTUSBWriteMACRegister(pAdapter, PHY_CSR2, temp & 0xFFFD);		   
		}
		else
		{
			DBGPRINT(RT_DEBUG_TRACE, "LNA 3 mode\n");
			RTUSBWriteMACRegister(pAdapter, PHY_CSR2, 0x3002); // LNA 3 mode

		}
		RTUSBWriteMACRegister(pAdapter, MAC_CSR11, 2);
		RTUSBWriteMACRegister(pAdapter, MAC_CSR22, 0x53);
		RTUSBWriteMACRegister(pAdapter, MAC_CSR15, 0x01ee);
		RTUSBWriteMACRegister(pAdapter, MAC_CSR16, 0);
		RTUSBWriteMACRegister(pAdapter, MAC_CSR8, 0x0780);//steven:limit the maximum frame length
		
		RTUSBReadMACRegister(pAdapter, TXRX_CSR0, &temp);
		temp &= 0xe007;
		temp |= ((LENGTH_802_11 << 3) | (0x000f << 9));
		RTUSBWriteMACRegister(pAdapter, TXRX_CSR0, temp);
		
		RTUSBWriteMACRegister(pAdapter, TXRX_CSR19, 0);
		RTUSBWriteMACRegister(pAdapter, MAC_CSR18, 0x5a);

		//set RF_LE to low when standby
		RTUSBReadMACRegister(pAdapter, PHY_CSR4, &temp);
		RTUSBWriteMACRegister(pAdapter, PHY_CSR4, temp | 1);
		//NdisMSleep(1);//wait for PLL to become stable

		i = 0;
		do
		{
			RTUSBReadBBPRegister(pAdapter, BBP_Version, &Value);
			DBGPRINT(RT_DEBUG_TRACE, "Read BBP_Version Value = %d\n", Value);
			i++;
		}while (((Value == 0xff) || (Value == 0x00)) && (i < 50));
		if (i < 50)//BBP ready
		{
			break;
		}
		else
		{
			if ( RTUSB_ResetDevice(pAdapter) == FALSE)
			{
				RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
				return;
			}
		}
	}while (1);

	// Initialize BBP register to default value
	for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++)
	{
		i = 0;
		do
		{
			RTUSBReadMACRegister(pAdapter, PHY_CSR8, &temp);
			if (!(temp & BUSY))
				break;
			i++;
		}
		while (i < RETRY_LIMIT);
		
		RTUSBWriteMACRegister(pAdapter, PHY_CSR7, BBPRegTable[Index]);
	}


	// Initialize RF register to default value
	AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel);
	AsicLockChannel(pAdapter, pAdapter->PortCfg.Channel);

	// Add radio off control
	if (pAdapter->PortCfg.bRadio == FALSE)
	{
		RTUSBWriteMACRegister(pAdapter, MAC_CSR13, 0);
		RTUSBWriteMACRegister(pAdapter, MAC_CSR14, 0);

		RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF);
        	DBGPRINT(RT_DEBUG_ERROR, "1Set fRTMP_ADAPTER_RADIO_OFF ");
	}


	RTUSBMultiRead(pAdapter, STA_CSR0, buffer, 22);
	
	DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitializeAsic\n");
}
/*
	========================================================================
	
	Routine Description:
		Reset NIC from error

	Arguments:
		Adapter						Pointer to our adapter

	Return Value:
		None

	IRQL = PASSIVE_LEVEL

	Note:
		Reset NIC from error state
		
	========================================================================
*/
VOID	NICResetFromError(
	IN	PRT2570ADAPTER	pAdapter)
{

	RT2570InitializeAsic(pAdapter);
#ifdef	INIT_FROM_EEPROM
	NICInitAsicFromEEPROM(pAdapter);
#endif
	RTUSBWriteHWMACAddress(pAdapter);
	
	// Switch to current channel, since during reset process, the connection should remains on.	
	AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel);
	AsicLockChannel(pAdapter, pAdapter->PortCfg.Channel);
}
/*
	========================================================================
	
	Routine Description:
		Compare two memory block

	Arguments:
		Adapter						Pointer to our adapter

	Return Value:

⌨️ 快捷键说明

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