mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 13:23:02 -04:00
spi: virtio: mark device ready before registering the controller
virtio_spi_probe() registers the SPI controller with devm_spi_register_controller(). spi_register_controller() binds a child inline unless its driver has asked for asynchronous probing, so a peripheral that performs a transfer during its own probe reaches virtio_spi_transfer_one(), which kicks the virtqueue before probe has returned. The driver never calls virtio_device_ready(), so DRIVER_OK is set on its behalf by virtio_dev_probe(), only once probe has returned. The virtio spec is explicit about that ordering in 3.1 Device Initialization: | The driver MUST NOT send any buffer available notifications to the | device before setting DRIVER_OK. A device that waits for DRIVER_OK before servicing the queue therefore leaves the transfer unanswered, and virtio_spi_transfer_one() waits for its completion with no timeout, so probe never returns. Mark the device ready before registering the controller, as done for the same reason in commitf5866db64f("virtio_console: enable VQs early") and commit1d774589f9("i2c: virtio: mark device ready before registering the adapter"). Fixes:f98cabe3f6("SPI: Add virtio SPI driver") Signed-off-by: Jasper Wise <jaspwise@amazon.co.uk> Link: https://patch.msgid.link/20260813084618.613172-1-jaspwise@amazon.co.uk Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
@@ -358,6 +358,8 @@ static int virtio_spi_probe(struct virtio_device *vdev)
|
||||
if (ret)
|
||||
return dev_err_probe(&vdev->dev, ret, "Cannot register virtqueue cleanup\n");
|
||||
|
||||
virtio_device_ready(vdev);
|
||||
|
||||
/* Use devm version to register controller */
|
||||
ret = devm_spi_register_controller(&vdev->dev, ctrl);
|
||||
if (ret)
|
||||
|
||||
Reference in New Issue
Block a user