VOID AndesFreeCmdMsg(struct cmd_msg *msg) { #if defined(RTMP_USB_SUPPORT) || defined(RTMP_SDIO_SUPPORT) PNDIS_PACKET net_pkt = msg->net_pkt; #endif RTMP_ADAPTER *ad = (RTMP_ADAPTER *)(msg->priv); struct MCU_CTRL *ctl = &ad->MCUCtrl; if (msg->need_wait) { RTMP_OS_EXIT_COMPLETION(&msg->ack_done); } #ifdef RTMP_SDIO_SUPPORT RTMP_OS_EXIT_COMPLETION(&msg->tx_sdio_done); #endif os_free_mem(NULL, msg); #if defined(RTMP_USB_SUPPORT) || defined(RTMP_SDIO_SUPPORT) if (net_pkt) RTMPFreeNdisPacket(ad, net_pkt); #endif ctl->free_cmd_msg++; }
struct cmd_msg *AndesAllocCmdMsg(RTMP_ADAPTER *ad, unsigned int length) { struct cmd_msg *msg = NULL; RTMP_CHIP_CAP *cap = &ad->chipCap; struct MCU_CTRL *ctl = &ad->MCUCtrl; PNDIS_PACKET net_pkt = NULL; INT32 AllocateSize = cap->cmd_header_len + length + cap->cmd_padding_len; #ifdef RTMP_SDIO_SUPPORT if (AllocateSize >= ad->BlockSize) AllocateSize = (AllocateSize + ((-AllocateSize) & (ad->BlockSize - 1))); #endif net_pkt = RTMP_AllocateFragPacketBuffer(ad, AllocateSize); if (!net_pkt) { DBGPRINT(RT_DEBUG_ERROR, ("can not allocate net_pkt\n")); goto error0; } if ((ctl->Stage == FW_NO_INIT) || (ctl->Stage == FW_DOWNLOAD) || (ctl->Stage == ROM_PATCH_DOWNLOAD)) OS_PKT_RESERVE(net_pkt, cap->cmd_header_len); else if (ctl->Stage == FW_RUN_TIME) OS_PKT_RESERVE(net_pkt, sizeof(FW_TXD *)); os_alloc_mem(NULL, (PUCHAR *)&msg, sizeof(*msg)); if (!msg) { DBGPRINT(RT_DEBUG_ERROR, ("can not allocate cmd msg\n")); goto error1; } CMD_MSG_CB(net_pkt)->msg = msg; memset(msg, 0x00, sizeof(*msg)); msg->priv = (void *)ad; msg->net_pkt = net_pkt; ctl->alloc_cmd_msg++; return msg; os_free_mem(NULL, msg); error1: RTMPFreeNdisPacket(ad, net_pkt); error0: return NULL; }
struct cmd_msg *AndesAllocCmdMsg(RTMP_ADAPTER *ad, unsigned int length) { struct cmd_msg *msg = NULL; RTMP_CHIP_CAP *cap = &ad->chipCap; struct MCU_CTRL *ctl = &ad->MCUCtrl; PNDIS_PACKET net_pkt = NULL; INT32 AllocateSize = cap->cmd_header_len + length + cap->cmd_padding_len; net_pkt = RTMP_AllocateFragPacketBuffer(ad, AllocateSize); if (!net_pkt) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("can not allocate net_pkt\n")); goto error0; } OS_PKT_RESERVE(net_pkt, cap->cmd_header_len); os_alloc_mem(NULL, (PUCHAR *)&msg, sizeof(*msg)); if (!msg) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("can not allocate cmd msg\n")); goto error1; } CMD_MSG_CB(net_pkt)->msg = msg; memset(msg, 0x00, sizeof(*msg)); msg->priv = (void *)ad; msg->net_pkt = net_pkt; ctl->alloc_cmd_msg++; return msg; os_free_mem(NULL, msg); error1: RTMPFreeNdisPacket(ad, net_pkt); error0: return NULL; }
VOID AndesForceFreeCmdMsg(struct cmd_msg *msg) { PNDIS_PACKET net_pkt = msg->net_pkt; RTMP_ADAPTER *ad = (RTMP_ADAPTER *)(msg->priv); struct MCU_CTRL *ctl = &ad->MCUCtrl; if (msg->need_wait) { RTMP_OS_EXIT_COMPLETION(&msg->ack_done); } os_free_mem(NULL, msg); if (net_pkt) RTMPFreeNdisPacket(ad, net_pkt); ctl->free_cmd_msg++; }
INT wdev_bcn_buf_deinit(RTMP_ADAPTER *pAd, BCN_BUF_STRUC *bcn_info) { #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) { if (bcn_info->bcn_state != BCN_TX_IDLE) { DBGPRINT(RT_DEBUG_ERROR, ("%s(): Bcn not in idle(%d) when try to free it!\n", __FUNCTION__, bcn_info->bcn_state)); return FALSE; } bcn_info->bcn_state = BCN_TX_STOP; } #endif /* MT_MAC */ if (bcn_info->BeaconPkt) { RTMPFreeNdisPacket(pAd, bcn_info->BeaconPkt); bcn_info->BeaconPkt = NULL; } return TRUE; }
/* ======================================================================== Routine Description: Calls USB_InterfaceStop and frees memory allocated for the URBs calls NdisMDeregisterDevice and frees the memory allocated in VNetInitialize for the Adapter Object Arguments: *pAd the raxx interface data pointer Return Value: None Note: ======================================================================== */ 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")); }
static void rt2870_mgmt_dma_done_tasklet(unsigned long data) { PRTMP_ADAPTER pAd; PTX_CONTEXT pMLMEContext; int index; PNDIS_PACKET pPacket; purbb_t pUrb; NTSTATUS Status; unsigned long IrqFlags; pUrb = (purbb_t)data; pMLMEContext = (PTX_CONTEXT)pUrb->context; pAd = pMLMEContext->pAd; Status = pUrb->status; index = pMLMEContext->SelfIdx; ASSERT((pAd->MgmtRing.TxDmaIdx == index)); RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags); if (Status != USB_ST_NOERROR) { //Bulk-Out fail status handle if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) { DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out MLME Failed, Status=%d!\n", Status)); // TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt? RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG); } } pAd->BulkOutPending[MGMTPIPEIDX] = FALSE; RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags); RTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags); // Reset MLME context flags pMLMEContext->IRPPending = FALSE; pMLMEContext->InUse = FALSE; pMLMEContext->bWaitingBulkOut = FALSE; pMLMEContext->BulkOutSize = 0; pPacket = pAd->MgmtRing.Cell[index].pNdisPacket; pAd->MgmtRing.Cell[index].pNdisPacket = NULL; // Increase MgmtRing Index INC_RING_INDEX(pAd->MgmtRing.TxDmaIdx, MGMT_RING_SIZE); pAd->MgmtRing.TxSwFreeIdx++; RTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags); // No-matter success or fail, we free the mgmt packet. if (pPacket) RTMPFreeNdisPacket(pAd, pPacket); if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)))) { // do nothing and return directly. } else { if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET) && ((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG)) { // For Mgmt Bulk-Out failed, ignore it now. RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); } else { // Always call Bulk routine, even reset bulk. // The protectioon of rest bulk should be in BulkOut routine if (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */) { RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME); } RTUSBKickBulkOut(pAd); } } }