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>
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,
"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;
}