aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/iir/iir.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2013-02-12 16:57:20 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2013-02-12 16:57:20 +0000
commitdd0b4fb6d50631c140e800bdfac48d02e7e4c875 (patch)
treee550f2c754f1edf951a8b93963ebcfc4fa0d20ce /sys/dev/iir/iir.c
parent44c169253de5caec5de2a397c522ad3e359f86e6 (diff)
Notes
Diffstat (limited to 'sys/dev/iir/iir.c')
-rw-r--r--sys/dev/iir/iir.c99
1 files changed, 15 insertions, 84 deletions
diff --git a/sys/dev/iir/iir.c b/sys/dev/iir/iir.c
index 057194a71b5ad..4c907f014947e 100644
--- a/sys/dev/iir/iir.c
+++ b/sys/dev/iir/iir.c
@@ -794,6 +794,7 @@ gdt_raw_cmd(struct gdt_softc *gdt, union ccb *ccb, int *lock)
{
struct gdt_ccb *gccb;
struct cam_sim *sim;
+ int error;
GDT_DPRINTF(GDT_D_CMD, ("gdt_raw_cmd(%p, %p)\n", gdt, ccb));
@@ -844,51 +845,14 @@ gdt_raw_cmd(struct gdt_softc *gdt, union ccb *ccb, int *lock)
gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_RAW_SENSE_DATA,
gccb->gc_scratch_busbase);
- /*
- * If we have any data to send with this command,
- * map it into bus space.
- */
- /* Only use S/G if there is a transfer */
- if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
- if ((ccb->ccb_h.flags & CAM_SCATTER_VALID) == 0) {
- if ((ccb->ccb_h.flags & CAM_DATA_PHYS) == 0) {
- int s;
- int error;
-
- /* vorher unlock von splcam() ??? */
- s = splsoftvm();
- error =
- bus_dmamap_load(gdt->sc_buffer_dmat,
- gccb->gc_dmamap,
- ccb->csio.data_ptr,
- ccb->csio.dxfer_len,
- gdtexecuteccb,
- gccb, /*flags*/0);
- if (error == EINPROGRESS) {
- xpt_freeze_simq(sim, 1);
- gccb->gc_ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
- }
- splx(s);
- } else {
- panic("iir: CAM_DATA_PHYS not supported");
- }
- } else {
- struct bus_dma_segment *segs;
-
- if ((ccb->ccb_h.flags & CAM_DATA_PHYS) != 0)
- panic("iir%d: iir_action - Physical "
- "segment pointers unsupported", gdt->sc_hanum);
-
- if ((ccb->ccb_h.flags & CAM_SG_LIST_PHYS)==0)
- panic("iir%d: iir_action - Virtual "
- "segment addresses unsupported", gdt->sc_hanum);
-
- /* Just use the segments provided */
- segs = (struct bus_dma_segment *)ccb->csio.data_ptr;
- gdtexecuteccb(gccb, segs, ccb->csio.sglist_cnt, 0);
- }
- } else {
- gdtexecuteccb(gccb, NULL, 0, 0);
+ error = bus_dmamap_load_ccb(gdt->sc_buffer_dmat,
+ gccb->gc_dmamap,
+ ccb,
+ gdtexecuteccb,
+ gccb, /*flags*/0);
+ if (error == EINPROGRESS) {
+ xpt_freeze_simq(sim, 1);
+ gccb->gc_ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
}
*lock = splcam();
@@ -903,6 +867,7 @@ gdt_cache_cmd(struct gdt_softc *gdt, union ccb *ccb, int *lock)
u_int8_t *cmdp;
u_int16_t opcode;
u_int32_t blockno, blockcnt;
+ int error;
GDT_DPRINTF(GDT_D_CMD, ("gdt_cache_cmd(%p, %p)\n", gdt, ccb));
@@ -953,49 +918,15 @@ gdt_cache_cmd(struct gdt_softc *gdt, union ccb *ccb, int *lock)
gdt_enc32(gccb->gc_cmd + GDT_CMD_UNION + GDT_CACHE_BLOCKCNT,
blockcnt);
- /*
- * If we have any data to send with this command,
- * map it into bus space.
- */
- /* Only use S/G if there is a transfer */
- if ((ccb->ccb_h.flags & CAM_SCATTER_VALID) == 0) {
- if ((ccb->ccb_h.flags & CAM_DATA_PHYS) == 0) {
- int s;
- int error;
-
- /* vorher unlock von splcam() ??? */
- s = splsoftvm();
- error =
- bus_dmamap_load(gdt->sc_buffer_dmat,
+ error = bus_dmamap_load_ccb(gdt->sc_buffer_dmat,
gccb->gc_dmamap,
- ccb->csio.data_ptr,
- ccb->csio.dxfer_len,
+ ccb,
gdtexecuteccb,
gccb, /*flags*/0);
- if (error == EINPROGRESS) {
- xpt_freeze_simq(sim, 1);
- gccb->gc_ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
- }
- splx(s);
- } else {
- panic("iir: CAM_DATA_PHYS not supported");
- }
- } else {
- struct bus_dma_segment *segs;
-
- if ((ccb->ccb_h.flags & CAM_DATA_PHYS) != 0)
- panic("iir%d: iir_action - Physical "
- "segment pointers unsupported", gdt->sc_hanum);
-
- if ((ccb->ccb_h.flags & CAM_SG_LIST_PHYS)==0)
- panic("iir%d: iir_action - Virtual "
- "segment addresses unsupported", gdt->sc_hanum);
-
- /* Just use the segments provided */
- segs = (struct bus_dma_segment *)ccb->csio.data_ptr;
- gdtexecuteccb(gccb, segs, ccb->csio.sglist_cnt, 0);
+ if (error == EINPROGRESS) {
+ xpt_freeze_simq(sim, 1);
+ gccb->gc_ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
}
-
*lock = splcam();
return (gccb);
}