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

📄 rtusb_bulk.c

📁 华硕无线网卡 167G linux 驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	{		NdisReleaseSpinLock(&pAdapter->BulkOutLock);		return;	}	pAdapter->BulkOutPending = TRUE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);		// Clear Beacon 0, 1 flag and set beacon 1 flag if required	if (RTUSB_TEST_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_BEACON_0))	{		// Clear beacon 0 flag		RTUSB_CLEAR_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_BEACON_0);		// Set beacon 1 flag		RTUSB_SET_BULK_FLAG (pAdapter, fRTUSB_BULK_OUT_BEACON_1);	}	else	{		// Clear beacon 1 flag		RTUSB_CLEAR_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_BEACON_1);	}		pBeaconContext  = &pAdapter->BeaconContext[BeaconIndex];	DBGPRINT_RAW(RT_DEBUG_TEMP, "--->RTUSBBulkOutBeacon BulkOutSize %d\n",pBeaconContext->BulkOutSize);	pUrb = pBeaconContext->pUrb;	RTusb_fill_bulk_urb(pUrb,		pAdapter->usb,		usb_sndbulkpipe(pAdapter->usb, 1),		pBeaconContext->TransferBuffer,		pBeaconContext->BulkOutSize,		RTUSBBulkOutBeaconComplete,		pBeaconContext);	if((ret = rtusb_submit_urb(pUrb))!=0)	{		DBGPRINT(RT_DEBUG_ERROR,"Submit Tx URB failed %d\n", ret);		return;	}		DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutBeacon \n");}/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/VOID	RTUSBBulkOutPsPoll(	IN	PRT2570ADAPTER	pAdapter){	PTX_CONTEXT	pPsPollContext = &(pAdapter->PsPollContext);	PURB			pUrb;	int ret = 0;	NdisAcquireSpinLock(&pAdapter->BulkOutLock);	if (pAdapter->BulkOutPending == TRUE)	{		NdisReleaseSpinLock(&pAdapter->BulkOutLock);		return;	}	pAdapter->BulkOutPending = TRUE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);	// Clear PS-Poll bulk flag	RTUSB_CLEAR_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_PSPOLL);	DBGPRINT_RAW(RT_DEBUG_INFO, "--->RTUSBBulkOutPsPollFrame \n");		pUrb = pPsPollContext->pUrb;	RTusb_fill_bulk_urb(pUrb,		pAdapter->usb,		usb_sndbulkpipe(pAdapter->usb, 1),		pPsPollContext->TransferBuffer,		pPsPollContext->BulkOutSize,		RTUSBBulkOutPsPollComplete,		pPsPollContext);	if((ret = rtusb_submit_urb(pUrb))!=0)	{		DBGPRINT(RT_DEBUG_ERROR,"Submit Tx URB failed %d\n", ret);		return;	}	DBGPRINT(RT_DEBUG_INFO,"<==RTUSBBulkOutPsPollPacket\n");	return;}/*	========================================================================	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:		========================================================================*/VOID	RTUSBBulkReceive(	IN	PRT2570ADAPTER	pAdapter){		PRX_CONTEXT pRxContext;	PURB			pUrb;	int ret = 0;	if ((RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS))||		(RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF))||		(RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS)))		{	DBGPRINT(RT_DEBUG_TEMP,"==>RTUSBBulkReceive, pAdapter->NextRxBulkInIndex = %d\n",pAdapter->NextRxBulkInIndex);		return;		}	//DBGPRINT(RT_DEBUG_TEMP,"==>RTUSBBulkReceive, pAdapter->NextRxBulkInIndex = %d\n",pAdapter->NextRxBulkInIndex);	pRxContext = &(pAdapter->RxContext[pAdapter->NextRxBulkInIndex]);	pRxContext->InUse = TRUE;	pAdapter->NextRxBulkInIndex = (pAdapter->NextRxBulkInIndex + 1) % RX_RING_SIZE;	pUrb = pRxContext->pUrb;			atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCELABLE);		atomic_add(1, &pAdapter->PendingRx);	memset(pRxContext->TransferBuffer, 0, BUFFER_SIZE);	RTusb_fill_bulk_urb(pUrb,		pAdapter->usb,		usb_rcvbulkpipe(pAdapter->usb, 1),		pRxContext->TransferBuffer,		BUFFER_SIZE,		RTUSBBulkRxComplete,		pRxContext);		if((ret = rtusb_submit_urb(pUrb))!=0)	{		DBGPRINT(RT_DEBUG_ERROR,"Submit Rx URB failed %d\n", ret);		return;	}	return;}/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/VOID	RTUSBKickBulkOut(	IN	PRT2570ADAPTER pAdapter){	int	RoundOver = 0;	do	{		// greedy to bulk out. protection are in BulkOut function using InUse parameter		if (++RoundOver > 2)			break;				if (!(RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) &&			!(RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			!(RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			!(RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)) &&			!(RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF)))		{			// Start aribritrating Bulk out candidates			// 0. Check if no flags set, we will do a dequeue from MLME and Data			//if (pAdapter->BulkFlags == 0x0)			//{			//	RTUSBDequeueMLMEPacket(pAdapter);			//	RTUSBDeQueuePacket(pAdapter);			//}					// 1. Data Fragment has highest priority			if (RTUSB_TEST_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_FRAG))			{				RTUSBBulkOutDataPacket(pAdapter, pAdapter->NextBulkOutIndex);			}						// 2. PS-Poll frame is next			else if (RTUSB_TEST_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_PSPOLL))			{				RTUSBBulkOutPsPoll(pAdapter);			}						// 3. Beacon 0, guarding beacon frame is next			else if (RTUSB_TEST_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_BEACON_0))			{				RTUSBBulkOutBeacon(pAdapter, 0);			}			// 4. Beacon 1, beacon frame body is next			else if (RTUSB_TEST_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_BEACON_1))			{				RTUSBBulkOutBeacon(pAdapter, 1);			}			// 5. Mlme frame is next			else if (RTUSB_TEST_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_MLME))			{				RTUSBBulkOutMLMEPacket(pAdapter, pAdapter->PrioRingFirstIndex);			}			// 6. Data frame normal is next			else if (RTUSB_TEST_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_NORMAL))			{				if ((!LOCAL_TX_RING_EMPTY(pAdapter)) && 					((!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) && 					(pAdapter->MediaState == NdisMediaStateConnected)))				{					RTUSBBulkOutDataPacket(pAdapter, pAdapter->NextBulkOutIndex);				}			}			// 7. Null frame is the last			else if (RTUSB_TEST_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_NULL))			{				if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))				{					RTUSBBulkOutNullFrame(pAdapter);				}			}						// 8. No data avaliable			else			{				// Do nothing, or dequeue MLME and Data				//RTUSBDequeueMLMEPacket(pAdapter);				//RTUSBDeQueuePacket(pAdapter);			}		}	}while(TRUE);	DBGPRINT_RAW(RT_DEBUG_INFO,"<---RTUSBKickBulkOut\n");}/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/VOID	RTUSBCleanUpDataBulkOutQueue(	IN	PRT2570ADAPTER	pAdapter){	PTX_CONTEXT pTxContext;				DBGPRINT(RT_DEBUG_TRACE, "--->CleanUpDataBulkOutQueue\n");					while (!LOCAL_TX_RING_EMPTY(pAdapter))	{					pTxContext 					= &(pAdapter->TxContext[pAdapter->NextBulkOutIndex]);		pTxContext->LastOne 		= FALSE;		pTxContext->InUse 			= FALSE;		pAdapter->NextBulkOutIndex 	= (pAdapter->NextBulkOutIndex + 1) % TX_RING_SIZE;	}		NdisAcquireSpinLock(&pAdapter->BulkOutLock);	pAdapter->BulkOutPending = FALSE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);	DBGPRINT(RT_DEBUG_TRACE, "<---CleanUpDataBulkOutQueue\n");}/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/VOID	RTUSBCleanUpMLMEBulkOutQueue(	IN	PRT2570ADAPTER	pAdapter){	DBGPRINT(RT_DEBUG_TRACE, "--->CleanUpMLMEBulkOutQueue\n");	NdisAcquireSpinLock(&pAdapter->MLMEQLock);	while (pAdapter->PrioRingTxCnt > 0)	{		pAdapter->MLMEContext[pAdapter->PrioRingFirstIndex].InUse = FALSE;					pAdapter->PrioRingFirstIndex++;		if (pAdapter->PrioRingFirstIndex >= PRIO_RING_SIZE)		{			pAdapter->PrioRingFirstIndex = 0;		}		pAdapter->PrioRingTxCnt--;	}	NdisReleaseSpinLock(&pAdapter->MLMEQLock);	DBGPRINT(RT_DEBUG_TRACE, "<---CleanUpMLMEBulkOutQueue\n");}/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/VOID	RTUSBCancelPendingIRPs(	IN	PRT2570ADAPTER	pAdapter){	RTUSBCancelPendingBulkInIRP(pAdapter);	RTUSBCancelPendingBulkOutIRP(pAdapter);}/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/VOID	RTUSBCancelPendingBulkInIRP(	IN	PRT2570ADAPTER	pAdapter){	PRX_CONTEXT	pRxContext;	UINT		i;	DBGPRINT_RAW(RT_DEBUG_TRACE,"--->RTUSBCancelPendingBulkInIRP\n");	for ( i = 0; i < RX_RING_SIZE; i++)	{		pRxContext = &(pAdapter->RxContext[i]);		if(atomic_read(&pRxContext->IrpLock) == IRPLOCK_CANCELABLE)		{			usb_kill_urb(pRxContext->pUrb);		}		atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCE_START);	}	DBGPRINT_RAW(RT_DEBUG_TRACE,"<---RTUSBCancelPendingBulkInIRP\n");}/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/VOID	RTUSBCancelPendingBulkOutIRP(	IN	PRT2570ADAPTER	pAdapter){	PTX_CONTEXT		pTxContext;	PTX_CONTEXT		pMLMEContext;	PTX_CONTEXT		pBeaconContext;	PTX_CONTEXT		pNullContext;	PTX_CONTEXT		pPsPollContext;	UINT		i;		DBGPRINT_RAW(RT_DEBUG_TRACE,"--->RTUSBCancelPendingBulkOutIRP\n");	for ( i = 0; i < TX_RING_SIZE; i++)	{		pTxContext = &(pAdapter->TxContext[i]);		if (pTxContext->IRPPending == TRUE)		{			usb_kill_urb(pTxContext->pUrb);		}	}	for (i = 0; i < PRIO_RING_SIZE; i++)	{		pMLMEContext = &(pAdapter->MLMEContext[i]);		if(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			//			usb_kill_urb(pMLMEContext->pUrb);			// Sleep 200 microsecs to give cancellation time to work			NdisMSleep(200);		}	}	for (i = 0; i < BEACON_RING_SIZE; i++)	{		pBeaconContext = &(pAdapter->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			//			usb_kill_urb(pBeaconContext->pUrb);			// Sleep 200 microsecs to give cancellation time to work			NdisMSleep(200);		}	}	pNullContext = &(pAdapter->NullContext);	if (pNullContext->IRPPending == TRUE)	usb_kill_urb(pNullContext->pUrb);	pPsPollContext = &(pAdapter->PsPollContext);	if (pPsPollContext->IRPPending == TRUE)	usb_kill_urb(pPsPollContext->pUrb);	NdisAcquireSpinLock(&pAdapter->BulkOutLock);	pAdapter->BulkOutPending = FALSE;	NdisReleaseSpinLock(&pAdapter->BulkOutLock);		DBGPRINT_RAW(RT_DEBUG_TRACE,"<---RTUSBCancelPendingBulkOutIRP\n");	}

⌨️ 快捷键说明

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