The old USB code was interrupt-driven and just polled at the top level. This has been obsolete since interrupts were removed, which means the timeout support has been completely broken.
Rip out the top-level polling and just pass through the timeout parameter to host controller drivers. Right now this is ignored in the individual drivers. Signed-off-by: Hector Martin <mar...@marcan.st> --- common/usb.c | 21 ++------------------- drivers/usb/host/ehci-hcd.c | 5 +++-- drivers/usb/host/ohci-hcd.c | 5 +++-- drivers/usb/host/r8a66597-hcd.c | 5 +++-- drivers/usb/host/usb-sandbox.c | 6 ++++-- drivers/usb/host/usb-uclass.c | 9 +++++---- drivers/usb/host/xhci.c | 5 +++-- include/usb.h | 10 ++++++---- 8 files changed, 29 insertions(+), 37 deletions(-) diff --git a/common/usb.c b/common/usb.c index 836506dcd9e9..8d13c5899027 100644 --- a/common/usb.c +++ b/common/usb.c @@ -241,22 +241,10 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe, request, requesttype, value, index, size); dev->status = USB_ST_NOT_PROC; /*not yet processed */ - err = submit_control_msg(dev, pipe, data, size, setup_packet); + err = submit_control_msg(dev, pipe, data, size, setup_packet, timeout); if (err < 0) return err; - if (timeout == 0) - return (int)size; - /* - * Wait for status to update until timeout expires, USB driver - * interrupt handler may set the status when the USB operation has - * been completed. - */ - while (timeout--) { - if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC)) - break; - mdelay(1); - } if (dev->status) return -1; @@ -275,13 +263,8 @@ int usb_bulk_msg(struct usb_device *dev, unsigned int pipe, if (len < 0) return -EINVAL; dev->status = USB_ST_NOT_PROC; /*not yet processed */ - if (submit_bulk_msg(dev, pipe, data, len) < 0) + if (submit_bulk_msg(dev, pipe, data, len, timeout) < 0) return -EIO; - while (timeout--) { - if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC)) - break; - mdelay(1); - } *actual_length = dev->act_len; if (dev->status == 0) return 0; diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 9839aa17492d..ad0a1b9d24b1 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1627,7 +1627,7 @@ int usb_lock_async(struct usb_device *dev, int lock) #if CONFIG_IS_ENABLED(DM_USB) static int ehci_submit_control_msg(struct udevice *dev, struct usb_device *udev, unsigned long pipe, void *buffer, int length, - struct devrequest *setup) + struct devrequest *setup, int timeout) { debug("%s: dev='%s', udev=%p, udev->dev='%s', portnr=%d\n", __func__, dev->name, udev, udev->dev->name, udev->portnr); @@ -1636,7 +1636,8 @@ static int ehci_submit_control_msg(struct udevice *dev, struct usb_device *udev, } static int ehci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev, - unsigned long pipe, void *buffer, int length) + unsigned long pipe, void *buffer, int length, + int timeout) { debug("%s: dev='%s', udev=%p\n", __func__, dev->name, udev); return _ehci_submit_bulk_msg(udev, pipe, buffer, length); diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 3f4418198ccd..8dc1f6660077 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c @@ -2047,7 +2047,7 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, #if CONFIG_IS_ENABLED(DM_USB) static int ohci_submit_control_msg(struct udevice *dev, struct usb_device *udev, unsigned long pipe, void *buffer, int length, - struct devrequest *setup) + struct devrequest *setup, int timeout) { ohci_t *ohci = dev_get_priv(usb_get_bus(dev)); @@ -2056,7 +2056,8 @@ static int ohci_submit_control_msg(struct udevice *dev, struct usb_device *udev, } static int ohci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev, - unsigned long pipe, void *buffer, int length) + unsigned long pipe, void *buffer, int length, + int timeout) { ohci_t *ohci = dev_get_priv(usb_get_bus(dev)); diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index 3ccbc16da379..0ac853dc558b 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c @@ -705,7 +705,8 @@ static int r8a66597_submit_rh_msg(struct udevice *udev, struct usb_device *dev, static int r8a66597_submit_control_msg(struct udevice *udev, struct usb_device *dev, unsigned long pipe, void *buffer, - int length, struct devrequest *setup) + int length, struct devrequest *setup, + int timeout) { struct r8a66597 *r8a66597 = dev_get_priv(udev); u16 r8a66597_address = setup->request == USB_REQ_SET_ADDRESS ? @@ -743,7 +744,7 @@ static int r8a66597_submit_control_msg(struct udevice *udev, static int r8a66597_submit_bulk_msg(struct udevice *udev, struct usb_device *dev, unsigned long pipe, - void *buffer, int length) + void *buffer, int length, int timeout) { struct r8a66597 *r8a66597 = dev_get_priv(udev); int ret = 0; diff --git a/drivers/usb/host/usb-sandbox.c b/drivers/usb/host/usb-sandbox.c index 3d4f8d653b5d..8e5fdc44d642 100644 --- a/drivers/usb/host/usb-sandbox.c +++ b/drivers/usb/host/usb-sandbox.c @@ -47,7 +47,8 @@ static int sandbox_submit_control(struct udevice *bus, struct usb_device *udev, unsigned long pipe, void *buffer, int length, - struct devrequest *setup) + struct devrequest *setup, + int timeout) { struct sandbox_usb_ctrl *ctrl = dev_get_priv(bus); struct udevice *emul; @@ -81,7 +82,8 @@ static int sandbox_submit_control(struct udevice *bus, } static int sandbox_submit_bulk(struct udevice *bus, struct usb_device *udev, - unsigned long pipe, void *buffer, int length) + unsigned long pipe, void *buffer, int length, + int timeout) { struct udevice *emul; int ret; diff --git a/drivers/usb/host/usb-uclass.c b/drivers/usb/host/usb-uclass.c index a1cd0ad2d669..97e0ecad9408 100644 --- a/drivers/usb/host/usb-uclass.c +++ b/drivers/usb/host/usb-uclass.c @@ -58,7 +58,8 @@ int submit_int_msg(struct usb_device *udev, unsigned long pipe, void *buffer, } int submit_control_msg(struct usb_device *udev, unsigned long pipe, - void *buffer, int length, struct devrequest *setup) + void *buffer, int length, struct devrequest *setup, + int timeout) { struct udevice *bus = udev->controller_dev; struct dm_usb_ops *ops = usb_get_ops(bus); @@ -68,7 +69,7 @@ int submit_control_msg(struct usb_device *udev, unsigned long pipe, if (!ops->control) return -ENOSYS; - err = ops->control(bus, udev, pipe, buffer, length, setup); + err = ops->control(bus, udev, pipe, buffer, length, setup, timeout); if (setup->request == USB_REQ_SET_FEATURE && setup->requesttype == USB_RT_PORT && setup->value == cpu_to_le16(USB_PORT_FEAT_RESET) && @@ -81,7 +82,7 @@ int submit_control_msg(struct usb_device *udev, unsigned long pipe, } int submit_bulk_msg(struct usb_device *udev, unsigned long pipe, void *buffer, - int length) + int length, int timeout) { struct udevice *bus = udev->controller_dev; struct dm_usb_ops *ops = usb_get_ops(bus); @@ -89,7 +90,7 @@ int submit_bulk_msg(struct usb_device *udev, unsigned long pipe, void *buffer, if (!ops->bulk) return -ENOSYS; - return ops->bulk(bus, udev, pipe, buffer, length); + return ops->bulk(bus, udev, pipe, buffer, length, timeout); } struct int_queue *create_int_queue(struct usb_device *udev, diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index d13cbff9b372..a33a2460f74d 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -1262,7 +1262,7 @@ static int xhci_lowlevel_stop(struct xhci_ctrl *ctrl) static int xhci_submit_control_msg(struct udevice *dev, struct usb_device *udev, unsigned long pipe, void *buffer, int length, - struct devrequest *setup) + struct devrequest *setup, int timeout) { struct usb_device *uhop; struct udevice *hub; @@ -1294,7 +1294,8 @@ static int xhci_submit_control_msg(struct udevice *dev, struct usb_device *udev, } static int xhci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev, - unsigned long pipe, void *buffer, int length) + unsigned long pipe, void *buffer, int length, + int timeout) { debug("%s: dev='%s', udev=%p\n", __func__, dev->name, udev); return _xhci_submit_bulk_msg(udev, pipe, buffer, length); diff --git a/include/usb.h b/include/usb.h index 09e3f0cb309c..431801d18a84 100644 --- a/include/usb.h +++ b/include/usb.h @@ -184,9 +184,10 @@ int usb_reset_root_port(struct usb_device *dev); #endif int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, - void *buffer, int transfer_len); + void *buffer, int transfer_len, int timeout); int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer, - int transfer_len, struct devrequest *setup); + int transfer_len, struct devrequest *setup, + int timeout); int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer, int transfer_len, int interval, bool nonblock); @@ -709,14 +710,15 @@ struct dm_usb_ops { */ int (*control)(struct udevice *bus, struct usb_device *udev, unsigned long pipe, void *buffer, int length, - struct devrequest *setup); + struct devrequest *setup, int timeout); /** * bulk() - Send a bulk message * * Parameters are as above. */ int (*bulk)(struct udevice *bus, struct usb_device *udev, - unsigned long pipe, void *buffer, int length); + unsigned long pipe, void *buffer, int length, + int timeout); /** * interrupt() - Send an interrupt message * -- 2.41.0