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

📄 rtusb_bulk.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
/*	========================================================================	Routine Description:	USB_RxPacket initializes a URB and uses the Rx IRP to submit it	to USB. It checks if an Rx Descriptor is available and passes the	the coresponding buffer to be filled. If no descriptor is available	fails the request. When setting the completion routine we pass our	Adapter Object as Context.			Arguments:			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]);			}		}		// 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				else if((ATE_ON(pAd)) &&			!RTMP_TEST_FLAG(pAd , fRTMP_ADAPTER_NEED_STOP_TX))	{		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]);	}}#endif // RTMP_MAC_USB //

⌨️ 快捷键说明

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