Lines Matching full: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()
1943 struct mfi_command *cm; in mfi_add_sys_pd() local
1957 error = mfi_dcmd_command(sc, &cm, MFI_DCMD_PD_GET_INFO, in mfi_add_sys_pd()
1967 cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED; in mfi_add_sys_pd()
1968 dcmd = &cm->cm_frame->dcmd; in mfi_add_sys_pd()
1972 if ((error = mfi_mapcmd(sc, cm)) != 0) { in mfi_add_sys_pd()
1976 mfi_release_command(cm); in mfi_add_sys_pd()
1979 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, in mfi_add_sys_pd()
1981 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_add_sys_pd()
1982 mfi_add_sys_pd_complete(cm); in mfi_add_sys_pd()
1987 mfi_add_sys_pd_complete(struct mfi_command *cm) in mfi_add_sys_pd_complete() argument
1994 sc = cm->cm_sc; in mfi_add_sys_pd_complete()
1995 hdr = &cm->cm_frame->header; in mfi_add_sys_pd_complete()
1996 pd_info = cm->cm_private; in mfi_add_sys_pd_complete()
2000 mfi_release_command(cm); in mfi_add_sys_pd_complete()
2007 mfi_release_command(cm); in mfi_add_sys_pd_complete()
2010 mfi_release_command(cm); in mfi_add_sys_pd_complete()
2034 struct mfi_command *cm = NULL; in mfi_bio_command() local
2044 cm = mfi_build_ldio(sc, bio); in mfi_bio_command()
2046 cm = mfi_build_syspdio(sc, bio); in mfi_bio_command()
2048 if (!cm) in mfi_bio_command()
2050 return cm; in mfi_bio_command()
2124 struct mfi_command *cm; in mfi_build_syspdio() local
2132 if ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_build_syspdio()
2136 context = cm->cm_frame->header.context; in mfi_build_syspdio()
2137 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_build_syspdio()
2138 cm->cm_frame->header.context = context; in mfi_build_syspdio()
2139 pass = &cm->cm_frame->pass; in mfi_build_syspdio()
2154 mfi_enqueue_free(cm); in mfi_build_syspdio()
2171 pass->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr; in mfi_build_syspdio()
2172 pass->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_build_syspdio()
2173 cm->cm_complete = mfi_bio_complete; in mfi_build_syspdio()
2174 cm->cm_private = bio; in mfi_build_syspdio()
2175 cm->cm_data = unmapped_buf; in mfi_build_syspdio()
2176 cm->cm_len = bio->bio_bcount; in mfi_build_syspdio()
2177 cm->cm_sg = &pass->sgl; in mfi_build_syspdio()
2178 cm->cm_total_frame_size = MFI_PASS_FRAME_SIZE; in mfi_build_syspdio()
2179 cm->cm_flags = flags; in mfi_build_syspdio()
2181 return (cm); in mfi_build_syspdio()
2188 struct mfi_command *cm; in mfi_build_ldio() local
2195 if ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_build_ldio()
2199 context = cm->cm_frame->header.context; in mfi_build_ldio()
2200 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_build_ldio()
2201 cm->cm_frame->header.context = context; in mfi_build_ldio()
2202 io = &cm->cm_frame->io; in mfi_build_ldio()
2215 mfi_enqueue_free(cm); in mfi_build_ldio()
2227 io->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr; in mfi_build_ldio()
2228 io->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_build_ldio()
2231 cm->cm_complete = mfi_bio_complete; in mfi_build_ldio()
2232 cm->cm_private = bio; in mfi_build_ldio()
2233 cm->cm_data = unmapped_buf; in mfi_build_ldio()
2234 cm->cm_len = bio->bio_bcount; in mfi_build_ldio()
2235 cm->cm_sg = &io->sgl; in mfi_build_ldio()
2236 cm->cm_total_frame_size = MFI_IO_FRAME_SIZE; in mfi_build_ldio()
2237 cm->cm_flags = flags; in mfi_build_ldio()
2239 return (cm); in mfi_build_ldio()
2243 mfi_bio_complete(struct mfi_command *cm) in mfi_bio_complete() argument
2249 bio = cm->cm_private; in mfi_bio_complete()
2250 hdr = &cm->cm_frame->header; in mfi_bio_complete()
2251 sc = cm->cm_sc; in mfi_bio_complete()
2257 "scsi_status=%#x\n", cm, hdr->cmd_status, hdr->scsi_status); in mfi_bio_complete()
2258 mfi_print_sense(cm->cm_sc, cm->cm_sense); in mfi_bio_complete()
2259 } else if (cm->cm_error != 0) { in mfi_bio_complete()
2261 bio->bio_error = cm->cm_error; in mfi_bio_complete()
2263 cm, cm->cm_error); in mfi_bio_complete()
2266 mfi_release_command(cm); in mfi_bio_complete()
2273 struct mfi_command *cm; in mfi_startio() local
2282 cm = mfi_dequeue_ready(sc); in mfi_startio()
2284 if (cm == NULL) { in mfi_startio()
2286 cm = sc->mfi_cam_start(ccbh); in mfi_startio()
2290 if (cm == NULL) in mfi_startio()
2291 cm = mfi_bio_command(sc); in mfi_startio()
2294 if (cm == NULL) in mfi_startio()
2298 if (mfi_mapcmd(sc, cm) != 0) { in mfi_startio()
2300 mfi_requeue_ready(cm); in mfi_startio()
2307 mfi_mapcmd(struct mfi_softc *sc, struct mfi_command *cm) in mfi_mapcmd() argument
2313 if ((cm->cm_data != NULL) && (cm->cm_frame->header.cmd != MFI_CMD_STP )) { in mfi_mapcmd()
2314 polled = (cm->cm_flags & MFI_CMD_POLLED) ? BUS_DMA_NOWAIT : 0; in mfi_mapcmd()
2315 if (cm->cm_flags & MFI_CMD_CCB) in mfi_mapcmd()
2317 cm->cm_dmamap, cm->cm_data, mfi_data_cb, cm, in mfi_mapcmd()
2319 else if (cm->cm_flags & MFI_CMD_BIO) in mfi_mapcmd()
2321 cm->cm_dmamap, cm->cm_private, mfi_data_cb, cm, in mfi_mapcmd()
2325 cm->cm_dmamap, cm->cm_data, cm->cm_len, in mfi_mapcmd()
2326 mfi_data_cb, cm, polled); in mfi_mapcmd()
2332 error = mfi_send_frame(sc, cm); in mfi_mapcmd()
2342 struct mfi_command *cm; in mfi_data_cb() local
2348 cm = (struct mfi_command *)arg; in mfi_data_cb()
2349 sc = cm->cm_sc; in mfi_data_cb()
2350 hdr = &cm->cm_frame->header; in mfi_data_cb()
2351 sgl = cm->cm_sg; in mfi_data_cb()
2365 cm->cm_error = error; in mfi_data_cb()
2366 mfi_complete(sc, cm); in mfi_data_cb()
2375 if (((cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) || in mfi_data_cb()
2376 (cm->cm_frame->header.cmd == MFI_CMD_LD_READ) || in mfi_data_cb()
2377 (cm->cm_frame->header.cmd == MFI_CMD_LD_WRITE)) && in mfi_data_cb()
2389 if (cm->cm_frame->header.cmd == MFI_CMD_STP) { in mfi_data_cb()
2390 first = cm->cm_stp_len; in mfi_data_cb()
2419 if (cm->cm_flags & MFI_CMD_DATAIN) { in mfi_data_cb()
2423 if (cm->cm_flags & MFI_CMD_DATAOUT) { in mfi_data_cb()
2427 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, dir); in mfi_data_cb()
2428 cm->cm_flags |= MFI_CMD_MAPPED; in mfi_data_cb()
2436 cm->cm_total_frame_size += (sge_size * nsegs); in mfi_data_cb()
2437 cm->cm_extra_frames = (cm->cm_total_frame_size - 1) / MFI_FRAME_SIZE; in mfi_data_cb()
2439 if ((error = mfi_send_frame(sc, cm)) != 0) { in mfi_data_cb()
2441 cm->cm_error = error; in mfi_data_cb()
2442 mfi_complete(sc, cm); in mfi_data_cb()
2455 mfi_send_frame(struct mfi_softc *sc, struct mfi_command *cm) in mfi_send_frame() argument
2462 error = mfi_tbolt_send_frame(sc, cm); in mfi_send_frame()
2464 error = mfi_std_send_frame(sc, cm); in mfi_send_frame()
2466 if (error != 0 && (cm->cm_flags & MFI_ON_MFIQ_BUSY) != 0) in mfi_send_frame()
2467 mfi_remove_busy(cm); in mfi_send_frame()
2473 mfi_std_send_frame(struct mfi_softc *sc, struct mfi_command *cm) in mfi_std_send_frame() argument
2478 hdr = &cm->cm_frame->header; in mfi_std_send_frame()
2480 if ((cm->cm_flags & MFI_CMD_POLLED) == 0) { in mfi_std_send_frame()
2481 cm->cm_timestamp = time_uptime; in mfi_std_send_frame()
2482 mfi_enqueue_busy(cm); in mfi_std_send_frame()
2500 if (cm->cm_extra_frames > 7) in mfi_std_send_frame()
2501 cm->cm_extra_frames = 7; in mfi_std_send_frame()
2503 sc->mfi_issue_cmd(sc, cm->cm_frame_busaddr, cm->cm_extra_frames); in mfi_std_send_frame()
2505 if ((cm->cm_flags & MFI_CMD_POLLED) == 0) in mfi_std_send_frame()
2518 "command 0x%X\n", hdr, cm->cm_frame->dcmd.opcode); in mfi_std_send_frame()
2526 mfi_complete(struct mfi_softc *sc, struct mfi_command *cm) in mfi_complete() argument
2531 if ((cm->cm_flags & MFI_CMD_MAPPED) != 0) { in mfi_complete()
2533 if ((cm->cm_flags & MFI_CMD_DATAIN) || in mfi_complete()
2534 (cm->cm_frame->header.cmd == MFI_CMD_STP)) in mfi_complete()
2536 if (cm->cm_flags & MFI_CMD_DATAOUT) in mfi_complete()
2539 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, dir); in mfi_complete()
2540 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_complete()
2541 cm->cm_flags &= ~MFI_CMD_MAPPED; in mfi_complete()
2544 cm->cm_flags |= MFI_CMD_COMPLETED; in mfi_complete()
2546 if (cm->cm_complete != NULL) in mfi_complete()
2547 cm->cm_complete(cm); in mfi_complete()
2549 wakeup(cm); in mfi_complete()
2555 struct mfi_command *cm; in mfi_abort() local
2561 if ((cm = mfi_dequeue_free(sc)) == NULL) { in mfi_abort()
2567 context = cm->cm_frame->header.context; in mfi_abort()
2568 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_abort()
2569 cm->cm_frame->header.context = context; in mfi_abort()
2571 abort = &cm->cm_frame->abort; in mfi_abort()
2579 cm->cm_data = NULL; in mfi_abort()
2580 cm->cm_flags = MFI_CMD_POLLED; in mfi_abort()
2582 if ((error = mfi_mapcmd(sc, cm)) != 0) in mfi_abort()
2584 mfi_release_command(cm); in mfi_abort()
2606 struct mfi_command *cm; in mfi_dump_blocks() local
2611 if ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_dump_blocks()
2615 context = cm->cm_frame->header.context; in mfi_dump_blocks()
2616 bzero(cm->cm_frame, sizeof(union mfi_frame)); in mfi_dump_blocks()
2617 cm->cm_frame->header.context = context; in mfi_dump_blocks()
2619 io = &cm->cm_frame->io; in mfi_dump_blocks()
2627 io->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr; in mfi_dump_blocks()
2628 io->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_dump_blocks()
2631 cm->cm_data = virt; in mfi_dump_blocks()
2632 cm->cm_len = len; in mfi_dump_blocks()
2633 cm->cm_sg = &io->sgl; in mfi_dump_blocks()
2634 cm->cm_total_frame_size = MFI_IO_FRAME_SIZE; in mfi_dump_blocks()
2635 cm->cm_flags = MFI_CMD_POLLED | MFI_CMD_DATAOUT; in mfi_dump_blocks()
2637 if ((error = mfi_mapcmd(sc, cm)) != 0) in mfi_dump_blocks()
2639 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, in mfi_dump_blocks()
2641 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_dump_blocks()
2642 mfi_release_command(cm); in mfi_dump_blocks()
2651 struct mfi_command *cm; in mfi_dump_syspd_blocks() local
2656 if ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_dump_syspd_blocks()
2659 pass = &cm->cm_frame->pass; in mfi_dump_syspd_blocks()
2673 pass->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr; in mfi_dump_syspd_blocks()
2674 pass->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_dump_syspd_blocks()
2675 cm->cm_data = virt; in mfi_dump_syspd_blocks()
2676 cm->cm_len = len; in mfi_dump_syspd_blocks()
2677 cm->cm_sg = &pass->sgl; in mfi_dump_syspd_blocks()
2678 cm->cm_total_frame_size = MFI_PASS_FRAME_SIZE; in mfi_dump_syspd_blocks()
2679 cm->cm_flags = MFI_CMD_POLLED | MFI_CMD_DATAOUT | MFI_CMD_SCSI; in mfi_dump_syspd_blocks()
2681 if ((error = mfi_mapcmd(sc, cm)) != 0) in mfi_dump_syspd_blocks()
2683 bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, in mfi_dump_syspd_blocks()
2685 bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap); in mfi_dump_syspd_blocks()
2686 mfi_release_command(cm); in mfi_dump_syspd_blocks()
2762 mfi_check_command_pre(struct mfi_softc *sc, struct mfi_command *cm) in mfi_check_command_pre() argument
2772 switch (cm->cm_frame->dcmd.opcode) { in mfi_check_command_pre()
2775 if (ld->ld_id == cm->cm_frame->dcmd.mbox[0]) in mfi_check_command_pre()
2798 mbox = (uint16_t *) cm->cm_frame->dcmd.mbox; in mfi_check_command_pre()
2819 mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm) in mfi_check_command_post() argument
2826 switch (cm->cm_frame->dcmd.opcode) { in mfi_check_command_post()
2829 if (ld->ld_id == cm->cm_frame->dcmd.mbox[0]) in mfi_check_command_post()
2833 if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) { in mfi_check_command_post()
2843 if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) { in mfi_check_command_post()
2863 mbox = (uint16_t *) cm->cm_frame->dcmd.mbox; in mfi_check_command_post()
2874 if (syspd && cm->cm_frame->header.cmd_status != MFI_STAT_OK) in mfi_check_command_post()
2881 mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm) in mfi_check_for_sscd() argument
2890 conf_data = (struct mfi_config_data *)cm->cm_data; in mfi_check_for_sscd()
2892 if (cm->cm_frame->dcmd.opcode == MFI_DCMD_CFG_ADD) { in mfi_check_for_sscd()
2898 } else if (cm->cm_frame->dcmd.opcode == MFI_DCMD_LD_DELETE) { in mfi_check_for_sscd()
2909 ld_cm->cm_frame->dcmd.mbox[0]= cm->cm_frame->dcmd.mbox[0]; in mfi_check_for_sscd()
2910 ld_cm->cm_frame->header.target_id = cm->cm_frame->dcmd.mbox[0]; in mfi_check_for_sscd()
2936 mfi_stp_cmd(struct mfi_softc *sc, struct mfi_command *cm,caddr_t arg) in mfi_stp_cmd() argument
2945 kern_sge =(struct megasas_sge *) ((uintptr_t)cm->cm_frame + ioc->mfi_sgl_off); in mfi_stp_cmd()
2946 cm->cm_frame->header.sg_count = ioc->mfi_sge_count; in mfi_stp_cmd()
2949 cm->cm_frame->header.flags |= MFI_FRAME_SGL64; in mfi_stp_cmd()
2950 cm->cm_extra_frames = 2; in mfi_stp_cmd()
2953 cm->cm_extra_frames = (cm->cm_total_frame_size - 1) / MFI_FRAME_SIZE; in mfi_stp_cmd()
2957 cm->cm_total_frame_size += (sge_size * ioc->mfi_sge_count); in mfi_stp_cmd()
2997 cm->cm_frame->stp.sgl.sg64[i].addr = in mfi_stp_cmd()
2999 cm->cm_frame->stp.sgl.sg64[i].len = in mfi_stp_cmd()
3002 cm->cm_frame->stp.sgl.sg32[i].addr = in mfi_stp_cmd()
3004 cm->cm_frame->stp.sgl.sg32[i].len = in mfi_stp_cmd()
3017 cm->cm_flags |=MFI_CMD_MAPPED; in mfi_stp_cmd()
3024 struct mfi_command *cm; in mfi_user_command() local
3045 while ((cm = mfi_dequeue_free(sc)) == NULL) in mfi_user_command()
3049 context = cm->cm_frame->header.context; in mfi_user_command()
3051 dcmd = &cm->cm_frame->dcmd; in mfi_user_command()
3054 cm->cm_sg = &dcmd->sgl; in mfi_user_command()
3055 cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE; in mfi_user_command()
3056 cm->cm_data = ioc_buf; in mfi_user_command()
3057 cm->cm_len = ioc->buf_size; in mfi_user_command()
3060 cm->cm_frame->header.context = context; in mfi_user_command()
3063 cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_DATAOUT; in mfi_user_command()
3065 error = mfi_check_command_pre(sc, cm); in mfi_user_command()
3069 error = mfi_wait_command(sc, cm); in mfi_user_command()
3075 mfi_check_command_post(sc, cm); in mfi_user_command()
3077 mfi_release_command(cm); in mfi_user_command()
3099 struct mfi_command *cm = NULL; in mfi_ioctl() local
3178 if ((cm = mfi_dequeue_free(sc)) == NULL) { in mfi_ioctl()
3189 context = cm->cm_frame->header.context; in mfi_ioctl()
3190 cm->cm_frame->header.context = cm->cm_index; in mfi_ioctl()
3192 bcopy(ioc->mfi_frame.raw, cm->cm_frame, in mfi_ioctl()
3194 cm->cm_total_frame_size = (sizeof(union mfi_sgl) in mfi_ioctl()
3196 cm->cm_frame->header.scsi_status = 0; in mfi_ioctl()
3197 cm->cm_frame->header.pad0 = 0; in mfi_ioctl()
3199 cm->cm_sg = in mfi_ioctl()
3200 (union mfi_sgl *)&cm->cm_frame->bytes[ioc->mfi_sgl_off]; in mfi_ioctl()
3202 cm->cm_flags = 0; in mfi_ioctl()
3203 if (cm->cm_frame->header.flags & MFI_FRAME_DATAIN) in mfi_ioctl()
3204 cm->cm_flags |= MFI_CMD_DATAIN; in mfi_ioctl()
3205 if (cm->cm_frame->header.flags & MFI_FRAME_DATAOUT) in mfi_ioctl()
3206 cm->cm_flags |= MFI_CMD_DATAOUT; in mfi_ioctl()
3208 if (cm->cm_flags == 0) in mfi_ioctl()
3209 cm->cm_flags |= MFI_CMD_DATAIN | MFI_CMD_DATAOUT; in mfi_ioctl()
3210 cm->cm_len = cm->cm_frame->header.data_len; in mfi_ioctl()
3211 if (cm->cm_frame->header.cmd == MFI_CMD_STP) { in mfi_ioctl()
3216 cm->cm_stp_len = ioc->mfi_sgl[0].iov_len; in mfi_ioctl()
3221 cm->cm_stp_len = ioc32->mfi_sgl[0].iov_len; in mfi_ioctl()
3224 cm->cm_len += cm->cm_stp_len; in mfi_ioctl()
3226 if (cm->cm_len && in mfi_ioctl()
3227 (cm->cm_flags & (MFI_CMD_DATAIN | MFI_CMD_DATAOUT))) { in mfi_ioctl()
3228 cm->cm_data = data = malloc(cm->cm_len, M_MFIBUF, in mfi_ioctl()
3231 cm->cm_data = 0; in mfi_ioctl()
3235 cm->cm_frame->header.context = context; in mfi_ioctl()
3237 if (cm->cm_frame->header.cmd == MFI_CMD_STP) { in mfi_ioctl()
3238 res = mfi_stp_cmd(sc, cm, arg); in mfi_ioctl()
3243 if ((cm->cm_flags & MFI_CMD_DATAOUT) || in mfi_ioctl()
3244 (cm->cm_frame->header.cmd == MFI_CMD_STP)) { in mfi_ioctl()
3271 if (cm->cm_frame->header.cmd == MFI_CMD_DCMD) in mfi_ioctl()
3273 cm->cm_frame->dcmd.opcode); in mfi_ioctl()
3275 if (cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) { in mfi_ioctl()
3276 cm->cm_frame->pass.sense_addr_lo = in mfi_ioctl()
3277 (uint32_t)cm->cm_sense_busaddr; in mfi_ioctl()
3278 cm->cm_frame->pass.sense_addr_hi = in mfi_ioctl()
3279 (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_ioctl()
3282 skip_pre_post = mfi_check_for_sscd (sc, cm); in mfi_ioctl()
3284 error = mfi_check_command_pre(sc, cm); in mfi_ioctl()
3290 if ((error = mfi_wait_command(sc, cm)) != 0) { in mfi_ioctl()
3297 mfi_check_command_post(sc, cm); in mfi_ioctl()
3301 if (cm->cm_frame->header.cmd != MFI_CMD_STP) { in mfi_ioctl()
3303 if ((cm->cm_flags & MFI_CMD_DATAIN) || in mfi_ioctl()
3304 (cm->cm_frame->header.cmd == MFI_CMD_STP)) { in mfi_ioctl()
3344 error = copyout(cm->cm_sense, sense_ptr.user_space, in mfi_ioctl()
3353 ioc->mfi_frame.hdr.cmd_status = cm->cm_frame->header.cmd_status; in mfi_ioctl()
3358 if (cm->cm_frame->header.cmd == MFI_CMD_STP) { in mfi_ioctl()
3378 if (cm) { in mfi_ioctl()
3380 mfi_release_command(cm); in mfi_ioctl()
3470 struct mfi_command *cm = NULL; in mfi_linux_ioctl_int() local
3491 if ((cm = mfi_dequeue_free(sc)) == NULL) { in mfi_linux_ioctl_int()
3502 context = cm->cm_frame->header.context; in mfi_linux_ioctl_int()
3504 bcopy(l_ioc.lioc_frame.raw, cm->cm_frame, in mfi_linux_ioctl_int()
3506 cm->cm_total_frame_size = (sizeof(union mfi_sgl) in mfi_linux_ioctl_int()
3508 cm->cm_frame->header.scsi_status = 0; in mfi_linux_ioctl_int()
3509 cm->cm_frame->header.pad0 = 0; in mfi_linux_ioctl_int()
3511 cm->cm_sg = in mfi_linux_ioctl_int()
3512 (union mfi_sgl *)&cm->cm_frame->bytes[l_ioc.lioc_sgl_off]; in mfi_linux_ioctl_int()
3513 cm->cm_flags = 0; in mfi_linux_ioctl_int()
3514 if (cm->cm_frame->header.flags & MFI_FRAME_DATAIN) in mfi_linux_ioctl_int()
3515 cm->cm_flags |= MFI_CMD_DATAIN; in mfi_linux_ioctl_int()
3516 if (cm->cm_frame->header.flags & MFI_FRAME_DATAOUT) in mfi_linux_ioctl_int()
3517 cm->cm_flags |= MFI_CMD_DATAOUT; in mfi_linux_ioctl_int()
3518 cm->cm_len = cm->cm_frame->header.data_len; in mfi_linux_ioctl_int()
3519 if (cm->cm_len && in mfi_linux_ioctl_int()
3520 (cm->cm_flags & (MFI_CMD_DATAIN | MFI_CMD_DATAOUT))) { in mfi_linux_ioctl_int()
3521 cm->cm_data = data = malloc(cm->cm_len, M_MFIBUF, in mfi_linux_ioctl_int()
3524 cm->cm_data = 0; in mfi_linux_ioctl_int()
3528 cm->cm_frame->header.context = context; in mfi_linux_ioctl_int()
3531 if (cm->cm_flags & MFI_CMD_DATAOUT) { in mfi_linux_ioctl_int()
3545 if (cm->cm_frame->header.cmd == MFI_CMD_DCMD) in mfi_linux_ioctl_int()
3546 locked = mfi_config_lock(sc, cm->cm_frame->dcmd.opcode); in mfi_linux_ioctl_int()
3548 if (cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) { in mfi_linux_ioctl_int()
3549 cm->cm_frame->pass.sense_addr_lo = in mfi_linux_ioctl_int()
3550 (uint32_t)cm->cm_sense_busaddr; in mfi_linux_ioctl_int()
3551 cm->cm_frame->pass.sense_addr_hi = in mfi_linux_ioctl_int()
3552 (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32); in mfi_linux_ioctl_int()
3556 error = mfi_check_command_pre(sc, cm); in mfi_linux_ioctl_int()
3562 if ((error = mfi_wait_command(sc, cm)) != 0) { in mfi_linux_ioctl_int()
3569 mfi_check_command_post(sc, cm); in mfi_linux_ioctl_int()
3573 if (cm->cm_flags & MFI_CMD_DATAIN) { in mfi_linux_ioctl_int()
3600 error = copyout(cm->cm_sense, sense_ptr.user_space, in mfi_linux_ioctl_int()
3609 error = copyout(&cm->cm_frame->header.cmd_status, in mfi_linux_ioctl_int()
3623 if (cm) { in mfi_linux_ioctl_int()
3625 mfi_release_command(cm); in mfi_linux_ioctl_int()
3692 struct mfi_command *cm; in mfi_dump_all() local
3712 TAILQ_FOREACH(cm, &sc->mfi_busy, cm_link) { in mfi_dump_all()
3713 if (cm->cm_timestamp <= deadline) { in mfi_dump_all()
3716 cm, (int)(time_uptime - cm->cm_timestamp)); in mfi_dump_all()
3717 MFI_PRINT_CMD(cm); in mfi_dump_all()
3737 struct mfi_command *cm, *tmp; in mfi_timeout() local
3750 TAILQ_FOREACH_SAFE(cm, &sc->mfi_busy, cm_link, tmp) { in mfi_timeout()
3751 if (sc->mfi_aen_cm == cm || sc->mfi_map_sync_cm == cm) in mfi_timeout()
3753 if (cm->cm_timestamp <= deadline) { in mfi_timeout()
3755 cm->cm_timestamp = time_uptime; in mfi_timeout()
3759 cm, (int)(time_uptime - cm->cm_timestamp) in mfi_timeout()
3761 MFI_PRINT_CMD(cm); in mfi_timeout()
3762 MFI_VALIDATE_CMD(sc, cm); in mfi_timeout()