rtusb_bulk.c

来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 1,383 行 · 第 1/3 页

C
1,383
字号
			Return Value:		TRUE			found matched tuple cache		FALSE			no matched found	Note:		========================================================================*/#define fRTMP_ADAPTER_NEED_STOP_RX		\		(fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS |	\		 fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_RESET_IN_PROGRESS | \		 fRTMP_ADAPTER_REMOVE_IN_PROGRESS | fRTMP_ADAPTER_BULKIN_RESET)		 #define fRTMP_ADAPTER_NEED_STOP_HANDLE_RX	\		(fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS |	\		 fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_RESET_IN_PROGRESS | \		 fRTMP_ADAPTER_REMOVE_IN_PROGRESS)		 VOID	RTUSBBulkReceive(	IN	PRTMP_ADAPTER	pAd){	PRX_CONTEXT		pRxContext;	unsigned long	IrqFlags;		/* sanity check */	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_HANDLE_RX))		return;			while(1)	{			RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);		pRxContext = &(pAd->RxContext[pAd->NextRxBulkInReadIndex]);		if (((pRxContext->InUse == FALSE) && (pRxContext->Readable == TRUE)) &&			(pRxContext->bRxHandling == FALSE))		{			pRxContext->bRxHandling = TRUE;			RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);			// read RxContext, Since not #ifdef CONFIG_STA_SUPPORT			IF_DEV_CONFIG_OPMODE_ON_STA(pAd)				STARxDoneInterruptHandle(pAd, TRUE);#endif // CONFIG_STA_SUPPORT //			// Finish to handle this bulkIn buffer.			RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);			pRxContext->BulkInOffset = 0;			pRxContext->Readable = FALSE;			pRxContext->bRxHandling = FALSE;			pAd->ReadPosition = 0;			pAd->TransferBufferLength = 0;			INC_RING_INDEX(pAd->NextRxBulkInReadIndex, RX_RING_SIZE);			RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);			} 		else		{			RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);			break;		}	}	if (!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_RX))) 		DoBulkIn(pAd);	}/*	========================================================================	Routine Description:		This routine process Rx Irp and call rx complete function.			Arguments:		DeviceObject	Pointer to the device object for next lower						device. DeviceObject passed in here belongs to						the next lower driver in the stack because we						were invoked via IoCallDriver in USB_RxPacket						AND it is not OUR device object	  Irp				Ptr to completed IRP	  Context			Ptr to our Adapter object (context specified						in IoSetCompletionRoutine			Return Value:		Always returns STATUS_MORE_PROCESSING_REQUIRED	Note:		Always returns STATUS_MORE_PROCESSING_REQUIRED	========================================================================*/VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs){	// use a receive tasklet to handle received packets;	// or sometimes hardware IRQ will be disabled here, so we can not	// use spin_lock_bh()/spin_unlock_bh() after IRQ is disabled. :<	PRX_CONTEXT		pRxContext;	PRTMP_ADAPTER	pAd;	POS_COOKIE 		pObj;	pRxContext	= (PRX_CONTEXT)pUrb->context;	pAd 		= pRxContext->pAd;	pObj 		= (POS_COOKIE) pAd->OS_Cookie;	pObj->rx_done_task.data = (unsigned long)pUrb;	tasklet_hi_schedule(&pObj->rx_done_task);	}/*	========================================================================		Routine Description:	Arguments:	Return Value:	Note:		========================================================================*/VOID	RTUSBKickBulkOut(	IN	PRTMP_ADAPTER pAd){	// BulkIn Reset will reset whole USB PHY. So we need to make sure fRTMP_ADAPTER_BULKIN_RESET not flaged.	if (!RTMP_TEST_FLAG(pAd ,fRTMP_ADAPTER_NEED_STOP_TX)#ifdef RALINK_ATE					&& !(ATE_ON(pAd))#endif // RALINK_ATE //		)	{		// 2. PS-Poll frame is next		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL))		{			RTUSBBulkOutPsPoll(pAd);		}		// 5. Mlme frame is next		else if ((RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME)) &&				 (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE))		{			RTUSBBulkOutMLMEPacket(pAd, pAd->MgmtRing.TxDmaIdx);		}		// 6. Data frame normal is next		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL))		{			if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || 				(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))				))			{				RTUSBBulkOutDataPacket(pAd, 0, pAd->NextBulkOutIndex[0]);			}		}		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_2))		{					if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || 				(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))				))			{				RTUSBBulkOutDataPacket(pAd, 1, pAd->NextBulkOutIndex[1]);			}		}		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_3))		{			if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || 				(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))				))			{				RTUSBBulkOutDataPacket(pAd, 2, pAd->NextBulkOutIndex[2]);			}		}		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_4))		{			if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || 				(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))				))			{				RTUSBBulkOutDataPacket(pAd, 3, pAd->NextBulkOutIndex[3]);			}		}		//PS packets use HCCA queue when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_5))		{			if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || 				(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))				))			{			}		}		// 7. Null frame is the last		else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL))		{			if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))			{				RTUSBBulkOutNullFrame(pAd);			}		}		// 8. No data avaliable		else		{					}	}#ifdef RALINK_ATE				/* If the mode is in ATE mode. */	else if((ATE_ON(pAd)) &&		!RTMP_TEST_FLAG(pAd ,fRTMP_ADAPTER_NEED_STOP_TX))// PETER : watch out !	{		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE))		{			ATE_RTUSBBulkOutDataPacket(pAd, 0);		}	}	#endif // RALINK_ATE //}/*	========================================================================		Routine Description:	Call from Reset action after BulkOut failed. 	Arguments:	Return Value:	Note:		========================================================================*/VOID	RTUSBCleanUpDataBulkOutQueue(	IN	PRTMP_ADAPTER	pAd){	UCHAR			Idx;				PHT_TX_CONTEXT	pTxContext;		DBGPRINT(RT_DEBUG_TRACE, ("--->CleanUpDataBulkOutQueue\n"));	for (Idx = 0; Idx < 4; Idx++)	{		pTxContext = &pAd->TxContext[Idx];				pTxContext->CurWritePosition = pTxContext->NextBulkOutPosition;		pTxContext->LastOne = FALSE;		NdisAcquireSpinLock(&pAd->BulkOutLock[Idx]);		pAd->BulkOutPending[Idx] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[Idx]);	}		DBGPRINT(RT_DEBUG_TRACE, ("<---CleanUpDataBulkOutQueue\n"));}/*	========================================================================		Routine Description:	Arguments:	Return Value:		Note:		========================================================================*/VOID	RTUSBCleanUpMLMEBulkOutQueue(	IN	PRTMP_ADAPTER	pAd){	DBGPRINT(RT_DEBUG_TRACE, ("--->CleanUpMLMEBulkOutQueue\n"));	DBGPRINT(RT_DEBUG_TRACE, ("<---CleanUpMLMEBulkOutQueue\n"));}/*	========================================================================		Routine Description:	Arguments:	Return Value:		Note:		========================================================================*/VOID	RTUSBCancelPendingIRPs(	IN	PRTMP_ADAPTER	pAd){	RTUSBCancelPendingBulkInIRP(pAd);	RTUSBCancelPendingBulkOutIRP(pAd);}/*	========================================================================		Routine Description:	Arguments:	Return Value:	Note:		========================================================================*/VOID	RTUSBCancelPendingBulkInIRP(	IN	PRTMP_ADAPTER	pAd){	PRX_CONTEXT		pRxContext;	UINT			i;	DBGPRINT_RAW(RT_DEBUG_TRACE, ("--->RTUSBCancelPendingBulkInIRP\n"));	for ( i = 0; i < (RX_RING_SIZE); i++)	{		pRxContext = &(pAd->RxContext[i]);		if(pRxContext->IRPPending == TRUE)		{			RTUSB_UNLINK_URB(pRxContext->pUrb);			pRxContext->IRPPending = FALSE;			pRxContext->InUse = FALSE;			//NdisInterlockedDecrement(&pAd->PendingRx);			//pAd->PendingRx--;		}	}	DBGPRINT_RAW(RT_DEBUG_TRACE, ("<---RTUSBCancelPendingBulkInIRP\n"));}/*	========================================================================		Routine Description:	Arguments:	Return Value:	Note:		========================================================================*/VOID	RTUSBCancelPendingBulkOutIRP(	IN	PRTMP_ADAPTER	pAd){	PHT_TX_CONTEXT		pHTTXContext;	PTX_CONTEXT			pMLMEContext;	PTX_CONTEXT			pBeaconContext;	PTX_CONTEXT			pNullContext;	PTX_CONTEXT			pPsPollContext;	PTX_CONTEXT			pRTSContext;	UINT				i, Idx;//	unsigned int 		IrqFlags;//	NDIS_SPIN_LOCK		*pLock;//	BOOLEAN				*pPending;	//	pLock = &pAd->BulkOutLock[MGMTPIPEIDX];//	pPending = &pAd->BulkOutPending[MGMTPIPEIDX];	for (Idx = 0; Idx < 4; Idx++)	{		pHTTXContext = &(pAd->TxContext[Idx]);		if (pHTTXContext->IRPPending == TRUE)		{			// Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself			// remove it from the HeadPendingSendList and NULL out HeadPendingSendList			//	when the last IRP on the list has been	cancelled; that's how we exit this loop			//			RTUSB_UNLINK_URB(pHTTXContext->pUrb);			// Sleep 200 microseconds to give cancellation time to work			RTMPusecDelay(200);		}#ifdef RALINK_ATE		pHTTXContext->bCopySavePad = 0;		pHTTXContext->CurWritePosition = 0;		pHTTXContext->CurWriteRealPos = 0;		pHTTXContext->bCurWriting = FALSE;		pHTTXContext->NextBulkOutPosition = 0;		pHTTXContext->ENextBulkOutPosition = 0;#endif // RALINK_ATE //		pAd->BulkOutPending[Idx] = FALSE;	}	//RTMP_IRQ_LOCK(pLock, IrqFlags);	for (i = 0; i < MGMT_RING_SIZE; i++)	{		pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[i].AllocVa;		if(pMLMEContext && (pMLMEContext->IRPPending == TRUE))		{			// Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself			// remove it from the HeadPendingSendList and NULL out HeadPendingSendList			//	when the last IRP on the list has been	cancelled; that's how we exit this loop			//			RTUSB_UNLINK_URB(pMLMEContext->pUrb);			pMLMEContext->IRPPending = FALSE;						// Sleep 200 microsecs to give cancellation time to work			RTMPusecDelay(200);		}	}	pAd->BulkOutPending[MGMTPIPEIDX] = FALSE;	//RTMP_IRQ_UNLOCK(pLock, IrqFlags);	for (i = 0; i < BEACON_RING_SIZE; i++)	{		pBeaconContext = &(pAd->BeaconContext[i]);		if(pBeaconContext->IRPPending == TRUE)		{			// Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself			// remove it from the HeadPendingSendList and NULL out HeadPendingSendList			//	when the last IRP on the list has been	cancelled; that's how we exit this loop			//			RTUSB_UNLINK_URB(pBeaconContext->pUrb);			// Sleep 200 microsecs to give cancellation time to work			RTMPusecDelay(200);		}	}	pNullContext = &(pAd->NullContext);	if (pNullContext->IRPPending == TRUE)		RTUSB_UNLINK_URB(pNullContext->pUrb);	pRTSContext = &(pAd->RTSContext);	if (pRTSContext->IRPPending == TRUE)		RTUSB_UNLINK_URB(pRTSContext->pUrb);			pPsPollContext = &(pAd->PsPollContext);	if (pPsPollContext->IRPPending == TRUE)		RTUSB_UNLINK_URB(pPsPollContext->pUrb);	for (Idx = 0; Idx < 4; Idx++)	{		NdisAcquireSpinLock(&pAd->BulkOutLock[Idx]);		pAd->BulkOutPending[Idx] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[Idx]);	}}

⌨️ 快捷键说明

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