Lines Matching refs:ccb
218 struct dpt_ccb *ccb; in dpt_ccb_alloc() local
222 ccb = SLIST_FIRST(&sc->sc_ccb_free); in dpt_ccb_alloc()
226 return (ccb); in dpt_ccb_alloc()
230 dpt_ccb_free(struct dpt_softc *sc, struct dpt_ccb *ccb) in dpt_ccb_free() argument
234 ccb->ccb_flg = 0; in dpt_ccb_free()
235 ccb->ccb_savesp = NULL; in dpt_ccb_free()
237 SLIST_INSERT_HEAD(&sc->sc_ccb_free, ccb, ccb_chain); in dpt_ccb_free()
248 struct dpt_ccb *ccb; in dpt_intr() local
296 ccb = sc->sc_ccbs + sp->sp_ccbid; in dpt_intr()
298 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, CCB_OFF(sc, ccb), in dpt_intr()
301 ccb->ccb_hba_status = sp->sp_hba_status & 0x7f; in dpt_intr()
302 ccb->ccb_scsi_status = sp->sp_scsi_status; in dpt_intr()
303 if (ccb->ccb_savesp != NULL) in dpt_intr()
304 memcpy(ccb->ccb_savesp, sp, sizeof(*sp)); in dpt_intr()
312 ccb->ccb_flg |= CCB_INTR; in dpt_intr()
314 if ((ccb->ccb_flg & CCB_PRIVATE) == 0) in dpt_intr()
315 dpt_ccb_done(sc, ccb); in dpt_intr()
316 else if ((ccb->ccb_flg & CCB_WAIT) != 0) in dpt_intr()
317 wakeup(ccb); in dpt_intr()
336 struct dpt_ccb *ccb; in dpt_init() local
392 for (i = 0, ccb = sc->sc_ccbs; i < sc->sc_nccbs; i++, ccb++) { in dpt_init()
396 &ccb->ccb_dmamap_xfer); in dpt_init()
402 ccb->ccb_id = i; in dpt_init()
403 ccb->ccb_ccbpa = sc->sc_dmamap->dm_segs[0].ds_addr + in dpt_init()
404 CCB_OFF(sc, ccb); in dpt_init()
405 SLIST_INSERT_HEAD(&sc->sc_ccb_free, ccb, ccb_chain); in dpt_init()
639 dpt_cmd(struct dpt_softc *sc, struct dpt_ccb *ccb, int eatacmd, int icmd) in dpt_cmd() argument
656 pa = (ccb != NULL ? ccb->ccb_ccbpa : 0); in dpt_cmd()
693 dpt_ccb_poll(struct dpt_softc *sc, struct dpt_ccb *ccb) in dpt_ccb_poll() argument
698 if ((ccb->ccb_flg & CCB_PRIVATE) == 0) in dpt_ccb_poll()
704 if ((ccb->ccb_flg & CCB_INTR) != 0) { in dpt_ccb_poll()
709 for (i = ccb->ccb_timeout * 20; i != 0; i--) { in dpt_ccb_poll()
712 if ((ccb->ccb_flg & CCB_INTR) != 0) in dpt_ccb_poll()
727 dpt_ccb_done(struct dpt_softc *sc, struct dpt_ccb *ccb) in dpt_ccb_done() argument
731 xs = ccb->ccb_xs; in dpt_ccb_done()
740 dpt_ccb_unmap(sc, ccb); in dpt_ccb_done()
743 if (ccb->ccb_hba_status != SP_HBA_NO_ERROR) { in dpt_ccb_done()
744 switch (ccb->ccb_hba_status) { in dpt_ccb_done()
753 device_xname(sc->sc_dev), ccb->ccb_hba_status); in dpt_ccb_done()
757 } else if (ccb->ccb_scsi_status != SCSI_OK) { in dpt_ccb_done()
758 switch (ccb->ccb_scsi_status) { in dpt_ccb_done()
760 memcpy(&xs->sense.scsi_sense, &ccb->ccb_sense, in dpt_ccb_done()
771 ccb->ccb_scsi_status); in dpt_ccb_done()
778 xs->status = ccb->ccb_scsi_status; in dpt_ccb_done()
782 dpt_ccb_free(sc, ccb); in dpt_ccb_done()
790 dpt_ccb_abort(struct dpt_softc *sc, struct dpt_ccb *ccb) in dpt_ccb_abort() argument
796 xs = ccb->ccb_xs; in dpt_ccb_abort()
805 if ((ccb->ccb_flg & CCB_ABORT) != 0) { in dpt_ccb_abort()
814 ccb->ccb_timeout = DPT_ABORT_TIMEOUT; in dpt_ccb_abort()
815 ccb->ccb_flg |= CCB_ABORT; in dpt_ccb_abort()
817 if (dpt_cmd(sc, ccb, CP_IMMEDIATE, CPI_SPEC_ABORT)) in dpt_ccb_abort()
828 dpt_ccb_map(struct dpt_softc *sc, struct dpt_ccb *ccb) in dpt_ccb_map() argument
837 xs = ccb->ccb_xs; in dpt_ccb_map()
838 xfer = ccb->ccb_dmamap_xfer; in dpt_ccb_map()
839 cp = &ccb->ccb_eata_cp; in dpt_ccb_map()
860 dpt_ccb_free(sc, ccb); in dpt_ccb_map()
878 sg = ccb->ccb_sg; in dpt_ccb_map()
884 cp->cp_dataaddr = htobe32(CCB_OFF(sc, ccb) + in dpt_ccb_map()
898 dpt_ccb_unmap(struct dpt_softc *sc, struct dpt_ccb *ccb) in dpt_ccb_unmap() argument
901 bus_dmamap_sync(sc->sc_dmat, ccb->ccb_dmamap_xfer, 0, in dpt_ccb_unmap()
902 ccb->ccb_dmamap_xfer->dm_mapsize, in dpt_ccb_unmap()
903 (ccb->ccb_eata_cp.cp_ctl0 & CP_C0_DATA_IN) != 0 ? in dpt_ccb_unmap()
905 bus_dmamap_unload(sc->sc_dmat, ccb->ccb_dmamap_xfer); in dpt_ccb_unmap()
931 struct dpt_ccb *ccb; in dpt_scsipi_request() local
963 ccb = dpt_ccb_alloc(sc); in dpt_scsipi_request()
964 ccb->ccb_xs = xs; in dpt_scsipi_request()
965 ccb->ccb_timeout = xs->timeout; in dpt_scsipi_request()
967 cp = &ccb->ccb_eata_cp; in dpt_scsipi_request()
969 cp->cp_ccbid = ccb->ccb_id; in dpt_scsipi_request()
970 cp->cp_senselen = sizeof(ccb->ccb_sense); in dpt_scsipi_request()
994 CCB_OFF(sc, ccb) + offsetof(struct dpt_ccb, ccb_sense)); in dpt_scsipi_request()
997 if (dpt_ccb_map(sc, ccb)) in dpt_scsipi_request()
1006 CCB_OFF(sc, ccb), sizeof(struct dpt_ccb), in dpt_scsipi_request()
1015 ccb->ccb_flg |= CCB_PRIVATE; in dpt_scsipi_request()
1017 if (dpt_cmd(sc, ccb, CP_DMA_CMD, 0)) { in dpt_scsipi_request()
1021 dpt_ccb_unmap(sc, ccb); in dpt_scsipi_request()
1022 dpt_ccb_free(sc, ccb); in dpt_scsipi_request()
1029 if (dpt_ccb_poll(sc, ccb)) { in dpt_scsipi_request()
1030 dpt_ccb_abort(sc, ccb); in dpt_scsipi_request()
1032 if (dpt_ccb_poll(sc, ccb)) in dpt_scsipi_request()
1033 dpt_ccb_abort(sc, ccb); in dpt_scsipi_request()
1036 dpt_ccb_done(sc, ccb); in dpt_scsipi_request()
1061 struct dpt_ccb *ccb; in dpt_hba_inquire() local
1067 ccb = dpt_ccb_alloc(sc); in dpt_hba_inquire()
1068 ccb->ccb_flg |= CCB_PRIVATE; in dpt_hba_inquire()
1069 ccb->ccb_timeout = 200; in dpt_hba_inquire()
1072 cp = &ccb->ccb_eata_cp; in dpt_hba_inquire()
1073 cp->cp_ccbid = ccb->ccb_id; in dpt_hba_inquire()
1074 cp->cp_senselen = sizeof(ccb->ccb_sense); in dpt_hba_inquire()
1091 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, CCB_OFF(sc, ccb), in dpt_hba_inquire()
1099 if (dpt_cmd(sc, ccb, CP_DMA_CMD, 0)) in dpt_hba_inquire()
1102 if (dpt_ccb_poll(sc, ccb)) in dpt_hba_inquire()
1105 if (ccb->ccb_hba_status != SP_HBA_NO_ERROR || in dpt_hba_inquire()
1106 ccb->ccb_scsi_status != SCSI_OK) in dpt_hba_inquire()
1108 device_xname(sc->sc_dev), ccb->ccb_hba_status, in dpt_hba_inquire()
1109 ccb->ccb_scsi_status); in dpt_hba_inquire()
1114 dpt_ccb_free(sc, ccb); in dpt_hba_inquire()
1278 struct dpt_ccb *ccb; in dpt_passthrough() local
1289 ccb = dpt_ccb_alloc(sc); in dpt_passthrough()
1290 ccb->ccb_flg |= CCB_PRIVATE | CCB_WAIT; in dpt_passthrough()
1291 ccb->ccb_timeout = 0; in dpt_passthrough()
1292 ccb->ccb_savesp = &sp; in dpt_passthrough()
1294 cp = &ccb->ccb_eata_cp; in dpt_passthrough()
1297 cp->cp_ccbid = ccb->ccb_id; in dpt_passthrough()
1298 cp->cp_senselen = sizeof(ccb->ccb_sense); in dpt_passthrough()
1300 CCB_OFF(sc, ccb) + offsetof(struct dpt_ccb, ccb_sense)); in dpt_passthrough()
1307 xfer = ccb->ccb_dmamap_xfer; in dpt_passthrough()
1312 dpt_ccb_free(sc, ccb); in dpt_passthrough()
1322 dpt_ccb_free(sc, ccb); in dpt_passthrough()
1329 sg = ccb->ccb_sg; in dpt_passthrough()
1335 cp->cp_dataaddr = htobe32(CCB_OFF(sc, ccb) + in dpt_passthrough()
1348 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, CCB_OFF(sc, ccb), in dpt_passthrough()
1353 if (dpt_cmd(sc, ccb, CP_DMA_CMD, 0)) in dpt_passthrough()
1355 tsleep(ccb, PWAIT, "dptucmd", 0); in dpt_passthrough()
1361 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, CCB_OFF(sc, ccb), in dpt_passthrough()
1378 i = uimin(uslen, sizeof(ccb->ccb_sense)); in dpt_passthrough()
1379 rv = copyout(&ccb->ccb_sense, ucp->ucp_senseaddr, i); in dpt_passthrough()
1386 ucp->ucp_hstatus = (u_int8_t)ccb->ccb_hba_status; in dpt_passthrough()
1387 ucp->ucp_tstatus = (u_int8_t)ccb->ccb_scsi_status; in dpt_passthrough()
1388 dpt_ccb_free(sc, ccb); in dpt_passthrough()