[coreboot] New patch to review for coreboot: ab3c445 libpayload: Add usb_generic_(create|remove) functions for unrecognized devices

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Tue Mar 12 22:04:00 CET 2013


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2666

-gerrit

commit ab3c4451ea496cce5f79bd8bd74a7ec8d1ca1122
Author: Gabe Black <gabeblack at google.com>
Date:   Fri Feb 1 20:19:27 2013 -0800

    libpayload: Add usb_generic_(create|remove) functions for unrecognized devices
    
    It might be useful to provide a USB driver in the payload itself instead of in
    libpayload. For example there are multiple payloads being built and linked
    against the same libpayload, and they might not need or even want to have the
    same set of drivers installed.
    
    This change adds two new functions, usb_generic_create and usb_generic_remove,
    which behave like the usbdisk_create and usbdisk_remove functions which are
    defined for USB mass storage devices. If a USB device isn't recognized and
    claimed by one of the built in USB class drivers (currently hub, hid, and msc)
    and the create function is defined, then it will be called to give the payload
    a chance to use the device. Once it's removed, if usb_generic_remove is
    defined it will be called, effectively giving the payload notice.
    
    Built and booted depthcharge on Link. Built depthcharge for Daisy. Built
    a netbooting payload, called usb_poll() with those functions implemented, and
    verified that they were called and that the devices they were told about were
    reasonable and the same as what was reported by lsusb in the booted system.
    
    Change-Id: Ief7c0a513b60849fbf2986ef4ae5c9e7825fef16
    Signed-off-by: Gabe Black <gabeblack at google.com>
---
 payloads/libpayload/drivers/usb/usb.c | 20 ++++++++++++++++++++
 payloads/libpayload/include/usb/usb.h | 19 +++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/payloads/libpayload/drivers/usb/usb.c b/payloads/libpayload/drivers/usb/usb.c
index ff67e0c..0448d38 100644
--- a/payloads/libpayload/drivers/usb/usb.c
+++ b/payloads/libpayload/drivers/usb/usb.c
@@ -402,6 +402,7 @@ set_address (hci_t *controller, int speed, int hubport, int hubaddr)
 		usb_debug ("HID\n");
 #ifdef CONFIG_USB_HID
 		controller->devices[adr]->init = usb_hid_init;
+		return adr;
 #else
 		usb_debug ("NOTICE: USB HID support not compiled in\n");
 #endif
@@ -419,6 +420,7 @@ set_address (hci_t *controller, int speed, int hubport, int hubaddr)
 		usb_debug ("MSC\n");
 #ifdef CONFIG_USB_MSC
 		controller->devices[adr]->init = usb_msc_init;
+		return adr;
 #else
 		usb_debug ("NOTICE: USB MSC support not compiled in\n");
 #endif
@@ -427,6 +429,7 @@ set_address (hci_t *controller, int speed, int hubport, int hubaddr)
 		usb_debug ("hub\n");
 #ifdef CONFIG_USB_HUB
 		controller->devices[adr]->init = usb_hub_init;
+		return adr;
 #else
 		usb_debug ("NOTICE: USB hub support not compiled in.\n");
 #endif
@@ -456,6 +459,7 @@ set_address (hci_t *controller, int speed, int hubport, int hubaddr)
 		usb_debug("unsupported class %x\n", class);
 		break;
 	}
+	controller->devices[adr]->init = usb_generic_init;
 	return adr;
 }
 
@@ -491,3 +495,19 @@ usb_attach_device(hci_t *controller, int hubaddress, int port, int speed)
 	return controller->devices[newdev] ? newdev : -1;
 }
 
+static void
+usb_generic_destroy (usbdev_t *dev)
+{
+	if (usb_generic_remove)
+		usb_generic_remove(dev);
+}
+
+void
+usb_generic_init (usbdev_t *dev)
+{
+	dev->data = NULL;
+	dev->destroy = usb_generic_destroy;
+
+	if (usb_generic_create)
+		usb_generic_create(dev);
+}
diff --git a/payloads/libpayload/include/usb/usb.h b/payloads/libpayload/include/usb/usb.h
index d862182..d82ce27 100644
--- a/payloads/libpayload/include/usb/usb.h
+++ b/payloads/libpayload/include/usb/usb.h
@@ -238,6 +238,7 @@ void usb_nop_init (usbdev_t *dev);
 void usb_hub_init (usbdev_t *dev);
 void usb_hid_init (usbdev_t *dev);
 void usb_msc_init (usbdev_t *dev);
+void usb_generic_init (usbdev_t *dev);
 
 u8 *get_descriptor (usbdev_t *dev, unsigned char bmRequestType,
 		    int descType, int descIdx, int langID);
@@ -276,4 +277,22 @@ static inline void usb_debug(const char *fmt, ...)
 #endif
 }
 
+/**
+ * To be implemented by libpayload-client. It's called by the USB stack
+ * when a new USB device is found which isn't claimed by a built in driver,
+ * so the client has the chance to know about it.
+ *
+ * @param dev descriptor for the USB device
+ */
+void __attribute__((weak)) usb_generic_create (usbdev_t *dev);
+
+/**
+ * To be implemented by libpayload-client. It's called by the USB stack
+ * when it finds out that a USB device is removed which wasn't claimed by a
+ * built in driver.
+ *
+ * @param dev descriptor for the USB device
+ */
+void __attribute__((weak)) usb_generic_remove (usbdev_t *dev);
+
 #endif



More information about the coreboot mailing list