summaryrefslogtreecommitdiff
path: root/sys/dev/ic/ami.c
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2006-05-21 02:51:10 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2006-05-21 02:51:10 +0000
commitb16faa179c3f446003bfa03c6112d35262be05e2 (patch)
tree09ae094b621c9f99c1c4d67258045adb9f6a329d /sys/dev/ic/ami.c
parentcbefdc5e9c5ee5cdf995b97f60bb72017472b9c9 (diff)
The SCSI command on the passthrough bus is handed to the firmware via a
structure not included in the MegaRAID command, so it needs to be synced before we submit it. Previously this was done only when the SCSI command had an associated data buffer. The syncing of the passthrough command is now done unconditionally. ok krw@ marco@
Diffstat (limited to 'sys/dev/ic/ami.c')
-rw-r--r--sys/dev/ic/ami.c64
1 files changed, 32 insertions, 32 deletions
diff --git a/sys/dev/ic/ami.c b/sys/dev/ic/ami.c
index de0a387a03c..c5f394ea479 100644
--- a/sys/dev/ic/ami.c
+++ b/sys/dev/ic/ami.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ami.c,v 1.156 2006/05/12 20:51:25 marco Exp $ */
+/* $OpenBSD: ami.c,v 1.157 2006/05/21 02:51:09 dlg Exp $ */
/*
* Copyright (c) 2001 Michael Shalayeff
@@ -1151,16 +1151,16 @@ ami_done_pt(struct ami_softc *sc, struct ami_ccb *ccb)
struct ami_rawsoftc *rsc = link->adapter_softc;
u_int8_t target = link->target, type;
+ bus_dmamap_sync(sc->sc_dmat, AMIMEM_MAP(sc->sc_ccbmem_am),
+ ccb->ccb_offset, sizeof(struct ami_ccbmem),
+ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+
if (xs->data != NULL) {
bus_dmamap_sync(sc->sc_dmat, ccb->ccb_dmamap, 0,
ccb->ccb_dmamap->dm_mapsize,
(xs->flags & SCSI_DATA_IN) ?
BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
- bus_dmamap_sync(sc->sc_dmat, AMIMEM_MAP(sc->sc_ccbmem_am),
- ccb->ccb_offset, sizeof(struct ami_ccbmem),
- BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
-
bus_dmamap_unload(sc->sc_dmat, ccb->ccb_dmamap);
}
@@ -1361,45 +1361,45 @@ ami_load_ptmem(struct ami_softc *sc, struct ami_ccb *ccb, void *data,
{
bus_dmamap_t dmap = ccb->ccb_dmamap;
bus_dma_segment_t *sgd;
- int error = 0, i;
-
- if (data == NULL) /* nothing to do */
- return (0);
+ int error, i;
- error = bus_dmamap_load(sc->sc_dmat, ccb->ccb_dmamap, data, len,
- NULL, nowait ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
- if (error) {
- if (error == EFBIG)
- printf("more than %d dma segs\n", AMI_MAXOFFSETS);
- else
- printf("error %d loading dma map\n", error);
+ if (data != NULL) {
+ error = bus_dmamap_load(sc->sc_dmat, dmap, data, len, NULL,
+ nowait ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
+ if (error) {
+ if (error == EFBIG)
+ printf("more than %d dma segs\n",
+ AMI_MAXOFFSETS);
+ else
+ printf("error %d loading dma map\n", error);
- return (1);
- }
+ return (1);
+ }
- sgd = dmap->dm_segs;
- if (dmap->dm_nsegs > 1) {
- struct ami_sgent *sgl = ccb->ccb_sglist;
+ sgd = dmap->dm_segs;
+ if (dmap->dm_nsegs > 1) {
+ struct ami_sgent *sgl = ccb->ccb_sglist;
- ccb->ccb_pt->apt_nsge = dmap->dm_nsegs;
- ccb->ccb_pt->apt_data = ccb->ccb_sglistpa;
+ ccb->ccb_pt->apt_nsge = dmap->dm_nsegs;
+ ccb->ccb_pt->apt_data = ccb->ccb_sglistpa;
- for (i = 0; i < dmap->dm_nsegs; i++) {
- sgl[i].asg_addr = htole32(sgd[i].ds_addr);
- sgl[i].asg_len = htole32(sgd[i].ds_len);
+ for (i = 0; i < dmap->dm_nsegs; i++) {
+ sgl[i].asg_addr = htole32(sgd[i].ds_addr);
+ sgl[i].asg_len = htole32(sgd[i].ds_len);
+ }
+ } else {
+ ccb->ccb_pt->apt_nsge = 0;
+ ccb->ccb_pt->apt_data = htole32(sgd->ds_addr);
}
- } else {
- ccb->ccb_pt->apt_nsge = 0;
- ccb->ccb_pt->apt_data = htole32(sgd->ds_addr);
+
+ bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize,
+ read ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
}
bus_dmamap_sync(sc->sc_dmat, AMIMEM_MAP(sc->sc_ccbmem_am),
ccb->ccb_offset, sizeof(struct ami_ccbmem),
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
- bus_dmamap_sync(sc->sc_dmat, ccb->ccb_dmamap, 0, dmap->dm_mapsize,
- read ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
-
return (0);
}