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

📄 rtusb_bulk.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 3 页
字号:
{	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:	Arguments:	Return Value:	Note:		========================================================================*/VOID	RTUSBBulkOutDataPacket(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			BulkOutPipeId,	IN	UCHAR			Index){	PTX_CONTEXT	pTxContext;	PURB		pUrb;	int 		ret = 0;	unsigned long	IrqFlags;		NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);	if (pAd->BulkOutPending[BulkOutPipeId] == TRUE)	{		NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);		return;	}	pAd->BulkOutPending[BulkOutPipeId] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);	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, pTxContext->bWaitingBulkOut != TRUE, Index %d, NextBulkOutIndex %d\n", 			Index, pAd->NextBulkOutIndex[BulkOutPipeId]);		NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);		pAd->BulkOutPending[BulkOutPipeId] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);		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.		//		NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);				pTxContext->InUse	   = FALSE;		pTxContext->LastOne    = FALSE;		pTxContext->IRPPending = FALSE;		pTxContext->bWaitingBulkOut = FALSE;		pTxContext->BulkOutSize= 0;		pAd->NextBulkOutIndex[BulkOutPipeId] = (pAd->NextBulkOutIndex[BulkOutPipeId] + 1) % TX_RING_SIZE;		pAd->BulkOutPending[BulkOutPipeId] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);		return;			}	else if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))	{		//		// Since there is no connection, so we need to empty the Tx Bulk out Ring.		//		while (atomic_read(&pAd->TxCount) > 0)		{			DBGPRINT(RT_DEBUG_ERROR, "RTUSBBulkOutDataPacket failed, snice NdisMediaStateDisconnected discard NextBulkOutIndex %d, NextIndex = %d\n", 				pAd->NextBulkOutIndex[BulkOutPipeId], pAd->NextTxIndex[BulkOutPipeId]);							FREE_TX_RING(pAd, BulkOutPipeId, pTxContext);			pAd->TxRingTotalNumber[BulkOutPipeId]--;    // sync. to TxCount			pTxContext = &(pAd->TxContext[BulkOutPipeId][pAd->NextBulkOutIndex[BulkOutPipeId]]);		}		NdisAcquireSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);		pAd->BulkOutPending[BulkOutPipeId] = FALSE;		NdisReleaseSpinLock(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);		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, "Submit Tx URB failed %d\n", ret);		return;	}	DBGPRINT_RAW(RT_DEBUG_INFO, "<---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	IrqFlags;		NdisAcquireSpinLock(&pAd->BulkOutLock[0], IrqFlags);	if (pAd->BulkOutPending[0] == TRUE)	{		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, "--->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;	}			DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutNullFrame \n");	return;}/*	========================================================================		Routine Description:	Arguments:	Return Value:	Note: 		========================================================================*/VOID	RTUSBBulkOutRTSFrame(	IN	PRTMP_ADAPTER	pAd){	PTX_CONTEXT	pRTSContext = &(pAd->RTSContext);	PURB		pUrb;	int 		ret = 0;	unsigned long	IrqFlags;	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], IrqFlags);	if (pAd->BulkOutPending[PipeID] == TRUE)	{		NdisReleaseSpinLock(&pAd->BulkOutLock[PipeID], IrqFlags);		return;	}	pAd->BulkOutPending[PipeID] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[PipeID], IrqFlags);	// Increase Total transmit byte counter	pAd->RalinkCounters.TransmittedByteCount +=  pRTSContext->BulkOutSize;	DBGPRINT_RAW(RT_DEBUG_INFO, "--->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;	}			DBGPRINT_RAW(RT_DEBUG_INFO, "<---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	IrqFlags;		pMLMEContext = &pAd->MLMEContext[Index];		NdisAcquireSpinLock(&pAd->BulkOutLock[0], IrqFlags);	if (pAd->BulkOutPending[0] == TRUE)	{		NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);		return;	}	pAd->BulkOutPending[0] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);	// Increase Total transmit byte counter	pAd->RalinkCounters.TransmittedByteCount +=  pMLMEContext->BulkOutSize;	// Clear MLME bulk flag	RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);	DBGPRINT_RAW(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);	DBGPRINT_RAW(RT_DEBUG_INFO, "--->RTUSBBulkOutMLMEPacket\n");	// 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;	}		DBGPRINT_RAW(RT_DEBUG_INFO, "<---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	IrqFlags;		NdisAcquireSpinLock(&pAd->BulkOutLock[0], IrqFlags);	if (pAd->BulkOutPending[0] == TRUE)	{		NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);		return;	}	pAd->BulkOutPending[0] = TRUE;	NdisReleaseSpinLock(&pAd->BulkOutLock[0], IrqFlags);	DBGPRINT_RAW(RT_DEBUG_INFO, "--->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;	}		DBGPRINT_RAW(RT_DEBUG_INFO, "<---RTUSBBulkOutPsPoll \n");	return;}void dump_urb(struct urb* purb){	printk("urb                  :0x%08lx\n", (unsigned long)purb);	printk("\tdev                   :0x%08lx\n", (unsigned long)purb->dev);	printk("\t\tdev->state          :0x%d\n", purb->dev->state);	printk("\tpipe                  :0x%08x\n", purb->pipe);	printk("\tstatus                :%d\n", purb->status);	printk("\ttransfer_flags        :0x%08x\n", purb->transfer_flags);	printk("\ttransfer_buffer       :0x%08lx\n", (unsigned long)purb->transfer_buffer);	printk("\ttransfer_buffer_length:%d\n", purb->transfer_buffer_length);	printk("\tactual_length         :%d\n", purb->actual_length);	printk("\tsetup_packet          :0x%08lx\n", (unsigned long)purb->setup_packet);	printk("\tstart_frame           :%d\n", purb->start_frame);	printk("\tnumber_of_packets     :%d\n", purb->number_of_packets);	printk("\tinterval              :%d\n", purb->interval);	printk("\terror_count           :%d\n", purb->error_count);	printk("\tcontext               :0x%08lx\n", (unsigned long)purb->context);	printk("\tcomplete              :0x%08lx\n", (unsigned long)purb->complete);	//printk("\tuse_count			:0x%d\n\n",purb->use_count);}/*	========================================================================	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;	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)))	{		return;	}	DBGPRINT(RT_DEBUG_INFO,"RTUSBBulkReceive:: pAd->NextRxBulkInIndex = %d\n",pAd->NextRxBulkInIndex);  	pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]);	pRxContext->InUse = TRUE;	pAd->NextRxBulkInIndex = (pAd->NextRxBulkInIndex + 1) % RX_RING_SIZE;		atomic_set(&pRxContext->IrpLock, IRPLOCK_CANCELABLE);		// Init Rx context descriptor	NdisZeroMemory(pRxContext->TransferBuffer, BUFFER_SIZE);	RTUSBInitRxDesc(pAd, pRxContext);		pUrb = pRxContext->pUrb;	if((ret = rtusb_submit_urb(pUrb))!=0)	{		DBGPRINT(RT_DEBUG_ERROR,"Submit Rx URB failed %d\n", ret);		return;	}	atomic_inc(&pAd->PendingRx);	return;}VOID RTUSBBulkRxHandle(	IN unsigned long data){	purbb_t 		pUrb = (purbb_t)data;	PRTMP_ADAPTER	pAd;	PRX_CONTEXT 	pRxContext;	pRxContext = (PRX_CONTEXT)pUrb->context;	pAd = pRxContext->pAd;	/* device had been closed */	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)) 		return;	if(pUrb->status != 0)	{		RTUSBBulkReceive(pAd);		return;	}	RTUSBRxPacket(data);	return;}/*	========================================================================		Routine Description:	Arguments:	Return Value:	Note:

⌨️ 快捷键说明

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