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 <[email protected]>
Signed-off-by: Neal Liu <[email protected]>
---
drivers/usb/gadget/udc/aspeed-vhub/ep0.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
index 74ea36c19b1e..bea9cbb191a2 100644
--- a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
+++ b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
@@ -251,6 +251,13 @@ static void ast_vhub_ep0_do_receive(struct ast_vhub_ep *ep, struct ast_vhub_req
len = remain;
rc = -EOVERFLOW;
}
+
+ /* HW 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;
--
2.25.1
On Tue, Nov 30, 2021 at 06:42:55PM +0800, Neal Liu wrote:
> 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 <[email protected]>
> Signed-off-by: Neal Liu <[email protected]>
> ---
> drivers/usb/gadget/udc/aspeed-vhub/ep0.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
> index 74ea36c19b1e..bea9cbb191a2 100644
> --- a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
> +++ b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
> @@ -251,6 +251,13 @@ static void ast_vhub_ep0_do_receive(struct ast_vhub_ep *ep, struct ast_vhub_req
> len = remain;
> rc = -EOVERFLOW;
> }
> +
> + /* HW return wrong data len */
Please spell out "Hardware"?
thanks,
greg k-h
> -----Original Message-----
> From: Greg Kroah-Hartman <[email protected]>
> Sent: Tuesday, November 30, 2021 7:47 PM
> To: Neal Liu <[email protected]>
> Cc: Felipe Balbi <[email protected]>; Joel Stanley <[email protected]>; Andrew
> Jeffery <[email protected]>; Cai Huoqing <[email protected]>; Tao Ren
> <[email protected]>; Julia Lawall <[email protected]>; kernel test
> robot <[email protected]>; Sasha Levin <[email protected]>;
> [email protected]; [email protected];
> [email protected]; [email protected]; BMC-SW
> <[email protected]>; Benjamin Herrenschmidt
> <[email protected]>
> Subject: Re: [PATCH v2 3/4] usb: aspeed-vhub: fix ep0 OUT ack received wrong
> length issue
>
> On Tue, Nov 30, 2021 at 06:42:55PM +0800, Neal Liu wrote:
> > 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 <[email protected]>
> > Signed-off-by: Neal Liu <[email protected]>
> > ---
> > drivers/usb/gadget/udc/aspeed-vhub/ep0.c | 7 +++++++
> > 1 file changed, 7 insertions(+)
> >
> > diff --git a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
> > b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
> > index 74ea36c19b1e..bea9cbb191a2 100644
> > --- a/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
> > +++ b/drivers/usb/gadget/udc/aspeed-vhub/ep0.c
> > @@ -251,6 +251,13 @@ static void ast_vhub_ep0_do_receive(struct
> ast_vhub_ep *ep, struct ast_vhub_req
> > len = remain;
> > rc = -EOVERFLOW;
> > }
> > +
> > + /* HW return wrong data len */
>
> Please spell out "Hardware"?
>
> thanks,
>
> greg k-h
Sure, I'll fix it in next patch.
Thanks
Best Regards,
-Neal