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/Library/EfiFileLib | |
parent | 24542fb2118e3921502c70996a30a8fe7cbc2d29 (diff) | |
download | edk2-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')
-rw-r--r-- | EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c | 35 |
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; |