Home | History | Annotate | Download | only in ic

Lines Matching defs:ccb

207 	ADW_CCB        *ccb;
211 ccb = &ccbstore[i];
212 if ((error = adw_init_ccb(sc, ccb)) != 0) {
214 "unable to initialize ccb, error = %d\n", error);
217 TAILQ_INSERT_TAIL(&sc->sc_free_ccb, ccb, chain);
225 * A ccb is put onto the free list.
228 adw_free_ccb(ADW_SOFTC *sc, ADW_CCB *ccb)
234 adw_reset_ccb(ccb);
235 TAILQ_INSERT_HEAD(&sc->sc_free_ccb, ccb, chain);
242 adw_reset_ccb(ADW_CCB *ccb)
245 ccb->flags = 0;
250 adw_init_ccb(ADW_SOFTC *sc, ADW_CCB *ccb)
255 * Create the DMA map for this CCB.
260 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ccb->dmamap_xfer);
263 "unable to create CCB DMA map, error = %d\n", error);
271 ccb->hashkey = htole32(sc->sc_dmamap_control->dm_segs[0].ds_addr +
272 ADW_CCB_OFF(ccb));
273 hashnum = CCB_HASH(ccb->hashkey);
274 ccb->nexthash = sc->sc_ccbhash[hashnum];
275 sc->sc_ccbhash[hashnum] = ccb;
276 adw_reset_ccb(ccb);
282 * Get a free ccb
289 ADW_CCB *ccb = 0;
294 ccb = sc->sc_free_ccb.tqh_first;
295 if (ccb != NULL) {
296 TAILQ_REMOVE(&sc->sc_free_ccb, ccb, chain);
297 ccb->flags |= CCB_ALLOC;
300 return (ccb);
305 * Given a physical address, find the ccb that it corresponds to.
311 ADW_CCB *ccb = sc->sc_ccbhash[hashnum];
313 while (ccb) {
314 if (ccb->hashkey == ccb_phys)
316 ccb = ccb->nexthash;
318 return (ccb);
323 * Queue a CCB to be sent to the controller, and send it if possible.
326 adw_queue_ccb(ADW_SOFTC *sc, ADW_CCB *ccb)
330 TAILQ_INSERT_TAIL(&sc->sc_waiting_ccb, ccb, chain);
332 while ((ccb = sc->sc_waiting_ccb.tqh_first) != NULL) {
334 TAILQ_REMOVE(&sc->sc_waiting_ccb, ccb, chain);
335 errcode = AdwExeScsiQueue(sc, &ccb->scsiq);
349 TAILQ_INSERT_TAIL(&sc->sc_pending_ccb, ccb, chain);
351 if ((ccb->xs->xs_control & XS_CTL_POLL) == 0)
352 callout_reset(&ccb->xs->xs_callout,
353 mstohz(ccb->timeout), adw_timeout, ccb);
543 ADW_CCB *ccb;
551 * get a ccb to use. If the transfer
556 ccb = adw_get_ccb(sc);
562 if (ccb == NULL) {
564 printf("unable to allocate ccb\n");
569 ccb->xs = xs;
570 ccb->timeout = xs->timeout;
572 if (adw_build_req(sc, ccb)) {
574 retry = adw_queue_ccb(sc, ccb);
580 adw_free_ccb(sc, ccb);
586 adw_free_ccb(sc, ccb);
595 if (adw_poll(sc, xs, ccb->timeout)) {
596 adw_timeout(ccb);
597 if (adw_poll(sc, xs, ccb->timeout))
598 adw_timeout(ccb);
618 adw_build_req(ADW_SOFTC *sc, ADW_CCB *ccb)
620 struct scsipi_xfer *xs = ccb->xs;
626 scsiqp = &ccb->scsiq;
631 * physical CCB structure.
633 scsiqp->ccb_ptr = ccb->hashkey;
652 scsiqp->vsense_addr = &ccb->scsi_sense;
654 ADW_CCB_OFF(ccb) + offsetof(struct adw_ccb, scsi_sense));
667 ccb->dmamap_xfer, (struct uio *) xs->data,
676 ccb->dmamap_xfer, xs->data, xs->datalen, NULL,
697 adw_free_ccb(sc, ccb);
702 bus_dmamap_sync(dmat, ccb->dmamap_xfer, 0,
703 ccb->dmamap_xfer->dm_mapsize,
712 scsiqp->data_addr = htole32(ccb->dmamap_xfer->dm_segs[0].ds_addr);
713 memset(ccb->sg_block, 0,
715 adw_build_sglist(ccb, scsiqp, ccb->sg_block);
733 adw_build_sglist(ADW_CCB *ccb, ADW_SCSI_REQ_Q *scsiqp, ADW_SG_BLOCK *sg_block)
738 bus_dma_segment_t *sg_list = &ccb->dmamap_xfer->dm_segs[0];
739 int sg_elem_cnt = ccb->dmamap_xfer->dm_nsegs;
743 sg_block_physical_addr = le32toh(ccb->hashkey) +
816 ADW_CCB *ccb = arg;
817 struct scsipi_xfer *xs = ccb->xs;
828 if (ccb->flags & CCB_ABORTED) {
840 } else if (ccb->flags & CCB_ABORTING) {
848 ccb->flags |= CCB_ABORTED;
853 * We cannot abort a CCB, so we can only hope the command
864 ADW_ABORT_CCB(sc, ccb);
872 mstohz(ccb->timeout), adw_timeout, ccb);
881 ccb->flags |= CCB_ABORTING;
886 * We cannot abort a CCB, so we can only hope the command
897 ADW_ABORT_CCB(sc, ccb);
905 mstohz(ccb->timeout), adw_timeout, ccb);
915 ADW_CCB *ccb;
921 while((ccb = TAILQ_LAST(&sc->sc_pending_ccb,
923 callout_stop(&ccb->xs->xs_callout);
924 TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain);
925 xs = ccb->xs;
926 adw_free_ccb(sc, ccb);
1025 ADW_CCB *ccb;
1030 ccb = adw_ccb_phys_kv(sc, scsiq->ccb_ptr);
1032 callout_stop(&ccb->xs->xs_callout);
1034 xs = ccb->xs;
1041 bus_dmamap_sync(dmat, ccb->dmamap_xfer, 0,
1042 ccb->dmamap_xfer->dm_mapsize,
1045 bus_dmamap_unload(dmat, ccb->dmamap_xfer);
1048 if ((ccb->flags & CCB_ALLOC) == 0) {
1049 aprint_error_dev(sc->sc_dev, "exiting ccb not allocated!\n");
1075 s1 = &ccb->scsi_sense;
1136 TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain);
1146 TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain);
1194 TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain);
1195 done: adw_free_ccb(sc, ccb);