[RFT PATCH v1 2/5] usb: Handle XACTERR error in DATA phase of USB storage

Lukasz Majewski
2020-03-22T13:00:28Z

This change brings support for handling XACTERR error during DATA phase
of USB BBB (bulk) transmission.

The fix is to clear stall'ed endpoint and reset recovery on the USB mass
storage class.

This code is the port to newest U-Boot of the fix from - "rayvt" (from [1]).

Links:
[1] - https://forum.doozan.com/read.php?3,35295,35295#msg-35295
[2] - https://www.dropbox.com/s/nrkrd1no63viuu8/uboot-bodhi-2016.05-timeoutTD.patch?dl=0

Signed-off-by: Lukasz Majewski <lukma@denx.de>
[Unfortunately, the original patch [2] did not contain S-o-B from the original
author - "rayvt"]
---

common/usb_storage.c | 10 ++++++++++
include/usb_defs.h | 1 +
2 files changed, 11 insertions(+)

diff --git a/common/usb_storage.c b/common/usb_storage.c
index 097b6729c1..92e1e54d1c 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -740,6 +740,16 @@ static int usb_stor_BBB_transport(struct scsi_cmd *srb, struct us_data *us)

result = usb_bulk_msg(us->pusb_dev, pipe, srb->pdata, srb->datalen,
&data_actlen, USB_CNTL_TIMEOUT * 5);
+
+ /* special handling of XACTERR in DATA phase */
+ if (result < 0 && (us->pusb_dev->status & USB_ST_XACTERR)) {
+ debug("XACTERR in data phase - clr, reset, and return fail.\n");
+ usb_stor_BBB_clear_endpt_stall(us, dir_in ?
+ us->ep_in : us->ep_out);
+ usb_stor_BBB_reset(us);
+ return USB_STOR_TRANSPORT_FAILED;
+ }
+
/* special handling of STALL in DATA phase */
if ((result < 0) && (us->pusb_dev->status & USB_ST_STALLED)) {
debug("DATA:stall\n");
diff --git a/include/usb_defs.h b/include/usb_defs.h
index 6dd2c997f9..572f6ab296 100644
--- a/include/usb_defs.h
+++ b/include/usb_defs.h
@@ -197,6 +197,7 @@
#define USB_ST_NAK_REC 0x10 /* NAK Received*/
#define USB_ST_CRC_ERR 0x20 /* CRC/timeout Error */
#define USB_ST_BIT_ERR 0x40 /* Bitstuff error */
+#define USB_ST_XACTERR 0x80 /* XACTERR error */
#define USB_ST_NOT_PROC 0x80000000L /* Not yet processed */

--
2.20.1