summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorad <ad@NetBSD.org>2008-06-08 11:58:50 +0000
committerad <ad@NetBSD.org>2008-06-08 11:58:50 +0000
commit536e41c5428fde0d172edb0ebd30bac16c450f79 (patch)
tree586be040130d28ac8b5e9e57413f5d4c37506057 /sys/dev
parent6e5c7633732482645c4704e747a33f31911cac45 (diff)
Fix up bus_dmamap_sync calls.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/i2o/iop.c28
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,