Lines Matching defs:ccb
168 ADV_CCB *ccb;
173 ccb = &ccbstore[i];
174 if ((error = adv_init_ccb(sc, ccb)) != 0) {
176 "unable to initialize ccb, error = %d\n", error);
179 TAILQ_INSERT_TAIL(&sc->sc_free_ccb, ccb, chain);
187 * A ccb is put onto the free list.
190 adv_free_ccb(ASC_SOFTC *sc, ADV_CCB *ccb)
195 adv_reset_ccb(ccb);
196 TAILQ_INSERT_HEAD(&sc->sc_free_ccb, ccb, chain);
202 adv_reset_ccb(ADV_CCB *ccb)
205 ccb->flags = 0;
210 adv_init_ccb(ASC_SOFTC *sc, ADV_CCB *ccb)
214 callout_init(&ccb->ccb_watchdog, 0);
217 * Create the DMA map for this CCB.
222 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ccb->dmamap_xfer);
233 ccb->hashkey = sc->sc_dmamap_control->dm_segs[0].ds_addr +
234 ADV_CCB_OFF(ccb);
235 hashnum = CCB_HASH(ccb->hashkey);
236 ccb->nexthash = sc->sc_ccbhash[hashnum];
237 sc->sc_ccbhash[hashnum] = ccb;
239 adv_reset_ccb(ccb);
245 * Get a free ccb
252 ADV_CCB *ccb = 0;
256 ccb = TAILQ_FIRST(&sc->sc_free_ccb);
257 if (ccb != NULL) {
258 TAILQ_REMOVE(&sc->sc_free_ccb, ccb, chain);
259 ccb->flags |= CCB_ALLOC;
262 return (ccb);
267 * Given a physical address, find the ccb that it corresponds to.
273 ADV_CCB *ccb = sc->sc_ccbhash[hashnum];
275 while (ccb) {
276 if (ccb->hashkey == ccb_phys)
278 ccb = ccb->nexthash;
280 return (ccb);
285 * Queue a CCB to be sent to the controller, and send it if possible.
288 adv_queue_ccb(ASC_SOFTC *sc, ADV_CCB *ccb)
291 TAILQ_INSERT_TAIL(&sc->sc_waiting_ccb, ccb, chain);
300 ADV_CCB *ccb;
302 while ((ccb = sc->sc_waiting_ccb.tqh_first) != NULL) {
303 if (ccb->flags & CCB_WATCHDOG)
304 callout_stop(&ccb->ccb_watchdog);
306 if (AscExeScsiQueue(sc, &ccb->scsiq) == ASC_BUSY) {
307 ccb->flags |= CCB_WATCHDOG;
308 callout_reset(&ccb->ccb_watchdog,
310 adv_watchdog, ccb);
313 TAILQ_REMOVE(&sc->sc_waiting_ccb, ccb, chain);
315 if ((ccb->xs->xs_control & XS_CTL_POLL) == 0)
316 callout_reset(&ccb->xs->xs_callout,
317 mstohz(ccb->timeout), adv_timeout, ccb);
528 ADV_CCB *ccb;
538 * Get a CCB to use.
540 ccb = adv_get_ccb(sc);
546 if (ccb == NULL) {
548 printf("unable to allocate ccb\n");
553 ccb->xs = xs;
554 ccb->timeout = xs->timeout;
559 memset(&ccb->scsiq, 0, sizeof(ASC_SCSI_Q));
561 ccb->scsiq.q2.ccb_ptr =
563 ADV_CCB_OFF(ccb);
565 ccb->scsiq.cdbptr = &xs->cmd->opcode;
566 ccb->scsiq.q2.cdb_len = xs->cmdlen;
567 ccb->scsiq.q1.target_id =
569 ccb->scsiq.q1.target_lun = periph->periph_lun;
570 ccb->scsiq.q2.target_ix =
573 ccb->scsiq.q1.sense_addr =
575 ADV_CCB_OFF(ccb) + offsetof(struct adv_ccb, scsi_sense);
576 ccb->scsiq.q1.sense_len = sizeof(struct scsi_sense_data);
590 ccb->scsiq.q2.tag_code = M2_QTAG_MSG_ORDERED;
592 ccb->scsiq.q2.tag_code = M2_QTAG_MSG_SIMPLE;
602 ccb->dmamap_xfer, (struct uio *) xs->data,
610 error = bus_dmamap_load(dmat, ccb->dmamap_xfer,
642 adv_free_ccb(sc, ccb);
646 bus_dmamap_sync(dmat, ccb->dmamap_xfer, 0,
647 ccb->dmamap_xfer->dm_mapsize,
651 memset(&ccb->sghead, 0, sizeof(ASC_SG_HEAD));
654 nsegs < ccb->dmamap_xfer->dm_nsegs; nsegs++) {
655 ccb->sghead.sg_list[nsegs].addr =
656 ccb->dmamap_xfer->dm_segs[nsegs].ds_addr;
657 ccb->sghead.sg_list[nsegs].bytes =
658 ccb->dmamap_xfer->dm_segs[nsegs].ds_len;
661 ccb->sghead.entry_cnt = ccb->scsiq.q1.sg_queue_cnt =
662 ccb->dmamap_xfer->dm_nsegs;
664 ccb->scsiq.q1.cntl |= ASC_QC_SG_HEAD;
665 ccb->scsiq.sg_head = &ccb->sghead;
666 ccb->scsiq.q1.data_addr = 0;
667 ccb->scsiq.q1.data_cnt = 0;
672 ccb->scsiq.q1.data_addr = 0;
673 ccb->scsiq.q1.data_cnt = 0;
677 printf("id = %d, lun = %d, cmd = %d, ccb = 0x%lX\n",
680 (unsigned long)ccb);
683 adv_queue_ccb(sc, ccb);
690 if (adv_poll(sc, xs, ccb->timeout)) {
691 adv_timeout(ccb);
692 if (adv_poll(sc, xs, ccb->timeout))
693 adv_timeout(ccb);
780 ADV_CCB *ccb = arg;
781 struct scsipi_xfer *xs = ccb->xs;
796 if (ccb->flags & CCB_ABORT) {
801 ccb->timeout = sc->scsi_reset_wait;
802 adv_queue_ccb(sc, ccb);
807 AscAbortCCB(sc, ccb);
808 ccb->xs->error = XS_TIMEOUT;
809 ccb->timeout = ADV_ABORT_TIMEOUT;
810 ccb->flags |= CCB_ABORT;
811 adv_queue_ccb(sc, ccb);
821 ADV_CCB *ccb = arg;
822 struct scsipi_xfer *xs = ccb->xs;
830 ccb->flags &= ~CCB_WATCHDOG;
851 ADV_CCB *ccb;
856 ccb = adv_ccb_phys_kv(sc, qdonep->d2.ccb_ptr);
857 xs = ccb->xs;
860 printf(" - ccb=0x%lx, id=%d, lun=%d, cmd=%d, ",
861 (unsigned long)ccb,
865 callout_stop(&ccb->xs->xs_callout);
872 bus_dmamap_sync(dmat, ccb->dmamap_xfer, 0,
873 ccb->dmamap_xfer->dm_mapsize,
876 bus_dmamap_unload(dmat, ccb->dmamap_xfer);
878 if ((ccb->flags & CCB_ALLOC) == 0) {
879 aprint_error_dev(sc->sc_dev, "exiting ccb not allocated!\n");
928 s1 = &ccb->scsi_sense;
954 adv_free_ccb(sc, ccb);