diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2013-02-12 16:57:20 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2013-02-12 16:57:20 +0000 |
| commit | dd0b4fb6d50631c140e800bdfac48d02e7e4c875 (patch) | |
| tree | e550f2c754f1edf951a8b93963ebcfc4fa0d20ce /sys/dev/tws | |
| parent | 44c169253de5caec5de2a397c522ad3e359f86e6 (diff) | |
Notes
Diffstat (limited to 'sys/dev/tws')
| -rw-r--r-- | sys/dev/tws/tws.h | 1 | ||||
| -rw-r--r-- | sys/dev/tws/tws_cam.c | 49 |
2 files changed, 13 insertions, 37 deletions
diff --git a/sys/dev/tws/tws.h b/sys/dev/tws/tws.h index 5242d9dcca4d..e84047d209ef 100644 --- a/sys/dev/tws/tws.h +++ b/sys/dev/tws/tws.h @@ -137,6 +137,7 @@ enum tws_req_flags { TWS_DIR_IN = 0x2, TWS_DIR_OUT = 0x4, TWS_DIR_NONE = 0x8, + TWS_DATA_CCB = 0x16, }; enum tws_intrs { diff --git a/sys/dev/tws/tws_cam.c b/sys/dev/tws/tws_cam.c index 18ac2be1c29b..657777a68b2c 100644 --- a/sys/dev/tws/tws_cam.c +++ b/sys/dev/tws/tws_cam.c @@ -739,39 +739,8 @@ tws_execute_scsi(struct tws_softc *sc, union ccb *ccb) else bcopy(csio->cdb_io.cdb_bytes, cmd_pkt->cmd.pkt_a.cdb, csio->cdb_len); - if (!(ccb_h->flags & CAM_DATA_PHYS)) { - /* Virtual data addresses. Need to convert them... */ - if (!(ccb_h->flags & CAM_SCATTER_VALID)) { - if (csio->dxfer_len > TWS_MAX_IO_SIZE) { - TWS_TRACE(sc, "I/O is big", csio->dxfer_len, 0); - tws_release_request(req); - ccb_h->status = CAM_REQ_TOO_BIG; - xpt_done(ccb); - return(0); - } - - req->length = csio->dxfer_len; - if (req->length) { - req->data = csio->data_ptr; - /* there is 1 sgl_entrie */ - /* cmd_pkt->cmd.pkt_a.lun_h4__sgl_entries |= 1; */ - } - } else { - TWS_TRACE_DEBUG(sc, "got sglist", ccb_h->target_id, ccb_h->target_lun); - tws_release_request(req); - ccb_h->status = CAM_REQ_INVALID; - xpt_done(ccb); - return(0); - } - } else { - /* Data addresses are physical. */ - TWS_TRACE_DEBUG(sc, "Phy data addr", ccb_h->target_id, ccb_h->target_lun); - tws_release_request(req); - ccb_h->status = CAM_REQ_INVALID; - ccb_h->status &= ~CAM_SIM_QUEUED; - xpt_done(ccb); - return(0); - } + req->data = ccb; + req->flags |= TWS_DATA_CCB; /* save ccb ptr */ req->ccb_ptr = ccb; /* @@ -961,10 +930,16 @@ tws_map_request(struct tws_softc *sc, struct tws_request *req) * Map the data buffer into bus space and build the SG list. */ mtx_lock(&sc->io_lock); - error = bus_dmamap_load(sc->data_tag, req->dma_map, - req->data, req->length, - tws_dmamap_data_load_cbfn, req, - my_flags); + if (req->flags & TWS_DATA_CCB) + error = bus_dmamap_load_ccb(sc->data_tag, req->dma_map, + req->data, + tws_dmamap_data_load_cbfn, req, + my_flags); + else + error = bus_dmamap_load(sc->data_tag, req->dma_map, + req->data, req->length, + tws_dmamap_data_load_cbfn, req, + my_flags); mtx_unlock(&sc->io_lock); if (error == EINPROGRESS) { |
