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

📄 rtusb_bulk.c

📁 华硕无线网卡 167G linux 驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
		atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCE_COMPLETE);		}#endif	status = pUrb->status;	atomic_set(&pRxContext->IrpLock, IRPLOCK_COMPLETED);	atomic_dec(&pAdapter->PendingRx);		switch (status)	{		case 0:			 if ((status == USB_ST_NOERROR) && (atomic_read(&pRxContext->IrpLock) != IRPLOCK_CANCE_START))			{				//RTUSBRxPacket(pUrb);				pAdapter->rx_bh.data = (unsigned long)pUrb;				tasklet_schedule(&pAdapter->rx_bh);				break;							}// STATUS_SUCCESS		DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete  (IrpLock) = %d\n", atomic_read(&pRxContext->IrpLock));				break;				case -ECONNRESET:		// async unlink		case -ESHUTDOWN:		// hardware gone = -108			pUrb = NULL;		DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete Error code = %d\n", status);			//tasklet_schedule(&pAdapter->rx_bh);			break;	}#if 0	 if ((status == USB_ST_NOERROR) && (atomic_read(&pRxContext->IrpLock) != IRPLOCK_CANCE_START))	{		RTUSBRxPacket(pUrb);		//tasklet_schedule(&pAdapter->rx_bh);			}// STATUS_SUCCESS	else	{		DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete Error code = %d\n", status);		pRxContext->InUse = FALSE;		if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk In Failed\n");			RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET);			RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_IN);		}	}#endif}VOID	RTUSBBulkOutPsPollComplete(purbb_t pUrb, struct pt_regs *pt_regs){	PTX_CONTEXT	pPsPollContext;	PRT2570ADAPTER	pAdapter;	NTSTATUS		status;		pPsPollContext= (PTX_CONTEXT)pUrb->context;	pAdapter = pPsPollContext->pAdapter;	pPsPollContext->IRPPending 	= FALSE;	pPsPollContext->InUse 		= FALSE;	status = pUrb->status;	if (status == USB_ST_NOERROR)	{		// Don't worry about the queue is empty or not, this function will check itself		RTUSBDeQueuePacket(pAdapter);	}	else	{		if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out Null Frame Failed\n");			RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);			RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);		}	}	NdisAcquireSpinLock(&pAdapter->BulkOutLock);	pAdapter->BulkOutPending = FALSE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAdapter);	DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutNullFrameComplete\n");}VOID RTUSBBulkOutBeaconComplete(purbb_t pUrb,struct pt_regs *pt_regs){	PRT2570ADAPTER	pAdapter;	PTX_CONTEXT	pBeaconContext;		pBeaconContext= (PTX_CONTEXT)pUrb->context;	pAdapter = pBeaconContext->pAdapter;	DBGPRINT_RAW(RT_DEBUG_TEMP, "--->RTUSBBulkOutBeaconComplete\n");	// Reset Null frame context flags	pBeaconContext->IRPPending = FALSE;	pBeaconContext->InUse = FALSE;	NdisAcquireSpinLock(&pAdapter->BulkOutLock);	pAdapter->BulkOutPending = FALSE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAdapter);}#elseVOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb){	PTX_CONTEXT 	pTxContext;	PRT2570ADAPTER	pAdapter;	NTSTATUS		status;	DBGPRINT_RAW(RT_DEBUG_INFO, "--->RTUSBBulkOutDataPacketComplete\n");	pTxContext= (PTX_CONTEXT)pUrb->context;	pAdapter = pTxContext->pAdapter;	status = pUrb->status;	if (status == USB_ST_NOERROR) 	{		if (pTxContext->LastOne == TRUE)		{			pAdapter->Counters.GoodTransmits++;			FREE_TX_RING(pAdapter, pTxContext);			if (!skb_queue_empty(&pAdapter->SendTxWaitQueue))			{				RTUSBDeQueuePacket(pAdapter);			}		}		else		{			if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&				(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&				(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&				(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))			{				FREE_TX_RING(pAdapter, pTxContext);				// Indicate next one is frag data which has highest priority				RTUSB_SET_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_FRAG);			}			else			{				while (pTxContext->LastOne != TRUE)				{					FREE_TX_RING(pAdapter, pTxContext);					pTxContext = &(pAdapter->TxContext[pAdapter->NextBulkOutIndex]);				}								FREE_TX_RING(pAdapter, pTxContext);			}		} 	}	NdisAcquireSpinLock(&pAdapter->BulkOutLock);	pAdapter->BulkOutPending = FALSE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAdapter);	}VOID  RTUSBBulkOutNullFrameComplete(purbb_t pUrb){	PRT2570ADAPTER	pAdapter;	PTX_CONTEXT	pNullContext;	NTSTATUS		status;		pNullContext= (PTX_CONTEXT)pUrb->context;	pAdapter = pNullContext->pAdapter;	DBGPRINT_RAW(RT_DEBUG_INFO, "--->RTUSBBulkOutNullFrameComplete\n");	// Reset Null frame context flags	pNullContext->IRPPending = FALSE;	pNullContext->InUse = FALSE;	// Clear Null frame bulk flag	RTUSB_CLEAR_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_NULL);	status = pUrb->status;	if (status == USB_ST_NOERROR)	{		// Don't worry about the queue is empty or not, this function will check itself		RTUSBDeQueuePacket(pAdapter);	}	else	{		if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out Null Frame Failed\n");			RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);			RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);		}	}	NdisAcquireSpinLock(&pAdapter->BulkOutLock);	pAdapter->BulkOutPending = FALSE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAdapter);	DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutNullFrameComplete\n");}VOID  RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb){	PTX_CONTEXT			pMLMEContext;	PRT2570ADAPTER		pAdapter;	NTSTATUS		status;	pMLMEContext= (PTX_CONTEXT)pUrb->context;	pAdapter = pMLMEContext->pAdapter;	status = pUrb->status;	pAdapter->PrioRingTxCnt--;	pAdapter->PrioRingFirstIndex++;	if (pAdapter->PrioRingFirstIndex >= PRIO_RING_SIZE)	{		pAdapter->PrioRingFirstIndex = 0;	}		DBGPRINT(RT_DEBUG_INFO, "RTUSBBulkOutMLMEPacketComplete::PrioRingFirstIndex = %d, PrioRingTxCnt = %d, PopMgmtIndex = %d, PushMgmtIndex = %d, NextMLMEIndex = %d\n", 			pAdapter->PrioRingFirstIndex, 			pAdapter->PrioRingTxCnt, pAdapter->PopMgmtIndex, pAdapter->PushMgmtIndex, pAdapter->NextMLMEIndex);		// Reset MLME context flags	pMLMEContext->IRPPending 	= FALSE;	pMLMEContext->InUse 		= FALSE;		if (status == STATUS_SUCCESS)	{		// Don't worry about the queue is empty or not, this function will check itself		RTUSBDequeueMLMEPacket(pAdapter);	}#if 0	else if (status != STATUS_CANCELLED)	{		if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out MLME Failed\n");			RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);			RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);		}	}#endif	NdisAcquireSpinLock(&pAdapter->BulkOutLock);	pAdapter->BulkOutPending = FALSE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAdapter);	DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutMLMEPacketComplete\n");}/*	========================================================================	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){	PRX_CONTEXT 	pRxContext;	PRT2570ADAPTER	pAdapter;	NTSTATUS		status;		pRxContext= (PRX_CONTEXT)pUrb->context;	pAdapter = pRxContext->pAdapter;	//	// We have a number of cases:	//		1) The USB read timed out and we received no data.	//		2) The USB read timed out and we received some data.	//		3) The USB read was successful and fully filled our irp buffer.	//		4) The irp was cancelled.	//		5) Some other failure from the USB device object.	//		//	// Free the IRP  and its mdl because they were	alloced by us	//#if 0	if ( (atomread = (atomic_read(&pRxContext->IrpLock))) == IRPLOCK_CANCE_START)	{		atomic_dec(&pAdapter->PendingRx);		atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCE_COMPLETE);		}#endif	status = pUrb->status;	atomic_set(&pRxContext->IrpLock, IRPLOCK_COMPLETED);	atomic_dec(&pAdapter->PendingRx);		switch (status)	{		case 0:			 if ((status == USB_ST_NOERROR) && (atomic_read(&pRxContext->IrpLock) != IRPLOCK_CANCE_START))			{				//RTUSBRxPacket(pUrb);				pAdapter->rx_bh.data = (unsigned long)pUrb;				tasklet_schedule(&pAdapter->rx_bh);				break;							}// STATUS_SUCCESS		DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete  (IrpLock) = %d\n", atomic_read(&pRxContext->IrpLock));				break;				case -ECONNRESET:		// async unlink		case -ESHUTDOWN:		// hardware gone = -108			pUrb = NULL;		DBGPRINT(RT_DEBUG_ERROR,"==> RTUSBBulkRxComplete Error code = %d\n", status);			//tasklet_schedule(&pAdapter->rx_bh);			break;	}#if 0	 if ((status == USB_ST_NOERROR) && (atomic_read(&pRxContext->IrpLock) != IRPLOCK_CANCE_START))	{		RTUSBRxPacket(pUrb);		//tasklet_schedule(&pAdapter->rx_bh);			}// STATUS_SUCCESS	else	{		DBGPRINT(RT_DEBUG_TEMP,"==> RTUSBBulkRxComplete Error code = %d\n", status);		pRxContext->InUse = FALSE;		if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk In Failed\n");			RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKIN_RESET);			RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_IN);		}	}#endif}VOID	RTUSBBulkOutPsPollComplete(purbb_t pUrb){	PTX_CONTEXT	pPsPollContext;	PRT2570ADAPTER	pAdapter;	NTSTATUS		status;		pPsPollContext= (PTX_CONTEXT)pUrb->context;	pAdapter = pPsPollContext->pAdapter;	pPsPollContext->IRPPending 	= FALSE;	pPsPollContext->InUse 		= FALSE;	status = pUrb->status;	if (status == USB_ST_NOERROR)	{		// Don't worry about the queue is empty or not, this function will check itself		RTUSBDeQueuePacket(pAdapter);	}	else	{		if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out Null Frame Failed\n");			RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);			RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);		}	}	NdisAcquireSpinLock(&pAdapter->BulkOutLock);	pAdapter->BulkOutPending = FALSE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAdapter);	DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutNullFrameComplete\n");}VOID RTUSBBulkOutBeaconComplete(purbb_t pUrb){	PTX_CONTEXT		pBeaconContext;	PRT2570ADAPTER	pAdapter;	NTSTATUS		status;		pBeaconContext= (PTX_CONTEXT)pUrb->context;	pAdapter = pBeaconContext->pAdapter;	pBeaconContext->IRPPending 	= FALSE;	pBeaconContext->InUse 		= FALSE;	status = pUrb->status;	if (status != USB_ST_NOERROR)	{		if ((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out Beacon Frame Failed\n");			RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET);			RTUSBEnqueueInternalCmd(pAdapter, RT_OID_USB_RESET_BULK_OUT);		}	}	NdisAcquireSpinLock(&pAdapter->BulkOutLock);	pAdapter->BulkOutPending = FALSE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);	// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAdapter);}#endif/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/VOID RTUSBBulkOutBeacon(	IN PRT2570ADAPTER	pAdapter,	IN INT 			BeaconIndex){	PTX_CONTEXT pBeaconContext;	PURB			pUrb;	int ret = 0;		NdisAcquireSpinLock(&pAdapter->BulkOutLock);	if (pAdapter->BulkOutPending == TRUE)

⌨️ 快捷键说明

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