Lines Matching refs:dev

182 void sbictimeout(struct sbic_softc *dev);
209 #define SBIC_TRACE(dev) do { \ argument
218 if (dev) dma_cachectl(dev, sizeof(*dev)); \
230 #define SBIC_TRACE(dev) argument
236 #define SBIC_TRACE(dev) argument
256 sbic_save_ptrs(struct sbic_softc *dev, sbic_regmap_t regs, int target, int lun) in sbic_save_ptrs() argument
261 SBIC_TRACE(dev); in sbic_save_ptrs()
262 if (!dev->sc_cur) return; in sbic_save_ptrs()
263 if (!(dev->sc_flags & SBICF_INDMA)) return; /* DMA not active */ in sbic_save_ptrs()
267 acb = dev->sc_nexus; in sbic_save_ptrs()
274 SBIC_TRACE(dev); in sbic_save_ptrs()
281 acb->sc_dmacmd = dev->sc_dmacmd; in sbic_save_ptrs()
285 dev->sc_dmastop(dev); in sbic_save_ptrs()
286 dev->sc_flags &= ~SBICF_INDMA; in sbic_save_ptrs()
293 target, dev->sc_cur->dc_addr, dev->sc_cur->dc_count, in sbic_save_ptrs()
298 acb->sc_kv.dc_addr += (dev->sc_tcnt - count); in sbic_save_ptrs()
299 acb->sc_kv.dc_count -= (dev->sc_tcnt - count); in sbic_save_ptrs()
300 acb->sc_pa.dc_addr += (dev->sc_tcnt - count); in sbic_save_ptrs()
301 acb->sc_pa.dc_count -= ((dev->sc_tcnt - count)>>1); in sbic_save_ptrs()
303 acb->sc_tcnt = dev->sc_tcnt = count; in sbic_save_ptrs()
307 dev->sc_cur->dc_addr, dev->sc_cur->dc_count,count); in sbic_save_ptrs()
311 SBIC_TRACE(dev); in sbic_save_ptrs()
319 sbic_load_ptrs(struct sbic_softc *dev, sbic_regmap_t regs, int target, int lun) in sbic_load_ptrs() argument
325 SBIC_TRACE(dev); in sbic_load_ptrs()
326 acb = dev->sc_nexus; in sbic_load_ptrs()
329 SBIC_TRACE(dev); in sbic_load_ptrs()
335 dev->sc_last = dev->sc_cur = &acb->sc_pa; in sbic_load_ptrs()
336 dev->sc_tcnt = acb->sc_tcnt; in sbic_load_ptrs()
337 dev->sc_dmacmd = acb->sc_dmacmd; in sbic_load_ptrs()
342 if (!dev->sc_tcnt) { in sbic_load_ptrs()
382 target, dev->sc_cur->dc_addr, dev->sc_cur->dc_count, in sbic_load_ptrs()
383 dev->sc_dmacmd); in sbic_load_ptrs()
385 SBIC_TRACE(dev); in sbic_load_ptrs()
402 struct sbic_softc *dev = device_private(chan->chan_adapter->adapt_dev); in sbic_scsipi_request() local
410 SBIC_TRACE(dev); in sbic_scsipi_request()
416 if (dev->sc_nexus && flags & XS_CTL_POLL) in sbic_scsipi_request()
420 acb = dev->free_list.tqh_first; in sbic_scsipi_request()
422 TAILQ_REMOVE(&dev->free_list, acb, chain); in sbic_scsipi_request()
448 dev->sc_flags |= SBICF_ICMD; in sbic_scsipi_request()
450 while (dev->sc_nexus) in sbic_scsipi_request()
451 sbicpoll(dev); in sbic_scsipi_request()
452 dev->sc_nexus = acb; in sbic_scsipi_request()
453 dev->sc_stat[0] = -1; in sbic_scsipi_request()
454 dev->sc_xs = xs; in sbic_scsipi_request()
455 dev->target = periph->periph_target; in sbic_scsipi_request()
456 dev->lun = periph->periph_lun; in sbic_scsipi_request()
457 stat = sbicicmd(dev, dev->target, dev->lun, in sbic_scsipi_request()
460 } while (dev->sc_nexus != acb); in sbic_scsipi_request()
464 SBIC_TRACE(dev); in sbic_scsipi_request()
469 TAILQ_INSERT_TAIL(&dev->ready_list, acb, chain); in sbic_scsipi_request()
471 if (dev->sc_nexus) { in sbic_scsipi_request()
473 SBIC_TRACE(dev); in sbic_scsipi_request()
480 sbic_sched(dev); in sbic_scsipi_request()
483 SBIC_TRACE(dev); in sbic_scsipi_request()
503 sbic_sched(struct sbic_softc *dev) in sbic_sched() argument
510 SBIC_TRACE(dev); in sbic_sched()
511 if (dev->sc_nexus) in sbic_sched()
514 SBIC_TRACE(dev); in sbic_sched()
515 for (acb = dev->ready_list.tqh_first; acb; acb = acb->chain.tqe_next) { in sbic_sched()
518 if (!(dev->sc_tinfo[i].lubusy & (1 << periph->periph_lun))) { in sbic_sched()
519 struct sbic_tinfo *ti = &dev->sc_tinfo[i]; in sbic_sched()
521 TAILQ_REMOVE(&dev->ready_list, acb, chain); in sbic_sched()
522 dev->sc_nexus = acb; in sbic_sched()
523 ti = &dev->sc_tinfo[periph->periph_target]; in sbic_sched()
530 SBIC_TRACE(dev); in sbic_sched()
534 dev->sc_xs = xs = acb->xs; in sbic_sched()
539 sbicreset(dev); in sbic_sched()
546 dev->sc_stat[0] = -1; in sbic_sched()
547 dev->target = periph->periph_target; in sbic_sched()
548 dev->lun = periph->periph_lun; in sbic_sched()
550 && (sbicdmaok(dev, xs) == 0))) in sbic_sched()
551 stat = sbicicmd(dev, periph->periph_target, in sbic_sched()
554 else if (sbicgo(dev, xs) == 0 && xs->error != XS_SELTIMEOUT) { in sbic_sched()
555 SBIC_TRACE(dev); in sbic_sched()
558 stat = dev->sc_stat[0]; in sbic_sched()
561 SBIC_TRACE(dev); in sbic_sched()
569 struct sbic_softc *dev; in sbic_scsidone() local
574 dev = device_private(periph->periph_channel->chan_adapter->adapt_dev); in sbic_scsidone()
575 SBIC_TRACE(dev); in sbic_scsidone()
579 dev->target, dev->lun); in sbic_scsidone()
593 dev->target, dev->lun, stat); in sbic_scsidone()
611 if (acb == dev->sc_nexus) { in sbic_scsidone()
612 dev->sc_nexus = NULL; in sbic_scsidone()
613 dev->sc_xs = NULL; in sbic_scsidone()
614 dev->sc_tinfo[periph->periph_target].lubusy &= in sbic_scsidone()
616 if (dev->ready_list.tqh_first) in sbic_scsidone()
618 } else if (dev->ready_list.tqh_last == &acb->chain.tqe_next) { in sbic_scsidone()
619 TAILQ_REMOVE(&dev->ready_list, acb, chain); in sbic_scsidone()
622 for (acb2 = dev->nexus_list.tqh_first; acb2; in sbic_scsidone()
625 TAILQ_REMOVE(&dev->nexus_list, acb, chain); in sbic_scsidone()
626 dev->sc_tinfo[periph->periph_target].lubusy in sbic_scsidone()
634 TAILQ_REMOVE(&dev->ready_list, acb, chain); in sbic_scsidone()
637 device_xname(dev->sc_dev)); in sbic_scsidone()
645 TAILQ_INSERT_HEAD(&dev->free_list, acb, chain); in sbic_scsidone()
647 dev->sc_tinfo[periph->periph_target].cmds++; in sbic_scsidone()
652 sbic_sched(dev); in sbic_scsidone()
653 SBIC_TRACE(dev); in sbic_scsidone()
657 sbicdmaok(struct sbic_softc *dev, struct scsipi_xfer *xs) in sbicdmaok() argument
665 else if ((dev->sc_flags & SBICF_BADDMA) == 0) in sbicdmaok()
670 else if (sbiccheckdmap(xs->data, xs->datalen, dev->sc_dmamask) == 0) in sbicdmaok()
675 else if (dev->sc_tinfo[xs->xs_periph->periph_target].bounce) in sbicdmaok()
680 else if ((dev->sc_tinfo[xs->xs_periph->periph_target].bounce in sbicdmaok()
682 if (isztwomem(dev->sc_tinfo[xs->xs_periph->periph_target].bounce)) in sbicdmaok()
685 (unsigned)kvtop(dev->sc_tinfo[xs->xs_periph->periph_target].bounce)); in sbicdmaok()
686 else if (dev->sc_tinfo[xs->xs_periph->periph_target].bounce) in sbicdmaok()
689 PREP_DMA_MEM(dev->sc_tinfo[xs->xs_periph->periph_target].bounce)); in sbicdmaok()
727 sbicabort(struct sbic_softc *dev, sbic_regmap_t regs, const char *where) in sbicabort() argument
735 device_xname(dev->sc_dev), where, csr, asr); in sbicabort()
740 if (dev->sc_nexus != NULL) { in sbicabort()
741 dev->sc_nexus->xs->error = XS_DRIVER_STUFFUP; in sbicabort()
742 sbic_scsidone(dev->sc_nexus, dev->sc_stat[0]); in sbicabort()
744 while (acb = dev->nexus_list.tqh_first) { in sbicabort()
751 if (dev->sc_flags & SBICF_SELECTED) { in sbicabort()
757 device_xname(dev->sc_dev), where, asr); in sbicabort()
764 printf("%s: sbicabort - sending ABORT command\n", device_xname(dev->sc_dev)); in sbicabort()
772 printf("%s: sbicabort - asr %x, trying to reset\n", device_xname(dev->sc_dev), asr); in sbicabort()
773 sbicreset(dev); in sbicabort()
774 dev->sc_flags &= ~SBICF_SELECTED; in sbicabort()
777 printf("%s: sbicabort - sending DISC command\n", device_xname(dev->sc_dev)); in sbicabort()
788 dev->sc_flags &= ~SBICF_SELECTED; in sbicabort()
799 sbicinit(struct sbic_softc *dev) in sbicinit() argument
808 if ((dev->sc_flags & SBICF_ALIVE) == 0) { in sbicinit()
809 TAILQ_INIT(&dev->ready_list); in sbicinit()
810 TAILQ_INIT(&dev->nexus_list); in sbicinit()
811 TAILQ_INIT(&dev->free_list); in sbicinit()
812 callout_init(&dev->sc_timo_ch, 0); in sbicinit()
813 dev->sc_nexus = NULL; in sbicinit()
814 dev->sc_xs = NULL; in sbicinit()
815 acb = dev->sc_acb; in sbicinit()
816 memset(acb, 0, sizeof(dev->sc_acb)); in sbicinit()
817 for (i = 0; i < sizeof(dev->sc_acb) / sizeof(*acb); i++) { in sbicinit()
818 TAILQ_INSERT_TAIL(&dev->free_list, acb, chain); in sbicinit()
821 memset(dev->sc_tinfo, 0, sizeof(dev->sc_tinfo)); in sbicinit()
824 callout_reset(&dev->sc_timo_ch, 30 * hz, in sbicinit()
825 (void *)sbictimeout, dev); in sbicinit()
830 dev->sc_flags |= SBICF_ALIVE; in sbicinit()
831 dev->sc_flags &= ~SBICF_SELECTED; in sbicinit()
840 device_xname(dev->sc_dev), inhibit_sync); in sbicinit()
847 sbicreset(dev); in sbicinit()
851 sbicreset(struct sbic_softc *dev) in sbicreset() argument
861 regs = dev->sc_sbic; in sbicreset()
863 if (dev->sc_flags & SBICF_ALIVE) { in sbicreset()
872 my_id = dev->sc_channel.chan_id & SBIC_ID_MASK; in sbicreset()
887 if (dev->sc_clkfreq < 110) in sbicreset()
889 else if (dev->sc_clkfreq < 160) in sbicreset()
891 else if (dev->sc_clkfreq < 210) in sbicreset()
914 if ((dev->sc_flags & SBICF_ALIVE) == 0) { in sbicreset()
915 TAILQ_INIT(&dev->ready_list); in sbicreset()
916 TAILQ_INIT(&dev->nexus_list); in sbicreset()
917 TAILQ_INIT(&dev->free_list); in sbicreset()
918 dev->sc_nexus = NULL; in sbicreset()
919 dev->sc_xs = NULL; in sbicreset()
920 acb = dev->sc_acb; in sbicreset()
921 memset(acb, 0, sizeof(dev->sc_acb)); in sbicreset()
922 for (i = 0; i < sizeof(dev->sc_acb) / sizeof(*acb); i++) { in sbicreset()
923 TAILQ_INSERT_TAIL(&dev->free_list, acb, chain); in sbicreset()
926 memset(dev->sc_tinfo, 0, sizeof(dev->sc_tinfo)); in sbicreset()
928 if (dev->sc_nexus != NULL) { in sbicreset()
929 dev->sc_nexus->xs->error = XS_DRIVER_STUFFUP; in sbicreset()
930 sbic_scsidone(dev->sc_nexus, dev->sc_stat[0]); in sbicreset()
932 while (acb = dev->nexus_list.tqh_first) { in sbicreset()
938 dev->sc_flags |= SBICF_ALIVE; in sbicreset()
940 dev->sc_flags &= ~SBICF_SELECTED; in sbicreset()
944 sbicerror(struct sbic_softc *dev, sbic_regmap_t regs, u_char csr) in sbicerror() argument
948 xs = dev->sc_xs; in sbicerror()
957 printf("%s: ", device_xname(dev->sc_dev)); in sbicerror()
965 sbicselectbus(struct sbic_softc *dev, sbic_regmap_t regs, u_char target, in sbicselectbus() argument
970 SBIC_TRACE(dev); in sbicselectbus()
976 if (dev->sc_flags & SBICF_SELECTED) { in sbicselectbus()
977 SBIC_TRACE(dev); in sbicselectbus()
986 SET_SBIC_timeo(regs, SBIC_TIMEOUT(250,dev->sc_clkfreq)); in sbicselectbus()
991 if (dev->sc_sync[target].state == SYNC_DONE) in sbicselectbus()
992 SET_SBIC_syn(regs, SBIC_SYN (dev->sc_sync[target].offset, in sbicselectbus()
993 dev->sc_sync[target].period)); in sbicselectbus()
1004 SBIC_TRACE(dev); in sbicselectbus()
1022 SBIC_TRACE(dev); in sbicselectbus()
1034 sbicnextstate(dev, csr, asr); in sbicselectbus()
1035 SBIC_TRACE(dev); in sbicselectbus()
1046 if (!sbic_enable_reselect && dev->nexus_list.tqh_first == NULL) in sbicselectbus()
1052 dev->sc_flags |= SBICF_SELECTED; /* device ignored ATN */ in sbicselectbus()
1054 dev->target = id; in sbicselectbus()
1055 GET_SBIC_tlun(regs,dev->lun); in sbicselectbus()
1056 if (dev->lun & SBIC_TLUN_VALID) in sbicselectbus()
1057 dev->lun &= SBIC_TLUN_MASK; in sbicselectbus()
1059 dev->lun = lun; in sbicselectbus()
1066 dev->target = id; in sbicselectbus()
1067 GET_SBIC_tlun(regs,dev->lun); in sbicselectbus()
1068 if (dev->lun & SBIC_TLUN_VALID) in sbicselectbus()
1069 dev->lun &= SBIC_TLUN_MASK; in sbicselectbus()
1071 dev->lun = lun; in sbicselectbus()
1077 && dev->sc_sync[id].state == SYNC_START) { in sbicselectbus()
1082 dev->sc_sync[id].offset = 0; in sbicselectbus()
1083 dev->sc_sync[id].period = sbic_min_period; in sbicselectbus()
1084 dev->sc_sync[id].state = SYNC_DONE; in sbicselectbus()
1088 if (dev->sc_sync[id].state != SYNC_START){ in sbicselectbus()
1089 if (dev->sc_xs->xs_control & XS_CTL_POLL in sbicselectbus()
1090 || (dev->sc_flags & SBICF_ICMD) in sbicselectbus()
1110 dev->sc_msg[0] = MSG_IDENTIFY | lun; in sbicselectbus()
1111 dev->sc_msg[1] = MSG_EXT_MESSAGE; in sbicselectbus()
1112 dev->sc_msg[2] = 3; in sbicselectbus()
1113 dev->sc_msg[3] = MSG_SYNC_REQ; in sbicselectbus()
1114 dev->sc_msg[4] = sbictoscsiperiod(dev, regs, in sbicselectbus()
1116 dev->sc_msg[5] = sbic_max_offset; in sbicselectbus()
1119 sbicxfout(regs, 6, dev->sc_msg, MESG_OUT_PHASE); in sbicselectbus()
1121 dev->sc_sync[id].state = SYNC_SENT; in sbicselectbus()
1133 if (sync_debug && dev->sc_sync[id].state == SYNC_SENT) in sbicselectbus()
1138 dev->sc_flags |= SBICF_SELECTED; in sbicselectbus()
1141 dev->sc_xs->error = XS_SELTIMEOUT; in sbicselectbus()
1145 SBIC_TRACE(dev); in sbicselectbus()
1314 sbicicmd(struct sbic_softc *dev, int target, int lun, void *cbuf, int clen, in sbicicmd() argument
1329 SBIC_TRACE(dev); in sbicicmd()
1330 regs = dev->sc_sbic; in sbicicmd()
1331 acb = dev->sc_nexus; in sbicicmd()
1334 dev->sc_last = dev->sc_cur = &acb->sc_pa; in sbicicmd()
1335 dev->sc_tcnt = acb->sc_tcnt = 0; in sbicicmd()
1353 dev->sc_stat[0] = 0xff; in sbicicmd()
1354 dev->sc_msg[0] = 0xff; in sbicicmd()
1358 dev->sc_flags |= SBICF_ICMD; in sbicicmd()
1364 if (!(dev->sc_flags & SBICF_SELECTED) in sbicicmd()
1365 && sbicselectbus(dev, regs, target, lun, dev->sc_scsiaddr)) { in sbicicmd()
1367 dev->sc_flags &= ~SBICF_ICMD; in sbicicmd()
1392 dev->sc_flags &= ~SBICF_SELECTED; in sbicicmd()
1395 GET_SBIC_tlun (regs, dev->sc_stat[0]); in sbicicmd()
1414 i = sbicabort(dev, regs, "icmd sending cmd"); in sbicicmd()
1436 i = sbicabort(dev, regs, "icmd out of data"); in sbicicmd()
1479 if (dev->sc_stat[0] != 0xff) in sbicicmd()
1485 i = sbicnextstate(dev, csr, asr); in sbicicmd()
1525 } while (i > 0 && dev->sc_stat[0] == 0xff); in sbicicmd()
1540 dev->target, lun, in sbicicmd()
1542 dev->sc_stat[0]); in sbicicmd()
1545 QPRINTF(("=STS:%02x=", dev->sc_stat[0])); in sbicicmd()
1546 dev->sc_flags &= ~SBICF_ICMD; in sbicicmd()
1548 SBIC_TRACE(dev); in sbicicmd()
1549 return(dev->sc_stat[0]); in sbicicmd()
1559 sbicxfdone(struct sbic_softc *dev, sbic_regmap_t regs, int target) in sbicxfdone() argument
1564 SBIC_TRACE(dev); in sbicxfdone()
1584 dev->sc_flags &= ~SBICF_SELECTED; in sbicxfdone()
1589 GET_SBIC_tlun(regs, dev->sc_stat[0]); in sbicxfdone()
1591 sbicerror(dev, regs, csr); in sbicxfdone()
1593 QPRINTF(("=STS:%02x=\n", dev->sc_stat[0])); in sbicxfdone()
1595 SBIC_TRACE(dev); in sbicxfdone()
1603 sbicgo(struct sbic_softc *dev, struct scsipi_xfer *xs) in sbicgo() argument
1610 SBIC_TRACE(dev); in sbicgo()
1611 dev->target = xs->xs_periph->periph_target; in sbicgo()
1612 dev->lun = xs->xs_periph->periph_lun; in sbicgo()
1613 acb = dev->sc_nexus; in sbicgo()
1614 regs = dev->sc_sbic; in sbicgo()
1616 usedma = sbicdmaok(dev, xs); in sbicgo()
1621 printf("sbicgo(%d,%d)\n", dev->target, dev->lun); in sbicgo()
1637 if (sbicselectbus(dev, regs, dev->target, dev->lun, in sbicgo()
1638 dev->sc_scsiaddr)) { in sbicgo()
1640 SBIC_TRACE(dev); in sbicgo()
1643 dev->sc_stat[0] = 0xff; in sbicgo()
1671 if (count && usedma && dev->sc_flags & SBICF_BADDMA && in sbicgo()
1672 sbiccheckdmap(addr, count, dev->sc_dmamask)) { in sbicgo()
1681 if (!dev->sc_tinfo[dev->target].bounce) { in sbicgo()
1683 dev->target); in sbicgo()
1686 dev->sc_tinfo[xs->xs_periph->periph_target].bounce in sbicgo()
1688 if (isztwomem(dev->sc_tinfo[xs->xs_periph->periph_target].bounce)) in sbicgo()
1691 (unsigned)kvtop(dev->sc_tinfo[xs->xs_periph->periph_target].bounce)); in sbicgo()
1692 else if (dev->sc_tinfo[xs->xs_periph->periph_target].bounce) in sbicgo()
1695 PREP_DMA_MEM(dev->sc_tinfo[xs->xs_periph->periph_target].bounce)); in sbicgo()
1698 dev->target, in sbicgo()
1699 (unsigned)kvtop(dev->sc_tinfo[dev->target].bounce)); in sbicgo()
1705 count, dev->target, in sbicgo()
1706 (unsigned)kvtop(dev->sc_tinfo[dev->target].bounce)); in sbicgo()
1708 bcopy (addr, dev->sc_tinfo[dev->target].bounce, count); in sbicgo()
1710 addr = dev->sc_tinfo[dev->target].bounce;/* and use DMA buffer */ in sbicgo()
1728 acb->sc_tcnt = dev->sc_tcnt = 0; in sbicgo()
1731 sbic_load_ptrs(dev, regs, dev->target, dev->lun); in sbicgo()
1732 SBIC_TRACE(dev); in sbicgo()
1734 dev->sc_enintr(dev); in sbicgo()
1736 dev->sc_tcnt = dev->sc_dmago(dev, acb->sc_pa.dc_addr, in sbicgo()
1740 dev->sc_dmatimo = dev->sc_tcnt ? 1 : 0; in sbicgo()
1743 dev->sc_dmacmd = 0; /* Don't use DMA */ in sbicgo()
1744 dev->sc_flags |= SBICF_INDMA; in sbicgo()
1746 SBIC_TRACE(dev); in sbicgo()
1747 sbic_save_ptrs(dev, regs, dev->target, dev->lun); in sbicgo()
1756 dev->sc_flags |= SBICF_DCFLUSH; in sbicgo()
1769 dev->target,dev->sc_cur->dc_addr,dev->sc_tcnt); in sbicgo()
1786 CSR_TRACE('g',csr,asr,dev->target); in sbicgo()
1793 i = sbicnextstate(dev, csr, asr); in sbicgo()
1806 SBIC_TRACE(dev); in sbicgo()
1807 if (i == SBIC_STATE_DONE && dev->sc_stat[0] == 0xff) printf("sbicgo: done & stat = 0xff\n"); in sbicgo()
1808 if (i == SBIC_STATE_DONE && dev->sc_stat[0] != 0xff) { in sbicgo()
1818 sbicintr(struct sbic_softc *dev) in sbicintr() argument
1824 regs = dev->sc_sbic; in sbicintr()
1833 SBIC_TRACE(dev); in sbicintr()
1836 CSR_TRACE('i',csr,asr,dev->target); in sbicintr()
1843 i = sbicnextstate(dev, csr, asr); in sbicintr()
1857 SBIC_TRACE(dev); in sbicintr()
1865 sbicpoll(struct sbic_softc *dev) in sbicpoll() argument
1871 SBIC_TRACE(dev); in sbicpoll()
1872 regs = dev->sc_sbic; in sbicpoll()
1880 CSR_TRACE('p',csr,asr,dev->target); in sbicpoll()
1887 i = sbicnextstate(dev, csr, asr); in sbicpoll()
1916 SBIC_TRACE(dev); in sbicpoll()
1925 sbicmsgin(struct sbic_softc *dev) in sbicmsgin() argument
1931 regs = dev->sc_sbic; in sbicmsgin()
1933 dev->sc_msg[0] = 0xff; in sbicmsgin()
1934 dev->sc_msg[1] = 0xff; in sbicmsgin()
1942 sbic_save_ptrs(dev, regs, dev->target, dev->lun); in sbicmsgin()
1948 tmpaddr = dev->sc_msg; in sbicmsgin()
1966 CSR_TRACE('X',csr,asr,dev->target); in sbicmsgin()
1973 CSR_TRACE('X',csr,asr,dev->target); in sbicmsgin()
2006 CSR_TRACE('e',csr,asr,dev->target); in sbicmsgin()
2008 sbicnextstate(dev, csr, asr); in sbicmsgin()
2009 sbic_save_ptrs(dev, regs, in sbicmsgin()
2010 dev->target, in sbicmsgin()
2011 dev->lun); in sbicmsgin()
2026 CSR_TRACE('X',csr,asr,dev->target); in sbicmsgin()
2035 if (dev->sc_msg[0] == 0xff) { in sbicmsgin()
2042 csr, asr, dev->sc_msg[0]); in sbicmsgin()
2048 if (MSG_ISIDENTIFY(dev->sc_msg[0])) { in sbicmsgin()
2052 sbic_load_ptrs(dev, regs, dev->target, dev->lun); in sbicmsgin()
2055 } else if (dev->sc_msg[0] == MSG_REJECT in sbicmsgin()
2056 && dev->sc_sync[dev->target].state == SYNC_SENT) { in sbicmsgin()
2061 dev->target); in sbicmsgin()
2063 dev->sc_sync[dev->target].period = sbic_min_period; in sbicmsgin()
2064 dev->sc_sync[dev->target].offset = 0; in sbicmsgin()
2065 dev->sc_sync[dev->target].state = SYNC_DONE; in sbicmsgin()
2067 SBIC_SYN(dev->sc_sync[dev->target].offset, in sbicmsgin()
2068 dev->sc_sync[dev->target].period)); in sbicmsgin()
2069 } else if (dev->sc_msg[0] == MSG_REJECT) { in sbicmsgin()
2074 } else if (dev->sc_msg[0] == MSG_SAVE_DATA_PTR) { in sbicmsgin()
2079 } else if (dev->sc_msg[0] == MSG_DISCONNECT) { in sbicmsgin()
2082 if (reselect_debug>1 && dev->sc_msg[0] == MSG_DISCONNECT) in sbicmsgin()
2084 (dev->sc_flags & SBICF_ICMD)?"rejecting":""); in sbicmsgin()
2086 if (dev->sc_flags & SBICF_ICMD) { in sbicmsgin()
2092 } else if (dev->sc_msg[0] == MSG_CMD_COMPLETE) { in sbicmsgin()
2114 dev->sc_msg[0], dev->target); in sbicmsgin()
2122 dev->sc_stat[0] = 0; in sbicmsgin()
2123 } else if (dev->sc_msg[0] == MSG_EXT_MESSAGE in sbicmsgin()
2124 && tmpaddr == &dev->sc_msg[1]) { in sbicmsgin()
2139 } else if (dev->sc_msg[0] == MSG_EXT_MESSAGE && dev->sc_msg[1] == 3 in sbicmsgin()
2140 && dev->sc_msg[2] == MSG_SYNC_REQ) { in sbicmsgin()
2142 dev->sc_sync[dev->target].period = in sbicmsgin()
2143 sbicfromscsiperiod(dev, in sbicmsgin()
2144 regs, dev->sc_msg[3]); in sbicmsgin()
2145 dev->sc_sync[dev->target].offset = dev->sc_msg[4]; in sbicmsgin()
2146 dev->sc_sync[dev->target].state = SYNC_DONE; in sbicmsgin()
2148 SBIC_SYN(dev->sc_sync[dev->target].offset, in sbicmsgin()
2149 dev->sc_sync[dev->target].period)); in sbicmsgin()
2152 device_xname(dev->sc_dev), dev->target, in sbicmsgin()
2153 dev->sc_msg[3] * 4, dev->sc_msg[4]); in sbicmsgin()
2158 dev->sc_msg[0]); in sbicmsgin()
2168 CSR_TRACE('X',csr,asr,dev->target); in sbicmsgin()
2197 sbicnextstate(struct sbic_softc *dev, u_char csr, u_char asr) in sbicnextstate() argument
2207 SBIC_TRACE(dev); in sbicnextstate()
2208 regs = dev->sc_sbic; in sbicnextstate()
2209 acb = dev->sc_nexus; in sbicnextstate()
2218 sbic_save_ptrs(dev, regs, dev->target, dev->lun); in sbicnextstate()
2234 sbicxfdone(dev,regs,dev->target); in sbicnextstate()
2239 if (dev->sc_flags & SBICF_DCFLUSH) { in sbicnextstate()
2243 dev->sc_xs->data, dev->sc_xs->datalen); in sbicnextstate()
2250 dev->target,dev->sc_cur->dc_addr,dev->sc_tcnt); in sbicnextstate()
2251 dev->sc_dmatimo = 0; in sbicnextstate()
2253 dev->sc_dmastop(dev); /* was dmafree */ in sbicnextstate()
2257 device_xname(dev->sc_dev), acb->sc_usrbufpa, in sbicnextstate()
2263 dev->target, in sbicnextstate()
2264 (unsigned)kvtop(dev->sc_tinfo[dev->target].bounce)); in sbicnextstate()
2266 bcopy(dev->sc_tinfo[dev->target].bounce, in sbicnextstate()
2270 dev->sc_flags &= ~(SBICF_INDMA | SBICF_DCFLUSH); in sbicnextstate()
2271 sbic_scsidone(acb, dev->sc_stat[0]); in sbicnextstate()
2272 SBIC_TRACE(dev); in sbicnextstate()
2283 if ((dev->sc_xs->xs_control & XS_CTL_POLL) || in sbicnextstate()
2284 (dev->sc_flags & SBICF_ICMD) || acb->sc_dmacmd == 0) { in sbicnextstate()
2327 dev->sc_cur->dc_count -= ((dev->sc_tcnt - tcnt) >> 1); in sbicnextstate()
2328 dev->sc_cur->dc_addr += (dev->sc_tcnt - tcnt); in sbicnextstate()
2329 dev->sc_tcnt = acb->sc_tcnt = tcnt; in sbicnextstate()
2331 sbic_save_ptrs(dev, regs, dev->target, dev->lun); in sbicnextstate()
2332 sbic_load_ptrs(dev, regs, dev->target, dev->lun); in sbicnextstate()
2337 dev->target,dev->sc_cur->dc_addr, in sbicnextstate()
2338 dev->sc_tcnt); in sbicnextstate()
2339 dev->sc_dmatimo = 1; in sbicnextstate()
2341 dev->sc_tcnt = dev->sc_dmanext(dev); in sbicnextstate()
2342 SBIC_TC_PUT(regs, (unsigned)dev->sc_tcnt); in sbicnextstate()
2344 dev->sc_flags |= SBICF_INDMA; in sbicnextstate()
2352 SBIC_TRACE(dev); in sbicnextstate()
2353 return sbicmsgin(dev); in sbicnextstate()
2369 sbic_save_ptrs(dev, regs, dev->target, dev->lun); in sbicnextstate()
2379 SBIC_TRACE(dev); in sbicnextstate()
2384 dev->sc_flags &= ~(SBICF_INDMA|SBICF_SELECTED); in sbicnextstate()
2389 printf("sbicnext target %d disconnected\n", dev->target); in sbicnextstate()
2391 TAILQ_INSERT_HEAD(&dev->nexus_list, acb, chain); in sbicnextstate()
2392 ++dev->sc_tinfo[dev->target].dconns; in sbicnextstate()
2393 dev->sc_nexus = NULL; in sbicnextstate()
2394 dev->sc_xs = NULL; in sbicnextstate()
2397 || (dev->sc_flags & SBICF_ICMD) in sbicnextstate()
2399 SBIC_TRACE(dev); in sbicnextstate()
2402 sbic_sched(dev); in sbicnextstate()
2403 SBIC_TRACE(dev); in sbicnextstate()
2437 sbicmsgin(dev); in sbicnextstate()
2438 newlun = dev->sc_msg[0] & 7; in sbicnextstate()
2451 if (dev->sc_nexus) { in sbicnextstate()
2455 device_xname(dev->sc_dev), in sbicnextstate()
2461 TAILQ_INSERT_HEAD(&dev->ready_list, dev->sc_nexus, chain); in sbicnextstate()
2462 dev->sc_tinfo[dev->target].lubusy &= ~(1 << dev->lun); in sbicnextstate()
2463 dev->sc_nexus = NULL; in sbicnextstate()
2464 dev->sc_xs = NULL; in sbicnextstate()
2467 if (dev->sc_sync[newtarget].state == SYNC_DONE) in sbicnextstate()
2468 SET_SBIC_syn(regs, SBIC_SYN (dev->sc_sync[newtarget].offset, in sbicnextstate()
2469 dev->sc_sync[newtarget].period)); in sbicnextstate()
2472 for (acb = dev->nexus_list.tqh_first; acb; in sbicnextstate()
2477 TAILQ_REMOVE(&dev->nexus_list, acb, chain); in sbicnextstate()
2478 dev->sc_nexus = acb; in sbicnextstate()
2479 dev->sc_xs = acb->xs; in sbicnextstate()
2480 dev->sc_flags |= SBICF_SELECTED; in sbicnextstate()
2481 dev->target = newtarget; in sbicnextstate()
2482 dev->lun = newlun; in sbicnextstate()
2487 device_xname(dev->sc_dev), in sbicnextstate()
2489 &dev->nexus_list.tqh_first); in sbicnextstate()
2508 dev->target,dev->sc_cur->dc_addr,dev->sc_tcnt); in sbicnextstate()
2509 dev->sc_dmatimo = 0; in sbicnextstate()
2511 dev->sc_dmastop(dev); in sbicnextstate()
2513 sbicerror(dev, regs, csr); in sbicnextstate()
2514 sbicabort(dev, regs, "next"); in sbicnextstate()
2515 if (dev->sc_flags & SBICF_INDMA) { in sbicnextstate()
2520 if (dev->sc_flags & SBICF_DCFLUSH) { in sbicnextstate()
2524 dev->sc_xs->data, dev->sc_xs->datalen); in sbicnextstate()
2528 dev->sc_flags &= in sbicnextstate()
2533 dev->target,dev->sc_cur->dc_addr,dev->sc_tcnt); in sbicnextstate()
2534 dev->sc_dmatimo = 0; in sbicnextstate()
2536 dev->sc_dmastop(dev); in sbicnextstate()
2539 SBIC_TRACE(dev); in sbicnextstate()
2543 SBIC_TRACE(dev); in sbicnextstate()
2577 sbictoscsiperiod(struct sbic_softc *dev, sbic_regmap_t regs, int a) in sbictoscsiperiod() argument
2589 fs = (fs * 10000) / (dev->sc_clkfreq<<1); /* Cycle, in ns */ in sbictoscsiperiod()
2595 sbicfromscsiperiod(struct sbic_softc *dev, sbic_regmap_t regs, int p) in sbicfromscsiperiod() argument
2603 fs = (fs * 10000) / (dev->sc_clkfreq<<1); /* Cycle, in ns */ in sbicfromscsiperiod()
2611 if (sbictoscsiperiod(dev, regs, ret) < p) in sbicfromscsiperiod()
2635 sbictimeout(struct sbic_softc *dev) in sbictimeout() argument
2640 if (dev->sc_dmatimo) { in sbictimeout()
2641 if (dev->sc_dmatimo > 1) { in sbictimeout()
2643 device_xname(dev->sc_dev), dev->sc_dmatimo - 1); in sbictimeout()
2644 GET_SBIC_asr(dev->sc_sbic, asr); in sbictimeout()
2649 sbicintr(dev); in sbictimeout()
2653 dev->sc_dmatimo++; in sbictimeout()
2656 callout_reset(&dev->sc_timo_ch, 30 * hz, in sbictimeout()
2657 (void *)sbictimeout, dev); in sbictimeout()
2685 sbic_dump(struct sbic_softc *dev) in sbic_dump() argument
2694 regs = dev->sc_sbic; in sbic_dump()
2802 printf("%s@%p regs %p/%p asr %x csr %x\n", device_xname(dev->sc_dev), in sbic_dump()
2803 dev, regs.sbic_asr_p, regs.sbic_value_p, asr, csr); in sbic_dump()
2804 if ((acb = dev->free_list.tqh_first)) { in sbic_dump()
2811 if ((acb = dev->ready_list.tqh_first)) { in sbic_dump()
2818 if ((acb = dev->nexus_list.tqh_first)) { in sbic_dump()
2825 if (dev->sc_nexus) { in sbic_dump()
2827 sbic_dump_acb(dev->sc_nexus); in sbic_dump()
2830 dev->sc_xs, dev->target, dev->lun, dev->sc_flags, dev->sc_tcnt, in sbic_dump()
2831 dev->sc_dmacmd, dev->sc_dmamask); in sbic_dump()
2833 if (dev->sc_tinfo[i].cmds > 2) { in sbic_dump()
2835 i, dev->sc_tinfo[i].cmds, in sbic_dump()
2836 dev->sc_tinfo[i].dconns, in sbic_dump()
2837 dev->sc_tinfo[i].lubusy); in sbic_dump()