Lines Matching refs:xs

69     "struct scsipi_xfer *"/*xs*/, "uint8_t"/*tag*/, "uint8_t"/*type*/);
71 "struct scsipi_xfer *"/*xs*/, "uint8_t"/*tag*/, "uint8_t"/*type*/);
86 "struct scsipi_xfer *"/*xs*/);
90 SDT_PROBE_DEFINE1(scsi, base, xfer, execute, "struct scsipi_xfer *"/*xs*/);
91 SDT_PROBE_DEFINE1(scsi, base, xfer, enqueue, "struct scsipi_xfer *"/*xs*/);
92 SDT_PROBE_DEFINE1(scsi, base, xfer, done, "struct scsipi_xfer *"/*xs*/);
93 SDT_PROBE_DEFINE1(scsi, base, xfer, redone, "struct scsipi_xfer *"/*xs*/);
94 SDT_PROBE_DEFINE1(scsi, base, xfer, complete, "struct scsipi_xfer *"/*xs*/);
95 SDT_PROBE_DEFINE1(scsi, base, xfer, restart, "struct scsipi_xfer *"/*xs*/);
96 SDT_PROBE_DEFINE1(scsi, base, xfer, free, "struct scsipi_xfer *"/*xs*/);
120 static void scsipi_update_timeouts(struct scsipi_xfer *xs);
377 scsipi_get_tag(struct scsipi_xfer *xs)
379 struct scsipi_periph *periph = xs->xs_periph;
410 xs->xs_tag_id = tag;
412 xs, xs->xs_tag_id, xs->xs_tag_type);
423 scsipi_put_tag(struct scsipi_xfer *xs)
425 struct scsipi_periph *periph = xs->xs_periph;
431 xs, xs->xs_tag_id, xs->xs_tag_type);
433 word = xs->xs_tag_id >> 5;
434 bit = xs->xs_tag_id & 0x1f;
453 struct scsipi_xfer *xs;
528 xs = pool_get(&scsipi_xfer_pool,
530 if (xs == NULL) {
547 if (xs != NULL) {
548 memset(xs, 0, sizeof(*xs));
549 callout_init(&xs->xs_callout, 0);
550 xs->xs_periph = periph;
551 xs->xs_control = flags;
552 xs->xs_status = 0;
555 TAILQ_INSERT_TAIL(&periph->periph_xferq, xs, device_q);
560 return xs;
574 scsipi_put_xs(struct scsipi_xfer *xs)
576 struct scsipi_periph *periph = xs->xs_periph;
577 int flags = xs->xs_control;
579 SDT_PROBE1(scsi, base, xfer, free, xs);
583 TAILQ_REMOVE(&periph->periph_xferq, xs, device_q);
584 callout_destroy(&xs->xs_callout);
585 pool_put(&scsipi_xfer_pool, xs);
880 scsipi_interpret_sense(struct scsipi_xfer *xs)
883 struct scsipi_periph *periph = xs->xs_periph;
898 sense = &xs->sense.scsi_sense;
936 error = (*periph->periph_switch->psw_error)(xs);
952 if ((xs->xs_control & XS_CTL_IGNORE_NOT_READY) != 0)
957 if ((xs->xs_control &
983 if (xs->resid == xs->datalen && xs->datalen) {
987 xs->resid = 0; /* not short read */
997 if ((xs->xs_control & XS_CTL_IGNORE_NOT_READY) != 0)
1001 if (xs->xs_control & XS_CTL_SILENT_NODEV)
1005 if ((xs->xs_control & XS_CTL_SILENT) != 0)
1009 if ((xs->xs_control &
1016 if ((xs->xs_control & XS_CTL_DISCOVERY) != 0 &&
1020 if ((xs->xs_control & XS_CTL_SILENT) != 0)
1032 if ((xs->xs_control &
1039 if ((xs->xs_control & XS_CTL_SILENT) != 0)
1050 if (xs->xs_retries != 0) {
1051 xs->xs_retries--;
1060 if (xs->xs_retries != 0) {
1061 xs->xs_retries--;
1073 ((xs->xs_control & XS_CTL_SILENT) != 0) ||
1074 (scsipi_print_sense(xs, 0) != 0))
1092 if (xs->xs_retries)
1095 xs->cmd->opcode, info);
1121 if (xs->cmd == &xs->cmdstore) {
1123 uc, xs->cmdstore.opcode);
1541 scsipi_update_timeouts(struct scsipi_xfer *xs)
1548 if (xs->timeout <= 0) {
1552 opcs = xs->xs_periph->periph_opcs;
1558 cmd = xs->cmd->opcode;
1564 if (timeout > xs->timeout && timeout < 86400000) {
1572 SC_DEBUG(xs->xs_periph, SCSIPI_DB3,
1575 cmd, xs->timeout, timeout));
1579 xs->timeout = timeout;
1605 scsipi_done(struct scsipi_xfer *xs)
1607 struct scsipi_periph *periph = xs->xs_periph;
1614 show_scsipi_cmd(xs);
1618 SDT_PROBE1(scsi, base, xfer, done, xs);
1622 if (xs->xs_status & XS_STS_DONE) {
1624 * being detached, a xs that has already been
1626 * again by scsibusdetach(). Putting the xs on the
1633 SDT_PROBE1(scsi, base, xfer, redone, xs);
1638 xs->xs_periph->periph_sent--;
1643 if (XS_CTL_TAGTYPE(xs) != 0)
1644 scsipi_put_tag(xs);
1649 xs->xs_status |= XS_STS_DONE;
1652 if ((xs->xs_control & (XS_CTL_ASYNC|XS_CTL_POLL)) ==
1663 if (xs->error != XS_NOERROR)
1665 if (xs->xs_control & XS_CTL_FREEZE_PERIPH)
1674 if (xs->error == XS_BUSY && xs->status == SCSI_CHECK) {
1676 periph->periph_xscheck = xs;
1684 if ((xs->xs_control & XS_CTL_ASYNC) == 0) {
1693 if (xs->xs_control & XS_CTL_POLL) {
1697 cv_broadcast(xs_cv(xs));
1707 if (xs->error == XS_NOERROR) {
1709 (void) scsipi_complete(xs);
1717 TAILQ_INSERT_TAIL(&chan->chan_complete, xs, channel_q);
1738 * xs->error == XS_NOERROR
1739 * XS_CTL_ASYNC is set in xs->xs_control
1753 * - If XS_CTL_ASYNC is set, `xs' has been freed back to
1759 scsipi_complete(struct scsipi_xfer *xs)
1761 struct scsipi_periph *periph = xs->xs_periph;
1765 SDT_PROBE1(scsi, base, xfer, complete, xs);
1768 if ((xs->xs_control & XS_CTL_ASYNC) != 0 && xs->bp == NULL)
1779 if (xs->error == XS_BUSY && xs->status == SCSI_CHECK) {
1781 if (xs->xs_control & XS_CTL_REQSENSE) {
1785 /* we've been frozen because xs->error != XS_NOERROR */
1788 if (xs->resid < xs->datalen) {
1790 xs->datalen - xs->resid);
1791 scsipi_print_sense_data((void *)xs->data, 0);
1796 scsipi_request_sense(xs);
1804 if ((xs->xs_control & XS_CTL_USERCMD) != 0) {
1807 if (xs->error != XS_NOERROR)
1810 scsipi_user_done(xs);
1815 switch (xs->error) {
1822 error = (*chan->chan_bustype->bustype_interpret_sense)(xs);
1834 if (xs->error == XS_BUSY && xs->status == SCSI_QUEUE_FULL) {
1863 } else if (xs->xs_retries != 0) {
1864 xs->xs_retries--;
1869 if ((xs->xs_control & XS_CTL_POLL) ||
1898 periph->periph_lun) && xs->xs_retries != 0) {
1899 xs->xs_retries--;
1906 if (xs->xs_control & XS_CTL_REQSENSE) {
1913 if (xs->xs_retries != 0) {
1914 xs->xs_retries--;
1928 printf("invalid return code from adapter: %d\n", xs->error);
1935 SDT_PROBE1(scsi, base, xfer, restart, xs);
1944 xs->error = XS_NOERROR;
1945 xs->status = SCSI_OK;
1946 xs->xs_status &= ~XS_STS_DONE;
1947 xs->xs_requeuecnt++;
1948 error = scsipi_enqueue(xs);
1960 if (xs->error != XS_NOERROR)
1965 periph->periph_switch->psw_done(xs, error);
1968 if (xs->xs_control & XS_CTL_ASYNC)
1969 scsipi_put_xs(xs);
1982 scsipi_request_sense(struct scsipi_xfer *xs)
1984 struct scsipi_periph *periph = xs->xs_periph;
1991 flags = xs->xs_control & XS_CTL_POLL;
2004 (void *)&xs->sense.scsi_sense, sizeof(struct scsi_sense_data),
2011 xs->error = XS_SENSE;
2015 xs->error = XS_RESET;
2023 xs->error = XS_DRIVER_STUFFUP;
2027 xs->error = XS_DRIVER_STUFFUP;
2040 scsipi_enqueue(struct scsipi_xfer *xs)
2042 struct scsipi_channel *chan = xs->xs_periph->periph_channel;
2045 SDT_PROBE1(scsi, base, xfer, enqueue, xs);
2052 if ((xs->xs_control & XS_CTL_POLL) != 0 &&
2054 xs->error = XS_DRIVER_STUFFUP;
2062 if (xs->xs_control & XS_CTL_URGENT) {
2063 TAILQ_INSERT_HEAD(&chan->chan_queue, xs, channel_q);
2072 * with a requeuecnt less than xs->xs_requeuecnt.
2077 if (xs->xs_requeuecnt != 0) {
2080 if (qxs->xs_periph == xs->xs_periph &&
2081 qxs->xs_requeuecnt < xs->xs_requeuecnt)
2085 TAILQ_INSERT_AFTER(&chan->chan_queue, qxs, xs,
2090 TAILQ_INSERT_TAIL(&chan->chan_queue, xs, channel_q);
2092 if (xs->xs_control & XS_CTL_THAW_PERIPH)
2093 scsipi_periph_thaw_locked(xs->xs_periph, 1);
2105 struct scsipi_xfer *xs;
2124 for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL;
2125 xs = TAILQ_NEXT(xs, channel_q)) {
2126 periph = xs->xs_periph;
2135 (xs->xs_control & XS_CTL_URGENT) == 0)
2166 if (xs->xs_control & XS_CTL_POLL) {
2167 scsipi_printaddr(xs->xs_periph);
2189 TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
2195 if (XS_CTL_TAGTYPE(xs) != 0)
2196 scsipi_get_tag(xs);
2202 SDT_PROBE2(scsi, base, queue, run, chan, xs);
2203 scsipi_adapter_request(chan, ADAPTER_REQ_RUN_XFER, xs);
2214 scsipi_execute_xs(struct scsipi_xfer *xs)
2216 struct scsipi_periph *periph = xs->xs_periph;
2222 scsipi_update_timeouts(xs);
2224 (chan->chan_bustype->bustype_cmd)(xs);
2226 xs->xs_status &= ~XS_STS_DONE;
2227 xs->error = XS_NOERROR;
2228 xs->resid = xs->datalen;
2229 xs->status = SCSI_OK;
2230 SDT_PROBE1(scsi, base, xfer, execute, xs);
2233 if (xs->xs_periph->periph_dbflags & SCSIPI_DB3) {
2235 show_scsipi_xs(xs);
2252 (xs->xs_control & XS_CTL_REQSENSE)) {
2253 xs->xs_control &= ~XS_CTL_TAGMASK;
2254 xs->xs_tag_type = 0;
2261 if (XS_CTL_TAGTYPE(xs) == 0) {
2262 if (xs->xs_control & XS_CTL_URGENT)
2263 xs->xs_control |= XS_CTL_HEAD_TAG;
2265 xs->xs_control |= XS_CTL_SIMPLE_TAG;
2268 switch (XS_CTL_TAGTYPE(xs)) {
2270 xs->xs_tag_type = MSG_ORDERED_Q_TAG;
2274 xs->xs_tag_type = MSG_SIMPLE_Q_TAG;
2278 xs->xs_tag_type = MSG_HEAD_OF_Q_TAG;
2284 XS_CTL_TAGTYPE(xs));
2291 xs->xs_control |= XS_CTL_POLL;
2297 oasync = (xs->xs_control & XS_CTL_ASYNC);
2298 if (chan->chan_thread == NULL || (xs->xs_control & XS_CTL_POLL) != 0)
2299 xs->xs_control &= ~XS_CTL_ASYNC;
2301 async = (xs->xs_control & XS_CTL_ASYNC);
2302 poll = (xs->xs_control & XS_CTL_POLL);
2305 if (oasync != 0 && xs->bp == NULL)
2313 error = scsipi_enqueue(xs);
2342 while ((xs->xs_status & XS_STS_DONE) == 0) {
2348 cv_wait(xs_cv(xs), chan_mtx(chan));
2356 error = scsipi_complete(xs);
2372 scsipi_put_xs(xs);
2396 struct scsipi_xfer *xs;
2404 xs = TAILQ_FIRST(&chan->chan_complete);
2405 if (xs == NULL && chan->chan_tflags == 0) {
2439 if (xs) {
2440 TAILQ_REMOVE(&chan->chan_complete, xs, channel_q);
2446 (void) scsipi_complete(xs);
2620 struct scsipi_xfer *xs, *xs_next;
2631 for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL; xs = xs_next) {
2632 xs_next = TAILQ_NEXT(xs, channel_q);
2633 if (xs->xs_control & XS_CTL_REQSENSE) {
2634 TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
2635 xs->error = XS_RESET;
2636 if ((xs->xs_control & XS_CTL_ASYNC) != 0)
2637 TAILQ_INSERT_TAIL(&chan->chan_complete, xs,
2642 /* Catch xs with pending sense which may not have a REQSENSE xs yet */
2649 xs = periph->periph_xscheck;
2650 if (xs)
2651 xs->error = XS_RESET;
2890 show_scsipi_xs(struct scsipi_xfer *xs)
2893 printf("xs(%p): ", xs);
2894 printf("xs_control(0x%08x)", xs->xs_control);
2895 printf("xs_status(0x%08x)", xs->xs_status);
2896 printf("periph(%p)", xs->xs_periph);
2897 printf("retr(0x%x)", xs->xs_retries);
2898 printf("timo(0x%x)", xs->timeout);
2899 printf("cmd(%p)", xs->cmd);
2900 printf("len(0x%x)", xs->cmdlen);
2901 printf("data(%p)", xs->data);
2902 printf("len(0x%x)", xs->datalen);
2903 printf("res(0x%x)", xs->resid);
2904 printf("err(0x%x)", xs->error);
2905 printf("bp(%p)", xs->bp);
2906 show_scsipi_cmd(xs);
2910 show_scsipi_cmd(struct scsipi_xfer *xs)
2912 u_char *b = (u_char *) xs->cmd;
2915 scsipi_printaddr(xs->xs_periph);
2918 if ((xs->xs_control & XS_CTL_RESET) == 0) {
2919 while (i < xs->cmdlen) {
2924 printf("-[%d bytes]\n", xs->datalen);
2925 if (xs->datalen)
2926 show_mem(xs->data, uimin(64, xs->datalen));