Home | History | Annotate | Download | only in ic

Lines Matching defs:scb

237  * iha_append_free_scb - append the supplied SCB to the tail of the
242 iha_append_free_scb(struct iha_softc *sc, struct iha_scb *scb)
248 if (scb == sc->sc_actscb)
251 scb->status = STATUS_QUEUED;
252 scb->ha_stat = HOST_OK;
253 scb->ta_stat = SCSI_OK;
255 scb->nextstat = 0;
256 scb->scb_tagmsg = 0;
258 scb->xs = NULL;
259 scb->tcs = NULL;
267 TAILQ_INSERT_TAIL(&sc->sc_freescb, scb, chain);
273 iha_append_done_scb(struct iha_softc *sc, struct iha_scb *scb, uint8_t hastat)
280 if (scb->xs != NULL)
281 callout_stop(&scb->xs->xs_callout);
283 if (scb == sc->sc_actscb)
286 tcs = scb->tcs;
288 if (scb->scb_tagmsg != 0) {
291 } else if (tcs->ntagscb == scb)
294 scb->status = STATUS_QUEUED;
295 scb->ha_stat = hastat;
297 TAILQ_INSERT_TAIL(&sc->sc_donescb, scb, chain);
305 struct iha_scb *scb;
310 scb = TAILQ_FIRST(&sc->sc_donescb);
312 if (scb != NULL) {
313 scb->status = STATUS_RENT;
314 TAILQ_REMOVE(&sc->sc_donescb, scb, chain);
319 return (scb);
323 * iha_find_pend_scb - scan the pending queue for a SCB that can be
325 * and a pointer to the SCB if one is found. If there
326 * is an active SCB, return NULL!
331 struct iha_scb *scb;
338 scb = NULL;
341 TAILQ_FOREACH(scb, &sc->sc_pendscb, chain) {
342 if ((scb->xs->xs_control & XS_CTL_RESET) != 0)
346 tcs = scb->tcs;
348 if ((scb->scb_tagmsg) != 0) {
357 } else if (scb->cmd[0] == SCSI_REQUEST_SENSE) {
379 return (scb);
383 iha_append_pend_scb(struct iha_softc *sc, struct iha_scb *scb)
387 if (scb == sc->sc_actscb)
390 scb->status = STATUS_QUEUED;
392 TAILQ_INSERT_TAIL(&sc->sc_pendscb, scb, chain);
396 iha_push_pend_scb(struct iha_softc *sc, struct iha_scb *scb)
402 if (scb == sc->sc_actscb)
405 scb->status = STATUS_QUEUED;
407 TAILQ_INSERT_HEAD(&sc->sc_pendscb, scb, chain);
413 * iha_del_pend_scb - remove scb from sc_pendscb
416 iha_del_pend_scb(struct iha_softc *sc, struct iha_scb *scb)
422 TAILQ_REMOVE(&sc->sc_pendscb, scb, chain);
428 iha_mark_busy_scb(struct iha_scb *scb)
434 scb->status = STATUS_BUSY;
436 if (scb->scb_tagmsg == 0)
437 scb->tcs->ntagscb = scb;
439 scb->tcs->tagcnt++;
500 struct iha_scb *scb;
528 for (i = 0, scb = sc->sc_scb; i < IHA_MAX_SCB; i++, scb++) {
529 scb->scb_tagid = i;
530 scb->sgoffset = IHA_SG_SIZE * i;
531 scb->sglist = sc->sc_sglist + IHA_MAX_SG_ENTRIES * i;
532 scb->sg_addr =
533 sc->sc_dmamap->dm_segs[0].ds_addr + scb->sgoffset;
537 BUS_DMA_NOWAIT, &scb->dmap);
541 "couldn't create SCB DMA map, error = %d\n",
545 TAILQ_INSERT_TAIL(&sc->sc_freescb, scb, chain);
622 * iha_alloc_sglist - allocate and map sglist for SCB's
631 * Allocate DMA-safe memory for the SCB's sglist
674 struct iha_scb *scb;
686 if (xs->cmdlen > sizeof(scb->cmd) ||
694 scb = TAILQ_FIRST(&sc->sc_freescb);
695 if (scb != NULL) {
696 scb->status = STATUS_RENT;
697 TAILQ_REMOVE(&sc->sc_freescb, scb, chain);
700 printf("unable to allocate scb\n");
711 scb->target = periph->periph_target;
712 scb->lun = periph->periph_lun;
713 scb->tcs = &sc->sc_tcs[scb->target];
714 scb->scb_id = MSG_IDENTIFY(periph->periph_lun,
717 scb->xs = xs;
718 scb->cmdlen = xs->cmdlen;
719 memcpy(&scb->cmd, xs->cmd, xs->cmdlen);
720 scb->buflen = xs->datalen;
721 scb->flags = 0;
723 scb->flags |= FLAG_DATAOUT;
725 scb->flags |= FLAG_DATAIN;
727 if (scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) {
728 error = bus_dmamap_load(sc->sc_dmat, scb->dmap,
729 xs->data, scb->buflen, NULL,
733 ((scb->flags & FLAG_DATAIN) ?
739 iha_append_free_scb(sc, scb);
744 bus_dmamap_sync(sc->sc_dmat, scb->dmap,
745 0, scb->dmap->dm_mapsize,
746 (scb->flags & FLAG_DATAIN) ?
750 iha_exec_scb(sc, scb);
810 struct iha_scb *scb;
818 for (i = 0, scb = sc->sc_scb; i < IHA_MAX_SCB; i++, scb++)
819 switch (scb->status) {
821 iha_append_done_scb(sc, scb, HOST_SCSI_RST);
825 iha_push_pend_scb(sc, scb);
898 * iha_main - process the active SCB, taking one off pending and making it
899 * active if necessary, and any done SCB's created as
901 * SCB's that can be started.
908 struct iha_scb *scb;
913 while ((scb = iha_pop_done_scb(sc)) != NULL)
914 iha_done_scb(sc, scb);
930 * start another SCB currently in the pending queue.
937 struct iha_scb *scb;
977 * see if it is possible to start the selection phase on a pending SCB
979 if ((scb = iha_find_pend_scb(sc)) == NULL)
982 tcs = scb->tcs;
985 bus_space_write_1(iot, ioh, TUL_SID, (sc->sc_id << 4) | scb->target);
987 if ((scb->xs->xs_control & XS_CTL_RESET) == 0) {
992 iha_select(sc, scb, SELATNSTOP);
994 else if (scb->scb_tagmsg != 0)
995 iha_select(sc, scb, SEL_ATN3);
998 iha_select(sc, scb, SEL_ATN);
1001 iha_select(sc, scb, SELATNSTOP);
1002 scb->nextstat = 8;
1005 if ((scb->xs->xs_control & XS_CTL_POLL) != 0) {
1007 for (timeout = scb->xs->timeout; timeout > 0; timeout--) {
1017 * function returns, scb is on the done queue, not
1023 iha_timeout(scb);
1028 iha_select(struct iha_softc *sc, struct iha_scb *scb, uint8_t select_type)
1035 bus_space_write_1(iot, ioh, TUL_SFIFO, scb->scb_id);
1037 scb->cmd, scb->cmdlen);
1039 scb->nextstat = 2;
1043 scb->nextstat = 1;
1047 bus_space_write_1(iot, ioh, TUL_SFIFO, scb->scb_id);
1048 bus_space_write_1(iot, ioh, TUL_SFIFO, scb->scb_tagmsg);
1049 bus_space_write_1(iot, ioh, TUL_SFIFO, scb->scb_tagid);
1051 bus_space_write_multi_1(iot, ioh, TUL_SFIFO, scb->cmd,
1052 scb->cmdlen);
1054 scb->nextstat = 2;
1063 iha_del_pend_scb(sc, scb);
1064 scb->status = STATUS_SELECT;
1066 sc->sc_actscb = scb;
1142 iha_exec_scb(struct iha_softc *sc, struct iha_scb *scb)
1147 struct scsipi_xfer *xs = scb->xs;
1150 dm = scb->dmap;
1154 struct iha_sg_element *sg = scb->sglist;
1162 scb->sgoffset, IHA_SG_SIZE,
1165 scb->flags |= FLAG_SG;
1166 scb->sg_size = scb->sg_max = nseg;
1167 scb->sg_index = 0;
1169 scb->bufaddr = scb->sg_addr;
1171 scb->bufaddr = dm->dm_segs[0].ds_addr;
1177 callout_reset(&xs->xs_callout, timeout, iha_timeout, scb);
1182 if (((scb->xs->xs_control & XS_RESET) != 0) ||
1183 (scb->cmd[0] == SCSI_REQUEST_SENSE))
1184 iha_push_pend_scb(sc, scb); /* Insert SCB at head of Pend */
1186 iha_append_pend_scb(sc, scb); /* Append SCB to tail of Pend */
1190 * only this new SCB.
1211 * iha_done_scb - We have a scb which has been processed by the
1215 iha_done_scb(struct iha_softc *sc, struct iha_scb *scb)
1217 struct scsipi_xfer *xs = scb->xs;
1223 if (scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) {
1224 bus_dmamap_sync(sc->sc_dmat, scb->dmap,
1225 0, scb->dmap->dm_mapsize,
1226 (scb->flags & FLAG_DATAIN) ?
1228 bus_dmamap_unload(sc->sc_dmat, scb->dmap);
1231 xs->status = scb->ta_stat;
1233 switch (scb->ha_stat) {
1235 switch (scb->ta_stat) {
1240 xs->resid = scb->buflen;
1242 if ((scb->flags & FLAG_RSENS) != 0)
1255 scb->tcs->flags &=
1258 if ((scb->flags & FLAG_RSENS) != 0 ||
1259 iha_push_sense_request(sc, scb) != 0) {
1260 scb->flags &= ~FLAG_RSENS;
1305 iha_append_free_scb(sc, scb);
1310 * SCB needing it back onto the pending
1314 iha_push_sense_request(struct iha_softc *sc, struct iha_scb *scb)
1316 struct scsipi_xfer *xs = scb->xs;
1318 struct scsi_request_sense *ss = (struct scsi_request_sense *)scb->cmd;
1327 scb->flags = FLAG_RSENS | FLAG_DATAIN;
1329 scb->scb_id &= ~MSG_IDENTIFY_DISCFLAG;
1331 scb->scb_tagmsg = 0;
1332 scb->ta_stat = SCSI_OK;
1334 scb->cmdlen = sizeof(struct scsi_request_sense);
1335 scb->buflen = ss->length;
1337 err = bus_dmamap_load(sc->sc_dmat, scb->dmap,
1338 &xs->sense.scsi_sense, scb->buflen, NULL,
1345 bus_dmamap_sync(sc->sc_dmat, scb->dmap,
1346 0, scb->buflen, BUS_DMASYNC_PREREAD);
1349 iha_exec_scb(sc, scb);
1357 struct iha_scb *scb = (struct iha_scb *)arg;
1358 struct scsipi_xfer *xs = scb->xs;
1377 * iha_abort_xs - find the SCB associated with the supplied xs and
1384 struct iha_scb *scb;
1389 /* Check the pending queue for the SCB pointing to xs */
1391 TAILQ_FOREACH(scb, &sc->sc_pendscb, chain)
1392 if (scb->xs == xs) {
1393 iha_del_pend_scb(sc, scb);
1394 iha_append_done_scb(sc, scb, hastat);
1400 * If that didn't work, check all BUSY/SELECTING SCB's for one
1404 for (i = 0, scb = sc->sc_scb; i < IHA_MAX_SCB; i++, scb++)
1405 switch (scb->status) {
1408 if (scb->xs == xs) {
1409 iha_append_done_scb(sc, scb, hastat);
1432 iha_data_over_run(struct iha_scb *scb)
1434 switch (scb->cmd[0]) {
1480 * iha_next_state - process the current SCB as requested in its
1568 struct iha_scb *scb = sc->sc_actscb;
1572 iha_mark_busy_scb(scb);
1574 tcs = scb->tcs;
1591 bus_space_write_1(iot, ioh, TUL_SFIFO, scb->scb_id);
1593 if (scb->scb_tagmsg != 0) {
1595 scb->scb_tagmsg);
1597 scb->scb_tagid);
1628 struct iha_scb *scb = sc->sc_actscb;
1630 iha_mark_busy_scb(scb);
1632 bus_space_write_1(iot, ioh, TUL_SCONFIG0, scb->tcs->sconfig0);
1654 struct iha_scb *scb = sc->sc_actscb;
1661 scb->cmd, scb->cmdlen);
1671 scb->nextstat = 3;
1682 flags = scb->tcs->flags;
1703 * processing the current SCB.
1708 struct iha_scb *scb = sc->sc_actscb;
1710 if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) ==
1715 if (scb->buflen == 0)
1720 if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) != 0)
1721 scb->ha_stat = iha_data_over_run(scb);
1727 scb->nextstat = 4;
1734 scb->buflen = 0;
1735 scb->ha_stat = HOST_SPERR;
1747 return (iha_xfer_data(sc, scb, FLAG_DATAIN));
1750 return (iha_xfer_data(sc, scb, FLAG_DATAOUT));
1763 * If not go to state 6 and finish the SCB.
1770 struct iha_scb *scb = sc->sc_actscb;
1786 scb->ha_stat = HOST_SPERR;
1798 period = scb->tcs->syncm;
1824 scb->buflen = 0;
1830 xcnt = scb->buflen - cnt; /* xcnt == bytes xferred */
1831 scb->buflen = cnt; /* cnt == bytes left */
1833 if ((scb->flags & FLAG_SG) != 0) {
1834 sg = &scb->sglist[scb->sg_index];
1835 for (i = scb->sg_index; i < scb->sg_max; sg++, i++) {
1845 scb->sgoffset, IHA_SG_SIZE,
1848 scb->bufaddr += (i - scb->sg_index) *
1850 scb->sg_size = scb->sg_max - i;
1851 scb->sg_index = i;
1859 scb->bufaddr += xcnt;
1865 * iha_state_6 - finish off the active scb (may require several
1916 struct iha_scb *scb;
1923 scb = sc->sc_actscb;
1925 /* This SCB finished correctly -- resetting the device */
1926 iha_append_done_scb(sc, scb, HOST_OK);
1928 iha_reset_tcs(scb->tcs, sc->sc_sconf1);
1930 tar = scb->target;
1931 for (i = 0, scb = sc->sc_scb; i < IHA_MAX_SCB; i++, scb++)
1932 if (scb->target == tar)
1933 switch (scb->status) {
1936 scb, HOST_DEV_RST);
1940 iha_push_pend_scb(sc, scb);
1961 iha_xfer_data(struct iha_softc *sc, struct iha_scb *scb, int direction)
1968 if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) != direction)
1971 bus_space_write_4(iot, ioh, TUL_STCNT0, scb->buflen);
1977 if (scb->flags & FLAG_SG) {
1978 xferlen = scb->sg_size * sizeof(struct iha_sg_element);
1981 xferlen = scb->buflen;
1984 bus_space_write_4(iot, ioh, TUL_DXPA, scb
1990 scb->nextstat = 5;
2000 struct iha_scb *scb = sc->sc_actscb;
2002 if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) != 0)
2003 scb->ha_stat = HOST_DO_DU;
2006 if ((scb->tcs->syncm & PERIOD_WIDE_SCSI) != 0)
2031 struct iha_scb *scb = sc->sc_actscb;
2033 if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) != 0)
2034 scb->ha_stat = HOST_DO_DU;
2037 if ((scb->tcs->syncm & PERIOD_WIDE_SCSI) != 0)
2065 struct iha_scb *scb;
2072 scb = sc->sc_actscb;
2074 scb->ta_stat = bus_space_read_1(iot, ioh, TUL_SFIFO);
2102 if ((scb->ta_stat &
2114 if ((scb->ta_stat &
2128 * SCB to sc_donescb list. Return an appropriate host status
2136 struct iha_scb *scb;
2142 scb = sc->sc_actscb;
2144 if (scb != NULL) {
2145 if (scb->status == STATUS_SELECT)
2147 iha_append_done_scb(sc, scb, HOST_SEL_TOUT);
2150 iha_append_done_scb(sc, scb, HOST_BAD_PHAS);
2162 struct iha_scb *scb;
2184 scb = tcs->ntagscb;
2190 * the appropriate scb by indexing sc_scb with
2224 scb = &sc->sc_scb[tag];
2229 if ((scb->target != target)
2230 || (scb->lun != lun)
2231 || (scb->status != STATUS_BUSY)) {
2237 sc->sc_actscb = scb;
2615 struct iha_scb *scb = sc->sc_actscb;
2617 if (scb != NULL)
2618 iha_append_done_scb(sc, scb, HOST_BAD_PHAS);