mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/UsbMass: Not retry if usb bot transfer execution fail
The retry mechanism will bring issue if the usb device is unplugged from XHCI HC but s/w is trying to access it through BlockIo. The current cmd will get device error return status, but the sequential cmds will be timeout. This behavior will cause system unresponsive for a long while and bring bad user experience. So we break the retry loop if found device error. Cc: Star Zeng <star.zeng@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Feng Tian <feng.tian@intel.com>
This commit is contained in:
parent
fda951df68
commit
17f3e942bc
|
@ -2,7 +2,7 @@
|
|||
Implementation of the command set of USB Mass Storage Specification
|
||||
for Bootability, Revision 1.0.
|
||||
|
||||
Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -189,6 +189,11 @@ UsbBootExecCmd (
|
|||
return EFI_TIMEOUT;
|
||||
}
|
||||
|
||||
if (Status == EFI_DEVICE_ERROR) {
|
||||
DEBUG ((EFI_D_ERROR, "UsbBootExecCmd: Device Error to Exec 0x%x Cmd\n", *(UINT8 *)Cmd));
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
//
|
||||
// If ExecCommand() returns no error and CmdResult is success,
|
||||
// then the commnad transfer is successful.
|
||||
|
@ -271,7 +276,7 @@ UsbBootExecCmdWithRetry (
|
|||
DataLen,
|
||||
Timeout
|
||||
);
|
||||
if (Status == EFI_SUCCESS || Status == EFI_MEDIA_CHANGED || Status == EFI_NO_MEDIA) {
|
||||
if (Status == EFI_SUCCESS || Status == EFI_MEDIA_CHANGED || Status == EFI_NO_MEDIA || Status == EFI_DEVICE_ERROR) {
|
||||
break;
|
||||
}
|
||||
//
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
Implementation of the USB mass storage Bulk-Only Transport protocol,
|
||||
according to USB Mass Storage Class Bulk-Only Transport, Revision 1.0.
|
||||
|
||||
Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -432,7 +432,11 @@ UsbBotExecCommand (
|
|||
// whether it succeeds or fails.
|
||||
//
|
||||
TransLen = (UINTN) DataLen;
|
||||
UsbBotDataTransfer (UsbBot, DataDir, Data, &TransLen, Timeout);
|
||||
Status = UsbBotDataTransfer (UsbBot, DataDir, Data, &TransLen, Timeout);
|
||||
if (Status == EFI_DEVICE_ERROR) {
|
||||
DEBUG ((EFI_D_ERROR, "UsbBotExecCommand: UsbBotDataTransfer (%r)\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the status, if that succeeds, interpret the result
|
||||
|
|
Loading…
Reference in New Issue