VOID RhelShutDown( IN PVOID DeviceExtension ) { PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; virtio_device_reset(&adaptExt->vdev); virtio_delete_queues(&adaptExt->vdev); virtio_device_shutdown(&adaptExt->vdev); adaptExt->vq = NULL; }
VOID RhelShutDown( IN PVOID DeviceExtension ) { ULONG index; PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; virtio_device_reset(&adaptExt->vdev); virtio_delete_queues(&adaptExt->vdev); for (index = 0; index < adaptExt->num_queues; ++index) { adaptExt->vq[index] = NULL; } virtio_device_shutdown(&adaptExt->vdev); }
NTSTATUS virtio_find_queues(VirtIODevice *vdev, unsigned nvqs, struct virtqueue *vqs[]) { unsigned i; NTSTATUS status; u16 msix_vec; status = virtio_reserve_queue_memory(vdev, nvqs); if (!NT_SUCCESS(status)) { return status; } /* set up the device config interrupt */ msix_vec = vdev_get_msix_vector(vdev, -1); if (msix_vec != VIRTIO_MSI_NO_VECTOR) { msix_vec = vdev->device->set_config_vector(vdev, msix_vec); /* Verify we had enough resources to assign the vector */ if (msix_vec == VIRTIO_MSI_NO_VECTOR) { status = STATUS_DEVICE_BUSY; goto error_find; } } /* set up queue interrupts */ for (i = 0; i < nvqs; i++) { msix_vec = vdev_get_msix_vector(vdev, i); status = vp_setup_vq( &vqs[i], vdev, i, msix_vec); if (!NT_SUCCESS(status)) { goto error_find; } } return STATUS_SUCCESS; error_find: virtio_delete_queues(vdev); return status; }