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

📄 rtmp_init.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
		pAd->TxRingTotalNumber[i]	= 0;		pAd->NextBulkOutIndex[i]	= 0;		// Next Local tx ring pointer waiting for buck out		pAd->BulkOutPending[i]		= FALSE;	// Buck Out control flag		}		pAd->PrivateInfo.TxRingFullCnt = 0;		pAd->NextRxBulkInIndex	   = 0;	// Rx Bulk pointer	pAd->NextMLMEIndex		   = 0;	pAd->PushMgmtIndex		   = 0;	pAd->PopMgmtIndex		   = 0;	atomic_set(&pAd->MgmtQueueSize, 0);	atomic_set(&pAd->TxCount, 0);		pAd->PrioRingFirstIndex    = 0;	pAd->PrioRingTxCnt		   = 0;		do	{				//		// TX_RING_SIZE		//		for (acidx = 0; acidx < 4; acidx++)		{			for ( i= 0; i < TX_RING_SIZE; i++ )			{				PTX_CONTEXT pTxContext = &(pAd->TxContext[acidx][i]);							//Allocate URB				pTxContext->pUrb = RT_USB_ALLOC_URB(0);				if(pTxContext->pUrb == NULL){					Status = NDIS_STATUS_RESOURCES;					goto done;				}				pTxContext->TransferBuffer= (PTX_BUFFER) kmalloc(sizeof(TX_BUFFER), GFP_KERNEL);				Status = NDIS_STATUS_SUCCESS;				if(!pTxContext->TransferBuffer){					DBGPRINT(RT_DEBUG_ERROR,"Not enough memory\n");					Status = NDIS_STATUS_RESOURCES;					goto out1;				}				NdisZeroMemory(pTxContext->TransferBuffer, sizeof(TX_BUFFER));				pTxContext->pAd = pAd;				pTxContext->InUse = FALSE;				pTxContext->IRPPending = FALSE;			}		}				//		// PRIO_RING_SIZE		//		for ( i= 0; i < PRIO_RING_SIZE; i++ )		{			PTX_CONTEXT	pMLMEContext = &(pAd->MLMEContext[i]);						pMLMEContext->pUrb = RT_USB_ALLOC_URB(0);			if(pMLMEContext->pUrb == NULL){				Status = NDIS_STATUS_RESOURCES;				goto out1;			}						pMLMEContext->TransferBuffer= (PTX_BUFFER) kmalloc(sizeof(TX_BUFFER), GFP_KERNEL);			if(!pMLMEContext->TransferBuffer){				DBGPRINT(RT_DEBUG_ERROR,"Not enough memory\n");				Status = NDIS_STATUS_RESOURCES;				goto out2;			}						NdisZeroMemory(pMLMEContext->TransferBuffer, sizeof(TX_BUFFER));			pMLMEContext->pAd = pAd ;			pMLMEContext->InUse = FALSE;			pMLMEContext->IRPPending = FALSE;		}						//		// BEACON_RING_SIZE		//		for (i = 0; i < BEACON_RING_SIZE; i++)		{			PTX_CONTEXT	pBeaconContext = &(pAd->BeaconContext[i]);			pBeaconContext->pUrb = RT_USB_ALLOC_URB(0);			if(pBeaconContext->pUrb == NULL){				Status = NDIS_STATUS_RESOURCES;				goto out2;			}						pBeaconContext->TransferBuffer= (PTX_BUFFER) kmalloc(sizeof(TX_BUFFER), GFP_KERNEL);			if(!pBeaconContext->TransferBuffer){				DBGPRINT(RT_DEBUG_ERROR,"Not enough memory\n");				Status = NDIS_STATUS_RESOURCES;				goto out3;			}			NdisZeroMemory(pBeaconContext->TransferBuffer, sizeof(TX_BUFFER));			pBeaconContext->pAd = pAd;			pBeaconContext->InUse = FALSE;			pBeaconContext->IRPPending = FALSE;		}						//		// NullContext		//		pNullContext->pUrb = RT_USB_ALLOC_URB(0);		if(pNullContext->pUrb == NULL){			Status = NDIS_STATUS_RESOURCES;			goto out3;		}		 				pNullContext->TransferBuffer= (PTX_BUFFER) kmalloc(sizeof(TX_BUFFER), GFP_KERNEL);		if(!pNullContext->TransferBuffer){			DBGPRINT(RT_DEBUG_ERROR,"Not enough memory\n");			Status = NDIS_STATUS_RESOURCES;			goto out4;		}		NdisZeroMemory(pNullContext->TransferBuffer, sizeof(TX_BUFFER));		pNullContext->pAd = pAd;		pNullContext->InUse = FALSE;		pNullContext->IRPPending = FALSE;						//		// RTSContext		//		pRTSContext->pUrb = RT_USB_ALLOC_URB(0);		if(pRTSContext->pUrb == NULL){			Status = NDIS_STATUS_RESOURCES;			goto out4;		}		 				pRTSContext->TransferBuffer= (PTX_BUFFER) kmalloc(sizeof(TX_BUFFER), GFP_KERNEL);		if(!pRTSContext->TransferBuffer){			DBGPRINT(RT_DEBUG_ERROR,"Not enough memory\n");			Status = NDIS_STATUS_RESOURCES;			goto out5;		}		NdisZeroMemory(pRTSContext->TransferBuffer, sizeof(TX_BUFFER));		pRTSContext->pAd = pAd;		pRTSContext->InUse = FALSE;		pRTSContext->IRPPending = FALSE; 		//		// PsPollContext		// 		pPsPollContext->pUrb = RT_USB_ALLOC_URB(0);		if(pPsPollContext->pUrb == NULL){			Status = NDIS_STATUS_RESOURCES;			goto out5;		}		 				pPsPollContext->TransferBuffer= (PTX_BUFFER) kmalloc(sizeof(TX_BUFFER), GFP_KERNEL);		if(!pPsPollContext->TransferBuffer){			DBGPRINT(RT_DEBUG_ERROR,"Not enough memory\n");			Status = NDIS_STATUS_RESOURCES;			goto out6;		}		NdisZeroMemory(pPsPollContext->TransferBuffer, sizeof(TX_BUFFER));		pPsPollContext->pAd = pAd;		pPsPollContext->InUse = FALSE;		pPsPollContext->IRPPending = FALSE;	}  while (FALSE);		return Status;out6:		if (NULL != pPsPollContext->pUrb)	{		RTUSB_UNLINK_URB(pPsPollContext->pUrb);		usb_free_urb(pPsPollContext->pUrb);		pPsPollContext->pUrb = NULL;	}	if (NULL != pPsPollContext->TransferBuffer)	{		kfree(pPsPollContext->TransferBuffer);		pPsPollContext->TransferBuffer = NULL;	}out5:	if (NULL != pRTSContext->pUrb)	{		RTUSB_UNLINK_URB(pRTSContext->pUrb);		usb_free_urb(pRTSContext->pUrb);		pRTSContext->pUrb = NULL;	}	if (NULL != pRTSContext->TransferBuffer)	{		kfree(pRTSContext->TransferBuffer);		pRTSContext->TransferBuffer = NULL;	}	out4:		if (NULL != pNullContext->pUrb)	{		RTUSB_UNLINK_URB(pNullContext->pUrb);		usb_free_urb(pNullContext->pUrb);		pNullContext->pUrb = NULL;	}	if (NULL != pNullContext->TransferBuffer)	{		kfree(pNullContext->TransferBuffer);		pNullContext->TransferBuffer = NULL;	}out3:		for (i = 0; i < BEACON_RING_SIZE; i++)	{		PTX_CONTEXT	pBeaconContext = &(pAd->BeaconContext[i]);		if ( NULL != pBeaconContext->pUrb )		{			RTUSB_UNLINK_URB(pBeaconContext->pUrb);			usb_free_urb(pBeaconContext->pUrb);			pBeaconContext->pUrb = NULL;		}				if ( NULL != pBeaconContext->TransferBuffer )		{			kfree( pBeaconContext->TransferBuffer);			pBeaconContext->TransferBuffer = NULL;		}	}out2:		for ( i= 0; i < PRIO_RING_SIZE; i++ )	{		PTX_CONTEXT pMLMEContext = &(pAd->MLMEContext[i]);				if ( NULL != pMLMEContext->pUrb )		{			RTUSB_UNLINK_URB(pMLMEContext->pUrb);			usb_free_urb(pMLMEContext->pUrb);			pMLMEContext->pUrb = NULL;		}				if ( NULL != pMLMEContext->TransferBuffer )		{			kfree( pMLMEContext->TransferBuffer);			pMLMEContext->TransferBuffer = NULL;		}	}out1:	for (acidx = 0; acidx < 4; acidx++)	{		for ( i= 0; i < TX_RING_SIZE; i++ )		{			PTX_CONTEXT pTxContext = &(pAd->TxContext[acidx][i]);			if ( NULL != pTxContext->pUrb )			{				RTUSB_UNLINK_URB(pTxContext->pUrb);				usb_free_urb(pTxContext->pUrb);				pTxContext->pUrb = NULL;			}			if ( NULL != pTxContext->TransferBuffer )			{				kfree( pTxContext->TransferBuffer);				pTxContext->TransferBuffer = NULL;			}		}	}	done:	return Status;}/*	========================================================================		Routine Description:		Initialize receive data structures	Arguments:		Adapter 					Pointer to our adapter	Return Value:		NDIS_STATUS_SUCCESS		NDIS_STATUS_RESOURCES	Note:		Initialize all receive releated private buffer, include those define		in RTMP_ADAPTER structure and all private data structures. The mahor		work is to allocate buffer for each packet and chain buffer to 		NDIS packet descriptor.			========================================================================*/NDIS_STATUS NICInitRecv(	IN	PRTMP_ADAPTER	pAd){	UCHAR	i;	NDIS_STATUS 	Status = NDIS_STATUS_SUCCESS;	DBGPRINT(RT_DEBUG_TRACE,"--> NICInitRecv\n");	pAd->NextRxBulkInIndex = 0;	atomic_set( &pAd->PendingRx, 0);	for (i = 0; i < RX_RING_SIZE; i++)	{		PRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);		pRxContext->pUrb = RT_USB_ALLOC_URB(0);		if(pRxContext->pUrb == NULL)		{			Status = NDIS_STATUS_RESOURCES;			DBGPRINT(RT_DEBUG_TRACE,"--> pRxContext->pUrb == NULL\n");			break;		}								pRxContext->TransferBuffer= (PUCHAR) kmalloc(BUFFER_SIZE, MEM_ALLOC_FLAG);		if(!pRxContext->TransferBuffer)		{			DBGPRINT(RT_DEBUG_ERROR,"Not enough memory\n");			Status = NDIS_STATUS_RESOURCES;			break;		}			NdisZeroMemory(pRxContext->TransferBuffer, BUFFER_SIZE);				pRxContext->pAd	= pAd;		pRxContext->InUse = FALSE;		pRxContext->IRPPending	= FALSE;	}	DBGPRINT(RT_DEBUG_TRACE,"<-- NICInitRecv\n");		return Status;}////////////////////////////////////////////////////////////////////////////////	FUNCTION//		ReleaseAdapter////	DESCRIPTION//		Calls USB_InterfaceStop and frees memory allocated for the URBs//		calls NdisMDeregisterDevice and frees the memory//		allocated in VNetInitialize for the Adapter Object//		//	INPUT//		Adapter 	Pointer to RTMP_ADAPTER structure////	OUTPUT//		-//		////////////////////////////////////////////////////////////////////////////VOID ReleaseAdapter(	IN	PRTMP_ADAPTER pAd,     IN  BOOLEAN         IsFree,	IN  BOOLEAN         IsOnlyTx) {	UINT			i, acidx;	PTX_CONTEXT		pNullContext   = &pAd->NullContext;	PTX_CONTEXT		pPsPollContext = &pAd->PsPollContext;	PTX_CONTEXT 	pRTSContext    = &pAd->RTSContext;	DBGPRINT(RT_DEBUG_TRACE, "---> ReleaseAdapter\n");	    if (!IsOnlyTx)    {	    // Free all resources for the RECEIVE buffer queue.	    for (i = 0; i < RX_RING_SIZE; i++)	    {		    PRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);		    if (pRxContext->pUrb != NULL)		    {			    RTUSB_UNLINK_URB(pRxContext->pUrb);			    if (IsFree)			    usb_free_urb(pRxContext->pUrb);			    pRxContext->pUrb = NULL;		    }		    if (pRxContext->TransferBuffer != NULL)		    {			    kfree(pRxContext->TransferBuffer); 			    pRxContext->TransferBuffer = NULL;		    }	    }    }	// Free PsPoll frame resource	if (NULL != pPsPollContext->pUrb)	{		RTUSB_UNLINK_URB(pPsPollContext->pUrb);		if (IsFree)		usb_free_urb(pPsPollContext->pUrb);		pPsPollContext->pUrb = NULL;	}	if (NULL != pPsPollContext->TransferBuffer)	{		kfree(pPsPollContext->TransferBuffer);		pPsPollContext->TransferBuffer = NULL;	}		// Free NULL frame resource	if (NULL != pNullContext->pUrb)	{		RTUSB_UNLINK_URB(pNullContext->pUrb);		if (IsFree)		usb_free_urb(pNullContext->pUrb);		pNullContext->pUrb = NULL;	}	if (NULL != pNullContext->TransferBuffer)	{		kfree(pNullContext->TransferBuffer);		pNullContext->TransferBuffer = NULL;	}		// Free RTS frame resource	if (NULL != pRTSContext->pUrb)	{		RTUSB_UNLINK_URB(pRTSContext->pUrb);		if (IsFree)		usb_free_urb(pRTSContext->pUrb);		pRTSContext->pUrb = NULL;	}	if (NULL != pRTSContext->TransferBuffer)	{		kfree(pRTSContext->TransferBuffer);

⌨️ 快捷键说明

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