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 5 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
 	unsigned int fill;
972
 	unsigned int fill;
973
 	unsigned int index;
973
 	unsigned int index;
974
 
974
 
975
+	/* Fail if shutdown is in progress */
976
+	if ( efi_shutdown_in_progress )
977
+		return -ECANCELED;
978
+
975
 	/* Fail if transfer ring is full */
979
 	/* Fail if transfer ring is full */
976
 	fill = ( endpoint->prod - endpoint->cons );
980
 	fill = ( endpoint->prod - endpoint->cons );
977
 	if ( fill >= USBIO_RING_COUNT )
981
 	if ( fill >= USBIO_RING_COUNT )
1026
  */
1030
  */
1027
 static void usbio_endpoint_poll ( struct usbio_endpoint *endpoint ) {
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
 	/* Poll endpoint */
1037
 	/* Poll endpoint */
1030
 	endpoint->op->poll ( endpoint );
1038
 	endpoint->op->poll ( endpoint );
1031
 }
1039
 }

Loading…
Cancel
Save