]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix svn check in bug that broke CWD. Update the connect disconnect support in device...
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 7 May 2010 16:45:48 +0000 (16:45 +0000)
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 7 May 2010 16:45:48 +0000 (16:45 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10462 6f19259b-4bc3-4df7-8a09-765794883524

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

index 70ba70383c9af2fd4cb42076a73be21f27e4a128..80dcfcb5cc2c26373c567465301b5aae4c0cf3da 100644 (file)
@@ -207,13 +207,14 @@ EblDeviceCmd (
   IN CHAR8  **Argv\r
   )\r
 {\r
+  EFI_STATUS    Status;\r
   UINTN         Index;\r
   UINTN         CurrentRow;\r
   UINTN         Max;\r
   EFI_OPEN_FILE *File;\r
 \r
   CurrentRow = 0;\r
-  \r
+\r
   // Need to call here to make sure Device Counts are valid\r
   EblUpdateDeviceLists ();\r
 \r
@@ -227,9 +228,15 @@ EblDeviceCmd (
       if (File != NULL) {\r
         if (File->FsBlockIoMedia->RemovableMedia) {\r
           if (File->FsBlockIoMedia->MediaPresent) {\r
-            gBS->DisconnectController (File->EfiHandle, NULL, NULL);\r
+            // Probe to see if media is present\r
+            Status = File->FsBlockIo->ReadBlocks (File->FsBlockIo, File->FsBlockIo->Media->MediaId, (EFI_LBA)0, 0, NULL);\r
+            if (Status == EFI_NO_MEDIA) {\r
+              gBS->DisconnectController (File->EfiHandle, NULL, NULL);\r
+            }\r
+          } else {\r
+            // Probe for media insertion and connect partition and filesystem drivers if needed\r
+            gBS->ConnectController (File->EfiHandle, NULL, NULL, TRUE);\r
           }\r
-          gBS->ConnectController (File->EfiHandle, NULL, NULL, TRUE);\r
         }\r
         EfiClose (File);\r
       }\r
index 9d98b19000f876d12da4701cb4975ed33fef8f5d..9ec5246358f3eeef998412f8f9c3ec9a27aa144e 100644 (file)
@@ -94,6 +94,7 @@ typedef struct {
   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_PROTOCOL         *FsBlockIo;       // Information valid for Fs#: or B#:\r
 \r
   UINTN                         DiskOffset;       // Information valid for B#:\r
 \r
index 1db7d7d035a214c8973f50ac67bdcfb890b767ac..c93304d53738ff50740e6cec31e9885759872be0 100644 (file)
@@ -409,6 +409,7 @@ EblFileDevicePath (
   Status = gBS->HandleProtocol (File->EfiHandle, &gEfiBlockIoProtocolGuid, (VOID **)&BlkIo);
   if (!EFI_ERROR (Status)) {
     File->FsBlockIoMedia = BlkIo->Media;
+    File->FsBlockIo = BlkIo;
 
     // 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);
@@ -1732,6 +1733,15 @@ EfiSetCwd (
     return EFI_INVALID_PARAMETER;
   }
 
+  AsciiStrCpy (gCwd, File->DeviceName);
+  if (File->FileName == NULL) {
+    AsciiStrCat (gCwd, ":\\");
+  } else {
+    AsciiStrCat (gCwd, ":");
+    AsciiStrCat (gCwd, File->FileName);
+  }
+
+
   EfiClose (File);
   if (Path != Cwd) {
     FreePool (Path);