summaryrefslogtreecommitdiffstats
path: root/sys/dev/aac
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2013-05-30 00:22:07 +0000
committermarius <marius@FreeBSD.org>2013-05-30 00:22:07 +0000
commitf463a4083c29543a7119bf2b1872530b83f819f1 (patch)
treeba576eab8be9125b7ea3ff64d222314b06992859 /sys/dev/aac
parentc4a034ff8debecd0fd480a753564a0a2248f0436 (diff)
downloadFreeBSD-src-f463a4083c29543a7119bf2b1872530b83f819f1.zip
FreeBSD-src-f463a4083c29543a7119bf2b1872530b83f819f1.tar.gz
Allow unmapped I/O via aacd(4). It shouldn't be too hard to add the
same support for aacp(4), I'm lacking the necessary hardware for testing, though.
Diffstat (limited to 'sys/dev/aac')
-rw-r--r--sys/dev/aac/aac.c16
-rw-r--r--sys/dev/aac/aac_disk.c1
-rw-r--r--sys/dev/aac/aacvar.h2
3 files changed, 13 insertions, 6 deletions
diff --git a/sys/dev/aac/aac.c b/sys/dev/aac/aac.c
index 3ceda47..c56aeca 100644
--- a/sys/dev/aac/aac.c
+++ b/sys/dev/aac/aac.c
@@ -987,14 +987,18 @@ aac_startio(struct aac_softc *sc)
* busdma.
*/
if (cm->cm_datalen != 0) {
- error = bus_dmamap_load(sc->aac_buffer_dmat,
- cm->cm_datamap, cm->cm_data,
- cm->cm_datalen,
- aac_map_command_sg, cm, 0);
+ if (cm->cm_flags & AAC_REQ_BIO)
+ error = bus_dmamap_load_bio(
+ sc->aac_buffer_dmat, cm->cm_datamap,
+ (struct bio *)cm->cm_private,
+ aac_map_command_sg, cm, 0);
+ else
+ error = bus_dmamap_load(sc->aac_buffer_dmat,
+ cm->cm_datamap, cm->cm_data,
+ cm->cm_datalen, aac_map_command_sg, cm, 0);
if (error == EINPROGRESS) {
fwprintf(sc, HBA_FLAGS_DBG_COMM_B, "freezing queue\n");
sc->flags |= AAC_QUEUE_FRZN;
- error = 0;
} else if (error != 0)
panic("aac_startio: unexpected error %d from "
"busdma", error);
@@ -1199,9 +1203,9 @@ aac_bio_command(struct aac_softc *sc, struct aac_command **cmp)
goto fail;
/* fill out the command */
- cm->cm_data = (void *)bp->bio_data;
cm->cm_datalen = bp->bio_bcount;
cm->cm_complete = aac_bio_complete;
+ cm->cm_flags = AAC_REQ_BIO;
cm->cm_private = bp;
cm->cm_timestamp = time_uptime;
diff --git a/sys/dev/aac/aac_disk.c b/sys/dev/aac/aac_disk.c
index fd89f5e..394e057 100644
--- a/sys/dev/aac/aac_disk.c
+++ b/sys/dev/aac/aac_disk.c
@@ -397,6 +397,7 @@ aac_disk_attach(device_t dev)
sc->unit = device_get_unit(dev);
sc->ad_disk = disk_alloc();
sc->ad_disk->d_drv1 = sc;
+ sc->ad_disk->d_flags = DISKFLAG_UNMAPPED_BIO;
sc->ad_disk->d_name = "aacd";
sc->ad_disk->d_maxsize = sc->ad_controller->aac_max_sectors << 9;
sc->ad_disk->d_open = aac_disk_open;
diff --git a/sys/dev/aac/aacvar.h b/sys/dev/aac/aacvar.h
index f856234..18ae0b2 100644
--- a/sys/dev/aac/aacvar.h
+++ b/sys/dev/aac/aacvar.h
@@ -181,6 +181,8 @@ struct aac_command
#define AAC_ON_AACQ_MASK ((1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<10))
#define AAC_QUEUE_FRZN (1<<9) /* Freeze the processing of
* commands on the queue. */
+#define AAC_REQ_BIO (1 << 11)
+#define AAC_REQ_CCB (1 << 12)
void (*cm_complete)(struct aac_command *cm);
void *cm_private;
OpenPOWER on IntegriCloud