diff options
author | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2010-04-30 19:40:17 +0000 |
---|---|---|
committer | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2010-04-30 19:40:17 +0000 |
commit | 0a0951ea841a10c5c328b5525827a1490f575cb8 (patch) | |
tree | 3d73b0c593565792ca6835cd79eb42ae5581b8b2 /EmbeddedPkg | |
parent | 24542fb2118e3921502c70996a30a8fe7cbc2d29 (diff) | |
download | edk2-0a0951ea841a10c5c328b5525827a1490f575cb8.zip edk2-0a0951ea841a10c5c328b5525827a1490f575cb8.tar.gz edk2-0a0951ea841a10c5c328b5525827a1490f575cb8.tar.bz2 |
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')
-rw-r--r-- | EmbeddedPkg/Ebl/EfiDevice.c | 20 | ||||
-rw-r--r-- | EmbeddedPkg/Include/Library/EfiFileLib.h | 2 | ||||
-rw-r--r-- | EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c | 35 |
3 files changed, 42 insertions, 15 deletions
diff --git a/EmbeddedPkg/Ebl/EfiDevice.c b/EmbeddedPkg/Ebl/EfiDevice.c index f568a1f..9b08fda 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 d50a2f3..9d98b19 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 8d8226d..8ef0790 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; |