mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-28 16:14:04 +02:00
MdeModulePkg/UsbMassStorage: Don't send READ_CAPACITY to unsupported usb mass storage type device.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Tian, Feng <feng.tian@intel.com> Reviewed-by: Zeng, Star <star.zeng@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15447 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
d8adff447d
commit
66a5771e7a
@ -2,7 +2,7 @@
|
|||||||
Implementation of the command set of USB Mass Storage Specification
|
Implementation of the command set of USB Mass Storage Specification
|
||||||
for Bootability, Revision 1.0.
|
for Bootability, Revision 1.0.
|
||||||
|
|
||||||
Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -628,6 +628,18 @@ UsbBootGetParams (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// According to USB Mass Storage Specification for Bootability, only following
|
||||||
|
// 4 Peripheral Device Types are in spec.
|
||||||
|
//
|
||||||
|
if ((UsbMass->Pdt != USB_PDT_DIRECT_ACCESS) &&
|
||||||
|
(UsbMass->Pdt != USB_PDT_CDROM) &&
|
||||||
|
(UsbMass->Pdt != USB_PDT_OPTICAL) &&
|
||||||
|
(UsbMass->Pdt != USB_PDT_SIMPLE_DIRECT)) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "UsbBootGetParams: Found an unsupported peripheral type[%d]\n", UsbMass->Pdt));
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Don't use the Removable bit in inquiry data to test whether the media
|
// Don't use the Removable bit in inquiry data to test whether the media
|
||||||
// is removable because many flash disks wrongly set this bit.
|
// is removable because many flash disks wrongly set this bit.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
USB Mass Storage Driver that manages USB Mass Storage Device and produces Block I/O Protocol.
|
USB Mass Storage Driver that manages USB Mass Storage Device and produces Block I/O Protocol.
|
||||||
|
|
||||||
Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -464,8 +464,7 @@ ON_EXIT:
|
|||||||
@param MaxLun The max LUN number.
|
@param MaxLun The max LUN number.
|
||||||
|
|
||||||
@retval EFI_SUCCESS At least one LUN is initialized successfully.
|
@retval EFI_SUCCESS At least one LUN is initialized successfully.
|
||||||
@retval EFI_OUT_OF_RESOURCES Out of resource while creating device path node.
|
@retval EFI_NOT_FOUND Fail to initialize any of multiple LUNs.
|
||||||
@retval Other Initialization fails.
|
|
||||||
|
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -483,8 +482,10 @@ UsbMassInitMultiLun (
|
|||||||
DEVICE_LOGICAL_UNIT_DEVICE_PATH LunNode;
|
DEVICE_LOGICAL_UNIT_DEVICE_PATH LunNode;
|
||||||
UINT8 Index;
|
UINT8 Index;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
EFI_STATUS ReturnStatus;
|
||||||
|
|
||||||
ASSERT (MaxLun > 0);
|
ASSERT (MaxLun > 0);
|
||||||
|
ReturnStatus = EFI_NOT_FOUND;
|
||||||
|
|
||||||
for (Index = 0; Index <= MaxLun; Index++) {
|
for (Index = 0; Index <= MaxLun; Index++) {
|
||||||
|
|
||||||
@ -510,21 +511,10 @@ UsbMassInitMultiLun (
|
|||||||
// Initialize the media parameter data for EFI_BLOCK_IO_MEDIA of Block I/O Protocol.
|
// Initialize the media parameter data for EFI_BLOCK_IO_MEDIA of Block I/O Protocol.
|
||||||
//
|
//
|
||||||
Status = UsbMassInitMedia (UsbMass);
|
Status = UsbMassInitMedia (UsbMass);
|
||||||
if (!EFI_ERROR (Status)) {
|
if ((EFI_ERROR (Status)) && (Status != EFI_NO_MEDIA)) {
|
||||||
//
|
|
||||||
// According to USB Mass Storage Specification for Bootability, only following
|
|
||||||
// 4 Peripheral Device Types are in spec.
|
|
||||||
//
|
|
||||||
if ((UsbMass->Pdt != USB_PDT_DIRECT_ACCESS) &&
|
|
||||||
(UsbMass->Pdt != USB_PDT_CDROM) &&
|
|
||||||
(UsbMass->Pdt != USB_PDT_OPTICAL) &&
|
|
||||||
(UsbMass->Pdt != USB_PDT_SIMPLE_DIRECT)) {
|
|
||||||
DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: Found an unsupported peripheral type[%d]\n", UsbMass->Pdt));
|
|
||||||
goto ON_ERROR;
|
|
||||||
}
|
|
||||||
} else if (Status != EFI_NO_MEDIA){
|
|
||||||
DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: UsbMassInitMedia (%r)\n", Status));
|
DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: UsbMassInitMedia (%r)\n", Status));
|
||||||
goto ON_ERROR;
|
FreePool (UsbMass);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -540,9 +530,9 @@ UsbMassInitMultiLun (
|
|||||||
|
|
||||||
if (UsbMass->DevicePath == NULL) {
|
if (UsbMass->DevicePath == NULL) {
|
||||||
DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: failed to create device logic unit device path\n"));
|
DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: failed to create device logic unit device path\n"));
|
||||||
|
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_ERROR;
|
FreePool (UsbMass);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
InitializeDiskInfo (UsbMass);
|
InitializeDiskInfo (UsbMass);
|
||||||
@ -563,7 +553,9 @@ UsbMassInitMultiLun (
|
|||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: InstallMultipleProtocolInterfaces (%r)\n", Status));
|
DEBUG ((EFI_D_ERROR, "UsbMassInitMultiLun: InstallMultipleProtocolInterfaces (%r)\n", Status));
|
||||||
goto ON_ERROR;
|
FreePool (UsbMass->DevicePath);
|
||||||
|
FreePool (UsbMass);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -590,38 +582,15 @@ UsbMassInitMultiLun (
|
|||||||
&UsbMass->DiskInfo,
|
&UsbMass->DiskInfo,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
goto ON_ERROR;
|
FreePool (UsbMass->DevicePath);
|
||||||
|
FreePool (UsbMass);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
ReturnStatus = EFI_SUCCESS;
|
||||||
DEBUG ((EFI_D_INFO, "UsbMassInitMultiLun: Success to initialize No.%d logic unit\n", Index));
|
DEBUG ((EFI_D_INFO, "UsbMassInitMultiLun: Success to initialize No.%d logic unit\n", Index));
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return ReturnStatus;
|
||||||
|
|
||||||
ON_ERROR:
|
|
||||||
if (UsbMass != NULL) {
|
|
||||||
if (UsbMass->DevicePath != NULL) {
|
|
||||||
FreePool (UsbMass->DevicePath);
|
|
||||||
}
|
|
||||||
FreePool (UsbMass);
|
|
||||||
}
|
|
||||||
if (UsbIo != NULL) {
|
|
||||||
gBS->CloseProtocol (
|
|
||||||
Controller,
|
|
||||||
&gEfiUsbIoProtocolGuid,
|
|
||||||
This->DriverBindingHandle,
|
|
||||||
UsbMass->Controller
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Return EFI_SUCCESS if at least one LUN is initialized successfully.
|
|
||||||
//
|
|
||||||
if (Index > 0) {
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
} else {
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -682,19 +651,7 @@ UsbMassInitNonLun (
|
|||||||
// Initialize the media parameter data for EFI_BLOCK_IO_MEDIA of Block I/O Protocol.
|
// Initialize the media parameter data for EFI_BLOCK_IO_MEDIA of Block I/O Protocol.
|
||||||
//
|
//
|
||||||
Status = UsbMassInitMedia (UsbMass);
|
Status = UsbMassInitMedia (UsbMass);
|
||||||
if (!EFI_ERROR (Status)) {
|
if ((EFI_ERROR (Status)) && (Status != EFI_NO_MEDIA)) {
|
||||||
//
|
|
||||||
// According to USB Mass Storage Specification for Bootability, only following
|
|
||||||
// 4 Peripheral Device Types are in spec.
|
|
||||||
//
|
|
||||||
if ((UsbMass->Pdt != USB_PDT_DIRECT_ACCESS) &&
|
|
||||||
(UsbMass->Pdt != USB_PDT_CDROM) &&
|
|
||||||
(UsbMass->Pdt != USB_PDT_OPTICAL) &&
|
|
||||||
(UsbMass->Pdt != USB_PDT_SIMPLE_DIRECT)) {
|
|
||||||
DEBUG ((EFI_D_ERROR, "UsbMassInitNonLun: Found an unsupported peripheral type[%d]\n", UsbMass->Pdt));
|
|
||||||
goto ON_ERROR;
|
|
||||||
}
|
|
||||||
} else if (Status != EFI_NO_MEDIA){
|
|
||||||
DEBUG ((EFI_D_ERROR, "UsbMassInitNonLun: UsbMassInitMedia (%r)\n", Status));
|
DEBUG ((EFI_D_ERROR, "UsbMassInitNonLun: UsbMassInitMedia (%r)\n", Status));
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
@ -901,7 +858,7 @@ USBMassDriverBindingStart (
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize data for device that supports multiple LUNSs.
|
// Initialize data for device that supports multiple LUNs.
|
||||||
// EFI_SUCCESS is returned if at least 1 LUN is initialized successfully.
|
// EFI_SUCCESS is returned if at least 1 LUN is initialized successfully.
|
||||||
//
|
//
|
||||||
Status = UsbMassInitMultiLun (This, Controller, Transport, Context, DevicePath, MaxLun);
|
Status = UsbMassInitMultiLun (This, Controller, Transport, Context, DevicePath, MaxLun);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user