Lines Matching refs:cm
127 static int mfi_check_command_pre(struct mfi_softc *sc, struct mfi_command *cm);
128 static void mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm);
129 static int mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm);
798 struct mfi_command *cm; in mfi_alloc_commands() local
809 cm = &sc->mfi_commands[i]; in mfi_alloc_commands()
810 cm->cm_frame = (union mfi_frame *)((uintptr_t)sc->mfi_frames + in mfi_alloc_commands()
812 cm->cm_frame_busaddr = sc->mfi_frames_busaddr + in mfi_alloc_commands()
814 cm->cm_frame->header.context = i; in mfi_alloc_commands()
815 cm->cm_sense = &sc->mfi_sense[i]; in mfi_alloc_commands()
816 cm->cm_sense_busaddr= sc->mfi_sense_busaddr + MFI_SENSE_LEN * i; in mfi_alloc_commands()
817 cm->cm_sc = sc; in mfi_alloc_commands()
818 cm->cm_index = i; in mfi_alloc_commands()
820 &cm->cm_dmamap) == 0) { in mfi_alloc_commands()
822 mfi_release_command(cm); in mfi_alloc_commands()
829 cm = &sc->mfi_commands[i]; in mfi_alloc_commands()
831 cm->cm_dmamap); in mfi_alloc_commands()
844 mfi_release_command(struct mfi_command *cm) in mfi_release_command() argument
849 mtx_assert(&cm->cm_sc->mfi_io_lock, MA_OWNED); in mfi_release_command()
856 hdr = &cm->cm_frame->header; in mfi_release_command()
857 if (cm->cm_data != NULL && hdr->sg_count) { in mfi_release_command()
858 cm->cm_sg->sg32[0].len = 0; in mfi_release_command()
859 cm->cm_sg->sg32[0].addr = 0; in mfi_release_command()
867 if ((cm->cm_flags & MFI_ON_MFIQ_BUSY) != 0) in mfi_release_command()
868 mfi_remove_busy(cm); in mfi_release_command()
869 if ((cm->cm_flags & MFI_ON_MFIQ_READY) != 0) in mfi_release_command()
870 mfi_remove_ready(cm); in mfi_release_command()
873 if ((cm->cm_flags & MFI_ON_MFIQ_MASK) != 0) { in mfi_release_command()
875 cm, cm->cm_flags); in mfi_release_command()
879 if ((cm->cm_flags & MFI_CMD_TBOLT) != 0) { in mfi_release_command()
880 mfi_tbolt_return_cmd(cm->cm_sc, in mfi_release_command()
881 cm->cm_sc->mfi_cmd_pool_tbolt[cm->cm_extra_frames - 1], in mfi_release_command()
882 cm); in mfi_release_command()
885 hdr_data = (uint32_t *)cm->cm_frame; in mfi_release_command()
891 cm->cm_extra_frames = 0; in mfi_release_command()
892 cm->cm_flags = 0; in mfi_release_command()
893 cm->cm_complete = NULL; in mfi_release_command()
894 cm->cm_private = NULL; in mfi_release_command()
895 cm->cm_data = NULL; in mfi_release_command()
896 cm->cm_sg = 0; in mfi_release_command()
897 cm->cm_total_frame_size = 0; in mfi_release_command()
898 cm->retry_for_fw_reset = 0; in mfi_release_command()
900 mfi_enqueue_free(cm); in mfi_release_command()
907 struct mfi_command *cm; in mfi_dcmd_command() local
914 cm = mfi_dequeue_free(sc); in mfi_dcmd_command()
915 if (cm == NULL) in mfi_dcmd_command()
919 context = cm->cm_frame->header.context; in mfi_dcmd_command()
920 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_dcmd_command()
921 cm->cm_frame->header.context = context; in mfi_dcmd_command()
927 mfi_release_command(cm); in mfi_dcmd_command()
936 dcmd = &cm->cm_frame->dcmd; in mfi_dcmd_command()
944 cm->cm_sg = &dcmd->sgl; in mfi_dcmd_command()
945 cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE; in mfi_dcmd_command()
946 cm->cm_flags = 0; in mfi_dcmd_command()
947 cm->cm_data = buf; in mfi_dcmd_command()
948 cm->cm_private = buf; in mfi_dcmd_command()
949 cm->cm_len = bufsize; in mfi_dcmd_command()
951 *cmp = cm; in mfi_dcmd_command()
960 struct mfi_command *cm; in mfi_comms_init() local
967 if ((cm = mfi_dequeue_free(sc)) == NULL) { in mfi_comms_init()
973 context = cm->cm_frame->header.context; in mfi_comms_init()
974 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_comms_init()
975 cm->cm_frame->header.context = context; in mfi_comms_init()
981 init = &cm->cm_frame->init; in mfi_comms_init()
995 init->qinfo_new_addr_lo = cm->cm_frame_busaddr + MFI_FRAME_SIZE; in mfi_comms_init()
996 cm->cm_data = NULL; in mfi_comms_init()
997 cm->cm_flags = MFI_CMD_POLLED; in mfi_comms_init()
999 if ((error = mfi_mapcmd(sc, cm)) != 0) in mfi_comms_init()
1001 mfi_release_command(cm); in mfi_comms_init()
1010 struct mfi_command *cm = NULL; in mfi_get_controller_info() local
1016 error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_GETINFO, in mfi_get_controller_info()
1020 cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED; in mfi_get_controller_info()
1022 if ((error = mfi_mapcmd(sc, cm)) != 0) { in mfi_get_controller_info()
1030 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, in mfi_get_controller_info()
1032 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_get_controller_info()
1043 if (cm) in mfi_get_controller_info()
1044 mfi_release_command(cm); in mfi_get_controller_info()
1052 struct mfi_command *cm = NULL; in mfi_get_log_state() local
1056 error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_EVENT_GETINFO, in mfi_get_log_state()
1060 cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED; in mfi_get_log_state()
1062 if ((error = mfi_mapcmd(sc, cm)) != 0) { in mfi_get_log_state()
1067 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, in mfi_get_log_state()
1069 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_get_log_state()
1072 if (cm) in mfi_get_log_state()
1073 mfi_release_command(cm); in mfi_get_log_state()
1115 mfi_wait_command(struct mfi_softc *sc, struct mfi_command *cm) in mfi_wait_command() argument
1119 cm->cm_complete = NULL; in mfi_wait_command()
1125 if (cm->cm_frame->dcmd.opcode == 0) { in mfi_wait_command()
1126 cm->cm_frame->header.cmd_status = MFI_STAT_OK; in mfi_wait_command()
1127 cm->cm_error = 0; in mfi_wait_command()
1128 return (cm->cm_error); in mfi_wait_command()
1130 mfi_enqueue_ready(cm); in mfi_wait_command()
1132 if ((cm->cm_flags & MFI_CMD_COMPLETED) == 0) in mfi_wait_command()
1133 msleep(cm, &sc->mfi_io_lock, PRIBIO, "mfiwait", 0); in mfi_wait_command()
1134 return (cm->cm_error); in mfi_wait_command()
1140 struct mfi_command *cm; in mfi_free() local
1150 cm = &sc->mfi_commands[i]; in mfi_free()
1151 bus_dmamap_destroy(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_free()
1280 struct mfi_command *cm; in mfi_intr() local
1295 cm = &sc->mfi_commands[context]; in mfi_intr()
1296 mfi_remove_busy(cm); in mfi_intr()
1297 cm->cm_error = 0; in mfi_intr()
1298 mfi_complete(sc, cm); in mfi_intr()
1326 struct mfi_command *cm; in mfi_shutdown() local
1340 error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_SHUTDOWN, NULL, 0); in mfi_shutdown()
1346 dcmd = &cm->cm_frame->dcmd; in mfi_shutdown()
1348 cm->cm_flags = MFI_CMD_POLLED; in mfi_shutdown()
1349 cm->cm_data = NULL; in mfi_shutdown()
1351 if ((error = mfi_mapcmd(sc, cm)) != 0) in mfi_shutdown()
1354 mfi_release_command(cm); in mfi_shutdown()
1363 struct mfi_command *cm = NULL; in mfi_syspdprobe() local
1372 error = mfi_dcmd_command(sc, &cm, MFI_DCMD_PD_LIST_QUERY, in mfi_syspdprobe()
1380 cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED; in mfi_syspdprobe()
1381 cm->cm_frame->dcmd.mbox[0] = MR_PD_QUERY_TYPE_EXPOSED_TO_HOST; in mfi_syspdprobe()
1382 cm->cm_frame->dcmd.mbox[1] = 0; in mfi_syspdprobe()
1383 if (mfi_mapcmd(sc, cm) != 0) { in mfi_syspdprobe()
1388 bus_dmamap_sync(sc->mfi_buffer_dmat,cm->cm_dmamap, in mfi_syspdprobe()
1390 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_syspdprobe()
1391 hdr = &cm->cm_frame->header; in mfi_syspdprobe()
1435 if (cm) in mfi_syspdprobe()
1436 mfi_release_command(cm); in mfi_syspdprobe()
1445 struct mfi_command *cm = NULL; in mfi_ldprobe() local
1454 error = mfi_dcmd_command(sc, &cm, MFI_DCMD_LD_GET_LIST, in mfi_ldprobe()
1459 cm->cm_flags = MFI_CMD_DATAIN; in mfi_ldprobe()
1460 if (mfi_wait_command(sc, cm) != 0) { in mfi_ldprobe()
1465 hdr = &cm->cm_frame->header; in mfi_ldprobe()
1487 if (cm) in mfi_ldprobe()
1488 mfi_release_command(cm); in mfi_ldprobe()
1668 struct mfi_command *cm; in mfi_aen_register() local
1694 error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_EVENT_WAIT, in mfi_aen_register()
1699 dcmd = &cm->cm_frame->dcmd; in mfi_aen_register()
1702 cm->cm_flags = MFI_CMD_DATAIN; in mfi_aen_register()
1703 cm->cm_complete = mfi_aen_complete; in mfi_aen_register()
1706 sc->mfi_aen_cm = cm; in mfi_aen_register()
1708 mfi_enqueue_ready(cm); in mfi_aen_register()
1716 mfi_aen_complete(struct mfi_command *cm) in mfi_aen_complete() argument
1724 sc = cm->cm_sc; in mfi_aen_complete()
1730 hdr = &cm->cm_frame->header; in mfi_aen_complete()
1742 detail = cm->cm_data; in mfi_aen_complete()
1756 free(cm->cm_data, M_MFIBUF); in mfi_aen_complete()
1759 mfi_release_command(cm); in mfi_aen_complete()
1771 struct mfi_command *cm; in mfi_parse_entries() local
1790 if ((cm = mfi_dequeue_free(sc)) == NULL) { in mfi_parse_entries()
1795 dcmd = &cm->cm_frame->dcmd; in mfi_parse_entries()
1803 cm->cm_sg = &dcmd->sgl; in mfi_parse_entries()
1804 cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE; in mfi_parse_entries()
1805 cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED; in mfi_parse_entries()
1806 cm->cm_data = el; in mfi_parse_entries()
1807 cm->cm_len = size; in mfi_parse_entries()
1809 if ((error = mfi_mapcmd(sc, cm)) != 0) { in mfi_parse_entries()
1812 mfi_release_command(cm); in mfi_parse_entries()
1816 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, in mfi_parse_entries()
1818 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_parse_entries()
1821 mfi_release_command(cm); in mfi_parse_entries()
1828 mfi_release_command(cm); in mfi_parse_entries()
1832 mfi_release_command(cm); in mfi_parse_entries()
1860 struct mfi_command *cm; in mfi_add_ld() local
1874 error = mfi_dcmd_command(sc, &cm, MFI_DCMD_LD_GET_INFO, in mfi_add_ld()
1883 cm->cm_flags = MFI_CMD_DATAIN; in mfi_add_ld()
1884 dcmd = &cm->cm_frame->dcmd; in mfi_add_ld()
1886 if (mfi_wait_command(sc, cm) != 0) { in mfi_add_ld()
1893 mfi_add_ld_complete(cm); in mfi_add_ld()
1895 mfi_release_command(cm); in mfi_add_ld()
1903 mfi_add_ld_complete(struct mfi_command *cm) in mfi_add_ld_complete() argument
1910 sc = cm->cm_sc; in mfi_add_ld_complete()
1911 hdr = &cm->cm_frame->header; in mfi_add_ld_complete()
1912 ld_info = cm->cm_private; in mfi_add_ld_complete()
1917 mfi_release_command(cm); in mfi_add_ld_complete()
1921 mfi_release_command(cm); in mfi_add_ld_complete()
1942 struct mfi_command *cm; in mfi_add_sys_pd() local
1956 error = mfi_dcmd_command(sc, &cm, MFI_DCMD_PD_GET_INFO, in mfi_add_sys_pd()
1966 cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED; in mfi_add_sys_pd()
1967 dcmd = &cm->cm_frame->dcmd; in mfi_add_sys_pd()
1971 if ((error = mfi_mapcmd(sc, cm)) != 0) { in mfi_add_sys_pd()
1975 mfi_release_command(cm); in mfi_add_sys_pd()
1978 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, in mfi_add_sys_pd()
1980 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_add_sys_pd()
1981 mfi_add_sys_pd_complete(cm); in mfi_add_sys_pd()
1986 mfi_add_sys_pd_complete(struct mfi_command *cm) in mfi_add_sys_pd_complete() argument
1993 sc = cm->cm_sc; in mfi_add_sys_pd_complete()
1994 hdr = &cm->cm_frame->header; in mfi_add_sys_pd_complete()
1995 pd_info = cm->cm_private; in mfi_add_sys_pd_complete()
1999 mfi_release_command(cm); in mfi_add_sys_pd_complete()
2006 mfi_release_command(cm); in mfi_add_sys_pd_complete()
2009 mfi_release_command(cm); in mfi_add_sys_pd_complete()
2032 struct mfi_command *cm = NULL; in mfi_bio_command() local
2042 cm = mfi_build_ldio(sc, bio); in mfi_bio_command()
2044 cm = mfi_build_syspdio(sc, bio); in mfi_bio_command()
2046 if (!cm) in mfi_bio_command()
2048 return cm; in mfi_bio_command()
2122 struct mfi_command *cm; in mfi_build_syspdio() local
2130 if ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_build_syspdio()
2134 context = cm->cm_frame->header.context; in mfi_build_syspdio()
2135 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_build_syspdio()
2136 cm->cm_frame->header.context = context; in mfi_build_syspdio()
2137 pass = &cm->cm_frame->pass; in mfi_build_syspdio()
2152 mfi_enqueue_free(cm); in mfi_build_syspdio()
2169 pass->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr; in mfi_build_syspdio()
2170 pass->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_build_syspdio()
2171 cm->cm_complete = mfi_bio_complete; in mfi_build_syspdio()
2172 cm->cm_private = bio; in mfi_build_syspdio()
2173 cm->cm_data = unmapped_buf; in mfi_build_syspdio()
2174 cm->cm_len = bio->bio_bcount; in mfi_build_syspdio()
2175 cm->cm_sg = &pass->sgl; in mfi_build_syspdio()
2176 cm->cm_total_frame_size = MFI_PASS_FRAME_SIZE; in mfi_build_syspdio()
2177 cm->cm_flags = flags; in mfi_build_syspdio()
2179 return (cm); in mfi_build_syspdio()
2186 struct mfi_command *cm; in mfi_build_ldio() local
2193 if ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_build_ldio()
2197 context = cm->cm_frame->header.context; in mfi_build_ldio()
2198 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_build_ldio()
2199 cm->cm_frame->header.context = context; in mfi_build_ldio()
2200 io = &cm->cm_frame->io; in mfi_build_ldio()
2213 mfi_enqueue_free(cm); in mfi_build_ldio()
2225 io->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr; in mfi_build_ldio()
2226 io->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_build_ldio()
2229 cm->cm_complete = mfi_bio_complete; in mfi_build_ldio()
2230 cm->cm_private = bio; in mfi_build_ldio()
2231 cm->cm_data = unmapped_buf; in mfi_build_ldio()
2232 cm->cm_len = bio->bio_bcount; in mfi_build_ldio()
2233 cm->cm_sg = &io->sgl; in mfi_build_ldio()
2234 cm->cm_total_frame_size = MFI_IO_FRAME_SIZE; in mfi_build_ldio()
2235 cm->cm_flags = flags; in mfi_build_ldio()
2237 return (cm); in mfi_build_ldio()
2241 mfi_bio_complete(struct mfi_command *cm) in mfi_bio_complete() argument
2247 bio = cm->cm_private; in mfi_bio_complete()
2248 hdr = &cm->cm_frame->header; in mfi_bio_complete()
2249 sc = cm->cm_sc; in mfi_bio_complete()
2255 "scsi_status=%#x\n", cm, hdr->cmd_status, hdr->scsi_status); in mfi_bio_complete()
2256 mfi_print_sense(cm->cm_sc, cm->cm_sense); in mfi_bio_complete()
2257 } else if (cm->cm_error != 0) { in mfi_bio_complete()
2259 bio->bio_error = cm->cm_error; in mfi_bio_complete()
2261 cm, cm->cm_error); in mfi_bio_complete()
2264 mfi_release_command(cm); in mfi_bio_complete()
2271 struct mfi_command *cm; in mfi_startio() local
2280 cm = mfi_dequeue_ready(sc); in mfi_startio()
2282 if (cm == NULL) { in mfi_startio()
2284 cm = sc->mfi_cam_start(ccbh); in mfi_startio()
2288 if (cm == NULL) in mfi_startio()
2289 cm = mfi_bio_command(sc); in mfi_startio()
2292 if (cm == NULL) in mfi_startio()
2296 if (mfi_mapcmd(sc, cm) != 0) { in mfi_startio()
2298 mfi_requeue_ready(cm); in mfi_startio()
2305 mfi_mapcmd(struct mfi_softc *sc, struct mfi_command *cm) in mfi_mapcmd() argument
2311 if ((cm->cm_data != NULL) && (cm->cm_frame->header.cmd != MFI_CMD_STP )) { in mfi_mapcmd()
2312 polled = (cm->cm_flags & MFI_CMD_POLLED) ? BUS_DMA_NOWAIT : 0; in mfi_mapcmd()
2313 if (cm->cm_flags & MFI_CMD_CCB) in mfi_mapcmd()
2315 cm->cm_dmamap, cm->cm_data, mfi_data_cb, cm, in mfi_mapcmd()
2317 else if (cm->cm_flags & MFI_CMD_BIO) in mfi_mapcmd()
2319 cm->cm_dmamap, cm->cm_private, mfi_data_cb, cm, in mfi_mapcmd()
2323 cm->cm_dmamap, cm->cm_data, cm->cm_len, in mfi_mapcmd()
2324 mfi_data_cb, cm, polled); in mfi_mapcmd()
2330 error = mfi_send_frame(sc, cm); in mfi_mapcmd()
2340 struct mfi_command *cm; in mfi_data_cb() local
2346 cm = (struct mfi_command *)arg; in mfi_data_cb()
2347 sc = cm->cm_sc; in mfi_data_cb()
2348 hdr = &cm->cm_frame->header; in mfi_data_cb()
2349 sgl = cm->cm_sg; in mfi_data_cb()
2363 cm->cm_error = error; in mfi_data_cb()
2364 mfi_complete(sc, cm); in mfi_data_cb()
2373 if (((cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) || in mfi_data_cb()
2374 (cm->cm_frame->header.cmd == MFI_CMD_LD_READ) || in mfi_data_cb()
2375 (cm->cm_frame->header.cmd == MFI_CMD_LD_WRITE)) && in mfi_data_cb()
2387 if (cm->cm_frame->header.cmd == MFI_CMD_STP) { in mfi_data_cb()
2388 first = cm->cm_stp_len; in mfi_data_cb()
2417 if (cm->cm_flags & MFI_CMD_DATAIN) { in mfi_data_cb()
2421 if (cm->cm_flags & MFI_CMD_DATAOUT) { in mfi_data_cb()
2425 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, dir); in mfi_data_cb()
2426 cm->cm_flags |= MFI_CMD_MAPPED; in mfi_data_cb()
2434 cm->cm_total_frame_size += (sge_size * nsegs); in mfi_data_cb()
2435 cm->cm_extra_frames = (cm->cm_total_frame_size - 1) / MFI_FRAME_SIZE; in mfi_data_cb()
2437 if ((error = mfi_send_frame(sc, cm)) != 0) { in mfi_data_cb()
2439 cm->cm_error = error; in mfi_data_cb()
2440 mfi_complete(sc, cm); in mfi_data_cb()
2453 mfi_send_frame(struct mfi_softc *sc, struct mfi_command *cm) in mfi_send_frame() argument
2460 error = mfi_tbolt_send_frame(sc, cm); in mfi_send_frame()
2462 error = mfi_std_send_frame(sc, cm); in mfi_send_frame()
2464 if (error != 0 && (cm->cm_flags & MFI_ON_MFIQ_BUSY) != 0) in mfi_send_frame()
2465 mfi_remove_busy(cm); in mfi_send_frame()
2471 mfi_std_send_frame(struct mfi_softc *sc, struct mfi_command *cm) in mfi_std_send_frame() argument
2476 hdr = &cm->cm_frame->header; in mfi_std_send_frame()
2478 if ((cm->cm_flags & MFI_CMD_POLLED) == 0) { in mfi_std_send_frame()
2479 cm->cm_timestamp = time_uptime; in mfi_std_send_frame()
2480 mfi_enqueue_busy(cm); in mfi_std_send_frame()
2498 if (cm->cm_extra_frames > 7) in mfi_std_send_frame()
2499 cm->cm_extra_frames = 7; in mfi_std_send_frame()
2501 sc->mfi_issue_cmd(sc, cm->cm_frame_busaddr, cm->cm_extra_frames); in mfi_std_send_frame()
2503 if ((cm->cm_flags & MFI_CMD_POLLED) == 0) in mfi_std_send_frame()
2516 "command 0x%X\n", hdr, cm->cm_frame->dcmd.opcode); in mfi_std_send_frame()
2524 mfi_complete(struct mfi_softc *sc, struct mfi_command *cm) in mfi_complete() argument
2529 if ((cm->cm_flags & MFI_CMD_MAPPED) != 0) { in mfi_complete()
2531 if ((cm->cm_flags & MFI_CMD_DATAIN) || in mfi_complete()
2532 (cm->cm_frame->header.cmd == MFI_CMD_STP)) in mfi_complete()
2534 if (cm->cm_flags & MFI_CMD_DATAOUT) in mfi_complete()
2537 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, dir); in mfi_complete()
2538 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_complete()
2539 cm->cm_flags &= ~MFI_CMD_MAPPED; in mfi_complete()
2542 cm->cm_flags |= MFI_CMD_COMPLETED; in mfi_complete()
2544 if (cm->cm_complete != NULL) in mfi_complete()
2545 cm->cm_complete(cm); in mfi_complete()
2547 wakeup(cm); in mfi_complete()
2553 struct mfi_command *cm; in mfi_abort() local
2559 if ((cm = mfi_dequeue_free(sc)) == NULL) { in mfi_abort()
2565 context = cm->cm_frame->header.context; in mfi_abort()
2566 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_abort()
2567 cm->cm_frame->header.context = context; in mfi_abort()
2569 abort = &cm->cm_frame->abort; in mfi_abort()
2577 cm->cm_data = NULL; in mfi_abort()
2578 cm->cm_flags = MFI_CMD_POLLED; in mfi_abort()
2580 if ((error = mfi_mapcmd(sc, cm)) != 0) in mfi_abort()
2582 mfi_release_command(cm); in mfi_abort()
2604 struct mfi_command *cm; in mfi_dump_blocks() local
2609 if ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_dump_blocks()
2613 context = cm->cm_frame->header.context; in mfi_dump_blocks()
2614 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_dump_blocks()
2615 cm->cm_frame->header.context = context; in mfi_dump_blocks()
2617 io = &cm->cm_frame->io; in mfi_dump_blocks()
2625 io->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr; in mfi_dump_blocks()
2626 io->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_dump_blocks()
2629 cm->cm_data = virt; in mfi_dump_blocks()
2630 cm->cm_len = len; in mfi_dump_blocks()
2631 cm->cm_sg = &io->sgl; in mfi_dump_blocks()
2632 cm->cm_total_frame_size = MFI_IO_FRAME_SIZE; in mfi_dump_blocks()
2633 cm->cm_flags = MFI_CMD_POLLED | MFI_CMD_DATAOUT; in mfi_dump_blocks()
2635 if ((error = mfi_mapcmd(sc, cm)) != 0) in mfi_dump_blocks()
2637 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, in mfi_dump_blocks()
2639 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_dump_blocks()
2640 mfi_release_command(cm); in mfi_dump_blocks()
2649 struct mfi_command *cm; in mfi_dump_syspd_blocks() local
2654 if ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_dump_syspd_blocks()
2657 pass = &cm->cm_frame->pass; in mfi_dump_syspd_blocks()
2671 pass->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr; in mfi_dump_syspd_blocks()
2672 pass->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_dump_syspd_blocks()
2673 cm->cm_data = virt; in mfi_dump_syspd_blocks()
2674 cm->cm_len = len; in mfi_dump_syspd_blocks()
2675 cm->cm_sg = &pass->sgl; in mfi_dump_syspd_blocks()
2676 cm->cm_total_frame_size = MFI_PASS_FRAME_SIZE; in mfi_dump_syspd_blocks()
2677 cm->cm_flags = MFI_CMD_POLLED | MFI_CMD_DATAOUT | MFI_CMD_SCSI; in mfi_dump_syspd_blocks()
2679 if ((error = mfi_mapcmd(sc, cm)) != 0) in mfi_dump_syspd_blocks()
2681 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, in mfi_dump_syspd_blocks()
2683 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_dump_syspd_blocks()
2684 mfi_release_command(cm); in mfi_dump_syspd_blocks()
2760 mfi_check_command_pre(struct mfi_softc *sc, struct mfi_command *cm) in mfi_check_command_pre() argument
2770 switch (cm->cm_frame->dcmd.opcode) { in mfi_check_command_pre()
2773 if (ld->ld_id == cm->cm_frame->dcmd.mbox[0]) in mfi_check_command_pre()
2796 mbox = (uint16_t *) cm->cm_frame->dcmd.mbox; in mfi_check_command_pre()
2817 mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm) in mfi_check_command_post() argument
2824 switch (cm->cm_frame->dcmd.opcode) { in mfi_check_command_post()
2827 if (ld->ld_id == cm->cm_frame->dcmd.mbox[0]) in mfi_check_command_post()
2831 if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) { in mfi_check_command_post()
2841 if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) { in mfi_check_command_post()
2861 mbox = (uint16_t *) cm->cm_frame->dcmd.mbox; in mfi_check_command_post()
2872 if (syspd && cm->cm_frame->header.cmd_status != MFI_STAT_OK) in mfi_check_command_post()
2879 mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm) in mfi_check_for_sscd() argument
2888 conf_data = (struct mfi_config_data *)cm->cm_data; in mfi_check_for_sscd()
2890 if (cm->cm_frame->dcmd.opcode == MFI_DCMD_CFG_ADD) { in mfi_check_for_sscd()
2896 } else if (cm->cm_frame->dcmd.opcode == MFI_DCMD_LD_DELETE) { in mfi_check_for_sscd()
2907 ld_cm->cm_frame->dcmd.mbox[0]= cm->cm_frame->dcmd.mbox[0]; in mfi_check_for_sscd()
2908 ld_cm->cm_frame->header.target_id = cm->cm_frame->dcmd.mbox[0]; in mfi_check_for_sscd()
2934 mfi_stp_cmd(struct mfi_softc *sc, struct mfi_command *cm,caddr_t arg) in mfi_stp_cmd() argument
2943 kern_sge =(struct megasas_sge *) ((uintptr_t)cm->cm_frame + ioc->mfi_sgl_off); in mfi_stp_cmd()
2944 cm->cm_frame->header.sg_count = ioc->mfi_sge_count; in mfi_stp_cmd()
2947 cm->cm_frame->header.flags |= MFI_FRAME_SGL64; in mfi_stp_cmd()
2948 cm->cm_extra_frames = 2; in mfi_stp_cmd()
2951 cm->cm_extra_frames = (cm->cm_total_frame_size - 1) / MFI_FRAME_SIZE; in mfi_stp_cmd()
2955 cm->cm_total_frame_size += (sge_size * ioc->mfi_sge_count); in mfi_stp_cmd()
2995 cm->cm_frame->stp.sgl.sg64[i].addr = in mfi_stp_cmd()
2997 cm->cm_frame->stp.sgl.sg64[i].len = in mfi_stp_cmd()
3000 cm->cm_frame->stp.sgl.sg32[i].addr = in mfi_stp_cmd()
3002 cm->cm_frame->stp.sgl.sg32[i].len = in mfi_stp_cmd()
3015 cm->cm_flags |=MFI_CMD_MAPPED; in mfi_stp_cmd()
3022 struct mfi_command *cm; in mfi_user_command() local
3043 while ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_user_command()
3047 context = cm->cm_frame->header.context; in mfi_user_command()
3049 dcmd = &cm->cm_frame->dcmd; in mfi_user_command()
3052 cm->cm_sg = &dcmd->sgl; in mfi_user_command()
3053 cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE; in mfi_user_command()
3054 cm->cm_data = ioc_buf; in mfi_user_command()
3055 cm->cm_len = ioc->buf_size; in mfi_user_command()
3058 cm->cm_frame->header.context = context; in mfi_user_command()
3061 cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_DATAOUT; in mfi_user_command()
3063 error = mfi_check_command_pre(sc, cm); in mfi_user_command()
3067 error = mfi_wait_command(sc, cm); in mfi_user_command()
3073 mfi_check_command_post(sc, cm); in mfi_user_command()
3075 mfi_release_command(cm); in mfi_user_command()
3097 struct mfi_command *cm = NULL; in mfi_ioctl() local
3176 if ((cm = mfi_dequeue_free(sc)) == NULL) { in mfi_ioctl()
3187 context = cm->cm_frame->header.context; in mfi_ioctl()
3188 cm->cm_frame->header.context = cm->cm_index; in mfi_ioctl()
3190 bcopy(ioc->mfi_frame.raw, cm->cm_frame, in mfi_ioctl()
3192 cm->cm_total_frame_size = (sizeof(union mfi_sgl) in mfi_ioctl()
3194 cm->cm_frame->header.scsi_status = 0; in mfi_ioctl()
3195 cm->cm_frame->header.pad0 = 0; in mfi_ioctl()
3197 cm->cm_sg = in mfi_ioctl()
3198 (union mfi_sgl *)&cm->cm_frame->bytes[ioc->mfi_sgl_off]; in mfi_ioctl()
3200 cm->cm_flags = 0; in mfi_ioctl()
3201 if (cm->cm_frame->header.flags & MFI_FRAME_DATAIN) in mfi_ioctl()
3202 cm->cm_flags |= MFI_CMD_DATAIN; in mfi_ioctl()
3203 if (cm->cm_frame->header.flags & MFI_FRAME_DATAOUT) in mfi_ioctl()
3204 cm->cm_flags |= MFI_CMD_DATAOUT; in mfi_ioctl()
3206 if (cm->cm_flags == 0) in mfi_ioctl()
3207 cm->cm_flags |= MFI_CMD_DATAIN | MFI_CMD_DATAOUT; in mfi_ioctl()
3208 cm->cm_len = cm->cm_frame->header.data_len; in mfi_ioctl()
3209 if (cm->cm_frame->header.cmd == MFI_CMD_STP) { in mfi_ioctl()
3214 cm->cm_stp_len = ioc->mfi_sgl[0].iov_len; in mfi_ioctl()
3219 cm->cm_stp_len = ioc32->mfi_sgl[0].iov_len; in mfi_ioctl()
3222 cm->cm_len += cm->cm_stp_len; in mfi_ioctl()
3224 if (cm->cm_len && in mfi_ioctl()
3225 (cm->cm_flags & (MFI_CMD_DATAIN | MFI_CMD_DATAOUT))) { in mfi_ioctl()
3226 cm->cm_data = data = malloc(cm->cm_len, M_MFIBUF, in mfi_ioctl()
3229 cm->cm_data = 0; in mfi_ioctl()
3233 cm->cm_frame->header.context = context; in mfi_ioctl()
3235 if (cm->cm_frame->header.cmd == MFI_CMD_STP) { in mfi_ioctl()
3236 res = mfi_stp_cmd(sc, cm, arg); in mfi_ioctl()
3241 if ((cm->cm_flags & MFI_CMD_DATAOUT) || in mfi_ioctl()
3242 (cm->cm_frame->header.cmd == MFI_CMD_STP)) { in mfi_ioctl()
3269 if (cm->cm_frame->header.cmd == MFI_CMD_DCMD) in mfi_ioctl()
3271 cm->cm_frame->dcmd.opcode); in mfi_ioctl()
3273 if (cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) { in mfi_ioctl()
3274 cm->cm_frame->pass.sense_addr_lo = in mfi_ioctl()
3275 (uint32_t)cm->cm_sense_busaddr; in mfi_ioctl()
3276 cm->cm_frame->pass.sense_addr_hi = in mfi_ioctl()
3277 (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_ioctl()
3280 skip_pre_post = mfi_check_for_sscd (sc, cm); in mfi_ioctl()
3282 error = mfi_check_command_pre(sc, cm); in mfi_ioctl()
3288 if ((error = mfi_wait_command(sc, cm)) != 0) { in mfi_ioctl()
3295 mfi_check_command_post(sc, cm); in mfi_ioctl()
3299 if (cm->cm_frame->header.cmd != MFI_CMD_STP) { in mfi_ioctl()
3301 if ((cm->cm_flags & MFI_CMD_DATAIN) || in mfi_ioctl()
3302 (cm->cm_frame->header.cmd == MFI_CMD_STP)) { in mfi_ioctl()
3342 error = copyout(cm->cm_sense, sense_ptr.user_space, in mfi_ioctl()
3351 ioc->mfi_frame.hdr.cmd_status = cm->cm_frame->header.cmd_status; in mfi_ioctl()
3356 if (cm->cm_frame->header.cmd == MFI_CMD_STP) { in mfi_ioctl()
3376 if (cm) { in mfi_ioctl()
3378 mfi_release_command(cm); in mfi_ioctl()
3468 struct mfi_command *cm = NULL; in mfi_linux_ioctl_int() local
3489 if ((cm = mfi_dequeue_free(sc)) == NULL) { in mfi_linux_ioctl_int()
3500 context = cm->cm_frame->header.context; in mfi_linux_ioctl_int()
3502 bcopy(l_ioc.lioc_frame.raw, cm->cm_frame, in mfi_linux_ioctl_int()
3504 cm->cm_total_frame_size = (sizeof(union mfi_sgl) in mfi_linux_ioctl_int()
3506 cm->cm_frame->header.scsi_status = 0; in mfi_linux_ioctl_int()
3507 cm->cm_frame->header.pad0 = 0; in mfi_linux_ioctl_int()
3509 cm->cm_sg = in mfi_linux_ioctl_int()
3510 (union mfi_sgl *)&cm->cm_frame->bytes[l_ioc.lioc_sgl_off]; in mfi_linux_ioctl_int()
3511 cm->cm_flags = 0; in mfi_linux_ioctl_int()
3512 if (cm->cm_frame->header.flags & MFI_FRAME_DATAIN) in mfi_linux_ioctl_int()
3513 cm->cm_flags |= MFI_CMD_DATAIN; in mfi_linux_ioctl_int()
3514 if (cm->cm_frame->header.flags & MFI_FRAME_DATAOUT) in mfi_linux_ioctl_int()
3515 cm->cm_flags |= MFI_CMD_DATAOUT; in mfi_linux_ioctl_int()
3516 cm->cm_len = cm->cm_frame->header.data_len; in mfi_linux_ioctl_int()
3517 if (cm->cm_len && in mfi_linux_ioctl_int()
3518 (cm->cm_flags & (MFI_CMD_DATAIN | MFI_CMD_DATAOUT))) { in mfi_linux_ioctl_int()
3519 cm->cm_data = data = malloc(cm->cm_len, M_MFIBUF, in mfi_linux_ioctl_int()
3522 cm->cm_data = 0; in mfi_linux_ioctl_int()
3526 cm->cm_frame->header.context = context; in mfi_linux_ioctl_int()
3529 if (cm->cm_flags & MFI_CMD_DATAOUT) { in mfi_linux_ioctl_int()
3543 if (cm->cm_frame->header.cmd == MFI_CMD_DCMD) in mfi_linux_ioctl_int()
3544 locked = mfi_config_lock(sc, cm->cm_frame->dcmd.opcode); in mfi_linux_ioctl_int()
3546 if (cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) { in mfi_linux_ioctl_int()
3547 cm->cm_frame->pass.sense_addr_lo = in mfi_linux_ioctl_int()
3548 (uint32_t)cm->cm_sense_busaddr; in mfi_linux_ioctl_int()
3549 cm->cm_frame->pass.sense_addr_hi = in mfi_linux_ioctl_int()
3550 (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_linux_ioctl_int()
3554 error = mfi_check_command_pre(sc, cm); in mfi_linux_ioctl_int()
3560 if ((error = mfi_wait_command(sc, cm)) != 0) { in mfi_linux_ioctl_int()
3567 mfi_check_command_post(sc, cm); in mfi_linux_ioctl_int()
3571 if (cm->cm_flags & MFI_CMD_DATAIN) { in mfi_linux_ioctl_int()
3598 error = copyout(cm->cm_sense, sense_ptr.user_space, in mfi_linux_ioctl_int()
3607 error = copyout(&cm->cm_frame->header.cmd_status, in mfi_linux_ioctl_int()
3621 if (cm) { in mfi_linux_ioctl_int()
3623 mfi_release_command(cm); in mfi_linux_ioctl_int()
3690 struct mfi_command *cm; in mfi_dump_all() local
3710 TAILQ_FOREACH(cm, &sc->mfi_busy, cm_link) { in mfi_dump_all()
3711 if (cm->cm_timestamp <= deadline) { in mfi_dump_all()
3714 cm, (int)(time_uptime - cm->cm_timestamp)); in mfi_dump_all()
3715 MFI_PRINT_CMD(cm); in mfi_dump_all()
3735 struct mfi_command *cm, *tmp; in mfi_timeout() local
3748 TAILQ_FOREACH_SAFE(cm, &sc->mfi_busy, cm_link, tmp) { in mfi_timeout()
3749 if (sc->mfi_aen_cm == cm || sc->mfi_map_sync_cm == cm) in mfi_timeout()
3751 if (cm->cm_timestamp <= deadline) { in mfi_timeout()
3753 cm->cm_timestamp = time_uptime; in mfi_timeout()
3757 cm, (int)(time_uptime - cm->cm_timestamp) in mfi_timeout()
3759 MFI_PRINT_CMD(cm); in mfi_timeout()
3760 MFI_VALIDATE_CMD(sc, cm); in mfi_timeout()