]> git.proxmox.com Git - mirror_edk2.git/commitdiff
EmbeddedPkg/MmcDxe: Removed redundant CMD12 calls from MMC
authorOlivier Martin <olivier.martin@arm.com>
Tue, 6 Aug 2013 12:10:25 +0000 (12:10 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 6 Aug 2013 12:10:25 +0000 (12:10 +0000)
Command 12 - Stop transmission (ends read or write).
Normally only needed for streaming transfers or after error.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14525 6f19259b-4bc3-4df7-8a09-765794883524

EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c

index 57fa14e42e43b6e9e65828b3a393fe961818f7cb..82ec5a7a2d18ca8bf5659fa4b552ebc13b0ee3f7 100644 (file)
@@ -486,6 +486,22 @@ MmcDetectCard (
   }\r
 }\r
 \r
   }\r
 }\r
 \r
+EFI_STATUS\r
+MmcStopTransmission (\r
+  EFI_MMC_HOST_PROTOCOL     *MmcHost\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  UINT32                  Response[4];\r
+  // Command 12 - Stop transmission (ends read or write)\r
+  // Normally only needed for streaming transfers or after error.\r
+  Status = MmcHost->SendCommand (MmcHost, MMC_CMD12, 0);\r
+  if (!EFI_ERROR (Status)) {\r
+    MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1b, Response);\r
+  }\r
+  return Status;\r
+}\r
+\r
 #define MMCI0_BLOCKLEN 512\r
 #define MMCI0_TIMEOUT  10000\r
 \r
 #define MMCI0_BLOCKLEN 512\r
 #define MMCI0_TIMEOUT  10000\r
 \r
@@ -598,6 +614,7 @@ MmcIoBlocks (
       Status = MmcHost->ReadBlockData (MmcHost, Lba, This->Media->BlockSize, Buffer);\r
       if (EFI_ERROR (Status)) {\r
         DEBUG ((EFI_D_BLKIO, "MmcIoBlocks(): Error Read Block Data and Status = %r\n", Status));\r
       Status = MmcHost->ReadBlockData (MmcHost, Lba, This->Media->BlockSize, Buffer);\r
       if (EFI_ERROR (Status)) {\r
         DEBUG ((EFI_D_BLKIO, "MmcIoBlocks(): Error Read Block Data and Status = %r\n", Status));\r
+        MmcStopTransmission (MmcHost);\r
         return Status;\r
       }\r
       Status = MmcNotifyState (MmcHostInstance, MmcProgrammingState);\r
         return Status;\r
       }\r
       Status = MmcNotifyState (MmcHostInstance, MmcProgrammingState);\r
@@ -610,16 +627,11 @@ MmcIoBlocks (
       Status = MmcHost->WriteBlockData (MmcHost, Lba, This->Media->BlockSize, Buffer);\r
       if (EFI_ERROR (Status)) {\r
         DEBUG ((EFI_D_BLKIO, "MmcIoBlocks(): Error Write Block Data and Status = %r\n", Status));\r
       Status = MmcHost->WriteBlockData (MmcHost, Lba, This->Media->BlockSize, Buffer);\r
       if (EFI_ERROR (Status)) {\r
         DEBUG ((EFI_D_BLKIO, "MmcIoBlocks(): Error Write Block Data and Status = %r\n", Status));\r
+        MmcStopTransmission (MmcHost);\r
         return Status;\r
       }\r
     }\r
 \r
         return Status;\r
       }\r
     }\r
 \r
-    // Command 12 - Stop transmission (ends read)\r
-    Status = MmcHost->SendCommand (MmcHost, MMC_CMD12, 0);\r
-    if (!EFI_ERROR (Status)) {\r
-      MmcHost->ReceiveResponse (MmcHost, MMC_RESPONSE_TYPE_R1b, Response);\r
-    }\r
-\r
     // Command 13 - Read status and wait for programming to complete (return to tran)\r
     Timeout = MMCI0_TIMEOUT;\r
     CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r
     // Command 13 - Read status and wait for programming to complete (return to tran)\r
     Timeout = MMCI0_TIMEOUT;\r
     CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r