]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update FileLib to use pointer to BlockIo->Media and not a cached copy also add some...
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 30 Apr 2010 19:40:17 +0000 (19:40 +0000)
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 30 Apr 2010 19:40:17 +0000 (19:40 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10449 6f19259b-4bc3-4df7-8a09-765794883524

EmbeddedPkg/Ebl/EfiDevice.c
EmbeddedPkg/Include/Library/EfiFileLib.h
EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c

index f568a1f016491c4a77f62901cf4a6bc053e70d17..9b08fda12a3cd6f531ee315f45f461aa64d8a461 100644 (file)
@@ -111,24 +111,24 @@ EblPrintBlkIoInfo (
           EfiClose (FsFile);\r
           break;\r
         }\r
+        EfiClose (FsFile);\r
       }\r
-      EfiClose (FsFile);\r
     }\r
   }\r
 \r
   // Print out useful Block IO media properties\r
-  if (File->FsBlockIoMedia.RemovableMedia) {\r
+  if (File->FsBlockIoMedia->RemovableMedia) {\r
     AsciiPrint ("Removable ");\r
   }\r
-  if (!File->FsBlockIoMedia.MediaPresent) {\r
-    AsciiPrint ("No Media ");\r
-  }\r
-  if (File->FsBlockIoMedia.LogicalPartition) {\r
-    AsciiPrint ("Partition ");\r
+  if (!File->FsBlockIoMedia->MediaPresent) {\r
+    AsciiPrint ("No Media\n");\r
+  } else {\r
+    if (File->FsBlockIoMedia->LogicalPartition) {\r
+      AsciiPrint ("Partition ");\r
+    }\r
+    DeviceSize = MultU64x32 (File->FsBlockIoMedia->LastBlock + 1, File->FsBlockIoMedia->BlockSize);\r
+    AsciiPrint ("Size = 0x%lX\n", DeviceSize);\r
   }\r
-  DeviceSize = MultU64x32 (File->FsBlockIoMedia.LastBlock + 1, File->FsBlockIoMedia.BlockSize);\r
-  AsciiPrint ("Size = 0x%lX\n", DeviceSize);\r
-\r
   EfiClose (File);\r
 }\r
 \r
index d50a2f367935493ce44954ade9d1aee4b7f92d7c..9d98b19000f876d12da4701cb4975ed33fef8f5d 100644 (file)
@@ -93,7 +93,7 @@ typedef struct {
   EFI_FILE                      *FsFileHandle;    // Information valid for Fs#:\r
   EFI_FILE_SYSTEM_INFO          *FsInfo;\r
   EFI_FILE_INFO                 *FsFileInfo;\r
-  EFI_BLOCK_IO_MEDIA            FsBlockIoMedia;   // Information valid for Fs#: or B#:\r
+  EFI_BLOCK_IO_MEDIA            *FsBlockIoMedia;  // Information valid for Fs#: or B#:\r
 \r
   UINTN                         DiskOffset;       // Information valid for B#:\r
 \r
index 8d8226d9ef273ef11b1c8b529d14b266973427a4..8ef0790a818a9c34922b06082d750218584ec7ed 100644 (file)
@@ -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;