Lines Matching +full:debounce +full:- +full:rep
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2011-2015 LSI Corp.
6 * Copyright (c) 2013-2015 Avago Technologies
30 * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
142 for (i = start; i < sassc->maxtargets; i++) { in mpssas_find_target_by_handle()
143 target = &sassc->targets[i]; in mpssas_find_target_by_handle()
144 if (target->handle == handle) in mpssas_find_target_by_handle()
161 MPS_FUNCTRACE(sassc->sc); in mpssas_startup_increment()
163 if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) { in mpssas_startup_increment()
164 if (sassc->startup_refcount++ == 0) { in mpssas_startup_increment()
166 mps_dprint(sassc->sc, MPS_INIT, in mpssas_startup_increment()
169 xpt_freeze_simq(sassc->sim, 1); in mpssas_startup_increment()
171 mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__, in mpssas_startup_increment()
172 sassc->startup_refcount); in mpssas_startup_increment()
179 if (sassc->flags & MPSSAS_QUEUE_FROZEN) { in mpssas_release_simq_reinit()
180 sassc->flags &= ~MPSSAS_QUEUE_FROZEN; in mpssas_release_simq_reinit()
181 xpt_release_simq(sassc->sim, 1); in mpssas_release_simq_reinit()
182 mps_dprint(sassc->sc, MPS_INFO, "Unfreezing SIM queue\n"); in mpssas_release_simq_reinit()
189 MPS_FUNCTRACE(sassc->sc); in mpssas_startup_decrement()
191 if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) { in mpssas_startup_decrement()
192 if (--sassc->startup_refcount == 0) { in mpssas_startup_decrement()
193 /* finished all discovery-related actions, release in mpssas_startup_decrement()
196 mps_dprint(sassc->sc, MPS_INIT, in mpssas_startup_decrement()
198 sassc->flags &= ~MPSSAS_IN_STARTUP; in mpssas_startup_decrement()
199 xpt_release_simq(sassc->sim, 1); in mpssas_startup_decrement()
202 mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__, in mpssas_startup_decrement()
203 sassc->startup_refcount); in mpssas_startup_decrement()
223 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_alloc_tm()
224 req->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; in mpssas_alloc_tm()
239 if (tm->cm_ccb) { in mpssas_free_tm()
242 tm->cm_targ->tid); in mpssas_free_tm()
243 tm->cm_targ->flags &= ~MPSSAS_TARGET_INRESET; in mpssas_free_tm()
244 xpt_release_devq(tm->cm_ccb->ccb_h.path, 1, TRUE); in mpssas_free_tm()
245 xpt_free_path(tm->cm_ccb->ccb_h.path); in mpssas_free_tm()
246 xpt_free_ccb(tm->cm_ccb); in mpssas_free_tm()
255 struct mpssas_softc *sassc = sc->sassc; in mpssas_rescan_target()
261 pathid = cam_sim_path(sassc->sim); in mpssas_rescan_target()
265 targetid = targ - sassc->targets; in mpssas_rescan_target()
276 if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid, in mpssas_rescan_target()
284 ccb->ccb_h.func_code = XPT_SCAN_BUS; in mpssas_rescan_target()
286 ccb->ccb_h.func_code = XPT_SCAN_TGT; in mpssas_rescan_target()
303 if ((cm->cm_sc->mps_debug & level) == 0) in mpssas_log_command()
310 if (cm->cm_ccb != NULL) { in mpssas_log_command()
311 xpt_path_sbuf(cm->cm_ccb->csio.ccb_h.path, &sb); in mpssas_log_command()
312 if (cm->cm_ccb->ccb_h.func_code == XPT_SCSI_IO) { in mpssas_log_command()
313 scsi_command_string(&cm->cm_ccb->csio, &sb); in mpssas_log_command()
315 cm->cm_ccb->csio.dxfer_len); in mpssas_log_command()
320 cam_sim_name(cm->cm_sc->sassc->sim), in mpssas_log_command()
321 cam_sim_unit(cm->cm_sc->sassc->sim), in mpssas_log_command()
322 cam_sim_bus(cm->cm_sc->sassc->sim), in mpssas_log_command()
323 cm->cm_targ ? cm->cm_targ->tid : 0xFFFFFFFF, in mpssas_log_command()
324 cm->cm_lun); in mpssas_log_command()
327 sbuf_printf(&sb, "SMID %u ", cm->cm_desc.Default.SMID); in mpssas_log_command()
330 mps_print_field(cm->cm_sc, "%s", sbuf_data(&sb)); in mpssas_log_command()
344 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_remove_volume()
345 handle = (uint16_t)(uintptr_t)tm->cm_complete_data; in mpssas_remove_volume()
346 targ = tm->cm_targ; in mpssas_remove_volume()
357 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) != in mpssas_remove_volume()
361 le16toh(reply->IOCStatus), handle); in mpssas_remove_volume()
365 "Reset aborted %u commands\n", reply->TerminationCount); in mpssas_remove_volume()
366 mps_free_reply(sc, tm->cm_reply_data); in mpssas_remove_volume()
367 tm->cm_reply = NULL; /* Ensures the reply won't get re-freed */ in mpssas_remove_volume()
370 "clearing target %u handle 0x%04x\n", targ->tid, handle); in mpssas_remove_volume()
378 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) == in mpssas_remove_volume()
380 targ = tm->cm_targ; in mpssas_remove_volume()
381 targ->handle = 0x0; in mpssas_remove_volume()
382 targ->encl_handle = 0x0; in mpssas_remove_volume()
383 targ->encl_slot = 0x0; in mpssas_remove_volume()
384 targ->exp_dev_handle = 0x0; in mpssas_remove_volume()
385 targ->phy_num = 0x0; in mpssas_remove_volume()
386 targ->linkrate = 0x0; in mpssas_remove_volume()
387 targ->devinfo = 0x0; in mpssas_remove_volume()
388 targ->flags = 0x0; in mpssas_remove_volume()
406 MPS_FUNCTRACE(sassc->sc); in mpssas_prepare_volume_remove()
407 sc = sassc->sc; in mpssas_prepare_volume_remove()
415 if (sc->WD_available && (sc->WD_hide_expose == in mpssas_prepare_volume_remove()
430 targ->flags |= MPSSAS_TARGET_INREMOVAL; in mpssas_prepare_volume_remove()
441 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_prepare_volume_remove()
442 req->DevHandle = targ->handle; in mpssas_prepare_volume_remove()
443 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; in mpssas_prepare_volume_remove()
446 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET; in mpssas_prepare_volume_remove()
448 tm->cm_targ = targ; in mpssas_prepare_volume_remove()
449 tm->cm_data = NULL; in mpssas_prepare_volume_remove()
450 tm->cm_complete = mpssas_remove_volume; in mpssas_prepare_volume_remove()
451 tm->cm_complete_data = (void *)(uintptr_t)handle; in mpssas_prepare_volume_remove()
454 __func__, targ->tid); in mpssas_prepare_volume_remove()
461 * The MPT2 firmware performs debounce on the link to avoid transient link
464 * target reset and then an op remove. The reset has the side-effect of
466 * the op-remove to succeed. It's not clear if the host should check for
477 MPS_FUNCTRACE(sassc->sc); in mpssas_prepare_remove()
479 sc = sassc->sc; in mpssas_prepare_remove()
490 targ->flags |= MPSSAS_TARGET_INREMOVAL; in mpssas_prepare_remove()
501 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)cm->cm_req; in mpssas_prepare_remove()
502 req->DevHandle = htole16(targ->handle); in mpssas_prepare_remove()
503 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; in mpssas_prepare_remove()
506 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET; in mpssas_prepare_remove()
508 cm->cm_targ = targ; in mpssas_prepare_remove()
509 cm->cm_data = NULL; in mpssas_prepare_remove()
510 cm->cm_complete = mpssas_remove_device; in mpssas_prepare_remove()
511 cm->cm_complete_data = (void *)(uintptr_t)handle; in mpssas_prepare_remove()
514 __func__, targ->tid); in mpssas_prepare_remove()
530 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_remove_device()
531 handle = (uint16_t)(uintptr_t)tm->cm_complete_data; in mpssas_remove_device()
532 targ = tm->cm_targ; in mpssas_remove_device()
539 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_remove_device()
542 "This should not happen!\n", __func__, tm->cm_flags, in mpssas_remove_device()
555 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) != in mpssas_remove_device()
559 le16toh(reply->IOCStatus), handle); in mpssas_remove_device()
563 le32toh(reply->TerminationCount)); in mpssas_remove_device()
564 mps_free_reply(sc, tm->cm_reply_data); in mpssas_remove_device()
565 tm->cm_reply = NULL; /* Ensures the reply won't get re-freed */ in mpssas_remove_device()
568 req = (MPI2_SAS_IOUNIT_CONTROL_REQUEST *)tm->cm_req; in mpssas_remove_device()
570 req->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL; in mpssas_remove_device()
571 req->Operation = MPI2_SAS_OP_REMOVE_DEVICE; in mpssas_remove_device()
572 req->DevHandle = htole16(handle); in mpssas_remove_device()
573 tm->cm_data = NULL; in mpssas_remove_device()
574 tm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mpssas_remove_device()
575 tm->cm_complete = mpssas_remove_complete; in mpssas_remove_device()
576 tm->cm_complete_data = (void *)(uintptr_t)handle; in mpssas_remove_device()
583 if (TAILQ_FIRST(&targ->commands) == NULL) { in mpssas_remove_device()
586 targ->tid, handle); in mpssas_remove_device()
588 targ->pending_remove_tm = NULL; in mpssas_remove_device()
590 targ->pending_remove_tm = tm; in mpssas_remove_device()
594 targ->tid, handle); in mpssas_remove_device()
607 reply = (MPI2_SAS_IOUNIT_CONTROL_REPLY *)tm->cm_reply; in mpssas_remove_complete()
608 handle = (uint16_t)(uintptr_t)tm->cm_complete_data; in mpssas_remove_complete()
609 targ = tm->cm_targ; in mpssas_remove_complete()
615 KASSERT(TAILQ_FIRST(&targ->commands) == NULL, in mpssas_remove_complete()
623 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_remove_complete()
626 "This should not happen!\n", __func__, tm->cm_flags, in mpssas_remove_complete()
642 handle, le16toh(reply->IOCStatus)); in mpssas_remove_complete()
650 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) == in mpssas_remove_complete()
652 targ->handle = 0x0; in mpssas_remove_complete()
653 targ->encl_handle = 0x0; in mpssas_remove_complete()
654 targ->encl_slot = 0x0; in mpssas_remove_complete()
655 targ->exp_dev_handle = 0x0; in mpssas_remove_complete()
656 targ->phy_num = 0x0; in mpssas_remove_complete()
657 targ->linkrate = 0x0; in mpssas_remove_complete()
658 targ->devinfo = 0x0; in mpssas_remove_complete()
659 targ->flags = 0x0; in mpssas_remove_complete()
661 while(!SLIST_EMPTY(&targ->luns)) { in mpssas_remove_complete()
662 lun = SLIST_FIRST(&targ->luns); in mpssas_remove_complete()
663 SLIST_REMOVE_HEAD(&targ->luns, lun_link); in mpssas_remove_complete()
691 &sc->sassc->mpssas_eh); in mpssas_register_events()
714 sassc->maxtargets = sc->facts->MaxTargets + sc->facts->MaxVolumes; in mps_attach_sas()
715 sassc->targets = malloc(sizeof(struct mpssas_target) * in mps_attach_sas()
716 sassc->maxtargets, M_MPT2, M_WAITOK|M_ZERO); in mps_attach_sas()
717 sc->sassc = sassc; in mps_attach_sas()
718 sassc->sc = sc; in mps_attach_sas()
720 reqs = sc->num_reqs - sc->num_prireqs - 1; in mps_attach_sas()
721 if ((sassc->devq = cam_simq_alloc(reqs)) == NULL) { in mps_attach_sas()
727 unit = device_get_unit(sc->mps_dev); in mps_attach_sas()
728 sassc->sim = cam_sim_alloc(mpssas_action, mpssas_poll, "mps", sassc, in mps_attach_sas()
729 unit, &sc->mps_mtx, reqs, reqs, sassc->devq); in mps_attach_sas()
730 if (sassc->sim == NULL) { in mps_attach_sas()
736 TAILQ_INIT(&sassc->ev_queue); in mps_attach_sas()
739 TASK_INIT(&sassc->ev_task, 0, mpssas_firmware_event_work, sc); in mps_attach_sas()
740 sassc->ev_tq = taskqueue_create("mps_taskq", M_NOWAIT | M_ZERO, in mps_attach_sas()
741 taskqueue_thread_enqueue, &sassc->ev_tq); in mps_attach_sas()
742 taskqueue_start_threads(&sassc->ev_tq, 1, PRIBIO, "%s taskq", in mps_attach_sas()
743 device_get_nameunit(sc->mps_dev)); in mps_attach_sas()
752 if ((error = xpt_bus_register(sassc->sim, sc->mps_dev, 0)) != 0) { in mps_attach_sas()
764 sassc->flags |= MPSSAS_IN_STARTUP | MPSSAS_IN_DISCOVERY; in mps_attach_sas()
765 sc->sassc->startup_refcount = 0; in mps_attach_sas()
774 status = xpt_create_path(&sassc->path, /*periph*/NULL, in mps_attach_sas()
775 cam_sim_path(sc->sassc->sim), CAM_TARGET_WILDCARD, in mps_attach_sas()
780 sassc->path = NULL; in mps_attach_sas()
786 sassc->path); in mps_attach_sas()
791 xpt_free_path(sassc->path); in mps_attach_sas()
792 sassc->path = NULL; in mps_attach_sas()
822 if (sc->sassc == NULL) in mps_detach_sas()
825 sassc = sc->sassc; in mps_detach_sas()
826 mps_deregister_events(sc, sassc->mpssas_eh); in mps_detach_sas()
833 if (sassc->ev_tq != NULL) in mps_detach_sas()
834 taskqueue_free(sassc->ev_tq); in mps_detach_sas()
837 if (sassc->path != NULL) { in mps_detach_sas()
838 xpt_register_async(0, mpssas_async, sc, sassc->path); in mps_detach_sas()
839 xpt_free_path(sassc->path); in mps_detach_sas()
840 sassc->path = NULL; in mps_detach_sas()
846 while (sassc->startup_refcount != 0) in mps_detach_sas()
849 if (sassc->flags & MPSSAS_IN_STARTUP) in mps_detach_sas()
850 xpt_release_simq(sassc->sim, 1); in mps_detach_sas()
852 if (sassc->sim != NULL) { in mps_detach_sas()
853 xpt_bus_deregister(cam_sim_path(sassc->sim)); in mps_detach_sas()
854 cam_sim_free(sassc->sim, FALSE); in mps_detach_sas()
859 if (sassc->devq != NULL) in mps_detach_sas()
860 cam_simq_free(sassc->devq); in mps_detach_sas()
862 for(i=0; i< sassc->maxtargets ;i++) { in mps_detach_sas()
863 targ = &sassc->targets[i]; in mps_detach_sas()
864 SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) { in mps_detach_sas()
868 free(sassc->targets, M_MPT2); in mps_detach_sas()
870 sc->sassc = NULL; in mps_detach_sas()
878 struct mps_softc *sc = sassc->sc; in mpssas_discovery_end()
893 if (sc->track_mapping_events) { in mpssas_discovery_end()
897 callout_reset(&sc->device_check_callout, in mpssas_discovery_end()
910 MPS_FUNCTRACE(sassc->sc); in mpssas_action()
911 mps_dprint(sassc->sc, MPS_TRACE, "ccb func_code 0x%x\n", in mpssas_action()
912 ccb->ccb_h.func_code); in mpssas_action()
913 mtx_assert(&sassc->sc->mps_mtx, MA_OWNED); in mpssas_action()
915 switch (ccb->ccb_h.func_code) { in mpssas_action()
918 struct ccb_pathinq *cpi = &ccb->cpi; in mpssas_action()
919 struct mps_softc *sc = sassc->sc; in mpssas_action()
921 cpi->version_num = 1; in mpssas_action()
922 cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16; in mpssas_action()
923 cpi->target_sprt = 0; in mpssas_action()
924 cpi->hba_misc = PIM_NOBUSRESET | PIM_UNMAPPED | PIM_NOSCAN; in mpssas_action()
925 cpi->hba_eng_cnt = 0; in mpssas_action()
926 cpi->max_target = sassc->maxtargets - 1; in mpssas_action()
927 cpi->max_lun = 255; in mpssas_action()
933 cpi->initiator_id = sassc->maxtargets; in mpssas_action()
934 strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); in mpssas_action()
935 strlcpy(cpi->hba_vid, "Avago Tech", HBA_IDLEN); in mpssas_action()
936 strlcpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); in mpssas_action()
937 cpi->unit_number = cam_sim_unit(sim); in mpssas_action()
938 cpi->bus_id = cam_sim_bus(sim); in mpssas_action()
939 cpi->base_transfer_speed = 150000; in mpssas_action()
940 cpi->transport = XPORT_SAS; in mpssas_action()
941 cpi->transport_version = 0; in mpssas_action()
942 cpi->protocol = PROTO_SCSI; in mpssas_action()
943 cpi->protocol_version = SCSI_REV_SPC; in mpssas_action()
944 cpi->maxio = sc->maxio; in mpssas_action()
955 cts = &ccb->cts; in mpssas_action()
956 sas = &cts->xport_specific.sas; in mpssas_action()
957 scsi = &cts->proto_specific.scsi; in mpssas_action()
959 KASSERT(cts->ccb_h.target_id < sassc->maxtargets, in mpssas_action()
961 cts->ccb_h.target_id)); in mpssas_action()
962 targ = &sassc->targets[cts->ccb_h.target_id]; in mpssas_action()
963 if (targ->handle == 0x0) { in mpssas_action()
968 cts->protocol_version = SCSI_REV_SPC2; in mpssas_action()
969 cts->transport = XPORT_SAS; in mpssas_action()
970 cts->transport_version = 0; in mpssas_action()
972 sas->valid = CTS_SAS_VALID_SPEED; in mpssas_action()
973 switch (targ->linkrate) { in mpssas_action()
975 sas->bitrate = 150000; in mpssas_action()
978 sas->bitrate = 300000; in mpssas_action()
981 sas->bitrate = 600000; in mpssas_action()
984 sas->valid = 0; in mpssas_action()
987 cts->protocol = PROTO_SCSI; in mpssas_action()
988 scsi->valid = CTS_SCSI_VALID_TQ; in mpssas_action()
989 scsi->flags = CTS_SCSI_FLAGS_TAG_ENB; in mpssas_action()
995 cam_calc_geometry(&ccb->ccg, /*extended*/1); in mpssas_action()
999 mps_dprint(sassc->sc, MPS_XINFO, "mpssas_action XPT_RESET_DEV\n"); in mpssas_action()
1005 mps_dprint(sassc->sc, MPS_XINFO, in mpssas_action()
1027 path_id_t path_id = cam_sim_path(sc->sassc->sim); in mpssas_announce_reset()
1052 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_complete_all_commands()
1055 for (i = 1; i < sc->num_reqs; i++) { in mpssas_complete_all_commands()
1056 cm = &sc->commands[i]; in mpssas_complete_all_commands()
1057 if (cm->cm_state == MPS_CM_STATE_FREE) in mpssas_complete_all_commands()
1060 cm->cm_state = MPS_CM_STATE_BUSY; in mpssas_complete_all_commands()
1061 cm->cm_reply = NULL; in mpssas_complete_all_commands()
1064 if (cm->cm_flags & MPS_CM_FLAGS_SATA_ID_TIMEOUT) { in mpssas_complete_all_commands()
1065 MPASS(cm->cm_data); in mpssas_complete_all_commands()
1066 free(cm->cm_data, M_MPT2); in mpssas_complete_all_commands()
1067 cm->cm_data = NULL; in mpssas_complete_all_commands()
1070 if (cm->cm_flags & MPS_CM_FLAGS_POLLED) in mpssas_complete_all_commands()
1071 cm->cm_flags |= MPS_CM_FLAGS_COMPLETE; in mpssas_complete_all_commands()
1073 if (cm->cm_complete != NULL) { in mpssas_complete_all_commands()
1076 cm, cm->cm_state, cm->cm_ccb); in mpssas_complete_all_commands()
1078 cm->cm_complete(sc, cm); in mpssas_complete_all_commands()
1080 } else if (cm->cm_flags & MPS_CM_FLAGS_WAKEUP) { in mpssas_complete_all_commands()
1083 cm, cm->cm_state, cm->cm_ccb); in mpssas_complete_all_commands()
1088 if ((completed == 0) && (cm->cm_state != MPS_CM_STATE_FREE)) { in mpssas_complete_all_commands()
1092 "reset\n", cm, cm->cm_state, cm->cm_flags, in mpssas_complete_all_commands()
1093 cm->cm_ccb); in mpssas_complete_all_commands()
1097 sc->io_cmds_active = 0; in mpssas_complete_all_commands()
1110 * discovery-related activities have finished, the simq will be in mpssas_handle_reinit()
1114 sc->sassc->flags |= MPSSAS_IN_STARTUP; in mpssas_handle_reinit()
1115 sc->sassc->flags |= MPSSAS_IN_DISCOVERY; in mpssas_handle_reinit()
1116 mpssas_startup_increment(sc->sassc); in mpssas_handle_reinit()
1127 sc->sassc->startup_refcount); in mpssas_handle_reinit()
1133 for (i = 0; i < sc->sassc->maxtargets; i++) { in mpssas_handle_reinit()
1134 if (sc->sassc->targets[i].outstanding != 0) in mpssas_handle_reinit()
1136 i, sc->sassc->targets[i].outstanding); in mpssas_handle_reinit()
1137 sc->sassc->targets[i].handle = 0x0; in mpssas_handle_reinit()
1138 sc->sassc->targets[i].exp_dev_handle = 0x0; in mpssas_handle_reinit()
1139 sc->sassc->targets[i].outstanding = 0; in mpssas_handle_reinit()
1140 sc->sassc->targets[i].flags = MPSSAS_TARGET_INDIAGRESET; in mpssas_handle_reinit()
1148 struct mps_softc *sc = tm->cm_sc; in mpssas_tm_timeout()
1150 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_tm_timeout()
1155 KASSERT(tm->cm_state == MPS_CM_STATE_INQUEUE, in mpssas_tm_timeout()
1156 ("command not inqueue, state = %u\n", tm->cm_state)); in mpssas_tm_timeout()
1158 tm->cm_state = MPS_CM_STATE_BUSY; in mpssas_tm_timeout()
1170 callout_stop(&tm->cm_callout); in mpssas_logical_unit_reset_complete()
1172 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_logical_unit_reset_complete()
1173 targ = tm->cm_targ; in mpssas_logical_unit_reset_complete()
1181 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_logical_unit_reset_complete()
1184 "This should not happen!\n", __func__, tm->cm_flags); in mpssas_logical_unit_reset_complete()
1192 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) { in mpssas_logical_unit_reset_complete()
1196 targ->tm = NULL; in mpssas_logical_unit_reset_complete()
1210 le16toh(reply->IOCStatus), le32toh(reply->ResponseCode), in mpssas_logical_unit_reset_complete()
1211 le32toh(reply->TerminationCount)); in mpssas_logical_unit_reset_complete()
1215 * This could be made more efficient by using a per-LU data in mpssas_logical_unit_reset_complete()
1218 TAILQ_FOREACH(cm, &targ->commands, cm_link) { in mpssas_logical_unit_reset_complete()
1219 if (cm->cm_lun == tm->cm_lun) in mpssas_logical_unit_reset_complete()
1226 targ->tid); in mpssas_logical_unit_reset_complete()
1228 mpssas_announce_reset(sc, AC_SENT_BDR, targ->tid, tm->cm_lun); in mpssas_logical_unit_reset_complete()
1235 cm = TAILQ_FIRST(&targ->timedout_commands); in mpssas_logical_unit_reset_complete()
1239 targ->tid); in mpssas_logical_unit_reset_complete()
1242 targ->tm = NULL; in mpssas_logical_unit_reset_complete()
1253 "have %u command(s), sending target reset\n", targ->tid, in mpssas_logical_unit_reset_complete()
1267 callout_stop(&tm->cm_callout); in mpssas_target_reset_complete()
1269 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_target_reset_complete()
1270 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_target_reset_complete()
1271 targ = tm->cm_targ; in mpssas_target_reset_complete()
1278 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_target_reset_complete()
1280 "This should not happen!\n", __func__, tm->cm_flags); in mpssas_target_reset_complete()
1288 tm, le16toh(req->TaskMID)); in mpssas_target_reset_complete()
1289 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) { in mpssas_target_reset_complete()
1293 targ->tm = NULL; in mpssas_target_reset_complete()
1306 le16toh(reply->IOCStatus), le32toh(reply->ResponseCode), in mpssas_target_reset_complete()
1307 le32toh(reply->TerminationCount)); in mpssas_target_reset_complete()
1309 if (targ->outstanding == 0) { in mpssas_target_reset_complete()
1314 "Finished reset recovery for target %u\n", targ->tid); in mpssas_target_reset_complete()
1316 mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid, in mpssas_target_reset_complete()
1319 targ->tm = NULL; in mpssas_target_reset_complete()
1329 "command(s), resetting controller\n", targ->tid, in mpssas_target_reset_complete()
1330 targ->outstanding); in mpssas_target_reset_complete()
1344 target = tm->cm_targ; in mpssas_send_reset()
1345 if (target->handle == 0) { in mpssas_send_reset()
1347 __func__, target->tid); in mpssas_send_reset()
1348 return -1; in mpssas_send_reset()
1351 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_send_reset()
1352 req->DevHandle = htole16(target->handle); in mpssas_send_reset()
1353 req->TaskType = type; in mpssas_send_reset()
1357 MPS_SET_LUN(req->LUN, tm->cm_lun); in mpssas_send_reset()
1358 tm->cm_targ->logical_unit_resets++; in mpssas_send_reset()
1361 target->tid, tm->cm_lun); in mpssas_send_reset()
1362 tm->cm_complete = mpssas_logical_unit_reset_complete; in mpssas_send_reset()
1363 mpssas_prepare_for_tm(sc, tm, target, tm->cm_lun); in mpssas_send_reset()
1369 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET; in mpssas_send_reset()
1370 tm->cm_targ->target_resets++; in mpssas_send_reset()
1372 "Sending target reset to target %u\n", target->tid); in mpssas_send_reset()
1373 tm->cm_complete = mpssas_target_reset_complete; in mpssas_send_reset()
1377 return -1; in mpssas_send_reset()
1380 tm->cm_data = NULL; in mpssas_send_reset()
1381 tm->cm_complete_data = (void *)tm; in mpssas_send_reset()
1383 callout_reset(&tm->cm_callout, MPS_RESET_TIMEOUT * hz, in mpssas_send_reset()
1403 callout_stop(&tm->cm_callout); in mpssas_abort_complete()
1405 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_abort_complete()
1406 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_abort_complete()
1407 targ = tm->cm_targ; in mpssas_abort_complete()
1414 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_abort_complete()
1417 tm->cm_flags, tm, le16toh(req->TaskMID)); in mpssas_abort_complete()
1425 tm, le16toh(req->TaskMID)); in mpssas_abort_complete()
1426 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) { in mpssas_abort_complete()
1430 targ->tm = NULL; in mpssas_abort_complete()
1443 le16toh(req->TaskMID), in mpssas_abort_complete()
1444 le16toh(reply->IOCStatus), le32toh(reply->ResponseCode), in mpssas_abort_complete()
1445 le32toh(reply->TerminationCount)); in mpssas_abort_complete()
1447 cm = TAILQ_FIRST(&tm->cm_targ->timedout_commands); in mpssas_abort_complete()
1454 "Finished abort recovery for target %u\n", targ->tid); in mpssas_abort_complete()
1456 targ->tm = NULL; in mpssas_abort_complete()
1458 } else if (le16toh(req->TaskMID) != cm->cm_desc.Default.SMID) { in mpssas_abort_complete()
1461 "Continuing abort recovery for target %u\n", targ->tid); in mpssas_abort_complete()
1470 targ->tid); in mpssas_abort_complete()
1486 targ = cm->cm_targ; in mpssas_send_abort()
1487 if (targ->handle == 0) { in mpssas_send_abort()
1490 __func__, cm->cm_ccb->ccb_h.target_id); in mpssas_send_abort()
1491 return -1; in mpssas_send_abort()
1497 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_send_abort()
1498 req->DevHandle = htole16(targ->handle); in mpssas_send_abort()
1499 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK; in mpssas_send_abort()
1502 MPS_SET_LUN(req->LUN, cm->cm_ccb->ccb_h.target_lun); in mpssas_send_abort()
1504 req->TaskMID = htole16(cm->cm_desc.Default.SMID); in mpssas_send_abort()
1506 tm->cm_data = NULL; in mpssas_send_abort()
1507 tm->cm_complete = mpssas_abort_complete; in mpssas_send_abort()
1508 tm->cm_complete_data = (void *)tm; in mpssas_send_abort()
1509 tm->cm_targ = cm->cm_targ; in mpssas_send_abort()
1510 tm->cm_lun = cm->cm_lun; in mpssas_send_abort()
1512 callout_reset(&tm->cm_callout, MPS_ABORT_TIMEOUT * hz, in mpssas_send_abort()
1515 targ->aborts++; in mpssas_send_abort()
1517 mpssas_prepare_for_tm(sc, tm, targ, tm->cm_lun); in mpssas_send_abort()
1523 err, cm, req->TaskMID); in mpssas_send_abort()
1537 sc = cm->cm_sc; in mpssas_scsiio_timeout()
1538 ccb = cm->cm_ccb; in mpssas_scsiio_timeout()
1542 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_scsiio_timeout()
1549 * and been re-used, though this is unlikely. in mpssas_scsiio_timeout()
1552 if (cm->cm_flags & MPS_CM_FLAGS_ON_RECOVERY) { in mpssas_scsiio_timeout()
1558 if (cm->cm_ccb == NULL) { in mpssas_scsiio_timeout()
1563 targ = cm->cm_targ; in mpssas_scsiio_timeout()
1564 targ->timeouts++; in mpssas_scsiio_timeout()
1566 elapsed = now - ccb->ccb_h.qos.sim_data; in mpssas_scsiio_timeout()
1569 targ->tid, targ->handle, ccb->ccb_h.timeout, in mpssas_scsiio_timeout()
1575 mpssas_set_ccbstatus(cm->cm_ccb, CAM_CMD_TIMEOUT); in mpssas_scsiio_timeout()
1576 cm->cm_flags |= MPS_CM_FLAGS_ON_RECOVERY | MPS_CM_FLAGS_TIMEDOUT; in mpssas_scsiio_timeout()
1577 TAILQ_INSERT_TAIL(&targ->timedout_commands, cm, cm_recovery); in mpssas_scsiio_timeout()
1579 if (targ->tm != NULL) { in mpssas_scsiio_timeout()
1585 cm, targ->tm); in mpssas_scsiio_timeout()
1586 } else if ((targ->tm = mpssas_alloc_tm(sc)) != NULL) { in mpssas_scsiio_timeout()
1588 "Sending abort to target %u for SMID %d\n", targ->tid, in mpssas_scsiio_timeout()
1589 cm->cm_desc.Default.SMID); in mpssas_scsiio_timeout()
1591 cm, targ->tm); in mpssas_scsiio_timeout()
1594 mpssas_send_abort(sc, targ->tm, cm); in mpssas_scsiio_timeout()
1624 sc = sassc->sc; in mpssas_action_scsiio()
1626 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_action_scsiio()
1628 csio = &ccb->csio; in mpssas_action_scsiio()
1629 KASSERT(csio->ccb_h.target_id < sassc->maxtargets, in mpssas_action_scsiio()
1631 csio->ccb_h.target_id)); in mpssas_action_scsiio()
1632 targ = &sassc->targets[csio->ccb_h.target_id]; in mpssas_action_scsiio()
1633 mps_dprint(sc, MPS_TRACE, "ccb %p target flag %x\n", ccb, targ->flags); in mpssas_action_scsiio()
1634 if (targ->handle == 0x0) { in mpssas_action_scsiio()
1635 if (targ->flags & MPSSAS_TARGET_INDIAGRESET) { in mpssas_action_scsiio()
1638 __func__, csio->ccb_h.target_id); in mpssas_action_scsiio()
1639 ccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_DEV_QFRZN; in mpssas_action_scsiio()
1640 xpt_freeze_devq(ccb->ccb_h.path, 1); in mpssas_action_scsiio()
1645 __func__, csio->ccb_h.target_id); in mpssas_action_scsiio()
1650 if (targ->flags & MPS_TARGET_FLAGS_RAID_COMPONENT) { in mpssas_action_scsiio()
1652 "supported %u\n", __func__, csio->ccb_h.target_id); in mpssas_action_scsiio()
1664 "target %u\n", __func__, csio->ccb_h.target_id); in mpssas_action_scsiio()
1677 if (targ->flags & MPSSAS_TARGET_INREMOVAL) { in mpssas_action_scsiio()
1678 if (targ->devinfo == 0) in mpssas_action_scsiio()
1686 if ((sc->mps_flags & MPS_FLAGS_SHUTDOWN) != 0) { in mpssas_action_scsiio()
1697 if (targ->flags & MPSSAS_TARGET_INRESET) { in mpssas_action_scsiio()
1698 ccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_DEV_QFRZN; in mpssas_action_scsiio()
1700 __func__, targ->tid); in mpssas_action_scsiio()
1701 xpt_freeze_devq(ccb->ccb_h.path, 1); in mpssas_action_scsiio()
1707 if (cm == NULL || (sc->mps_flags & MPS_FLAGS_DIAGRESET)) { in mpssas_action_scsiio()
1711 if ((sassc->flags & MPSSAS_QUEUE_FROZEN) == 0) { in mpssas_action_scsiio()
1712 xpt_freeze_simq(sassc->sim, 1); in mpssas_action_scsiio()
1713 sassc->flags |= MPSSAS_QUEUE_FROZEN; in mpssas_action_scsiio()
1715 ccb->ccb_h.status &= ~CAM_SIM_QUEUED; in mpssas_action_scsiio()
1716 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in mpssas_action_scsiio()
1721 req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req; in mpssas_action_scsiio()
1723 req->DevHandle = htole16(targ->handle); in mpssas_action_scsiio()
1724 req->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; in mpssas_action_scsiio()
1725 req->MsgFlags = 0; in mpssas_action_scsiio()
1726 req->SenseBufferLowAddress = htole32(cm->cm_sense_busaddr); in mpssas_action_scsiio()
1727 req->SenseBufferLength = MPS_SENSE_LEN; in mpssas_action_scsiio()
1728 req->SGLFlags = 0; in mpssas_action_scsiio()
1729 req->ChainOffset = 0; in mpssas_action_scsiio()
1730 req->SGLOffset0 = 24; /* 32bit word offset to the SGL */ in mpssas_action_scsiio()
1731 req->SGLOffset1= 0; in mpssas_action_scsiio()
1732 req->SGLOffset2= 0; in mpssas_action_scsiio()
1733 req->SGLOffset3= 0; in mpssas_action_scsiio()
1734 req->SkipCount = 0; in mpssas_action_scsiio()
1735 req->DataLength = htole32(csio->dxfer_len); in mpssas_action_scsiio()
1736 req->BidirectionalDataLength = 0; in mpssas_action_scsiio()
1737 req->IoFlags = htole16(csio->cdb_len); in mpssas_action_scsiio()
1738 req->EEDPFlags = 0; in mpssas_action_scsiio()
1741 switch (csio->ccb_h.flags & CAM_DIR_MASK) { in mpssas_action_scsiio()
1744 cm->cm_flags |= MPS_CM_FLAGS_DATAIN; in mpssas_action_scsiio()
1748 cm->cm_flags |= MPS_CM_FLAGS_DATAOUT; in mpssas_action_scsiio()
1756 if (csio->cdb_len == 32) in mpssas_action_scsiio()
1763 switch (csio->tag_action) { in mpssas_action_scsiio()
1779 mpi_control |= (csio->priority << MPI2_SCSIIO_CONTROL_TASKPRI_SHIFT) & in mpssas_action_scsiio()
1781 mpi_control |= sc->mapping_table[csio->ccb_h.target_id].TLR_bits; in mpssas_action_scsiio()
1782 req->Control = htole32(mpi_control); in mpssas_action_scsiio()
1783 if (MPS_SET_LUN(req->LUN, csio->ccb_h.target_lun) != 0) { in mpssas_action_scsiio()
1790 if (csio->ccb_h.flags & CAM_CDB_POINTER) in mpssas_action_scsiio()
1791 bcopy(csio->cdb_io.cdb_ptr, &req->CDB.CDB32[0], csio->cdb_len); in mpssas_action_scsiio()
1793 bcopy(csio->cdb_io.cdb_bytes, &req->CDB.CDB32[0],csio->cdb_len); in mpssas_action_scsiio()
1794 req->IoFlags = htole16(csio->cdb_len); in mpssas_action_scsiio()
1802 eedp_flags = op_code_prot[req->CDB.CDB32[0]]; in mpssas_action_scsiio()
1803 if (sc->eedp_enabled && eedp_flags) { in mpssas_action_scsiio()
1804 SLIST_FOREACH(lun, &targ->luns, lun_link) { in mpssas_action_scsiio()
1805 if (lun->lun_id == csio->ccb_h.target_lun) { in mpssas_action_scsiio()
1810 if ((lun != NULL) && (lun->eedp_formatted)) { in mpssas_action_scsiio()
1811 req->EEDPBlockSize = htole16(lun->eedp_block_size); in mpssas_action_scsiio()
1815 req->EEDPFlags = htole16(eedp_flags); in mpssas_action_scsiio()
1825 if (csio->cdb_len != 32) { in mpssas_action_scsiio()
1826 lba_byte = (csio->cdb_len == 16) ? 6 : 2; in mpssas_action_scsiio()
1827 ref_tag_addr = (uint8_t *)&req->CDB.EEDP32. in mpssas_action_scsiio()
1831 req->CDB.CDB32[lba_byte + i]; in mpssas_action_scsiio()
1834 req->CDB.EEDP32.PrimaryReferenceTag = in mpssas_action_scsiio()
1835 htole32(req->CDB.EEDP32.PrimaryReferenceTag); in mpssas_action_scsiio()
1836 req->CDB.EEDP32.PrimaryApplicationTagMask = in mpssas_action_scsiio()
1838 req->CDB.CDB32[1] = (req->CDB.CDB32[1] & 0x1F) | in mpssas_action_scsiio()
1843 req->EEDPFlags = htole16(eedp_flags); in mpssas_action_scsiio()
1844 req->CDB.CDB32[10] = (req->CDB.CDB32[10] & in mpssas_action_scsiio()
1850 cm->cm_length = csio->dxfer_len; in mpssas_action_scsiio()
1851 if (cm->cm_length != 0) { in mpssas_action_scsiio()
1852 cm->cm_data = ccb; in mpssas_action_scsiio()
1853 cm->cm_flags |= MPS_CM_FLAGS_USE_CCB; in mpssas_action_scsiio()
1855 cm->cm_data = NULL; in mpssas_action_scsiio()
1857 cm->cm_sge = &req->SGL; in mpssas_action_scsiio()
1858 cm->cm_sglsize = (32 - 24) * 4; in mpssas_action_scsiio()
1859 cm->cm_desc.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO; in mpssas_action_scsiio()
1860 cm->cm_desc.SCSIIO.DevHandle = htole16(targ->handle); in mpssas_action_scsiio()
1861 cm->cm_complete = mpssas_scsiio_complete; in mpssas_action_scsiio()
1862 cm->cm_complete_data = ccb; in mpssas_action_scsiio()
1863 cm->cm_targ = targ; in mpssas_action_scsiio()
1864 cm->cm_lun = csio->ccb_h.target_lun; in mpssas_action_scsiio()
1865 cm->cm_ccb = ccb; in mpssas_action_scsiio()
1872 if (sc->WD_valid_config) { in mpssas_action_scsiio()
1873 if (ccb->ccb_h.sim_priv.entries[0].field == MPS_WD_RETRY) { in mpssas_action_scsiio()
1881 if (csio->bio != NULL) in mpssas_action_scsiio()
1882 biotrack(csio->bio, __func__); in mpssas_action_scsiio()
1884 csio->ccb_h.qos.sim_data = sbinuptime(); in mpssas_action_scsiio()
1885 callout_reset_sbt(&cm->cm_callout, SBT_1MS * ccb->ccb_h.timeout, 0, in mpssas_action_scsiio()
1888 targ->issued++; in mpssas_action_scsiio()
1889 targ->outstanding++; in mpssas_action_scsiio()
1890 TAILQ_INSERT_TAIL(&targ->commands, cm, cm_link); in mpssas_action_scsiio()
1891 ccb->ccb_h.status |= CAM_SIM_QUEUED; in mpssas_action_scsiio()
1894 __func__, cm, ccb, targ->outstanding); in mpssas_action_scsiio()
1901 * mps_sc_failed_io_info - translated non-succesfull SCSI_IO request
1909 u16 ioc_status = le16toh(mpi_reply->IOCStatus) & in mps_sc_failed_io_info()
1911 u8 scsi_state = mpi_reply->SCSIState; in mps_sc_failed_io_info()
1912 u8 scsi_status = mpi_reply->SCSIStatus; in mps_sc_failed_io_info()
1913 u32 log_info = le32toh(mpi_reply->IOCLogInfo); in mps_sc_failed_io_info()
1925 le16toh(mpi_reply->DevHandle), desc_ioc_state, ioc_status); in mps_sc_failed_io_info()
1929 * TO-DO in mps_sc_failed_io_info()
1936 if (sc->mps_debug & MPS_XINFO && in mps_sc_failed_io_info()
1938 mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : Start :\n"); in mps_sc_failed_io_info()
1940 mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : End :\n"); in mps_sc_failed_io_info()
1944 response_info = le32toh(mpi_reply->ResponseInfo); in mps_sc_failed_io_info()
1956 MPI2_SCSI_IO_REPLY *rep; in mpssas_scsiio_complete() local
1970 cm->cm_desc.Default.SMID, cm->cm_ccb, cm->cm_reply, in mpssas_scsiio_complete()
1971 cm->cm_targ->outstanding); in mpssas_scsiio_complete()
1973 callout_stop(&cm->cm_callout); in mpssas_scsiio_complete()
1974 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_scsiio_complete()
1976 sassc = sc->sassc; in mpssas_scsiio_complete()
1977 ccb = cm->cm_complete_data; in mpssas_scsiio_complete()
1978 csio = &ccb->csio; in mpssas_scsiio_complete()
1979 target_id = csio->ccb_h.target_id; in mpssas_scsiio_complete()
1980 rep = (MPI2_SCSI_IO_REPLY *)cm->cm_reply; in mpssas_scsiio_complete()
1986 if (cm->cm_data != NULL) { in mpssas_scsiio_complete()
1987 if (cm->cm_flags & MPS_CM_FLAGS_DATAIN) in mpssas_scsiio_complete()
1989 else if (cm->cm_flags & MPS_CM_FLAGS_DATAOUT) in mpssas_scsiio_complete()
1991 bus_dmamap_sync(sc->buffer_dmat, cm->cm_dmamap, dir); in mpssas_scsiio_complete()
1992 bus_dmamap_unload(sc->buffer_dmat, cm->cm_dmamap); in mpssas_scsiio_complete()
1995 cm->cm_targ->completed++; in mpssas_scsiio_complete()
1996 cm->cm_targ->outstanding--; in mpssas_scsiio_complete()
1997 TAILQ_REMOVE(&cm->cm_targ->commands, cm, cm_link); in mpssas_scsiio_complete()
1998 ccb->ccb_h.status &= ~(CAM_STATUS_MASK | CAM_SIM_QUEUED); in mpssas_scsiio_complete()
2001 if (ccb->csio.bio != NULL) in mpssas_scsiio_complete()
2002 biotrack(ccb->csio.bio, __func__); in mpssas_scsiio_complete()
2005 if (cm->cm_flags & MPS_CM_FLAGS_ON_RECOVERY) { in mpssas_scsiio_complete()
2006 TAILQ_REMOVE(&cm->cm_targ->timedout_commands, cm, cm_recovery); in mpssas_scsiio_complete()
2007 KASSERT(cm->cm_state == MPS_CM_STATE_BUSY, in mpssas_scsiio_complete()
2008 ("Not busy for CM_FLAGS_TIMEDOUT: %u\n", cm->cm_state)); in mpssas_scsiio_complete()
2009 cm->cm_flags &= ~MPS_CM_FLAGS_ON_RECOVERY; in mpssas_scsiio_complete()
2010 if (cm->cm_reply != NULL) in mpssas_scsiio_complete()
2014 cm, cm->cm_ccb, le16toh(rep->IOCStatus), in mpssas_scsiio_complete()
2015 rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2016 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2020 cm, cm->cm_ccb); in mpssas_scsiio_complete()
2021 } else if (cm->cm_targ->tm != NULL) { in mpssas_scsiio_complete()
2022 if (cm->cm_reply != NULL) in mpssas_scsiio_complete()
2026 cm, cm->cm_ccb, le16toh(rep->IOCStatus), in mpssas_scsiio_complete()
2027 rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2028 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2032 cm, cm->cm_ccb); in mpssas_scsiio_complete()
2033 } else if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) { in mpssas_scsiio_complete()
2036 cm, cm->cm_ccb); in mpssas_scsiio_complete()
2039 if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_scsiio_complete()
2061 if ((sassc->flags & MPSSAS_QUEUE_FROZEN) == 0) { in mpssas_scsiio_complete()
2062 xpt_freeze_simq(sassc->sim, 1); in mpssas_scsiio_complete()
2063 sassc->flags |= MPSSAS_QUEUE_FROZEN; in mpssas_scsiio_complete()
2076 if (sc->SSU_started && (csio->cdb_io.cdb_bytes[0] == START_STOP_UNIT)) { in mpssas_scsiio_complete()
2078 sc->SSU_refcount--; in mpssas_scsiio_complete()
2082 if (cm->cm_reply == NULL) { in mpssas_scsiio_complete()
2084 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) in mpssas_scsiio_complete()
2088 ccb->csio.scsi_status = SCSI_STATUS_OK; in mpssas_scsiio_complete()
2090 if (sassc->flags & MPSSAS_QUEUE_FROZEN) { in mpssas_scsiio_complete()
2091 ccb->ccb_h.status |= CAM_RELEASE_SIMQ; in mpssas_scsiio_complete()
2092 sassc->flags &= ~MPSSAS_QUEUE_FROZEN; in mpssas_scsiio_complete()
2109 ccb->ccb_h.status |= CAM_DEV_QFRZN; in mpssas_scsiio_complete()
2110 xpt_freeze_devq(ccb->ccb_h.path, /*count*/ 1); in mpssas_scsiio_complete()
2119 le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2120 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2128 if (cm->cm_flags & MPS_CM_FLAGS_DD_IO) { in mpssas_scsiio_complete()
2130 ccb->ccb_h.sim_priv.entries[0].field = MPS_WD_RETRY; in mpssas_scsiio_complete()
2134 ccb->ccb_h.sim_priv.entries[0].field = 0; in mpssas_scsiio_complete()
2136 switch (le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK) { in mpssas_scsiio_complete()
2138 csio->resid = cm->cm_length - le32toh(rep->TransferCount); in mpssas_scsiio_complete()
2143 if ((le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK) == in mpssas_scsiio_complete()
2148 if (rep->SCSIState & (MPI2_SCSI_STATE_NO_SCSI_STATUS | in mpssas_scsiio_complete()
2158 if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_FAILED) { in mpssas_scsiio_complete()
2168 if ((rep->SCSIState & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) && in mpssas_scsiio_complete()
2169 ((le32toh(rep->ResponseInfo) & in mpssas_scsiio_complete()
2172 sc->mapping_table[target_id].TLR_bits = in mpssas_scsiio_complete()
2179 * multi-initiator environment, and we want to make sure that in mpssas_scsiio_complete()
2182 if ((rep->SCSIStatus == MPI2_SCSI_STATUS_COMMAND_TERMINATED) || in mpssas_scsiio_complete()
2183 (rep->SCSIStatus == MPI2_SCSI_STATUS_TASK_ABORTED)) { in mpssas_scsiio_complete()
2189 csio->scsi_status = rep->SCSIStatus; in mpssas_scsiio_complete()
2190 if (rep->SCSIStatus == MPI2_SCSI_STATUS_GOOD) in mpssas_scsiio_complete()
2195 if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_VALID) { in mpssas_scsiio_complete()
2198 returned_sense_len = min(le32toh(rep->SenseCount), in mpssas_scsiio_complete()
2200 if (returned_sense_len < ccb->csio.sense_len) in mpssas_scsiio_complete()
2201 ccb->csio.sense_resid = ccb->csio.sense_len - in mpssas_scsiio_complete()
2204 ccb->csio.sense_resid = 0; in mpssas_scsiio_complete()
2207 ccb->csio.sense_len - ccb->csio.sense_resid); in mpssas_scsiio_complete()
2208 bzero(&ccb->csio.sense_data, in mpssas_scsiio_complete()
2209 sizeof(ccb->csio.sense_data)); in mpssas_scsiio_complete()
2210 bcopy(cm->cm_sense, &ccb->csio.sense_data, sense_len); in mpssas_scsiio_complete()
2211 ccb->ccb_h.status |= CAM_AUTOSNS_VALID; in mpssas_scsiio_complete()
2222 if ((csio->cdb_io.cdb_bytes[0] == INQUIRY) && in mpssas_scsiio_complete()
2223 (csio->cdb_io.cdb_bytes[1] & SI_EVPD) && in mpssas_scsiio_complete()
2224 (csio->cdb_io.cdb_bytes[2] == SVPD_SUPPORTED_PAGE_LIST) && in mpssas_scsiio_complete()
2225 ((csio->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) && in mpssas_scsiio_complete()
2226 (csio->data_ptr != NULL) && in mpssas_scsiio_complete()
2227 ((csio->data_ptr[0] & 0x1f) == T_SEQUENTIAL) && in mpssas_scsiio_complete()
2228 (sc->control_TLR) && in mpssas_scsiio_complete()
2229 (sc->mapping_table[target_id].device_info & in mpssas_scsiio_complete()
2232 csio->data_ptr; in mpssas_scsiio_complete()
2233 TLR_bits = &sc->mapping_table[target_id].TLR_bits; in mpssas_scsiio_complete()
2236 alloc_len = ((u16)csio->cdb_io.cdb_bytes[3] << 8) + in mpssas_scsiio_complete()
2237 csio->cdb_io.cdb_bytes[4]; in mpssas_scsiio_complete()
2238 alloc_len -= csio->resid; in mpssas_scsiio_complete()
2239 for (i = 0; i < MIN(vpd_list->length, alloc_len); i++) { in mpssas_scsiio_complete()
2240 if (vpd_list->list[i] == 0x90) { in mpssas_scsiio_complete()
2248 * If this is a SATA direct-access end device, mark it so that in mpssas_scsiio_complete()
2252 if ((csio->cdb_io.cdb_bytes[0] == INQUIRY) && in mpssas_scsiio_complete()
2253 ((csio->data_ptr[0] & 0x1f) == T_DIRECT) && in mpssas_scsiio_complete()
2254 (sc->mapping_table[target_id].device_info & in mpssas_scsiio_complete()
2256 ((sc->mapping_table[target_id].device_info & in mpssas_scsiio_complete()
2259 target = &sassc->targets[target_id]; in mpssas_scsiio_complete()
2260 target->supports_SSU = TRUE; in mpssas_scsiio_complete()
2273 if (cm->cm_targ->devinfo == 0) in mpssas_scsiio_complete()
2292 if (cm->cm_flags & MPS_CM_FLAGS_TIMEDOUT) in mpssas_scsiio_complete()
2299 csio->resid = 0; in mpssas_scsiio_complete()
2305 * These can sometimes be transient transport-related in mpssas_scsiio_complete()
2306 * errors, and sometimes persistent drive-related errors. in mpssas_scsiio_complete()
2314 * of a topology-related error (e.g. a SAS expander problem in mpssas_scsiio_complete()
2321 if (cm->cm_targ->flags & MPSSAS_TARGET_INREMOVAL) in mpssas_scsiio_complete()
2328 le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK), in mpssas_scsiio_complete()
2329 target_id, cm->cm_desc.Default.SMID, in mpssas_scsiio_complete()
2330 le32toh(rep->IOCLogInfo), in mpssas_scsiio_complete()
2331 (cm->cm_targ->flags & MPSSAS_TARGET_INREMOVAL) ? " departing" : ""); in mpssas_scsiio_complete()
2334 rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2335 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2350 le16toh(rep->IOCStatus), le32toh(rep->IOCLogInfo), in mpssas_scsiio_complete()
2351 rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2352 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2353 csio->resid = cm->cm_length; in mpssas_scsiio_complete()
2358 mps_sc_failed_io_info(sc,csio,rep); in mpssas_scsiio_complete()
2360 if (sassc->flags & MPSSAS_QUEUE_FROZEN) { in mpssas_scsiio_complete()
2361 ccb->ccb_h.status |= CAM_RELEASE_SIMQ; in mpssas_scsiio_complete()
2362 sassc->flags &= ~MPSSAS_QUEUE_FROZEN; in mpssas_scsiio_complete()
2368 ccb->ccb_h.status |= CAM_DEV_QFRZN; in mpssas_scsiio_complete()
2369 xpt_freeze_devq(ccb->ccb_h.path, /*count*/ 1); in mpssas_scsiio_complete()
2378 if (cm->cm_targ->flags & MPSSAS_TARGET_INREMOVAL) { in mpssas_scsiio_complete()
2379 if (TAILQ_FIRST(&cm->cm_targ->commands) == NULL && in mpssas_scsiio_complete()
2380 cm->cm_targ->pending_remove_tm != NULL) { in mpssas_scsiio_complete()
2383 cm->cm_targ->tid, cm->cm_targ->handle); in mpssas_scsiio_complete()
2384 mps_map_command(sc, cm->cm_targ->pending_remove_tm); in mpssas_scsiio_complete()
2385 cm->cm_targ->pending_remove_tm = NULL; in mpssas_scsiio_complete()
2398 struct mps_softc *sc = sassc->sc; in mpssas_direct_drive_io()
2410 pIO_req = (pMpi2SCSIIORequest_t)cm->cm_req; in mpssas_direct_drive_io()
2411 CDB = pIO_req->CDB.CDB32; in mpssas_direct_drive_io()
2416 if ((pIO_req->DevHandle == sc->DD_dev_handle) && ((CDB[0] == READ_6) || in mpssas_direct_drive_io()
2421 io_size = (cm->cm_length >> sc->DD_block_exponent); in mpssas_direct_drive_io()
2433 if ((virtLBA + (uint64_t)io_size - 1) <= in mpssas_direct_drive_io()
2434 sc->DD_max_lba) { in mpssas_direct_drive_io()
2445 (sc->DD_stripe_size - 1); in mpssas_direct_drive_io()
2446 if ((stripe_offset + io_size) <= sc->DD_stripe_size) { in mpssas_direct_drive_io()
2448 sc->DD_stripe_exponent; in mpssas_direct_drive_io()
2449 stripe_unit = physLBA / sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2450 column = physLBA % sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2451 pIO_req->DevHandle = in mpssas_direct_drive_io()
2452 htole16(sc->DD_column_map[column].dev_handle); in mpssas_direct_drive_io()
2454 cm->cm_desc.SCSIIO.DevHandle = in mpssas_direct_drive_io()
2455 pIO_req->DevHandle; in mpssas_direct_drive_io()
2458 sc->DD_stripe_exponent) + stripe_offset; in mpssas_direct_drive_io()
2459 ptrLBA = &pIO_req->CDB.CDB32[1]; in mpssas_direct_drive_io()
2462 ptrLBA = &pIO_req->CDB.CDB32[2]; in mpssas_direct_drive_io()
2465 ptrLBA = &pIO_req->CDB.CDB32[3]; in mpssas_direct_drive_io()
2473 cm->cm_flags |= MPS_CM_FLAGS_DD_IO; in mpssas_direct_drive_io()
2482 if ((pIO_req->DevHandle == sc->DD_dev_handle) && ((CDB[0] == READ_10) || in mpssas_direct_drive_io()
2487 * For 16-byte CDB's, verify that the upper 4 bytes of the CDB in mpssas_direct_drive_io()
2489 * the else section. 10-byte and 12-byte CDB's are OK. in mpssas_direct_drive_io()
2499 io_size = (cm->cm_length >> sc->DD_block_exponent); in mpssas_direct_drive_io()
2518 if ((virtLBA + (uint64_t)io_size - 1) <= in mpssas_direct_drive_io()
2519 sc->DD_max_lba) { in mpssas_direct_drive_io()
2531 (sc->DD_stripe_size - 1); in mpssas_direct_drive_io()
2533 sc->DD_stripe_size) { in mpssas_direct_drive_io()
2535 sc->DD_stripe_exponent; in mpssas_direct_drive_io()
2537 sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2539 sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2540 pIO_req->DevHandle = in mpssas_direct_drive_io()
2541 htole16(sc->DD_column_map[column]. in mpssas_direct_drive_io()
2543 cm->cm_desc.SCSIIO.DevHandle = in mpssas_direct_drive_io()
2544 pIO_req->DevHandle; in mpssas_direct_drive_io()
2547 sc->DD_stripe_exponent) + in mpssas_direct_drive_io()
2550 &pIO_req->CDB.CDB32[lba_idx]; in mpssas_direct_drive_io()
2554 &pIO_req->CDB.CDB32[lba_idx + 1]; in mpssas_direct_drive_io()
2558 &pIO_req->CDB.CDB32[lba_idx + 2]; in mpssas_direct_drive_io()
2562 &pIO_req->CDB.CDB32[lba_idx + 3]; in mpssas_direct_drive_io()
2570 cm->cm_flags |= MPS_CM_FLAGS_DD_IO; in mpssas_direct_drive_io()
2575 * 16-byte CDB and the upper 4 bytes of the CDB are not in mpssas_direct_drive_io()
2578 io_size = (cm->cm_length >> sc->DD_block_exponent); in mpssas_direct_drive_io()
2596 if ((virtLBA + (uint64_t)io_size - 1) <= in mpssas_direct_drive_io()
2597 sc->DD_max_lba) { in mpssas_direct_drive_io()
2609 (sc->DD_stripe_size - 1); in mpssas_direct_drive_io()
2611 sc->DD_stripe_size) { in mpssas_direct_drive_io()
2613 sc->DD_stripe_exponent); in mpssas_direct_drive_io()
2615 sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2617 sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2618 pIO_req->DevHandle = in mpssas_direct_drive_io()
2619 htole16(sc->DD_column_map[column]. in mpssas_direct_drive_io()
2621 cm->cm_desc.SCSIIO.DevHandle = in mpssas_direct_drive_io()
2622 pIO_req->DevHandle; in mpssas_direct_drive_io()
2625 sc->DD_stripe_exponent) + in mpssas_direct_drive_io()
2634 pIO_req->CDB.CDB32[2] = 0; in mpssas_direct_drive_io()
2635 pIO_req->CDB.CDB32[3] = 0; in mpssas_direct_drive_io()
2636 pIO_req->CDB.CDB32[4] = 0; in mpssas_direct_drive_io()
2637 pIO_req->CDB.CDB32[5] = 0; in mpssas_direct_drive_io()
2638 ptrLBA = &pIO_req->CDB.CDB32[6]; in mpssas_direct_drive_io()
2641 ptrLBA = &pIO_req->CDB.CDB32[7]; in mpssas_direct_drive_io()
2644 ptrLBA = &pIO_req->CDB.CDB32[8]; in mpssas_direct_drive_io()
2647 ptrLBA = &pIO_req->CDB.CDB32[9]; in mpssas_direct_drive_io()
2655 cm->cm_flags |= MPS_CM_FLAGS_DD_IO; in mpssas_direct_drive_io()
2670 ccb = cm->cm_complete_data; in mpssas_smpio_complete()
2678 if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_smpio_complete()
2680 __func__, cm->cm_flags); in mpssas_smpio_complete()
2685 rpl = (MPI2_SMP_PASSTHROUGH_REPLY *)cm->cm_reply; in mpssas_smpio_complete()
2692 req = (MPI2_SMP_PASSTHROUGH_REQUEST *)cm->cm_req; in mpssas_smpio_complete()
2693 sasaddr = le32toh(req->SASAddress.Low); in mpssas_smpio_complete()
2694 sasaddr |= ((uint64_t)(le32toh(req->SASAddress.High))) << 32; in mpssas_smpio_complete()
2696 if ((le16toh(rpl->IOCStatus) & MPI2_IOCSTATUS_MASK) != in mpssas_smpio_complete()
2698 rpl->SASStatus != MPI2_SASSTATUS_SUCCESS) { in mpssas_smpio_complete()
2700 __func__, le16toh(rpl->IOCStatus), rpl->SASStatus); in mpssas_smpio_complete()
2709 if (ccb->smpio.smp_response[2] == SMP_FR_ACCEPTED) in mpssas_smpio_complete()
2719 bus_dmamap_sync(sc->buffer_dmat, cm->cm_dmamap, in mpssas_smpio_complete()
2721 bus_dmamap_unload(sc->buffer_dmat, cm->cm_dmamap); in mpssas_smpio_complete()
2735 sc = sassc->sc; in mpssas_send_smpcmd()
2741 switch ((ccb->ccb_h.flags & CAM_DATA_MASK)) { in mpssas_send_smpcmd()
2754 if ((ccb->smpio.smp_request_sglist_cnt > 1) in mpssas_send_smpcmd()
2755 || (ccb->smpio.smp_response_sglist_cnt > 1)) { in mpssas_send_smpcmd()
2773 if (ccb->smpio.smp_request_sglist_cnt != 0) { in mpssas_send_smpcmd()
2776 req_sg = (bus_dma_segment_t *)ccb->smpio.smp_request; in mpssas_send_smpcmd()
2779 request = ccb->smpio.smp_request; in mpssas_send_smpcmd()
2781 if (ccb->smpio.smp_response_sglist_cnt != 0) { in mpssas_send_smpcmd()
2784 rsp_sg = (bus_dma_segment_t *)ccb->smpio.smp_response; in mpssas_send_smpcmd()
2787 response = ccb->smpio.smp_response; in mpssas_send_smpcmd()
2790 request = ccb->smpio.smp_request; in mpssas_send_smpcmd()
2791 response = ccb->smpio.smp_response; in mpssas_send_smpcmd()
2808 req = (MPI2_SMP_PASSTHROUGH_REQUEST *)cm->cm_req; in mpssas_send_smpcmd()
2810 req->Function = MPI2_FUNCTION_SMP_PASSTHROUGH; in mpssas_send_smpcmd()
2813 req->PhysicalPort = 0xff; in mpssas_send_smpcmd()
2815 req->RequestDataLength = htole16(ccb->smpio.smp_request_len); in mpssas_send_smpcmd()
2816 req->SGLFlags = in mpssas_send_smpcmd()
2822 mpi_init_sge(cm, req, &req->SGL); in mpssas_send_smpcmd()
2828 cm->cm_uio.uio_iov = cm->cm_iovec; in mpssas_send_smpcmd()
2829 cm->cm_uio.uio_iovcnt = 2; in mpssas_send_smpcmd()
2830 cm->cm_uio.uio_segflg = UIO_SYSSPACE; in mpssas_send_smpcmd()
2837 cm->cm_uio.uio_rw = UIO_WRITE; in mpssas_send_smpcmd()
2839 cm->cm_iovec[0].iov_base = request; in mpssas_send_smpcmd()
2840 cm->cm_iovec[0].iov_len = le16toh(req->RequestDataLength); in mpssas_send_smpcmd()
2841 cm->cm_iovec[1].iov_base = response; in mpssas_send_smpcmd()
2842 cm->cm_iovec[1].iov_len = ccb->smpio.smp_response_len; in mpssas_send_smpcmd()
2844 cm->cm_uio.uio_resid = cm->cm_iovec[0].iov_len + in mpssas_send_smpcmd()
2845 cm->cm_iovec[1].iov_len; in mpssas_send_smpcmd()
2852 cm->cm_max_segs = 2; in mpssas_send_smpcmd()
2854 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mpssas_send_smpcmd()
2855 cm->cm_complete = mpssas_smpio_complete; in mpssas_send_smpcmd()
2856 cm->cm_complete_data = ccb; in mpssas_send_smpcmd()
2860 * an SMP passthrough request. There is a little special-case in mpssas_send_smpcmd()
2864 cm->cm_flags |= MPS_CM_FLAGS_USE_UIO | MPS_CM_FLAGS_SMP_PASS | in mpssas_send_smpcmd()
2868 req->SASAddress.High = htole32(sasaddr >> 32); in mpssas_send_smpcmd()
2869 req->SASAddress.Low = htole32(sasaddr); in mpssas_send_smpcmd()
2904 sc = sassc->sc; in mpssas_action_smpio()
2909 KASSERT(ccb->ccb_h.target_id < sassc->maxtargets, in mpssas_action_smpio()
2910 ("Target %d out of bounds in XPT_SMP_IO\n", ccb->ccb_h.target_id)); in mpssas_action_smpio()
2911 targ = &sassc->targets[ccb->ccb_h.target_id]; in mpssas_action_smpio()
2912 if (targ->handle == 0x0) { in mpssas_action_smpio()
2915 ccb->ccb_h.target_id); in mpssas_action_smpio()
2926 if ((targ->devinfo & MPI2_SAS_DEVICE_INFO_SMP_TARGET) != 0) in mpssas_action_smpio()
2927 sasaddr = targ->sasaddr; in mpssas_action_smpio()
2933 * expander SAS address as the port-associated SAS address in in mpssas_action_smpio()
2949 sasaddr = xpt_path_sas_addr(ccb->ccb_h.path); in mpssas_action_smpio()
2961 if (targ->parent_handle == 0x0) { in mpssas_action_smpio()
2964 "parent handle!\n", __func__, targ->handle); in mpssas_action_smpio()
2970 targ->parent_handle); in mpssas_action_smpio()
2975 "parent target!\n", __func__, targ->handle); in mpssas_action_smpio()
2980 if ((parent_target->devinfo & in mpssas_action_smpio()
2985 targ->handle, parent_target->handle); in mpssas_action_smpio()
2990 sasaddr = parent_target->sasaddr; in mpssas_action_smpio()
2992 if ((targ->parent_devinfo & in mpssas_action_smpio()
2997 targ->handle, targ->parent_handle); in mpssas_action_smpio()
3001 if (targ->parent_sasaddr == 0x0) { in mpssas_action_smpio()
3005 __func__, targ->handle, targ->parent_handle); in mpssas_action_smpio()
3010 sasaddr = targ->parent_sasaddr; in mpssas_action_smpio()
3017 __func__, targ->handle); in mpssas_action_smpio()
3038 MPS_FUNCTRACE(sassc->sc); in mpssas_action_resetdev()
3039 mtx_assert(&sassc->sc->mps_mtx, MA_OWNED); in mpssas_action_resetdev()
3041 KASSERT(ccb->ccb_h.target_id < sassc->maxtargets, in mpssas_action_resetdev()
3043 ccb->ccb_h.target_id)); in mpssas_action_resetdev()
3044 sc = sassc->sc; in mpssas_action_resetdev()
3054 targ = &sassc->targets[ccb->ccb_h.target_id]; in mpssas_action_resetdev()
3055 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_action_resetdev()
3056 req->DevHandle = htole16(targ->handle); in mpssas_action_resetdev()
3057 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; in mpssas_action_resetdev()
3060 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET; in mpssas_action_resetdev()
3062 tm->cm_data = NULL; in mpssas_action_resetdev()
3063 tm->cm_complete = mpssas_resetdev_complete; in mpssas_action_resetdev()
3064 tm->cm_complete_data = ccb; in mpssas_action_resetdev()
3065 tm->cm_targ = targ; in mpssas_action_resetdev()
3078 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_resetdev_complete()
3080 resp = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_resetdev_complete()
3081 ccb = tm->cm_complete_data; in mpssas_resetdev_complete()
3088 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_resetdev_complete()
3091 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_resetdev_complete()
3095 "This should not happen!\n", __func__, tm->cm_flags, in mpssas_resetdev_complete()
3096 req->DevHandle); in mpssas_resetdev_complete()
3103 le16toh(resp->IOCStatus), le32toh(resp->ResponseCode)); in mpssas_resetdev_complete()
3105 if (le32toh(resp->ResponseCode) == MPI2_SCSITASKMGMT_RSP_TM_COMPLETE) { in mpssas_resetdev_complete()
3107 mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid, in mpssas_resetdev_complete()
3126 if (sassc->sc->mps_debug & MPS_TRACE) { in mpssas_poll()
3130 mps_printf(sassc->sc, "%s clearing MPS_TRACE\n", __func__); in mpssas_poll()
3131 sassc->sc->mps_debug &= ~MPS_TRACE; in mpssas_poll()
3134 mps_intr_locked(sassc->sc); in mpssas_poll()
3160 sassc = sc->sassc; in mpssas_async()
3171 KASSERT(xpt_path_target_id(path) < sassc->maxtargets, in mpssas_async()
3174 target = &sassc->targets[xpt_path_target_id(path)]; in mpssas_async()
3175 if (target->handle == 0) in mpssas_async()
3180 SLIST_FOREACH(lun, &target->luns, lun_link) { in mpssas_async()
3181 if (lun->lun_id == lunid) { in mpssas_async()
3195 lun->lun_id = lunid; in mpssas_async()
3196 SLIST_INSERT_HEAD(&target->luns, lun, lun_link); in mpssas_async()
3218 lun->eedp_formatted = TRUE; in mpssas_async()
3219 lun->eedp_block_size = in mpssas_async()
3224 lun->eedp_formatted = FALSE; in mpssas_async()
3225 lun->eedp_block_size = 0; in mpssas_async()
3229 lun->eedp_formatted = FALSE; in mpssas_async()
3230 lun->eedp_block_size = 0; in mpssas_async()
3260 path_id = cam_sim_path(sc->sassc->sim); in mpssas_prepare_for_tm()
3261 if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, path_id, in mpssas_prepare_for_tm()
3262 target->tid, lun_id) != CAM_REQ_CMP) { in mpssas_prepare_for_tm()
3265 tm->cm_ccb = ccb; in mpssas_prepare_for_tm()
3266 tm->cm_targ = target; in mpssas_prepare_for_tm()
3267 if ((target->flags & MPSSAS_TARGET_INRESET) == 0) { in mpssas_prepare_for_tm()
3270 __func__, target->tid); in mpssas_prepare_for_tm()
3271 xpt_freeze_devq(ccb->ccb_h.path, 1); in mpssas_prepare_for_tm()
3272 target->flags |= MPSSAS_TARGET_INRESET; in mpssas_prepare_for_tm()
3287 sc->wait_for_port_enable = 1; in mpssas_startup()
3302 request = (MPI2_PORT_ENABLE_REQUEST *)cm->cm_req; in mpssas_send_portenable()
3303 request->Function = MPI2_FUNCTION_PORT_ENABLE; in mpssas_send_portenable()
3304 request->MsgFlags = 0; in mpssas_send_portenable()
3305 request->VP_ID = 0; in mpssas_send_portenable()
3306 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mpssas_send_portenable()
3307 cm->cm_complete = mpssas_portenable_complete; in mpssas_send_portenable()
3308 cm->cm_data = NULL; in mpssas_send_portenable()
3309 cm->cm_sge = NULL; in mpssas_send_portenable()
3314 cm, cm->cm_req, cm->cm_complete); in mpssas_send_portenable()
3325 sassc = sc->sassc; in mpssas_portenable_complete()
3332 if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_portenable_complete()
3334 "This should not happen!\n", __func__, cm->cm_flags); in mpssas_portenable_complete()
3337 reply = (MPI2_PORT_ENABLE_REPLY *)cm->cm_reply; in mpssas_portenable_complete()
3340 else if (le16toh(reply->IOCStatus & MPI2_IOCSTATUS_MASK) != in mpssas_portenable_complete()
3362 sc->wait_for_port_enable = 0; in mpssas_portenable_complete()
3363 sc->port_enable_complete = 1; in mpssas_portenable_complete()
3364 wakeup(&sc->port_enable_complete); in mpssas_portenable_complete()
3371 struct mps_softc *sc = sassc->sc; in mpssas_check_id()
3375 ids = &sc->exclude_ids[0]; in mpssas_check_id()
3394 sassc = sc->sassc; in mpssas_realloc_targets()
3401 targ = &sassc->targets[i]; in mpssas_realloc_targets()
3402 SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) { in mpssas_realloc_targets()
3406 free(sassc->targets, M_MPT2); in mpssas_realloc_targets()
3408 sassc->targets = malloc(sizeof(struct mpssas_target) * maxtargets, in mpssas_realloc_targets()