/*----------------------------------------------------------------------------*/ P_CMD_INFO_T cmdBufAllocateCmdInfo(IN P_ADAPTER_T prAdapter, IN UINT_32 u4Length) { P_CMD_INFO_T prCmdInfo; KAL_SPIN_LOCK_DECLARATION(); DEBUGFUNC("cmdBufAllocateCmdInfo"); ASSERT(prAdapter); KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_RESOURCE); QUEUE_REMOVE_HEAD(&prAdapter->rFreeCmdList, prCmdInfo, P_CMD_INFO_T); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_RESOURCE); if (prCmdInfo) { /* Setup initial value in CMD_INFO_T */ /* Start address of allocated memory */ prCmdInfo->pucInfoBuffer = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, u4Length); if (prCmdInfo->pucInfoBuffer == NULL) { KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_RESOURCE); QUEUE_INSERT_TAIL(&prAdapter->rFreeCmdList, &prCmdInfo->rQueEntry); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_RESOURCE); prCmdInfo = NULL; } else { prCmdInfo->u2InfoBufLen = 0; prCmdInfo->fgIsOid = FALSE; prCmdInfo->fgDriverDomainMCR = FALSE; } } return prCmdInfo; } /* end of cmdBufAllocateCmdInfo() */
/*----------------------------------------------------------------------------*/ P_MSDU_INFO_T cnmMgtPktAlloc(P_ADAPTER_T prAdapter, UINT_32 u4Length) { P_MSDU_INFO_T prMsduInfo; P_QUE_T prQueList; KAL_SPIN_LOCK_DECLARATION(); ASSERT(prAdapter); prQueList = &prAdapter->rTxCtrl.rFreeMsduInfoList; /* Get a free MSDU_INFO_T */ KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); QUEUE_REMOVE_HEAD(prQueList, prMsduInfo, P_MSDU_INFO_T); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); if (prMsduInfo) { prMsduInfo->prPacket = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, u4Length); prMsduInfo->eSrc = TX_PACKET_MGMT; if (prMsduInfo->prPacket == NULL) { KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); QUEUE_INSERT_TAIL(prQueList, &prMsduInfo->rQueEntry); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); prMsduInfo = NULL; } } #if DBG if (prMsduInfo == NULL) { DBGLOG(MEM, WARN, ("\n")); DBGLOG(MEM, WARN, ("MgtDesc#=%ld\n", prQueList->u4NumElem)); #if CFG_DBG_MGT_BUF DBGLOG(MEM, WARN, ("rMgtBufInfo: alloc#=%ld, free#=%ld, null#=%ld\n", prAdapter->rMgtBufInfo.u4AllocCount, prAdapter->rMgtBufInfo.u4FreeCount, prAdapter->rMgtBufInfo.u4AllocNullCount)); #endif DBGLOG(MEM, WARN, ("\n")); } #endif return prMsduInfo; }
/*----------------------------------------------------------------------------*/ VOID cmdBufFreeCmdInfo ( IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo ) { KAL_SPIN_LOCK_DECLARATION(); DEBUGFUNC("cmdBufFreeCmdInfo"); ASSERT(prAdapter); ASSERT(prCmdInfo); if (prCmdInfo) { if (prCmdInfo->pucInfoBuffer) { cnmMemFree(prAdapter, prCmdInfo->pucInfoBuffer); prCmdInfo->pucInfoBuffer = NULL; } KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_RESOURCE); QUEUE_INSERT_TAIL(&prAdapter->rFreeCmdList, &prCmdInfo->rQueEntry); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_RESOURCE); } return; } /* end of cmdBufFreeCmdPacket() */
/*----------------------------------------------------------------------------*/ VOID mboxDestroy ( IN P_ADAPTER_T prAdapter ) { P_MBOX_T prMbox; P_MSG_HDR_T prMsg; UINT_8 i; KAL_SPIN_LOCK_DECLARATION(); ASSERT(prAdapter); for (i = 0; i < MBOX_ID_TOTAL_NUM; i++) { prMbox = &(prAdapter->arMbox[i]); while (!LINK_IS_EMPTY(&prMbox->rLinkHead) ) { KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_MAILBOX); LINK_REMOVE_HEAD(&prMbox->rLinkHead, prMsg, P_MSG_HDR_T); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_MAILBOX); ASSERT(prMsg); cnmMemFree(prAdapter, prMsg); } } }
/*----------------------------------------------------------------------------*/ VOID mboxRcvAllMsg ( IN P_ADAPTER_T prAdapter, ENUM_MBOX_ID_T eMboxId ) { P_MBOX_T prMbox; P_MSG_HDR_T prMsg; KAL_SPIN_LOCK_DECLARATION(); ASSERT(eMboxId < MBOX_ID_TOTAL_NUM); ASSERT(prAdapter); prMbox = &(prAdapter->arMbox[eMboxId]); while (!LINK_IS_EMPTY(&prMbox->rLinkHead) ) { KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_MAILBOX); LINK_REMOVE_HEAD(&prMbox->rLinkHead, prMsg, P_MSG_HDR_T); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_MAILBOX); ASSERT(prMsg); MBOX_HNDL_MSG(prAdapter, prMsg); } }
/*----------------------------------------------------------------------------*/ VOID cnmTimerDestroy ( IN P_ADAPTER_T prAdapter ) { P_ROOT_TIMER prRootTimer; KAL_SPIN_LOCK_DECLARATION(); ASSERT(prAdapter); prRootTimer = &prAdapter->rRootTimer; if (prRootTimer->fgWakeLocked) { KAL_WAKE_UNLOCK(prAdapter, &prRootTimer->rWakeLock); prRootTimer->fgWakeLocked = FALSE; } KAL_WAKE_LOCK_DESTROY(prAdapter, &prRootTimer->rWakeLock); KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TIMER); LINK_INITIALIZE(&prRootTimer->rLinkHead); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TIMER); /* Note: glue layer will be responsible for timer destruction */ return; }
/*----------------------------------------------------------------------------*/ VOID mboxSendMsg(IN P_ADAPTER_T prAdapter, IN ENUM_MBOX_ID_T eMboxId, IN P_MSG_HDR_T prMsg, IN EUNM_MSG_SEND_METHOD_T eMethod) { P_MBOX_T prMbox; KAL_SPIN_LOCK_DECLARATION(); ASSERT(eMboxId < MBOX_ID_TOTAL_NUM); ASSERT(prMsg); ASSERT(prAdapter); prMbox = &(prAdapter->arMbox[eMboxId]); switch (eMethod) { case MSG_SEND_METHOD_BUF: KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_MAILBOX); LINK_INSERT_TAIL(&prMbox->rLinkHead, &prMsg->rLinkEntry); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_MAILBOX); /* to wake up main service thread */ GLUE_SET_EVENT(prAdapter->prGlueInfo); break; case MSG_SEND_METHOD_UNBUF: MBOX_HNDL_MSG(prAdapter, prMsg); break; default: ASSERT(0); break; } }
/*----------------------------------------------------------------------------*/ VOID cnmMgtPktFree ( P_ADAPTER_T prAdapter, P_MSDU_INFO_T prMsduInfo ) { P_QUE_T prQueList; KAL_SPIN_LOCK_DECLARATION(); ASSERT(prAdapter); ASSERT(prMsduInfo); prQueList = &prAdapter->rTxCtrl.rFreeMsduInfoList; ASSERT(prMsduInfo->prPacket); if (prMsduInfo->prPacket) { cnmMemFree(prAdapter, prMsduInfo->prPacket); prMsduInfo->prPacket = NULL; } KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); //added by zhaoyun.wu for 438323,438318,438313 mtk_patch 2015.7.24 begin prMsduInfo->fgIsBasicRate = FALSE; //add this line //added by zhaoyun.wu for 438323,438318,438313 mtk_patch 2015.7.24 end QUEUE_INSERT_TAIL(prQueList, &prMsduInfo->rQueEntry) KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); }
/*----------------------------------------------------------------------------*/ VOID mboxSetup(IN P_ADAPTER_T prAdapter, IN ENUM_MBOX_ID_T eMboxId) { P_MBOX_T prMbox; KAL_SPIN_LOCK_DECLARATION(); ASSERT(eMboxId < MBOX_ID_TOTAL_NUM); ASSERT(prAdapter); prMbox = &(prAdapter->arMbox[eMboxId]); KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_MAILBOX); LINK_INITIALIZE(&prMbox->rLinkHead); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_MAILBOX); }
/*----------------------------------------------------------------------------*/ VOID cnmTimerInitialize(IN P_ADAPTER_T prAdapter) { P_ROOT_TIMER prRootTimer; KAL_SPIN_LOCK_DECLARATION(); ASSERT(prAdapter); prRootTimer = &prAdapter->rRootTimer; /* Note: glue layer have configured timer */ KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TIMER); LINK_INITIALIZE(&prRootTimer->rLinkHead); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TIMER); KAL_WAKE_LOCK_INIT(prAdapter, &prRootTimer->rWakeLock, "WLAN Timer"); prRootTimer->fgWakeLocked = FALSE; }
/*----------------------------------------------------------------------------*/ VOID cnmMgtPktFree(P_ADAPTER_T prAdapter, P_MSDU_INFO_T prMsduInfo) { P_QUE_T prQueList; KAL_SPIN_LOCK_DECLARATION(); ASSERT(prAdapter); ASSERT(prMsduInfo); prQueList = &prAdapter->rTxCtrl.rFreeMsduInfoList; ASSERT(prMsduInfo->prPacket); if (prMsduInfo->prPacket) { cnmMemFree(prAdapter, prMsduInfo->prPacket); prMsduInfo->prPacket = NULL; } KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); QUEUE_INSERT_TAIL(prQueList, &prMsduInfo->rQueEntry) KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); }
/*----------------------------------------------------------------------------*/ P_MSDU_INFO_T cnmMgtPktAlloc ( P_ADAPTER_T prAdapter, UINT_32 u4Length ) { P_MSDU_INFO_T prMsduInfo; P_QUE_T prQueList; KAL_SPIN_LOCK_DECLARATION(); ASSERT(prAdapter); prQueList = &prAdapter->rTxCtrl.rFreeMsduInfoList; /* Get a free MSDU_INFO_T */ KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); QUEUE_REMOVE_HEAD(prQueList, prMsduInfo, P_MSDU_INFO_T); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); if (prMsduInfo) { prMsduInfo->prPacket = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, u4Length); prMsduInfo->eSrc = TX_PACKET_MGMT; if (prMsduInfo->prPacket == NULL) { KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); QUEUE_INSERT_TAIL(prQueList, &prMsduInfo->rQueEntry); KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST); prMsduInfo = NULL; } prMsduInfo->eCmdType = COMMAND_TYPE_NUM; prMsduInfo->ucCID = 0xff; prMsduInfo->u4InqueTime = 0; prMsduInfo->ucPacketType = TX_PACKET_NUM; } else { P_QUE_T prTxingQue; P_QUE_ENTRY_T prQueueEntry = (P_QUE_ENTRY_T) NULL; P_MSDU_INFO_T prMsduInfo = (P_MSDU_INFO_T) NULL; P_TX_TCQ_STATUS_T pTc = (P_TX_TCQ_STATUS_T)NULL; prTxingQue = &(prAdapter->rTxCtrl.rTxMgmtTxingQueue); pTc = &(prAdapter->rTxCtrl.rTc); DBGLOG(MEM, LOUD, ("++dump TxPendingMsdu=%lu, Tc0=%d Tc1=%d Tc2=%d Tc3=%d, Tc4=%d Tc5=%d\n", prTxingQue->u4NumElem, pTc->aucFreeBufferCount[TC0_INDEX], pTc->aucFreeBufferCount[TC1_INDEX], pTc->aucFreeBufferCount[TC2_INDEX], pTc->aucFreeBufferCount[TC3_INDEX], pTc->aucFreeBufferCount[TC4_INDEX], pTc->aucFreeBufferCount[TC5_INDEX])); prQueueEntry = QUEUE_GET_HEAD(prTxingQue); while (prQueueEntry) { prMsduInfo = (P_MSDU_INFO_T)prQueueEntry; DBGLOG(MEM, LOUD, ("msdu type=%u, ucid=%u, type=%d, time=%lu, seq=%u, sta=%u\n", prMsduInfo->ucPacketType, prMsduInfo->ucCID, prMsduInfo->eCmdType, prMsduInfo->u4InqueTime, prMsduInfo->ucTxSeqNum, prMsduInfo->ucStaRecIndex)); prQueueEntry = QUEUE_GET_NEXT_ENTRY(prQueueEntry); } DBGLOG(MEM, LOUD, ("--end dump\n")); } #if DBG if (prMsduInfo == NULL) { DBGLOG(MEM, WARN, ("\n")); DBGLOG(MEM, WARN, ("MgtDesc#=%ld\n", prQueList->u4NumElem)); #if CFG_DBG_MGT_BUF DBGLOG(MEM, WARN, ("rMgtBufInfo: alloc#=%ld, free#=%ld, null#=%ld\n", prAdapter->rMgtBufInfo.u4AllocCount, prAdapter->rMgtBufInfo.u4FreeCount, prAdapter->rMgtBufInfo.u4AllocNullCount)); #endif DBGLOG(MEM, WARN, ("\n")); } #endif return prMsduInfo; }