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
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