summaryrefslogtreecommitdiffstats
path: root/sys/dev/sis
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2011-02-28 20:37:48 +0000
committeryongari <yongari@FreeBSD.org>2011-02-28 20:37:48 +0000
commit402820de720ae995ea0c08b998761d2b3cfac8a0 (patch)
treea556420ce13b2793535718bd059d66fab48d155e /sys/dev/sis
parent8604b17766256d0996d89f871ca8842b02852927 (diff)
downloadFreeBSD-src-402820de720ae995ea0c08b998761d2b3cfac8a0.zip
FreeBSD-src-402820de720ae995ea0c08b998761d2b3cfac8a0.tar.gz
Make sure changing ownership of RX descriptor to be done as last
operation. Previously ownership was transferred to hardware before setting address of new RX buffer such that it was possible for hardware to use wrong RX buffer address. While here keep compiler from re-ordering instructions by declaring descriptor members volatile. Memory barriers would do the same job but volatile is supposed to be cheaper than using memory barriers, especially on MP systems. Submitted by: marius MFC after: 1 week
Diffstat (limited to 'sys/dev/sis')
-rw-r--r--sys/dev/sis/if_sis.c2
-rw-r--r--sys/dev/sis/if_sisreg.h4
2 files changed, 3 insertions, 3 deletions
diff --git a/sys/dev/sis/if_sis.c b/sys/dev/sis/if_sis.c
index 67ad81a..feef0bf 100644
--- a/sys/dev/sis/if_sis.c
+++ b/sys/dev/sis/if_sis.c
@@ -1566,8 +1566,8 @@ sis_newbuf(struct sis_softc *sc, struct sis_rxdesc *rxd)
sc->sis_rx_sparemap = map;
bus_dmamap_sync(sc->sis_rx_tag, rxd->rx_dmamap, BUS_DMASYNC_PREREAD);
rxd->rx_m = m;
- rxd->rx_desc->sis_cmdsts = htole32(SIS_RXLEN);
rxd->rx_desc->sis_ptr = htole32(SIS_ADDR_LO(segs[0].ds_addr));
+ rxd->rx_desc->sis_cmdsts = htole32(SIS_RXLEN);
return (0);
}
diff --git a/sys/dev/sis/if_sisreg.h b/sys/dev/sis/if_sisreg.h
index 058d9e7..c86a13d 100644
--- a/sys/dev/sis/if_sisreg.h
+++ b/sys/dev/sis/if_sisreg.h
@@ -337,8 +337,8 @@
struct sis_desc {
/* SiS hardware descriptor section */
uint32_t sis_next;
- uint32_t sis_cmdsts;
- uint32_t sis_ptr;
+ volatile uint32_t sis_cmdsts;
+ volatile uint32_t sis_ptr;
};
#define SIS_CMDSTS_BUFLEN 0x00000FFF
OpenPOWER on IntegriCloud