diff --git a/EmbeddedPkg/Ebl/EfiDevice.c b/EmbeddedPkg/Ebl/EfiDevice.c index 70ba70383c..80dcfcb5cc 100644 --- a/EmbeddedPkg/Ebl/EfiDevice.c +++ b/EmbeddedPkg/Ebl/EfiDevice.c @@ -207,13 +207,14 @@ EblDeviceCmd ( IN CHAR8 **Argv ) { + EFI_STATUS Status; UINTN Index; UINTN CurrentRow; UINTN Max; EFI_OPEN_FILE *File; CurrentRow = 0; - + // Need to call here to make sure Device Counts are valid EblUpdateDeviceLists (); @@ -227,9 +228,15 @@ EblDeviceCmd ( if (File != NULL) { if (File->FsBlockIoMedia->RemovableMedia) { if (File->FsBlockIoMedia->MediaPresent) { - gBS->DisconnectController (File->EfiHandle, NULL, NULL); + // Probe to see if media is present + Status = File->FsBlockIo->ReadBlocks (File->FsBlockIo, File->FsBlockIo->Media->MediaId, (EFI_LBA)0, 0, NULL); + if (Status == EFI_NO_MEDIA) { + gBS->DisconnectController (File->EfiHandle, NULL, NULL); + } + } else { + // Probe for media insertion and connect partition and filesystem drivers if needed + gBS->ConnectController (File->EfiHandle, NULL, NULL, TRUE); } - gBS->ConnectController (File->EfiHandle, NULL, NULL, TRUE); } EfiClose (File); } diff --git a/EmbeddedPkg/Include/Library/EfiFileLib.h b/EmbeddedPkg/Include/Library/EfiFileLib.h index 9d98b19000..9ec5246358 100644 --- a/EmbeddedPkg/Include/Library/EfiFileLib.h +++ b/EmbeddedPkg/Include/Library/EfiFileLib.h @@ -94,6 +94,7 @@ typedef struct { EFI_FILE_SYSTEM_INFO *FsInfo; EFI_FILE_INFO *FsFileInfo; EFI_BLOCK_IO_MEDIA *FsBlockIoMedia; // Information valid for Fs#: or B#: + EFI_BLOCK_IO_PROTOCOL *FsBlockIo; // Information valid for Fs#: or B#: UINTN DiskOffset; // Information valid for B#: diff --git a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c index 1db7d7d035..c93304d537 100644 --- a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c +++ b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c @@ -409,6 +409,7 @@ EblFileDevicePath ( Status = gBS->HandleProtocol (File->EfiHandle, &gEfiBlockIoProtocolGuid, (VOID **)&BlkIo); if (!EFI_ERROR (Status)) { File->FsBlockIoMedia = BlkIo->Media; + File->FsBlockIo = BlkIo; // If we are not opening the device this will get over written with file info File->MaxPosition = MultU64x32 (BlkIo->Media->LastBlock + 1, BlkIo->Media->BlockSize); @@ -1732,6 +1733,15 @@ EfiSetCwd ( return EFI_INVALID_PARAMETER; } + AsciiStrCpy (gCwd, File->DeviceName); + if (File->FileName == NULL) { + AsciiStrCat (gCwd, ":\\"); + } else { + AsciiStrCat (gCwd, ":"); + AsciiStrCat (gCwd, File->FileName); + } + + EfiClose (File); if (Path != Cwd) { FreePool (Path);