+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