Home | History | Annotate | Download | only in isa

Lines Matching defs:scb

93 #define SCB_TABLE_SIZE	8	/* start with 8 scb entries in table */
206 struct sea_scb scb[SCB_TABLE_SIZE];
287 void sea_send_scb(struct sea_softc *sea, struct sea_scb *scb);
289 int sea_select(struct sea_softc *sea, struct sea_scb *scb);
292 int sea_abort(struct sea_softc *, struct sea_scb *scb);
308 struct sea_scb *scb;
312 for (scb = sea->ready_list.tqh_first, issued = 0; scb;
313 scb = scb->chain.tqe_next, issued++);
314 for (scb = sea->nexus_list.tqh_first, disconnected = 0; scb;
315 scb = scb->chain.tqe_next, disconnected++);
549 TAILQ_INSERT_TAIL(&sea->free_list, &sea->scb[i], chain);
564 struct sea_scb *scb;
584 /* Get an SCB to use. */
585 scb = sea_get_scb(sea, flags);
591 if (scb == NULL) {
593 printf("unable to allocate scb\n");
598 scb->flags = SCB_ACTIVE;
599 scb->xs = xs;
602 * Put all the arguments for the xfer in the scb
604 scb->datalen = xs->datalen;
605 scb->data = xs->data;
613 sea_send_scb(sea, scb);
616 callout_reset(&scb->xs->xs_callout,
617 mstohz(xs->timeout), sea_timeout, scb);
628 sea_timeout(scb);
630 sea_timeout(scb);
656 * Get a free scb. If there are none, see if we can allocate a new one. If so,
663 struct sea_scb *scb;
666 if ((scb = TAILQ_FIRST(&sea->free_list)) != NULL)
667 TAILQ_REMOVE(&sea->free_list, scb, chain);
670 return (scb);
682 sea_send_scb(struct sea_softc *sea, struct sea_scb *scb)
685 TAILQ_INSERT_TAIL(&sea->ready_list, scb, chain);
701 struct sea_scb *scb;
724 for (scb = sea->ready_list.tqh_first; scb;
725 scb = scb->chain.tqe_next) {
726 if ((sea->busy[scb->xs->xs_periph->periph_target] &
727 (1 << scb->xs->xs_periph->periph_lun)))
731 TAILQ_REMOVE(&sea->ready_list, scb, chain);
765 if (sea_select(sea, scb)) {
768 scb, chain);
798 * Allocate an scb and add it to the free list.
804 struct sea_scb *scb;
811 scb = kmem_zalloc(sizeof(*scb), KM_NOSLEEP);
812 if (scb == NULL)
815 TAILQ_INSERT_TAIL(&sea->free_list, scb, chain);
820 sea_free_scb(struct sea_softc *sea, struct sea_scb *scb, int flags)
825 scb->flags = SCB_FREE;
826 TAILQ_INSERT_HEAD(&sea->free_list, scb, chain);
833 struct sea_scb *scb = arg;
834 struct scsipi_xfer *xs = scb->xs;
850 if (scb->flags & SCB_ABORTED) {
853 scb->xs->xs_retries = 0;
854 scb->flags |= SCB_ABORTED;
855 sea_done(sea, scb);
859 scb->flags |= SCB_ABORTED;
860 sea_abort(sea, scb);
863 callout_reset(&scb->xs->xs_callout, 2 * hz,
864 sea_timeout, scb);
879 struct sea_scb *scb;
922 scb = NULL;
931 for (scb = sea->nexus_list.tqh_first; scb;
932 scb = scb->chain.tqe_next)
933 if (target_mask == (1 << scb->xs->xs_periph->periph_target) &&
934 lun == scb->xs->xs_periph->periph_lun) {
935 TAILQ_REMOVE(&sea->nexus_list, scb,
939 if (!scb) {
958 sea->nexus = scb;
1049 sea_select(struct sea_softc *sea, struct sea_scb *scb)
1067 scb->flags |= SCB_ERROR;
1071 scb->flags |= SCB_TIMEOUT;
1078 DATA = (u_char)((1 << scb->xs->xs_periph->periph_target) |
1095 scb->flags |= SCB_TIMEOUT;
1121 msg[0] = MSG_IDENTIFY(scb->xs->xs_periph->periph_lun, 1);
1132 sea->nexus = scb;
1133 sea->busy[scb->xs->xs_periph->periph_target] |=
1134 1 << scb->xs->xs_periph->periph_lun;
1145 sea_abort(struct sea_softc *sea, struct sea_scb *scb)
1157 if (scb == tmp) {
1158 TAILQ_REMOVE(&sea->ready_list, scb, chain);
1177 if (scb == tmp) {
1178 if (sea_select(sea, scb))
1190 if (scb == tmp) {
1192 scb, chain);
1204 sea_done(struct sea_softc *sea, struct sea_scb *scb)
1206 struct scsipi_xfer *xs = scb->xs;
1208 callout_stop(&scb->xs->xs_callout);
1210 xs->resid = scb->datalen;
1213 if (scb->flags == SCB_ACTIVE) {
1216 if (scb->flags & (SCB_TIMEOUT | SCB_ABORTED))
1218 if (scb->flags & SCB_ERROR)
1221 sea_free_scb(sea, scb, xs->xs_control);
1260 struct sea_scb *scb = sea->nexus;
1277 scb->flags = SCB_ERROR;
1279 sea_done(sea, scb);
1306 if (!scb->data)
1309 if (scb->datalen && !(scb->datalen % BLOCK_SIZE)) {
1310 while (scb->datalen) {
1331 "=S" (scb->data),
1334 "0" (scb->data),
1340 DATA = *(scb->data++);
1348 "=D" (scb->data),
1351 "0" (scb->data),
1357 *(scb->data++) = DATA;
1360 scb->datalen -= BLOCK_SIZE;
1364 if (scb->datalen)
1365 sea_transfer_pio(sea, &phase, &scb->datalen,
1366 &scb->data);
1373 /* scb->MessageIn = tmp; */
1377 scb->flags = SCB_ABORTED;
1380 sea_done(sea, scb);
1386 sea->busy[scb->xs->xs_periph->periph_target] &=
1387 ~(1 << scb->xs->xs_periph->periph_lun);
1389 sea_done(sea, scb);
1398 scb, chain);
1428 sea->busy[scb->xs->xs_periph->periph_target] &=
1429 ~(1 << scb->xs->xs_periph->periph_lun);
1431 scb->flags = SCB_ABORTED;
1434 sea_done(sea, scb);
1440 len = scb->xs->cmdlen;
1441 data = (char *) scb->xs->cmd;
1448 scb->xs->status = tmp;
1457 scb->flags = SCB_TIMEOUT;
1459 sea_done(sea, scb);