From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36394) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WuOu0-0006IU-Ke for qemu-devel@nongnu.org; Tue, 10 Jun 2014 12:28:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WuOtt-0007Xu-VN for qemu-devel@nongnu.org; Tue, 10 Jun 2014 12:28:00 -0400 From: Michael Tokarev Date: Tue, 10 Jun 2014 20:08:19 +0400 Message-Id: <1402416523-13212-2-git-send-email-mjt@msgid.tls.msk.ru> In-Reply-To: <1402416523-13212-1-git-send-email-mjt@msgid.tls.msk.ru> References: <1402416523-13212-1-git-send-email-mjt@msgid.tls.msk.ru> Subject: [Qemu-devel] [PULL 01/25] net: cadence_gem: Fix Tx descriptor update List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: qemu-trivial@nongnu.org, Peter Crosthwaite , Michael Tokarev From: Peter Crosthwaite The local variable "desc" was being used to read-modify-write the first descriptor (of a multi-desc packet) upon packet completion. desc however continues to be used by the code as the current descriptor. Give this first desc RMW it's own local variable to avoid trampling. Signed-off-by: Peter Crosthwaite Signed-off-by: Michael Tokarev --- hw/net/cadence_gem.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c index a26861e..5335db8 100644 --- a/hw/net/cadence_gem.c +++ b/hw/net/cadence_gem.c @@ -911,14 +911,16 @@ static void gem_transmit(GemState *s) /* Last descriptor for this packet; hand the whole thing off */ if (tx_desc_get_last(desc)) { + unsigned desc_first[2]; + /* Modify the 1st descriptor of this packet to be owned by * the processor. */ - cpu_physical_memory_read(s->tx_desc_addr, - (uint8_t *)&desc[0], sizeof(desc)); - tx_desc_set_used(desc); - cpu_physical_memory_write(s->tx_desc_addr, - (uint8_t *)&desc[0], sizeof(desc)); + cpu_physical_memory_read(s->tx_desc_addr, (uint8_t *)desc_first, + sizeof(desc_first)); + tx_desc_set_used(desc_first); + cpu_physical_memory_write(s->tx_desc_addr, (uint8_t *)desc_first, + sizeof(desc_first)); /* Advance the hardare current descriptor past this packet */ if (tx_desc_get_wrap(desc)) { s->tx_desc_addr = s->regs[GEM_TXQBASE]; -- 1.7.10.4