OSDN Git Service

usb: gadget: aspeed: Don't reject requests on suspended devices
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 26 Jul 2019 05:05:33 +0000 (15:05 +1000)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 12 Aug 2019 05:54:48 +0000 (08:54 +0300)
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 <benh@kernel.crashing.org>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/gadget/udc/aspeed-vhub/dev.c
drivers/usb/gadget/udc/aspeed-vhub/ep0.c
drivers/usb/gadget/udc/aspeed-vhub/epn.c

index 678bbdb..71e2416 100644 (file)
@@ -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;
index b64dca7..022b777 100644 (file)
@@ -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 ? */
index 35941dc..7475c74 100644 (file)
@@ -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;
        }