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

📄 rtusb_init.c

📁 台湾RALink公司的 rt2570无线 802.11g 网卡的 驱动的源代码 ,支持linux2.4以上的 内河
💻 C
📖 第 1 页 / 共 5 页
字号:
		1:			memory are equal
		0:			memory are not equal

	Note:
		
	========================================================================
*/
ULONG	RTMPEqualMemory(
	IN	PVOID	pSrc1,
	IN	PVOID	pSrc2,
	IN	ULONG	Length)
{
	PUCHAR	pMem1;
	PUCHAR	pMem2;
	ULONG	Index = 0;

	pMem1 = (PUCHAR) pSrc1;
	pMem2 = (PUCHAR) pSrc2;

	for (Index = 0; Index < Length; Index++)
	{
		if (pMem1[Index] != pMem2[Index])
		{
			break;
		}
	}

	if (Index == Length)
	{
		return (1);
	}
	else
	{
		return (0);
	}
}
/*
	========================================================================
	
	Routine Description:
		Compare two memory block

	Arguments:
		Adapter						Pointer to our adapter

	Return Value:
		0:			memory is equal
		1:			pSrc1 memory is larger
		2:			pSrc2 memory is larger

	Note:
		
	========================================================================
*/
ULONG	RTMPCompareMemory(
	IN	PVOID	pSrc1,
	IN	PVOID	pSrc2,
	IN	ULONG	Length)
{
	PUCHAR	pMem1;
	PUCHAR	pMem2;
	ULONG	Index = 0;

	pMem1 = (PUCHAR) pSrc1;
	pMem2 = (PUCHAR) pSrc2;

	for (Index = 0; Index < Length; Index++)
	{
		if (pMem1[Index] > pMem2[Index])
			return (1);
		else if (pMem1[Index] < pMem2[Index])
			return (2);
	}

	// Equal
	return (0);
}

/*
	========================================================================
	
	Routine Description:

	Arguments:

	Return Value:

	Note:
		
	========================================================================
*/
VOID	RTMPZeroMemory(
	IN	PVOID	pSrc,
	IN	ULONG	Length)
{
	PUCHAR	pMem;
	ULONG	Index = 0;

	pMem = (PUCHAR) pSrc;

	for (Index = 0; Index < Length; Index++)
	{
		pMem[Index] = 0x00;
	}
}


/*
	========================================================================
	
	Routine Description:

	Arguments:

	Return Value:

	Note:
		
	========================================================================
*/
VOID	RTMPFillMemory(
	IN	PVOID	pSrc,
	IN	ULONG	Length,
	IN	UCHAR	Fill)
{
	PUCHAR	pMem;
	ULONG	Index = 0;

	pMem = (PUCHAR) pSrc;

	for (Index = 0; Index < Length; Index++)
	{
		pMem[Index] = Fill;
	}
}

/*
	========================================================================
	
	Routine Description:

	Arguments:

	Return Value:

	Note:
		
	========================================================================
*/
VOID	RTMPMoveMemory(
	OUT	PVOID	pDest,
	IN	PVOID	pSrc,
	IN	ULONG	Length)
{
	PUCHAR	pMem1;
	PUCHAR	pMem2;
	ULONG	Index = 0;

	pMem1 = (PUCHAR) pDest;
	pMem2 = (PUCHAR) pSrc;

	for (Index = 0; Index < Length; Index++)
	{
		pMem1[Index] = pMem2[Index];
	}
}

VOID CreateThreads( struct net_device *net_dev )
{
	PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) net_dev->priv;

	// Creat MLME Thread
	pAdapter->MLMEThr_pid= -1;

	pAdapter->MLMEThr_pid = kernel_thread(MlmeThread, pAdapter, CLONE_VM);
	if (pAdapter->MLMEThr_pid < 0) {
		printk (KERN_WARNING "%s: unable to start mlme thread\n",pAdapter->net->name);
	}

	// Creat Command Thread
	pAdapter->RTUSBCmdThr_pid= -1;

	pAdapter->RTUSBCmdThr_pid = kernel_thread(RTUSBCmdThread, pAdapter, CLONE_VM);
	if (pAdapter->RTUSBCmdThr_pid < 0) {
		printk (KERN_WARNING "%s: unable to start RTUSBCmd thread\n",pAdapter->net->name);
	}

	/* Wait for the thread to start */
	//wait_for_completion(&(pAdapter->notify));

}
NDIS_STATUS RTMPAllocAdapterBlock( PRT2570ADAPTER	*ppAdapter	)
{
	NDIS_STATUS 	Status=NDIS_STATUS_SUCCESS;

#if 0
	PRT2570ADAPTER	pAdapter;
	DBGPRINT(RT_DEBUG_TRACE,"--> RTMPAllocAdapterBlock\n");

	*ppAdapter = NULL;

	do
	{
		pAdapter = (PRT2570ADAPTER) kmalloc(sizeof(RT2570ADAPTER), GFP_KERNEL);
		
		if (!pAdapter) {
			DBGPRINT(RT_DEBUG_ERROR,"Not enough memory\n");
			Status = NDIS_STATUS_RESOURCES;
			break;
		}

		
		memset((PUCHAR) pAdapter, 0, sizeof(RT2570ADAPTER));
		
	} while (FALSE);

	*ppAdapter = pAdapter;

	DBGPRINT(RT_DEBUG_ERROR,"<-- RTMPAllocAdapterBlock, Status=%x\n", Status);
#endif
	return Status;
}


NDIS_STATUS NICInitTransmit(  PRT2570ADAPTER	 pAdapter )
{
	UCHAR	i;
	NDIS_STATUS 	Status = NDIS_STATUS_SUCCESS;
	PTX_CONTEXT	pPsPollContext = &(pAdapter->PsPollContext);
	PTX_CONTEXT	pNullContext = &(pAdapter->NullContext);

	DBGPRINT(RT_DEBUG_TRACE,"--> NICInitTransmit\n");

	// Initialize all Transmit releated queues
	InitializeQueueHeader(&pAdapter->SendTxWaitQueue);
	
	// Init Ring index pointer
	pAdapter->NextRxBulkInIndex			= 0;
	pAdapter->NextTxIndex			= 0;
	pAdapter->NextBulkOutIndex		= 0;	// Next Local tx ring pointer waiting for buck out
	pAdapter->NextMLMEIndex 		= 0;
	pAdapter->PushMgmtIndex 	   = 0;
	pAdapter->PopMgmtIndex		   = 0;
	atomic_set(&pAdapter->MgmtQueueSize,0);
	pAdapter->BulkOutPending	= FALSE;	
	pAdapter->PrioRingFirstIndex	= 0;
	pAdapter->PrioRingTxCnt 		= 0;

	do
	{
		for ( i= 0; i < TX_RING_SIZE; i++ )
		{
			PTX_CONTEXT pTxContext = &(pAdapter->TxContext[i]);
			
			//Allocate URB
			pTxContext->pUrb = RT2570_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->pAdapter = pAdapter;
			pTxContext->InUse = FALSE;
			pTxContext->IRPPending = FALSE;
		}
		
		for ( i= 0; i < PRIO_RING_SIZE; i++ )
		{
			PTX_CONTEXT	pMLMEContext = &(pAdapter->MLMEContext[i]);
			
			pMLMEContext->pUrb = RT2570_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->pAdapter = pAdapter;
			pMLMEContext->InUse = FALSE;
			pMLMEContext->IRPPending = FALSE;
		}

		for (i = 0; i < BEACON_RING_SIZE; i++)
		{
			PTX_CONTEXT	pBeaconContext = &(pAdapter->BeaconContext[i]);
			pBeaconContext->pUrb = RT2570_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->pAdapter = pAdapter;
			pBeaconContext->InUse = FALSE;
			pBeaconContext->IRPPending = FALSE;
		}

		pNullContext->pUrb = RT2570_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->pAdapter = pAdapter;
		pNullContext->InUse = FALSE;
		pNullContext->IRPPending = FALSE;

		pPsPollContext->pUrb = RT2570_USB_ALLOC_URB(0);
		if(pPsPollContext->pUrb == NULL){
			Status = NDIS_STATUS_RESOURCES;
			goto out4;
		}		 
		
		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 out5;
		}

		NdisZeroMemory(pPsPollContext->TransferBuffer, sizeof(TX_BUFFER));
		pPsPollContext->pAdapter = pAdapter;
		pPsPollContext->InUse = FALSE;
		pPsPollContext->IRPPending = FALSE;

#if 0					

		//Allocate URB
		pWpaPskContext->pUrb = RT2570_USB_ALLOC_URB(0);
		if(pWpaPskContext->pUrb == NULL){
			Status = NDIS_STATUS_RESOURCES;
			goto done;
		}
			
			
	
		pWpaPskContext->TransferBuffer= (PWPAPSK_BUFFER) kmalloc(sizeof(WPAPSK_BUFFER), GFP_KERNEL);
		Status = NDIS_STATUS_SUCCESS;
		if(!pWpaPskContext->TransferBuffer){
			DBGPRINT(RT_DEBUG_ERROR,"Not enough memory\n");
			Status = NDIS_STATUS_RESOURCES;
			goto done;
		}

		NdisZeroMemory(pWpaPskContext->TransferBuffer, sizeof(WPAPSK_BUFFER));

		pWpaPskContext->pAdapter = pAdapter;
		pWpaPskContext->InUse = FALSE;
		pWpaPskContext->IRPPending = FALSE;
#endif


#ifdef TEST_MODE_SUPPORT
		Status = RT2570AllocateMemory(&(pAdapter->pTxUrb), sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
		if ((Status != NDIS_STATUS_SUCCESS) || (pAdapter->pTxUrb == NULL))
		{
			Status = NDIS_STATUS_RESOURCES;
			goto done;
		}
		Status = RT2570AllocateMemory(&(pAdapter->TxBuffer), BUFFER_SIZE);
		if ((Status != NDIS_STATUS_SUCCESS) || (pAdapter->TxBuffer == NULL))
		{
			Status = NDIS_STATUS_RESOURCES;
			goto done;
		}
		NdisZeroMemory(pAdapter->TxBuffer, BUFFER_SIZE);
		stackSize = pAdapter->pNextDeviceObject->StackSize + 1;
		pAdapter->pTxIrp = IoAllocateIrp(stackSize, FALSE);
#endif
	}
	while (FALSE);

	return Status;

out5:	
	if (NULL != pPsPollContext->pUrb)
	{
		usb_unlink_urb(pPsPollContext->pUrb);
		usb_free_urb(pPsPollContext->pUrb);
		pPsPollContext->pUrb = NULL;
	}
	if (NULL != pPsPollContext->TransferBuffer)
	{
		FreeMemory(pPsPollContext->TransferBuffer);
		pPsPollContext->TransferBuffer = NULL;
	}

⌨️ 快捷键说明

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