]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/VirtioNetDxe/SnpGetStatus.c
OvmfPkg/VirtioNetDxe: map caller-supplied Tx packet to device-address
[mirror_edk2.git] / OvmfPkg / VirtioNetDxe / SnpGetStatus.c
index 694940ea1d976827bd890a734cb5e154b02a2470..9b1c352227b3953834f0edc5a53da45e96de6595 100644 (file)
@@ -61,11 +61,12 @@ VirtioNetGetStatus (
   OUT VOID                       **TxBuf OPTIONAL\r
   )\r
 {\r
-  VNET_DEV   *Dev;\r
-  EFI_TPL    OldTpl;\r
-  EFI_STATUS Status;\r
-  UINT16     RxCurUsed;\r
-  UINT16     TxCurUsed;\r
+  VNET_DEV             *Dev;\r
+  EFI_TPL              OldTpl;\r
+  EFI_STATUS           Status;\r
+  UINT16               RxCurUsed;\r
+  UINT16               TxCurUsed;\r
+  EFI_PHYSICAL_ADDRESS DeviceAddress;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -141,14 +142,34 @@ VirtioNetGetStatus (
       ASSERT (DescIdx < (UINT32) (2 * Dev->TxMaxPending - 1));\r
 \r
       //\r
-      // report buffer address to caller that has been enqueued by caller\r
+      // get the device address that has been enqueued for the caller's\r
+      // transmit buffer\r
       //\r
-      *TxBuf = (VOID *)(UINTN) Dev->TxRing.Desc[DescIdx + 1].Addr;\r
+      DeviceAddress = Dev->TxRing.Desc[DescIdx + 1].Addr;\r
 \r
       //\r
       // now this descriptor can be used again to enqueue a transmit buffer\r
       //\r
       Dev->TxFreeStack[--Dev->TxCurPending] = (UINT16) DescIdx;\r
+\r
+      //\r
+      // Unmap the device address and perform the reverse mapping to find the\r
+      // caller buffer address.\r
+      //\r
+      Status = VirtioNetUnmapTxBuf (\r
+                 Dev,\r
+                 TxBuf,\r
+                 DeviceAddress\r
+                 );\r
+      if (EFI_ERROR (Status)) {\r
+        //\r
+        // VirtioNetUnmapTxBuf should never fail, if we have reached here\r
+        // that means our internal state has been corrupted\r
+        //\r
+        ASSERT (FALSE);\r
+        Status = EFI_DEVICE_ERROR;\r
+        goto Exit;\r
+      }\r
     }\r
   }\r
 \r