From 4474d6827c5f08bd0e9a9ba91fc8bf149df21d28 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Tue, 28 Aug 2007 20:50:41 +0000 Subject: binding a device driver could fail.. handle this case git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14493 a1c6a512-1295-4272-9138-f99709370657 --- firmware/usbstack/core/core.c | 12 +++++++++--- firmware/usbstack/device.h | 2 +- firmware/usbstack/drivers/device/usb_serial.c | 5 +++-- firmware/usbstack/drivers/device/usb_serial.h | 2 +- firmware/usbstack/drivers/device/usb_storage.c | 5 +++-- firmware/usbstack/drivers/device/usb_storage.h | 4 ++-- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/firmware/usbstack/core/core.c b/firmware/usbstack/core/core.c index e201b7547f..2fbec5d571 100644 --- a/firmware/usbstack/core/core.c +++ b/firmware/usbstack/core/core.c @@ -378,6 +378,8 @@ static void update_driver_names(unsigned char* result) { static void bind_device_driver(struct usb_device_driver* driver) { + int ret = 0; + /* look if there is an old driver */ if (usbcore.active_controller->device_driver != NULL) { usbcore.active_controller->device_driver->unbind(); @@ -387,7 +389,11 @@ static void bind_device_driver(struct usb_device_driver* driver) { usbcore.active_controller->device_driver = driver; /* init dirver */ - driver->bind(usbcore.active_controller->controller_ops); -} - + ret = driver->bind(usbcore.active_controller->controller_ops); + if (ret != 0) { + logf("binding of %s failed", driver->name); + usbcore.active_controller->device_driver = NULL; + usbcore.device_driver = NULL; + } +} diff --git a/firmware/usbstack/device.h b/firmware/usbstack/device.h index 6a7a9998ff..f1052ff9ab 100644 --- a/firmware/usbstack/device.h +++ b/firmware/usbstack/device.h @@ -25,7 +25,7 @@ */ struct usb_device_driver { const char* name; - void (*bind)(void* controller_ops); + int (*bind)(void* controller_ops); void (*unbind)(void); int (*request)(struct usb_ctrlrequest* req); void (*suspend)(void); diff --git a/firmware/usbstack/drivers/device/usb_serial.c b/firmware/usbstack/drivers/device/usb_serial.c index 7299dc6765..0e6d7bf9f9 100644 --- a/firmware/usbstack/drivers/device/usb_serial.c +++ b/firmware/usbstack/drivers/device/usb_serial.c @@ -169,7 +169,7 @@ void usb_serial_driver_init(void) /*-------------------------------------------------------------------------*/ -void usb_serial_driver_bind(void* controler_ops) +int usb_serial_driver_bind(void* controler_ops) { logf("usb serial: bind"); ops = controler_ops; @@ -201,10 +201,11 @@ void usb_serial_driver_bind(void* controler_ops) serial_debug_desc.bDebugInEndpoint = dev.in->ep_num; serial_debug_desc.bDebugOutEndpoint = dev.out->ep_num; - return; + return 0; autoconf_fail: logf("failed to find endpoints"); + return -EOPNOTSUPP; } int usb_serial_driver_request(struct usb_ctrlrequest* request) diff --git a/firmware/usbstack/drivers/device/usb_serial.h b/firmware/usbstack/drivers/device/usb_serial.h index 657a233f05..8b9d96814e 100644 --- a/firmware/usbstack/drivers/device/usb_serial.h +++ b/firmware/usbstack/drivers/device/usb_serial.h @@ -25,7 +25,7 @@ /* register serial driver in usb stack */ void usb_serial_driver_init(void); -void usb_serial_driver_bind(void* controller_ops); +int usb_serial_driver_bind(void* controller_ops); int usb_serial_driver_request(struct usb_ctrlrequest* req); void usb_serial_driver_speed(enum usb_device_speed speed); diff --git a/firmware/usbstack/drivers/device/usb_storage.c b/firmware/usbstack/drivers/device/usb_storage.c index 3db379c1df..7d7ab8c4b8 100644 --- a/firmware/usbstack/drivers/device/usb_storage.c +++ b/firmware/usbstack/drivers/device/usb_storage.c @@ -160,7 +160,7 @@ void usb_storage_driver_init(void) /*-------------------------------------------------------------------------*/ /* device driver ops */ -void usb_storage_driver_bind(void* controler_ops) +int usb_storage_driver_bind(void* controler_ops) { ops = controler_ops; @@ -181,10 +181,11 @@ void usb_storage_driver_bind(void* controler_ops) dev.out->claimed = true; logf("usb storage: out: %s", dev.out->name); - return; + return 0; autoconf_fail: logf("failed to find endpoints"); + return -EOPNOTSUPP; } int usb_storage_driver_request(struct usb_ctrlrequest* request) diff --git a/firmware/usbstack/drivers/device/usb_storage.h b/firmware/usbstack/drivers/device/usb_storage.h index ff4b187064..efd20fe8ee 100644 --- a/firmware/usbstack/drivers/device/usb_storage.h +++ b/firmware/usbstack/drivers/device/usb_storage.h @@ -22,10 +22,10 @@ #include "usbstack/core.h" -/* register serial driver in usb stack */ +/* register storage driver in usb stack */ void usb_storage_driver_init(void); -void usb_storage_driver_bind(void* controller_ops); +int usb_storage_driver_bind(void* controller_ops); int usb_storage_driver_request(struct usb_ctrlrequest* req); void usb_storage_driver_speed(enum usb_device_speed speed); -- cgit v1.2.3