summaryrefslogtreecommitdiffstats
path: root/hw/net
diff options
context:
space:
mode:
authorPeter Crosthwaite <peter.crosthwaite@xilinx.com>2014-05-26 01:37:47 -0700
committerMichael Tokarev <mjt@tls.msk.ru>2014-06-10 19:39:34 +0400
commit6ab57a6b80be45372d7f3dd58e9776549d0ce9cf (patch)
tree38a5bb391229569405dd0632f52f2f7713d1b971 /hw/net
parent3334e929ae2d01e47c3e64757ee7fcf975cede94 (diff)
downloadhqemu-6ab57a6b80be45372d7f3dd58e9776549d0ce9cf.zip
hqemu-6ab57a6b80be45372d7f3dd58e9776549d0ce9cf.tar.gz
net: cadence_gem: Fix Tx descriptor update
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 <peter.crosthwaite@xilinx.com> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Diffstat (limited to 'hw/net')
-rw-r--r--hw/net/cadence_gem.c12
1 files 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];
OpenPOWER on IntegriCloud