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

📄 rtusb_bulk.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	IN	PRTMP_ADAPTER	pAd,	IN	PTX_CONTEXT 	pTxContext,	IN	UCHAR			BulkOutPipeId,	IN	usb_complete_t	Func){	PURB				pUrb;	PUCHAR				pSrc = NULL;	pUrb = pTxContext->pUrb;	ASSERT(pUrb);	// Store BulkOut PipeId	pTxContext->BulkOutPipeId = BulkOutPipeId;    pSrc = (PUCHAR) &pTxContext->TransferBuffer->TxDesc;	//Initialize a tx bulk urb	RTusb_fill_bulk_urb(pUrb,						pAd->pUsb_Dev,						usb_sndbulkpipe(pAd->pUsb_Dev, 1),						pSrc,						pTxContext->BulkOutSize,						Func,						pTxContext);}VOID	RTUSBInitRxDesc(	IN	PRTMP_ADAPTER	pAd,	IN	PRX_CONTEXT		pRxContext){	PURB				pUrb;	pUrb = pRxContext->pUrb;	ASSERT(pUrb);	//Initialize a rx bulk urb	RTusb_fill_bulk_urb(pUrb,						pAd->pUsb_Dev,						usb_rcvbulkpipe(pAd->pUsb_Dev, 1),						pRxContext->TransferBuffer,						BUFFER_SIZE,						RTUSBBulkRxComplete,						pRxContext);}/*	========================================================================	Routine Description:		Admit one URB for transmit. This routine submits one URB at a time,		even though there may be multiple entries in the Tx ring.	Arguments:	Return Value:	Note:		TODO: Make sure Ralink's controller doesn't blow up before we try		to change this to enqueue multiple URBs - bb.	========================================================================*/VOID	RTUSBBulkOutDataPacket(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			BulkOutPipeId,	IN	UCHAR			Index){	PTX_CONTEXT	pTxContext;	PURB		pUrb;	int 		ret = 0;	unsigned long		flags;	NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId]);	if (pAd->BulkOutPending[BulkOutPipeId] == TRUE)	{		NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]);		return;	}	pAd->BulkOutPending[BulkOutPipeId] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]);	pTxContext = &(pAd->TxContext[BulkOutPipeId][Index]);	// Increase Total transmit byte counter	pAd->RalinkCounters.TransmittedByteCount +=  pTxContext->BulkOutSize;	// Clear Data flag	RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId));	RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));	if (pTxContext->bWaitingBulkOut	!= TRUE)	{		DBGPRINT(RT_DEBUG_ERROR, "RTUSBBulkOutDataPacket failed, "				"bWaitingBulkOut != TRUE, Index %d, NextBulkOutIndex %d\n",				Index, pAd->NextBulkOutIndex[BulkOutPipeId]);		NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId]);		pAd->BulkOutPending[BulkOutPipeId] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]);		return;	}	else if (pTxContext->BulkOutSize == 0)	{		//		// This may happen on CCX Leap Ckip or Cmic		// When the Key was been set not on time.		// We will break it when the Key was Zero on RTUSBHardTransmit		// And this will cause deadlock that the TxContext always InUse.		//		DBGPRINT(RT_DEBUG_ERROR, "RTUSBBulkOutDataPacket failed, "				"BulkOutSize==0\n");		NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId]);		FREE_TX_RING(pAd, BulkOutPipeId, pTxContext);		pAd->TxRingTotalNumber[BulkOutPipeId]--;    // sync. to PendingTx		pAd->BulkOutPending[BulkOutPipeId] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]);		return;	}	else if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&			!(pAd->PortCfg.BssType == BSS_MONITOR && pAd->bAcceptRFMONTx==TRUE))	{		//		// There is no connection, so we need to empty the Tx Bulk out Ring.		//		DBGPRINT(RT_DEBUG_ERROR, "RTUSBBulkOutDataPacket failed, "				"Media Disconnected NextBulkOutIndex %d, NextIndex=%d\n",				pAd->NextBulkOutIndex[BulkOutPipeId],				pAd->NextTxIndex[BulkOutPipeId]);		while (pTxContext->InUse != FALSE)		{			FREE_TX_RING(pAd, BulkOutPipeId, pTxContext);			pAd->TxRingTotalNumber[BulkOutPipeId]--;    // sync. to PendingTx			pTxContext = nextTxContext(pAd, BulkOutPipeId);		}		NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId]);		pAd->BulkOutPending[BulkOutPipeId] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId]);		return;	}	// Init Tx context descriptor	RTUSBInitTxDesc(pAd, pTxContext, BulkOutPipeId, RTUSBBulkOutDataPacketComplete);	pTxContext->IRPPending = TRUE;	pUrb = pTxContext->pUrb;	if((ret = rtusb_submit_urb(pUrb))!=0)	{		DBGPRINT(RT_DEBUG_ERROR, "-  %s: Submit Tx URB failed %d\n",				__FUNCTION__, ret);		return;	}	else {		atomic_inc(&pAd->PendingTx);	}	DBGPRINT(RT_DEBUG_TRACE, "<-- RTUSBBulkOutDataPacket \n");	return;}/*	========================================================================	Routine Description:	Arguments:	Return Value:	Note: NULL frame use BulkOutPipeId = 0	========================================================================*/VOID	RTUSBBulkOutNullFrame(	IN	PRTMP_ADAPTER	pAd){	PTX_CONTEXT	pNullContext = &(pAd->NullContext);	PURB		pUrb;	int 		ret = 0;	unsigned long		flags;	NdisAcquireSpinLock(&pAd->BulkOutLock[0]);	if (pAd->BulkOutPending[0] == TRUE)	{		NdisReleaseSpinLock(&pAd->BulkOutLock[0]);		return;	}	pAd->BulkOutPending[0] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[0]);	// Increase Total transmit byte counter	pAd->RalinkCounters.TransmittedByteCount +=  pNullContext->BulkOutSize;	DBGPRINT(RT_DEBUG_TRACE, "--->RTUSBBulkOutNullFrame \n");	// Clear Null frame bulk flag	RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL);	// Init Tx context descriptor	RTUSBInitTxDesc(pAd, pNullContext, 0, RTUSBBulkOutNullFrameComplete);	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;	}	else {		atomic_inc(&pAd->PendingTx);	}	DBGPRINT(RT_DEBUG_TRACE, "<---RTUSBBulkOutNullFrame PendingTx=%d\n",			atomic_read(&pAd->PendingTx));	return;}/*	========================================================================	Routine Description:	Arguments:	Return Value:	Note:		Apparently not called - bb.	========================================================================*/VOID	RTUSBBulkOutRTSFrame(	IN	PRTMP_ADAPTER	pAd){	PTX_CONTEXT	pRTSContext = &(pAd->RTSContext);	PURB		pUrb;	int 		ret = 0;	unsigned long		flags;	UCHAR		PipeID=0;	if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_4))		PipeID= 3;	else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_3))		PipeID= 2;	else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_2))		PipeID= 1;	else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL))		PipeID= 0;	NdisAcquireSpinLock(&pAd->BulkOutLock[PipeID]);	if (pAd->BulkOutPending[PipeID] == TRUE)	{		NdisReleaseSpinLock(&pAd->BulkOutLock[PipeID]);		return;	}	pAd->BulkOutPending[PipeID] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[PipeID]);	// Increase Total transmit byte counter	pAd->RalinkCounters.TransmittedByteCount +=  pRTSContext->BulkOutSize;	DBGPRINT(RT_DEBUG_TRACE, "--->RTUSBBulkOutRTSFrame \n");	// Clear RTS frame bulk flag	RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_RTS);	// Init Tx context descriptor	RTUSBInitTxDesc(pAd, pRTSContext, PipeID, RTUSBBulkOutRTSFrameComplete);	pRTSContext->IRPPending = TRUE;	pUrb = pRTSContext->pUrb;	if((ret = rtusb_submit_urb(pUrb))!=0)	{		DBGPRINT(RT_DEBUG_ERROR,"Submit Tx URB failed %d\n", ret);		return;	}	else {		atomic_inc(&pAd->PendingTx);	}	DBGPRINT(RT_DEBUG_TRACE, "<---RTUSBBulkOutRTSFrame \n");	return;}/*	========================================================================	Routine Description:	Arguments:	Return Value:	Note: MLME use BulkOutPipeId = 0	========================================================================*/VOID	RTUSBBulkOutMLMEPacket(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			Index){	PTX_CONTEXT		pMLMEContext;	PURB			pUrb;	int 			ret = 0;	unsigned long			flags;	pMLMEContext = &pAd->MLMEContext[Index];	NdisAcquireSpinLock(&pAd->BulkOutLock[0]);	if (pAd->BulkOutPending[0] == TRUE)	{		NdisReleaseSpinLock(&pAd->BulkOutLock[0]);		return;	}	pAd->BulkOutPending[0] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[0]);	DBGPRINT(RT_DEBUG_TRACE, "--->RTUSBBulkOutMLMEPacket\n");	// Increase Total transmit byte counter	pAd->RalinkCounters.TransmittedByteCount +=  pMLMEContext->BulkOutSize;	// Clear MLME bulk flag	RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);#if 0	DBGPRINT(RT_DEBUG_INFO, "RTUSBBulkOutMLMEPacket::PrioRingFirstIndex = %d, PrioRingTxCnt = %d, PopMgmtIndex = %d, PushMgmtIndex = %d, NextMLMEIndex = %d\n",			pAd->PrioRingFirstIndex,			pAd->PrioRingTxCnt, pAd->PopMgmtIndex, pAd->PushMgmtIndex, pAd->NextMLMEIndex);#endif	// Init Tx context descriptor	RTUSBInitTxDesc(pAd, pMLMEContext, 0, RTUSBBulkOutMLMEPacketComplete);	pMLMEContext->IRPPending = TRUE;	pUrb = pMLMEContext->pUrb;	if((ret = rtusb_submit_urb(pUrb))!=0)	{		DBGPRINT(RT_DEBUG_ERROR,"Submit MLME URB failed %d\n", ret);		return;	}	else {		atomic_inc(&pAd->PendingTx);	}	DBGPRINT(RT_DEBUG_TRACE, "<---RTUSBBulkOutMLMEPacket \n");	return;}/*	========================================================================	Routine Description:	Arguments:	Return Value:	Note: PsPoll use BulkOutPipeId = 0	========================================================================*/VOID	RTUSBBulkOutPsPoll(	IN	PRTMP_ADAPTER	pAd){	PTX_CONTEXT		pPsPollContext = &(pAd->PsPollContext);	PURB			pUrb;	int 			ret = 0;	unsigned long			flags;	NdisAcquireSpinLock(&pAd->BulkOutLock[0]);	if (pAd->BulkOutPending[0] == TRUE)	{		NdisReleaseSpinLock(&pAd->BulkOutLock[0]);		return;	}	pAd->BulkOutPending[0] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[0]);	DBGPRINT(RT_DEBUG_TRACE, "--->RTUSBBulkOutPsPoll \n");	// Clear PS-Poll bulk flag	RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL);	// Init Tx context descriptor	RTUSBInitTxDesc(pAd, pPsPollContext, 0, RTUSBBulkOutPsPollComplete);	pPsPollContext->IRPPending = TRUE;	pUrb = pPsPollContext->pUrb;	if((ret = rtusb_submit_urb(pUrb))!=0)	{		DBGPRINT(RT_DEBUG_ERROR,"Submit Tx URB failed %d\n", ret);		return;	}	else {		atomic_inc(&pAd->PendingTx);	}	DBGPRINT(RT_DEBUG_TRACE, "<---RTUSBBulkOutPsPoll \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	PRTMP_ADAPTER	pAd){	PRX_CONTEXT pRxContext;	PURB		pUrb;	int 		ret = 0;	DBGPRINT(RT_DEBUG_TRACE,"RTUSBBulkReceive:: pAd->NextRxBulkInIndex = %d\n",			pAd->NextRxBulkInIndex);	if ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))||		(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))||		(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS)))	{		DBGPRINT(RT_DEBUG_INFO,"RTUSBBulkReceive:: can't start\n");		return;	}	pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]);	if (pRxContext->InUse == FALSE) {		// Init Rx context descriptor		memset(pRxContext->TransferBuffer, 0, BUFFER_SIZE);		RTUSBInitRxDesc(pAd, pRxContext);		pUrb = pRxContext->pUrb;		atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCELABLE);	// s/w timing		if((ret = rtusb_submit_urb(pUrb)) == 0) {			pRxContext->InUse = TRUE;			atomic_inc(&pAd->PendingRx);			pAd->NextRxBulkInIndex = (pAd->NextRxBulkInIndex+1) % RX_RING_SIZE;		}		else {	// -EPIPE -> disconnected			atomic_set(&pRxContext->IrpLock, IRPLOCK_COMPLETED);		}		DBGPRINT(RT_DEBUG_TRACE,"<-- %s: Submit Rx URB ret=%d\n",				__FUNCTION__, ret);	}	else {		DBGPRINT(RT_DEBUG_TRACE,"<-- %s (Rx Ring full)\n", __FUNCTION__);	}	return;}

⌨️ 快捷键说明

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