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

📄 rtusb_bulk.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 3 页
字号:
		========================================================================*/VOID	RTUSBKickBulkOut(	IN	PRTMP_ADAPTER pAd){		DBGPRINT_RAW(RT_DEBUG_INFO, "--->RTUSBKickBulkOut\n");			if (!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&		!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&		!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&		!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS)) &&#ifdef RALINK_ATE					!(pAd->ate.Mode != ATE_STASTART) &&#endif							!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)))	{		// 1. Data Fragment has highest priority		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_FRAG))		{			if ((!LOCAL_TX_RING_EMPTY(pAd, 0)) && 				(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))			{								RTUSBBulkOutDataPacket(pAd, 0, pAd->NextBulkOutIndex[0]);			}		}				if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_FRAG_2))		{			if ((!LOCAL_TX_RING_EMPTY(pAd, 1)) && 				(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))			{				RTUSBBulkOutDataPacket(pAd, 1, pAd->NextBulkOutIndex[1]);			}		}				if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_FRAG_3))		{			if ((!LOCAL_TX_RING_EMPTY(pAd, 2)) && 				(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))			{				RTUSBBulkOutDataPacket(pAd, 2, pAd->NextBulkOutIndex[2]);			}		}				if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_FRAG_4))		{					if ((!LOCAL_TX_RING_EMPTY(pAd, 3)) && 				(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))			{				RTUSBBulkOutDataPacket(pAd, 3, pAd->NextBulkOutIndex[3]);			}		}				// 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))		{			RTUSBBulkOutMLMEPacket(pAd, pAd->PrioRingFirstIndex);		}		// 6. Data frame normal is next		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL))		{			if ((!LOCAL_TX_RING_EMPTY(pAd, 0)) && 				(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))			{				RTUSBBulkOutDataPacket(pAd, 0, pAd->NextBulkOutIndex[0]);						}		}						if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_2))		{					if ((!LOCAL_TX_RING_EMPTY(pAd, 1)) && 				(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))						{				RTUSBBulkOutDataPacket(pAd, 1, pAd->NextBulkOutIndex[1]);			}		}		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_3))		{			if ((!LOCAL_TX_RING_EMPTY(pAd, 2)) && 				(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))						{				RTUSBBulkOutDataPacket(pAd, 2, pAd->NextBulkOutIndex[2]);			}		}				if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_4))		{			if ((!LOCAL_TX_RING_EMPTY(pAd, 3)) && 				(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))						{				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		//2006/06/11		//If the mode is in ATE mode.	else if((pAd->ate.Mode != ATE_STASTART) &&		!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&		!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&		!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&		!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS)) &&								!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)))	{		if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE))		{			ATE_RTUSBBulkOutDataPacket(pAd);		}	}	#endif			DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBKickBulkOut\n");}/*	========================================================================		Routine Description:	Arguments:	Return Value:	Note:		========================================================================*/VOID	RTUSBCleanUpDataBulkOutQueue(	IN	PRTMP_ADAPTER	pAd){	UCHAR			Idx;	PTX_CONTEXT 	pTxContext;				unsigned long	IrqFlags;		DBGPRINT(RT_DEBUG_TRACE, "--->CleanUpDataBulkOutQueue\n");	for (Idx = 0; Idx < 4; Idx++)	{		while (!LOCAL_TX_RING_EMPTY(pAd, Idx))		{						pTxContext						= &(pAd->TxContext[Idx][pAd->NextBulkOutIndex[Idx]]);			pTxContext->LastOne 			= FALSE;			pTxContext->InUse				= FALSE;			pTxContext->bWaitingBulkOut		= FALSE;			pAd->NextBulkOutIndex[Idx] = (pAd->NextBulkOutIndex[Idx] + 1) % TX_RING_SIZE;		}		NdisAcquireSpinLock(&pAd->BulkOutLock[Idx], IrqFlags);		pAd->BulkOutPending[Idx] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[Idx], IrqFlags);	}		DBGPRINT(RT_DEBUG_TRACE, "<---CleanUpDataBulkOutQueue\n");}/*	========================================================================		Routine Description:	Arguments:	Return Value:		Note:		========================================================================*/VOID	RTUSBCleanUpMLMEBulkOutQueue(	IN	PRTMP_ADAPTER	pAd){	unsigned long	IrqFlags;		DBGPRINT(RT_DEBUG_TRACE, "--->CleanUpMLMEBulkOutQueue\n");	NdisAcquireSpinLock(&pAd->MLMEQLock, IrqFlags);	while (pAd->PrioRingTxCnt > 0)	{		pAd->MLMEContext[pAd->PrioRingFirstIndex].InUse = FALSE;					pAd->PrioRingFirstIndex++;		if (pAd->PrioRingFirstIndex >= PRIO_RING_SIZE)		{			pAd->PrioRingFirstIndex = 0;		}		pAd->PrioRingTxCnt--;	}	NdisReleaseSpinLock(&pAd->MLMEQLock, IrqFlags);	DBGPRINT(RT_DEBUG_TRACE, "<---CleanUpMLMEBulkOutQueue\n");}/*	========================================================================		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(atomic_read(&pRxContext->IrpLock) == IRPLOCK_CANCELABLE)		{			RTUSB_UNLINK_URB(pRxContext->pUrb);		}		atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCE_START);	}	DBGPRINT_RAW(RT_DEBUG_TRACE,"<---RTUSBCancelPendingBulkInIRP\n");}/*	========================================================================		Routine Description:	Arguments:	Return Value:	Note:		========================================================================*/VOID	RTUSBCancelPendingBulkOutIRP(	IN	PRTMP_ADAPTER	pAd){	PTX_CONTEXT		pTxContext;	PTX_CONTEXT		pMLMEContext;	PTX_CONTEXT		pBeaconContext;	PTX_CONTEXT		pNullContext;	PTX_CONTEXT		pPsPollContext;	PTX_CONTEXT		pRTSContext;	UINT			i, Idx;	unsigned long	IrqFlags;		for (Idx = 0; Idx < 4; Idx++)	{		for (i = 0; i < TX_RING_SIZE; i++)		{			pTxContext = &(pAd->TxContext[Idx][i]);			if (pTxContext->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(pTxContext->pUrb);				// Sleep 200 microseconds to give cancellation time to work				RTMPusecDelay(200);			}		}	}	for (i = 0; i < PRIO_RING_SIZE; i++)	{		pMLMEContext = &(pAd->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			//			RTUSB_UNLINK_URB(pMLMEContext->pUrb);			// Sleep 200 microsecs to give cancellation time to work			RTMPusecDelay(200);		}	}	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], IrqFlags);		pAd->BulkOutPending[Idx] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[Idx], IrqFlags);	}}/*	========================================================================		Routine Description:	Arguments:	Return Value:	Note:		========================================================================*/VOID	RTUSBCancelPendingIRPs(	IN	PRTMP_ADAPTER	pAd){	RTUSBCancelPendingBulkInIRP(pAd);	RTUSBCancelPendingBulkOutIRP(pAd);}#ifdef RALINK_ATEVOID ATE_RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs){	PRTMP_ADAPTER	pAd;	PTX_CONTEXT		pNullContext;	NTSTATUS		status;	unsigned long	IrqFlags;	ULONG			OldValue;		pNullContext= (PTX_CONTEXT)pUrb->context;	pAd = pNullContext->pAd;	DBGPRINT_RAW(RT_DEBUG_INFO, "--->ATE_RTUSBBulkOutDataPacketComplete\n");	// Reset Null frame context flags	pNullContext->IRPPending = FALSE;	pNullContext->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		RTMPDeQueuePacket(pAd, 0);	}#if 1	// STATUS_OTHER	else	{		if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))		{			DBGPRINT_RAW(RT_DEBUG_ERROR, "Bulk Out Null Frame Failed\n");			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);			RTUSBEnqueueInternalCmd(pAd, RT_OID_USB_RESET_BULK_OUT);		}	}#endif		if (atomic_read(&pAd->BulkOutRemained) > 0)	{					atomic_dec(&pAd->BulkOutRemained);		DBGPRINT(RT_DEBUG_INFO, "Bulk Out Remained = %d\n", atomic_read(&pAd->BulkOutRemained));	}		// 1st - Transmit Success	OldValue = pAd->WlanCounters.TransmittedFragmentCount.vv.LowPart;	pAd->WlanCounters.TransmittedFragmentCount.vv.LowPart++;	if (pAd->WlanCounters.TransmittedFragmentCount.vv.LowPart < OldValue)	{		pAd->WlanCounters.TransmittedFragmentCount.vv.HighPart++;	}		if(((pAd->ContinBulkOut == TRUE ) ||(atomic_read(&pAd->BulkOutRemained) > 0)) && (pAd->ate.Mode != ATE_STASTART))	{				DBGPRINT(RT_DEBUG_INFO, "ContinBulkOut = TRUE \n");		RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);	}		else	{		RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);	}	NdisAcquireSpinLock(&pAd->BulkOutLock[0], IrqFlags);	pAd->BulkOutPending[0] = FALSE;	NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);		// Always call Bulk routine, even reset bulk.	// The protectioon of rest bulk should be in BulkOut routine	RTUSBKickBulkOut(pAd);	DBGPRINT_RAW(RT_DEBUG_INFO, "<---ATE_RTUSBBulkOutDataPacketComplete\n");}VOID ATE_RTUSBBulkOutDataPacket(		IN	PRTMP_ADAPTER	pAd){	PTX_CONTEXT		pNullContext = &(pAd->NullContext);	PURB			pUrb;	int 			ret = 0;	unsigned long	IrqFlags;	ATE_RTMPSendNullFrame(pAd);		DBGPRINT_RAW(RT_DEBUG_INFO, "--->ATE_RTUSBBulkOutDataPacket \n");		NdisAcquireSpinLock(&pAd->BulkOutLock[0], IrqFlags);	if (pAd->BulkOutPending[0] == TRUE)	{		DBGPRINT_RAW(RT_DEBUG_INFO, "--->ATE_RTUSBBulkOutDataPacket BulkOutPending \n");		NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);		return;	}	pAd->BulkOutPending[0] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);	// Increase Total transmit byte counter	pAd->RalinkCounters.TransmittedByteCount +=  pNullContext->BulkOutSize;	DBGPRINT_RAW(RT_DEBUG_INFO, "--->ATE_RTUSBBulkOutDataPacket \n");	// Clear Null frame bulk flag	RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);		// Init Tx context descriptor	RTUSBInitTxDesc(pAd, pNullContext, 0, ATE_RTUSBBulkOutDataPacketComplete);	pNullContext->IRPPending = TRUE;	pUrb = pNullContext->pUrb;	if((ret = rtusb_submit_urb(pUrb))!=0)	{		DBGPRINT(RT_DEBUG_ERROR,"Submit Tx URB failed %d\n", ret);		return;	}			DBGPRINT_RAW(RT_DEBUG_INFO, "<---ATE_RTUSBBulkOutDataPacket \n");	return;}#endif

⌨️ 快捷键说明

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