From 3437121c037f502a3b0faaec97059777034a1ead Mon Sep 17 00:00:00 2001 From: Michal Suchanek Date: Sun, 18 Aug 2019 10:55:27 +0200 Subject: usb: Add nonblock argument to submit_int_msg This will be used to implement non-blocking keyboard polling in case of errors. Signed-off-by: Michal Suchanek --- common/usb.c | 9 ++++++--- common/usb_kbd.c | 4 ++-- common/usb_storage.c | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) (limited to 'common') diff --git a/common/usb.c b/common/usb.c index 14b2752139..d9bcb5a57e 100644 --- a/common/usb.c +++ b/common/usb.c @@ -192,12 +192,15 @@ int usb_disable_asynch(int disable) */ /* - * submits an Interrupt Message + * submits an Interrupt Message. Some drivers may implement non-blocking + * polling: when non-block is true and the device is not responding return + * -EAGAIN instead of waiting for device to respond. */ int usb_int_msg(struct usb_device *dev, unsigned long pipe, - void *buffer, int transfer_len, int interval) + void *buffer, int transfer_len, int interval, bool nonblock) { - return submit_int_msg(dev, pipe, buffer, transfer_len, interval); + return submit_int_msg(dev, pipe, buffer, transfer_len, interval, + nonblock); } /* diff --git a/common/usb_kbd.c b/common/usb_kbd.c index ebfd972bea..d178af248a 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -341,7 +341,7 @@ static inline void usb_kbd_poll_for_event(struct usb_device *dev) /* Submit a interrupt transfer request */ if (usb_int_msg(dev, data->intpipe, &data->new[0], - data->intpktsize, data->intinterval) >= 0) + data->intpktsize, data->intinterval, true) >= 0) usb_kbd_irq_worker(dev); #elif defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP) || \ defined(CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE) @@ -505,7 +505,7 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum) 1, 0, data->new, USB_KBD_BOOT_REPORT_SIZE) < 0) { #else if (usb_int_msg(dev, data->intpipe, data->new, data->intpktsize, - data->intinterval) < 0) { + data->intinterval, false) < 0) { #endif printf("Failed to get keyboard state from device %04x:%04x\n", dev->descriptor.idVendor, dev->descriptor.idProduct); diff --git a/common/usb_storage.c b/common/usb_storage.c index 9a4155c08a..54f8e53c63 100644 --- a/common/usb_storage.c +++ b/common/usb_storage.c @@ -651,7 +651,7 @@ static int usb_stor_CBI_get_status(struct scsi_cmd *srb, struct us_data *us) us->ip_wanted = 1; usb_int_msg(us->pusb_dev, us->irqpipe, - (void *)&us->ip_data, us->irqmaxp, us->irqinterval); + (void *)&us->ip_data, us->irqmaxp, us->irqinterval, false); timeout = 1000; while (timeout--) { if (us->ip_wanted == 0) -- cgit