X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FDisk%2FPartition%2FDxe%2FPartition.c;h=6a896e4e722d5ff426e01e2841004e4e9d6af442;hp=504d98357fabee76023071c33b0112613ebdcee5;hb=1cc8ee7861a59532700a6fd1255689576eda0f52;hpb=61fb1657e5b2b37a2ec5c879f6fa7689100f0d54 diff --git a/EdkModulePkg/Universal/Disk/Partition/Dxe/Partition.c b/EdkModulePkg/Universal/Disk/Partition/Dxe/Partition.c index 504d98357f..6a896e4e72 100644 --- a/EdkModulePkg/Universal/Disk/Partition/Dxe/Partition.c +++ b/EdkModulePkg/Universal/Disk/Partition/Dxe/Partition.c @@ -71,6 +71,15 @@ EFI_DRIVER_BINDING_PROTOCOL gPartitionDriverBinding = { NULL }; +STATIC +PARTITION_DETECT_ROUTINE mPartitionDetectRoutineTable[] = { + PartitionInstallGptChildHandles, + PartitionInstallElToritoChildHandles, + PartitionInstallMbrChildHandles, + NULL +}; + + EFI_STATUS EFIAPI PartitionDriverBindingSupported ( @@ -212,6 +221,7 @@ PartitionDriverBindingStart ( EFI_BLOCK_IO_PROTOCOL *BlockIo; EFI_DISK_IO_PROTOCOL *DiskIo; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; + PARTITION_DETECT_ROUTINE *Routine; Status = gBS->OpenProtocol ( ControllerHandle, @@ -269,32 +279,19 @@ PartitionDriverBindingStart ( // media supports a given partition type install child handles to represent // the partitions described by the media. // - if (PartitionInstallGptChildHandles ( - This, - ControllerHandle, - DiskIo, - BlockIo, - ParentDevicePath - ) || - - PartitionInstallElToritoChildHandles ( - This, - ControllerHandle, - DiskIo, - BlockIo, - ParentDevicePath - ) || - - PartitionInstallMbrChildHandles ( - This, - ControllerHandle, - DiskIo, - BlockIo, - ParentDevicePath - )) { - Status = EFI_SUCCESS; - } else { - Status = EFI_NOT_FOUND; + Routine = &mPartitionDetectRoutineTable[0]; + while (*Routine != NULL) { + Status = (*Routine) ( + This, + ControllerHandle, + DiskIo, + BlockIo, + ParentDevicePath + ); + if (!EFI_ERROR (Status) || Status == EFI_MEDIA_CHANGED) { + break; + } + Routine++; } } // @@ -303,7 +300,7 @@ PartitionDriverBindingStart ( // driver. So don't try to close them. Otherwise, we will break the dependency // between the controller and the driver set up before. // - if (EFI_ERROR (Status) && !EFI_ERROR (OpenStatus)) { + if (EFI_ERROR (Status) && !EFI_ERROR (OpenStatus) && Status != EFI_MEDIA_CHANGED) { gBS->CloseProtocol ( ControllerHandle, &gEfiDiskIoProtocolGuid, @@ -440,6 +437,7 @@ PartitionDriverBindingStop ( return EFI_SUCCESS; } +STATIC EFI_STATUS EFIAPI PartitionReset ( @@ -472,6 +470,7 @@ PartitionReset ( ); } +STATIC EFI_STATUS EFIAPI PartitionReadBlocks ( @@ -527,6 +526,7 @@ PartitionReadBlocks ( return Private->DiskIo->ReadDisk (Private->DiskIo, MediaId, Offset, BufferSize, Buffer); } +STATIC EFI_STATUS EFIAPI PartitionWriteBlocks ( @@ -583,6 +583,7 @@ PartitionWriteBlocks ( return Private->DiskIo->WriteDisk (Private->DiskIo, MediaId, Offset, BufferSize, Buffer); } +STATIC EFI_STATUS EFIAPI PartitionFlushBlocks (