aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2020-09-29 14:32:57 +0100
committerMichael Brown <mcb30@ipxe.org>2020-09-29 14:32:57 +0100
commit627b0ba2a0ee6be1ebe863c54a6c3154d6c40e2e (patch)
tree5abff5caa5f54439c475a55e47160d255213f6f1 /src
parentfbb776f2f2d6e7f510a985af55ee34eb963ba9a2 (diff)
downloadipxe-627b0ba2a0ee6be1ebe863c54a6c3154d6c40e2e.tar.gz
[efi] Report any USB errors as EFI_USB_ERR_SYSTEM
Some UEFI USB drivers (e.g. the UsbKbDxe driver in EDK2) will react to a reported EFI_USB_ERR_STALL by attempting to clear the endpoint halt. This is redundant with iPXE's EFI_USB_IO_PROTOCOL implementation, since endpoint stalls are cleared automatically by the USB core as needed. The UEFI USB driver's attempt to clear the endpoint halt can introduce an unwanted 5 second delay per endpoint if the USB error was the result of a device being physically removed, since the control transfer will always time out. Fix by reporting all USB errors as EFI_USB_ERR_SYSTEM instead of EFI_USB_ERR_STALL. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
-rw-r--r--src/interface/efi/efi_usb.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/src/interface/efi/efi_usb.c b/src/interface/efi/efi_usb.c
index da8ae8f3e..f280a681b 100644
--- a/src/interface/efi/efi_usb.c
+++ b/src/interface/efi/efi_usb.c
@@ -412,7 +412,7 @@ static void efi_usb_async_complete ( struct usb_endpoint *ep,
goto drop;
/* Construct status */
- status = ( ( rc == 0 ) ? 0 : EFI_USB_ERR_STALL );
+ status = ( ( rc == 0 ) ? 0 : EFI_USB_ERR_SYSTEM );
/* Report completion */
usbep->callback ( iobuf->data, iob_len ( iobuf ), usbep->context,
@@ -600,8 +600,7 @@ efi_usb_control_transfer ( EFI_USB_IO_PROTOCOL *usbio,
"failed: %s\n", usbintf->name, request, value, index,
le16_to_cpu ( packet->Length ), data, ( ( size_t ) len ),
strerror ( rc ) );
- /* Assume that any error represents a stall */
- *status = EFI_USB_ERR_STALL;
+ *status = EFI_USB_ERR_SYSTEM;
goto err_control;
}