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