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