virtio-pci-modern: factor out modern device initialization logic
authorJason Wang <jasowang@redhat.com>
Mon, 4 Jan 2021 06:54:47 +0000 (14:54 +0800)
committerMichael S. Tsirkin <mst@redhat.com>
Tue, 23 Feb 2021 12:52:57 +0000 (07:52 -0500)
This patch factors out the modern device initialization logic into a
helper. Note that it still depends on the caller to enable pci device
which allows the caller to use e.g devres.

Signed-off-by: Jason Wang <jasowang@redhat.com>
Link: https://lore.kernel.org/r/20210104065503.199631-4-jasowang@redhat.com
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/virtio/virtio_pci_modern.c

index 524490a..5d2d2ae 100644 (file)
@@ -703,11 +703,16 @@ static inline void check_offsets(void)
                     offsetof(struct virtio_pci_common_cfg, queue_used_hi));
 }
 
-/* the PCI probing function */
-int virtio_pci_modern_probe(struct virtio_pci_device *vp_dev)
+/*
+ * vp_modern_probe: probe the modern virtio pci device, note that the
+ * caller is required to enable PCI device before calling this function.
+ * @mdev: the modern virtio-pci device
+ *
+ * Return 0 on succeed otherwise fail
+ */
+static int vp_modern_probe(struct virtio_pci_modern_device *mdev)
 {
-       struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
-       struct pci_dev *pci_dev = vp_dev->pci_dev;
+       struct pci_dev *pci_dev = mdev->pci_dev;
        int err, common, isr, notify, device;
        u32 notify_length;
        u32 notify_offset;
@@ -826,18 +831,8 @@ int virtio_pci_modern_probe(struct virtio_pci_device *vp_dev)
                                              &mdev->device_len);
                if (!mdev->device)
                        goto err_map_device;
-
-               vp_dev->vdev.config = &virtio_pci_config_ops;
-       } else {
-               vp_dev->vdev.config = &virtio_pci_config_nodev_ops;
        }
 
-       vp_dev->config_vector = vp_config_vector;
-       vp_dev->setup_vq = setup_vq;
-       vp_dev->del_vq = del_vq;
-       vp_dev->isr = mdev->isr;
-       vp_dev->vdev.id = mdev->id;
-
        return 0;
 
 err_map_device:
@@ -851,6 +846,33 @@ err_map_common:
        return err;
 }
 
+/* the PCI probing function */
+int virtio_pci_modern_probe(struct virtio_pci_device *vp_dev)
+{
+       struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
+       struct pci_dev *pci_dev = vp_dev->pci_dev;
+       int err;
+
+       mdev->pci_dev = pci_dev;
+
+       err = vp_modern_probe(mdev);
+       if (err)
+               return err;
+
+       if (mdev->device)
+               vp_dev->vdev.config = &virtio_pci_config_ops;
+       else
+               vp_dev->vdev.config = &virtio_pci_config_nodev_ops;
+
+       vp_dev->config_vector = vp_config_vector;
+       vp_dev->setup_vq = setup_vq;
+       vp_dev->del_vq = del_vq;
+       vp_dev->isr = mdev->isr;
+       vp_dev->vdev.id = mdev->id;
+
+       return 0;
+}
+
 void virtio_pci_modern_remove(struct virtio_pci_device *vp_dev)
 {
        struct virtio_pci_modern_device *mdev = &vp_dev->mdev;