Implementation of the command set of USB Mass Storage Specification\r
for Bootability, Revision 1.0.\r
\r
-Copyright (c) 2007 - 2008, Intel Corporation\r
+Copyright (c) 2007 - 2010, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
);\r
if (EFI_ERROR (Status) || CmdResult != USB_MASS_CMD_SUCCESS) {\r
DEBUG ((EFI_D_ERROR, "UsbBootRequestSense: (%r) CmdResult=0x%x\n", Status, CmdResult));\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ }\r
return Status;\r
}\r
\r
\r
case USB_BOOT_SENSE_NOT_READY:\r
Status = EFI_DEVICE_ERROR;\r
- if (SenseData.ASC == USB_BOOT_ASC_NO_MEDIA) {\r
+ if (SenseData.Asc == USB_BOOT_ASC_NO_MEDIA) {\r
Media->MediaPresent = FALSE;\r
Status = EFI_NO_MEDIA;\r
- } else if (SenseData.ASC == USB_BOOT_ASC_NOT_READY) {\r
+ } else if (SenseData.Asc == USB_BOOT_ASC_NOT_READY) {\r
Status = EFI_NOT_READY;\r
}\r
break;\r
\r
case USB_BOOT_SENSE_UNIT_ATTENTION:\r
Status = EFI_DEVICE_ERROR;\r
- if (SenseData.ASC == USB_BOOT_ASC_MEDIA_CHANGE) {\r
+ if (SenseData.Asc == USB_BOOT_ASC_MEDIA_CHANGE) {\r
//\r
// If MediaChange, reset ReadOnly and new MediaId\r
//\r
DEBUG ((EFI_D_INFO, "UsbBootRequestSense: (%r) with sense key %x/%x/%x\n",\r
Status,\r
USB_BOOT_SENSE_KEY (SenseData.SenseKey),\r
- SenseData.ASC,\r
- SenseData.ASCQ\r
+ SenseData.Asc,\r
+ SenseData.Ascq\r
));\r
\r
return Status;\r
{\r
EFI_STATUS Status;\r
UINTN Retry;\r
+ UINT8 Terminate;\r
\r
Status = EFI_SUCCESS;\r
\r
- for (Retry = 0; Retry < USB_BOOT_COMMAND_RETRY; Retry++) {\r
-\r
+ for (Retry = 0, Terminate = 0; Retry < USB_BOOT_COMMAND_RETRY; Retry++) {\r
Status = UsbBootExecCmd (\r
UsbMass,\r
Cmd,\r
//\r
// If the device isn't ready, just wait for it without limit on retrial times.\r
//\r
- if (Status == EFI_NOT_READY) {\r
+ if (Status == EFI_NOT_READY && Terminate < 3) {\r
Retry = 0;\r
+ Terminate++;\r
}\r
}\r
\r
USB_BOOT_READ_CAPACITY_DATA CapacityData;\r
EFI_BLOCK_IO_MEDIA *Media;\r
EFI_STATUS Status;\r
+ UINT32 BlockSize;\r
\r
Media = &UsbMass->BlockIoMedia;\r
\r
//\r
Media->MediaPresent = TRUE;\r
Media->LastBlock = SwapBytes32 (ReadUnaligned32 ((CONST UINT32 *) CapacityData.LastLba));\r
- Media->BlockSize = SwapBytes32 (ReadUnaligned32 ((CONST UINT32 *) CapacityData.BlockLen));\r
\r
- if (Media->BlockSize == 0) {\r
- return EFI_NOT_READY;\r
+ BlockSize = SwapBytes32 (ReadUnaligned32 ((CONST UINT32 *) CapacityData.BlockLen));\r
+ if (BlockSize == 0) {\r
+ //\r
+ // Get sense data \r
+ //\r
+ return UsbBootRequestSense (UsbMass);\r
+ } else {\r
+ Media->BlockSize = BlockSize;\r
}\r
\r
DEBUG ((EFI_D_INFO, "UsbBootReadCapacity Success LBA=%ld BlockSize=%d\n",\r
Media->LastBlock, Media->BlockSize));\r
\r
- return EFI_SUCCESS;\r
+ return Status;\r
}\r
\r
/**\r