Lines Matching defs:ecb
447 struct ncr53c9x_ecb *ecb;
454 ecb = sc->sc_nexus;
455 if (ecb != NULL) {
456 ecb->xs->error = result;
457 ncr53c9x_done(sc, ecb);
462 ecb = li->untagged;
463 if (ecb != NULL) {
472 ecb->xs->error = result;
473 ncr53c9x_done(sc, ecb);
476 ecb = li->queued[i];
477 if (ecb != NULL) {
479 ecb->xs->error = result;
480 ncr53c9x_done(sc, ecb);
670 ncr53c9x_select(struct ncr53c9x_softc *sc, struct ncr53c9x_ecb *ecb)
672 struct scsipi_periph *periph = ecb->xs->xs_periph;
683 target, lun, ecb->cmd.cmd.opcode, ecb->tag[0], ecb->tag[1]));
691 if ((ecb->xs->xs_control & XS_CTL_POLL) == 0) {
692 callout_reset(&ecb->xs->xs_callout, mstohz(ecb->timeout),
693 ncr53c9x_timeout, ecb);
708 if ((ecb->flags & ECB_SENSE) != 0) {
716 dmasize = clen = ecb->clen;
718 sc->sc_cmdp = (void *)&ecb->cmd.cmd;
732 ncr53c9x_wrfifo(sc, (uint8_t *)&ecb->cmd.cmd,
733 ecb->clen);
741 if (ecb->tag[0] != 0) {
756 cmd = (uint8_t *)&ecb->cmd.cmd;
760 clen = ecb->clen + 3;
763 cmd[1] = ecb->tag[0]; /* msg[1] */
764 cmd[2] = ecb->tag[1]; /* msg[2] */
767 clen = ecb->clen + 1;
821 ncr53c9x_free_ecb(struct ncr53c9x_softc *sc, struct ncr53c9x_ecb *ecb)
826 ecb->flags = 0;
827 pool_put(&ecb_pool, (void *)ecb);
835 struct ncr53c9x_ecb *ecb;
839 ecb = pool_get(&ecb_pool, PR_NOWAIT | PR_ZERO);
840 if (ecb)
841 ecb->flags |= ECB_ALLOC;
843 return ecb;
863 struct ncr53c9x_ecb *ecb;
880 /* Get an ECB to use. */
881 ecb = ncr53c9x_get_ecb(sc, xs->xs_control);
887 if (ecb == NULL) {
889 printf("%s: unable to allocate ecb\n",
897 /* Initialize ecb */
898 ecb->xs = xs;
899 ecb->timeout = xs->timeout;
902 ecb->flags |= ECB_RESET;
903 ecb->clen = 0;
904 ecb->dleft = 0;
906 memcpy(&ecb->cmd.cmd, xs->cmd, xs->cmdlen);
907 ecb->clen = xs->cmdlen;
908 ecb->daddr = xs->data;
909 ecb->dleft = xs->datalen;
911 ecb->stat = 0;
913 TAILQ_INSERT_TAIL(&sc->ready_list, ecb, chain);
914 ecb->flags |= ECB_READY;
922 if (ncr53c9x_poll(sc, xs, ecb->timeout)) {
923 ncr53c9x_timeout(ecb);
924 if (ncr53c9x_poll(sc, xs, ecb->timeout))
925 ncr53c9x_timeout(ecb);
1070 struct ncr53c9x_ecb *ecb;
1082 * Find first ecb in ready queue that is for a target/lunit
1085 for (ecb = TAILQ_FIRST(&sc->ready_list); ecb != NULL;
1086 ecb = TAILQ_NEXT(ecb, chain)) {
1087 periph = ecb->xs->xs_periph;
1096 else if ((ecb->flags & ECB_SENSE) != 0)
1099 tag = ecb->xs->xs_tag_type;
1102 if (ecb->xs->xs_control & XS_CTL_POLL)
1123 li->untagged = ecb;
1129 ecb = li->untagged;
1130 periph = ecb->xs->xs_periph;
1136 ecb->tag[0] = tag;
1138 li->queued[ecb->xs->xs_tag_id] = ecb;
1139 ecb->tag[1] = ecb->xs->xs_tag_id;
1144 TAILQ_REMOVE(&sc->ready_list, ecb, chain);
1145 ecb->flags &= ~ECB_READY;
1146 sc->sc_nexus = ecb;
1147 ncr53c9x_select(sc, ecb);
1151 TAILQ_REMOVE(&sc->ready_list, ecb, chain);
1152 ecb->flags &= ~ECB_READY;
1153 sc->sc_nexus = ecb;
1154 ncr53c9x_select(sc, ecb);
1165 ncr53c9x_sense(struct ncr53c9x_softc *sc, struct ncr53c9x_ecb *ecb)
1167 struct scsipi_xfer *xs = ecb->xs;
1170 struct scsi_request_sense *ss = (void *)&ecb->cmd.cmd;
1180 ecb->clen = sizeof(*ss);
1181 ecb->daddr = (uint8_t *)&xs->sense.scsi_sense;
1182 ecb->dleft = sizeof(struct scsi_sense_data);
1183 ecb->flags |= ECB_SENSE;
1184 ecb->timeout = NCR_SENSE_TIMEOUT;
1189 ncr53c9x_dequeue(sc, ecb);
1190 li->untagged = ecb; /* must be executed first to fix C/A */
1192 if (ecb == sc->sc_nexus) {
1193 ncr53c9x_select(sc, ecb);
1195 TAILQ_INSERT_HEAD(&sc->ready_list, ecb, chain);
1196 ecb->flags |= ECB_READY;
1206 ncr53c9x_done(struct ncr53c9x_softc *sc, struct ncr53c9x_ecb *ecb)
1208 struct scsipi_xfer *xs = ecb->xs;
1228 xs->status = ecb->stat;
1229 if ((ecb->flags & ECB_ABORT) != 0) {
1231 } else if ((ecb->flags & ECB_SENSE) != 0) {
1233 } else if ((ecb->stat & ST_MASK) == SCSI_CHECK) {
1235 xs->resid = ecb->dleft;
1236 ncr53c9x_sense(sc, ecb);
1239 xs->resid = ecb->dleft;
1258 * Remove the ECB from whatever queue it's on.
1260 ncr53c9x_dequeue(sc, ecb);
1261 if (ecb == sc->sc_nexus) {
1279 ncr53c9x_free_ecb(sc, ecb);
1287 ncr53c9x_dequeue(struct ncr53c9x_softc *sc, struct ncr53c9x_ecb *ecb)
1290 &sc->sc_tinfo[ecb->xs->xs_periph->periph_target];
1292 int64_t lun = ecb->xs->xs_periph->periph_lun;
1297 panic("%s: lun %" PRIx64 " for ecb %p does not exist",
1298 __func__, lun, ecb);
1300 if (li->untagged == ecb) {
1304 if (ecb->tag[0] && li->queued[ecb->tag[1]] != NULL) {
1306 if (li->queued[ecb->tag[1]] != NULL &&
1307 (li->queued[ecb->tag[1]] != ecb))
1309 "instead of ecb %p\n", __func__, ecb->tag[1],
1311 li->queued[ecb->tag[1]], ecb);
1313 li->queued[ecb->tag[1]] = NULL;
1317 if ((ecb->flags & ECB_READY) != 0) {
1318 ecb->flags &= ~ECB_READY;
1319 TAILQ_REMOVE(&sc->ready_list, ecb, chain);
1446 struct ncr53c9x_ecb *ecb = NULL;
1488 ecb = li->untagged;
1494 ecb = li->queued[tagid];
1496 if (ecb == NULL) {
1505 sc->sc_nexus = ecb;
1508 if (ecb->flags & ECB_RESET)
1510 else if (ecb->flags & ECB_ABORT)
1514 sc->sc_dp = ecb->daddr;
1515 sc->sc_dleft = ecb->dleft;
1628 struct ncr53c9x_ecb *ecb;
1634 ecb = sc->sc_nexus;
1635 ti = &sc->sc_tinfo[ecb->xs->xs_periph->periph_target];
1641 scsipi_printaddr(ecb->xs->xs_periph);
1647 ecb->dleft = (ecb->flags & ECB_TENTATIVE_DONE) ?
1649 if ((ecb->flags & ECB_SENSE) == 0)
1650 ecb->xs->resid = ecb->dleft;
1662 * - Dequeue ecb from the queued array.
1667 ecb->xs->xs_periph->periph_target);
1673 lun = ecb->xs->xs_periph->periph_lun;
1675 if (ecb->tag[0] &&
1676 li->queued[ecb->tag[1]] != NULL) {
1677 li->queued[ecb->tag[1]] = NULL;
1680 ecb->tag[0] = ecb->tag[1] = 0;
1681 li->untagged = ecb;
1689 ecb->xs->xs_periph->periph_target);
1695 ecb->xs->xs_periph->periph_target);
1702 ecb->xs->xs_periph->periph_target);
1735 ecb->flags |= ECB_TENTATIVE_DONE;
1741 ecb->daddr = sc->sc_dp;
1742 ecb->dleft = sc->sc_dleft;
1747 sc->sc_dp = ecb->daddr;
1748 sc->sc_dleft = ecb->dleft;
1767 scsipi_printaddr(ecb->xs->xs_periph);
1804 ecb->xs->xs_periph->periph_target);
1827 scsipi_printaddr(ecb->xs->xs_periph);
1840 scsipi_printaddr(ecb->xs->xs_periph);
1912 struct ncr53c9x_ecb *ecb;
1953 ecb = sc->sc_nexus;
1954 ti = &sc->sc_tinfo[ecb->xs->xs_periph->periph_target];
1967 ecb = sc->sc_nexus;
1968 ti = &sc->sc_tinfo[ecb->xs->xs_periph->periph_target];
1980 ecb = sc->sc_nexus;
1982 MSG_IDENTIFY(ecb->xs->xs_periph->periph_lun, 0);
1989 ecb = sc->sc_nexus;
1990 sc->sc_omess[0] = ecb->tag[0];
1991 sc->sc_omess[1] = ecb->tag[1];
1997 ecb = sc->sc_nexus;
1998 ti = &sc->sc_tinfo[ecb->xs->xs_periph->periph_target];
2001 ecb->xs->xs_periph->periph_target);
2085 struct ncr53c9x_ecb *ecb;
2143 ecb = sc->sc_nexus;
2157 ecb->xs->error = XS_TIMEOUT;
2158 ncr53c9x_done(sc, ecb);
2256 ecb ? ecb->dleft : -1);
2296 ecb->xs->error = XS_SELTIMEOUT;
2299 periph = ecb->xs->xs_periph;
2321 if (ecb != NULL)
2322 scsipi_printaddr(ecb->xs->xs_periph);
2326 ecb->xs->xs_periph->periph_target];
2348 if ((ecb->flags & ECB_SENSE) != 0) {
2353 callout_stop(&ecb->xs->xs_callout);
2354 ncr53c9x_sense(sc, ecb);
2358 ecb->xs->error = XS_TIMEOUT;
2388 ecb = sc->sc_nexus;
2408 ecb = sc->sc_nexus;
2419 callout_stop(&ecb->xs->xs_callout);
2420 ncr53c9x_dequeue(sc, ecb);
2421 TAILQ_INSERT_HEAD(&sc->ready_list, ecb, chain);
2422 ecb->flags |= ECB_READY;
2423 ecb = sc->sc_nexus = NULL;
2505 ecb = sc->sc_nexus;
2506 if (ecb == NULL)
2509 periph = ecb->xs->xs_periph;
2527 ecb->tag[0] == 0) {
2546 if (ecb->tag[0])
2612 sc->sc_dp = ecb->daddr;
2613 sc->sc_dleft = ecb->dleft;
2654 ecb->stat = sc->sc_imess[sc->sc_imlen - 2];
2656 NCR_PHASE(("<stat:(%x,%x)>", ecb->stat, msg));
2658 ecb->dleft = (ecb->flags & ECB_TENTATIVE_DONE)
2660 if ((ecb->flags & ECB_SENSE) == 0)
2661 ecb->xs->resid = ecb->dleft;
2683 if (sc->sc_state != NCR_CONNECTED || ecb == NULL) {
2736 ecb->cmd.cmd.opcode, ecb->clen));
2745 size = ecb->clen;
2747 sc->sc_cmdp = (void *)&ecb->cmd.cmd;
2760 ncr53c9x_wrfifo(sc, (uint8_t *)&ecb->cmd.cmd,
2761 ecb->clen);
2785 ecb->flags &= ~ECB_TENTATIVE_DONE;
2830 ncr53c9x_done(sc, ecb);
2867 ncr53c9x_abort(struct ncr53c9x_softc *sc, struct ncr53c9x_ecb *ecb)
2871 ecb->timeout = NCR_ABORT_TIMEOUT;
2872 ecb->flags |= ECB_ABORT;
2874 if (ecb == sc->sc_nexus) {
2885 callout_reset(&ecb->xs->xs_callout, mstohz(ecb->timeout),
2886 ncr53c9x_timeout, ecb);
2901 struct ncr53c9x_ecb *ecb = arg;
2902 struct scsipi_xfer *xs = ecb->xs;
2911 printf("%s: timed out [ecb %p (flags 0x%x, dleft %x, stat %x)], "
2915 ecb, ecb->flags, ecb->dleft, ecb->stat,
2922 printf("TRACE: %s.", ecb->trace);
2927 if (ecb->flags & ECB_ABORT) {
2936 ncr53c9x_abort(sc, ecb);
2939 if (ecb == sc->sc_nexus &&