Browse Source

[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>
tags/v1.20.1
Michael Brown 4 years ago
parent
commit
41a9a5c7b3
1 changed files with 8 additions and 0 deletions
  1. 8
    0
      src/drivers/usb/usbio.c

+ 8
- 0
src/drivers/usb/usbio.c View File

@@ -972,6 +972,10 @@ static int usbio_endpoint_enqueue ( struct usb_endpoint *ep,
972 972
 	unsigned int fill;
973 973
 	unsigned int index;
974 974
 
975
+	/* Fail if shutdown is in progress */
976
+	if ( efi_shutdown_in_progress )
977
+		return -ECANCELED;
978
+
975 979
 	/* Fail if transfer ring is full */
976 980
 	fill = ( endpoint->prod - endpoint->cons );
977 981
 	if ( fill >= USBIO_RING_COUNT )
@@ -1026,6 +1030,10 @@ static int usbio_endpoint_stream ( struct usb_endpoint *ep,
1026 1030
  */
1027 1031
 static void usbio_endpoint_poll ( struct usbio_endpoint *endpoint ) {
1028 1032
 
1033
+	/* Do nothing if shutdown is in progress */
1034
+	if ( efi_shutdown_in_progress )
1035
+		return;
1036
+
1029 1037
 	/* Poll endpoint */
1030 1038
 	endpoint->op->poll ( endpoint );
1031 1039
 }

Loading…
Cancel
Save