]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/PvScsiDxe: Refactor setup of rings to separate function
authorLiran Alon <liran.alon@oracle.com>
Tue, 31 Mar 2020 22:56:37 +0000 (01:56 +0300)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 1 Apr 2020 14:12:09 +0000 (14:12 +0000)
Previous to this change, PvScsiFreeRings() was not undoing all
operations that was done by PvScsiInitRings().
This is because PvScsiInitRings() was both preparing rings (Allocate
memory and map it for device DMA) and setup the rings against device by
issueing a device command. While PvScsiFreeRings() only unmaps the rings
and free their memory.

Driver do not have a functional error as it makes sure to reset device
before every call site to PvScsiFreeRings(). However, this is not
intuitive.

Therefore, prefer to refactor the setup of the ring against device to a
separate function than PvScsiInitRings().

Signed-off-by: Liran Alon <liran.alon@oracle.com>
Message-Id: <20200331225637.123318-1-liran.alon@oracle.com>
[lersek@redhat.com: rename FreeDMACommBuffer label to FreeDmaCommBuffer]
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
OvmfPkg/PvScsiDxe/PvScsi.c

index 1ca50390c0e579addeb09bb3c82994206bbcf2f7..843534ebf71103fee18381a96be17cca48f746e9 100644 (file)
@@ -991,13 +991,6 @@ PvScsiInitRings (
   )\r
 {\r
   EFI_STATUS Status;\r
-  union {\r
-    PVSCSI_CMD_DESC_SETUP_RINGS Cmd;\r
-    UINT32                      Uint32;\r
-  } AlignedCmd;\r
-  PVSCSI_CMD_DESC_SETUP_RINGS *Cmd;\r
-\r
-  Cmd = &AlignedCmd.Cmd;\r
 \r
   Status = PvScsiAllocateSharedPages (\r
              Dev,\r
@@ -1032,46 +1025,8 @@ PvScsiInitRings (
   }\r
   ZeroMem (Dev->RingDesc.RingCmps, EFI_PAGE_SIZE);\r
 \r
-  ZeroMem (Cmd, sizeof (*Cmd));\r
-  Cmd->ReqRingNumPages = 1;\r
-  Cmd->CmpRingNumPages = 1;\r
-  Cmd->RingsStatePPN = RShiftU64 (\r
-                         Dev->RingDesc.RingStateDmaDesc.DeviceAddress,\r
-                         EFI_PAGE_SHIFT\r
-                         );\r
-  Cmd->ReqRingPPNs[0] = RShiftU64 (\r
-                          Dev->RingDesc.RingReqsDmaDesc.DeviceAddress,\r
-                          EFI_PAGE_SHIFT\r
-                          );\r
-  Cmd->CmpRingPPNs[0] = RShiftU64 (\r
-                          Dev->RingDesc.RingCmpsDmaDesc.DeviceAddress,\r
-                          EFI_PAGE_SHIFT\r
-                          );\r
-\r
-  STATIC_ASSERT (\r
-    sizeof (*Cmd) % sizeof (UINT32) == 0,\r
-    "Cmd must be multiple of 32-bit words"\r
-    );\r
-  Status = PvScsiWriteCmdDesc (\r
-             Dev,\r
-             PvScsiCmdSetupRings,\r
-             (UINT32 *)Cmd,\r
-             sizeof (*Cmd) / sizeof (UINT32)\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    goto FreeRingCmps;\r
-  }\r
-\r
   return EFI_SUCCESS;\r
 \r
-FreeRingCmps:\r
-  PvScsiFreeSharedPages (\r
-    Dev,\r
-    1,\r
-    Dev->RingDesc.RingCmps,\r
-    &Dev->RingDesc.RingCmpsDmaDesc\r
-    );\r
-\r
 FreeRingReqs:\r
   PvScsiFreeSharedPages (\r
     Dev,\r
@@ -1119,6 +1074,48 @@ PvScsiFreeRings (
     );\r
 }\r
 \r
+STATIC\r
+EFI_STATUS\r
+PvScsiSetupRings (\r
+  IN OUT PVSCSI_DEV *Dev\r
+  )\r
+{\r
+  union {\r
+    PVSCSI_CMD_DESC_SETUP_RINGS Cmd;\r
+    UINT32                      Uint32;\r
+  } AlignedCmd;\r
+  PVSCSI_CMD_DESC_SETUP_RINGS *Cmd;\r
+\r
+  Cmd = &AlignedCmd.Cmd;\r
+\r
+  ZeroMem (Cmd, sizeof (*Cmd));\r
+  Cmd->ReqRingNumPages = 1;\r
+  Cmd->CmpRingNumPages = 1;\r
+  Cmd->RingsStatePPN = RShiftU64 (\r
+                         Dev->RingDesc.RingStateDmaDesc.DeviceAddress,\r
+                         EFI_PAGE_SHIFT\r
+                         );\r
+  Cmd->ReqRingPPNs[0] = RShiftU64 (\r
+                          Dev->RingDesc.RingReqsDmaDesc.DeviceAddress,\r
+                          EFI_PAGE_SHIFT\r
+                          );\r
+  Cmd->CmpRingPPNs[0] = RShiftU64 (\r
+                          Dev->RingDesc.RingCmpsDmaDesc.DeviceAddress,\r
+                          EFI_PAGE_SHIFT\r
+                          );\r
+\r
+  STATIC_ASSERT (\r
+    sizeof (*Cmd) % sizeof (UINT32) == 0,\r
+    "Cmd must be multiple of 32-bit words"\r
+    );\r
+  return PvScsiWriteCmdDesc (\r
+           Dev,\r
+           PvScsiCmdSetupRings,\r
+           (UINT32 *)Cmd,\r
+           sizeof (*Cmd) / sizeof (UINT32)\r
+           );\r
+}\r
+\r
 STATIC\r
 EFI_STATUS\r
 PvScsiInit (\r
@@ -1171,6 +1168,14 @@ PvScsiInit (
     goto FreeRings;\r
   }\r
 \r
+  //\r
+  // Setup rings against device\r
+  //\r
+  Status = PvScsiSetupRings (Dev);\r
+  if (EFI_ERROR (Status)) {\r
+    goto FreeDmaCommBuffer;\r
+  }\r
+\r
   //\r
   // Populate the exported interface's attributes\r
   //\r
@@ -1202,13 +1207,15 @@ PvScsiInit (
 \r
   return EFI_SUCCESS;\r
 \r
-FreeRings:\r
-  //\r
-  // Reset device to stop device usage of the rings.\r
-  // This is required to safely free the rings.\r
-  //\r
-  PvScsiResetAdapter (Dev);\r
+FreeDmaCommBuffer:\r
+  PvScsiFreeSharedPages (\r
+    Dev,\r
+    EFI_SIZE_TO_PAGES (sizeof (*Dev->DmaBuf)),\r
+    Dev->DmaBuf,\r
+    &Dev->DmaBufDmaDesc\r
+    );\r
 \r
+FreeRings:\r
   PvScsiFreeRings (Dev);\r
 \r
 RestorePciAttributes:\r