[coreboot] Patch set updated for coreboot: 4e52072 libpayload: Better error detection in USB mass storage

Nico Huber (nico.huber@secunet.com) gerrit at coreboot.org
Wed Jun 20 17:24:53 CEST 2012


Nico Huber (nico.huber at secunet.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1072

-gerrit

commit 4e520725dd227ade37be9274ac499671e50e7b93
Author: Nico Huber <nico.huber at secunet.com>
Date:   Mon May 21 14:05:41 2012 +0200

    libpayload: Better error detection in USB mass storage
    
    This implements status transport (CSW) more closely to the standard
    (usbmassbulk_10).
    
    Change-Id: Ife516316e054d4e87ebe698dc487eeb9ebcfd38d
    Signed-off-by: Nico Huber <nico.huber at secunet.com>
---
 payloads/libpayload/drivers/usb/usbmsc.c |   29 +++++++++++++++++++++--------
 1 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/payloads/libpayload/drivers/usb/usbmsc.c b/payloads/libpayload/drivers/usb/usbmsc.c
index 8d57736..fd6517a 100644
--- a/payloads/libpayload/drivers/usb/usbmsc.c
+++ b/payloads/libpayload/drivers/usb/usbmsc.c
@@ -151,8 +151,8 @@ get_max_luns (usbdev_t *dev)
 	return luns;
 }
 
-int tag;
-int lun = 0;
+unsigned int tag;
+unsigned char lun = 0;
 
 static void
 wrap_cbw (cbw_t *cbw, int datalen, cbw_direction dir, const u8 *cmd,
@@ -161,7 +161,7 @@ wrap_cbw (cbw_t *cbw, int datalen, cbw_direction dir, const u8 *cmd,
 	memset (cbw, 0, sizeof (cbw_t));
 
 	cbw->dCBWSignature = cbw_signature;
-	cbw->dCBWTag = tag++;
+	cbw->dCBWTag = ++tag;
 	cbw->bCBWLUN = lun;	// static value per device
 
 	cbw->dCBWDataTransferLength = datalen;
@@ -170,11 +170,22 @@ wrap_cbw (cbw_t *cbw, int datalen, cbw_direction dir, const u8 *cmd,
 	cbw->bCBWCBLength = cmdlen;
 }
 
-static void
+static int
 get_csw (endpoint_t *ep, csw_t *csw)
 {
-	if (ep->dev->controller->bulk (ep, sizeof (csw_t), (u8 *) csw, 1))
+	if (ep->dev->controller->bulk (ep, sizeof (csw_t), (u8 *) csw, 1)) {
 		clear_stall (ep);
+		if (ep->dev->controller->bulk
+				(ep, sizeof (csw_t), (u8 *) csw, 1)) {
+			reset_transport (ep->dev);
+			return 1;
+		}
+	}
+	if (csw->dCSWTag != tag) {
+		reset_transport (ep->dev);
+		return 1;
+	}
+	return 0;
 }
 
 static int
@@ -209,7 +220,8 @@ execute_command (usbdev_t *dev, cbw_direction dir, const u8 *cb, int cblen,
 			}
 		}
 	}
-	get_csw (MSC_INST (dev)->bulk_in, &csw);
+	if (get_csw (MSC_INST (dev)->bulk_in, &csw))
+		return 1;
 	if (always_succeed == 1) {
 		// return success, regardless of message
 		return 0;
@@ -223,8 +235,9 @@ execute_command (usbdev_t *dev, cbw_direction dir, const u8 *cb, int cblen,
 		// no error, exit
 		return 0;
 	}
-	// error "check condition" or reserved error
-	request_sense (dev);
+	if (cb[0] != 0x03) /* 0x03 == request sense */
+		// error "check condition" or reserved error
+		request_sense (dev);
 	return 1;
 }
 




More information about the coreboot mailing list