)\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
}\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
);\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
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
\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