Home | History | Annotate | Download | only in isa

Lines Matching defs:scb

412 	struct wds_scb *scb;
435 scb = wds_scb_phys_kv(sc, phystol(wmbi->scb_addr));
436 if (!scb) {
437 printf("%s: bad mbi scb pointer; skipping\n",
444 u_char *cp = scb->cmd.xx;
449 printf("scb addr = %p\n", scb);
453 callout_stop(&scb->xs->xs_callout);
454 wds_done(sc, scb, wmbi->stat);
504 wds_reset_scb(struct wds_softc *sc, struct wds_scb *scb)
507 scb->flags = 0;
514 wds_free_scb(struct wds_softc *sc, struct wds_scb *scb)
519 wds_reset_scb(sc, scb);
520 TAILQ_INSERT_HEAD(&sc->sc_free_scb, scb, chain);
525 wds_init_scb(struct wds_softc *sc, struct wds_scb *scb)
532 * XXX SCB inits here?
535 memset(scb, 0, sizeof(struct wds_scb));
538 * Create DMA maps for this SCB.
541 sizeof(struct wds_scb), 0, BUS_DMA_NOWAIT, &scb->dmamap_self);
543 aprint_error_dev(sc->sc_dev, "can't create scb dmamap_self\n");
548 0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &scb->dmamap_xfer);
550 aprint_error_dev(sc->sc_dev, "can't create scb dmamap_xfer\n");
551 bus_dmamap_destroy(dmat, scb->dmamap_self);
558 error = bus_dmamap_load(dmat, scb->dmamap_self, scb,
561 aprint_error_dev(sc->sc_dev, "can't load scb dmamap_self\n");
562 bus_dmamap_destroy(dmat, scb->dmamap_self);
563 bus_dmamap_destroy(dmat, scb->dmamap_xfer);
571 scb->hashkey = scb->dmamap_self->dm_segs[0].ds_addr;
572 hashnum = SCB_HASH(scb->hashkey);
573 scb->nexthash = sc->sc_scbhash[hashnum];
574 sc->sc_scbhash[hashnum] = scb;
575 wds_reset_scb(sc, scb);
586 struct wds_scb *scb;
592 if ((scb = mem) != NULL)
605 (void *)&scb, BUS_DMA_NOWAIT|BUS_DMA_COHERENT);
613 memset(scb, 0, size);
615 error = wds_init_scb(sc, scb);
617 aprint_error_dev(sc->sc_dev, "can't initialize scb\n");
620 scb, chain);
621 scb = (struct wds_scb *)((char *)scb +
631 * Get a free scb
639 struct wds_scb *scb;
643 scb = TAILQ_FIRST(&sc->sc_free_scb);
644 if (scb != NULL) {
645 TAILQ_REMOVE(&sc->sc_free_scb, scb, chain);
646 scb->flags |= SCB_ALLOC;
649 return (scb);
656 struct wds_scb *scb = sc->sc_scbhash[hashnum];
658 while (scb) {
659 if (scb->hashkey == scb_phys)
662 if (scb->hashkey == (scb_phys - sizeof(struct wds_cmd)))
664 scb = scb->nexthash;
666 return (scb);
670 * Queue a SCB to be sent to the controller, and send it if possible.
673 wds_queue_scb(struct wds_softc *sc, struct wds_scb *scb)
676 TAILQ_INSERT_TAIL(&sc->sc_waiting_scb, scb, chain);
688 struct wds_scb *scb;
698 scb = wds_scb_phys_kv(sc, phystol(wmbo->scb_addr));
699 scb->flags &= ~SCB_SENDING;
718 struct wds_scb *scb;
723 while ((scb = sc->sc_waiting_scb.tqh_first) != NULL) {
733 TAILQ_REMOVE(&sc->sc_waiting_scb, scb, chain);
735 scb->flags |= SCB_SENDING;
738 /* Link scb to mbo. */
739 ltophys(scb->dmamap_self->dm_segs[0].ds_addr +
748 if ((scb->flags & SCB_POLLED) == 0)
749 callout_reset(&scb->xs->xs_callout,
750 mstohz(scb->timeout), wds_timeout, scb);
763 wds_done(struct wds_softc *sc, struct wds_scb *scb, u_char stat)
766 struct scsipi_xfer *xs = scb->xs;
770 /* Don't release the SCB if it was an internal command. */
772 scb->flags |= SCB_DONE;
781 bus_dmamap_sync(dmat, scb->dmamap_xfer, 0,
782 scb->dmamap_xfer->dm_mapsize,
785 bus_dmamap_unload(dmat, scb->dmamap_xfer);
797 * SCSI error recorded in scb,
800 switch (scb->cmd.venderr) {
812 if (scb->cmd.stat == SCSI_CHECK ||
813 scb->cmd.stat == SCSI_BUSY) {
814 xs->status = scb->cmd.stat;
837 scb->cmd.venderr,
838 scb->cmd.stat);
866 wds_free_scb(sc, scb);
1000 struct wds_scb *scb;
1006 scb = wds_get_scb(sc);
1007 if (scb == 0)
1008 panic("wds_inquire_setup_information: no scb available");
1010 scb->xs = NULL;
1011 scb->timeout = 40;
1013 memset(&scb->cmd, 0, sizeof scb->cmd);
1014 scb->cmd.write = 0x80;
1015 scb->cmd.opcode = WDSX_GETFIRMREV;
1019 scb->flags |= SCB_POLLED;
1022 wds_queue_scb(sc, scb);
1025 if (wds_ipoll(sc, scb, scb->timeout))
1030 scb->cmd.targ, scb->cmd.scb[0]);
1031 sc->sc_revision = (scb->cmd.targ << 8) | scb->cmd.scb[0];
1033 j = 2 + &(scb->cmd.targ);
1049 * Free up the resources used by this scb.
1051 wds_free_scb(sc, scb);
1074 struct wds_scb *scb;
1105 /* Get an SCB to use. */
1106 scb = wds_get_scb(sc);
1112 if (scb == NULL) {
1114 printf("unable to allocate scb\n");
1119 scb->xs = xs;
1120 scb->timeout = xs->timeout;
1123 if (xs->cmdlen > sizeof(scb->cmd.scb)) {
1125 "cmdlen %d too large for SCB\n", xs->cmdlen);
1129 memset(&scb->cmd, 0, sizeof scb->cmd);
1130 memcpy(&scb->cmd.scb, xs->cmd, xs->cmdlen);
1133 scb->cmd.targ = (periph->periph_target << 5) |
1141 scb->cmd.write = (xs->xs_control & XS_CTL_DATA_IN) ?
1149 scb->dmamap_xfer, (struct uio *)xs->data,
1157 scb->dmamap_xfer, xs->data, xs->datalen,
1177 wds_free_scb(sc, scb);
1182 bus_dmamap_sync(dmat, scb->dmamap_xfer, 0,
1183 scb->dmamap_xfer->dm_mapsize,
1193 seg < scb->dmamap_xfer->dm_nsegs; seg++) {
1194 ltophys(scb->dmamap_xfer->dm_segs[seg].ds_addr,
1195 scb->scat_gath[seg].seg_addr);
1196 ltophys(scb->dmamap_xfer->dm_segs[seg].ds_len,
1197 scb->scat_gath[seg].seg_len);
1203 scb->cmd.opcode = WDSX_SCSISG;
1204 ltophys(scb->dmamap_self->dm_segs[0].ds_addr +
1206 scb->cmd.data);
1207 ltophys(scb->dmamap_self->dm_nsegs *
1208 sizeof(struct wds_scat_gath), scb->cmd.len);
1214 scb->cmd.opcode = WDSX_SCSICMD;
1215 ltophys(scb->dmamap_xfer->dm_segs[0].ds_addr,
1216 scb->cmd.data);
1217 ltophys(scb->dmamap_xfer->dm_segs[0].ds_len,
1218 scb->cmd.len);
1221 scb->cmd.opcode = WDSX_SCSICMD;
1222 ltophys(0, scb->cmd.data);
1223 ltophys(0, scb->cmd.len);
1226 scb->cmd.stat = 0x00;
1227 scb->cmd.venderr = 0x00;
1228 ltophys(0, scb->cmd.link);
1235 scb->flags |= SCB_POLLED;
1246 wds_queue_scb(sc, scb);
1252 if (wds_poll(sc, xs, scb->timeout)) {
1253 wds_timeout(scb);
1254 if (wds_poll(sc, xs, scb->timeout))
1255 wds_timeout(scb);
1270 * Poll a particular unit, looking for a particular scb
1295 * Poll a particular unit, looking for a particular scb
1298 wds_ipoll(struct wds_softc *sc, struct wds_scb *scb, int count)
1311 if (scb->flags & SCB_DONE)
1322 struct wds_scb *scb = arg;
1323 struct scsipi_xfer *xs = scb->xs;
1336 * If The scb's mbx is not free, then the board has gone south?
1339 if (scb->flags & SCB_SENDING) {
1350 if (scb
1357 scb->xs->error = XS_TIMEOUT;
1358 scb->timeout = WDS_ABORT_TIMEOUT;
1359 scb->flags |= SCB_ABORT;
1360 wds_queue_scb(sc, scb);