Home | History | Annotate | Download | only in pci

Lines Matching refs:ccb

558 mfii_dcmd_scrub(struct mfii_ccb *ccb)
560 memset(ccb->ccb_sense, 0, sizeof(*ccb->ccb_sense));
564 mfii_dcmd_frame(struct mfii_ccb *ccb)
566 CTASSERT(sizeof(struct mfi_dcmd_frame) <= sizeof(*ccb->ccb_sense));
567 return ((struct mfi_dcmd_frame *)ccb->ccb_sense);
571 mfii_dcmd_sync(struct mfii_softc *sc, struct mfii_ccb *ccb, int flags)
574 ccbccb->ccb_sense), flags);
853 aprint_error(": could not init ccb list\n");
1116 struct mfii_ccb *ccb;
1124 ccb = mfii_get_ccb(sc);
1125 if (ccb == NULL)
1133 mfii_scrub_ccb(ccb);
1134 if (mfii_do_mgmt(sc, ccb, MR_DCMD_CTRL_CACHE_FLUSH, &mbox,
1144 mfii_scrub_ccb(ccb);
1145 if (mfii_do_mgmt(sc, ccb, MR_DCMD_CTRL_SHUTDOWN, &mbox,
1156 mfii_put_ccb(sc, ccb);
1246 mfii_dcmd_start(struct mfii_softc *sc, struct mfii_ccb *ccb)
1248 struct mpii_msg_scsi_io *io = ccb->ccb_request;
1256 sge->sg_addr = htole64(ccb->ccb_sense_dva);
1257 sge->sg_len = htole32(sizeof(*ccb->ccb_sense));
1260 ccb->ccb_req.flags = MFII_REQ_TYPE_SCSI;
1261 ccb->ccb_req.smid = le16toh(ccb->ccb_smid);
1263 mfii_start(sc, ccb);
1270 struct mfii_ccb *ccb;
1274 ccb = mfii_get_ccb(sc);
1275 if (ccb == NULL) {
1276 printf("%s: unable to allocate ccb for aen\n", DEVNAME(sc));
1281 mfii_scrub_ccb(ccb);
1283 rv = mfii_do_mgmt(sc, ccb, MR_DCMD_CTRL_EVENT_GET_INFO, NULL,
1286 mfii_put_ccb(sc, ccb);
1293 mfii_put_ccb(sc, ccb);
1300 mfii_aen_start(sc, ccb, mdm, le32toh(mel.mel_boot_seq_num));
1306 mfii_aen_start(struct mfii_softc *sc, struct mfii_ccb *ccb,
1309 struct mfi_dcmd_frame *dcmd = mfii_dcmd_frame(ccb);
1314 mfii_scrub_ccb(ccb);
1315 mfii_dcmd_scrub(ccb);
1318 ccb->ccb_cookie = mdm;
1319 ccb->ccb_done = mfii_aen_done;
1320 sc->sc_aen_ccb = ccb;
1339 mfii_dcmd_sync(sc, ccb, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1340 mfii_dcmd_start(sc, ccb);
1344 mfii_aen_done(struct mfii_softc *sc, struct mfii_ccb *ccb)
1346 KASSERT(sc->sc_aen_ccb == ccb);
1361 struct mfii_ccb *ccb = sc->sc_aen_ccb;
1362 struct mfii_dmamem *mdm = ccb->ccb_cookie;
1365 mfii_dcmd_sync(sc, ccb,
1404 mfii_aen_start(sc, ccb, mdm, le32toh(med->med_seq_num) + 1);
1772 ccb)
1774 struct mfi_frame_header *hdr = ccb->ccb_request;
1779 if (ccb->ccb_cookie != NULL || ccb->ccb_done != NULL)
1783 hdr->mfh_context = ccb->ccb_smid;
1787 r = MFII_REQ_MFA(ccb->ccb_request_dva);
1788 memcpy(&ccb->ccb_req, &r, sizeof(ccb->ccb_req));
1795 mfii_start64(sc, ccb);
1799 ccb->ccb_request_offset, MFII_REQUEST_SIZE,
1806 printf("%s: timeout on ccb %d\n", DEVNAME(sc),
1807 ccb->ccb_smid);
1808 ccb->ccb_flags |= MFI_CCB_F_ERR;
1814 ccb->ccb_request_offset, MFII_REQUEST_SIZE,
1820 if (ccb->ccb_len > 0) {
1821 bus_dmamap_sync(sc->sc_dmat, ccb->ccb_dmamap32,
1822 0, ccb->ccb_dmamap32->dm_mapsize,
1823 (ccb->ccb_direction == MFII_DATA_IN) ?
1826 bus_dmamap_unload(sc->sc_dmat, ccb->ccb_dmamap32);
1833 mfii_poll(struct mfii_softc *sc, struct mfii_ccb *ccb)
1839 done = ccb->ccb_done;
1840 cookie = ccb->ccb_cookie;
1842 ccb->ccb_done = mfii_poll_done;
1843 ccb->ccb_cookie = &rv;
1845 mfii_start(sc, ccb);
1852 ccb->ccb_cookie = cookie;
1853 done(sc, ccb);
1859 mfii_poll_done(struct mfii_softc *sc, struct mfii_ccb *ccb)
1861 int *rv = ccb->ccb_cookie;
1867 mfii_exec(struct mfii_softc *sc, struct mfii_ccb *ccb)
1870 if (ccb->ccb_cookie != NULL || ccb->ccb_done != NULL)
1874 ccb->ccb_cookie = ccb;
1875 ccb->ccb_done = mfii_exec_done;
1877 mfii_start(sc, ccb);
1879 mutex_enter(&ccb->ccb_mtx);
1880 while (ccb->ccb_cookie != NULL)
1881 cv_wait(&ccb->ccb_cv, &ccb->ccb_mtx);
1882 mutex_exit(&ccb->ccb_mtx);
1888 mfii_exec_done(struct mfii_softc *sc, struct mfii_ccb *ccb)
1890 mutex_enter(&ccb->ccb_mtx);
1891 ccb->ccb_cookie = NULL;
1892 cv_signal(&ccb->ccb_cv);
1893 mutex_exit(&ccb->ccb_mtx);
1900 struct mfii_ccb *ccb;
1907 ccb = mfii_get_ccb(sc);
1908 if (ccb == NULL)
1911 mfii_scrub_ccb(ccb);
1912 rv = mfii_do_mgmt(sc, ccb, opc, mbox, buf, len, dir, poll);
1913 mfii_put_ccb(sc, ccb);
1919 mfii_do_mgmt(struct mfii_softc *sc, struct mfii_ccb *ccb, uint32_t opc,
1923 struct mpii_msg_scsi_io *io = ccb->ccb_request;
1926 struct mfi_dcmd_frame *dcmd = ccb->ccb_mfi;
1933 ccb->ccb_data = buf;
1934 ccb->ccb_len = len;
1935 ccb->ccb_direction = dir;
1948 if (mfii_load_mfa(sc, ccb, &dcmd->mdf_sgl, poll) != 0) {
1954 hdr->mfh_context = ccb->ccb_smid;
1956 hdr->mfh_sg_count = ccb->ccb_dmamap32->dm_nsegs;
1957 KASSERT(!ccb->ccb_dma64);
1968 sge->sg_addr = htole64(ccb->ccb_mfi_dva);
1972 ccb->ccb_req.flags = MFII_REQ_TYPE_SCSI;
1973 ccb->ccb_req.smid = le16toh(ccb->ccb_smid);
1976 ccb->ccb_done = mfii_empty_done;
1977 mfii_poll(sc, ccb);
1979 mfii_exec(sc, ccb);
1990 mfii_empty_done(struct mfii_softc *sc, struct mfii_ccb *ccb)
1996 mfii_load_mfa(struct mfii_softc *sc, struct mfii_ccb *ccb,
2000 bus_dmamap_t dmap = ccb->ccb_dmamap32;
2004 KASSERT(!ccb->ccb_dma64);
2005 if (ccb->ccb_len == 0)
2009 ccb->ccb_data, ccb->ccb_len, NULL,
2022 ccb->ccb_direction == MFII_DATA_OUT ?
2029 mfii_start(struct mfii_softc *sc, struct mfii_ccb *ccb)
2032 mfii_start_common(sc, ccb,
2037 mfii_start64(struct mfii_softc *sc, struct mfii_ccb *ccb)
2040 mfii_start_common(sc, ccb, false);
2044 mfii_start_common(struct mfii_softc *sc, struct mfii_ccb *ccb, bool do32)
2046 uint32_t *r = (uint32_t *)&ccb->ccb_req;
2049 ccb->ccb_request_offset, MFII_REQUEST_SIZE,
2072 mfii_done(struct mfii_softc *sc, struct mfii_ccb *ccb)
2075 ccb->ccb_request_offset, MFII_REQUEST_SIZE,
2078 if (ccb->ccb_sgl_len > 0) {
2080 ccb->ccb_sgl_offset, ccb->ccb_sgl_len,
2084 if (ccb->ccb_dma64) {
2085 KASSERT(ccb->ccb_len > 0);
2086 bus_dmamap_sync(sc->sc_dmat64, ccb->ccb_dmamap64,
2087 0, ccb->ccb_dmamap64->dm_mapsize,
2088 (ccb->ccb_direction == MFII_DATA_IN) ?
2091 bus_dmamap_unload(sc->sc_dmat64, ccb->ccb_dmamap64);
2092 } else if (ccb->ccb_len > 0) {
2093 bus_dmamap_sync(sc->sc_dmat, ccb->ccb_dmamap32,
2094 0, ccb->ccb_dmamap32->dm_mapsize,
2095 (ccb->ccb_direction == MFII_DATA_IN) ?
2098 bus_dmamap_unload(sc->sc_dmat, ccb->ccb_dmamap32);
2101 ccb->ccb_done(sc, ccb);
2109 struct mfii_ccb *ccb;
2149 ccb = mfii_get_ccb(sc);
2150 if (ccb == NULL) {
2154 mfii_scrub_ccb(ccb);
2155 init = ccb->ccb_request;
2169 rv = mfii_mfa_poll(sc, ccb);
2174 mfii_put_ccb(sc, ccb);
2215 struct mfii_ccb *ccb;
2241 ccb = &sc->sc_ccb[le16toh(rdp->smid) - 1];
2242 SIMPLEQ_INSERT_TAIL(&ccbs, ccb, ccb_link);
2259 while ((ccb = SIMPLEQ_FIRST(&ccbs)) != NULL) {
2261 mfii_done(sc, ccb);
2273 struct mfii_ccb *ccb;
2315 ccb = mfii_get_ccb(sc);
2316 if (ccb == NULL) {
2321 mfii_scrub_ccb(ccb);
2322 ccb->ccb_cookie = xs;
2323 ccb->ccb_done = mfii_scsi_cmd_done;
2324 ccb->ccb_data = xs->data;
2325 ccb->ccb_len = xs->datalen;
2330 callout_reset(&xs->xs_callout, timeout, mfii_scsi_cmd_tmo, ccb);
2341 if (mfii_scsi_cmd_io(sc, ccb, xs) != 0)
2346 if (mfii_scsi_cmd_cdb(sc, ccb, xs) != 0)
2358 if (mfii_poll(sc, ccb) != 0)
2363 mfii_start(sc, ccb);
2370 mfii_put_ccb(sc, ccb);
2374 mfii_scsi_cmd_done(struct mfii_softc *sc, struct mfii_ccb *ccb)
2376 struct scsipi_xfer *xs = ccb->ccb_cookie;
2377 struct mpii_msg_scsi_io *io = ccb->ccb_request;
2390 memcpy(&xs->sense, ccb->ccb_sense, sizeof(xs->sense));
2404 mfii_put_ccb(sc, ccb);
2408 mfii_scsi_cmd_io(struct mfii_softc *sc, struct mfii_ccb *ccb,
2412 struct mpii_msg_scsi_io *io = ccb->ccb_request;
2419 io->sense_buffer_low_address = htole32(ccb->ccb_sense_dva);
2427 ccb->ccb_direction = MFII_DATA_IN;
2431 ccb->ccb_direction = MFII_DATA_OUT;
2435 ccb->ccb_direction = MFII_DATA_NONE;
2446 if (mfii_load_ccb(sc, ccb, ctx + 1,
2450 KASSERT(ccb->ccb_len == 0 || ccb->ccb_dma64);
2451 segs = (ccbccb->ccb_dmamap64->dm_nsegs;
2462 ccb->ccb_req.flags = sc->sc_iop->ldio_req_type;
2463 ccb->ccb_req.smid = le16toh(ccb->ccb_smid);
2469 mfii_scsi_cmd_cdb(struct mfii_softc *sc, struct mfii_ccb *ccb,
2473 struct mpii_msg_scsi_io *io = ccb->ccb_request;
2480 io->sense_buffer_low_address = htole32(ccb->ccb_sense_dva);
2489 ccb->ccb_direction = MFII_DATA_IN;
2493 ccb->ccb_direction = MFII_DATA_OUT;
2497 ccb->ccb_direction = MFII_DATA_NONE;
2505 if (mfii_load_ccb(sc, ccb, ctx + 1,
2509 ctx->num_sge = (ccb->ccb_len == 0) ? 0 : ccb->ccb_dmamap64->dm_nsegs;
2510 KASSERT(ccb->ccb_len == 0 || ccb->ccb_dma64);
2512 ccb->ccb_req.flags = MFII_REQ_TYPE_SCSI;
2513 ccb->ccb_req.smid = le16toh(ccb->ccb_smid);
2524 struct mfii_ccb *ccb = xs->io;
2526 mfii_scrub_ccb(ccb);
2527 ccb->ccb_cookie = xs;
2528 ccb->ccb_done = mfii_scsi_cmd_done;
2529 ccb->ccb_data = xs->data;
2530 ccb->ccb_len = xs->datalen;
2541 if (mfii_poll(sc, ccb) != 0)
2547 mfii_start(sc, ccb);
2583 mfii_pd_scsi_cmd_cdb(struct mfii_softc *sc, struct mfii_ccb *ccb,
2587 struct mpii_msg_scsi_io *io = ccb->ccb_request;
2597 io->sense_buffer_low_address = htole32(ccb->ccb_sense_dva);
2606 ccb->ccb_direction = MFII_DATA_IN;
2610 ccb->ccb_direction = MFII_DATA_OUT;
2614 ccb->ccb_direction = MFII_DATA_NONE;
2624 if (mfii_load_ccb(sc, ccb, ctx + 1,
2628 ctx->num_sge = (ccb->ccb_len == 0) ? 0 : ccb->ccb_dmamap64->dm_nsegs;
2629 KASSERT(ccb->ccb_dma64);
2631 ccb->ccb_req.flags = MFII_REQ_TYPE_HI_PRI;
2632 ccb->ccb_req.smid = le16toh(ccb->ccb_smid);
2633 ccb->ccb_req.dev_handle = dev_handle;
2640 mfii_load_ccb(struct mfii_softc *sc, struct mfii_ccb *ccb, void *sglp,
2643 struct mpii_msg_request *req = ccb->ccb_request;
2646 bus_dmamap_t dmap = ccb->ccb_dmamap64;
2652 if (ccb->ccb_len == 0)
2655 ccb->ccb_dma64 = true;
2657 ccb->ccb_data, ccb->ccb_len, NULL,
2669 ccb->ccb_sgl_len = (dmap->dm_nsegs - space) * sizeof(*nsge);
2670 memset(ccb->ccb_sgl, 0, ccb->ccb_sgl_len);
2673 ce->sg_addr = htole64(ccb->ccb_sgl_dva);
2674 ce->sg_len = htole32(ccb->ccb_sgl_len);
2682 nsge = ccb->ccb_sgl;
2695 ccb->ccb_direction == MFII_DATA_OUT ?
2698 if (ccb->ccb_sgl_len > 0) {
2700 ccb->ccb_sgl_offset, ccb->ccb_sgl_len,
2710 struct mfii_ccb *ccb = p;
2711 struct mfii_softc *sc = ccb->ccb_sc;
2714 printf("%s: cmd timeout ccb %p\n", DEVNAME(sc), p);
2718 SIMPLEQ_INSERT_TAIL(&sc->sc_abort_list, ccb, ccb_link);
2736 struct mfii_ccb *ccb = list;
2737 struct scsipi_xfer *xs = ccb->ccb_cookie;
2741 list = SIMPLEQ_NEXT(ccb, ccb_link);
2747 mfii_put_ccb(sc, ccb);
2753 mfii_abort(sc, accb, periph->periph_target, ccb->ccb_smid,
2757 accb->ccb_cookie = ccb;
2786 struct mfii_ccb *ccb = accb->ccb_cookie;
2787 struct scsipi_xfer *xs = ccb->ccb_cookie;
2792 printf("%s: cmd aborted ccb %p\n", DEVNAME(sc), ccb);
2796 mfii_put_ccb(sc, ccb);
2802 struct mfii_ccb *ccb;
2806 ccb = NULL;
2808 ccb = SIMPLEQ_FIRST(&sc->sc_ccb_freeq);
2809 if (ccb != NULL)
2813 return (ccb);
2817 mfii_scrub_ccb(struct mfii_ccb *ccb)
2819 ccb->ccb_cookie = NULL;
2820 ccb->ccb_done = NULL;
2821 ccb->ccb_flags = 0;
2822 ccb->ccb_data = NULL;
2823 ccb->ccb_direction = MFII_DATA_NONE;
2824 ccb->ccb_dma64 = false;
2825 ccb->ccb_len = 0;
2826 ccb->ccb_sgl_len = 0;
2827 memset(&ccb->ccb_req, 0, sizeof(ccb->ccb_req));
2828 memset(ccb->ccb_request, 0, MFII_REQUEST_SIZE);
2829 memset(ccb->ccb_mfi, 0, MFI_FRAME_SIZE);
2833 mfii_put_ccb(struct mfii_softc *sc, struct mfii_ccb *ccb)
2836 SIMPLEQ_INSERT_HEAD(&sc->sc_ccb_freeq, ccb, ccb_link);
2843 struct mfii_ccb *ccb;
2855 ccb = &sc->sc_ccb[i];
2856 ccb->ccb_sc = sc;
2861 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ccb->ccb_dmamap32);
2863 printf("%s: cannot create ccb dmamap32 (%d)\n",
2869 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ccb->ccb_dmamap64);
2871 printf("%s: cannot create ccb dmamap64 (%d)\n",
2877 ccb->ccb_smid = i + 1;
2878 ccb->ccb_request_offset = MFII_REQUEST_SIZE * (i + 1);
2879 ccb->ccb_request = request + ccb->ccb_request_offset;
2880 ccb->ccb_request_dva = MFII_DMA_DVA(sc->sc_requests) +
2881 ccb->ccb_request_offset;
2884 ccb->ccb_mfi_offset = MFI_FRAME_SIZE * i;
2885 ccb->ccb_mfi = mfi + ccb->ccb_mfi_offset;
2886 ccb->ccb_mfi_dva = MFII_DMA_DVA(sc->sc_mfi) +
2887 ccb->ccb_mfi_offset;
2890 ccb->ccb_sense_offset = MFI_SENSE_SIZE * i;
2891 ccb->ccb_sense = (struct mfi_sense *)(sense +
2892 ccb->ccb_sense_offset);
2893 ccb->ccb_sense_dva = MFII_DMA_DVA(sc->sc_sense) +
2894 ccb->ccb_sense_offset;
2897 ccb->ccb_sgl_offset = sizeof(struct mfii_sge) *
2899 ccb->ccb_sgl = (struct mfii_sge *)(sgl + ccb->ccb_sgl_offset);
2900 ccb->ccb_sgl_dva = MFII_DMA_DVA(sc->sc_sgl) +
2901 ccb->ccb_sgl_offset;
2903 mutex_init(&ccb->ccb_mtx, MUTEX_DEFAULT, IPL_BIO);
2904 cv_init(&ccb->ccb_cv, "mfiiexec");
2906 /* add ccb to queue */
2907 mfii_put_ccb(sc, ccb);
2913 bus_dmamap_destroy(sc->sc_dmat, ccb->ccb_dmamap32);
2915 /* free dma maps and ccb memory */
2916 while ((ccb = mfii_get_ccb(sc)) != NULL) {
2917 bus_dmamap_destroy(sc->sc_dmat, ccb->ccb_dmamap32);
2918 bus_dmamap_destroy(sc->sc_dmat, ccb->ccb_dmamap64);