Home | History | Annotate | Download | only in ic

Lines Matching refs:cb

129 	struct oosiop_cb *cb;
169 /* Use first cb to reselection msgin buffer */
170 cb = TAILQ_FIRST(&sc->sc_free_cb);
171 sc->sc_reselbuf = cb->xferdma->dm_segs[0].ds_addr +
249 struct oosiop_cb *cb;
259 cb = malloc(sizeof(struct oosiop_cb) * ncb, M_DEVBUF, M_WAITOK|M_ZERO);
283 0, BUS_DMA_NOWAIT, &cb[i].cmddma);
290 &cb[i].datadma);
298 0, BUS_DMA_NOWAIT, &cb[i].xferdma);
304 err = bus_dmamap_load(sc->sc_dmat, cb[i].xferdma, &xfer[i],
311 cb[i].xfer = &xfer[i];
315 bus_dmamap_unload(sc->sc_dmat, cb[i].xferdma);
316 loop_fail3: bus_dmamap_destroy(sc->sc_dmat, cb[i].xferdma);
317 loop_fail2: bus_dmamap_destroy(sc->sc_dmat, cb[i].datadma);
318 loop_fail1: bus_dmamap_destroy(sc->sc_dmat, cb[i].cmddma);
324 TAILQ_INSERT_TAIL(&sc->sc_free_cb, &cb[i], chain);
332 bus_dmamap_unload(sc->sc_dmat, cb[i].xferdma);
333 bus_dmamap_destroy(sc->sc_dmat, cb[i].xferdma);
334 bus_dmamap_destroy(sc->sc_dmat, cb[i].datadma);
335 bus_dmamap_destroy(sc->sc_dmat, cb[i].cmddma);
339 fail1: free(cb, M_DEVBUF);
457 oosiop_setup_sgdma(struct oosiop_softc *sc, struct oosiop_cb *cb)
462 OOSIOP_XFERSCR_SYNC(sc, cb,
465 off = cb->curdp;
466 xfer = cb->xfer;
467 control = cb->xs->xs_control;
471 for (i = 0; i < cb->datadma->dm_nsegs; i++) {
472 if (off < cb->datadma->dm_segs[i].ds_len)
474 off -= cb->datadma->dm_segs[i].ds_len;
480 while (i < cb->datadma->dm_nsegs) {
483 (cb->datadma->dm_segs[i].ds_len - off));
485 htole32(cb->datadma->dm_segs[i].ds_addr +
497 while (i < cb->datadma->dm_nsegs) {
500 (cb->datadma->dm_segs[i].ds_len - off));
502 htole32(cb->datadma->dm_segs[i].ds_addr +
521 OOSIOP_XFERSCR_SYNC(sc, cb,
531 struct oosiop_cb *cb;
534 cb = sc->sc_curcb;
535 xferbase = cb->xferdma->dm_segs[0].ds_addr;
539 oosiop_fixup_select(sc, Ent_p_select, cb->id);
548 oosiop_fixup_move(sc, Ent_p_msgout_move, cb->msgoutlen, xferbase +
552 oosiop_fixup_move(sc, Ent_p_cmdout_move, cb->xs->cmdlen,
553 cb->cmddma->dm_segs[0].ds_addr);
587 struct oosiop_cb *cb;
591 cb = sc->sc_curcb;
592 if (cb == NULL)
599 n = dsp - cb->xferdma->dm_segs[0].ds_addr - 8;
604 OOSIOP_DINSCR_SYNC(sc, cb,
607 len += le32toh(cb->xfer->datain_scr[i * 2]) &
609 OOSIOP_DINSCR_SYNC(sc, cb,
616 OOSIOP_DOUTSCR_SYNC(sc, cb,
619 len += le32toh(cb->xfer->dataout_scr[i * 2]) &
621 OOSIOP_DOUTSCR_SYNC(sc, cb,
631 if ((sc->sc_tgt[cb->id].sxfer != 0) &&
646 cb->curdp += len;
647 oosiop_setup_sgdma(sc, cb);
732 struct oosiop_cb *cb;
744 cb = TAILQ_FIRST(&sc->sc_free_cb);
745 TAILQ_REMOVE(&sc->sc_free_cb, cb, chain);
748 cb->xs = xs;
749 cb->flags = 0;
750 cb->id = xs->xs_periph->periph_target;
751 cb->lun = xs->xs_periph->periph_lun;
752 cb->curdp = 0;
753 cb->savedp = 0;
754 xfer = cb->xfer;
757 err = bus_dmamap_load(sc->sc_dmat, cb->cmddma, xs->cmd,
764 TAILQ_INSERT_TAIL(&sc->sc_free_cb, cb, chain);
768 bus_dmamap_sync(sc->sc_dmat, cb->cmddma, 0, xs->cmdlen,
773 err = bus_dmamap_load(sc->sc_dmat, cb->datadma,
784 bus_dmamap_unload(sc->sc_dmat, cb->cmddma);
785 TAILQ_INSERT_TAIL(&sc->sc_free_cb, cb, chain);
789 bus_dmamap_sync(sc->sc_dmat, cb->datadma,
794 oosiop_setup_sgdma(sc, cb);
797 OOSIOP_XFERMSG_SYNC(sc, cb,
799 xfer->msgout[0] = MSG_IDENTIFY(cb->lun,
801 cb->msgoutlen = 1;
803 if (sc->sc_tgt[cb->id].flags & TGTF_SYNCNEG) {
810 cb->msgoutlen = 6;
811 sc->sc_tgt[cb->id].flags &= ~TGTF_SYNCNEG;
812 sc->sc_tgt[cb->id].flags |= TGTF_WAITSDTR;
817 OOSIOP_XFERMSG_SYNC(sc, cb,
822 TAILQ_INSERT_TAIL(&sc->sc_cbq, cb, chain);
855 oosiop_done(struct oosiop_softc *sc, struct oosiop_cb *cb)
859 xs = cb->xs;
860 if (cb == sc->sc_curcb)
862 if (cb == sc->sc_lastcb)
864 sc->sc_tgt[cb->id].nexus = NULL;
868 bus_dmamap_sync(sc->sc_dmat, cb->cmddma, 0, xs->cmdlen,
870 bus_dmamap_unload(sc->sc_dmat, cb->cmddma);
873 bus_dmamap_sync(sc->sc_dmat, cb->datadma, 0, xs->datalen,
875 bus_dmamap_unload(sc->sc_dmat, cb->datadma);
878 xs->status = cb->xfer->status;
881 if (cb->flags & CBF_SELTOUT)
883 else if (cb->flags & CBF_TIMEOUT)
907 TAILQ_INSERT_TAIL(&sc->sc_free_cb, cb, chain);
913 struct oosiop_cb *cb;
918 cb = arg;
919 periph = cb->xs->xs_periph;
926 cb->flags |= CBF_TIMEOUT;
927 oosiop_done(sc, cb);
1017 struct oosiop_cb *cb;
1130 cb = sc->sc_curcb = TAILQ_FIRST(&sc->sc_cbq);
1131 TAILQ_REMOVE(&sc->sc_cbq, cb, chain);
1132 sc->sc_tgt[cb->id].nexus = cb;
1136 sc->sc_lastcb = cb;
1140 if ((cb->xs->xs_control & XS_CTL_POLL) == 0) {
1141 timeout = mstohz(cb->xs->timeout) + 1;
1142 callout_reset(&cb->xs->xs_callout, timeout,
1143 oosiop_timeout, cb);
1158 struct oosiop_cb *cb;
1164 cb = sc->sc_curcb;
1169 if (cb)
1170 oosiop_done(sc, cb);
1174 if (cb)
1175 oosiop_msgin(sc, cb);
1183 cb->xferdma->dm_segs[0].ds_addr +
1203 if (cb) {
1205 sc->sc_tgt[cb->id].nexus = NULL;
1206 TAILQ_INSERT_HEAD(&sc->sc_cbq, cb, chain);
1213 cb = sc->sc_tgt[sc->sc_resid].nexus;
1215 if (MSG_ISIDENTIFY(resmsg) && cb &&
1216 (resmsg & MSG_IDENTIFY_LUNMASK) == cb->lun) {
1217 sc->sc_curcb = cb;
1218 if (cb != sc->sc_lastcb) {
1221 sc->sc_lastcb = cb;
1223 if (cb->curdp != cb->savedp) {
1224 cb->curdp = cb->savedp;
1225 oosiop_setup_sgdma(sc, cb);
1269 oosiop_msgin(struct oosiop_softc *sc, struct oosiop_cb *cb)
1274 xfer = cb->xfer;
1278 OOSIOP_XFERMSG_SYNC(sc, cb,
1285 if (sc->sc_tgt[cb->id].flags & TGTF_WAITSDTR) {
1287 sc->sc_tgt[cb->id].flags &= ~TGTF_WAITSDTR;
1299 cb->msgoutlen = 5;
1302 oosiop_set_syncparam(sc, cb->id, (int)xfer->msgin[3],
1310 cb->msgoutlen = 1;
1317 cb->savedp = cb->curdp;
1321 if (cb->curdp != cb->savedp) {
1322 cb->curdp = cb->savedp;
1323 oosiop_setup_sgdma(sc, cb);
1328 if (sc->sc_tgt[cb->id].flags & TGTF_WAITSDTR) {
1330 sc->sc_tgt[cb->id].flags &= ~TGTF_WAITSDTR;
1331 oosiop_set_syncparam(sc, cb->id, 0, 0);
1339 cb->msgoutlen = 1;
1343 OOSIOP_XFERMSG_SYNC(sc, cb,
1348 oosiop_fixup_move(sc, Ent_p_msgout_move, cb->msgoutlen,
1349 cb->xferdma->dm_segs[0].ds_addr +