From 0a0951ea841a10c5c328b5525827a1490f575cb8 Mon Sep 17 00:00:00 2001 From: andrewfish Date: Fri, 30 Apr 2010 19:40:17 +0000 Subject: 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 --- EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c | 35 +++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c') 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; -- cgit v1.2.3