Lines Matching defs:srb
270 struct trm_srb *sc_srb; /* SRB array */
283 int sc_state; /* SRB State */
518 struct trm_srb *srb;
528 * allocate the space for all SCSI control blocks (SRB) for DMA memory
546 aprint_error(": unable to create SRB DMA maps, "
552 aprint_error(": unable to load SRB DMA maps, "
578 * initialize and link all device's SRB queues of this adapter
585 DPRINTF(("all SRB size=%zx\n", sizeof(struct trm_srb) * TRM_MAX_SRB));
587 for (i = 0, srb = sc->sc_srb; i < TRM_MAX_SRB; i++) {
588 srb->sgentry = sc->sc_sglist + TRM_MAX_SG_ENTRIES * i;
589 srb->sgoffset = TRM_SG_SIZE * i;
590 srb->sgaddr = sc->sc_dmamap->dm_segs[0].ds_addr + srb->sgoffset;
592 * map all SRB space to SRB_array
596 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &srb->dmap)) {
601 TAILQ_INSERT_TAIL(&sc->sc_freesrb, srb, next);
602 srb++;
688 struct trm_srb *srb;
714 /* Get SRB */
715 srb = TAILQ_FIRST(&sc->sc_freesrb);
716 if (srb != NULL) {
717 TAILQ_REMOVE(&sc->sc_freesrb, srb, next);
725 srb->xs = xs;
726 srb->cmdlen = xs->cmdlen;
727 memcpy(srb->cmd, xs->cmd, xs->cmdlen);
730 if ((error = bus_dmamap_load(sc->sc_dmat, srb->dmap,
742 * free SRB
744 TAILQ_INSERT_TAIL(&sc->sc_freesrb, srb, next);
748 bus_dmamap_sync(sc->sc_dmat, srb->dmap, 0,
749 srb->dmap->dm_mapsize,
754 for (i = 0; i < srb->dmap->dm_nsegs; i++) {
755 srb->sgentry[i].address =
756 htole32(srb->dmap->dm_segs[i].ds_addr);
757 srb->sgentry[i].length =
758 htole32(srb->dmap->dm_segs[i].ds_len);
760 srb->buflen = xs->datalen;
761 srb->sgcnt = srb->dmap->dm_nsegs;
763 srb->sgentry[0].address = 0;
764 srb->sgentry[0].length = 0;
765 srb->buflen = 0;
766 srb->sgcnt = 0;
769 srb->sgoffset, TRM_SG_SIZE, BUS_DMASYNC_PREWRITE);
773 srb->sgindex = 0;
774 srb->hastat = 0;
775 srb->tastat = 0;
776 srb->flag = 0;
778 TAILQ_INSERT_TAIL(&sc->sc_readysrb, srb, next);
795 trm_timeout(srb);
883 struct trm_srb *srb;
891 TAILQ_FOREACH(srb, &sc->sc_readysrb, next) {
892 periph = srb->xs->xs_periph;
899 (srb->flag & AUTO_REQSENSE) != 0 ||
900 (srb->xs->xs_control & XS_CTL_REQSENSE) != 0)
903 tag = srb->xs->xs_tag_type;
906 if (srb->xs->xs_control & XS_CTL_POLL)
923 /* try to issue this srb as an un-tagged command */
925 li->untagged = srb;
931 srb = li->untagged;
932 periph = srb->xs->xs_periph;
939 srb->tag[0] = tag;
941 li->queued[srb->xs->xs_tag_id] = srb;
942 srb->tag[1] = srb->xs->xs_tag_id;
948 TAILQ_REMOVE(&sc->sc_readysrb, srb, next);
949 sc->sc_actsrb = srb;
950 trm_select(sc, srb);
955 TAILQ_REMOVE(&sc->sc_readysrb, srb, next);
956 sc->sc_actsrb = srb;
957 trm_select(sc, srb);
966 trm_select(struct trm_softc *sc, struct trm_srb *srb)
970 struct scsipi_periph *periph = srb->xs->xs_periph;
978 if ((srb->xs->xs_control & XS_CTL_POLL) == 0) {
979 callout_reset(&srb->xs->xs_callout, mstohz(srb->xs->timeout),
980 trm_timeout, srb);
993 DPRINTF(("cmd = 0x%02x\n", srb->cmd[0]));
1003 TRM_SCSI_FIFO, srb->cmd, srb->cmdlen);
1013 if (srb->tag[0] != 0) {
1018 bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, srb->tag[0]);
1019 bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, srb->tag[1]);
1027 (srb->flag & AUTO_REQSENSE) == 0 &&
1028 (srb->xs->xs_control & XS_CTL_REQSENSE) == 0));
1037 bus_space_write_multi_1(iot, ioh, TRM_SCSI_FIFO, srb->cmd, srb->cmdlen);
1094 struct trm_srb *srb = (struct trm_srb *)arg;
1100 if (srb == NULL) {
1101 printf("trm_timeout called with srb == NULL\n");
1105 xs = srb->xs;
1119 srb->flag |= SRB_TIMEOUT;
1120 trm_done(sc, srb);
1248 struct trm_srb *srb;
1254 srb = sc->sc_actsrb;
1257 if (srb != NULL) {
1258 periph = srb->xs->xs_periph;
1322 struct trm_srb *srb;
1324 srb = sc->sc_actsrb;
1325 if (srb == NULL) {
1326 DPRINTF(("trm_command_phase1: no active srb\n"));
1331 bus_space_write_multi_1(iot, ioh, TRM_SCSI_FIFO, srb->cmd, srb->cmdlen);
1348 struct trm_srb *srb;
1358 srb = sc->sc_actsrb;
1359 if (srb == NULL) {
1360 DPRINTF(("trm_dataout_phase0: no active srb\n"));
1363 periph = srb->xs->xs_periph;
1367 srb->flag |= PARITY_ERROR;
1403 srb->buflen = 0;
1412 if (srb->buflen != leftcnt) {
1414 xferlen = srb->buflen - leftcnt;
1417 srb->buflen = leftcnt;
1422 sg = srb->sgentry + srb->sgindex;
1423 for (sgindex = srb->sgindex;
1424 sgindex < srb->sgcnt;
1445 srb->sgindex = sgindex;
1450 srb->sgoffset, TRM_SG_SIZE, BUS_DMASYNC_PREWRITE);
1461 struct trm_srb *srb;
1469 srb = sc->sc_actsrb;
1470 if (srb == NULL) {
1471 DPRINTF(("trm_datain_phase0: no active srb\n"));
1476 srb->flag |= PARITY_ERROR;
1484 srb->buflen = 0;
1494 if (srb->buflen != leftcnt) {
1498 xferlen = srb->buflen - leftcnt;
1503 srb->buflen = leftcnt;
1508 sg = srb->sgentry + srb->sgindex;
1509 for (sgindex = srb->sgindex;
1510 sgindex < srb->sgcnt;
1531 srb->sgindex = sgindex;
1536 srb->sgoffset, TRM_SG_SIZE, BUS_DMASYNC_PREWRITE);
1546 struct trm_srb *srb;
1550 srb = sc->sc_actsrb;
1551 if (srb == NULL) {
1552 DPRINTF(("trm_dataio_xfer: no active srb\n"));
1555 periph = srb->xs->xs_periph;
1558 if (srb->sgindex < srb->sgcnt) {
1559 if (srb->buflen > 0) {
1567 srb->sgaddr +
1568 srb->sgindex * sizeof(struct trm_sg_entry));
1573 (srb->sgcnt - srb->sgindex)
1578 bus_space_write_4(iot, ioh, TRM_SCSI_XCNT, srb->buflen);
1597 if (srb->sgcnt) {
1598 srb->hastat = H_OVER_UNDER_RUN;
1628 struct trm_srb *srb;
1630 srb = sc->sc_actsrb;
1631 if (srb == NULL) {
1632 DPRINTF(("trm_status_phase0: no active srb\n"));
1635 srb->tastat = bus_space_read_1(iot, ioh, TRM_SCSI_FIFO);
1684 struct trm_srb *srb;
1716 srb = sc->sc_actsrb;
1717 if (srb == NULL) {
1722 periph = srb->xs->xs_periph;
1807 srb = li->queued[tagid];
1808 if (srb != NULL) {
1809 sc->sc_actsrb = srb;
1827 srb = sc->sc_actsrb;
1828 if (srb == NULL) {
1833 periph = srb->xs->xs_periph;
2004 struct trm_srb *srb;
2009 srb = sc->sc_actsrb;
2012 if (srb == NULL) {
2013 DPRINTF(("trm_disconnect: no active srb\n"));
2044 srb->tastat = SCSI_SEL_TIMEOUT; /* XXX Ok? */
2046 periph = srb->xs->xs_periph;
2074 trm_done(sc, srb);
2164 trm_done(struct trm_softc *sc, struct trm_srb *srb)
2166 struct scsipi_xfer *xs = srb->xs;
2177 srb->flag & AUTO_REQSENSE) {
2178 bus_dmamap_sync(sc->sc_dmat, srb->dmap, 0,
2179 srb->dmap->dm_mapsize,
2181 (srb->flag & AUTO_REQSENSE)) ?
2183 bus_dmamap_unload(sc->sc_dmat, srb->dmap);
2189 xs->status = srb->tastat;
2199 if ((srb->hastat & H_OVER_UNDER_RUN) != 0) {
2202 srb->tastat = 0;
2205 } else if ((srb->flag & PARITY_ERROR) != 0) {
2209 } else if ((srb->flag & SRB_TIMEOUT) != 0) {
2210 xs->resid = srb->buflen;
2214 xs->resid = srb->buflen;
2215 srb->hastat = 0;
2216 if (srb->flag & AUTO_REQSENSE) {
2220 srb->tastat = 0;
2227 if ((srb->flag & AUTO_REQSENSE) != 0 ||
2228 trm_request_sense(sc, srb) != 0) {
2238 srb->hastat = H_SEL_TIMEOUT;
2239 srb->tastat = 0;
2255 srb->hastat = 0;
2262 trm_dequeue(sc, srb);
2263 if (srb == sc->sc_actsrb) {
2268 TAILQ_INSERT_TAIL(&sc->sc_freesrb, srb, next);
2275 trm_request_sense(struct trm_softc *sc, struct trm_srb *srb)
2281 struct scsi_request_sense *ss = (struct scsi_request_sense *)srb->cmd;
2286 xs = srb->xs;
2289 srb->flag |= AUTO_REQSENSE;
2292 srb->hastat = 0;
2293 srb->tastat = 0;
2300 srb->buflen = sizeof(struct scsi_sense_data);
2301 srb->sgcnt = 1;
2302 srb->sgindex = 0;
2303 srb->cmdlen = sizeof(struct scsi_request_sense);
2305 if ((error = bus_dmamap_load(sc->sc_dmat, srb->dmap,
2306 &xs->sense.scsi_sense, srb->buflen, NULL,
2310 bus_dmamap_sync(sc->sc_dmat, srb->dmap, 0,
2311 srb->buflen, BUS_DMASYNC_PREREAD);
2313 srb->sgentry[0].address = htole32(srb->dmap->dm_segs[0].ds_addr);
2314 srb->sgentry[0].length = htole32(sizeof(struct scsi_sense_data));
2315 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, srb->sgoffset,
2322 trm_dequeue(sc, srb);
2323 li->untagged = srb; /* must be executed first to fix C/A */
2326 if (srb == sc->sc_actsrb)
2327 trm_select(sc, srb);
2329 TAILQ_INSERT_HEAD(&sc->sc_readysrb, srb, next);
2337 trm_dequeue(struct trm_softc *sc, struct trm_srb *srb)
2343 periph = srb->xs->xs_periph;
2347 if (li->untagged == srb) {
2351 if (srb->tag[0] != 0 && li->queued[srb->tag[1]] != NULL) {
2352 li->queued[srb->tag[1]] = NULL;