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

📄 rt_ate.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);		pAd->LatchRfRegs.R4 = R;	}		}		else		{			if (index == 0)			{				R = (R << 10) | (1 << 9);		// shift TX power control to correct RF(R3) register bit position				R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);				pAd->LatchRfRegs.R3 = R;			}			else			{				R = (R << 7) | (1 << 6);		// shift TX power control to correct RF(R4) register bit position				R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);				pAd->LatchRfRegs.R4 = R;			}		}	RtmpRfIoWrite(pAd);	return 0;	}}#endif // 1 ///*    ==========================================================================    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    ==========================================================================*//*                                                           *//*                                                           *//*=======================End of RT2860=======================*//*======================Start of RT2870======================*//*                                                           *//*                                                           */#ifdef RT2870static INT	ATECmdHandler(	IN	PRTMP_ADAPTER	pAd, 	IN	PUCHAR			arg){	UINT32			Value;	UCHAR			BbpData;	UINT32          MacData;	UINT			i=0, atemode;	//NDIS_STATUS		Status = NDIS_STATUS_SUCCESS;	//PUCHAR			pDest;	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"));				netif_stop_queue(pAd->net_dev);				atemode = pAd->ate.Mode;		pAd->ate.Mode = ATE_START;//		pAd->ate.TxDoneCount = pAd->ate.TxCount;		// 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.		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);//disable or cancel pending irp first ???        if (atemode & ATE_TXCARR#ifdef RT30xx || atemode & ATE_TXCONT#endif // RT30xx //)		{#ifdef RT30xx			//Hardware Reset BBP			RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp);			temp = temp |0x00000002;			RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp);			RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp);			temp = temp & ~(0x00000002);			RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp);			//Restore All BBP Value			for(i=0;i<ATE_BBP_REG_NUM;i++)			ATE_BBP_IO_WRITE8_BY_REG_ID(pAd,i,restore_BBP[i]);#endif // RT30xx //			// 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)		{#ifdef RT30xx			//Hardware Reset BBP			RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp);			temp = temp |0x00000002;			RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp);			RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp);			temp = temp & ~(0x00000002);			RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp);			//Restore All BBP Value			for(i=0;i<ATE_BBP_REG_NUM;i++)			ATE_BBP_IO_WRITE8_BY_REG_ID(pAd,i,restore_BBP[i]);#endif // RT30xx //			// 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 allocate when ATE_TXFRAME , ATE_STOP, and ATE_TXCONT.		// TODO:Should we free some resource which was allocated when LoopBack and ATE_STOP ?		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 to free, 				// because we didn't 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 //		//RTUSBCleanUpMLMEWaitQueue(pAd);	/* not used in RT28xx */		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->PendingRx is not of type atomic_t anymore in 28xx *///		while ((atomic_read(&pAd->PendingRx) > 0))	//pAd->BulkFlags != 0 wait bulk out finish		while ((pAd->PendingRx > 0))	//pAd->BulkFlags != 0 wait bulk out finish		{#if 1			ATE_RTUSBCancelPendingBulkInIRP(pAd);#else			NdisInterlockedDecrement(&pAd->PendingRx);#endif			/* delay 0.5 seconds */			RTMPusecDelay(500000);			pAd->PendingRx = 0;		}		/* peter : 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);		}		/* pAd->PendingRx is not of type atomic_t anymore in 28xx *///		ASSERT(atomic_read(&pAd->PendingRx) == 0);		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;		pAd->ate.TxStatus = 0; // task Tx status // 0 --> task is idle, 1 --> task is running#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);//0820		// 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); // recover the MAC_SYS_CTRL register back.				// 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. *//*=========================================================================*///		while ((atomic_read(&pAd->PendingRx) > 0))	//pAd->BulkFlags != 0 wait bulk out finish		while (pAd->PendingRx > 0)		{#if 1			ATE_RTUSBCancelPendingBulkInIRP(pAd);#else//			NdisInterlockedDecrement(&pAd->PendingRx);			pAd->PendingRx--;#endif			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(atomic_read(&pAd->PendingRx) == 0);		ASSERT(pAd->PendingRx == 0);/*=========================================================================*//*      Reset Rx RING                                                      */ /*=========================================================================*///		InterlockedExchange(&pAd->PendingRx, 0);		pAd->PendingRx = 0;		pAd->NextRxBulkInReadIndex = 0;	// Next Rx Read index		pAd->NextRxBulkInIndex = RX_RING_SIZE - 1;	// Rx Bulk pointer		pAd->NextRxBulkInPosition = 0;		for (i = 0; i < (RX_RING_SIZE); i++)		{			PRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);			NdisZeroMemory(pRxContext->TransferBuffer, MAX_RXBULK_SIZE);			/* peter : why don't we have to get BulkInLock first ? */			pRxContext->pAd	= pAd;			pRxContext->pIrp = NULL;            /* peter debug ++ */			pRxContext->BulkInOffset = 0;			pRxContext->bRxHandling = FALSE;            /* peter debug -- */			pRxContext->InUse		= FALSE;			pRxContext->IRPPending	= FALSE;			pRxContext->Readable	= FALSE;//			pRxContext->ReorderInUse = FALSE;//			pRxContext->ReadPosOffset = 0;		}/*=========================================================================*//*      Reset Tx RING                                                      */ /*=========================================================================*/		do 		{			RTUSBCancelPendingBulkOutIRP(pAd);		} while (FALSE);/*=========================================================================*/		// Enable auto responder.		RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &temp);		temp = temp | (0x01);		RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, temp);/*================================================*/		AsicEnableBssSync(pAd);		/* Soft reset BBP.*/		/* In 2870 chipset, ATE_BBP_IO_READ8_BY_REG_ID() == RTMP_BBP_IO_READ8_BY_REG_ID() */		/* Both rt2870ap and rt2870sta use BbpSoftReset(pAd) to do BBP soft reset */		BbpSoftReset(pAd);/*================================================*/		{#ifdef CONFIG_STA_SUPPORT			// Set all state machines back IDLE			pAd->Mlme.CntlMachine.CurrState    = CNTL_IDLE;			pAd->Mlme.AssocMachine.CurrState   = ASSOC_IDLE;			pAd->Mlme.AuthMachine.CurrState    = AUTH_REQ_IDLE;			pAd->Mlme.AuthRspMachine.CurrState = AUTH_RSP_IDLE;			pAd->Mlme.SyncMachine.CurrState    = SYNC_IDLE;			pAd->Mlme.ActMachine.CurrState    = ACT_IDLE;#endif // CONFIG_STA_SUPPORT //			//			// ===> refer to MlmeRestartStateMachine().			// When we entered ATE_START mode, PeriodicTimer was not cancelled.			// So we don't have to set it here.			//			//RTMPSetTimer(pAd, &pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV);						ASSERT(pAd->CommonCfg.Channel != 0);						AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);			AsicLockChannel(pAd, pAd->CommonCfg.Channel);#ifdef CONFIG_STA_SUPPORT 		    RTMPStationStart(pAd);#endif // CONFIG_STA_SUPPORT //		}	//// These two steps have been done when entering ATE_STOP mode.//		// Clean ATE Bulk in/out counter and continue setup.		InterlockedExchange(&pAd->BulkOutRemained, 0);						NdisAcquireSpinLock(&pAd->GenericLock);		pAd->ContinBulkOut = FALSE;				pAd->ContinBulkIn = FALSE;		NdisReleaseSpinLock(&pAd->GenericLock);				/* Wait 50ms to prevent next URB to bulkout during HW reset. */		/* todo : remove this if not necessary */		NdisMSleep(50000);		pAd->ate.Mode = ATE_STOP;		// Enable Tx		RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);		Value |= (1 << 2);		RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);/*=========================================================================*/		/* restore RX_FILTR_CFG */#ifdef CONFIG_STA_SUPPORT 		/* restore RX_FILTR_CFG in order that QA maybe set it to 0x3 */		RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL);#endif // CONFIG_STA_SUPPORT ///*=========================================================================*/		// Enable Tx, RX DMA.		RtmpDmaEnable(pAd, 1);		// Enable Rx

⌨️ 快捷键说明

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