EFI_STATUS Status;\r
UINT64 Features;\r
UINT16 QueueSize;\r
+ UINT64 RingBaseShift;\r
\r
//\r
// Execute virtio-v1.0-cs04, 3.1.1 Driver Requirements: Device\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
+ //\r
+ // If anything fails from here on, we have to release the ring.\r
+ //\r
+ Status = VirtioRingMap (\r
+ VgpuDev->VirtIo,\r
+ &VgpuDev->Ring,\r
+ &RingBaseShift,\r
+ &VgpuDev->RingMap\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto ReleaseQueue;\r
+ }\r
+ //\r
+ // If anything fails from here on, we have to unmap the ring.\r
+ //\r
Status = VgpuDev->VirtIo->SetQueueAddress (\r
VgpuDev->VirtIo,\r
&VgpuDev->Ring,\r
- 0\r
+ RingBaseShift\r
);\r
if (EFI_ERROR (Status)) {\r
- goto ReleaseQueue;\r
+ goto UnmapQueue;\r
}\r
\r
//\r
NextDevStat |= VSTAT_DRIVER_OK;\r
Status = VgpuDev->VirtIo->SetDeviceStatus (VgpuDev->VirtIo, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
- goto ReleaseQueue;\r
+ goto UnmapQueue;\r
}\r
\r
return EFI_SUCCESS;\r
\r
+UnmapQueue:\r
+ VgpuDev->VirtIo->UnmapSharedBuffer (VgpuDev->VirtIo, VgpuDev->RingMap);\r
+\r
ReleaseQueue:\r
VirtioRingUninit (VgpuDev->VirtIo, &VgpuDev->Ring);\r
\r
// configuration.\r
//\r
VgpuDev->VirtIo->SetDeviceStatus (VgpuDev->VirtIo, 0);\r
+ VgpuDev->VirtIo->UnmapSharedBuffer (VgpuDev->VirtIo, VgpuDev->RingMap);\r
VirtioRingUninit (VgpuDev->VirtIo, &VgpuDev->Ring);\r
}\r
\r
\r
VgpuDev = Context;\r
VgpuDev->VirtIo->SetDeviceStatus (VgpuDev->VirtIo, 0);\r
+ VgpuDev->VirtIo->UnmapSharedBuffer (VgpuDev->VirtIo, VgpuDev->RingMap);\r
}\r
\r
/**\r