From: Christian Pötzsch <[email protected]> The virtio spec clearly states in "3.1.1 Driver Requirements: Device Initialization" the sequence a client has to follow after device reset. Because u-boot resets here again, it also needs to set the "acknowledge" bit again even if this was done in virtio_uclass_child_post_bind already once before.
Signed-off-by: Christian Pötzsch <[email protected]> Signed-off-by: Adam Lackorzynski <[email protected]> [trini: Add VIRTIO_CONFIG_S_ACKNOWLEDGE flag check to the test] Signed-off-by: Tom Rini <[email protected]> --- Changes in v2: - Update the test to expect VIRTIO_CONFIG_S_ACKNOWLEDGE being set as well. --- drivers/virtio/virtio-uclass.c | 3 +++ test/dm/virtio_device.c | 1 + 2 files changed, 4 insertions(+) diff --git a/drivers/virtio/virtio-uclass.c b/drivers/virtio/virtio-uclass.c index ac563991b90f..c36e9e9b3a77 100644 --- a/drivers/virtio/virtio-uclass.c +++ b/drivers/virtio/virtio-uclass.c @@ -292,6 +292,9 @@ static int virtio_uclass_child_pre_probe(struct udevice *vdev) if (ret) goto err; + /* After a reset we always need to start the init sequence again */ + virtio_add_status(vdev, VIRTIO_CONFIG_S_ACKNOWLEDGE); + /* We have a driver! */ virtio_add_status(vdev, VIRTIO_CONFIG_S_DRIVER); diff --git a/test/dm/virtio_device.c b/test/dm/virtio_device.c index 53414e4d3a47..c2cd0630d973 100644 --- a/test/dm/virtio_device.c +++ b/test/dm/virtio_device.c @@ -40,6 +40,7 @@ static int dm_test_virtio_base(struct unit_test_state *uts) ut_assertok(virtio_get_status(dev, &status)); ut_asserteq(VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK | + VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_FEATURES_OK, status); return 0; -- 2.43.0

