Home | History | Annotate | Download | only in ic

Lines Matching defs:ccb

209 static void		mfi_xscale_post(struct mfi_softc *sc, struct mfi_ccb *ccb);
224 static void mfi_ppc_post(struct mfi_softc *sc, struct mfi_ccb *ccb);
239 void mfi_gen2_post(struct mfi_softc *sc, struct mfi_ccb *ccb);
299 struct mfi_ccb *ccb;
303 ccb = TAILQ_FIRST(&sc->sc_ccb_freeq);
304 if (ccb) {
305 TAILQ_REMOVE(&sc->sc_ccb_freeq, ccb, ccb_link);
306 ccb->ccb_state = MFI_CCB_READY;
310 DNPRINTF(MFI_D_CCB, "%s: mfi_get_ccb: %p\n", DEVNAME(sc), ccb);
311 if (__predict_false(ccb == NULL && sc->sc_running))
312 aprint_error_dev(sc->sc_dev, "out of ccb\n");
314 return ccb;
318 mfi_put_ccb(struct mfi_ccb *ccb)
320 struct mfi_softc *sc = ccb->ccb_sc;
321 struct mfi_frame_header *hdr = &ccb->ccb_frame->mfr_header;
324 DNPRINTF(MFI_D_CCB, "%s: mfi_put_ccb: %p\n", DEVNAME(sc), ccb);
328 ccb->ccb_state = MFI_CCB_FREE;
329 ccb->ccb_xs = NULL;
330 ccb->ccb_flags = 0;
331 ccb->ccb_done = NULL;
332 ccb->ccb_direction = 0;
333 ccb->ccb_frame_size = 0;
334 ccb->ccb_extra_frames = 0;
335 ccb->ccb_sgl = NULL;
336 ccb->ccb_data = NULL;
337 ccb->ccb_len = 0;
340 int index = ccb->ccb_tb_request_desc.header.SMID;
341 ccb->ccb_tb_request_desc.words = 0;
342 ccb->ccb_tb_request_desc.header.SMID = index;
345 TAILQ_INSERT_TAIL(&sc->sc_ccb_freeq, ccb, ccb_link);
352 struct mfi_ccb *ccb;
358 for (i = 0; (ccb = mfi_get_ccb(sc)) != NULL; i++) {
360 bus_dmamap_destroy(sc->sc_datadmat, ccb->ccb_dmamap);
374 struct mfi_ccb *ccb;
400 ccb = &sc->sc_ccb[i];
402 ccb->ccb_sc = sc;
405 ccb->ccb_frame = (union mfi_frame *)
407 ccb->ccb_pframe =
409 ccb->ccb_frame->mfr_header.mfh_context = i;
412 ccb->ccb_sense = (struct mfi_sense *)
414 ccb->ccb_psense =
420 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ccb->ccb_dmamap);
423 "cannot create ccb dmamap (%d)\n", error);
428 ccb->ccb_tb_io_request =
431 ccb->ccb_tb_pio_request =
434 ccb->ccb_tb_sg_frame =
437 ccb->ccb_tb_psg_frame = sc->sc_sg_frame_busaddr +
440 ccb->ccb_tb_request_desc.header.SMID = i + 1;
444 "ccb(%d): %p frame: %p (%#lx) sense: %p (%#lx) map: %p\n",
445 ccb->ccb_frame->mfr_header.mfh_context, ccb,
446 ccb->ccb_frame, (u_long)ccb->ccb_pframe,
447 ccb->ccb_sense, (u_long)ccb->ccb_psense,
448 ccb->ccb_dmamap);
450 /* add ccb to queue */
451 mfi_put_ccb(ccb);
456 /* free dma maps and ccb memory */
459 ccb = &sc->sc_ccb[i];
460 bus_dmamap_destroy(sc->sc_datadmat, ccb->ccb_dmamap);
635 struct mfi_ccb *ccb;
641 if ((ccb = mfi_get_ccb(sc)) == NULL)
644 init = &ccb->ccb_frame->mfr_init;
658 init->mif_qinfo_new_addr_lo = htole32(ccb->ccb_pframe + MFI_FRAME_SIZE);
665 if (mfi_poll(ccb)) {
671 mfi_put_ccb(ccb);
1159 aprint_error_dev(sc->sc_dev, "could not init ccb list\n");
1288 mfi_poll(struct mfi_ccb *ccb)
1290 struct mfi_softc *sc = ccb->ccb_sc;
1297 hdr = &ccb->ccb_frame->mfr_header;
1303 ccb->ccb_done = NULL;
1305 mfi_post(sc, ccb);
1313 while (ccb->ccb_state != MFI_CCB_DONE) {
1323 ccb->ccb_pframe - MFIMEM_DVA(sc->sc_frames),
1333 ccb->ccb_pframe - MFIMEM_DVA(sc->sc_frames),
1338 ccb->ccb_pframe - MFIMEM_DVA(sc->sc_frames),
1341 if (ccb->ccb_data != NULL) {
1344 bus_dmamap_sync(sc->sc_datadmat, ccb->ccb_dmamap, 0,
1345 ccb->ccb_dmamap->dm_mapsize,
1346 (ccb->ccb_direction & MFI_DATA_IN) ?
1349 bus_dmamap_unload(sc->sc_datadmat, ccb->ccb_dmamap);
1353 aprint_error_dev(sc->sc_dev, "timeout on ccb %d\n",
1355 ccb->ccb_flags |= MFI_CCB_F_ERR;
1367 struct mfi_ccb *ccb;
1397 ccb = &sc->sc_ccb[ctx];
1401 ccb->ccb_pframe - MFIMEM_DVA(sc->sc_frames),
1404 ccb->ccb_done(ccb);
1422 mfi_scsi_ld_io(struct mfi_ccb *ccb, struct scsipi_xfer *xs, uint64_t blockno,
1435 io = &ccb->ccb_frame->mfr_io;
1438 ccb->ccb_direction = MFI_DATA_IN;
1441 ccb->ccb_direction = MFI_DATA_OUT;
1450 io->mif_sense_addr_lo = htole32(ccb->ccb_psense);
1453 ccb->ccb_done = mfi_scsi_ld_done;
1454 ccb->ccb_xs = xs;
1455 ccb->ccb_frame_size = MFI_IO_FRAME_SIZE;
1456 ccb->ccb_sgl = &io->mif_sgl;
1457 ccb->ccb_data = xs->data;
1458 ccb->ccb_len = xs->datalen;
1460 if (mfi_create_sgl(ccb, (xs->xs_control & XS_CTL_NOSLEEP) ?
1468 mfi_scsi_ld_done(struct mfi_ccb *ccb)
1470 struct mfi_frame_header *hdr = &ccb->ccb_frame->mfr_header;
1471 mfi_scsi_xs_done(ccb, hdr->mfh_cmd_status, hdr->mfh_scsi_status);
1475 mfi_scsi_xs_done(struct mfi_ccb *ccb, int status, int scsi_status)
1477 struct scsipi_xfer *xs = ccb->ccb_xs;
1478 struct mfi_softc *sc = ccb->ccb_sc;
1481 DEVNAME(sc), ccb, ccb->ccb_frame);
1486 bus_dmamap_sync(sc->sc_datadmat, ccb->ccb_dmamap, 0,
1487 ccb->ccb_dmamap->dm_mapsize,
1491 bus_dmamap_unload(sc->sc_datadmat, ccb->ccb_dmamap);
1501 ccb->ccb_psense - MFIMEM_DVA(sc->sc_sense),
1506 &xs->sense, ccb->ccb_sense);
1508 memcpy(&xs->sense, ccb->ccb_sense,
1518 mfi_put_ccb(ccb);
1523 mfi_scsi_ld(struct mfi_ccb *ccb, struct scsipi_xfer *xs)
1532 pf = &ccb->ccb_frame->mfr_pass;
1542 pf->mpf_sense_addr_lo = htole32(ccb->ccb_psense);
1547 ccb->ccb_done = mfi_scsi_ld_done;
1548 ccb->ccb_xs = xs;
1549 ccb->ccb_frame_size = MFI_PASS_FRAME_SIZE;
1550 ccb->ccb_sgl = &pf->mpf_sgl;
1553 ccb->ccb_direction = (xs->xs_control & XS_CTL_DATA_IN) ?
1556 ccb->ccb_direction = MFI_DATA_NONE;
1559 ccb->ccb_data = xs->data;
1560 ccb->ccb_len = xs->datalen;
1562 if (mfi_create_sgl(ccb, (xs->xs_control & XS_CTL_NOSLEEP) ?
1578 struct mfi_ccb *ccb;
1636 if ((ccb = mfi_get_ccb(sc)) == NULL) {
1637 DNPRINTF(MFI_D_CMD, "%s: mfi_scsipi_request no ccb\n", DEVNAME(sc));
1651 if (sc->sc_iop->mio_ld_io(ccb, xs, blockno, blockcnt)) {
1661 if (sc->sc_iop->mio_ld_io(ccb, xs, blockno, blockcnt)) {
1671 if (sc->sc_iop->mio_ld_io(ccb, xs, blockno, blockcnt)) {
1681 if (sc->sc_iop->mio_ld_io(ccb, xs, blockno, blockcnt)) {
1690 if (mfi_mgmt(ccb, xs,
1705 if (mfi_scsi_ld(ccb, xs)) {
1714 if (mfi_poll(ccb)) {
1715 /* XXX check for sense in ccb->ccb_sense? */
1728 DEVNAME(sc), ccb->ccb_dmamap->dm_nsegs);
1733 mfi_put_ccb(ccb);
1739 mfi_post(sc, ccb);
1742 ccb->ccb_dmamap->dm_nsegs);
1748 mfi_put_ccb(ccb);
1755 mfi_create_sgl(struct mfi_ccb *ccb, int flags)
1757 struct mfi_softc *sc = ccb->ccb_sc;
1764 ccb->ccb_data);
1766 if (!ccb->ccb_data)
1770 error = bus_dmamap_load(sc->sc_datadmat, ccb->ccb_dmamap,
1771 ccb->ccb_data, ccb->ccb_len, NULL, flags);
1783 hdr = &ccb->ccb_frame->mfr_header;
1784 sgl = ccb->ccb_sgl;
1785 sgd = ccb->ccb_dmamap->dm_segs;
1786 for (i = 0; i < ccb->ccb_dmamap->dm_nsegs; i++) {
1815 if (ccb->ccb_direction == MFI_DATA_IN) {
1817 bus_dmamap_sync(sc->sc_datadmat, ccb->ccb_dmamap, 0,
1818 ccb->ccb_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
1821 bus_dmamap_sync(sc->sc_datadmat, ccb->ccb_dmamap, 0,
1822 ccb->ccb_dmamap->dm_mapsize, BUS_DMASYNC_PREWRITE);
1825 hdr->mfh_sg_count = ccb->ccb_dmamap->dm_nsegs;
1826 ccb->ccb_frame_size += sc->sc_sgl_size * ccb->ccb_dmamap->dm_nsegs;
1827 ccb->ccb_extra_frames = (ccb->ccb_frame_size - 1) / MFI_FRAME_SIZE;
1833 ccb->ccb_frame_size,
1835 ccb->ccb_dmamap->dm_nsegs,
1836 ccb->ccb_extra_frames);
1845 struct mfi_ccb *ccb;
1848 if ((ccb = mfi_get_ccb(sc)) == NULL)
1850 rv = mfi_mgmt(ccb, NULL, opc, dir, len, buf, mbox);
1856 if (mfi_poll(ccb))
1859 mfi_post(sc, ccb);
1863 while (ccb->ccb_state != MFI_CCB_DONE)
1864 tsleep(ccb, PRIBIO, "mfi_mgmt", 0);
1866 if (ccb->ccb_flags & MFI_CCB_F_ERR)
1872 mfi_put_ccb(ccb);
1877 mfi_mgmt(struct mfi_ccb *ccb, struct scsipi_xfer *xs, uint32_t opc,
1882 DNPRINTF(MFI_D_MISC, "%s: mfi_mgmt %#x\n", DEVNAME(ccb->ccb_sc), opc);
1884 dcmd = &ccb->ccb_frame->mfr_dcmd;
1891 ccb->ccb_direction = dir;
1892 ccb->ccb_xs = xs;
1893 ccb->ccb_done = mfi_mgmt_done;
1895 ccb->ccb_frame_size = MFI_DCMD_FRAME_SIZE;
1903 ccb->ccb_data = buf;
1904 ccb->ccb_len = len;
1905 ccb->ccb_sgl = &dcmd->mdf_sgl;
1907 if (mfi_create_sgl(ccb, BUS_DMA_WAITOK))
1914 mfi_mgmt_done(struct mfi_ccb *ccb)
1916 struct scsipi_xfer *xs = ccb->ccb_xs;
1917 struct mfi_softc *sc = ccb->ccb_sc;
1918 struct mfi_frame_header *hdr = &ccb->ccb_frame->mfr_header;
1921 DEVNAME(sc), (u_long)ccb, (u_long)ccb->ccb_frame);
1923 if (ccb->ccb_data != NULL) {
1926 bus_dmamap_sync(sc->sc_datadmat, ccb->ccb_dmamap, 0,
1927 ccb->ccb_dmamap->dm_mapsize,
1928 (ccb->ccb_direction & MFI_DATA_IN) ?
1931 bus_dmamap_unload(sc->sc_datadmat, ccb->ccb_dmamap);
1935 ccb->ccb_flags |= MFI_CCB_F_ERR;
1937 ccb->ccb_state = MFI_CCB_DONE;
1946 mfi_put_ccb(ccb);
1949 wakeup(ccb);
2689 mfi_xscale_post(struct mfi_softc *sc, struct mfi_ccb *ccb)
2692 ccb->ccb_pframe - MFIMEM_DVA(sc->sc_frames),
2695 ccb->ccb_psense - MFIMEM_DVA(sc->sc_sense),
2698 mfi_write(sc, MFI_IQP, (ccb->ccb_pframe >> 3) |
2699 ccb->ccb_extra_frames);
2700 ccb->ccb_state = MFI_CCB_RUNNING;
2739 mfi_ppc_post(struct mfi_softc *sc, struct mfi_ccb *ccb)
2741 mfi_write(sc, MFI_IQP, 0x1 | ccb->ccb_pframe |
2742 (ccb->ccb_extra_frames << 1));
2743 ccb->ccb_state = MFI_CCB_RUNNING;
2782 mfi_gen2_post(struct mfi_softc *sc, struct mfi_ccb *ccb)
2784 mfi_write(sc, MFI_IQP, 0x1 | ccb->ccb_pframe |
2785 (ccb->ccb_extra_frames << 1));
2786 ccb->ccb_state = MFI_CCB_RUNNING;
2823 mfi_skinny_post(struct mfi_softc *sc, struct mfi_ccb *ccb)
2825 mfi_write(sc, MFI_IQPL, 0x1 | ccb->ccb_pframe |
2826 (ccb->ccb_extra_frames << 1));
2828 ccb->ccb_state = MFI_CCB_RUNNING;
2874 mfi_tbolt_post(struct mfi_softc *sc, struct mfi_ccb *ccb)
2877 if ((ccb->ccb_flags & MFI_CCB_F_TBOLT) == 0)
2878 mfi_tbolt_build_mpt_ccb(ccb);
2880 ccb->ccb_tb_request_desc.words & 0xFFFFFFFF);
2882 ccb->ccb_tb_request_desc.words >> 32);
2883 ccb->ccb_state = MFI_CCB_RUNNING;
2886 uint64_t bus_add = ccb->ccb_pframe;
2891 ccb->ccb_state = MFI_CCB_RUNNING;
2895 mfi_tbolt_build_mpt_ccb(struct mfi_ccb *ccb)
2897 union mfi_mpi2_request_descriptor *req_desc = &ccb->ccb_tb_request_desc;
2898 struct mfi_mpi2_request_raid_scsi_io *io_req = ccb->ccb_tb_io_request;
2909 mpi25_ieee_chain->Address = ccb->ccb_pframe;
2923 ccb->ccb_flags |= MFI_CCB_F_TBOLT;
2924 bus_dmamap_sync(ccb->ccb_sc->sc_dmat,
2925 MFIMEM_MAP(ccb->ccb_sc->sc_tbolt_reqmsgpool),
2926 ccb->ccb_tb_pio_request -
2927 MFIMEM_DVA(ccb->ccb_sc->sc_tbolt_reqmsgpool),
2988 struct mfi_ccb *ccb;
3004 if ((ccb = mfi_get_ccb(sc)) == NULL) {
3010 mfi_init = &ccb->ccb_frame->mfr_init;
3059 if (mfi_poll(ccb) != 0) {
3062 (uint64_t)ccb->ccb_pframe);
3071 mfi_put_ccb(ccb);
3097 struct mfi_ccb *ccb;
3123 ccb = &sc->sc_ccb[smid - 1];
3126 "desc %#" PRIx64 " ccb %p\n", DEVNAME(sc), smid,
3127 sc->sc_last_reply_idx, desc->words, ccb);
3128 KASSERT(ccb->ccb_state == MFI_CCB_RUNNING);
3129 if (ccb->ccb_flags & MFI_CCB_F_TBOLT_IO &&
3130 ccb->ccb_tb_io_request->ChainOffset != 0) {
3133 ccb->ccb_tb_psg_frame -
3137 if (ccb->ccb_flags & MFI_CCB_F_TBOLT_IO) {
3140 ccb->ccb_tb_pio_request -
3145 if (ccb->ccb_done)
3146 ccb->ccb_done(ccb);
3148 ccb->ccb_state = MFI_CCB_DONE;
3174 mfi_tbolt_scsi_ld_io(struct mfi_ccb *ccb, struct scsipi_xfer *xs,
3188 ccb->ccb_done = mfi_tbolt_scsi_ld_done;
3189 ccb->ccb_xs = xs;
3190 ccb->ccb_data = xs->data;
3191 ccb->ccb_len = xs->datalen;
3193 io_req = ccb->ccb_tb_io_request;
3207 ccb->ccb_tb_request_desc.header.RequestFlags =
3213 ccb->ccb_direction = MFI_DATA_IN;
3216 ccb->ccb_direction = MFI_DATA_OUT;
3219 sge_count = mfi_tbolt_create_sgl(ccb,
3224 KASSERT(sge_count <= ccb->ccb_sc->sc_max_sgl);
3230 io_req->SenseBufferLowAddress = htole32(ccb->ccb_psense);
3233 ccb->ccb_flags |= MFI_CCB_F_TBOLT | MFI_CCB_F_TBOLT_IO;
3234 bus_dmamap_sync(ccb->ccb_sc->sc_dmat,
3235 MFIMEM_MAP(ccb->ccb_sc->sc_tbolt_reqmsgpool),
3236 ccb->ccb_tb_pio_request -
3237 MFIMEM_DVA(ccb->ccb_sc->sc_tbolt_reqmsgpool),
3246 mfi_tbolt_scsi_ld_done(struct mfi_ccb *ccb)
3248 struct mfi_mpi2_request_raid_scsi_io *io_req = ccb->ccb_tb_io_request;
3249 mfi_scsi_xs_done(ccb, io_req->RaidContext.Status,
3254 mfi_tbolt_create_sgl(struct mfi_ccb *ccb, int flags)
3256 struct mfi_softc *sc = ccb->ccb_sc;
3263 (u_long)ccb->ccb_data);
3265 if (!ccb->ccb_data)
3269 error = bus_dmamap_load(sc->sc_datadmat, ccb->ccb_dmamap,
3270 ccb->ccb_data, ccb->ccb_len, NULL, flags);
3281 io_req = ccb->ccb_tb_io_request;
3283 sge_count = ccb->ccb_dmamap->dm_nsegs;
3284 sgd = ccb->ccb_dmamap->dm_segs;
3295 sge_idx, sge_count, (uintmax_t)ccb->ccb_tb_pio_request);
3324 sg_chain->Address = ccb->ccb_tb_psg_frame;
3329 sgl_ptr = &ccb->ccb_tb_sg_frame->IeeeChain.Chain64;
3342 ccb->ccb_tb_psg_frame - MFIMEM_DVA(sc->sc_tbolt_reqmsgpool),
3346 if (ccb->ccb_direction == MFI_DATA_IN) {
3347 bus_dmamap_sync(sc->sc_datadmat, ccb->ccb_dmamap, 0,
3348 ccb->ccb_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
3350 bus_dmamap_sync(sc->sc_datadmat, ccb->ccb_dmamap, 0,
3351 ccb->ccb_dmamap->dm_mapsize, BUS_DMASYNC_PREWRITE);
3393 struct mfi_ccb *ccb = NULL;
3425 if ((ccb = mfi_get_ccb(sc)) == NULL) {
3429 sc->sc_ldsync_ccb = ccb;
3434 if (mfi_mgmt(ccb, NULL, MR_DCMD_LD_MAP_GET_INFO, MFI_DATA_OUT,
3443 ccb->ccb_done = mfi_sync_map_complete;
3445 mfi_post(sc, ccb);
3452 if (ccb)
3453 mfi_put_ccb(ccb);
3461 mfi_sync_map_complete(struct mfi_ccb *ccb)
3463 struct mfi_softc *sc = ccb->ccb_sc;
3467 DEVNAME(ccb->ccb_sc));
3468 KASSERT(sc->sc_ldsync_ccb == ccb);
3469 mfi_mgmt_done(ccb);
3470 free(ccb->ccb_data, M_DEVBUF);
3471 if (ccb->ccb_flags & MFI_CCB_F_ERR) {
3475 mfi_put_ccb(ccb);
3507 struct mfi_ccb *ccb = NULL;
3532 if ((ccb = mfi_get_ccb(sc)) == NULL)
3534 ccb->ccb_data = NULL;
3535 ctx = ccb->ccb_frame->mfr_header.mfh_context;
3536 memcpy(ccb->ccb_frame, ioc->mfi_frame.raw,
3537 sizeof(*ccb->ccb_frame));
3538 ccb->ccb_frame->mfr_header.mfh_context = ctx;
3539 ccb->ccb_frame->mfr_header.mfh_scsi_status = 0;
3540 ccb->ccb_frame->mfr_header.mfh_pad0 = 0;
3541 ccb->ccb_frame_size =
3545 ccb->ccb_sgl = (union mfi_sgl *)
3546 &ccb->ccb_frame->mfr_bytes[ioc->mfi_sgl_off];
3548 if (ccb->ccb_frame->mfr_header.mfh_flags & MFI_FRAME_DIR_READ)
3549 ccb->ccb_direction = MFI_DATA_IN;
3550 if (ccb->ccb_frame->mfr_header.mfh_flags & MFI_FRAME_DIR_WRITE)
3551 ccb->ccb_direction = MFI_DATA_OUT;
3552 ccb->ccb_len = ccb->ccb_frame->mfr_header.mfh_data_len;
3553 if (ccb->ccb_len > MAXPHYS) {
3557 if (ccb->ccb_len &&
3558 (ccb->ccb_direction & (MFI_DATA_IN | MFI_DATA_OUT)) != 0) {
3559 udata = malloc(ccb->ccb_len, M_DEVBUF, M_WAITOK|M_ZERO);
3564 ccb->ccb_data = udata;
3565 if (ccb->ccb_direction & MFI_DATA_OUT) {
3575 if (mfi_create_sgl(ccb, BUS_DMA_WAITOK)) {
3580 if (ccb->ccb_frame->mfr_header.mfh_cmd == MFI_CMD_PD_SCSI_IO) {
3581 ccb->ccb_frame->mfr_io.mif_sense_addr_lo =
3582 htole32(ccb->ccb_psense);
3583 ccb->ccb_frame->mfr_io.mif_sense_addr_hi = 0;
3585 ccb->ccb_done = mfi_mgmt_done;
3586 mfi_post(sc, ccb);
3587 while (ccb->ccb_state != MFI_CCB_DONE)
3588 tsleep(ccb, PRIBIO, "mfi_fioc", 0);
3590 if (ccb->ccb_direction & MFI_DATA_IN) {
3591 udata = ccb->ccb_data;
3606 error = copyout(ccb->ccb_sense,
3612 memcpy(ioc->mfi_frame.raw, ccb->ccb_frame,
3613 sizeof(*ccb->ccb_frame));
3621 if (ccb->ccb_data)
3622 free(ccb->ccb_data, M_DEVBUF);
3623 if (ccb)
3624 mfi_put_ccb(ccb);