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 + -
显示快捷键?