summaryrefslogtreecommitdiff
path: root/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
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 /EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
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
Diffstat (limited to 'EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c')
-rw-r--r--EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c35
1 files changed, 31 insertions, 4 deletions
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;