Lines Matching defs:nexus
126 void esc_init_nexus(struct esc_softc *, struct nexus *);
132 struct nexus *esc_arbitate_target(struct esc_softc *, int);
133 void esc_setup_nexus(struct esc_softc *, struct nexus *, struct esc_pending *,
136 int esc_midaction(struct esc_softc *, esc_regmap_p, struct nexus *);
137 int esc_postaction(struct esc_softc *, esc_regmap_p, struct nexus *);
169 * Initialize the nexus structs.
172 esc_init_nexus(struct esc_softc *dev, struct nexus *nexus)
174 memset(nexus, 0, sizeof(struct nexus));
176 nexus->state = ESC_NS_IDLE;
177 nexus->period = 200;
178 nexus->offset = 0;
179 nexus->syncper = 5;
180 nexus->syncoff = 0;
181 nexus->config3 = dev->sc_config3 & ~ESC_CFG3_FASTSCSI;
336 struct nexus *nexus;
345 nexus = dev->sc_cur_nexus;
346 while(nexus->flags & ESC_NF_UNIT_BUSY) {
351 nexus->flags |= ESC_NF_UNIT_BUSY;
357 nexus->flags &= ~ESC_NF_UNIT_BUSY;
485 * Save active data pointers to the nexus block currently active.
490 struct nexus *nx;
507 * Restore data pointers from the currently active nexus block.
512 struct nexus *nx;
713 struct nexus *nexus;
721 nexus = &dev->sc_nexus[target];
732 *rp->esc_syncper = nexus->syncper;
733 *rp->esc_syncoff = nexus->syncoff;
734 *rp->esc_config3 = nexus->config3;
742 *rp->esc_fifo = nexus->ID;
743 if ((nexus->flags & (ESC_NF_DO_SDTR | ESC_NF_RESET))
747 for(i=0; i<nexus->clen; i++)
748 *rp->esc_fifo = nexus->cbuf[i];
753 dev->sc_sel_nexus = nexus;
757 nexus->flags &= ~ESC_NF_RETRY_SELECT;
759 nexus->flags |= ESC_NF_RETRY_SELECT;
761 nexus->flags |= ESC_NF_RETRY_SELECT;
768 * Grab the nexus if available else return 0.
770 struct nexus *
773 struct nexus *nexus;
777 * This is really simple. Raise interrupt level to splbio. Grab the nexus and
780 nexus = &dev->sc_nexus[target];
784 if (nexus->flags & ESC_NF_UNIT_BUSY)
785 nexus = 0;
787 nexus->flags |= ESC_NF_UNIT_BUSY;
790 return(nexus);
794 * Setup a nexus for use. Initializes command, buffer pointers and DMA chain.
797 esc_setup_nexus(struct esc_softc *dev, struct nexus *nexus, struct esc_pending *pendp, unsigned char *cbuf, int clen, unsigned char *buf, int len, int mode)
817 nexus->xs = pendp->xs;
819 /* Setup the nexus struct. */
820 nexus->ID = ((mode & ESC_SELECT_R) ? 0xC0 : 0x80) | lun;
821 nexus->clen = clen;
822 memcpy(nexus->cbuf, cbuf, nexus->clen);
823 nexus->cbuf[1] |= lun << 5; /* Fix the lun bits */
824 nexus->cur_link = 0;
825 nexus->dma_len = 0;
826 nexus->dma_buf = 0;
827 nexus->dma_blk_len = 0;
828 nexus->dma_blk_ptr = 0;
829 nexus->len = len;
830 nexus->buf = buf;
831 nexus->lun_unit = (lun << 4) | target;
832 nexus->state = ESC_NS_SELECTED;
835 nexus->flags &= ESC_NF_UNIT_BUSY
839 nexus->flags |= ESC_NF_IMMEDIATE;
841 nexus->flags |= ESC_NF_RESET;
850 ((nexus->flags & ESC_NF_SYNC_TESTED) && (nexus->offset != 0))) {
856 nexus->flags |= ESC_NF_DO_SDTR;
857 nexus->period = 200;
858 nexus->offset = 0;
859 } else if (sync && !(nexus->flags & ESC_NF_SYNC_TESTED)) {
867 nexus->flags |= ESC_NF_DO_SDTR;
868 nexus->period = ((dev->sc_clock_freq>25) ? 100 : 200);
869 nexus->offset = 8;
872 if ((nexus->period == 100) &&
874 nexus->period = 200;
882 nexus->dma[0].ptr = buf;
883 nexus->dma[0].len = len;
884 nexus->dma[0].flg = ESC_CHAIN_PRG;
885 nexus->max_link = 1;
887 nexus->max_link = dev->sc_build_dma_chain(dev, nexus->dma,
900 struct nexus *nexus;
902 /* Get the nexus struct. */
903 nexus = esc_arbitate_target(dev, pendp->xs->xs_periph->periph_target);
904 if (nexus == NULL)
907 /* Setup the nexus struct. */
908 esc_setup_nexus(dev, nexus, pendp, cbuf, clen, buf, len, mode);
951 * We don't know if we have an active nexus here!
956 struct nexus *nexus;
1017 nexus = dev->sc_cur_nexus;
1019 *rp->esc_syncper = nexus->syncper;
1020 *rp->esc_syncoff = nexus->syncoff;
1021 *rp->esc_config3 = nexus->config3;
1031 nexus->state = ESC_NS_RESELECTED;
1051 * processing. We know that we have an active nexus here.
1054 esc_midaction(struct esc_softc *dev, esc_regmap_p rp, struct nexus *nexus)
1067 /* Let the nexus state reflect what we have to do. */
1068 switch(nexus->state) {
1071 nexus->flags &= ~ESC_NF_SELECT_ME;
1077 nexus->xs->resid = dev->sc_len;
1079 nexus->status = -2;
1080 nexus->flags &= ~ESC_NF_UNIT_BUSY;
1081 nexus->state = ESC_NS_FINISHED;
1086 nexus->xs->resid = dev->sc_len;
1088 nexus->flags &= ~ESC_NF_UNIT_BUSY;
1089 nexus->state = ESC_NS_FINISHED;
1098 nexus->state = ESC_NS_DISCONNECTED;
1106 * nexus struct.
1109 esc_init_nexus(dev, nexus);
1119 nexus->lun_unit, nexus->state,
1121 nexus->flags, nexus->cbuf[0]);
1123 nexus->xs->resid = dev->sc_len;
1125 nexus->flags &= ~ESC_NF_UNIT_BUSY;
1126 nexus->state = ESC_NS_FINISHED;
1127 nexus->status = -3;
1143 /* Select the first pre-initialized nexus we find. */
1149 /* We are done with this nexus! */
1150 if (nexus->state == ESC_NS_FINISHED)
1151 esc_scsidone(dev, nexus->xs, nexus->status);
1156 switch(nexus->state) {
1158 dev->sc_cur_nexus = nexus;
1161 nexus->flags &= ~ESC_NF_SELECT_ME;
1167 *rp->esc_syncper = nexus->syncper;
1168 *rp->esc_syncoff = nexus->syncoff;
1169 *rp->esc_config3 = nexus->config3;
1173 nexus->status = 0xFF;
1193 if (nexus->state == ESC_NS_DATA_IN) {
1246 nexus->status = status;
1248 nexus->status = -1;
1256 nexus->flags |= ESC_NF_HAS_MSG;
1268 * phase passes). We know that we have an active nexus here.
1271 esc_postaction(struct esc_softc *dev, esc_regmap_p rp, struct nexus *nexus)
1284 nexus->state = ESC_NS_DATA_OUT;
1286 nexus->state = ESC_NS_DATA_IN;
1300 esc_ixfer(dev/*, nexus->xs->xs_control & XS_CTL_POLL*/);
1320 if (nexus->state == ESC_NS_DATA_OUT)
1330 ((nexus->state == ESC_NS_DATA_OUT) ?
1350 nexus->state = ESC_NS_SVC;
1355 for(i=0; i<nexus->clen; i++)
1356 *rp->esc_fifo = nexus->cbuf[i];
1365 nexus->state = ESC_NS_STATUS;
1374 nexus->state = ESC_NS_MSG_OUT;
1378 if (nexus->flags & ESC_NF_DO_SDTR) {
1381 esc_build_sdtrm(dev, nexus->period, nexus->offset);
1382 nexus->flags |= ESC_NF_SDTR_SENT;
1383 nexus->flags &= ~ESC_NF_DO_SDTR;
1384 } else if (nexus->flags & ESC_NF_RESET) {
1389 nexus->state = ESC_NS_RESET;
1390 nexus->flags &= ~ESC_NF_RESET;
1408 nexus->state = ESC_NS_MSG_IN;
1410 while(!(nexus->flags & ESC_NF_HAS_MSG)) {
1423 nexus->flags |= ESC_NF_HAS_MSG;
1428 nexus->flags |= ESC_NF_HAS_MSG;
1442 if (nexus->flags & ESC_NF_HAS_MSG) {
1447 nexus->state = ESC_NS_DONE;
1450 nexus->state = ESC_NS_DISCONNECTING;
1464 if (nexus->flags & ESC_NF_SDTR_SENT) {
1465 nexus->flags &= ~ESC_NF_SDTR_SENT;
1467 nexus->config3 &= ~ESC_CFG3_FASTSCSI;
1468 nexus->syncper = 5;
1469 nexus->syncoff = 0;
1471 *rp->esc_syncper = nexus->syncper;
1472 *rp->esc_syncoff = nexus->syncoff;
1473 *rp->esc_config3 = nexus->config3;
1508 nexus->syncper = period/
1510 nexus->syncoff = offset;
1513 nexus->config3 |= ESC_CFG3_FASTSCSI;
1515 nexus->config3 &=~ESC_CFG3_FASTSCSI;
1517 nexus->flags |= ESC_NF_SYNC_TESTED;
1519 *rp->esc_syncper = nexus->syncper;
1520 *rp->esc_syncoff = nexus->syncoff;
1521 *rp->esc_config3 = nexus->config3;
1528 if (!(nexus->flags& ESC_NF_SDTR_SENT))
1535 nexus->lun_unit & 7]) {
1540 nexus->offset = offset;
1541 nexus->period = period;
1542 nexus->flags |= ESC_NF_DO_SDTR;
1546 nexus->flags &= ~ESC_NF_SDTR_SENT;
1572 nexus->flags &= ~ESC_NF_HAS_MSG;
1580 esc_scsidone(dev, nexus->xs, -4);
1598 struct nexus *nexus;
1604 nexus = dev->sc_cur_nexus;
1605 if (nexus == NULL)
1606 nexus = dev->sc_sel_nexus;
1608 if (nexus)
1609 if (!esc_midaction(dev, rp, nexus))
1610 esc_postaction(dev, rp, nexus);
1622 struct nexus *nexus;
1624 nexus = &dev->sc_nexus[pendp->xs->xs_periph->periph_target];
1631 while(nexus->state != ESC_NS_FINISHED) {
1636 nexus->flags &= ~ESC_NF_SYNC_TESTED;