summaryrefslogtreecommitdiffstats
path: root/sys/dev/hptiop
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2013-02-12 16:57:20 +0000
committerkib <kib@FreeBSD.org>2013-02-12 16:57:20 +0000
commitbd7f0fa0bb4b7b0f87227e0c4d49a4bd9b113cf0 (patch)
treee550f2c754f1edf951a8b93963ebcfc4fa0d20ce /sys/dev/hptiop
parente0a463e76c719f11788ec107b5aa3e2da4e57c0b (diff)
downloadFreeBSD-src-bd7f0fa0bb4b7b0f87227e0c4d49a4bd9b113cf0.zip
FreeBSD-src-bd7f0fa0bb4b7b0f87227e0c4d49a4bd9b113cf0.tar.gz
Reform the busdma API so that new types may be added without modifying
every architecture's busdma_machdep.c. It is done by unifying the bus_dmamap_load_buffer() routines so that they may be called from MI code. The MD busdma is then given a chance to do any final processing in the complete() callback. The cam changes unify the bus_dmamap_load* handling in cam drivers. The arm and mips implementations are updated to track virtual addresses for sync(). Previously this was done in a type specific way. Now it is done in a generic way by recording the list of virtuals in the map. Submitted by: jeff (sponsored by EMC/Isilon) Reviewed by: kan (previous version), scottl, mjacob (isp(4), no objections for target mode changes) Discussed with: ian (arm changes) Tested by: marius (sparc64), mips (jmallet), isci(4) on x86 (jharris), amd64 (Fabian Keil <freebsd-listen@fabiankeil.de>)
Diffstat (limited to 'sys/dev/hptiop')
-rw-r--r--sys/dev/hptiop/hptiop.c63
1 files changed, 17 insertions, 46 deletions
diff --git a/sys/dev/hptiop/hptiop.c b/sys/dev/hptiop/hptiop.c
index c4e3d5a..e3190d2 100644
--- a/sys/dev/hptiop/hptiop.c
+++ b/sys/dev/hptiop/hptiop.c
@@ -2358,6 +2358,7 @@ static void hptiop_action(struct cam_sim *sim, union ccb *ccb)
{
struct hpt_iop_hba * hba = (struct hpt_iop_hba *)cam_sim_softc(sim);
struct hpt_iop_srb * srb;
+ int error;
switch (ccb->ccb_h.func_code) {
@@ -2380,52 +2381,22 @@ static void hptiop_action(struct cam_sim *sim, union ccb *ccb)
}
srb->ccb = ccb;
-
- if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE)
- hptiop_post_scsi_command(srb, NULL, 0, 0);
- else if ((ccb->ccb_h.flags & CAM_SCATTER_VALID) == 0) {
- if ((ccb->ccb_h.flags & CAM_DATA_PHYS) == 0) {
- int error;
-
- error = bus_dmamap_load(hba->io_dmat,
- srb->dma_map,
- ccb->csio.data_ptr,
- ccb->csio.dxfer_len,
- hptiop_post_scsi_command,
- srb, 0);
-
- if (error && error != EINPROGRESS) {
- device_printf(hba->pcidev,
- "%d bus_dmamap_load error %d",
- hba->pciunit, error);
- xpt_freeze_simq(hba->sim, 1);
- ccb->ccb_h.status = CAM_REQ_CMP_ERR;
-invalid:
- hptiop_free_srb(hba, srb);
- xpt_done(ccb);
- goto scsi_done;
- }
- }
- else {
- device_printf(hba->pcidev,
- "CAM_DATA_PHYS not supported");
- ccb->ccb_h.status = CAM_REQ_CMP_ERR;
- goto invalid;
- }
- }
- else {
- struct bus_dma_segment *segs;
-
- if ((ccb->ccb_h.flags & CAM_SG_LIST_PHYS) == 0 ||
- (ccb->ccb_h.flags & CAM_DATA_PHYS) != 0) {
- device_printf(hba->pcidev, "SCSI cmd failed");
- ccb->ccb_h.status=CAM_PROVIDE_FAIL;
- goto invalid;
- }
-
- segs = (struct bus_dma_segment *)ccb->csio.data_ptr;
- hptiop_post_scsi_command(srb, segs,
- ccb->csio.sglist_cnt, 0);
+ error = bus_dmamap_load_ccb(hba->io_dmat,
+ srb->dma_map,
+ ccb,
+ hptiop_post_scsi_command,
+ srb,
+ 0);
+
+ if (error && error != EINPROGRESS) {
+ device_printf(hba->pcidev,
+ "%d bus_dmamap_load error %d",
+ hba->pciunit, error);
+ xpt_freeze_simq(hba->sim, 1);
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
+ hptiop_free_srb(hba, srb);
+ xpt_done(ccb);
+ goto scsi_done;
}
scsi_done:
OpenPOWER on IntegriCloud