diff options
author | yongari <yongari@FreeBSD.org> | 2011-02-28 20:37:48 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2011-02-28 20:37:48 +0000 |
commit | 402820de720ae995ea0c08b998761d2b3cfac8a0 (patch) | |
tree | a556420ce13b2793535718bd059d66fab48d155e /sys/dev/sis | |
parent | 8604b17766256d0996d89f871ca8842b02852927 (diff) | |
download | FreeBSD-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.c | 2 | ||||
-rw-r--r-- | sys/dev/sis/if_sisreg.h | 4 |
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 |