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

📄 rt_ate.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
	PCHAR pRateTab;	switch (Mode)	{		case 0:			pRateTab = CCKRateTable;			break;		case 1:			pRateTab = OFDMRateTable;			break;		case 2:		case 3:			pRateTab = HTMIXRateTable;			break;		default: 			ATEDBGPRINT(RT_DEBUG_ERROR, ("unrecognizable Tx Mode %d\n", Mode));			return -1;			break;	}	i = 0;	while (pRateTab[i] != -1)	{		if (pRateTab[i] == Mcs)			return 0;		i++;	}	return -1;}static INT ATETxPwrHandler(	IN PRTMP_ADAPTER pAd,	IN char index){	ULONG R;	CHAR TxPower;	UCHAR Bbp94 = 0;	BOOLEAN bPowerReduce = FALSE;#ifdef RALINK_28xx_QA	if ((pAd->ate.bQATxStart == TRUE) || (pAd->ate.bQARxStart == TRUE))	{		/* 			When QA is used for Tx, pAd->ate.TxPower0/1 and real tx power			are not synchronized.		*/		return 0;	}	else#endif // RALINK_28xx_QA //	{		TxPower = index == 0 ? pAd->ate.TxPower0 : pAd->ate.TxPower1;		if (pAd->ate.Channel <= 14)		{			if (TxPower > 31)			{								// R3, R4 can't large than 31 (0x24), 31 ~ 36 used by BBP 94				R = 31;				if (TxPower <= 36)					Bbp94 = BBPR94_DEFAULT + (UCHAR)(TxPower - 31);					}			else if (TxPower < 0)			{								// R3, R4 can't less than 0, -1 ~ -6 used by BBP 94				R = 0;				if (TxPower >= -6)					Bbp94 = BBPR94_DEFAULT + TxPower;			}			else			{  				// 0 ~ 31				R = (ULONG) TxPower;				Bbp94 = BBPR94_DEFAULT;			}			ATEDBGPRINT(RT_DEBUG_TRACE, ("%s (TxPower=%d, R=%ld, BBP_R94=%d)\n", __FUNCTION__, TxPower, R, Bbp94));		}		else /* 5.5 GHz */		{			if (TxPower > 15)			{								// R3, R4 can't large than 15 (0x0F)				R = 15;			}			else if (TxPower < 0)			{								// R3, R4 can't less than 0				// -1 ~ -7				ASSERT((TxPower >= -7));				R = (ULONG)(TxPower + 7);				bPowerReduce = TRUE;			}			else			{  				// 0 ~ 15				R = (ULONG) TxPower;			}			ATEDBGPRINT(RT_DEBUG_TRACE, ("%s (TxPower=%d, R=%lu)\n", __FUNCTION__, TxPower, R));		}//2008/09/10:KH adds to support 3070 ATE TX Power tunning real time<--		{		if (pAd->ate.Channel <= 14)		{			if (index == 0)			{				// shift TX power control to correct RF(R3) register bit position				R = R << 9;						R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);				pAd->LatchRfRegs.R3 = R;			}			else			{				// shift TX power control to correct RF(R4) register bit position				R = R << 6;						R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);				pAd->LatchRfRegs.R4 = R;			}		}		else /* 5.5GHz */		{			if (bPowerReduce == FALSE)			{				if (index == 0)				{					// shift TX power control to correct RF(R3) register bit position					R = (R << 10) | (1 << 9);							R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);					pAd->LatchRfRegs.R3 = R;				}				else				{					// shift TX power control to correct RF(R4) register bit position					R = (R << 7) | (1 << 6);							R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);					pAd->LatchRfRegs.R4 = R;				}			}			else			{				if (index == 0)				{					// shift TX power control to correct RF(R3) register bit position					R = (R << 10);							R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);					/* Clear bit 9 of R3 to reduce 7dB. */ 					pAd->LatchRfRegs.R3 = (R & (~(1 << 9)));				}				else				{					// shift TX power control to correct RF(R4) register bit position					R = (R << 7);							R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);					/* Clear bit 6 of R4 to reduce 7dB. */ 					pAd->LatchRfRegs.R4 = (R & (~(1 << 6)));				}			}		}		RtmpRfIoWrite(pAd);	}//2008/09/10:KH adds to support 3070 ATE TX Power tunning real time-->		return 0;	}}/*==========================================================================    Description:        Set ATE operation mode to        0. ATESTART  = Start ATE Mode        1. ATESTOP   = Stop ATE Mode        2. TXCONT    = Continuous Transmit        3. TXCARR    = Transmit Carrier        4. TXFRAME   = Transmit Frames        5. RXFRAME   = Receive Frames#ifdef RALINK_28xx_QA        6. TXSTOP    = Stop Any Type of Transmition        7. RXSTOP    = Stop Receiving Frames        #endif // RALINK_28xx_QA //    Return:        TRUE if all parameters are OK, FALSE otherwise==========================================================================*/#ifdef RTMP_MAC_USB/*======================Start of RTMP_MAC_USB ======================*/static INT	ATECmdHandler(	IN	PRTMP_ADAPTER	pAd, 	IN	PSTRING			arg){	UINT32			Value;	UCHAR			BbpData;	UINT32          MacData;	UINT			i=0, atemode, bbp_index=0;	UINT32 			temp;	ULONG			IrqFlags;	ATEDBGPRINT(RT_DEBUG_TRACE, ("===> ATECmdHandler()\n"));	ATEAsicSwitchChannel(pAd);	/* AsicLockChannel() is empty function so far in fact */	AsicLockChannel(pAd, pAd->ate.Channel);	RTMPusecDelay(5000);	// Default value in BBP R22 is 0x0.	BbpData = 0;		/* Enter ATE mode and set Tx/Rx Idle */	if (!strcmp(arg, "ATESTART")) 			{						#ifdef CONFIG_STA_SUPPORT		BOOLEAN       Cancelled;#endif // CONFIG_STA_SUPPORT //		ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: ATESTART\n"));		#if defined(LINUX) || defined(VXWORKS)		RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev);#endif // defined(LINUX) || defined(VXWORKS) //		atemode = pAd->ate.Mode;		pAd->ate.Mode = ATE_START;		// Disable Rx		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value &= ~(1 << 3);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);				// Disable auto responder		RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &temp);		temp = temp & 0xFFFFFFFE;		RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, temp);		// read MAC_SYS_CTRL and backup MAC_SYS_CTRL value		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);		// clean bit4 to stop continuous Tx production test		MacData &= 0xFFFFFFEF;				// Stop continuous TX production test.		// Disable or cancel pending irp first ???		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);        if (atemode == ATE_TXCARR)		{			/* RT35xx ATE will reuse this code segment. */			/* No Carrier Test set BBP R22 bit7=0, bit6=0, bit[5~0]=0x0 */			ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);			BbpData &= 0xFFFFFF00; //clear bit7, bit6, bit[5~0]			    ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);		}		else if (atemode == ATE_TXCARRSUPP)		{			/* RT35xx ATE will reuse this code segment. */			/* No Cont. TX set BBP R22 bit7=0 */			ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);			BbpData &= ~(1 << 7); //set bit7=0			ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);			/* No Carrier Suppression set BBP R24 bit0=0 */			ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R24, &BbpData);			BbpData &= 0xFFFFFFFE; //clear bit0			    ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, BbpData);		}				/*			We should free some resource which was allocated			when ATE_TXFRAME, ATE_STOP, and ATE_TXCONT.		*/		else if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP))		{			if (atemode == ATE_TXCONT)			{				/* Not Cont. TX anymore, so set BBP R22 bit7=0 */				ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);				BbpData &= ~(1 << 7); // set bit7=0				ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);			}			/* Abort Tx, Rx DMA. */			RtmpDmaEnable(pAd, 0);			{				/*					It seems nothing needed to be free, 					because we did not allocate any resource					when we entered ATE_TXFRAME mode latestly. 				*/			}			/* Start Tx, RX DMA */			RtmpDmaEnable(pAd, 1);		}				RTUSBRejectPendingPackets(pAd);		RTUSBCleanUpDataBulkOutQueue(pAd);#ifdef CONFIG_STA_SUPPORT		/*			It will be called in MlmeSuspend().			Cancel pending timers.		*/		RTMPCancelTimer(&pAd->MlmeAux.AssocTimer,      &Cancelled);		RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer,    &Cancelled);		RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer,   &Cancelled);		RTMPCancelTimer(&pAd->MlmeAux.AuthTimer,       &Cancelled);		RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer,     &Cancelled);		RTMPCancelTimer(&pAd->MlmeAux.ScanTimer,       &Cancelled);#endif // CONFIG_STA_SUPPORT //		/* not used in RT28xx *///		RTUSBCleanUpMLMEWaitQueue(pAd);			RTUSBCleanUpMLMEBulkOutQueue(pAd);		// Sometimes kernel will hang on, so we avoid calling MlmeSuspend().//		MlmeSuspend(pAd, TRUE);//		RTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled);		// Disable Rx		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value &= ~(1 << 3);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);		// Abort Tx, RX DMA.		RtmpDmaEnable(pAd, 0);		// Disable Tx		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value &= ~(1 << 2);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);		// Make sure there are no pending bulk in/out IRPs before we go on.		// pAd->BulkFlags != 0 : wait bulk out finish		while ((pAd->PendingRx > 0))			{			ATE_RTUSBCancelPendingBulkInIRP(pAd);			/* delay 0.5 seconds */			RTMPusecDelay(500000);			pAd->PendingRx = 0;		}		/* Why don't we have to get BulkOutLock first ? */ 		while (((pAd->BulkOutPending[0] == TRUE) ||				(pAd->BulkOutPending[1] == TRUE) || 				(pAd->BulkOutPending[2] == TRUE) ||				(pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0))// pAd->BulkFlags != 0 : wait bulk out finish			{			do 			{				/* 					pAd->BulkOutPending[y] will be set to FALSE					in RTUSBCancelPendingBulkOutIRP(pAd)				*/				RTUSBCancelPendingBulkOutIRP(pAd);			} while (FALSE);						/* 				we have enough time delay in RTUSBCancelPendingBulkOutIRP(pAd)				so this is not necessary 			*///			RTMPusecDelay(500000);		}		ASSERT(pAd->PendingRx == 0);		// reset Rx statistics.		pAd->ate.LastSNR0 = 0;		pAd->ate.LastSNR1 = 0;		pAd->ate.LastRssi0 = 0;		pAd->ate.LastRssi1 = 0;		pAd->ate.LastRssi2 = 0;		pAd->ate.AvgRssi0 = 0;		pAd->ate.AvgRssi1 = 0;		pAd->ate.AvgRssi2 = 0;		pAd->ate.AvgRssi0X8 = 0;		pAd->ate.AvgRssi1X8 = 0;		pAd->ate.AvgRssi2X8 = 0;		pAd->ate.NumOfAvgRssiSample = 0;		#ifdef RALINK_28xx_QA		// Tx frame		pAd->ate.bQATxStart = FALSE;		pAd->ate.bQARxStart = FALSE;		pAd->ate.seq = 0; 		// counters		pAd->ate.U2M = 0;		pAd->ate.OtherData = 0;		pAd->ate.Beacon = 0;		pAd->ate.OtherCount = 0;		pAd->ate.TxAc0 = 0;		pAd->ate.TxAc1 = 0;		pAd->ate.TxAc2 = 0;		pAd->ate.TxAc3 = 0;		pAd->ate.TxHCCA = 0;		pAd->ate.TxMgmt = 0;		pAd->ate.RSSI0 = 0;		pAd->ate.RSSI1 = 0;		pAd->ate.RSSI2 = 0;		pAd->ate.SNR0 = 0;		pAd->ate.SNR1 = 0;		// control		pAd->ate.TxDoneCount = 0;		// TxStatus : 0 --> task is idle, 1 --> task is running		pAd->ate.TxStatus = 0; #endif // RALINK_28xx_QA //		// Soft reset BBP.				BbpSoftReset(pAd);		#ifdef CONFIG_STA_SUPPORT 		AsicDisableSync(pAd);		/*			If we skip "LinkDown()", we should disable protection			to prevent from sending out RTS or CTS-to-self.		*/                 		ATEDisableAsicProtect(pAd);		RTMPStationStop(pAd);#endif // CONFIG_STA_SUPPORT //		// Default value in BBP R22 is 0x0.		BbpData = 0;		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);		// Clean bit4 to stop continuous Tx production test.		MacData &= 0xFFFFFFEF;	   	ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);				// Clean ATE Bulk in/out counter and continue setup		InterlockedExchange(&pAd->BulkOutRemained, 0);		/* NdisAcquireSpinLock()/NdisReleaseSpinLock() need only one argument in RT28xx */		NdisAcquireSpinLock(&pAd->GenericLock);			pAd->ContinBulkOut = FALSE;				pAd->ContinBulkIn = FALSE;		NdisReleaseSpinLock(&pAd->GenericLock);		RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);						}	else if (!strcmp(arg, "ATESTOP")) 	{								ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ATESTOP ===>\n"));		// Default value in BBP R22 is 0x0.		BbpData = 0;		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);		// Clean bit4 to stop continuous Tx production test.		MacData &= 0xFFFFFFEF;		ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);		// recover the MAC_SYS_CTRL register back.		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); 				// Disable Rx		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value &= ~(1 << 3);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);		/*			Abort Tx, RX DMA.			Q   : How to do the following I/O if Tx, Rx DMA is aborted ?			Ans : Bulk endpoints are aborted, while the control endpoint is not.		*/		RtmpDmaEnable(pAd, 0);		// Disable Tx		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value &= ~(1 << 2);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);		/* Make sure there are no pending bulk in/out IRPs before we go on. */		// pAd->BulkFlags != 0 : wait bulk out finish		while (pAd->PendingRx > 0)		{			ATE_RTUSBCancelPendingBulkInIRP(pAd);			RTMPusecDelay(500000);		}		while (((pAd->BulkOutPending[0] == TRUE) ||				(pAd->BulkOutPending[1] == TRUE) || 				(pAd->BulkOutPending[2] == TRUE) ||				(pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0))	// pAd->BulkFlags != 0 : wait bulk out finish		{			do 			{				RTUSBCancelPendingBulkOutIRP(pAd);			} while (FALSE);						RTMPusecDelay(500000);		}		ASSERT(pAd->PendingRx == 0);/*=========================================================================*//*      Reset Rx RING                                                      */ /*=========================================================================*///		InterlockedExchange(&pAd->PendingRx, 0);		pAd->PendingRx = 0;		// Next Rx Read index		pAd->NextRxBulkInReadIndex = 0;			// Rx Bulk pointer		pAd->NextRxBulkInIndex = RX_RING_SIZE - 1;			pAd->NextRxBulkInPosition = 0;		for (i = 0; i < (RX_RING_SIZE); i++)		{			PRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);			NdisZeroMemory(pRxContext->TransferBuffer, MAX_RXBULK_SIZE);			/* why don't we have to get BulkInLock first ? */			pRxContext->pAd	= pAd;			pRxContext->pIrp = NULL;			pRxContext->BulkInOffset = 0;			pRxContext->bRxHandling = FALSE;			pRxContext->InUse		= FALSE;			pRxContext->IRPPending	= FALSE;

⌨️ 快捷键说明

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