diff options
author | Michal Suchanek <msuchanek@suse.de> | 2019-08-18 10:55:27 +0200 |
---|---|---|
committer | marex <marex@chi.lan> | 2019-09-11 10:11:29 +0200 |
commit | 3437121c037f502a3b0faaec97059777034a1ead (patch) | |
tree | 37400fd4fb2ce3b28b7f82f0530dc4d7efad1307 /common | |
parent | 50dce8fbf0c8b6f55e32c8d2d08ccf6e58168027 (diff) |
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 <msuchanek@suse.de>
Diffstat (limited to 'common')
-rw-r--r-- | common/usb.c | 9 | ||||
-rw-r--r-- | common/usb_kbd.c | 4 | ||||
-rw-r--r-- | common/usb_storage.c | 2 |
3 files changed, 9 insertions, 6 deletions
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) |