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

📄 rt_ate.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 5 页
字号:
		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);								}	else if (!strcmp(arg, "TXFRAME")) // Tx Frames	{		DBGPRINT(RT_DEBUG_TRACE, ("ATE: TXFRAME(Count=%ld)\n", pAd->ate.TxCount));		pAd->ate.Mode |= ATE_TXFRAME;		ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);		// Soft reset BBP.		BbpSoftReset(pAd);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);		// Abort Tx, RX DMA.		RtmpDmaEnable(pAd, 0);		// Fix can't smooth kick		{			RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QID_AC_BE * 0x10,  &pTxRing->TxDmaIdx);			pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx;			pTxRing->TxCpuIdx = pTxRing->TxDmaIdx;			RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * 0x10, pTxRing->TxCpuIdx);							}		pAd->ate.TxDoneCount = 0;		SetJapanFilter(pAd);				for (i = 0; (i < TX_RING_SIZE-1) && (i < pAd->ate.TxCount); i++)		{			PNDIS_PACKET pPacket;			ULONG TxIdx = pTxRing->TxCpuIdx;#ifndef BIG_ENDIAN			pTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa;#else			pDestTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa;			TxD = *pDestTxD;			pTxD = &TxD;			RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);#endif			// clean current cell.			pPacket = pTxRing->Cell[TxIdx].pNdisPacket;			if (pPacket)			{				PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE);				RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);			}			//Always assign pNdisPacket as NULL after clear			pTxRing->Cell[TxIdx].pNdisPacket = NULL;			pPacket = pTxRing->Cell[TxIdx].pNextNdisPacket;			if (pPacket)			{				PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE);				RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);			}			//Always assign pNextNdisPacket as NULL after clear			pTxRing->Cell[TxIdx].pNextNdisPacket = NULL;			if(ATE_TxDInit(pAd, TxIdx) != 0)				break;			INC_RING_INDEX(pTxRing->TxCpuIdx, TX_RING_SIZE);		}		ATE_TxDInit(pAd, pTxRing->TxCpuIdx);		// Start Tx, RX DMA.		RtmpDmaEnable(pAd, 1);		// Enable Tx		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value |= (1 << 2);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);#ifdef	RALINK_2860_QA		// add this for LoopBack mode		if (pAd->ate.bQARxStart == FALSE)  		{			// Disable Rx			RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);			Value &= ~(1 << 3);			RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);		}		if (pAd->ate.bQATxStart == TRUE)  		{			pAd->ate.TxStatus = 1;			//pAd->ate.Repeat = 0;		}#else		// Disable Rx		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value &= ~(1 << 3);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);#endif	// RALINK_2860_QA //		RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QID_AC_BE * RINGREG_DIFF, &pAd->TxRing[QID_AC_BE].TxDmaIdx);		// kick Tx-Ring.		RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * RINGREG_DIFF, pAd->TxRing[QID_AC_BE].TxCpuIdx);		pAd->RalinkCounters.KickTxCount++;	}	else if (!strcmp(arg, "RXFRAME")) // Rx Frames	{		DBGPRINT(RT_DEBUG_TRACE, ("ATE: RXFRAME\n"));		ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);		pAd->ate.Mode |= ATE_RXFRAME;		// abort all TX rings(Disable Tx)		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value &= ~(1 << 2);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);		// enable RX of MAC block		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value |= (1 << 3);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);	}	else	{			DBGPRINT(RT_DEBUG_TRACE, ("ATE: Invalid arg!\n"));		return FALSE;	}	RTMPusecDelay(5000);	return TRUE;}INT	Set_ATE_Proc(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			arg){	DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_Proc Success\n"));	return (set_ate_proc_inline(pAd, arg));}/*     ==========================================================================    Description:        Set ATE ADDR1=DA for TxFrame            Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_DA_Proc(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			arg){	CHAR				*value;	INT					i;		if(strlen(arg) != 17)  //Mac address acceptable format 01:02:03:04:05:06 length 17		return FALSE;    for (i=0, value = rstrtok(arg, ":"); value; value = rstrtok(NULL, ":")) 	{		if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) 			return FALSE;  //Invalid		AtoH(value, &pAd->ate.Addr1[i++], 1);	}	if(i != 6)		return FALSE;  //Invalid			DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_DA_Proc (DA = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr1[0],		pAd->ate.Addr1[1], pAd->ate.Addr1[2], pAd->ate.Addr1[3], pAd->ate.Addr1[4], pAd->ate.Addr1[5]));	DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_DA_Proc Success\n"));		return TRUE;}/*     ==========================================================================    Description:        Set ATE ADDR2=SA for TxFrame            Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_SA_Proc(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			arg){	CHAR				*value;	INT					i;		if(strlen(arg) != 17)  //Mac address acceptable format 01:02:03:04:05:06 length 17		return FALSE;    for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":")) 	{		if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) 			return FALSE;  //Invalid		AtoH(value, &pAd->ate.Addr2[i++], 2);	}	if(i != 6)		return FALSE;  //Invalid	DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_SA_Proc (DA = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr2[0],		pAd->ate.Addr2[1], pAd->ate.Addr2[2], pAd->ate.Addr2[3], pAd->ate.Addr2[4], pAd->ate.Addr2[5]));	DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_SA_Proc Success\n"));		return TRUE;}/*     ==========================================================================    Description:        Set ATE ADDR3=BSSID for TxFrame    Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_BSSID_Proc(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			arg){	CHAR				*value;	INT					i;		if(strlen(arg) != 17)  //Mac address acceptable format 01:02:03:04:05:06 length 17		return FALSE;    for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":")) 	{		if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) 			return FALSE;  //Invalid		AtoH(value, &pAd->ate.Addr3[i++], 2);	}	if(i != 6)		return FALSE;  //Invalid	DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_BSSID_Proc (DA = %2X:%2X:%2X:%2X:%2X:%2X)\n",	pAd->ate.Addr3[0],		pAd->ate.Addr3[1], pAd->ate.Addr3[2], pAd->ate.Addr3[3], pAd->ate.Addr3[4], pAd->ate.Addr3[5]));	DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_BSSID_Proc Success\n"));		return TRUE;}/*     ==========================================================================    Description:        Set ATE Tx Length    Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_CHANNEL_Proc(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			arg){	UCHAR channel;	channel = simple_strtol(arg, 0, 10);	if((channel < 1) || (channel > 14))// to allow A band channel	{		DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_CHANNEL_Proc::Out of range, it should be in range of 1~14.\n"));		return FALSE;	}	pAd->ate.Channel = channel;	DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_CHANNEL_Proc (ATE Channel = %d)\n", pAd->ate.Channel));	DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_CHANNEL_Proc Success\n"));		return TRUE;}/*     ==========================================================================    Description:        Set ATE Tx Power0            Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_TX_POWER0_Proc(	IN	PRTMP_ADAPTER	pAd,	IN	PUCHAR			arg){	CHAR TxPower;		TxPower = simple_strtol(arg, 0, 10);	if ((TxPower > 31) || (TxPower < 0))	{		DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER0_Proc::Out of range (Value=%d)\n", TxPower));		return FALSE;	}	pAd->ate.TxPower0 = TxPower;	ATE_TxPwrHandler(pAd, 0);	DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_POWER0_Proc Success\n"));		return TRUE;}/*     ==========================================================================    Description:        Set ATE Tx Power1            Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_TX_POWER1_Proc(	IN	PRTMP_ADAPTER	pAd,	IN	PUCHAR			arg){	CHAR TxPower;		TxPower = simple_strtol(arg, 0, 10);	if ((TxPower > 31) || (TxPower < 0))	{		DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER1_Proc::Out of range (Value=%d)\n", TxPower));		return FALSE;	}	pAd->ate.TxPower1 = TxPower;	ATE_TxPwrHandler(pAd, 1);	DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_POWER1_Proc Success\n"));		return TRUE;}/*     ==========================================================================    Description:        Set ATE Tx Antenna            Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_TX_Antenna_Proc(	IN	PRTMP_ADAPTER	pAd,	IN	PUCHAR			arg){	CHAR value;		value = simple_strtol(arg, 0, 10);	if ((value > 2) || (value < 0))	{		DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_Antenna_Proc::Out of range (Value=%d)\n", value));		return FALSE;	}	pAd->ate.TxAntennaSel = value;	DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_Antenna_Proc (Antenna = %d)\n", pAd->ate.TxAntennaSel));	DBGPRINT(RT_DEBUG_TRACE,("Ralink: Set_ATE_TX_Antenna_Proc Success\n"));		return TRUE;}/*     ==========================================================================    Description:        Set ATE Rx Antenna            Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_RX_Antenna_Proc(	IN	PRTMP_ADAPTER	pAd,	IN	PUCHAR			arg){	CHAR value;		value = simple_strtol(arg, 0, 10);	if ((value > 3) || (value < 0))	{		DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_RX_Antenna_Proc::Out of range (Value=%d)\n", value));		return FALSE;	}	pAd->ate.RxAntennaSel = value;	DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_RX_Antenna_Proc (Antenna = %d)\n", pAd->ate.RxAntennaSel));	DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_RX_Antenna_Proc Success\n"));		return TRUE;}/*     ==========================================================================    Description:        Set ATE RF frequence offset            Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_TX_FREQOFFSET_Proc(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			arg){	UCHAR RFFreqOffset;	ULONG R4;		RFFreqOffset = simple_strtol(arg, 0, 10);	if(RFFreqOffset >= 64)	{		DBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_FREQOFFSET_Proc::Out of range, it should be in range of 0~63.\n"));		return FALSE;	}	pAd->ate.RFFreqOffset = RFFreqOffset;	R4 = pAd->ate.RFFreqOffset << 15;		// shift TX power control to correct RF register bit position	R4 |= (pAd->LatchRfRegs.R4 & ((~0x001f8000)));	pAd->LatchRfRegs.R4 = R4;		RtmpRfIoWrite(pAd);	DBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_FREQOFFSET_Proc (RFFreqOffset = %ld)\n", pAd->ate.RFFreqOffset));	DBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_FREQOFFSET_Proc Success\n"));		return TRUE;}/*     ==========================================================================    Description:        Set ATE RF BW            Return:        TRUE if all parameters are OK, FALSE otherwise    ==========================================================================*/INT	Set_ATE_TX_BW_Proc(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			arg){	int i;	UCHAR value = 0;	UCHAR BBPCurrentBW;		BBPCurrentBW = simple_strtol(arg, 0, 10);	if(BBPCurrentBW == 0)		pAd->ate.TxWI.BW = BW_40;	else		pAd->ate.TxWI.BW = BW_40; 	if(pAd->ate.TxWI.BW == BW_40)	{ 		for (i=0; i<5; i++) 		{ 			if (pAd->TxPwrCfg[i] != 0xffffffff) 			{ 				RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->TxPwrCfg[i]);	 				RTMPusecDelay(5000);				 			} 		} 		//Set BBP R4 bit[4:3]=0:0 		ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value); 		value &= (~0x18); 		ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);   		//Set BBP R66=0x3C 		value = 0x3C;//(original is 0x30)

⌨️ 快捷键说明

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