Browse Source

[usb] Maintain a list of all USB buses

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 9 years ago
parent
commit
5e1e2069fd
2 changed files with 18 additions and 0 deletions
  1. 10
    0
      src/drivers/bus/usb.c
  2. 8
    0
      src/include/ipxe/usb.h

+ 10
- 0
src/drivers/bus/usb.c View File

@@ -40,6 +40,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
40 40
  *
41 41
  */
42 42
 
43
+/** List of USB buses */
44
+struct list_head usb_buses = LIST_HEAD_INIT ( usb_buses );
45
+
43 46
 /******************************************************************************
44 47
  *
45 48
  * Utility functions
@@ -1894,6 +1897,9 @@ int register_usb_bus ( struct usb_bus *bus ) {
1894 1897
 	if ( ( rc = bus->host->open ( bus ) ) != 0 )
1895 1898
 		goto err_open;
1896 1899
 
1900
+	/* Add to list of USB buses */
1901
+	list_add_tail ( &bus->list, &usb_buses );
1902
+
1897 1903
 	/* Register root hub */
1898 1904
 	if ( ( rc = register_usb_hub ( bus->hub ) ) != 0 )
1899 1905
 		goto err_register_hub;
@@ -1905,6 +1911,7 @@ int register_usb_bus ( struct usb_bus *bus ) {
1905 1911
 
1906 1912
 	unregister_usb_hub ( bus->hub );
1907 1913
  err_register_hub:
1914
+	list_del ( &bus->list );
1908 1915
 	bus->host->close ( bus );
1909 1916
  err_open:
1910 1917
 	return rc;
@@ -1927,6 +1934,9 @@ void unregister_usb_bus ( struct usb_bus *bus ) {
1927 1934
 	/* Unregister root hub */
1928 1935
 	unregister_usb_hub ( bus->hub );
1929 1936
 
1937
+	/* Remove from list of USB buses */
1938
+	list_del ( &bus->list );
1939
+
1930 1940
 	/* Close bus */
1931 1941
 	bus->host->close ( bus );
1932 1942
 

+ 8
- 0
src/include/ipxe/usb.h View File

@@ -916,6 +916,8 @@ struct usb_bus {
916 916
 	/** Root hub */
917 917
 	struct usb_hub *hub;
918 918
 
919
+	/** List of USB buses */
920
+	struct list_head list;
919 921
 	/** List of devices */
920 922
 	struct list_head devices;
921 923
 	/** List of hubs */
@@ -999,6 +1001,10 @@ usb_poll ( struct usb_bus *bus ) {
999 1001
 	bus->host->poll ( bus );
1000 1002
 }
1001 1003
 
1004
+/** Iterate over all USB buses */
1005
+#define for_each_usb_bus( bus ) \
1006
+	list_for_each_entry ( (bus), &usb_buses, list )
1007
+
1002 1008
 /**
1003 1009
  * Complete transfer (without error)
1004 1010
  *
@@ -1182,6 +1188,8 @@ usb_set_interface ( struct usb_device *usb, unsigned int interface,
1182 1188
 			     NULL, 0 );
1183 1189
 }
1184 1190
 
1191
+extern struct list_head usb_buses;
1192
+
1185 1193
 extern struct usb_interface_descriptor *
1186 1194
 usb_interface_descriptor ( struct usb_configuration_descriptor *config,
1187 1195
 			   unsigned int interface, unsigned int alternate );

Loading…
Cancel
Save