mirror of https://github.com/acidanthera/audk.git
Enhance Partition driver for EFI_NO_MEDIA case
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9070 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
339c754a01
commit
9afd0514a6
|
@ -4,7 +4,7 @@
|
||||||
of the raw block devices media. Currently "El Torito CD-ROM", Legacy
|
of the raw block devices media. Currently "El Torito CD-ROM", Legacy
|
||||||
MBR, and GPT partition schemes are supported.
|
MBR, and GPT partition schemes are supported.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2008, Intel Corporation. <BR>
|
Copyright (c) 2006 - 2009, Intel Corporation. <BR>
|
||||||
All rights reserved. This program and the accompanying materials
|
All rights reserved. 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
|
||||||
|
@ -179,6 +179,7 @@ PartitionDriverBindingStart (
|
||||||
EFI_DISK_IO_PROTOCOL *DiskIo;
|
EFI_DISK_IO_PROTOCOL *DiskIo;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||||
PARTITION_DETECT_ROUTINE *Routine;
|
PARTITION_DETECT_ROUTINE *Routine;
|
||||||
|
BOOLEAN MediaPresent;
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
|
@ -227,10 +228,12 @@ PartitionDriverBindingStart (
|
||||||
OpenStatus = Status;
|
OpenStatus = Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// If no media is present, do nothing here.
|
// Try to read blocks when there's media or it is removable physical partition.
|
||||||
//
|
//
|
||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
if (BlockIo->Media->MediaPresent) {
|
MediaPresent = BlockIo->Media->MediaPresent;
|
||||||
|
if (BlockIo->Media->MediaPresent ||
|
||||||
|
(BlockIo->Media->RemovableMedia && !BlockIo->Media->LogicalPartition)) {
|
||||||
//
|
//
|
||||||
// Try for GPT, then El Torito, and then legacy MBR partition types. If the
|
// Try for GPT, then El Torito, and then legacy MBR partition types. If the
|
||||||
// media supports a given partition type install child handles to represent
|
// media supports a given partition type install child handles to represent
|
||||||
|
@ -245,7 +248,7 @@ PartitionDriverBindingStart (
|
||||||
BlockIo,
|
BlockIo,
|
||||||
ParentDevicePath
|
ParentDevicePath
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status) || Status == EFI_MEDIA_CHANGED) {
|
if (!EFI_ERROR (Status) || Status == EFI_MEDIA_CHANGED || Status == EFI_NO_MEDIA) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Routine++;
|
Routine++;
|
||||||
|
@ -257,7 +260,16 @@ PartitionDriverBindingStart (
|
||||||
// driver. So don't try to close them. Otherwise, we will break the dependency
|
// driver. So don't try to close them. Otherwise, we will break the dependency
|
||||||
// between the controller and the driver set up before.
|
// between the controller and the driver set up before.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && !EFI_ERROR (OpenStatus) && Status != EFI_MEDIA_CHANGED) {
|
// In the case that when the media changes on a device it will Reinstall the
|
||||||
|
// BlockIo interaface. This will cause a call to our Stop(), and a subsequent
|
||||||
|
// reentrant call to our Start() successfully. We should leave the device open
|
||||||
|
// when this happen. The "media change" case includes either the status is
|
||||||
|
// EFI_MEDIA_CHANGED or it is a "media" to "no media" change.
|
||||||
|
//
|
||||||
|
if (EFI_ERROR (Status) &&
|
||||||
|
!EFI_ERROR (OpenStatus) &&
|
||||||
|
Status != EFI_MEDIA_CHANGED &&
|
||||||
|
!(MediaPresent && Status == EFI_NO_MEDIA)) {
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiDiskIoProtocolGuid,
|
&gEfiDiskIoProtocolGuid,
|
||||||
|
|
Loading…
Reference in New Issue