Implementation of the SNP.Transmit() function and its private helpers if any.\r
\r
Copyright (C) 2013, Red Hat, Inc.\r
- Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials are licensed and made available\r
under the terms and conditions of the BSD License which accompanies this\r
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
goto Exit;\r
}\r
Ptr = Buffer;\r
- ASSERT (SIZE_OF_VNET (VhdrMac) <= sizeof (EFI_MAC_ADDRESS));\r
+ ASSERT (SIZE_OF_VNET (Mac) <= sizeof (EFI_MAC_ADDRESS));\r
\r
- CopyMem (Ptr, DestAddr, SIZE_OF_VNET (VhdrMac));\r
- Ptr += SIZE_OF_VNET (VhdrMac);\r
+ CopyMem (Ptr, DestAddr, SIZE_OF_VNET (Mac));\r
+ Ptr += SIZE_OF_VNET (Mac);\r
\r
CopyMem (Ptr,\r
(SrcAddr == NULL) ? &Dev->Snm.CurrentAddress : SrcAddr,\r
- SIZE_OF_VNET (VhdrMac));\r
- Ptr += SIZE_OF_VNET (VhdrMac);\r
+ SIZE_OF_VNET (Mac));\r
+ Ptr += SIZE_OF_VNET (Mac);\r
\r
*Ptr++ = (UINT8) (*Protocol >> 8);\r
*Ptr++ = (UINT8) *Protocol;\r
\r
- ASSERT (Ptr - (UINT8 *) Buffer == Dev->Snm.MediaHeaderSize);\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
*Dev->TxRing.Avail.Idx = AvailIdx;\r
\r
MemoryFence ();\r
- Status = VIRTIO_CFG_WRITE (Dev, Generic.VhdrQueueNotify, VIRTIO_NET_Q_TX);\r
+ Status = Dev->VirtIo->SetQueueNotify (Dev->VirtIo, VIRTIO_NET_Q_TX);\r
\r
Exit:\r
gBS->RestoreTPL (OldTpl);\r