diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2015-01-13 09:34:58 -0500 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2015-01-21 00:58:55 -0500 |
commit | d3f5f065603705cd4275d57324c49e391f786b5e (patch) | |
tree | 8bf7e4230355ec31f9d96d727a4a0b4a42e8acf9 | |
parent | 3909213cfd9224cb1827d557fb6eb5ebdb8ddcbe (diff) |
virtio_pci_modern: support devices with no config
Virtio 1.0 spec lists device config as optional.
Set get/set callbacks to NULL. Drivers can check that
and fail gracefully.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r-- | drivers/virtio/virtio_pci_modern.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c index 0e54cc88fdf5..68ebc204e3ea 100644 --- a/drivers/virtio/virtio_pci_modern.c +++ b/drivers/virtio/virtio_pci_modern.c | |||
@@ -422,6 +422,21 @@ static void del_vq(struct virtio_pci_vq_info *info) | |||
422 | free_pages_exact(info->queue, vring_pci_size(info->num)); | 422 | free_pages_exact(info->queue, vring_pci_size(info->num)); |
423 | } | 423 | } |
424 | 424 | ||
425 | static const struct virtio_config_ops virtio_pci_config_nodev_ops = { | ||
426 | .get = NULL, | ||
427 | .set = NULL, | ||
428 | .generation = vp_generation, | ||
429 | .get_status = vp_get_status, | ||
430 | .set_status = vp_set_status, | ||
431 | .reset = vp_reset, | ||
432 | .find_vqs = vp_modern_find_vqs, | ||
433 | .del_vqs = vp_del_vqs, | ||
434 | .get_features = vp_get_features, | ||
435 | .finalize_features = vp_finalize_features, | ||
436 | .bus_name = vp_bus_name, | ||
437 | .set_vq_affinity = vp_set_vq_affinity, | ||
438 | }; | ||
439 | |||
425 | static const struct virtio_config_ops virtio_pci_config_ops = { | 440 | static const struct virtio_config_ops virtio_pci_config_ops = { |
426 | .get = vp_get, | 441 | .get = vp_get, |
427 | .set = vp_set, | 442 | .set = vp_set, |
@@ -652,9 +667,11 @@ int virtio_pci_modern_probe(struct virtio_pci_device *vp_dev) | |||
652 | &vp_dev->device_len); | 667 | &vp_dev->device_len); |
653 | if (!vp_dev->device) | 668 | if (!vp_dev->device) |
654 | goto err_map_device; | 669 | goto err_map_device; |
655 | } | ||
656 | 670 | ||
657 | vp_dev->vdev.config = &virtio_pci_config_ops; | 671 | vp_dev->vdev.config = &virtio_pci_config_ops; |
672 | } else { | ||
673 | vp_dev->vdev.config = &virtio_pci_config_nodev_ops; | ||
674 | } | ||
658 | 675 | ||
659 | vp_dev->config_vector = vp_config_vector; | 676 | vp_dev->config_vector = vp_config_vector; |
660 | vp_dev->setup_vq = setup_vq; | 677 | vp_dev->setup_vq = setup_vq; |