diff options
author | marius <marius@FreeBSD.org> | 2013-05-30 00:22:07 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2013-05-30 00:22:07 +0000 |
commit | f463a4083c29543a7119bf2b1872530b83f819f1 (patch) | |
tree | ba576eab8be9125b7ea3ff64d222314b06992859 /sys/dev/aac | |
parent | c4a034ff8debecd0fd480a753564a0a2248f0436 (diff) | |
download | FreeBSD-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.c | 16 | ||||
-rw-r--r-- | sys/dev/aac/aac_disk.c | 1 | ||||
-rw-r--r-- | sys/dev/aac/aacvar.h | 2 |
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; |