@@ -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;
@@ -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);
@@ -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));
@@ -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;
@@ -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;
@@ -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,
@@ -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);
@@ -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
*
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 <marcan@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(-)