PVRSRV_ERROR PVRSRVRemoveDCDeviceKM(IMG_UINT32 ui32DevIndex) { SYS_DATA *psSysData; PVRSRV_DEVICE_NODE *psDeviceNode; PVRSRV_DISPLAYCLASS_INFO *psDCInfo; SysAcquireData(&psSysData); psDeviceNode = (PVRSRV_DEVICE_NODE*) List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList, MatchDeviceKM_AnyVaCb, ui32DevIndex, IMG_FALSE, PVRSRV_DEVICE_CLASS_DISPLAY); if (!psDeviceNode) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveDCDeviceKM: requested device %d not present", ui32DevIndex)); return PVRSRV_ERROR_GENERIC; } psDCInfo = (PVRSRV_DISPLAYCLASS_INFO*)psDeviceNode->pvDevice; if(psDCInfo->ui32RefCount == 0) { List_PVRSRV_DEVICE_NODE_Remove(psDeviceNode); SysRemoveExternalDevice(psDeviceNode); PVR_ASSERT(psDCInfo->ui32RefCount == 0); (IMG_VOID)FreeDeviceID(psSysData, ui32DevIndex); (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE), psDCInfo->psFuncTable, IMG_NULL); psDCInfo->psFuncTable = IMG_NULL; (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DISPLAYCLASS_INFO), psDCInfo, IMG_NULL); (IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDeviceNode, IMG_NULL); } else { PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveDCDeviceKM: failed as %d Services DC API connections are still open", psDCInfo->ui32RefCount)); return PVRSRV_ERROR_GENERIC; } return PVRSRV_OK; }
static enum PVRSRV_ERROR PVRSRVRemoveDCDeviceKM(u32 ui32DevIndex) { struct SYS_DATA *psSysData; struct PVRSRV_DEVICE_NODE **ppsDeviceNode, *psDeviceNode; struct PVRSRV_DISPLAYCLASS_INFO *psDCInfo; if (SysAcquireData(&psSysData) != PVRSRV_OK) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVRemoveDCDeviceKM: Failed to get SysData"); return PVRSRV_ERROR_GENERIC; } ppsDeviceNode = &psSysData->psDeviceNodeList; while (*ppsDeviceNode) { switch ((*ppsDeviceNode)->sDevId.eDeviceClass) { case PVRSRV_DEVICE_CLASS_DISPLAY: { if ((*ppsDeviceNode)->sDevId.ui32DeviceIndex == ui32DevIndex) goto FoundDevice; break; } default: { break; } } ppsDeviceNode = &((*ppsDeviceNode)->psNext); } PVR_DPF(PVR_DBG_ERROR, "PVRSRVRemoveDCDeviceKM: requested device %d not present", ui32DevIndex); return PVRSRV_ERROR_GENERIC; FoundDevice: psDeviceNode = *ppsDeviceNode; *ppsDeviceNode = psDeviceNode->psNext; SysRemoveExternalDevice(psDeviceNode); psDCInfo = (struct PVRSRV_DISPLAYCLASS_INFO *)psDeviceNode->pvDevice; PVR_ASSERT(psDCInfo->ui32RefCount == 0); FreeDeviceID(psSysData, ui32DevIndex); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DC_SRV2DISP_KMJTABLE), psDCInfo->psFuncTable, NULL); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DISPLAYCLASS_INFO), psDCInfo, NULL); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct PVRSRV_DEVICE_NODE), psDeviceNode, NULL); return PVRSRV_OK; }