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

📄 rtmp_init.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*	========================================================================		Routine Description:		Set default value from EEPROM			Arguments:		Adapter						Pointer to our adapter	Return Value:		None	IRQL = PASSIVE_LEVEL		Note:			========================================================================*/VOID	NICInitAsicFromEEPROM(	IN	PRTMP_ADAPTER	pAd){#ifdef CONFIG_STA_SUPPORT	UINT32					data = 0;	UCHAR	BBPR1 = 0; #endif // CONFIG_STA_SUPPORT //	USHORT					i;	EEPROM_ANTENNA_STRUC	Antenna;	EEPROM_NIC_CONFIG2_STRUC    NicConfig2;	UCHAR	BBPR3 = 0;		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);			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);		}	}	Antenna.word = pAd->EEPROMDefaultValue[0];	if (Antenna.word == 0xFFFF)	{		DBGPRINT(RT_DEBUG_ERROR, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));		BUG_ON(Antenna.word == 0xFFFF);	}	pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;	pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;	DBGPRINT(RT_DEBUG_WARN, ("pAd->RfIcType = %d, RealRxPath=%d, TxPath = %d\n", pAd->RfIcType, pAd->Mlme.RealRxPath,Antenna.field.TxPath));	// Save the antenna for future use	pAd->Antenna.word = Antenna.word;		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 //	// Save the antenna for future use	pAd->NicConfig2.word = NicConfig2.word;	// set default antenna as main	if (pAd->RfIcType == RFIC_3020)		AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);	//	// Send LED Setting to MCU.	//	if (pAd->LedCntl.word == 0xFF)	{		pAd->LedCntl.word = 0x01;		pAd->Led1 = 0x5555;		pAd->Led2 = 0x2221;#ifdef RT2870		pAd->Led3 = 0x5627;#endif // RT2870 //	}	AsicSendCommandToMcu(pAd, 0x52, 0xff, (UCHAR)pAd->Led1, (UCHAR)(pAd->Led1 >> 8));	AsicSendCommandToMcu(pAd, 0x53, 0xff, (UCHAR)pAd->Led2, (UCHAR)(pAd->Led2 >> 8));	AsicSendCommandToMcu(pAd, 0x54, 0xff, (UCHAR)pAd->Led3, (UCHAR)(pAd->Led3 >> 8));    pAd->LedIndicatorStregth = 0xFF;    RTMPSetSignalLED(pAd, -100);	// Force signal strength Led to be turned off, before link up#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{		// Read Hardware controlled Radio state enable bit		if (NicConfig2.field.HardwareRadioControl == 1)		{			pAd->StaCfg.bHardwareRadio = TRUE;			// Read GPIO pin2 as Hardware controlled radio state			RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);			if ((data & 0x04) == 0)			{				pAd->StaCfg.bHwRadio = FALSE;				pAd->StaCfg.bRadio = FALSE;//				RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818);				RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);			}		}		else			pAd->StaCfg.bHardwareRadio = FALSE;				if (pAd->StaCfg.bRadio == FALSE)		{			RTMPSetLED(pAd, LED_RADIO_OFF);		}		else		{			RTMPSetLED(pAd, LED_RADIO_ON);		}	}#endif // CONFIG_STA_SUPPORT //	// Turn off patching for cardbus controller	if (NicConfig2.field.CardbusAcceleration == 1)	{//		pAd->bTest1 = TRUE;	}	if (NicConfig2.field.DynamicTxAgcControl == 1)		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;	else		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;	//	// Since BBP has been progamed, to make sure BBP setting will be 	// upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND!!	//	pAd->CommonCfg.BandState = UNKNOWN_BAND;		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);	BBPR3 &= (~0x18);	if(pAd->Antenna.field.RxPath == 3)	{		BBPR3 |= (0x10);	}	else if(pAd->Antenna.field.RxPath == 2)	{		BBPR3 |= (0x8);	}	else if(pAd->Antenna.field.RxPath == 1)	{		BBPR3 |= (0x0);	}	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{		// Handle the difference when 1T		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);		if(pAd->Antenna.field.TxPath == 1)		{		BBPR1 &= (~0x18);		}		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);    		DBGPRINT(RT_DEBUG_TRACE, ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n", pAd->CommonCfg.bHardwareRadio, pAd->CommonCfg.bHardwareRadio));	}#endif // CONFIG_STA_SUPPORT //	DBGPRINT(RT_DEBUG_TRACE, ("TxPath = %d, RxPath = %d, RFIC=%d, Polar+LED mode=%x\n", pAd->Antenna.field.TxPath, pAd->Antenna.field.RxPath, pAd->RfIcType, pAd->LedCntl.word));	DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n"));}/*	========================================================================		Routine Description:		Initialize NIC hardware	Arguments:		Adapter						Pointer to our adapter	Return Value:		None	IRQL = PASSIVE_LEVEL	Note:			========================================================================*/NDIS_STATUS	NICInitializeAdapter(	IN	PRTMP_ADAPTER	pAd,	IN   BOOLEAN    bHardReset){	NDIS_STATUS     Status = NDIS_STATUS_SUCCESS;	WPDMA_GLO_CFG_STRUC	GloCfg;//	INT_MASK_CSR_STRUC		IntMask;	ULONG	i =0, j=0;	AC_TXOP_CSR0_STRUC	csr0;	DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n"));	// 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits:retry:	i = 0;	do	{		RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);		if ((GloCfg.field.TxDMABusy == 0)  && (GloCfg.field.RxDMABusy == 0))			break;				RTMPusecDelay(1000);		i++;	}while ( i<100);	DBGPRINT(RT_DEBUG_TRACE, ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word));		GloCfg.word &= 0xff0;	GloCfg.field.EnTXWriteBackDDONE =1;	RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);		// Record HW Beacon offset	pAd->BeaconOffset[0] = HW_BEACON_BASE0;	pAd->BeaconOffset[1] = HW_BEACON_BASE1;	pAd->BeaconOffset[2] = HW_BEACON_BASE2;	pAd->BeaconOffset[3] = HW_BEACON_BASE3;	pAd->BeaconOffset[4] = HW_BEACON_BASE4;	pAd->BeaconOffset[5] = HW_BEACON_BASE5;	pAd->BeaconOffset[6] = HW_BEACON_BASE6;	pAd->BeaconOffset[7] = HW_BEACON_BASE7;		//	// write all shared Ring's base address into ASIC	//	// asic simulation sequence put this ahead before loading firmware.	// pbf hardware reset	// Initialze ASIC for TX & Rx operation	if (NICInitializeAsic(pAd , bHardReset) != NDIS_STATUS_SUCCESS)	{		if (j++ == 0)		{			NICLoadFirmware(pAd);			goto retry;		}		return NDIS_STATUS_FAILURE;	}	// WMM parameter	csr0.word = 0;	RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);	if (pAd->CommonCfg.PhyMode == PHY_11B)	{		csr0.field.Ac0Txop = 192;	// AC_VI: 192*32us ~= 6ms		csr0.field.Ac1Txop = 96;	// AC_VO: 96*32us  ~= 3ms	}	else	{		csr0.field.Ac0Txop = 96;	// AC_VI: 96*32us ~= 3ms		csr0.field.Ac1Txop = 48;	// AC_VO: 48*32us ~= 1.5ms	}	RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word);	// reset action	// Load firmware	//  Status = NICLoadFirmware(pAd);	DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n"));	return Status;}/*	========================================================================		Routine Description:		Initialize ASIC	Arguments:		Adapter						Pointer to our adapter	Return Value:		None	IRQL = PASSIVE_LEVEL	Note:			========================================================================*/NDIS_STATUS	NICInitializeAsic(	IN	PRTMP_ADAPTER	pAd,	IN  BOOLEAN		bHardReset){	ULONG			Index = 0;	UCHAR			R0 = 0xff;	UINT32			MacCsr12 = 0, Counter = 0;#ifdef RT2870	UINT32			MacCsr0 = 0;	NTSTATUS		Status;	UCHAR			Value = 0xff;#endif // RT2870 //#ifdef RT30xx	UINT32			eFuseCtrl;#endif // RT30xx //	USHORT			KeyIdx;	INT				i,apidx;	DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n"));#ifdef RT2870	//	// Make sure MAC gets ready after NICLoadFirmware().	//	Index = 0;		//To avoid hang-on issue when interface up in kernel 2.4, 	//we use a local variable "MacCsr0" instead of using "pAd->MACVersion" directly.	do 	{		RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);		if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))			break;		RTMPusecDelay(10);	} while (Index++ < 100);	pAd->MACVersion = MacCsr0;	DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0  [ Ver:Rev=0x%08x]\n", pAd->MACVersion));	// turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue.	RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacCsr12);	MacCsr12 &= (~0x2000);	RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacCsr12);			RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);	RTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);	Status = RTUSBVenderReset(pAd);	RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);	// Initialize MAC register to default value	for(Index=0; Index<NUM_MAC_REG_PARMS; Index++)	{#ifdef RT3070		if ((MACRegTable[Index].Register == TX_SW_CFG0) && (IS_RT3070(pAd) || IS_RT3071(pAd)))		{			MACRegTable[Index].Value = 0x00000400;		}#endif // RT3070 //		RTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);	}#ifdef CONFIG_STA_SUPPORT	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)	{		for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)		{			RTMP_IO_WRITE32(pAd, (USHORT)STAMACRegTable[Index].Register, STAMACRegTable[Index].Value);		}	}#endif // CONFIG_STA_SUPPORT //#endif // RT2870 //#ifdef RT30xx	// Initialize RT3070 serial MAc registers which is different from RT2870 serial	if (IS_RT3090(pAd))	{		RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);				// RT3071 version E has fixed this issue		if ((pAd->MACVersion & 0xffff) < 0x0211)		{			if (pAd->NicConfig2.field.DACTestBit == 1)			{				RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x1F);	// To fix throughput drop drastically			}			else			{				RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F);	// To fix throughput drop drastically			}		}		else		{			RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);		}	}	else if (IS_RT3070(pAd))	{		RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);		RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x1F);	// To fix throughput drop drastically	}#endif // RT30xx //	//	// Before program BBP, we need to wait BBP/RF get wake up.	//	Index = 0;	do	{		RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);		if ((MacCsr12 & 0x03) == 0)	// if BB.RF is stable			break;				DBGPRINT(RT_DEBUG_TRACE, ("Check MAC_STATUS_CFG  = Busy = %x\n", MacCsr12));		RTMPusecDelay(1000);	} while (Index++ < 100);    // The commands to firmware should be after these commands, these commands will init firmware	// PCI and USB are not the same because PCI driver needs to wait for PCI bus ready	RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0);	// initialize BBP R/W access agent	RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);	RTMPusecDelay(1000);	// Read BBP register, make sure BBP is up and running before write new data	Index = 0;	do 	{		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0);		DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0));	} while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00)));	//ASSERT(Index < 20); //this will cause BSOD on Check-buil

⌨️ 快捷键说明

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