This patch switches to use validate() to filter out the features that
is not supported by the rproc.

Cc: Amit Shah <a...@kernel.org>
Signed-off-by: Jason Wang <jasow...@redhat.com>
---
 drivers/char/virtio_console.c | 41 ++++++++++++++++++++++-------------
 1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 7eaf303a7a86..daeed31df622 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1172,9 +1172,7 @@ static void resize_console(struct port *port)
 
        vdev = port->portdev->vdev;
 
-       /* Don't test F_SIZE at all if we're rproc: not a valid feature! */
-       if (!is_rproc_serial(vdev) &&
-           virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE))
+       if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE))
                hvc_resize(port->cons.hvc, port->cons.ws);
 }
 
@@ -1981,6 +1979,29 @@ static void virtcons_remove(struct virtio_device *vdev)
        kfree(portdev);
 }
 
+static int virtcons_validate(struct virtio_device *vdev)
+{
+       if (is_rproc_serial(vdev)) {
+               /* Don't test F_SIZE at all if we're rproc: not a
+                * valid feature! */
+               __virtio_clear_bit(vdev, VIRTIO_CONSOLE_F_SIZE);
+               /* Don't test MULTIPORT at all if we're rproc: not a
+                * valid feature! */
+               __virtio_clear_bit(vdev, VIRTIO_CONSOLE_F_MULTIPORT);
+       }
+
+       /* We only need a config space if features are offered */
+       if (!vdev->config->get &&
+           (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)
+            || virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT))) {
+               dev_err(&vdev->dev, "%s failure: config access disabled\n",
+                       __func__);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 /*
  * Once we're further in boot, we get probed like any other virtio
  * device.
@@ -1996,15 +2017,6 @@ static int virtcons_probe(struct virtio_device *vdev)
        bool multiport;
        bool early = early_put_chars != NULL;
 
-       /* We only need a config space if features are offered */
-       if (!vdev->config->get &&
-           (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)
-            || virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT))) {
-               dev_err(&vdev->dev, "%s failure: config access disabled\n",
-                       __func__);
-               return -EINVAL;
-       }
-
        /* Ensure to read early_put_chars now */
        barrier();
 
@@ -2031,9 +2043,7 @@ static int virtcons_probe(struct virtio_device *vdev)
        multiport = false;
        portdev->max_nr_ports = 1;
 
-       /* Don't test MULTIPORT at all if we're rproc: not a valid feature! */
-       if (!is_rproc_serial(vdev) &&
-           virtio_cread_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT,
+       if (virtio_cread_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT,
                                 struct virtio_console_config, max_nr_ports,
                                 &portdev->max_nr_ports) == 0) {
                multiport = true;
@@ -2210,6 +2220,7 @@ static struct virtio_driver virtio_console = {
        .driver.name =  KBUILD_MODNAME,
        .driver.owner = THIS_MODULE,
        .id_table =     id_table,
+       .validate =     virtcons_validate,
        .probe =        virtcons_probe,
        .remove =       virtcons_remove,
        .config_changed = config_intr,
-- 
2.25.1

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to