summaryrefslogtreecommitdiffstats
path: root/sys/dev/amr/amr.c
diff options
context:
space:
mode:
authorps <ps@FreeBSD.org>2005-06-23 00:21:25 +0000
committerps <ps@FreeBSD.org>2005-06-23 00:21:25 +0000
commit6b329c9eb729b828966610ad0ea291983ec749ce (patch)
treefdfdebfca9cd0f46471f585cbd7d865462685917 /sys/dev/amr/amr.c
parent1f7ded928de9d621a4a8c555506d31c02152828c (diff)
downloadFreeBSD-src-6b329c9eb729b828966610ad0ea291983ec749ce.zip
FreeBSD-src-6b329c9eb729b828966610ad0ea291983ec749ce.tar.gz
polled commands can read or write, so bus_dmamap_sync properly
according to the type of request. Approved by: re
Diffstat (limited to 'sys/dev/amr/amr.c')
-rw-r--r--sys/dev/amr/amr.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/dev/amr/amr.c b/sys/dev/amr/amr.c
index e6fa569..6c51839 100644
--- a/sys/dev/amr/amr.c
+++ b/sys/dev/amr/amr.c
@@ -1021,7 +1021,14 @@ amr_setup_polled_dmamap(void *arg, bus_dma_segment_t *segs, int nsegs, int err)
struct amr_softc *sc = ac->ac_sc;
amr_setup_dmamap(arg, segs, nsegs, err);
- bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,BUS_DMASYNC_PREREAD);
+ if (ac->ac_flags & AMR_CMD_DATAIN) {
+ bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,
+ BUS_DMASYNC_PREREAD);
+ }
+ if (ac->ac_flags & AMR_CMD_DATAOUT) {
+ bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,
+ BUS_DMASYNC_PREWRITE);
+ }
sc->amr_poll_command1(sc, ac);
}
@@ -1102,7 +1109,14 @@ amr_quartz_poll_command1(struct amr_softc *sc, struct amr_command *ac)
while(AMR_QGET_IDB(sc) & AMR_QIDB_ACK);
/* unmap the command's data buffer */
- bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap, BUS_DMASYNC_POSTREAD);
+ if (ac->ac_flags & AMR_CMD_DATAIN) {
+ bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,
+ BUS_DMASYNC_POSTREAD);
+ }
+ if (ac->ac_flags & AMR_CMD_DATAOUT) {
+ bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,
+ BUS_DMASYNC_POSTWRITE);
+ }
bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_dmamap);
return(error);
OpenPOWER on IntegriCloud