Lines Matching refs:ccb

273 	struct bha_ccb *ccb;  in bha_scsipi_request()  local
285 ccb = bha_get_ccb(sc); in bha_scsipi_request()
291 if (ccb == NULL) { in bha_scsipi_request()
298 ccb->xs = xs; in bha_scsipi_request()
299 ccb->timeout = xs->timeout; in bha_scsipi_request()
305 ccb->opcode = BHA_RESET_CCB; in bha_scsipi_request()
306 ccb->scsi_cmd_length = 0; in bha_scsipi_request()
309 if (xs->cmdlen > sizeof(ccb->scsi_cmd)) { in bha_scsipi_request()
315 ccb->opcode = (xs->datalen ? BHA_INIT_SCAT_GATH_CCB in bha_scsipi_request()
317 memcpy(&ccb->scsi_cmd, xs->cmd, in bha_scsipi_request()
318 ccb->scsi_cmd_length = xs->cmdlen); in bha_scsipi_request()
328 ccb->dmamap_xfer, (struct uio *)xs->data, in bha_scsipi_request()
337 ccb->dmamap_xfer, xs->data, xs->datalen, in bha_scsipi_request()
359 bha_free_ccb(sc, ccb); in bha_scsipi_request()
364 bus_dmamap_sync(dmat, ccb->dmamap_xfer, 0, in bha_scsipi_request()
365 ccb->dmamap_xfer->dm_mapsize, in bha_scsipi_request()
373 for (seg = 0; seg < ccb->dmamap_xfer->dm_nsegs; seg++) { in bha_scsipi_request()
374 ltophys(ccb->dmamap_xfer->dm_segs[seg].ds_addr, in bha_scsipi_request()
375 ccb->scat_gath[seg].seg_addr); in bha_scsipi_request()
376 ltophys(ccb->dmamap_xfer->dm_segs[seg].ds_len, in bha_scsipi_request()
377 ccb->scat_gath[seg].seg_len); in bha_scsipi_request()
380 ltophys(ccb->hashkey + offsetof(struct bha_ccb, in bha_scsipi_request()
381 scat_gath), ccb->data_addr); in bha_scsipi_request()
382 ltophys(ccb->dmamap_xfer->dm_nsegs * in bha_scsipi_request()
383 sizeof(struct bha_scat_gath), ccb->data_length); in bha_scsipi_request()
388 ltophys(0, ccb->data_addr); in bha_scsipi_request()
389 ltophys(0, ccb->data_length); in bha_scsipi_request()
393 ccb->tag_enable = 1; in bha_scsipi_request()
394 ccb->tag_type = xs->xs_tag_type & 0x03; in bha_scsipi_request()
396 ccb->tag_enable = 0; in bha_scsipi_request()
397 ccb->tag_type = 0; in bha_scsipi_request()
400 ccb->data_out = 0; in bha_scsipi_request()
401 ccb->data_in = 0; in bha_scsipi_request()
402 ccb->target = periph->periph_target; in bha_scsipi_request()
403 ccb->lun = periph->periph_lun; in bha_scsipi_request()
404 ltophys(ccb->hashkey + offsetof(struct bha_ccb, scsi_sense), in bha_scsipi_request()
405 ccb->sense_ptr); in bha_scsipi_request()
406 ccb->req_sense_length = sizeof(ccb->scsi_sense); in bha_scsipi_request()
407 ccb->host_stat = 0x00; in bha_scsipi_request()
408 ccb->target_stat = 0x00; in bha_scsipi_request()
409 ccb->link_id = 0; in bha_scsipi_request()
410 ltophys(0, ccb->link_addr); in bha_scsipi_request()
412 BHA_CCB_SYNC(sc, ccb, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); in bha_scsipi_request()
415 bha_queue_ccb(sc, ccb); in bha_scsipi_request()
425 if (bha_poll(sc, xs, ccb->timeout)) { in bha_scsipi_request()
426 bha_timeout(ccb); in bha_scsipi_request()
427 if (bha_poll(sc, xs, ccb->timeout)) in bha_scsipi_request()
428 bha_timeout(ccb); in bha_scsipi_request()
585 bha_done(struct bha_softc *sc, struct bha_ccb *ccb) in bha_done() argument
588 struct scsipi_xfer *xs = ccb->xs; in bha_done()
593 if (ccb->flags & CCB_SENDING) { in bha_done()
600 if ((ccb->flags & CCB_ALLOC) == 0) { in bha_done()
611 bus_dmamap_sync(dmat, ccb->dmamap_xfer, 0, in bha_done()
612 ccb->dmamap_xfer->dm_mapsize, in bha_done()
615 bus_dmamap_unload(dmat, ccb->dmamap_xfer); in bha_done()
619 if (ccb->host_stat != BHA_OK) { in bha_done()
620 switch (ccb->host_stat) { in bha_done()
626 device_xname(sc->sc_dev), ccb->host_stat); in bha_done()
630 } else if (ccb->target_stat != SCSI_OK) { in bha_done()
631 switch (ccb->target_stat) { in bha_done()
634 &ccb->scsi_sense, in bha_done()
643 device_xname(sc->sc_dev), ccb->target_stat); in bha_done()
651 bha_free_ccb(sc, ccb); in bha_done()
691 struct bha_ccb *ccb = arg; in bha_timeout() local
692 struct scsipi_xfer *xs = ccb->xs; in bha_timeout()
708 if (ccb->flags & CCB_SENDING) { in bha_timeout()
719 if (ccb->flags & CCB_ABORT) { in bha_timeout()
726 ccb->xs->error = XS_TIMEOUT; in bha_timeout()
727 ccb->timeout = BHA_ABORT_TIMEOUT; in bha_timeout()
728 ccb->flags |= CCB_ABORT; in bha_timeout()
729 bha_queue_ccb(sc, ccb); in bha_timeout()
1411 bha_queue_ccb(struct bha_softc *sc, struct bha_ccb *ccb) in bha_queue_ccb() argument
1414 TAILQ_INSERT_TAIL(&sc->sc_waiting_ccb, ccb, chain); in bha_queue_ccb()
1430 struct bha_ccb *ccb; in bha_start_ccbs() local
1434 while ((ccb = TAILQ_FIRST(&sc->sc_waiting_ccb)) != NULL) { in bha_start_ccbs()
1462 TAILQ_REMOVE(&sc->sc_waiting_ccb, ccb, chain); in bha_start_ccbs()
1464 ccb->flags |= CCB_SENDING; in bha_start_ccbs()
1470 bcg = BHA_CCB_GROUP(ccb); in bha_start_ccbs()
1472 BHA_CCB_OFFSET(ccb), mbo->ccb_addr); in bha_start_ccbs()
1473 if (ccb->flags & CCB_ABORT) in bha_start_ccbs()
1484 if ((ccb->xs->xs_control & XS_CTL_POLL) == 0) in bha_start_ccbs()
1485 callout_reset(&ccb->xs->xs_callout, in bha_start_ccbs()
1486 mstohz(ccb->timeout), bha_timeout, ccb); in bha_start_ccbs()
1504 struct bha_ccb *ccb; in bha_finish_ccbs() local
1537 ccb = bha_ccb_phys_kv(sc, phystol(mbi->ccb_addr)); in bha_finish_ccbs()
1538 if (ccb == NULL) { in bha_finish_ccbs()
1544 BHA_CCB_SYNC(sc, ccb, in bha_finish_ccbs()
1549 u_char *cp = ccb->scsi_cmd; in bha_finish_ccbs()
1554 printf("ccb addr = %p\n", ccb); in bha_finish_ccbs()
1561 if ((ccb->flags & CCB_ABORT) != 0) { in bha_finish_ccbs()
1589 callout_stop(&ccb->xs->xs_callout); in bha_finish_ccbs()
1590 bha_done(sc, ccb); in bha_finish_ccbs()
1594 BHA_CCB_SYNC(sc, ccb, in bha_finish_ccbs()
1688 struct bha_ccb *ccb; in bha_collect_mbo() local
1700 ccb = bha_ccb_phys_kv(sc, phystol(mbo->ccb_addr)); in bha_collect_mbo()
1701 ccb->flags &= ~CCB_SENDING; in bha_collect_mbo()
1716 bha_reset_ccb(struct bha_ccb *ccb) in bha_reset_ccb() argument
1719 ccb->flags = 0; in bha_reset_ccb()
1738 struct bha_ccb *ccb; in bha_create_ccbs() local
1813 ccb = &bcg->bcg_ccbs[i]; in bha_create_ccbs()
1814 TAILQ_INSERT_TAIL(&sc->sc_allocating_ccbs, ccb, chain); in bha_create_ccbs()
1824 ccb = TAILQ_FIRST(&sc->sc_allocating_ccbs); in bha_create_ccbs()
1825 if (ccb == NULL) in bha_create_ccbs()
1827 if (bha_init_ccb(sc, ccb) != 0) { in bha_create_ccbs()
1858 bha_init_ccb(struct bha_softc *sc, struct bha_ccb *ccb) in bha_init_ccb() argument
1860 struct bha_ccb_group *bcg = BHA_CCB_GROUP(ccb); in bha_init_ccb()
1871 &ccb->dmamap_xfer); in bha_init_ccb()
1878 TAILQ_REMOVE(&sc->sc_allocating_ccbs, ccb, chain); in bha_init_ccb()
1883 ccb->hashkey = bcg->bcg_dmamap->dm_segs[0].ds_addr + in bha_init_ccb()
1884 BHA_CCB_OFFSET(ccb); in bha_init_ccb()
1885 hashnum = CCB_HASH(ccb->hashkey); in bha_init_ccb()
1886 ccb->nexthash = sc->sc_ccbhash[hashnum]; in bha_init_ccb()
1887 sc->sc_ccbhash[hashnum] = ccb; in bha_init_ccb()
1888 bha_reset_ccb(ccb); in bha_init_ccb()
1890 TAILQ_INSERT_HEAD(&sc->sc_free_ccb, ccb, chain); in bha_init_ccb()
1905 struct bha_ccb *ccb; in bha_get_ccb() local
1909 ccb = TAILQ_FIRST(&sc->sc_free_ccb); in bha_get_ccb()
1910 if (ccb != NULL) { in bha_get_ccb()
1911 TAILQ_REMOVE(&sc->sc_free_ccb, ccb, chain); in bha_get_ccb()
1912 ccb->flags |= CCB_ALLOC; in bha_get_ccb()
1915 return (ccb); in bha_get_ccb()
1924 bha_free_ccb(struct bha_softc *sc, struct bha_ccb *ccb) in bha_free_ccb() argument
1929 bha_reset_ccb(ccb); in bha_free_ccb()
1930 TAILQ_INSERT_HEAD(&sc->sc_free_ccb, ccb, chain); in bha_free_ccb()
1943 struct bha_ccb *ccb = sc->sc_ccbhash[hashnum]; in bha_ccb_phys_kv() local
1945 while (ccb) { in bha_ccb_phys_kv()
1946 if (ccb->hashkey == ccb_phys) in bha_ccb_phys_kv()
1948 ccb = ccb->nexthash; in bha_ccb_phys_kv()
1950 return (ccb); in bha_ccb_phys_kv()