summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Huber <nico.huber@secunet.com>2012-06-21 10:52:49 +0200
committerPatrick Georgi <patrick@georgi-clan.de>2012-06-22 08:55:22 +0200
commit445a3a04d8cb388786bbe8f997bf2034521dea09 (patch)
treedeb4b637beecab7569c5ac41f129d42c0db3c479
parent57cd1dd29679918afa650c2a7e82a474765f357d (diff)
libpayload: Shutdown reasonably if we can't init usb msc device
This lets the init of usb mass storage return if the device configuration is unusable. Also add some checks for proper shutdown so we don't free/remove an uninitialized device. Change-Id: I6daf9b38e632b6e381bcd5a7717f0f1a3150b64a Signed-off-by: Nico Huber <nico.huber@secunet.com> Reviewed-on: http://review.coreboot.org/1130 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
-rw-r--r--payloads/libpayload/drivers/usb/usbmsc.c28
-rw-r--r--payloads/libpayload/include/usb/usbmsc.h1
2 files changed, 21 insertions, 8 deletions
diff --git a/payloads/libpayload/drivers/usb/usbmsc.c b/payloads/libpayload/drivers/usb/usbmsc.c
index d1e33022c3..ac1284129b 100644
--- a/payloads/libpayload/drivers/usb/usbmsc.c
+++ b/payloads/libpayload/drivers/usb/usbmsc.c
@@ -70,9 +70,11 @@ static const char *msc_protocol_strings[0x51] = {
static void
usb_msc_destroy (usbdev_t *dev)
{
- if (usbdisk_remove)
- usbdisk_remove (dev);
- free (dev->data);
+ if (dev->data) {
+ if (MSC_INST (dev)->usbdisk_created && usbdisk_remove)
+ usbdisk_remove (dev);
+ free (dev->data);
+ }
dev->data = 0;
}
@@ -417,6 +419,9 @@ usb_msc_init (usbdev_t *dev)
{
int i, timeout;
+ /* init .data before setting .destroy */
+ dev->data = NULL;
+
dev->destroy = usb_msc_destroy;
dev->poll = usb_msc_poll;
@@ -451,6 +456,7 @@ usb_msc_init (usbdev_t *dev)
MSC_INST (dev)->protocol = interface->bInterfaceSubClass;
MSC_INST (dev)->bulk_in = 0;
MSC_INST (dev)->bulk_out = 0;
+ MSC_INST (dev)->usbdisk_created = 0;
for (i = 1; i <= dev->num_endp; i++) {
if (dev->endpoints[i].endpoint == 0)
@@ -465,10 +471,14 @@ usb_msc_init (usbdev_t *dev)
MSC_INST (dev)->bulk_out = &dev->endpoints[i];
}
- if (MSC_INST (dev)->bulk_in == 0)
- fatal ("couldn't find bulk-in endpoint");
- if (MSC_INST (dev)->bulk_out == 0)
- fatal ("couldn't find bulk-out endpoint");
+ if (MSC_INST (dev)->bulk_in == 0) {
+ printf("couldn't find bulk-in endpoint");
+ return;
+ }
+ if (MSC_INST (dev)->bulk_out == 0) {
+ printf("couldn't find bulk-out endpoint");
+ return;
+ }
debug (" using endpoint %x as in, %x as out\n",
MSC_INST (dev)->bulk_in->endpoint,
MSC_INST (dev)->bulk_out->endpoint);
@@ -514,6 +524,8 @@ usb_msc_init (usbdev_t *dev)
}
debug ("\n");
- if ((read_capacity (dev) == MSC_COMMAND_OK) && usbdisk_create)
+ if ((read_capacity (dev) == MSC_COMMAND_OK) && usbdisk_create) {
usbdisk_create (dev);
+ MSC_INST (dev)->usbdisk_created = 1;
+ }
}
diff --git a/payloads/libpayload/include/usb/usbmsc.h b/payloads/libpayload/include/usb/usbmsc.h
index b8a8ec13c9..fafa6f5979 100644
--- a/payloads/libpayload/include/usb/usbmsc.h
+++ b/payloads/libpayload/include/usb/usbmsc.h
@@ -35,6 +35,7 @@ typedef struct {
unsigned int protocol;
endpoint_t *bulk_in;
endpoint_t *bulk_out;
+ int usbdisk_created;
} usbmsc_inst_t;
#define MSC_INST(dev) ((usbmsc_inst_t*)(dev)->data)