All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received
@ 2019-08-18  8:55 Michal Suchanek
  2019-08-18  8:55 ` [U-Boot] [PATCH v5 2/5] usb: usb_submit_int_msg -> usb_int_msg Michal Suchanek
                   ` (6 more replies)
  0 siblings, 7 replies; 10+ messages in thread
From: Michal Suchanek @ 2019-08-18  8:55 UTC (permalink / raw)
  To: u-boot

Causes unbound key repeat on error otherwise.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
v2: fix indentation
v4: fix ! condition to >= 0
v5: fix commit message typo
---
 common/usb_kbd.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index 387373746147..e0c1e6d2b796 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -340,10 +340,9 @@ static inline void usb_kbd_poll_for_event(struct usb_device *dev)
 	struct usb_kbd_pdata *data = dev->privptr;
 
 	/* Submit a interrupt transfer request */
-	usb_submit_int_msg(dev, data->intpipe, &data->new[0], data->intpktsize,
-			   data->intinterval);
-
-	usb_kbd_irq_worker(dev);
+	if (usb_submit_int_msg(dev, data->intpipe, &data->new[0],
+			       data->intpktsize, data->intinterval) >= 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)
 #if defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP)
-- 
2.22.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH v5 2/5] usb: usb_submit_int_msg -> usb_int_msg
  2019-08-18  8:55 [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Michal Suchanek
@ 2019-08-18  8:55 ` Michal Suchanek
  2019-08-18  8:55 ` [U-Boot] [PATCH v5 3/5] usb: storage: submit_int_msg " Michal Suchanek
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Michal Suchanek @ 2019-08-18  8:55 UTC (permalink / raw)
  To: u-boot

This aligns naming with usb_bulk_msg and usb_control_msg.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
v2: new patch
v4: fix indentation of function arguments
---
 common/usb.c     | 4 ++--
 common/usb_kbd.c | 8 ++++----
 include/usb.h    | 4 ++--
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/common/usb.c b/common/usb.c
index b70f614d244f..14b27521395c 100644
--- a/common/usb.c
+++ b/common/usb.c
@@ -194,8 +194,8 @@ int usb_disable_asynch(int disable)
 /*
  * submits an Interrupt Message
  */
-int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
-			void *buffer, int transfer_len, int interval)
+int usb_int_msg(struct usb_device *dev, unsigned long pipe,
+		void *buffer, int transfer_len, int interval)
 {
 	return submit_int_msg(dev, pipe, buffer, transfer_len, interval);
 }
diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index e0c1e6d2b796..ebfd972bea03 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -340,8 +340,8 @@ static inline void usb_kbd_poll_for_event(struct usb_device *dev)
 	struct usb_kbd_pdata *data = dev->privptr;
 
 	/* Submit a interrupt transfer request */
-	if (usb_submit_int_msg(dev, data->intpipe, &data->new[0],
-			       data->intpktsize, data->intinterval) >= 0)
+	if (usb_int_msg(dev, data->intpipe, &data->new[0],
+			data->intpktsize, data->intinterval) >= 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)
@@ -504,8 +504,8 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum)
 	if (usb_get_report(dev, iface->desc.bInterfaceNumber,
 			   1, 0, data->new, USB_KBD_BOOT_REPORT_SIZE) < 0) {
 #else
-	if (usb_submit_int_msg(dev, data->intpipe, data->new, data->intpktsize,
-			       data->intinterval) < 0) {
+	if (usb_int_msg(dev, data->intpipe, data->new, data->intpktsize,
+			data->intinterval) < 0) {
 #endif
 		printf("Failed to get keyboard state from device %04x:%04x\n",
 		       dev->descriptor.idVendor, dev->descriptor.idProduct);
diff --git a/include/usb.h b/include/usb.h
index 420a30e49fa1..0d38d8333a98 100644
--- a/include/usb.h
+++ b/include/usb.h
@@ -261,8 +261,8 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
 			void *data, unsigned short size, int timeout);
 int usb_bulk_msg(struct usb_device *dev, unsigned int pipe,
 			void *data, int len, int *actual_length, int timeout);
-int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
-			void *buffer, int transfer_len, int interval);
+int usb_int_msg(struct usb_device *dev, unsigned long pipe,
+		void *buffer, int transfer_len, int interval);
 int usb_disable_asynch(int disable);
 int usb_maxpacket(struct usb_device *dev, unsigned long pipe);
 int usb_get_configuration_no(struct usb_device *dev, int cfgno,
-- 
2.22.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH v5 3/5] usb: storage: submit_int_msg -> usb_int_msg
  2019-08-18  8:55 [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Michal Suchanek
  2019-08-18  8:55 ` [U-Boot] [PATCH v5 2/5] usb: usb_submit_int_msg -> usb_int_msg Michal Suchanek
@ 2019-08-18  8:55 ` Michal Suchanek
  2019-08-18  8:55 ` [U-Boot] [PATCH v5 4/5] usb: Add nonblock argument to submit_int_msg Michal Suchanek
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Michal Suchanek @ 2019-08-18  8:55 UTC (permalink / raw)
  To: u-boot

Use the wrapper as other callers do.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
v2: usb_submit_int_msg -> usb_int_msg
v3: fix indentation
v5: fix superfluous space in type cast
---
 common/usb_storage.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/common/usb_storage.c b/common/usb_storage.c
index 8c889bb1a648..9a4155c08a16 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -650,8 +650,8 @@ static int usb_stor_CBI_get_status(struct scsi_cmd *srb, struct us_data *us)
 	int timeout;
 
 	us->ip_wanted = 1;
-	submit_int_msg(us->pusb_dev, us->irqpipe,
-			(void *) &us->ip_data, us->irqmaxp, us->irqinterval);
+	usb_int_msg(us->pusb_dev, us->irqpipe,
+		    (void *)&us->ip_data, us->irqmaxp, us->irqinterval);
 	timeout = 1000;
 	while (timeout--) {
 		if (us->ip_wanted == 0)
-- 
2.22.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH v5 4/5] usb: Add nonblock argument to submit_int_msg
  2019-08-18  8:55 [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Michal Suchanek
  2019-08-18  8:55 ` [U-Boot] [PATCH v5 2/5] usb: usb_submit_int_msg -> usb_int_msg Michal Suchanek
  2019-08-18  8:55 ` [U-Boot] [PATCH v5 3/5] usb: storage: submit_int_msg " Michal Suchanek
@ 2019-08-18  8:55 ` Michal Suchanek
  2019-08-18  8:55 ` [U-Boot] [PATCH v5 5/5] dwc2: use the nonblock argument in submit_int_msg Michal Suchanek
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Michal Suchanek @ 2019-08-18  8:55 UTC (permalink / raw)
  To: u-boot

This will be used to implement non-blocking keyboard polling in case of
errors.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
v2: add missing hunk from last patch
v4:
  - propagate nonblock argument to wrapper
  - add documentation of nonblock argument to wrapper
v5:
  - also propagate the extra argument to USB emulator
  - wrap lines slightly over 80 characters
---
 common/usb.c                       |  9 ++++++---
 common/usb_kbd.c                   |  4 ++--
 common/usb_storage.c               |  2 +-
 drivers/usb/emul/sandbox_keyb.c    |  3 ++-
 drivers/usb/emul/usb-emul-uclass.c |  6 ++++--
 drivers/usb/host/dwc2.c            | 13 ++++++++-----
 drivers/usb/host/ehci-hcd.c        | 13 ++++++++-----
 drivers/usb/host/ohci-hcd.c        |  4 ++--
 drivers/usb/host/r8a66597-hcd.c    |  2 +-
 drivers/usb/host/sl811-hcd.c       |  2 +-
 drivers/usb/host/usb-sandbox.c     |  5 +++--
 drivers/usb/host/usb-uclass.c      |  5 +++--
 drivers/usb/host/xhci.c            | 13 ++++++++-----
 drivers/usb/musb-new/musb_uboot.c  | 12 +++++++-----
 include/usb.h                      |  9 +++++----
 15 files changed, 61 insertions(+), 41 deletions(-)

diff --git a/common/usb.c b/common/usb.c
index 14b27521395c..d9bcb5a57e89 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 ebfd972bea03..d178af248af0 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 9a4155c08a16..54f8e53c6307 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)
diff --git a/drivers/usb/emul/sandbox_keyb.c b/drivers/usb/emul/sandbox_keyb.c
index 635945179efc..dc43880d27e6 100644
--- a/drivers/usb/emul/sandbox_keyb.c
+++ b/drivers/usb/emul/sandbox_keyb.c
@@ -178,7 +178,8 @@ static int sandbox_keyb_control(struct udevice *dev, struct usb_device *udev,
 }
 
 static int sandbox_keyb_interrupt(struct udevice *dev, struct usb_device *udev,
-		unsigned long pipe, void *buffer, int length, int interval)
+		unsigned long pipe, void *buffer, int length, int interval,
+		bool nonblock)
 {
 	struct sandbox_keyb_priv *priv = dev_get_priv(dev);
 	uint8_t *data = buffer;
diff --git a/drivers/usb/emul/usb-emul-uclass.c b/drivers/usb/emul/usb-emul-uclass.c
index 973981545b91..50da6bda8e4e 100644
--- a/drivers/usb/emul/usb-emul-uclass.c
+++ b/drivers/usb/emul/usb-emul-uclass.c
@@ -245,7 +245,8 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
 }
 
 int usb_emul_int(struct udevice *emul, struct usb_device *udev,
-		  unsigned long pipe, void *buffer, int length, int interval)
+		  unsigned long pipe, void *buffer, int length, int interval,
+		  bool nonblock)
 {
 	struct dm_usb_ops *ops = usb_get_emul_ops(emul);
 
@@ -253,7 +254,8 @@ int usb_emul_int(struct udevice *emul, struct usb_device *udev,
 		return -ENOSYS;
 	debug("%s: dev=%s\n", __func__, emul->name);
 
-	return ops->interrupt(emul, udev, pipe, buffer, length, interval);
+	return ops->interrupt(emul, udev, pipe, buffer, length, interval,
+			      nonblock);
 }
 
 int usb_emul_setup_device(struct udevice *dev, struct usb_string *strings,
diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
index a62a2f8a951d..bc6166283c63 100644
--- a/drivers/usb/host/dwc2.c
+++ b/drivers/usb/host/dwc2.c
@@ -1108,7 +1108,8 @@ static int _submit_control_msg(struct dwc2_priv *priv, struct usb_device *dev,
 }
 
 int _submit_int_msg(struct dwc2_priv *priv, struct usb_device *dev,
-		    unsigned long pipe, void *buffer, int len, int interval)
+		    unsigned long pipe, void *buffer, int len, int interval,
+		    bool nonblock)
 {
 	unsigned long timeout;
 	int ret;
@@ -1236,9 +1237,10 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-		   int len, int interval)
+		   int len, int interval, bool nonblock)
 {
-	return _submit_int_msg(&local, dev, pipe, buffer, len, interval);
+	return _submit_int_msg(&local, dev, pipe, buffer, len, interval,
+			       nonblock);
 }
 
 /* U-Boot USB control interface */
@@ -1292,13 +1294,14 @@ static int dwc2_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int dwc2_submit_int_msg(struct udevice *dev, struct usb_device *udev,
 			       unsigned long pipe, void *buffer, int length,
-			       int interval)
+			       int interval, bool nonblock)
 {
 	struct dwc2_priv *priv = dev_get_priv(dev);
 
 	debug("%s: dev='%s', udev=%p\n", __func__, dev->name, udev);
 
-	return _submit_int_msg(priv, udev, pipe, buffer, length, interval);
+	return _submit_int_msg(priv, udev, pipe, buffer, length, interval,
+			       nonblock);
 }
 
 static int dwc2_usb_ofdata_to_platdata(struct udevice *dev)
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 4b28db70a566..61a61abb2112 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -1482,7 +1482,8 @@ out:
 }
 
 static int _ehci_submit_int_msg(struct usb_device *dev, unsigned long pipe,
-				void *buffer, int length, int interval)
+				void *buffer, int length, int interval,
+				bool nonblock)
 {
 	void *backbuffer;
 	struct int_queue *queue;
@@ -1532,9 +1533,10 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe,
-		   void *buffer, int length, int interval)
+		   void *buffer, int length, int interval, bool nonblock)
 {
-	return _ehci_submit_int_msg(dev, pipe, buffer, length, interval);
+	return _ehci_submit_int_msg(dev, pipe, buffer, length, interval,
+				    nonblock);
 }
 
 struct int_queue *create_int_queue(struct usb_device *dev,
@@ -1576,10 +1578,11 @@ static int ehci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int ehci_submit_int_msg(struct udevice *dev, struct usb_device *udev,
 			       unsigned long pipe, void *buffer, int length,
-			       int interval)
+			       int interval, bool nonblock)
 {
 	debug("%s: dev='%s', udev=%p\n", __func__, dev->name, udev);
-	return _ehci_submit_int_msg(udev, pipe, buffer, length, interval);
+	return _ehci_submit_int_msg(udev, pipe, buffer, length, interval,
+				    nonblock);
 }
 
 static struct int_queue *ehci_create_int_queue(struct udevice *dev,
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
index 58aa824ec034..57e92a9c8931 100644
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -1703,7 +1703,7 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-		int transfer_len, int interval)
+		int transfer_len, int interval, bool nonblock)
 {
 	info("submit_int_msg");
 	return submit_common_msg(&gohci, dev, pipe, buffer, transfer_len, NULL,
@@ -2155,7 +2155,7 @@ static int ohci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int ohci_submit_int_msg(struct udevice *dev, struct usb_device *udev,
 			       unsigned long pipe, void *buffer, int length,
-			       int interval)
+			       int interval, bool nonblock)
 {
 	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 3c263e51c160..83056feeae22 100644
--- a/drivers/usb/host/r8a66597-hcd.c
+++ b/drivers/usb/host/r8a66597-hcd.c
@@ -822,7 +822,7 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-			int transfer_len, int interval)
+			int transfer_len, int interval, bool nonblock)
 {
 	/* no implement */
 	R8A66597_DPRINT("%s\n", __func__);
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c
index daba0dcd1aee..e08da6130bd5 100644
--- a/drivers/usb/host/sl811-hcd.c
+++ b/drivers/usb/host/sl811-hcd.c
@@ -384,7 +384,7 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-		   int len, int interval)
+		   int len, int interval, bool nonblock)
 {
 	PDEBUG(0, "dev = %p pipe = %#lx buf = %p size = %d int = %d\n", dev, pipe,
 	       buffer, len, interval);
diff --git a/drivers/usb/host/usb-sandbox.c b/drivers/usb/host/usb-sandbox.c
index ff9d5b7231e8..28ee4b093b64 100644
--- a/drivers/usb/host/usb-sandbox.c
+++ b/drivers/usb/host/usb-sandbox.c
@@ -99,7 +99,7 @@ static int sandbox_submit_bulk(struct udevice *bus, struct usb_device *udev,
 
 static int sandbox_submit_int(struct udevice *bus, struct usb_device *udev,
 			      unsigned long pipe, void *buffer, int length,
-			      int interval)
+			      int interval, bool nonblock)
 {
 	struct udevice *emul;
 	int ret;
@@ -110,7 +110,8 @@ static int sandbox_submit_int(struct udevice *bus, struct usb_device *udev,
 	usbmon_trace(bus, pipe, NULL, emul);
 	if (ret)
 		return ret;
-	ret = usb_emul_int(emul, udev, pipe, buffer, length, interval);
+	ret = usb_emul_int(emul, udev, pipe, buffer, length, interval,
+			   nonblock);
 
 	return ret;
 }
diff --git a/drivers/usb/host/usb-uclass.c b/drivers/usb/host/usb-uclass.c
index 6e118b5a8ffa..852165158869 100644
--- a/drivers/usb/host/usb-uclass.c
+++ b/drivers/usb/host/usb-uclass.c
@@ -31,7 +31,7 @@ int usb_disable_asynch(int disable)
 }
 
 int submit_int_msg(struct usb_device *udev, unsigned long pipe, void *buffer,
-		   int length, int interval)
+		   int length, int interval, bool nonblock)
 {
 	struct udevice *bus = udev->controller_dev;
 	struct dm_usb_ops *ops = usb_get_ops(bus);
@@ -39,7 +39,8 @@ int submit_int_msg(struct usb_device *udev, unsigned long pipe, void *buffer,
 	if (!ops->interrupt)
 		return -ENOSYS;
 
-	return ops->interrupt(bus, udev, pipe, buffer, length, interval);
+	return ops->interrupt(bus, udev, pipe, buffer, length, interval,
+			      nonblock);
 }
 
 int submit_control_msg(struct usb_device *udev, unsigned long pipe,
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 44c5f2d264c1..b3e4dcd66fa1 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -1109,7 +1109,8 @@ unknown:
  * @return 0
  */
 static int _xhci_submit_int_msg(struct usb_device *udev, unsigned long pipe,
-				void *buffer, int length, int interval)
+				void *buffer, int length, int interval,
+				bool nonblock)
 {
 	if (usb_pipetype(pipe) != PIPE_INTERRUPT) {
 		printf("non-interrupt pipe (type=%lu)", usb_pipetype(pipe));
@@ -1277,9 +1278,10 @@ int submit_bulk_msg(struct usb_device *udev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *udev, unsigned long pipe, void *buffer,
-		   int length, int interval)
+		   int length, int interval, bool nonblock)
 {
-	return _xhci_submit_int_msg(udev, pipe, buffer, length, interval);
+	return _xhci_submit_int_msg(udev, pipe, buffer, length, interval,
+				    nonblock);
 }
 
 /**
@@ -1386,10 +1388,11 @@ static int xhci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int xhci_submit_int_msg(struct udevice *dev, struct usb_device *udev,
 			       unsigned long pipe, void *buffer, int length,
-			       int interval)
+			       int interval, bool nonblock)
 {
 	debug("%s: dev='%s', udev=%p\n", __func__, dev->name, udev);
-	return _xhci_submit_int_msg(udev, pipe, buffer, length, interval);
+	return _xhci_submit_int_msg(udev, pipe, buffer, length, interval,
+				    nonblock);
 }
 
 static int xhci_alloc_device(struct udevice *dev, struct usb_device *udev)
diff --git a/drivers/usb/musb-new/musb_uboot.c b/drivers/usb/musb-new/musb_uboot.c
index 9c8cc6e58443..9eb593402ea0 100644
--- a/drivers/usb/musb-new/musb_uboot.c
+++ b/drivers/usb/musb-new/musb_uboot.c
@@ -110,7 +110,7 @@ static int _musb_submit_bulk_msg(struct musb_host_data *host,
 
 static int _musb_submit_int_msg(struct musb_host_data *host,
 	struct usb_device *dev, unsigned long pipe,
-	void *buffer, int len, int interval)
+	void *buffer, int len, int interval, bool nonblock)
 {
 	construct_urb(&host->urb, &host->hep, dev, USB_ENDPOINT_XFER_INT, pipe,
 		      buffer, len, NULL, interval);
@@ -268,9 +268,10 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe,
-		   void *buffer, int length, int interval)
+		   void *buffer, int length, int interval, bool nonblock)
 {
-	return _musb_submit_int_msg(&musb_host, dev, pipe, buffer, length, interval);
+	return _musb_submit_int_msg(&musb_host, dev, pipe, buffer, length,
+				    interval, nonblock);
 }
 
 struct int_queue *create_int_queue(struct usb_device *dev,
@@ -320,10 +321,11 @@ static int musb_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int musb_submit_int_msg(struct udevice *dev, struct usb_device *udev,
 			       unsigned long pipe, void *buffer, int length,
-			       int interval)
+			       int interval, bool nonblock)
 {
 	struct musb_host_data *host = dev_get_priv(dev);
-	return _musb_submit_int_msg(host, udev, pipe, buffer, length, interval);
+	return _musb_submit_int_msg(host, udev, pipe, buffer, length, interval,
+				    nonblock);
 }
 
 static struct int_queue *musb_create_int_queue(struct udevice *dev,
diff --git a/include/usb.h b/include/usb.h
index 0d38d8333a98..bcad552f85f0 100644
--- a/include/usb.h
+++ b/include/usb.h
@@ -184,7 +184,7 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
 int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 			int transfer_len, struct devrequest *setup);
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-			int transfer_len, int interval);
+			int transfer_len, int interval, bool nonblock);
 
 #if defined CONFIG_USB_EHCI_HCD || defined CONFIG_USB_MUSB_HOST \
 	|| CONFIG_IS_ENABLED(DM_USB)
@@ -262,7 +262,7 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
 int usb_bulk_msg(struct usb_device *dev, unsigned int pipe,
 			void *data, int len, int *actual_length, int timeout);
 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);
 int usb_disable_asynch(int disable);
 int usb_maxpacket(struct usb_device *dev, unsigned long pipe);
 int usb_get_configuration_no(struct usb_device *dev, int cfgno,
@@ -708,7 +708,7 @@ struct dm_usb_ops {
 	 */
 	int (*interrupt)(struct udevice *bus, struct usb_device *udev,
 			 unsigned long pipe, void *buffer, int length,
-			 int interval);
+			 int interval, bool nonblock);
 
 	/**
 	 * create_int_queue() - Create and queue interrupt packets
@@ -1029,7 +1029,8 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
  * @return 0 if OK, -ve on error
  */
 int usb_emul_int(struct udevice *emul, struct usb_device *udev,
-		  unsigned long pipe, void *buffer, int length, int interval);
+		  unsigned long pipe, void *buffer, int length, int interval,
+		  bool nonblock);
 
 /**
  * usb_emul_find() - Find an emulator for a particular device
-- 
2.22.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH v5 5/5] dwc2: use the nonblock argument in submit_int_msg
  2019-08-18  8:55 [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Michal Suchanek
                   ` (2 preceding siblings ...)
  2019-08-18  8:55 ` [U-Boot] [PATCH v5 4/5] usb: Add nonblock argument to submit_int_msg Michal Suchanek
@ 2019-08-18  8:55 ` Michal Suchanek
  2019-08-18 10:53 ` [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Marek Vasut
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Michal Suchanek @ 2019-08-18  8:55 UTC (permalink / raw)
  To: u-boot

An USB 1.1 keyboard connected to dwc2 through a high-speed hub does not
report status until it changes. With this patch you can enable keyboard
by pressing a key while USB devices are probed. Without a keypress no
state is reported and the probe times out. We don't want to wait for a
keypress or timeout while polling for keypresses so implement an int_msg
nonblock variant that exits early on error.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
v2: move superfluous hunk to earlier patch
---
 drivers/usb/host/dwc2.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
index bc6166283c63..350d820a6e50 100644
--- a/drivers/usb/host/dwc2.c
+++ b/drivers/usb/host/dwc2.c
@@ -1123,7 +1123,7 @@ int _submit_int_msg(struct dwc2_priv *priv, struct usb_device *dev,
 			return -ETIMEDOUT;
 		}
 		ret = _submit_bulk_msg(priv, dev, pipe, buffer, len);
-		if (ret != -EAGAIN)
+		if ((ret != -EAGAIN) || nonblock)
 			return ret;
 	}
 }
-- 
2.22.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received
  2019-08-18  8:55 [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Michal Suchanek
                   ` (3 preceding siblings ...)
  2019-08-18  8:55 ` [U-Boot] [PATCH v5 5/5] dwc2: use the nonblock argument in submit_int_msg Michal Suchanek
@ 2019-08-18 10:53 ` Marek Vasut
  2019-08-23 18:27 ` Marek Vasut
  2019-08-23 20:41 ` [U-Boot] [PATCH] Add the submit_int_msg nonblock argument in musb_hcd.c Michal Suchanek
  6 siblings, 0 replies; 10+ messages in thread
From: Marek Vasut @ 2019-08-18 10:53 UTC (permalink / raw)
  To: u-boot

On 8/18/19 10:55 AM, Michal Suchanek wrote:
> Causes unbound key repeat on error otherwise.
> 
> Signed-off-by: Michal Suchanek <msuchanek@suse.de>
> ---
> v2: fix indentation
> v4: fix ! condition to >= 0
> v5: fix commit message typo

Applied all, thanks.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received
  2019-08-18  8:55 [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Michal Suchanek
                   ` (4 preceding siblings ...)
  2019-08-18 10:53 ` [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Marek Vasut
@ 2019-08-23 18:27 ` Marek Vasut
  2019-08-23 20:41 ` [U-Boot] [PATCH] Add the submit_int_msg nonblock argument in musb_hcd.c Michal Suchanek
  6 siblings, 0 replies; 10+ messages in thread
From: Marek Vasut @ 2019-08-23 18:27 UTC (permalink / raw)
  To: u-boot

On 8/18/19 10:55 AM, Michal Suchanek wrote:
> Causes unbound key repeat on error otherwise.
> 
> Signed-off-by: Michal Suchanek <msuchanek@suse.de>
> ---
> v2: fix indentation
> v4: fix ! condition to >= 0
> v5: fix commit message typo

The series still fails to build:
https://travis-ci.org/marex/u-boot-usb/jobs/575422882

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] Add the submit_int_msg nonblock argument in musb_hcd.c
  2019-08-18  8:55 [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Michal Suchanek
                   ` (5 preceding siblings ...)
  2019-08-23 18:27 ` Marek Vasut
@ 2019-08-23 20:41 ` Michal Suchanek
  2019-08-23 21:11   ` Marek Vasut
  6 siblings, 1 reply; 10+ messages in thread
From: Michal Suchanek @ 2019-08-23 20:41 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
 drivers/usb/musb/musb_hcd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Can you squash this to [4/5] or do you want to respin?

Thanks

Michal

diff --git a/drivers/usb/musb/musb_hcd.c b/drivers/usb/musb/musb_hcd.c
index 1f2805270aa3..ba4c206ccfdb 100644
--- a/drivers/usb/musb/musb_hcd.c
+++ b/drivers/usb/musb/musb_hcd.c
@@ -1050,7 +1050,7 @@ int usb_lowlevel_stop(int index)
  * transfers are not supported.
  */
 int submit_int_msg(struct usb_device *dev, unsigned long pipe,
-				void *buffer, int len, int interval)
+		   void *buffer, int len, int interval, bool nonblock)
 {
 	int dir_out = usb_pipeout(pipe);
 	int ep = usb_pipeendpoint(pipe);
-- 
2.22.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] Add the submit_int_msg nonblock argument in musb_hcd.c
  2019-08-23 20:41 ` [U-Boot] [PATCH] Add the submit_int_msg nonblock argument in musb_hcd.c Michal Suchanek
@ 2019-08-23 21:11   ` Marek Vasut
  2019-08-23 22:30     ` Michal Suchánek
  0 siblings, 1 reply; 10+ messages in thread
From: Marek Vasut @ 2019-08-23 21:11 UTC (permalink / raw)
  To: u-boot

On 8/23/19 10:41 PM, Michal Suchanek wrote:
> Signed-off-by: Michal Suchanek <msuchanek@suse.de>
> ---
>  drivers/usb/musb/musb_hcd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> Can you squash this to [4/5] or do you want to respin?

Squashed and pushed, please check if it's OK.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] Add the submit_int_msg nonblock argument in musb_hcd.c
  2019-08-23 21:11   ` Marek Vasut
@ 2019-08-23 22:30     ` Michal Suchánek
  0 siblings, 0 replies; 10+ messages in thread
From: Michal Suchánek @ 2019-08-23 22:30 UTC (permalink / raw)
  To: u-boot

On Fri, 23 Aug 2019 23:11:44 +0200
Marek Vasut <marex@denx.de> wrote:

> On 8/23/19 10:41 PM, Michal Suchanek wrote:
> > Signed-off-by: Michal Suchanek <msuchanek@suse.de>
> > ---
> >  drivers/usb/musb/musb_hcd.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > Can you squash this to [4/5] or do you want to respin?  
> 
> Squashed and pushed, please check if it's OK.

Looks OK, thanks

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2019-08-23 22:30 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-18  8:55 [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Michal Suchanek
2019-08-18  8:55 ` [U-Boot] [PATCH v5 2/5] usb: usb_submit_int_msg -> usb_int_msg Michal Suchanek
2019-08-18  8:55 ` [U-Boot] [PATCH v5 3/5] usb: storage: submit_int_msg " Michal Suchanek
2019-08-18  8:55 ` [U-Boot] [PATCH v5 4/5] usb: Add nonblock argument to submit_int_msg Michal Suchanek
2019-08-18  8:55 ` [U-Boot] [PATCH v5 5/5] dwc2: use the nonblock argument in submit_int_msg Michal Suchanek
2019-08-18 10:53 ` [U-Boot] [PATCH v5 1/5] usb_kdb: only process events successfully received Marek Vasut
2019-08-23 18:27 ` Marek Vasut
2019-08-23 20:41 ` [U-Boot] [PATCH] Add the submit_int_msg nonblock argument in musb_hcd.c Michal Suchanek
2019-08-23 21:11   ` Marek Vasut
2019-08-23 22:30     ` Michal Suchánek

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.