A disconnect may just suspend the hub in absence of a physical
disconnect detection. If we start rejecting requests, the mass
storage function gets into a spin trying to requeue the same
request for ever and hangs.

Signed-off-by: Benjamin Herrenschmidt <b...@kernel.crashing.org>
---
 drivers/usb/gadget/udc/aspeed-vhub/dev.c | 13 +++++++++----
 drivers/usb/gadget/udc/aspeed-vhub/ep0.c |  2 +-
 drivers/usb/gadget/udc/aspeed-vhub/epn.c |  2 +-
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/usb/gadget/udc/aspeed-vhub/dev.c 
b/drivers/usb/gadget/udc/aspeed-vhub/dev.c
index 678bbdbd0971..71e2416858fd 100644
--- a/drivers/usb/gadget/udc/aspeed-vhub/dev.c
+++ b/drivers/usb/gadget/udc/aspeed-vhub/dev.c
@@ -204,14 +204,19 @@ int ast_vhub_std_dev_request(struct ast_vhub_ep *ep,
        u16 wValue, wIndex;
 
        /* No driver, we shouldn't be enabled ... */
-       if (!d->driver || !d->enabled || d->suspended) {
+       if (!d->driver || !d->enabled) {
                EPDBG(ep,
-                     "Device is wrong state driver=%p enabled=%d"
-                     " suspended=%d\n",
-                     d->driver, d->enabled, d->suspended);
+                     "Device is wrong state driver=%p enabled=%d\n",
+                     d->driver, d->enabled);
                return std_req_stall;
        }
 
+       /*
+        * Note: we used to reject/stall requests while suspended,
+        * we don't do that anymore as we seem to have cases of
+        * mass storage getting very upset.
+        */
+
        /* First packet, grab speed */
        if (d->gadget.speed == USB_SPEED_UNKNOWN) {
                d->gadget.speed = ep->vhub->speed;
diff --git a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c 
b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
index b64dca7933b0..022b777b85f8 100644
--- a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
+++ b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
@@ -379,7 +379,7 @@ static int ast_vhub_ep0_queue(struct usb_ep* u_ep, struct 
usb_request *u_req,
                return -EINVAL;
 
        /* Disabled device */
-       if (ep->dev && (!ep->dev->enabled || ep->dev->suspended))
+       if (ep->dev && !ep->dev->enabled)
                return -ESHUTDOWN;
 
        /* Data, no buffer and not internal ? */
diff --git a/drivers/usb/gadget/udc/aspeed-vhub/epn.c 
b/drivers/usb/gadget/udc/aspeed-vhub/epn.c
index 35941dc125f9..7475c74aa5c5 100644
--- a/drivers/usb/gadget/udc/aspeed-vhub/epn.c
+++ b/drivers/usb/gadget/udc/aspeed-vhub/epn.c
@@ -352,7 +352,7 @@ static int ast_vhub_epn_queue(struct usb_ep* u_ep, struct 
usb_request *u_req,
 
        /* Endpoint enabled ? */
        if (!ep->epn.enabled || !u_ep->desc || !ep->dev || !ep->d_idx ||
-           !ep->dev->enabled || ep->dev->suspended) {
+           !ep->dev->enabled) {
                EPDBG(ep, "Enqueuing request on wrong or disabled EP\n");
                return -ESHUTDOWN;
        }
-- 
2.17.1

Reply via email to