X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=OvmfPkg%2FVirtioNetDxe%2FSnpGetStatus.c;h=9b1c352227b3953834f0edc5a53da45e96de6595;hb=d4d9116775763a7ce4bff894ea06ecef4b17e441;hp=4393d243a279bcdfb4fb4484ee25759cd6a94e69;hpb=56f65ed838e8d73e91d54a8ed984d777c936843c;p=mirror_edk2.git diff --git a/OvmfPkg/VirtioNetDxe/SnpGetStatus.c b/OvmfPkg/VirtioNetDxe/SnpGetStatus.c index 4393d243a2..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 - 2013, 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; @@ -94,7 +95,8 @@ VirtioNetGetStatus ( 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); } // @@ -140,14 +142,34 @@ VirtioNetGetStatus ( 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 *)(UINTN) 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; + } } }