int vmm_netport_unregister(struct vmm_netport *port) { int rc; struct vmm_classdev *cd; if (!port) { return VMM_EFAIL; } rc = vmm_netswitch_port_remove(port); if (rc) { return rc; } cd = vmm_devdrv_find_classdev(VMM_NETPORT_CLASS_NAME, port->name); if (!cd) { return VMM_EFAIL; } rc = vmm_devdrv_unregister_classdev(VMM_NETPORT_CLASS_NAME, cd); if (!rc) { vmm_free(cd); } return rc; }
int vmm_fb_unregister(struct vmm_fb_info *info) { int rc; struct vmm_fb_event event; struct vmm_classdev *cd; if (info == NULL) { return VMM_EFAIL; } if (info->dev == NULL) { return VMM_EFAIL; } cd = vmm_devdrv_find_classdev(VMM_FB_CLASS_NAME, info->dev->node->name); if (!cd) { return VMM_EFAIL; } rc = vmm_devdrv_unregister_classdev(VMM_FB_CLASS_NAME, cd); if (!rc) { vmm_free(cd); } if (info->pixmap.addr && (info->pixmap.flags & FB_PIXMAP_DEFAULT)) { vmm_free(info->pixmap.addr); } vmm_fb_destroy_modelist(&info->modelist); event.info = info; vmm_fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event); return rc; }
int vmm_blockdev_unregister(struct vmm_blockdev *bdev) { int rc; struct dlist *l; struct vmm_blockdev *child_bdev; struct vmm_blockdev_event event; struct vmm_classdev *cd; if (!bdev) { return VMM_EFAIL; } /* Unreg & free child block devices */ vmm_mutex_lock(&bdev->child_lock); while (!list_empty(&bdev->child_list)) { l = list_pop(&bdev->child_list); child_bdev = list_entry(l, struct vmm_blockdev, head); if ((rc = vmm_blockdev_unregister(child_bdev))) { vmm_mutex_unlock(&bdev->child_lock); return rc; } __blockdev_free(child_bdev, FALSE); } vmm_mutex_unlock(&bdev->child_lock); /* Broadcast unregister event */ event.bdev = bdev; event.data = NULL; vmm_blocking_notifier_call(&bdev_notifier_chain, VMM_BLOCKDEV_EVENT_UNREGISTER, &event); cd = vmm_devdrv_find_classdev(VMM_BLOCKDEV_CLASS_NAME, bdev->name); if (!cd) { return VMM_EFAIL; } rc = vmm_devdrv_unregister_classdev(VMM_BLOCKDEV_CLASS_NAME, cd); if (!rc) { vmm_free(cd); } return rc; }
int vmm_netport_unregister(struct vmm_netport *port) { int rc; struct vmm_classdev *cd; if (port == NULL) return VMM_EFAIL; cd = vmm_devdrv_find_classdev(VMM_NETPORT_CLASS_NAME, port->name); if (!cd) return VMM_EFAIL; rc = vmm_devdrv_unregister_classdev(VMM_NETPORT_CLASS_NAME, cd); if (!rc) vmm_free(cd); return rc; }
int vmm_rtcdev_unregister(struct vmm_rtcdev *rdev) { int rc; struct vmm_classdev *cd; if (!rdev) { return VMM_EFAIL; } cd = vmm_devdrv_find_classdev(VMM_RTCDEV_CLASS_NAME, rdev->name); if (!cd) { return VMM_EFAIL; } rc = vmm_devdrv_unregister_classdev(VMM_RTCDEV_CLASS_NAME, cd); if (rc == VMM_OK) { vmm_free(cd); } return rc; }
int vmm_netdev_unregister(struct vmm_netdev * ndev) { int rc; struct vmm_classdev *cd; if (ndev == NULL) { return VMM_EFAIL; } cd = vmm_devdrv_find_classdev(VMM_NETDEV_CLASS_NAME, ndev->name); if (!cd) { return VMM_EFAIL; } rc = vmm_devdrv_unregister_classdev(VMM_NETDEV_CLASS_NAME, cd); if (!rc) { vmm_free(cd); } return rc; }
int vmm_blockdev_unregister(struct vmm_blockdev * bdev) { int rc; struct vmm_classdev *cd; if (bdev == NULL) { return VMM_EFAIL; } if (bdev->dev == NULL) { return VMM_EFAIL; } cd = vmm_devdrv_find_classdev(VMM_BLOCKDEV_CLASS_NAME, bdev->name); if (!cd) { return VMM_EFAIL; } rc = vmm_devdrv_unregister_classdev(VMM_BLOCKDEV_CLASS_NAME, cd); if (!rc) { vmm_free(cd); } return rc; }