OSDN Git Service

usb: aspeed-vhub: fix ep0 OUT ack received wrong length issue
authorNeal Liu <neal_liu@aspeedtech.com>
Wed, 8 Dec 2021 10:05:44 +0000 (18:05 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 13 Dec 2021 14:01:46 +0000 (15:01 +0100)
If multiple devices in vhub are enumerated simultaneously, ep0 OUT
ack might received wrong data length. Using expected data length
instead.

Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Neal Liu <neal_liu@aspeedtech.com>
Link: https://lore.kernel.org/r/20211208100545.1441397-4-neal_liu@aspeedtech.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/udc/aspeed-vhub/ep0.c

index 74ea36c..b4cf462 100644 (file)
@@ -251,6 +251,13 @@ static void ast_vhub_ep0_do_receive(struct ast_vhub_ep *ep, struct ast_vhub_req
                len = remain;
                rc = -EOVERFLOW;
        }
+
+       /* Hardware return wrong data len */
+       if (len < ep->ep.maxpacket && len != remain) {
+               EPDBG(ep, "using expected data len instead\n");
+               len = remain;
+       }
+
        if (len && req->req.buf)
                memcpy(req->req.buf + req->req.actual, ep->buf, len);
        req->req.actual += len;