X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=OvmfPkg%2FVirtioNetDxe%2FSnpGetStatus.c;h=9b1c352227b3953834f0edc5a53da45e96de6595;hb=d4d9116775763a7ce4bff894ea06ecef4b17e441;hp=ce6a7295fed6fa4a33d8df469d2fdf3e5bf148dd;hpb=b6dfc654c81f3d6b4720d6e3da182a8a2510d840;p=mirror_edk2.git diff --git a/OvmfPkg/VirtioNetDxe/SnpGetStatus.c b/OvmfPkg/VirtioNetDxe/SnpGetStatus.c index ce6a7295fe..9b1c352227 100644 --- a/OvmfPkg/VirtioNetDxe/SnpGetStatus.c +++ b/OvmfPkg/VirtioNetDxe/SnpGetStatus.c @@ -4,7 +4,7 @@ any. Copyright (C) 2013, Red Hat, Inc. - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this @@ -61,11 +61,12 @@ VirtioNetGetStatus ( OUT VOID **TxBuf OPTIONAL ) { - VNET_DEV *Dev; - EFI_TPL OldTpl; - EFI_STATUS Status; - UINT16 RxCurUsed; - UINT16 TxCurUsed; + VNET_DEV *Dev; + EFI_TPL OldTpl; + EFI_STATUS Status; + UINT16 RxCurUsed; + UINT16 TxCurUsed; + EFI_PHYSICAL_ADDRESS DeviceAddress; if (This == NULL) { return EFI_INVALID_PARAMETER; @@ -90,11 +91,12 @@ VirtioNetGetStatus ( if (Dev->Snm.MediaPresentSupported) { UINT16 LinkStatus; - Status = VIRTIO_CFG_READ (Dev, VhdrLinkStatus, &LinkStatus); + Status = VIRTIO_CFG_READ (Dev, LinkStatus, &LinkStatus); if (EFI_ERROR (Status)) { goto Exit; } - Dev->Snm.MediaPresent = !!(LinkStatus & VIRTIO_NET_S_LINK_UP); + Dev->Snm.MediaPresent = + (BOOLEAN) ((LinkStatus & VIRTIO_NET_S_LINK_UP) != 0); } // @@ -103,6 +105,7 @@ VirtioNetGetStatus ( MemoryFence (); RxCurUsed = *Dev->RxRing.Used.Idx; TxCurUsed = *Dev->TxRing.Used.Idx; + MemoryFence (); if (InterruptStatus != NULL) { // @@ -136,17 +139,37 @@ VirtioNetGetStatus ( UsedElemIdx = Dev->TxLastUsed++ % Dev->TxRing.QueueSize; DescIdx = Dev->TxRing.Used.UsedElem[UsedElemIdx].Id; - ASSERT (DescIdx < 2 * Dev->TxMaxPending - 1); + ASSERT (DescIdx < (UINT32) (2 * Dev->TxMaxPending - 1)); // - // report buffer address to caller that has been enqueued by caller + // get the device address that has been enqueued for the caller's + // transmit buffer // - *TxBuf = (VOID *) Dev->TxRing.Desc[DescIdx + 1].Addr; + DeviceAddress = Dev->TxRing.Desc[DescIdx + 1].Addr; // // now this descriptor can be used again to enqueue a transmit buffer // Dev->TxFreeStack[--Dev->TxCurPending] = (UINT16) DescIdx; + + // + // Unmap the device address and perform the reverse mapping to find the + // caller buffer address. + // + Status = VirtioNetUnmapTxBuf ( + Dev, + TxBuf, + DeviceAddress + ); + if (EFI_ERROR (Status)) { + // + // VirtioNetUnmapTxBuf should never fail, if we have reached here + // that means our internal state has been corrupted + // + ASSERT (FALSE); + Status = EFI_DEVICE_ERROR; + goto Exit; + } } }