From: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- drivers/usb/core/usb.c | 18 +++++------------- drivers/usb/host/ehci-hcd.c | 4 ++-- include/usb/usb.h | 4 ++-- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 24fa94a..ff60fea 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -531,6 +531,7 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe, void *data, unsigned short size, int timeout) { struct usb_host *host = dev->host; + int ret; if ((timeout == 0) && (!asynch_allowed)) { /* request for a asynch control pipe is not allowed */ @@ -548,18 +549,9 @@ 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 */ - host->submit_control_msg(dev, pipe, data, size, &setup_packet); - if (timeout == 0) - return (int)size; - - if (dev->status != 0) { - /* - * Let's wait a while for the timeout to elapse. - * It has no real use, but it keeps the interface happy. - */ - wait_ms(timeout); - return -1; - } + ret = host->submit_control_msg(dev, pipe, data, size, &setup_packet, timeout); + if (ret) + return ret; return dev->act_len; } @@ -579,7 +571,7 @@ int usb_bulk_msg(struct usb_device *dev, unsigned int pipe, return -1; dev->status = USB_ST_NOT_PROC; /* not yet processed */ - ret = host->submit_bulk_msg(dev, pipe, data, len); + ret = host->submit_bulk_msg(dev, pipe, data, len, timeout); if (ret) return ret; diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 60fc181..828c5d9 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -850,7 +850,7 @@ static int ehci_init(struct usb_host *host) static int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer, - int length) + int length, int timeout) { if (usb_pipetype(pipe) != PIPE_BULK) { @@ -862,7 +862,7 @@ submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer, static int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer, - int length, struct devrequest *setup) + int length, struct devrequest *setup, int timeout) { struct usb_host *host = dev->host; struct ehci_priv *ehci = to_ehci(host); diff --git a/include/usb/usb.h b/include/usb/usb.h index 6ef9977..6715786 100644 --- a/include/usb/usb.h +++ b/include/usb/usb.h @@ -205,9 +205,9 @@ struct usb_host { int (*init)(struct usb_host *); int (*exit)(struct usb_host *); 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); void (*usb_event_poll)(void); -- 1.7.5.4 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox