[PATCH] virtio: mmio: Return error codes on probe failures

Daniel Palmer daniel at thingy.jp
Tue Apr 7 12:17:28 CEST 2026


Hi Kuan-Wei,

On Tue, 7 Apr 2026 at 18:49, Kuan-Wei Chiu <visitorckw at gmail.com> wrote:
>
> Currently, virtio_mmio_probe() returns 0 when it encounters an invalid
> magic value, an unsupported version, or a dummy device (ID 0). In
> U-Boot's driver model, returning 0 indicates a successful probe. This
> causes the system to incorrectly register and activate invalid or
> placeholder devices, potentially leading to undefined behavior or
> crashes later on.
>
> Update the probe function to return appropriate error codes (-ENODEV
> for invalid magic values and dummy devices, and -ENXIO for unsupported
> versions). This fix correctly instructs the DM to abort the binding
> process.
>
> Fixes: fdc4aca89ecb ("virtio: Add virtio over mmio transport driver")
> Signed-off-by: Kuan-Wei Chiu <visitorckw at gmail.com>
> ---
>  drivers/virtio/virtio_mmio.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
> index 1cd737aca24..62afe609ec0 100644
> --- a/drivers/virtio/virtio_mmio.c
> +++ b/drivers/virtio/virtio_mmio.c
> @@ -354,7 +354,7 @@ static int virtio_mmio_probe(struct udevice *udev)
>         magic = readl(priv->base + VIRTIO_MMIO_MAGIC_VALUE);
>         if (magic != ('v' | 'i' << 8 | 'r' << 16 | 't' << 24)) {
>                 debug("(%s): wrong magic value 0x%08x!\n", udev->name, magic);
> -               return 0;
> +               return -ENODEV;
>         }
>
>         /* Check device version */
> @@ -362,7 +362,7 @@ static int virtio_mmio_probe(struct udevice *udev)
>         if (priv->version < 1 || priv->version > 2) {
>                 debug("(%s): version %d not supported!\n",
>                       udev->name, priv->version);
> -               return 0;
> +               return -ENXIO;
>         }
>
>         /* Check device ID */
> @@ -372,7 +372,7 @@ static int virtio_mmio_probe(struct udevice *udev)
>                  * virtio-mmio device with an ID 0 is a (dummy) placeholder
>                  * with no function. End probing now with no error reported.
>                  */
> -               return 0;
> +               return -ENODEV;
>         }
>         uc_priv->vendor = readl(priv->base + VIRTIO_MMIO_VENDOR_ID);
>
> --
> 2.53.0.1213.gd9a14994de-goog
>

I'm surprised I didn't notice this when working out the endian issues on m68k.
I have build/boot tested on m68k and the change looks correct to me.

Since I'm not the maintainer for this thing I guess:

Acked-by: Daniel Palmer <daniel at thingy.jp>


More information about the U-Boot mailing list