Lines Matching refs:ccb
844 ips_scsi_cmd(struct ips_ccb *ccb) in ips_scsi_cmd() argument
846 struct scsipi_xfer *xs = ccb->c_xfer; in ips_scsi_cmd()
866 ips_ccb_put(sc, ccb); in ips_scsi_cmd()
908 cmd = ccb->c_cmdbva; in ips_scsi_cmd()
914 if (ips_load_xs(sc, ccb, xs)) { in ips_scsi_cmd()
918 ips_ccb_put(sc, ccb); in ips_scsi_cmd()
926 ccb->c_done = ips_done_xs; in ips_scsi_cmd()
927 ips_start_xs(sc, ccb, xs); in ips_scsi_cmd()
965 cmd = ccb->c_cmdbva; in ips_scsi_cmd()
968 ccb->c_done = ips_done_xs; in ips_scsi_cmd()
969 ips_start_xs(sc, ccb, xs); in ips_scsi_cmd()
981 ips_ccb_put(sc, ccb); in ips_scsi_cmd()
994 struct ips_ccb *ccb; in ips_scsipi_request() local
1001 if ((ccb = ips_ccb_get(sc)) == NULL) { in ips_scsipi_request()
1007 ccb->c_xfer = xs; in ips_scsipi_request()
1008 ips_scsi_cmd(ccb); in ips_scsipi_request()
1262 ips_load_xs(struct ips_softc *sc, struct ips_ccb *ccb, struct scsipi_xfer *xs) in ips_load_xs() argument
1264 struct ips_cmdb *cmdb = ccb->c_cmdbva; in ips_load_xs()
1273 if (bus_dmamap_load(sc->sc_dmat, ccb->c_dmam, xs->data, xs->datalen, in ips_load_xs()
1276 bus_dmamap_sync(sc->sc_dmat, ccb->c_dmam, 0,ccb->c_dmam->dm_mapsize, in ips_load_xs()
1280 if ((nsegs = ccb->c_dmam->dm_nsegs) > IPS_MAXSGS) in ips_load_xs()
1285 cmd->sgaddr = htole32(ccb->c_cmdbpa + offsetof(struct ips_cmdb, in ips_load_xs()
1290 sg[i].addr = htole32(ccb->c_dmam->dm_segs[i].ds_addr); in ips_load_xs()
1291 sg[i].size = htole32(ccb->c_dmam->dm_segs[i].ds_len); in ips_load_xs()
1295 cmd->sgaddr = htole32(ccb->c_dmam->dm_segs[0].ds_addr); in ips_load_xs()
1302 ips_start_xs(struct ips_softc *sc, struct ips_ccb *ccb, struct scsipi_xfer *xs) in ips_start_xs() argument
1304 ccb->c_flags = xs->xs_control; in ips_start_xs()
1305 ccb->c_xfer = xs; in ips_start_xs()
1313 callout_reset(&xs->xs_callout, timeout, ips_timeout, ccb); in ips_start_xs()
1321 ips_cmd(sc, ccb); in ips_start_xs()
1325 ips_cmd(struct ips_softc *sc, struct ips_ccb *ccb) in ips_cmd() argument
1327 struct ips_cmd *cmd = ccb->c_cmdbva; in ips_cmd()
1332 "seccnt %d\n", device_xname(sc->sc_dev), ccb->c_id, ccb->c_flags, in ips_cmd()
1333 ccb->c_xfer, cmd->code, cmd->drive, cmd->sgcnt, htole32(cmd->lba), in ips_cmd()
1336 cmd->id = ccb->c_id; in ips_cmd()
1340 ips_exec(sc, ccb); in ips_cmd()
1341 ccb->c_state = IPS_CCB_QUEUED; in ips_cmd()
1342 if (ccb->c_flags & XS_CTL_POLL) in ips_cmd()
1343 error = ips_poll(sc, ccb); in ips_cmd()
1350 ips_poll(struct ips_softc *sc, struct ips_ccb *ccb) in ips_poll() argument
1355 if (ccb->c_flags & XS_CTL_NOSLEEP) { in ips_poll()
1363 if (ccb->c_state == IPS_CCB_DONE) in ips_poll()
1368 timo = ccb->c_xfer ? ccb->c_xfer->timeout : IPS_TIMEOUT; in ips_poll()
1375 tsleep(ccb, PRIBIO + 1, "ipscmd", timo); in ips_poll()
1379 ccb->c_state)); in ips_poll()
1381 if (ccb->c_state != IPS_CCB_DONE) in ips_poll()
1386 ccb->c_stat = IPS_STAT_TIMO; in ips_poll()
1388 ips_done(sc, ccb); in ips_poll()
1389 error = ccb->c_error; in ips_poll()
1395 ips_done(struct ips_softc *sc, struct ips_ccb *ccb) in ips_done() argument
1398 device_xname(sc->sc_dev), ccb->c_id, ccb->c_flags, ccb->c_xfer)); in ips_done()
1400 ccb->c_error = ips_error(sc, ccb); in ips_done()
1401 ccb->c_done(sc, ccb); in ips_done()
1405 ips_done_xs(struct ips_softc *sc, struct ips_ccb *ccb) in ips_done_xs() argument
1407 struct scsipi_xfer *xs = ccb->c_xfer; in ips_done_xs()
1413 bus_dmamap_sync(sc->sc_dmat, ccb->c_dmam, 0, in ips_done_xs()
1414 ccb->c_dmam->dm_mapsize, xs->xs_control & XS_CTL_DATA_IN ? in ips_done_xs()
1416 bus_dmamap_unload(sc->sc_dmat, ccb->c_dmam); in ips_done_xs()
1420 xs->error = ips_error_xs(sc, ccb); in ips_done_xs()
1421 ips_ccb_put(sc, ccb); in ips_done_xs()
1426 ips_done_pt(struct ips_softc *sc, struct ips_ccb *ccb) in ips_done_pt() argument
1428 struct scsipi_xfer *xs = ccb->c_xfer; in ips_done_pt()
1429 struct ips_cmdb *cmdb = ccb->c_cmdbva; in ips_done_pt()
1437 bus_dmamap_sync(sc->sc_dmat, ccb->c_dmam, 0, in ips_done_pt()
1438 ccb->c_dmam->dm_mapsize, xs->xs_control & XS_CTL_DATA_IN ? in ips_done_pt()
1440 bus_dmamap_unload(sc->sc_dmat, ccb->c_dmam); in ips_done_pt()
1447 xs->error = ips_error_xs(sc, ccb); in ips_done_pt()
1463 ips_ccb_put(sc, ccb); in ips_done_pt()
1468 ips_done_mgmt(struct ips_softc *sc, struct ips_ccb *ccb) in ips_done_mgmt() argument
1470 if (ccb->c_flags & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT)) in ips_done_mgmt()
1473 ccb->c_flags & XS_CTL_DATA_IN ? BUS_DMASYNC_POSTREAD : in ips_done_mgmt()
1476 ips_ccb_put(sc, ccb); in ips_done_mgmt()
1480 ips_error(struct ips_softc *sc, struct ips_ccb *ccb) in ips_error() argument
1482 struct ips_cmdb *cmdb = ccb->c_cmdbva; in ips_error()
1485 struct scsipi_xfer *xs = ccb->c_xfer; in ips_error()
1486 u_int8_t gsc = IPS_STAT_GSC(ccb->c_stat); in ips_error()
1493 device_xname(sc->sc_dev), ccb->c_stat, ccb->c_estat, cmd->code, in ips_error()
1506 if (ccb->c_estat == IPS_ESTAT_CKCOND) { in ips_error()
1526 switch (ccb->c_estat) { in ips_error()
1544 ips_error_xs(struct ips_softc *sc, struct ips_ccb *ccb) in ips_error_xs() argument
1546 struct ips_cmdb *cmdb = ccb->c_cmdbva; in ips_error_xs()
1548 struct scsipi_xfer *xs = ccb->c_xfer; in ips_error_xs()
1549 u_int8_t gsc = IPS_STAT_GSC(ccb->c_stat); in ips_error_xs()
1561 switch (ccb->c_estat) { in ips_error_xs()
1587 struct ips_ccb *ccb; in ips_intr() local
1610 ccb = &sc->sc_ccb[id]; in ips_intr()
1611 if (ccb->c_state != IPS_CCB_QUEUED) { in ips_intr()
1614 device_xname(sc->sc_dev), ccb->c_id, ccb->c_state, in ips_intr()
1619 ccb->c_state = IPS_CCB_DONE; in ips_intr()
1620 ccb->c_stat = IPS_STAT_BASIC(status); in ips_intr()
1621 ccb->c_estat = IPS_STAT_EXT(status); in ips_intr()
1623 if (ccb->c_flags & XS_CTL_POLL) { in ips_intr()
1624 wakeup(ccb); in ips_intr()
1626 ips_done(sc, ccb); in ips_intr()
1636 struct ips_ccb *ccb = arg; in ips_timeout() local
1637 struct ips_softc *sc = ccb->c_sc; in ips_timeout()
1638 struct scsipi_xfer *xs = ccb->c_xfer; in ips_timeout()
1653 ccb->c_stat = IPS_STAT_TIMO; in ips_timeout()
1654 ips_done(sc, ccb); in ips_timeout()
1661 struct ips_ccb *ccb; in ips_getadapterinfo() local
1664 ccb = ips_ccb_get(sc); in ips_getadapterinfo()
1665 if (ccb == NULL) in ips_getadapterinfo()
1668 ccb->c_flags = XS_CTL_DATA_IN | XS_CTL_POLL | flags; in ips_getadapterinfo()
1669 ccb->c_done = ips_done_mgmt; in ips_getadapterinfo()
1671 cmd = ccb->c_cmdbva; in ips_getadapterinfo()
1676 return (ips_cmd(sc, ccb)); in ips_getadapterinfo()
1682 struct ips_ccb *ccb; in ips_getdriveinfo() local
1685 ccb = ips_ccb_get(sc); in ips_getdriveinfo()
1686 if (ccb == NULL) in ips_getdriveinfo()
1689 ccb->c_flags = XS_CTL_DATA_IN | XS_CTL_POLL | flags; in ips_getdriveinfo()
1690 ccb->c_done = ips_done_mgmt; in ips_getdriveinfo()
1692 cmd = ccb->c_cmdbva; in ips_getdriveinfo()
1697 return (ips_cmd(sc, ccb)); in ips_getdriveinfo()
1703 struct ips_ccb *ccb; in ips_getconf() local
1706 ccb = ips_ccb_get(sc); in ips_getconf()
1707 if (ccb == NULL) in ips_getconf()
1710 ccb->c_flags = XS_CTL_DATA_IN | XS_CTL_POLL | flags; in ips_getconf()
1711 ccb->c_done = ips_done_mgmt; in ips_getconf()
1713 cmd = ccb->c_cmdbva; in ips_getconf()
1718 return (ips_cmd(sc, ccb)); in ips_getconf()
1724 struct ips_ccb *ccb; in ips_getpg5() local
1727 ccb = ips_ccb_get(sc); in ips_getpg5()
1728 if (ccb == NULL) in ips_getpg5()
1731 ccb->c_flags = XS_CTL_DATA_IN | XS_CTL_POLL | flags; in ips_getpg5()
1732 ccb->c_done = ips_done_mgmt; in ips_getpg5()
1734 cmd = ccb->c_cmdbva; in ips_getpg5()
1740 return (ips_cmd(sc, ccb)); in ips_getpg5()
1747 struct ips_ccb *ccb; in ips_getrblstat() local
1750 ccb = ips_ccb_get(sc); in ips_getrblstat()
1751 if (ccb == NULL) in ips_getrblstat()
1754 ccb->c_flags = XS_CTL_DATA_IN | XS_CTL_POLL | flags; in ips_getrblstat()
1755 ccb->c_done = ips_done_mgmt; in ips_getrblstat()
1757 cmd = ccb->c_cmdbva; in ips_getrblstat()
1762 return (ips_cmd(sc, ccb)); in ips_getrblstat()
1768 struct ips_ccb *ccb; in ips_setstate() local
1771 ccb = ips_ccb_get(sc); in ips_setstate()
1772 if (ccb == NULL) in ips_setstate()
1775 ccb->c_flags = XS_CTL_POLL | flags; in ips_setstate()
1776 ccb->c_done = ips_done_mgmt; in ips_setstate()
1778 cmd = ccb->c_cmdbva; in ips_setstate()
1784 return (ips_cmd(sc, ccb)); in ips_setstate()
1791 struct ips_ccb *ccb; in ips_rebuild() local
1794 ccb = ips_ccb_get(sc); in ips_rebuild()
1795 if (ccb == NULL) in ips_rebuild()
1798 ccb->c_flags = XS_CTL_POLL | flags; in ips_rebuild()
1799 ccb->c_done = ips_done_mgmt; in ips_rebuild()
1801 cmd = ccb->c_cmdbva; in ips_rebuild()
1807 return (ips_cmd(sc, ccb)); in ips_rebuild()
1812 ips_copperhead_exec(struct ips_softc *sc, struct ips_ccb *ccb) in ips_copperhead_exec() argument
1827 bus_space_write_4(sc->sc_iot, sc->sc_ioh, IPS_REG_CCSA, ccb->c_cmdbpa); in ips_copperhead_exec()
1876 ips_morpheus_exec(struct ips_softc *sc, struct ips_ccb *ccb) in ips_morpheus_exec() argument
1878 bus_space_write_4(sc->sc_iot, sc->sc_ioh, IPS_REG_IQP, ccb->c_cmdbpa); in ips_morpheus_exec()
1913 struct ips_ccb *ccb; in ips_ccb_alloc() local
1916 ccb = malloc(n * sizeof(*ccb), M_DEVBUF, M_WAITOK | M_ZERO); in ips_ccb_alloc()
1918 ccb[i].c_sc = sc; in ips_ccb_alloc()
1919 ccb[i].c_id = i; in ips_ccb_alloc()
1920 ccb[i].c_cmdbva = (char *)sc->sc_cmdbm.dm_vaddr + in ips_ccb_alloc()
1922 ccb[i].c_cmdbpa = sc->sc_cmdbm.dm_paddr + in ips_ccb_alloc()
1926 &ccb[i].c_dmam)) in ips_ccb_alloc()
1930 return (ccb); in ips_ccb_alloc()
1933 bus_dmamap_destroy(sc->sc_dmat, ccb[i - 1].c_dmam); in ips_ccb_alloc()
1934 free(ccb, M_DEVBUF); in ips_ccb_alloc()
1939 ips_ccb_free(struct ips_softc *sc, struct ips_ccb *ccb, int n) in ips_ccb_free() argument
1944 bus_dmamap_destroy(sc->sc_dmat, ccb[i - 1].c_dmam); in ips_ccb_free()
1945 free(ccb, M_DEVBUF); in ips_ccb_free()
1951 struct ips_ccb *ccb; in ips_ccb_get() local
1954 if ((ccb = SLIST_FIRST(&sc->sc_ccbq_free)) != NULL) { in ips_ccb_get()
1956 ccb->c_flags = 0; in ips_ccb_get()
1957 ccb->c_xfer = NULL; in ips_ccb_get()
1958 bzero(ccb->c_cmdbva, sizeof(struct ips_cmdb)); in ips_ccb_get()
1962 return (ccb); in ips_ccb_get()
1966 ips_ccb_put(struct ips_softc *sc, struct ips_ccb *ccb) in ips_ccb_put() argument
1968 ccb->c_state = IPS_CCB_FREE; in ips_ccb_put()
1970 SLIST_INSERT_HEAD(&sc->sc_ccbq_free, ccb, c_link); in ips_ccb_put()