diff options
| author | ad <ad@NetBSD.org> | 2008-06-08 11:58:50 +0000 |
|---|---|---|
| committer | ad <ad@NetBSD.org> | 2008-06-08 11:58:50 +0000 |
| commit | 536e41c5428fde0d172edb0ebd30bac16c450f79 (patch) | |
| tree | 586be040130d28ac8b5e9e57413f5d4c37506057 /sys/dev | |
| parent | 6e5c7633732482645c4704e747a33f31911cac45 (diff) | |
Fix up bus_dmamap_sync calls.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/i2o/iop.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/sys/dev/i2o/iop.c b/sys/dev/i2o/iop.c index fec4e71fb0f..b9fa48af544 100644 --- a/sys/dev/i2o/iop.c +++ b/sys/dev/i2o/iop.c @@ -1,4 +1,4 @@ -/* $NetBSD: iop.c,v 1.71 2008/05/05 17:11:16 ad Exp $ */ +/* $NetBSD: iop.c,v 1.72 2008/06/08 11:58:50 ad Exp $ */ /*- * Copyright (c) 2000, 2001, 2002, 2007 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: iop.c,v 1.71 2008/05/05 17:11:16 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: iop.c,v 1.72 2008/06/08 11:58:50 ad Exp $"); #include "iop.h" @@ -924,14 +924,16 @@ iop_status_get(struct iop_softc *sc, int nosleep) mf.addrhigh = (u_int32_t)((u_int64_t)pa >> 32); mf.length = sizeof(sc->sc_status); + bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*st), + BUS_DMASYNC_PREWRITE); memset(st, 0, sizeof(*st)); bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*st), - BUS_DMASYNC_PREREAD); + BUS_DMASYNC_PREREAD|BUS_DMASYNC_POSTWRITE); if ((rv = iop_post(sc, (u_int32_t *)&mf)) != 0) return (rv); - for (i = 25; i != 0; i--) { + for (i = 100; i != 0; i--) { bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*st), BUS_DMASYNC_POSTREAD); if (st->syncbyte == 0xff) @@ -987,9 +989,11 @@ iop_ofifo_init(struct iop_softc *sc) (u_int32_t)sc->sc_scr_seg->ds_addr; mb[0] += 2 << 16; + bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw), + BUS_DMASYNC_PREWRITE); *sw = 0; bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw), - BUS_DMASYNC_PREREAD); + BUS_DMASYNC_PREREAD|BUS_DMASYNC_POSTWRITE); if ((rv = iop_post(sc, mb)) != 0) return (rv); @@ -1542,9 +1546,11 @@ iop_reset(struct iop_softc *sc) mf.statuslow = (u_int32_t)pa; mf.statushigh = (u_int32_t)((u_int64_t)pa >> 32); + bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw), + BUS_DMASYNC_PREWRITE); *sw = htole32(0); bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw), - BUS_DMASYNC_PREREAD); + BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); if ((rv = iop_post(sc, (u_int32_t *)&mf))) return (rv); @@ -1643,9 +1649,6 @@ iop_handle_reply(struct iop_softc *sc, u_int32_t rmfa) /* Perform reply queue DMA synchronisation. */ bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, off, sc->sc_framesize, BUS_DMASYNC_POSTREAD); - if (--sc->sc_curib != 0) - bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, - 0, sc->sc_rep_size, BUS_DMASYNC_PREREAD); #ifdef I2ODEBUG if ((le32toh(rb->msgflags) & I2O_MSGFLAGS_64BIT) != 0) @@ -1950,7 +1953,7 @@ iop_msg_map(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb, ix->ix_flags = (out ? IX_OUT : IX_IN); ix->ix_size = xfersize; bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, xfersize, - out ? BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_POSTREAD); + out ? BUS_DMASYNC_PREWRITE : BUS_DMASYNC_PREREAD); /* * If this is the first xfer we've mapped for this message, adjust @@ -2056,7 +2059,7 @@ iop_msg_map_bio(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb, ix->ix_flags = (out ? IX_OUT : IX_IN); ix->ix_size = xfersize; bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, xfersize, - out ? BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_POSTREAD); + out ? BUS_DMASYNC_PREWRITE : BUS_DMASYNC_PREREAD); /* * Adjust the SGL offset and total message size fields. We don't @@ -2120,9 +2123,10 @@ iop_post(struct iop_softc *sc, u_int32_t *mb) } /* Perform reply buffer DMA synchronisation. */ - if (sc->sc_curib++ == 0) + if (sc->sc_rep_size != 0) { bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, 0, sc->sc_rep_size, BUS_DMASYNC_PREREAD); + } /* Copy out the message frame. */ bus_space_write_region_4(sc->sc_msg_iot, sc->sc_msg_ioh, mfa, mb, |
