mirror of
https://github.com/ipxe/ipxe
synced 2025-12-15 09:04:37 +03:00
[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>
This commit is contained in:
@@ -412,7 +412,7 @@ static void efi_usb_async_complete ( struct usb_endpoint *ep,
|
|||||||
goto drop;
|
goto drop;
|
||||||
|
|
||||||
/* Construct status */
|
/* Construct status */
|
||||||
status = ( ( rc == 0 ) ? 0 : EFI_USB_ERR_STALL );
|
status = ( ( rc == 0 ) ? 0 : EFI_USB_ERR_SYSTEM );
|
||||||
|
|
||||||
/* Report completion */
|
/* Report completion */
|
||||||
usbep->callback ( iobuf->data, iob_len ( iobuf ), usbep->context,
|
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,
|
"failed: %s\n", usbintf->name, request, value, index,
|
||||||
le16_to_cpu ( packet->Length ), data, ( ( size_t ) len ),
|
le16_to_cpu ( packet->Length ), data, ( ( size_t ) len ),
|
||||||
strerror ( rc ) );
|
strerror ( rc ) );
|
||||||
/* Assume that any error represents a stall */
|
*status = EFI_USB_ERR_SYSTEM;
|
||||||
*status = EFI_USB_ERR_STALL;
|
|
||||||
goto err_control;
|
goto err_control;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user