/* * ======== WMD_CHNL_Destroy ======== * Purpose: * Close all open channels, and destroy the channel manager. */ DSP_STATUS WMD_CHNL_Destroy(struct CHNL_MGR *hChnlMgr) { DSP_STATUS status = DSP_SOK; struct CHNL_MGR *pChnlMgr = hChnlMgr; u32 iChnl; if (MEM_IsValidHandle(hChnlMgr, CHNL_MGRSIGNATURE)) { /* Close all open channels: */ for (iChnl = 0; iChnl < pChnlMgr->cChannels; iChnl++) { status = WMD_CHNL_Close(pChnlMgr->apChannel[iChnl]); if (DSP_FAILED(status)) DBG_Trace(DBG_LEVEL7, "Error in CHNL_Close " "status 0x%x\n", status); } /* release critical section */ if (pChnlMgr->hCSObj) SYNC_DeleteCS(pChnlMgr->hCSObj); /* Free channel manager object: */ kfree(pChnlMgr->apChannel); /* Set hChnlMgr to NULL in device object. */ DEV_SetChnlMgr(pChnlMgr->hDevObject, NULL); /* Free this Chnl Mgr object: */ MEM_FreeObject(hChnlMgr); } else { status = DSP_EHANDLE; } return status; }
/* * ======== WMD_CHNL_Destroy ======== * Purpose: * Close all open channels, and destroy the channel manager. */ DSP_STATUS WMD_CHNL_Destroy(struct CHNL_MGR *hChnlMgr) { DSP_STATUS status = DSP_SOK; struct CHNL_MGR *pChnlMgr = hChnlMgr; u32 iChnl; if (MEM_IsValidHandle(hChnlMgr, CHNL_MGRSIGNATURE)) { /* Close all open channels: */ for (iChnl = 0; iChnl < pChnlMgr->cChannels; iChnl++) { if (DSP_SUCCEEDED (WMD_CHNL_Close(pChnlMgr->apChannel[iChnl]))) { DBC_Assert(pChnlMgr->apChannel[iChnl] == NULL); } } /* release critical section */ if (pChnlMgr->hCSObj) SYNC_DeleteCS(pChnlMgr->hCSObj); /* Free channel manager object: */ if (pChnlMgr->apChannel) MEM_Free(pChnlMgr->apChannel); /* Set hChnlMgr to NULL in device object. */ DEV_SetChnlMgr(pChnlMgr->hDevObject, NULL); /* Free this Chnl Mgr object: */ MEM_FreeObject(hChnlMgr); } else { status = DSP_EHANDLE; } return status; }