2870_rtmp_init.c

来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 1,759 行 · 第 1/4 页

C
1,759
字号
	for(acidx=0; acidx<4; acidx++)#endif // CONFIG_STA_SUPPORT //	{		PHT_TX_CONTEXT pTxContext = &(pAd->TxContext[acidx]);		if (pTxContext)			LM_URB_FREE(pObj, pTxContext, sizeof(HTTX_BUFFER));	}	// Here we didn't have any pre-allocated memory need to free.		return Status;	}/*========================================================================Routine Description:    Allocate DMA memory blocks for send, receive.Arguments:    pAd					Pointer to our adapterReturn Value:	NDIS_STATUS_SUCCESS	NDIS_STATUS_FAILURE	NDIS_STATUS_RESOURCESNote:========================================================================*/NDIS_STATUS	RTMPAllocTxRxRingMemory(	IN	PRTMP_ADAPTER	pAd){//	COUNTER_802_11	pCounter = &pAd->WlanCounters;	NDIS_STATUS		Status;	INT				num;		DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocTxRxRingMemory\n"));	do	{		// Init the CmdQ and CmdQLock		NdisAllocateSpinLock(&pAd->CmdQLock);			NdisAcquireSpinLock(&pAd->CmdQLock);		RTUSBInitializeCmdQ(&pAd->CmdQ);		NdisReleaseSpinLock(&pAd->CmdQLock);		NdisAllocateSpinLock(&pAd->MLMEBulkOutLock);		//NdisAllocateSpinLock(&pAd->MLMEWaitQueueLock);		NdisAllocateSpinLock(&pAd->BulkOutLock[0]);		NdisAllocateSpinLock(&pAd->BulkOutLock[1]);		NdisAllocateSpinLock(&pAd->BulkOutLock[2]);		NdisAllocateSpinLock(&pAd->BulkOutLock[3]);				NdisAllocateSpinLock(&pAd->BulkOutLock[4]);		NdisAllocateSpinLock(&pAd->BulkOutLock[5]);		NdisAllocateSpinLock(&pAd->BulkInLock);		for (num = 0; num < NUM_OF_TX_RING; num++)		{			NdisAllocateSpinLock(&pAd->TxContextQueueLock[num]);		}		#ifdef RALINK_ATE		NdisAllocateSpinLock(&pAd->GenericLock);#endif // RALINK_ATE ////		NdisAllocateSpinLock(&pAd->MemLock);	// Not used in RT28XX//		NdisAllocateSpinLock(&pAd->MacTabLock); // init it in UserCfgInit()//		NdisAllocateSpinLock(&pAd->BATabLock); // init it in BATableInit()//		for(num=0; num<MAX_LEN_OF_BA_REC_TABLE; num++)//		{//			NdisAllocateSpinLock(&pAd->BATable.BARecEntry[num].RxReRingLock);//		}		//		// Init Mac Table		////		MacTableInitialize(pAd);		//		// Init send data structures and related parameters		//		Status = NICInitTransmit(pAd);		if (Status != NDIS_STATUS_SUCCESS)			break;		//		// Init receive data structures and related parameters		//		Status = NICInitRecv(pAd);		if (Status != NDIS_STATUS_SUCCESS)			break;		pAd->PendingIoCount = 1;	} while (FALSE);	NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));	pAd->FragFrame.pFragPacket =  RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE);	if (pAd->FragFrame.pFragPacket == NULL)	{		Status = NDIS_STATUS_RESOURCES;	}		DBGPRINT_S(Status, ("<-- RTMPAllocTxRxRingMemory, Status=%x\n", Status));	return Status;}/*========================================================================Routine Description:	Calls USB_InterfaceStop and frees memory allocated for the URBs    calls NdisMDeregisterDevice and frees the memory    allocated in VNetInitialize for the Adapter ObjectArguments:	*pAd				the raxx interface data pointerReturn Value:	NoneNote:========================================================================*/VOID	RTMPFreeTxRxRingMemory(	IN	PRTMP_ADAPTER	pAd){#define LM_URB_FREE(pObj, Context, BufferSize)				\	if (NULL != Context->pUrb) {							\		RTUSB_UNLINK_URB(Context->pUrb);					\		RTUSB_FREE_URB(Context->pUrb);						\		Context->pUrb = NULL; }								\	if (NULL != Context->TransferBuffer) {					\		RTUSB_URB_FREE_BUFFER(pObj->pUsb_Dev, BufferSize,	\								Context->TransferBuffer,	\								Context->data_dma);			\		Context->TransferBuffer = NULL; }	UINT                i, acidx;	PTX_CONTEXT			pNullContext   = &pAd->NullContext;	PTX_CONTEXT			pPsPollContext = &pAd->PsPollContext;	PTX_CONTEXT			pRTSContext    = &pAd->RTSContext;//	PHT_TX_CONTEXT 		pHTTXContext;	//PRTMP_REORDERBUF	pReorderBuf;	POS_COOKIE			pObj = (POS_COOKIE) pAd->OS_Cookie;//	RTMP_TX_RING		*pTxRing;	DBGPRINT(RT_DEBUG_ERROR, ("---> RTMPFreeTxRxRingMemory\n"));	pObj = pObj;	// Free all resources for the RECEIVE buffer queue.	for(i=0; i<(RX_RING_SIZE); i++)	{		PRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);		if (pRxContext)			LM_URB_FREE(pObj, pRxContext, MAX_RXBULK_SIZE);	}	// Free PsPoll frame resource	LM_URB_FREE(pObj, pPsPollContext, sizeof(TX_BUFFER));	// Free NULL frame resource	LM_URB_FREE(pObj, pNullContext, sizeof(TX_BUFFER));	// Free RTS frame resource	LM_URB_FREE(pObj, pRTSContext, sizeof(TX_BUFFER));	// Free beacon frame resource	for(i=0; i<BEACON_RING_SIZE; i++)	{		PTX_CONTEXT	pBeaconContext = &(pAd->BeaconContext[i]);		if (pBeaconContext)			LM_URB_FREE(pObj, pBeaconContext, sizeof(TX_BUFFER));	}	// Free mgmt frame resource	for(i = 0; i < MGMT_RING_SIZE; i++)	{		PTX_CONTEXT pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[i].AllocVa;		//LM_URB_FREE(pObj, pMLMEContext, sizeof(TX_BUFFER));		if (NULL != pAd->MgmtRing.Cell[i].pNdisPacket) 		{			RTMPFreeNdisPacket(pAd, pAd->MgmtRing.Cell[i].pNdisPacket);			pAd->MgmtRing.Cell[i].pNdisPacket = NULL;			pMLMEContext->TransferBuffer = NULL; 		}		if (pMLMEContext)		{			if (NULL != pMLMEContext->pUrb)			{				RTUSB_UNLINK_URB(pMLMEContext->pUrb);				RTUSB_FREE_URB(pMLMEContext->pUrb);				pMLMEContext->pUrb = NULL;			}		}	}	if (pAd->MgmtDescRing.AllocVa)		NdisFreeMemory(pAd->MgmtDescRing.AllocVa, pAd->MgmtDescRing.AllocSize, 0);			// Free Tx frame resource#ifdef CONFIG_STA_SUPPORT		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)		for(acidx=0; acidx<4; acidx++)#endif // CONFIG_STA_SUPPORT //		{		PHT_TX_CONTEXT pHTTXContext = &(pAd->TxContext[acidx]);			if (pHTTXContext)				LM_URB_FREE(pObj, pHTTXContext, sizeof(HTTX_BUFFER));		}		if (pAd->FragFrame.pFragPacket)		RELEASE_NDIS_PACKET(pAd, pAd->FragFrame.pFragPacket, NDIS_STATUS_SUCCESS);	for(i=0; i<6; i++)	{		NdisFreeSpinLock(&pAd->BulkOutLock[i]);	}	NdisFreeSpinLock(&pAd->BulkInLock);	NdisFreeSpinLock(&pAd->MLMEBulkOutLock);	NdisFreeSpinLock(&pAd->CmdQLock);#ifdef RALINK_ATE	NdisFreeSpinLock(&pAd->GenericLock);#endif // RALINK_ATE //	// Clear all pending bulk-out request flags.	RTUSB_CLEAR_BULK_FLAG(pAd, 0xffffffff);	//	NdisFreeSpinLock(&pAd->MacTabLock);//	for(i=0; i<MAX_LEN_OF_BA_REC_TABLE; i++)//	{//		NdisFreeSpinLock(&pAd->BATable.BARecEntry[i].RxReRingLock);//	}	DBGPRINT(RT_DEBUG_ERROR, ("<--- ReleaseAdapter\n"));}/*========================================================================Routine Description:    Allocate memory for adapter control block.Arguments:    pAd					Pointer to our adapterReturn Value:	NDIS_STATUS_SUCCESS	NDIS_STATUS_FAILURE	NDIS_STATUS_RESOURCESNote:========================================================================*/NDIS_STATUS AdapterBlockAllocateMemory(	IN PVOID	handle,	OUT	PVOID	*ppAd){	PUSB_DEV	usb_dev;	POS_COOKIE	pObj = (POS_COOKIE) handle;	usb_dev = pObj->pUsb_Dev;		pObj->MLMEThr_pid		= -1;	pObj->RTUSBCmdThr_pid	= -1;		*ppAd = (PVOID)vmalloc(sizeof(RTMP_ADAPTER));    	if (*ppAd) 	{		NdisZeroMemory(*ppAd, sizeof(RTMP_ADAPTER));		((PRTMP_ADAPTER)*ppAd)->OS_Cookie = handle;		return (NDIS_STATUS_SUCCESS);	} 	else 	{		return (NDIS_STATUS_FAILURE);	}}/*========================================================================Routine Description:    Create kernel threads & tasklets.Arguments:    *net_dev			Pointer to wireless net device interfaceReturn Value:	NDIS_STATUS_SUCCESS	NDIS_STATUS_FAILURENote:========================================================================*/NDIS_STATUS	 CreateThreads( 	IN	struct net_device *net_dev){	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv;	POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;	//init_MUTEX(&(pAd->usbdev_semaphore));		init_MUTEX_LOCKED(&(pAd->mlme_semaphore));	init_completion (&pAd->mlmeComplete);		init_MUTEX_LOCKED(&(pAd->RTUSBCmd_semaphore));	init_completion (&pAd->CmdQComplete);		init_MUTEX_LOCKED(&(pAd->RTUSBTimer_semaphore));	init_completion (&pAd->TimerQComplete);			// Creat MLME Thread	pObj->MLMEThr_pid= -1;	pObj->MLMEThr_pid = kernel_thread(MlmeThread, pAd, CLONE_VM);	if (pObj->MLMEThr_pid < 0) 	{		printk (KERN_WARNING "%s: unable to start Mlme thread\n",pAd->net_dev->name);		return NDIS_STATUS_FAILURE;	}	// Wait for the thread to start	wait_for_completion(&(pAd->mlmeComplete));	// Creat Command Thread	pObj->RTUSBCmdThr_pid= -1;	pObj->RTUSBCmdThr_pid = kernel_thread(RTUSBCmdThread, pAd, CLONE_VM);	if (pObj->RTUSBCmdThr_pid < 0) 	{		printk (KERN_WARNING "%s: unable to start RTUSBCmd thread\n",pAd->net_dev->name);		return NDIS_STATUS_FAILURE;	}	wait_for_completion(&(pAd->CmdQComplete));	pObj->TimerQThr_pid= -1;	pObj->TimerQThr_pid = kernel_thread(TimerQThread, pAd, CLONE_VM);	if (pObj->TimerQThr_pid < 0) 	{		printk (KERN_WARNING "%s: unable to start TimerQThread\n",pAd->net_dev->name);		return NDIS_STATUS_FAILURE;	}	// Wait for the thread to start	wait_for_completion(&(pAd->TimerQComplete));	// Create receive tasklet	tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (ULONG)pAd);	tasklet_init(&pObj->mgmt_dma_done_task, rt2870_mgmt_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->ac0_dma_done_task, rt2870_ac0_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->ac1_dma_done_task, rt2870_ac1_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->ac2_dma_done_task, rt2870_ac2_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->ac3_dma_done_task, rt2870_ac3_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->hcca_dma_done_task, rt2870_hcca_dma_done_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->null_frame_complete_task, rt2870_null_frame_complete_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->rts_frame_complete_task, rt2870_rts_frame_complete_tasklet, (unsigned long)pAd);	tasklet_init(&pObj->pspoll_frame_complete_task, rt2870_pspoll_frame_complete_tasklet, (unsigned long)pAd);		return NDIS_STATUS_SUCCESS;}#ifdef CONFIG_STA_SUPPORT/*========================================================================Routine Description: 	As STA's BSSID is a WC too, it uses shared key table. 	This function write correct unicast TX key to ASIC WCID. 	And we still make a copy in our MacTab.Content[BSSID_WCID].PairwiseKey.	Caller guarantee TKIP/AES always has keyidx = 0. (pairwise key)	Caller guarantee WEP calls this function when set Txkey,  default key index=0~3.Arguments:	pAd 					Pointer to our adapter	pKey					Pointer to the where the key storedReturn Value:	NDIS_SUCCESS			Add key successfullyNote:========================================================================*/VOID	RTMPAddBSSIDCipher(	IN	PRTMP_ADAPTER		pAd,	IN	UCHAR				Aid,	IN	PNDIS_802_11_KEY	pKey,	IN  UCHAR   			CipherAlg){	PUCHAR		pTxMic, pRxMic;	BOOLEAN 	bKeyRSC, bAuthenticator; // indicate the receive SC set by KeyRSC value//	UCHAR		CipherAlg;	UCHAR		i;	ULONG		WCIDAttri;	USHORT	 	offset;	UCHAR		KeyIdx, IVEIV[8];	UINT32		Value;		DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddBSSIDCipher==> Aid = %d\n",Aid));		// Bit 29 of Add-key KeyRSC	bKeyRSC 	   = (pKey->KeyIndex & 0x20000000) ? TRUE : FALSE;	// Bit 28 of Add-key Authenticator	bAuthenticator = (pKey->KeyIndex & 0x10000000) ? TRUE : FALSE;	KeyIdx = (UCHAR)pKey->KeyIndex&0xff;	if (KeyIdx > 4)		return;	if (pAd->MacTab.Content[Aid].PairwiseKey.CipherAlg == CIPHER_TKIP)		{	if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)		{			// for WPA-None Tx, Rx MIC is the same			pTxMic = (PUCHAR) (&pKey->KeyMaterial) + 16;			pRxMic = pTxMic;		}		else if (bAuthenticator == TRUE)		{			pTxMic = (PUCHAR) (&pKey->KeyMaterial) + 16;			pRxMic = (PUCHAR) (&pKey->KeyMaterial) + 24;		}		else		{			pRxMic = (PUCHAR) (&pKey->KeyMaterial) + 16;			pTxMic = (PUCHAR) (&pKey->KeyMaterial) + 24;		}

⌨️ 快捷键说明

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