[usb] Detect missed disconnections
authorMichael Brown <mcb30@ipxe.org>
Wed, 6 May 2015 15:38:28 +0000 (16:38 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 8 May 2015 13:57:14 +0000 (14:57 +0100)
commitf6604627ff71d42bb63a3d81c2986a9d296d55cb
tree8eb038959b4e3429c4c15e9a1a7a5bd73e68c2b2
parentb88ab14ba38d0eb2123975ed78c8eb04ba13cf72
[usb] Detect missed disconnections

The USB core will currently fail to detect disconnections if a new
device has attached by the time the port is examined in
usb_hotplug().

Fix by recording the fact that a disconnection has taken place
whenever the "connection status changed" (CSC) bit is observed to be
set.  (Whether the change represents a disconnection or a
reconnection, it indicates that the port has experienced some time of
being disconnected.)

Note that the time at which a disconnection can be detected varies by
hub type.  In particular: root hubs can observe the CSC bit when
polling, and so will record the disconnection before calling
usb_port_changed(), but USB hubs read the port status (and hence the
CSC bit) only during the call to hub_speed(), long after the call to
usb_port_changed().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/bus/usb.c
src/drivers/usb/ehci.c
src/drivers/usb/usbhub.c
src/drivers/usb/xhci.c
src/include/ipxe/usb.h