summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-04-30 19:40:17 +0000
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-04-30 19:40:17 +0000
commit0a0951ea841a10c5c328b5525827a1490f575cb8 (patch)
tree3d73b0c593565792ca6835cd79eb42ae5581b8b2
parent24542fb2118e3921502c70996a30a8fe7cbc2d29 (diff)
downloadedk2-platforms-0a0951ea841a10c5c328b5525827a1490f575cb8.tar.xz
Update FileLib to use pointer to BlockIo->Media and not a cached copy also add some code in the library init that allows removable media devices to be probed to see if a media change has happened.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10449 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--EmbeddedPkg/Ebl/EfiDevice.c20
-rw-r--r--EmbeddedPkg/Include/Library/EfiFileLib.h2
-rw-r--r--EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c35
3 files changed, 42 insertions, 15 deletions
diff --git a/EmbeddedPkg/Ebl/EfiDevice.c b/EmbeddedPkg/Ebl/EfiDevice.c
index f568a1f016..9b08fda12a 100644
--- a/EmbeddedPkg/Ebl/EfiDevice.c
+++ b/EmbeddedPkg/Ebl/EfiDevice.c
@@ -111,24 +111,24 @@ EblPrintBlkIoInfo (
EfiClose (FsFile);
break;
}
+ EfiClose (FsFile);
}
- EfiClose (FsFile);
}
}
// Print out useful Block IO media properties
- if (File->FsBlockIoMedia.RemovableMedia) {
+ if (File->FsBlockIoMedia->RemovableMedia) {
AsciiPrint ("Removable ");
}
- if (!File->FsBlockIoMedia.MediaPresent) {
- AsciiPrint ("No Media ");
- }
- if (File->FsBlockIoMedia.LogicalPartition) {
- AsciiPrint ("Partition ");
+ if (!File->FsBlockIoMedia->MediaPresent) {
+ AsciiPrint ("No Media\n");
+ } else {
+ if (File->FsBlockIoMedia->LogicalPartition) {
+ AsciiPrint ("Partition ");
+ }
+ DeviceSize = MultU64x32 (File->FsBlockIoMedia->LastBlock + 1, File->FsBlockIoMedia->BlockSize);
+ AsciiPrint ("Size = 0x%lX\n", DeviceSize);
}
- DeviceSize = MultU64x32 (File->FsBlockIoMedia.LastBlock + 1, File->FsBlockIoMedia.BlockSize);
- AsciiPrint ("Size = 0x%lX\n", DeviceSize);
-
EfiClose (File);
}
diff --git a/EmbeddedPkg/Include/Library/EfiFileLib.h b/EmbeddedPkg/Include/Library/EfiFileLib.h
index d50a2f3679..9d98b19000 100644
--- a/EmbeddedPkg/Include/Library/EfiFileLib.h
+++ b/EmbeddedPkg/Include/Library/EfiFileLib.h
@@ -93,7 +93,7 @@ typedef struct {
EFI_FILE *FsFileHandle; // Information valid for Fs#:
EFI_FILE_SYSTEM_INFO *FsInfo;
EFI_FILE_INFO *FsFileInfo;
- EFI_BLOCK_IO_MEDIA FsBlockIoMedia; // Information valid for Fs#: or B#:
+ EFI_BLOCK_IO_MEDIA *FsBlockIoMedia; // 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 8d8226d9ef..8ef0790a81 100644
--- a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
+++ b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
@@ -143,14 +143,41 @@ EblUpdateDeviceLists (
EFI_STATUS Status;
UINTN Size;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
+ EFI_BLOCK_IO_PROTOCOL *BlkIo;
EFI_FILE_HANDLE Root;
UINTN Index;
+ BOOLEAN Update;
if (mBlkIo != NULL) {
FreePool (mBlkIo);
}
gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &mBlkIoCount, &mBlkIo);
+ //
+ // This is a trick to trigger the gBS->ReinstallProtocolInterface () in a removable media
+ // device to make a filesystem layer on. Probing devices will detect if media has been
+ // inserted and create
+ //
+ for (Index =0, Update = FALSE; Index < mBlkIoCount; Index++) {
+ Status = gBS->HandleProtocol (mBlkIo[Index], &gEfiBlockIoProtocolGuid, (VOID **)&BlkIo);
+ if (!EFI_ERROR (Status)) {
+ if (BlkIo->Media->RemovableMedia) {
+ gBS->DisconnectController (mBlkIo[Index], NULL, NULL);
+ gBS->ConnectController (mBlkIo[Index], NULL, NULL, TRUE);
+ Update = TRUE;
+ }
+ }
+ }
+
+ if (Update) {
+ // In case we caused media to be detected that contains a partition (SD Card, ...) rescan
+ if (mBlkIo != NULL) {
+ FreePool (mBlkIo);
+ }
+ gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &mBlkIoCount, &mBlkIo);
+ }
+
+
if (mFv != NULL) {
FreePool (mFv);
}
@@ -406,7 +433,7 @@ EblFileDevicePath (
Status = gBS->HandleProtocol (File->EfiHandle, &gEfiBlockIoProtocolGuid, (VOID **)&BlkIo);
if (!EFI_ERROR (Status)) {
- CopyMem (&File->FsBlockIoMedia, BlkIo->Media, sizeof (EFI_BLOCK_IO_MEDIA));
+ File->FsBlockIoMedia = BlkIo->Media;
// 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);
@@ -1395,7 +1422,7 @@ EfiRead (
case EfiOpenBlockIo:
Status = gBS->HandleProtocol(File->EfiHandle, &gEfiDiskIoProtocolGuid, (VOID **)&DiskIo);
if (!EFI_ERROR(Status)) {
- Status = DiskIo->ReadDisk(DiskIo, File->FsBlockIoMedia.MediaId, File->DiskOffset + File->CurrentPosition, *BufferSize, Buffer);
+ Status = DiskIo->ReadDisk(DiskIo, File->FsBlockIoMedia->MediaId, File->DiskOffset + File->CurrentPosition, *BufferSize, Buffer);
}
File->CurrentPosition += *BufferSize;
break;
@@ -1537,7 +1564,7 @@ EfiWrite (
Status = gBS->HandleProtocol (File->EfiHandle, &gEfiDiskIoProtocolGuid, (VOID **)&DiskIo);
if (!EFI_ERROR(Status)) {
- Status = DiskIo->WriteDisk (DiskIo, File->FsBlockIoMedia.MediaId, File->DiskOffset + File->CurrentPosition, *BufferSize, Buffer);
+ Status = DiskIo->WriteDisk (DiskIo, File->FsBlockIoMedia->MediaId, File->DiskOffset + File->CurrentPosition, *BufferSize, Buffer);
}
File->CurrentPosition += *BufferSize;
break;
@@ -1608,7 +1635,7 @@ ExpandPath (
CHAR8 *NewPath;
CHAR8 *Work, *Start, *End;
UINTN StrLen;
- UINTN i;
+ INTN i;
if (Cwd == NULL || Path == NULL) {
return NULL;