]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[usb] Maintain a list of all USB buses
authorMichael Brown <mcb30@ipxe.org>
Fri, 8 May 2015 14:07:26 +0000 (15:07 +0100)
committerMichael Brown <mcb30@ipxe.org>
Sat, 9 May 2015 18:37:29 +0000 (19:37 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/bus/usb.c
src/include/ipxe/usb.h

index 2b9efa4549c7219e9094a670bf59b34421a197bd..3484cba13a2b4e4030352397e296d6b43f1595f6 100644 (file)
@@ -40,6 +40,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  *
  */
 
+/** List of USB buses */
+struct list_head usb_buses = LIST_HEAD_INIT ( usb_buses );
+
 /******************************************************************************
  *
  * Utility functions
@@ -1894,6 +1897,9 @@ int register_usb_bus ( struct usb_bus *bus ) {
        if ( ( rc = bus->host->open ( bus ) ) != 0 )
                goto err_open;
 
+       /* Add to list of USB buses */
+       list_add_tail ( &bus->list, &usb_buses );
+
        /* Register root hub */
        if ( ( rc = register_usb_hub ( bus->hub ) ) != 0 )
                goto err_register_hub;
@@ -1905,6 +1911,7 @@ int register_usb_bus ( struct usb_bus *bus ) {
 
        unregister_usb_hub ( bus->hub );
  err_register_hub:
+       list_del ( &bus->list );
        bus->host->close ( bus );
  err_open:
        return rc;
@@ -1927,6 +1934,9 @@ void unregister_usb_bus ( struct usb_bus *bus ) {
        /* Unregister root hub */
        unregister_usb_hub ( bus->hub );
 
+       /* Remove from list of USB buses */
+       list_del ( &bus->list );
+
        /* Close bus */
        bus->host->close ( bus );
 
index 50d8a6fd8e8e20a3ae5967c299cd9c37fa82e1b3..d326678c8d763398c09c942de0783ca4f931fff8 100644 (file)
@@ -916,6 +916,8 @@ struct usb_bus {
        /** Root hub */
        struct usb_hub *hub;
 
+       /** List of USB buses */
+       struct list_head list;
        /** List of devices */
        struct list_head devices;
        /** List of hubs */
@@ -999,6 +1001,10 @@ usb_poll ( struct usb_bus *bus ) {
        bus->host->poll ( bus );
 }
 
+/** Iterate over all USB buses */
+#define for_each_usb_bus( bus ) \
+       list_for_each_entry ( (bus), &usb_buses, list )
+
 /**
  * Complete transfer (without error)
  *
@@ -1182,6 +1188,8 @@ usb_set_interface ( struct usb_device *usb, unsigned int interface,
                             NULL, 0 );
 }
 
+extern struct list_head usb_buses;
+
 extern struct usb_interface_descriptor *
 usb_interface_descriptor ( struct usb_configuration_descriptor *config,
                           unsigned int interface, unsigned int alternate );