usb: dwc3: gadget: Fix failure to detect end of transfer

Message ID 20191230161321.2738541-1-bryan.odonoghue@linaro.org
State New
Headers show
Series
  • usb: dwc3: gadget: Fix failure to detect end of transfer
Related show

Commit Message

Bryan O'Donoghue Dec. 30, 2019, 4:13 p.m.
A recent bugfix 8c7d4b7b3d43 ("usb: dwc3: gadget: Fix logical condition")
correctly fixes a logical error in the gadget driver but, exposes a further
bug in determining when a transfer has completed.

Prior to 8c7d4b7b3d43 we were calling dwc3_gadget_giveback() when we
shouldn't have been. Afer this change the below test fails to complete on
my hardware.

Host:
echo "host" > /dev/ttyACM0

Device:
cat < /dev/ttyGS0

This is caused by the driver incorrectly detecting end of transfer, a
problem that had previous been masked by the continuous calling of
dwc3_gadget_giveback() prior to 8c7d4b7b3d43.

Remediate by making the test <= instead of ==

Fixes: e0c42ce590fe ("usb: dwc3: gadget: simplify IOC handling")

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>

---
 drivers/usb/dwc3/gadget.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

-- 
2.24.0

Comments

Greg KH Dec. 30, 2019, 6:57 p.m. | #1
On Mon, Dec 30, 2019 at 04:13:21PM +0000, Bryan O'Donoghue wrote:
> A recent bugfix 8c7d4b7b3d43 ("usb: dwc3: gadget: Fix logical condition")

> correctly fixes a logical error in the gadget driver but, exposes a further

> bug in determining when a transfer has completed.

> 

> Prior to 8c7d4b7b3d43 we were calling dwc3_gadget_giveback() when we

> shouldn't have been. Afer this change the below test fails to complete on

> my hardware.

> 

> Host:

> echo "host" > /dev/ttyACM0

> 

> Device:

> cat < /dev/ttyGS0

> 

> This is caused by the driver incorrectly detecting end of transfer, a

> problem that had previous been masked by the continuous calling of

> dwc3_gadget_giveback() prior to 8c7d4b7b3d43.

> 

> Remediate by making the test <= instead of ==

> 

> Fixes: e0c42ce590fe ("usb: dwc3: gadget: simplify IOC handling")

> 

> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>

> ---

>  drivers/usb/dwc3/gadget.c | 2 +-

>  1 file changed, 1 insertion(+), 1 deletion(-)


I think this patch:
	https://lore.kernel.org/linux-usb/ac5a3593a94fdaa3d92e6352356b5f7a01ccdc7c.1576291140.git.thinhn@synopsys.com/

should fix this issue instead, right?

If not, do I need to include both of these?

thanks,

greg k-h

Patch

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 0c960a97ea02..464c4d9961c7 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2467,7 +2467,7 @@  static int dwc3_gadget_ep_reclaim_trb_linear(struct dwc3_ep *dep,
 
 static bool dwc3_gadget_ep_request_completed(struct dwc3_request *req)
 {
-	return req->request.actual == req->request.length;
+	return req->request.actual <= req->request.length;
 }
 
 static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,