[U-Boot] [PATCH] usb: gadget: ci_udc: fix suspend/resume of USB Mass Storage

John Tobias john.tobias.ph at gmail.com
Mon Aug 22 21:38:34 CEST 2016


When the host machine went to suspend mode and then wake it up, it send
a USB_REQ_GET_STATUS. The existing case condition below, never
become true and it causes the host machine to reset the connection. Once,
it reset you will see an error "Disk Not Ejected Properly".

case SETUP(USB_DIR_IN | USB_RECIP_DEVICE, USB_REQ_GET_STATUS):

By applying this patch, the device could respond to the USB_REQ_GET_STATUS
command correctly.
---
 drivers/usb/gadget/ci_udc.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/gadget/ci_udc.c b/drivers/usb/gadget/ci_udc.c
index d36bcf6..fdec613 100644
--- a/drivers/usb/gadget/ci_udc.c
+++ b/drivers/usb/gadget/ci_udc.c
@@ -703,8 +703,8 @@ static void handle_setup(void)
 	list_del_init(&ci_req->queue);
 	ci_ep->req_primed = false;
 
-	switch (SETUP(r.bRequestType, r.bRequest)) {
-	case SETUP(USB_RECIP_ENDPOINT, USB_REQ_CLEAR_FEATURE):
+	switch (r.bRequest) {
+	case USB_REQ_CLEAR_FEATURE:
 		_num = r.wIndex & 15;
 		_in = !!(r.wIndex & 0x80);
 
@@ -729,7 +729,7 @@ static void handle_setup(void)
 		}
 		return;
 
-	case SETUP(USB_RECIP_DEVICE, USB_REQ_SET_ADDRESS):
+	case USB_REQ_SET_ADDRESS:
 		/*
 		 * write address delayed (will take effect
 		 * after the next IN txn)
@@ -739,7 +739,7 @@ static void handle_setup(void)
 		usb_ep_queue(controller.gadget.ep0, req, 0);
 		return;
 
-	case SETUP(USB_DIR_IN | USB_RECIP_DEVICE, USB_REQ_GET_STATUS):
+	case USB_REQ_GET_STATUS:
 		req->length = 2;
 		buf = (char *)req->buf;
 		buf[0] = 1 << USB_DEVICE_SELF_POWERED;
-- 
2.9.3



More information about the U-Boot mailing list