aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/drivers/bus/usb.c18
-rw-r--r--src/include/ipxe/usb.h8
2 files changed, 20 insertions, 6 deletions
diff --git a/src/drivers/bus/usb.c b/src/drivers/bus/usb.c
index 8900324aa..397e5a84d 100644
--- a/src/drivers/bus/usb.c
+++ b/src/drivers/bus/usb.c
@@ -1314,6 +1314,9 @@ static int usb_attached ( struct usb_port *port ) {
struct usb_device *usb;
int rc;
+ /* Mark port as attached */
+ port->attached = 1;
+
/* Sanity checks */
assert ( port->usb == NULL );
@@ -1345,8 +1348,12 @@ static int usb_attached ( struct usb_port *port ) {
static void usb_detached ( struct usb_port *port ) {
struct usb_device *usb = port->usb;
- /* Sanity checks */
- assert ( port->usb != NULL );
+ /* Mark port as detached */
+ port->attached = 0;
+
+ /* Do nothing if we have no USB device */
+ if ( ! usb )
+ return;
/* Unregister USB device */
unregister_usb ( usb );
@@ -1373,10 +1380,10 @@ static int usb_hotplug ( struct usb_port *port ) {
}
/* Handle attached/detached device as applicable */
- if ( port->speed && ! port->usb ) {
+ if ( port->speed && ! port->attached ) {
/* Newly attached device */
return usb_attached ( port );
- } else if ( port->usb && ! port->speed ) {
+ } else if ( port->attached && ! port->speed ) {
/* Newly detached device */
usb_detached ( port );
return 0;
@@ -1546,7 +1553,7 @@ void unregister_usb_hub ( struct usb_hub *hub ) {
/* Detach all devices */
for ( i = 1 ; i <= hub->ports ; i++ ) {
port = usb_port ( hub, i );
- if ( port->usb )
+ if ( port->attached )
usb_detached ( port );
}
@@ -1576,6 +1583,7 @@ void free_usb_hub ( struct usb_hub *hub ) {
/* Sanity checks */
for ( i = 1 ; i <= hub->ports ; i++ ) {
port = usb_port ( hub, i );
+ assert ( ! port->attached );
assert ( port->usb == NULL );
assert ( list_empty ( &port->list ) );
}
diff --git a/src/include/ipxe/usb.h b/src/include/ipxe/usb.h
index 1f5a85ecd..8e1824160 100644
--- a/src/include/ipxe/usb.h
+++ b/src/include/ipxe/usb.h
@@ -702,7 +702,13 @@ struct usb_port {
unsigned int protocol;
/** Port speed */
unsigned int speed;
- /** Currently attached device (if any) */
+ /** Port has an attached device */
+ int attached;
+ /** Currently attached device (if in use)
+ *
+ * Note that this field will be NULL if the attached device
+ * has been freed (e.g. because there were no drivers found).
+ */
struct usb_device *usb;
/** List of changed ports */
struct list_head list;