]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Do not attempt EFI_USB_IO_PROTOCOL transfers during shutdown
authorMichael Brown <mcb30@ipxe.org>
Sun, 15 Sep 2019 09:40:23 +0000 (10:40 +0100)
committerMichael Brown <mcb30@ipxe.org>
Sun, 15 Sep 2019 09:40:23 +0000 (10:40 +0100)
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>
src/drivers/usb/usbio.c

index e91416fdceac353843708134171a836203381a8e..dfb93dab18f358ddb48caee66b859a5cb763fff8 100644 (file)
@@ -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 );
 }