]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/VirtioNetDxe/SnpTransmit.c
OvmfPkg/VirtioNetDxe: map caller-supplied Tx packet to device-address
[mirror_edk2.git] / OvmfPkg / VirtioNetDxe / SnpTransmit.c
index 7ca40d5d06504b75e870aeab68c33cf3d9f047fc..b39226e138b9f97a40d50af942c8dec2b5449d62 100644 (file)
@@ -73,11 +73,12 @@ VirtioNetTransmit (
   IN UINT16                      *Protocol OPTIONAL\r
   )\r
 {\r
-  VNET_DEV   *Dev;\r
-  EFI_TPL    OldTpl;\r
-  EFI_STATUS Status;\r
-  UINT16     DescIdx;\r
-  UINT16     AvailIdx;\r
+  VNET_DEV              *Dev;\r
+  EFI_TPL               OldTpl;\r
+  EFI_STATUS            Status;\r
+  UINT16                DescIdx;\r
+  UINT16                AvailIdx;\r
+  EFI_PHYSICAL_ADDRESS  DeviceAddress;\r
 \r
   if (This == NULL || BufferSize == 0 || Buffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -143,11 +144,25 @@ VirtioNetTransmit (
     ASSERT ((UINTN) (Ptr - (UINT8 *) Buffer) == Dev->Snm.MediaHeaderSize);\r
   }\r
 \r
+  //\r
+  // Map the transmit buffer system physical address to device address.\r
+  //\r
+  Status = VirtioNetMapTxBuf (\r
+             Dev,\r
+             Buffer,\r
+             BufferSize,\r
+             &DeviceAddress\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Exit;\r
+  }\r
+\r
   //\r
   // virtio-0.9.5, 2.4.1 Supplying Buffers to The Device\r
   //\r
   DescIdx = Dev->TxFreeStack[Dev->TxCurPending++];\r
-  Dev->TxRing.Desc[DescIdx + 1].Addr  = (UINTN) Buffer;\r
+  Dev->TxRing.Desc[DescIdx + 1].Addr  = DeviceAddress;\r
   Dev->TxRing.Desc[DescIdx + 1].Len   = (UINT32) BufferSize;\r
 \r
   //\r