summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2019-09-15 11:40:23 +0200
committerMichael Brown2019-09-15 11:40:23 +0200
commit41a9a5c7b3674f0fac6d8fa3b633cde17c2df78f (patch)
tree0626878d6100aa2a3e322f4e5200b14b3a1751aa
parent[efi] Report failed control transfers as expected by the USB core (diff)
downloadipxe-41a9a5c7b3674f0fac6d8fa3b633cde17c2df78f.tar.gz
ipxe-41a9a5c7b3674f0fac6d8fa3b633cde17c2df78f.tar.xz
ipxe-41a9a5c7b3674f0fac6d8fa3b633cde17c2df78f.zip
[efi] Do not attempt EFI_USB_IO_PROTOCOL transfers during shutdown
On at least some platforms (observed with a Raspberry Pi), any attempt to perform USB transfers via EFI_USB_IO_PROTOCOL during EFI shutdown will lock up the system. This is quite probably due to the already documented failure of all EFI timers when ExitBootServices() is called: see e.g. commit 5cf5ffea2 "[efi] Work around temporal anomaly encountered during ExitBootServices()". Work around this problem by refusing to poll endpoints if shutdown is in progress, and by immediately failing any attempts to enqueue new transfers. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/usb/usbio.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/drivers/usb/usbio.c b/src/drivers/usb/usbio.c
index e91416fd..dfb93dab 100644
--- a/src/drivers/usb/usbio.c
+++ b/src/drivers/usb/usbio.c
@@ -972,6 +972,10 @@ static int usbio_endpoint_enqueue ( struct usb_endpoint *ep,
unsigned int fill;
unsigned int index;
+ /* Fail if shutdown is in progress */
+ if ( efi_shutdown_in_progress )
+ return -ECANCELED;
+
/* Fail if transfer ring is full */
fill = ( endpoint->prod - endpoint->cons );
if ( fill >= USBIO_RING_COUNT )
@@ -1026,6 +1030,10 @@ static int usbio_endpoint_stream ( struct usb_endpoint *ep,
*/
static void usbio_endpoint_poll ( struct usbio_endpoint *endpoint ) {
+ /* Do nothing if shutdown is in progress */
+ if ( efi_shutdown_in_progress )
+ return;
+
/* Poll endpoint */
endpoint->op->poll ( endpoint );
}