Lines Matching +full:cts +full:- +full:override

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
141 for (i = start; i < sassc->maxtargets; i++) { in mpssas_find_target_by_handle()
142 target = &sassc->targets[i]; in mpssas_find_target_by_handle()
143 if (target->handle == handle) in mpssas_find_target_by_handle()
160 MPS_FUNCTRACE(sassc->sc); in mpssas_startup_increment()
162 if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) { in mpssas_startup_increment()
163 if (sassc->startup_refcount++ == 0) { in mpssas_startup_increment()
165 mps_dprint(sassc->sc, MPS_INIT, in mpssas_startup_increment()
168 xpt_freeze_simq(sassc->sim, 1); in mpssas_startup_increment()
170 mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__, in mpssas_startup_increment()
171 sassc->startup_refcount); in mpssas_startup_increment()
178 if (sassc->flags & MPSSAS_QUEUE_FROZEN) { in mpssas_release_simq_reinit()
179 sassc->flags &= ~MPSSAS_QUEUE_FROZEN; in mpssas_release_simq_reinit()
180 xpt_release_simq(sassc->sim, 1); in mpssas_release_simq_reinit()
181 mps_dprint(sassc->sc, MPS_INFO, "Unfreezing SIM queue\n"); in mpssas_release_simq_reinit()
188 MPS_FUNCTRACE(sassc->sc); in mpssas_startup_decrement()
190 if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) { in mpssas_startup_decrement()
191 if (--sassc->startup_refcount == 0) { in mpssas_startup_decrement()
192 /* finished all discovery-related actions, release in mpssas_startup_decrement()
195 mps_dprint(sassc->sc, MPS_INIT, in mpssas_startup_decrement()
197 sassc->flags &= ~MPSSAS_IN_STARTUP; in mpssas_startup_decrement()
198 xpt_release_simq(sassc->sim, 1); in mpssas_startup_decrement()
201 mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__, in mpssas_startup_decrement()
202 sassc->startup_refcount); in mpssas_startup_decrement()
222 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_alloc_tm()
223 req->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; in mpssas_alloc_tm()
238 if (tm->cm_ccb) { in mpssas_free_tm()
241 tm->cm_targ->tid); in mpssas_free_tm()
242 tm->cm_targ->flags &= ~MPSSAS_TARGET_INRESET; in mpssas_free_tm()
243 xpt_release_devq(tm->cm_ccb->ccb_h.path, 1, TRUE); in mpssas_free_tm()
244 xpt_free_path(tm->cm_ccb->ccb_h.path); in mpssas_free_tm()
245 xpt_free_ccb(tm->cm_ccb); in mpssas_free_tm()
254 struct mpssas_softc *sassc = sc->sassc; in mpssas_rescan_target()
260 pathid = cam_sim_path(sassc->sim); in mpssas_rescan_target()
264 targetid = targ - sassc->targets; in mpssas_rescan_target()
275 if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid, in mpssas_rescan_target()
283 ccb->ccb_h.func_code = XPT_SCAN_BUS; in mpssas_rescan_target()
285 ccb->ccb_h.func_code = XPT_SCAN_TGT; in mpssas_rescan_target()
302 if ((cm->cm_sc->mps_debug & level) == 0) in mpssas_log_command()
309 if (cm->cm_ccb != NULL) { in mpssas_log_command()
310 xpt_path_sbuf(cm->cm_ccb->csio.ccb_h.path, &sb); in mpssas_log_command()
311 if (cm->cm_ccb->ccb_h.func_code == XPT_SCSI_IO) { in mpssas_log_command()
312 scsi_command_string(&cm->cm_ccb->csio, &sb); in mpssas_log_command()
314 cm->cm_ccb->csio.dxfer_len); in mpssas_log_command()
319 cam_sim_name(cm->cm_sc->sassc->sim), in mpssas_log_command()
320 cam_sim_unit(cm->cm_sc->sassc->sim), in mpssas_log_command()
321 cam_sim_bus(cm->cm_sc->sassc->sim), in mpssas_log_command()
322 cm->cm_targ ? cm->cm_targ->tid : 0xFFFFFFFF, in mpssas_log_command()
323 cm->cm_lun); in mpssas_log_command()
326 sbuf_printf(&sb, "SMID %u ", cm->cm_desc.Default.SMID); in mpssas_log_command()
329 mps_print_field(cm->cm_sc, "%s", sbuf_data(&sb)); in mpssas_log_command()
343 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_remove_volume()
344 handle = (uint16_t)(uintptr_t)tm->cm_complete_data; in mpssas_remove_volume()
345 targ = tm->cm_targ; in mpssas_remove_volume()
356 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) != in mpssas_remove_volume()
360 le16toh(reply->IOCStatus), handle); in mpssas_remove_volume()
364 "Reset aborted %u commands\n", reply->TerminationCount); in mpssas_remove_volume()
365 mps_free_reply(sc, tm->cm_reply_data); in mpssas_remove_volume()
366 tm->cm_reply = NULL; /* Ensures the reply won't get re-freed */ in mpssas_remove_volume()
369 "clearing target %u handle 0x%04x\n", targ->tid, handle); in mpssas_remove_volume()
377 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) == in mpssas_remove_volume()
379 targ = tm->cm_targ; in mpssas_remove_volume()
380 targ->handle = 0x0; in mpssas_remove_volume()
381 targ->encl_handle = 0x0; in mpssas_remove_volume()
382 targ->encl_slot = 0x0; in mpssas_remove_volume()
383 targ->exp_dev_handle = 0x0; in mpssas_remove_volume()
384 targ->phy_num = 0x0; in mpssas_remove_volume()
385 targ->linkrate = 0x0; in mpssas_remove_volume()
386 targ->devinfo = 0x0; in mpssas_remove_volume()
387 targ->flags = 0x0; in mpssas_remove_volume()
405 MPS_FUNCTRACE(sassc->sc); in mpssas_prepare_volume_remove()
406 sc = sassc->sc; in mpssas_prepare_volume_remove()
414 if (sc->WD_available && (sc->WD_hide_expose == in mpssas_prepare_volume_remove()
429 targ->flags |= MPSSAS_TARGET_INREMOVAL; in mpssas_prepare_volume_remove()
440 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_prepare_volume_remove()
441 req->DevHandle = targ->handle; in mpssas_prepare_volume_remove()
442 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; in mpssas_prepare_volume_remove()
445 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET; in mpssas_prepare_volume_remove()
447 tm->cm_targ = targ; in mpssas_prepare_volume_remove()
448 tm->cm_data = NULL; in mpssas_prepare_volume_remove()
449 tm->cm_complete = mpssas_remove_volume; in mpssas_prepare_volume_remove()
450 tm->cm_complete_data = (void *)(uintptr_t)handle; in mpssas_prepare_volume_remove()
453 __func__, targ->tid); in mpssas_prepare_volume_remove()
463 * target reset and then an op remove. The reset has the side-effect of
465 * the op-remove to succeed. It's not clear if the host should check for
476 MPS_FUNCTRACE(sassc->sc); in mpssas_prepare_remove()
478 sc = sassc->sc; in mpssas_prepare_remove()
489 targ->flags |= MPSSAS_TARGET_INREMOVAL; in mpssas_prepare_remove()
500 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)cm->cm_req; in mpssas_prepare_remove()
501 req->DevHandle = htole16(targ->handle); in mpssas_prepare_remove()
502 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; in mpssas_prepare_remove()
505 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET; in mpssas_prepare_remove()
507 cm->cm_targ = targ; in mpssas_prepare_remove()
508 cm->cm_data = NULL; in mpssas_prepare_remove()
509 cm->cm_complete = mpssas_remove_device; in mpssas_prepare_remove()
510 cm->cm_complete_data = (void *)(uintptr_t)handle; in mpssas_prepare_remove()
513 __func__, targ->tid); in mpssas_prepare_remove()
529 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_remove_device()
530 handle = (uint16_t)(uintptr_t)tm->cm_complete_data; in mpssas_remove_device()
531 targ = tm->cm_targ; in mpssas_remove_device()
538 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_remove_device()
541 "This should not happen!\n", __func__, tm->cm_flags, in mpssas_remove_device()
554 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) != in mpssas_remove_device()
558 le16toh(reply->IOCStatus), handle); in mpssas_remove_device()
562 le32toh(reply->TerminationCount)); in mpssas_remove_device()
563 mps_free_reply(sc, tm->cm_reply_data); in mpssas_remove_device()
564 tm->cm_reply = NULL; /* Ensures the reply won't get re-freed */ in mpssas_remove_device()
567 req = (MPI2_SAS_IOUNIT_CONTROL_REQUEST *)tm->cm_req; in mpssas_remove_device()
569 req->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL; in mpssas_remove_device()
570 req->Operation = MPI2_SAS_OP_REMOVE_DEVICE; in mpssas_remove_device()
571 req->DevHandle = htole16(handle); in mpssas_remove_device()
572 tm->cm_data = NULL; in mpssas_remove_device()
573 tm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mpssas_remove_device()
574 tm->cm_complete = mpssas_remove_complete; in mpssas_remove_device()
575 tm->cm_complete_data = (void *)(uintptr_t)handle; in mpssas_remove_device()
582 if (TAILQ_FIRST(&targ->commands) == NULL) { in mpssas_remove_device()
585 targ->tid, handle); in mpssas_remove_device()
587 targ->pending_remove_tm = NULL; in mpssas_remove_device()
589 targ->pending_remove_tm = tm; in mpssas_remove_device()
593 targ->tid, handle); in mpssas_remove_device()
606 reply = (MPI2_SAS_IOUNIT_CONTROL_REPLY *)tm->cm_reply; in mpssas_remove_complete()
607 handle = (uint16_t)(uintptr_t)tm->cm_complete_data; in mpssas_remove_complete()
608 targ = tm->cm_targ; in mpssas_remove_complete()
614 KASSERT(TAILQ_FIRST(&targ->commands) == NULL, in mpssas_remove_complete()
622 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_remove_complete()
625 "This should not happen!\n", __func__, tm->cm_flags, in mpssas_remove_complete()
641 handle, le16toh(reply->IOCStatus)); in mpssas_remove_complete()
649 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) == in mpssas_remove_complete()
651 targ->handle = 0x0; in mpssas_remove_complete()
652 targ->encl_handle = 0x0; in mpssas_remove_complete()
653 targ->encl_slot = 0x0; in mpssas_remove_complete()
654 targ->exp_dev_handle = 0x0; in mpssas_remove_complete()
655 targ->phy_num = 0x0; in mpssas_remove_complete()
656 targ->linkrate = 0x0; in mpssas_remove_complete()
657 targ->devinfo = 0x0; in mpssas_remove_complete()
658 targ->flags = 0x0; in mpssas_remove_complete()
660 while(!SLIST_EMPTY(&targ->luns)) { in mpssas_remove_complete()
661 lun = SLIST_FIRST(&targ->luns); in mpssas_remove_complete()
662 SLIST_REMOVE_HEAD(&targ->luns, lun_link); in mpssas_remove_complete()
690 &sc->sassc->mpssas_eh); in mpssas_register_events()
713 sassc->maxtargets = sc->facts->MaxTargets + sc->facts->MaxVolumes; in mps_attach_sas()
714 sassc->targets = malloc(sizeof(struct mpssas_target) * in mps_attach_sas()
715 sassc->maxtargets, M_MPT2, M_WAITOK|M_ZERO); in mps_attach_sas()
716 sc->sassc = sassc; in mps_attach_sas()
717 sassc->sc = sc; in mps_attach_sas()
719 reqs = sc->num_reqs - sc->num_prireqs - 1; in mps_attach_sas()
720 if ((sassc->devq = cam_simq_alloc(reqs)) == NULL) { in mps_attach_sas()
726 unit = device_get_unit(sc->mps_dev); in mps_attach_sas()
727 sassc->sim = cam_sim_alloc(mpssas_action, mpssas_poll, "mps", sassc, in mps_attach_sas()
728 unit, &sc->mps_mtx, reqs, reqs, sassc->devq); in mps_attach_sas()
729 if (sassc->sim == NULL) { in mps_attach_sas()
735 TAILQ_INIT(&sassc->ev_queue); in mps_attach_sas()
738 TASK_INIT(&sassc->ev_task, 0, mpssas_firmware_event_work, sc); in mps_attach_sas()
739 sassc->ev_tq = taskqueue_create("mps_taskq", M_NOWAIT | M_ZERO, in mps_attach_sas()
740 taskqueue_thread_enqueue, &sassc->ev_tq); in mps_attach_sas()
741 taskqueue_start_threads(&sassc->ev_tq, 1, PRIBIO, "%s taskq", in mps_attach_sas()
742 device_get_nameunit(sc->mps_dev)); in mps_attach_sas()
751 if ((error = xpt_bus_register(sassc->sim, sc->mps_dev, 0)) != 0) { in mps_attach_sas()
763 sassc->flags |= MPSSAS_IN_STARTUP | MPSSAS_IN_DISCOVERY; in mps_attach_sas()
764 sc->sassc->startup_refcount = 0; in mps_attach_sas()
773 status = xpt_create_path(&sassc->path, /*periph*/NULL, in mps_attach_sas()
774 cam_sim_path(sc->sassc->sim), CAM_TARGET_WILDCARD, in mps_attach_sas()
779 sassc->path = NULL; in mps_attach_sas()
785 sassc->path); in mps_attach_sas()
790 xpt_free_path(sassc->path); in mps_attach_sas()
791 sassc->path = NULL; in mps_attach_sas()
821 if (sc->sassc == NULL) in mps_detach_sas()
824 sassc = sc->sassc; in mps_detach_sas()
825 mps_deregister_events(sc, sassc->mpssas_eh); in mps_detach_sas()
832 if (sassc->ev_tq != NULL) in mps_detach_sas()
833 taskqueue_free(sassc->ev_tq); in mps_detach_sas()
836 if (sassc->path != NULL) { in mps_detach_sas()
837 xpt_register_async(0, mpssas_async, sc, sassc->path); in mps_detach_sas()
838 xpt_free_path(sassc->path); in mps_detach_sas()
839 sassc->path = NULL; in mps_detach_sas()
845 while (sassc->startup_refcount != 0) in mps_detach_sas()
848 if (sassc->flags & MPSSAS_IN_STARTUP) in mps_detach_sas()
849 xpt_release_simq(sassc->sim, 1); in mps_detach_sas()
851 if (sassc->sim != NULL) { in mps_detach_sas()
852 xpt_bus_deregister(cam_sim_path(sassc->sim)); in mps_detach_sas()
853 cam_sim_free(sassc->sim, FALSE); in mps_detach_sas()
858 if (sassc->devq != NULL) in mps_detach_sas()
859 cam_simq_free(sassc->devq); in mps_detach_sas()
861 for(i=0; i< sassc->maxtargets ;i++) { in mps_detach_sas()
862 targ = &sassc->targets[i]; in mps_detach_sas()
863 SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) { in mps_detach_sas()
867 free(sassc->targets, M_MPT2); in mps_detach_sas()
869 sc->sassc = NULL; in mps_detach_sas()
877 struct mps_softc *sc = sassc->sc; in mpssas_discovery_end()
892 if (sc->track_mapping_events) { in mpssas_discovery_end()
896 callout_reset(&sc->device_check_callout, in mpssas_discovery_end()
909 MPS_FUNCTRACE(sassc->sc); in mpssas_action()
910 mps_dprint(sassc->sc, MPS_TRACE, "ccb func_code 0x%x\n", in mpssas_action()
911 ccb->ccb_h.func_code); in mpssas_action()
912 mtx_assert(&sassc->sc->mps_mtx, MA_OWNED); in mpssas_action()
914 switch (ccb->ccb_h.func_code) { in mpssas_action()
917 struct ccb_pathinq *cpi = &ccb->cpi; in mpssas_action()
918 struct mps_softc *sc = sassc->sc; in mpssas_action()
920 cpi->version_num = 1; in mpssas_action()
921 cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16; in mpssas_action()
922 cpi->target_sprt = 0; in mpssas_action()
923 cpi->hba_misc = PIM_NOBUSRESET | PIM_UNMAPPED | PIM_NOSCAN; in mpssas_action()
924 cpi->hba_eng_cnt = 0; in mpssas_action()
925 cpi->max_target = sassc->maxtargets - 1; in mpssas_action()
926 cpi->max_lun = 255; in mpssas_action()
932 cpi->initiator_id = sassc->maxtargets; in mpssas_action()
933 strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); in mpssas_action()
934 strlcpy(cpi->hba_vid, "Avago Tech", HBA_IDLEN); in mpssas_action()
935 strlcpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); in mpssas_action()
936 cpi->unit_number = cam_sim_unit(sim); in mpssas_action()
937 cpi->bus_id = cam_sim_bus(sim); in mpssas_action()
938 cpi->base_transfer_speed = 150000; in mpssas_action()
939 cpi->transport = XPORT_SAS; in mpssas_action()
940 cpi->transport_version = 0; in mpssas_action()
941 cpi->protocol = PROTO_SCSI; in mpssas_action()
942 cpi->protocol_version = SCSI_REV_SPC; in mpssas_action()
943 cpi->maxio = sc->maxio; in mpssas_action()
949 struct ccb_trans_settings *cts; in mpssas_action() local
954 cts = &ccb->cts; in mpssas_action()
955 sas = &cts->xport_specific.sas; in mpssas_action()
956 scsi = &cts->proto_specific.scsi; in mpssas_action()
958 KASSERT(cts->ccb_h.target_id < sassc->maxtargets, in mpssas_action()
960 cts->ccb_h.target_id)); in mpssas_action()
961 targ = &sassc->targets[cts->ccb_h.target_id]; in mpssas_action()
962 if (targ->handle == 0x0) { in mpssas_action()
967 cts->protocol_version = SCSI_REV_SPC2; in mpssas_action()
968 cts->transport = XPORT_SAS; in mpssas_action()
969 cts->transport_version = 0; in mpssas_action()
971 sas->valid = CTS_SAS_VALID_SPEED; in mpssas_action()
972 switch (targ->linkrate) { in mpssas_action()
974 sas->bitrate = 150000; in mpssas_action()
977 sas->bitrate = 300000; in mpssas_action()
980 sas->bitrate = 600000; in mpssas_action()
983 sas->valid = 0; in mpssas_action()
986 cts->protocol = PROTO_SCSI; in mpssas_action()
987 scsi->valid = CTS_SCSI_VALID_TQ; in mpssas_action()
988 scsi->flags = CTS_SCSI_FLAGS_TAG_ENB; in mpssas_action()
994 cam_calc_geometry(&ccb->ccg, /*extended*/1); in mpssas_action()
998 mps_dprint(sassc->sc, MPS_XINFO, "mpssas_action XPT_RESET_DEV\n"); in mpssas_action()
1004 mps_dprint(sassc->sc, MPS_XINFO, in mpssas_action()
1026 path_id_t path_id = cam_sim_path(sc->sassc->sim); in mpssas_announce_reset()
1051 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_complete_all_commands()
1054 for (i = 1; i < sc->num_reqs; i++) { in mpssas_complete_all_commands()
1055 cm = &sc->commands[i]; in mpssas_complete_all_commands()
1056 if (cm->cm_state == MPS_CM_STATE_FREE) in mpssas_complete_all_commands()
1059 cm->cm_state = MPS_CM_STATE_BUSY; in mpssas_complete_all_commands()
1060 cm->cm_reply = NULL; in mpssas_complete_all_commands()
1063 if (cm->cm_flags & MPS_CM_FLAGS_SATA_ID_TIMEOUT) { in mpssas_complete_all_commands()
1064 MPASS(cm->cm_data); in mpssas_complete_all_commands()
1065 free(cm->cm_data, M_MPT2); in mpssas_complete_all_commands()
1066 cm->cm_data = NULL; in mpssas_complete_all_commands()
1069 if (cm->cm_flags & MPS_CM_FLAGS_POLLED) in mpssas_complete_all_commands()
1070 cm->cm_flags |= MPS_CM_FLAGS_COMPLETE; in mpssas_complete_all_commands()
1072 if (cm->cm_complete != NULL) { in mpssas_complete_all_commands()
1075 cm, cm->cm_state, cm->cm_ccb); in mpssas_complete_all_commands()
1077 cm->cm_complete(sc, cm); in mpssas_complete_all_commands()
1079 } else if (cm->cm_flags & MPS_CM_FLAGS_WAKEUP) { in mpssas_complete_all_commands()
1082 cm, cm->cm_state, cm->cm_ccb); in mpssas_complete_all_commands()
1087 if ((completed == 0) && (cm->cm_state != MPS_CM_STATE_FREE)) { in mpssas_complete_all_commands()
1091 "reset\n", cm, cm->cm_state, cm->cm_flags, in mpssas_complete_all_commands()
1092 cm->cm_ccb); in mpssas_complete_all_commands()
1096 sc->io_cmds_active = 0; in mpssas_complete_all_commands()
1109 * discovery-related activities have finished, the simq will be in mpssas_handle_reinit()
1113 sc->sassc->flags |= MPSSAS_IN_STARTUP; in mpssas_handle_reinit()
1114 sc->sassc->flags |= MPSSAS_IN_DISCOVERY; in mpssas_handle_reinit()
1115 mpssas_startup_increment(sc->sassc); in mpssas_handle_reinit()
1126 sc->sassc->startup_refcount); in mpssas_handle_reinit()
1132 for (i = 0; i < sc->sassc->maxtargets; i++) { in mpssas_handle_reinit()
1133 if (sc->sassc->targets[i].outstanding != 0) in mpssas_handle_reinit()
1135 i, sc->sassc->targets[i].outstanding); in mpssas_handle_reinit()
1136 sc->sassc->targets[i].handle = 0x0; in mpssas_handle_reinit()
1137 sc->sassc->targets[i].exp_dev_handle = 0x0; in mpssas_handle_reinit()
1138 sc->sassc->targets[i].outstanding = 0; in mpssas_handle_reinit()
1139 sc->sassc->targets[i].flags = MPSSAS_TARGET_INDIAGRESET; in mpssas_handle_reinit()
1147 struct mps_softc *sc = tm->cm_sc; in mpssas_tm_timeout()
1149 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_tm_timeout()
1154 KASSERT(tm->cm_state == MPS_CM_STATE_INQUEUE, in mpssas_tm_timeout()
1155 ("command not inqueue, state = %u\n", tm->cm_state)); in mpssas_tm_timeout()
1157 tm->cm_state = MPS_CM_STATE_BUSY; in mpssas_tm_timeout()
1169 callout_stop(&tm->cm_callout); in mpssas_logical_unit_reset_complete()
1171 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_logical_unit_reset_complete()
1172 targ = tm->cm_targ; in mpssas_logical_unit_reset_complete()
1180 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_logical_unit_reset_complete()
1183 "This should not happen!\n", __func__, tm->cm_flags); in mpssas_logical_unit_reset_complete()
1191 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) { in mpssas_logical_unit_reset_complete()
1195 targ->tm = NULL; in mpssas_logical_unit_reset_complete()
1209 le16toh(reply->IOCStatus), le32toh(reply->ResponseCode), in mpssas_logical_unit_reset_complete()
1210 le32toh(reply->TerminationCount)); in mpssas_logical_unit_reset_complete()
1214 * This could be made more efficient by using a per-LU data in mpssas_logical_unit_reset_complete()
1217 TAILQ_FOREACH(cm, &targ->commands, cm_link) { in mpssas_logical_unit_reset_complete()
1218 if (cm->cm_lun == tm->cm_lun) in mpssas_logical_unit_reset_complete()
1225 targ->tid); in mpssas_logical_unit_reset_complete()
1227 mpssas_announce_reset(sc, AC_SENT_BDR, targ->tid, tm->cm_lun); in mpssas_logical_unit_reset_complete()
1234 cm = TAILQ_FIRST(&targ->timedout_commands); in mpssas_logical_unit_reset_complete()
1238 targ->tid); in mpssas_logical_unit_reset_complete()
1241 targ->tm = NULL; in mpssas_logical_unit_reset_complete()
1252 "have %u command(s), sending target reset\n", targ->tid, in mpssas_logical_unit_reset_complete()
1266 callout_stop(&tm->cm_callout); in mpssas_target_reset_complete()
1268 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_target_reset_complete()
1269 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_target_reset_complete()
1270 targ = tm->cm_targ; in mpssas_target_reset_complete()
1277 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_target_reset_complete()
1279 "This should not happen!\n", __func__, tm->cm_flags); in mpssas_target_reset_complete()
1287 tm, le16toh(req->TaskMID)); in mpssas_target_reset_complete()
1288 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) { in mpssas_target_reset_complete()
1292 targ->tm = NULL; in mpssas_target_reset_complete()
1305 le16toh(reply->IOCStatus), le32toh(reply->ResponseCode), in mpssas_target_reset_complete()
1306 le32toh(reply->TerminationCount)); in mpssas_target_reset_complete()
1308 if (targ->outstanding == 0) { in mpssas_target_reset_complete()
1313 "Finished reset recovery for target %u\n", targ->tid); in mpssas_target_reset_complete()
1315 mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid, in mpssas_target_reset_complete()
1318 targ->tm = NULL; in mpssas_target_reset_complete()
1328 "command(s), resetting controller\n", targ->tid, in mpssas_target_reset_complete()
1329 targ->outstanding); in mpssas_target_reset_complete()
1343 target = tm->cm_targ; in mpssas_send_reset()
1344 if (target->handle == 0) { in mpssas_send_reset()
1346 __func__, target->tid); in mpssas_send_reset()
1347 return -1; in mpssas_send_reset()
1350 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_send_reset()
1351 req->DevHandle = htole16(target->handle); in mpssas_send_reset()
1352 req->TaskType = type; in mpssas_send_reset()
1356 MPS_SET_LUN(req->LUN, tm->cm_lun); in mpssas_send_reset()
1357 tm->cm_targ->logical_unit_resets++; in mpssas_send_reset()
1360 target->tid, tm->cm_lun); in mpssas_send_reset()
1361 tm->cm_complete = mpssas_logical_unit_reset_complete; in mpssas_send_reset()
1362 mpssas_prepare_for_tm(sc, tm, target, tm->cm_lun); in mpssas_send_reset()
1368 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET; in mpssas_send_reset()
1369 tm->cm_targ->target_resets++; in mpssas_send_reset()
1371 "Sending target reset to target %u\n", target->tid); in mpssas_send_reset()
1372 tm->cm_complete = mpssas_target_reset_complete; in mpssas_send_reset()
1376 return -1; in mpssas_send_reset()
1379 tm->cm_data = NULL; in mpssas_send_reset()
1380 tm->cm_complete_data = (void *)tm; in mpssas_send_reset()
1382 callout_reset(&tm->cm_callout, MPS_RESET_TIMEOUT * hz, in mpssas_send_reset()
1402 callout_stop(&tm->cm_callout); in mpssas_abort_complete()
1404 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_abort_complete()
1405 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_abort_complete()
1406 targ = tm->cm_targ; in mpssas_abort_complete()
1413 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_abort_complete()
1416 tm->cm_flags, tm, le16toh(req->TaskMID)); in mpssas_abort_complete()
1424 tm, le16toh(req->TaskMID)); in mpssas_abort_complete()
1425 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) { in mpssas_abort_complete()
1429 targ->tm = NULL; in mpssas_abort_complete()
1442 le16toh(req->TaskMID), in mpssas_abort_complete()
1443 le16toh(reply->IOCStatus), le32toh(reply->ResponseCode), in mpssas_abort_complete()
1444 le32toh(reply->TerminationCount)); in mpssas_abort_complete()
1446 cm = TAILQ_FIRST(&tm->cm_targ->timedout_commands); in mpssas_abort_complete()
1453 "Finished abort recovery for target %u\n", targ->tid); in mpssas_abort_complete()
1455 targ->tm = NULL; in mpssas_abort_complete()
1457 } else if (le16toh(req->TaskMID) != cm->cm_desc.Default.SMID) { in mpssas_abort_complete()
1460 "Continuing abort recovery for target %u\n", targ->tid); in mpssas_abort_complete()
1469 targ->tid); in mpssas_abort_complete()
1485 targ = cm->cm_targ; in mpssas_send_abort()
1486 if (targ->handle == 0) { in mpssas_send_abort()
1489 __func__, cm->cm_ccb->ccb_h.target_id); in mpssas_send_abort()
1490 return -1; in mpssas_send_abort()
1496 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_send_abort()
1497 req->DevHandle = htole16(targ->handle); in mpssas_send_abort()
1498 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK; in mpssas_send_abort()
1501 MPS_SET_LUN(req->LUN, cm->cm_ccb->ccb_h.target_lun); in mpssas_send_abort()
1503 req->TaskMID = htole16(cm->cm_desc.Default.SMID); in mpssas_send_abort()
1505 tm->cm_data = NULL; in mpssas_send_abort()
1506 tm->cm_complete = mpssas_abort_complete; in mpssas_send_abort()
1507 tm->cm_complete_data = (void *)tm; in mpssas_send_abort()
1508 tm->cm_targ = cm->cm_targ; in mpssas_send_abort()
1509 tm->cm_lun = cm->cm_lun; in mpssas_send_abort()
1511 callout_reset(&tm->cm_callout, MPS_ABORT_TIMEOUT * hz, in mpssas_send_abort()
1514 targ->aborts++; in mpssas_send_abort()
1516 mpssas_prepare_for_tm(sc, tm, targ, tm->cm_lun); in mpssas_send_abort()
1522 err, cm, req->TaskMID); in mpssas_send_abort()
1536 sc = cm->cm_sc; in mpssas_scsiio_timeout()
1537 ccb = cm->cm_ccb; in mpssas_scsiio_timeout()
1541 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_scsiio_timeout()
1548 * and been re-used, though this is unlikely. in mpssas_scsiio_timeout()
1551 if (cm->cm_flags & MPS_CM_FLAGS_ON_RECOVERY) { in mpssas_scsiio_timeout()
1557 if (cm->cm_ccb == NULL) { in mpssas_scsiio_timeout()
1562 targ = cm->cm_targ; in mpssas_scsiio_timeout()
1563 targ->timeouts++; in mpssas_scsiio_timeout()
1565 elapsed = now - ccb->ccb_h.qos.sim_data; in mpssas_scsiio_timeout()
1568 targ->tid, targ->handle, ccb->ccb_h.timeout, in mpssas_scsiio_timeout()
1574 mpssas_set_ccbstatus(cm->cm_ccb, CAM_CMD_TIMEOUT); in mpssas_scsiio_timeout()
1575 cm->cm_flags |= MPS_CM_FLAGS_ON_RECOVERY | MPS_CM_FLAGS_TIMEDOUT; in mpssas_scsiio_timeout()
1576 TAILQ_INSERT_TAIL(&targ->timedout_commands, cm, cm_recovery); in mpssas_scsiio_timeout()
1578 if (targ->tm != NULL) { in mpssas_scsiio_timeout()
1584 cm, targ->tm); in mpssas_scsiio_timeout()
1585 } else if ((targ->tm = mpssas_alloc_tm(sc)) != NULL) { in mpssas_scsiio_timeout()
1587 "Sending abort to target %u for SMID %d\n", targ->tid, in mpssas_scsiio_timeout()
1588 cm->cm_desc.Default.SMID); in mpssas_scsiio_timeout()
1590 cm, targ->tm); in mpssas_scsiio_timeout()
1593 mpssas_send_abort(sc, targ->tm, cm); in mpssas_scsiio_timeout()
1623 sc = sassc->sc; in mpssas_action_scsiio()
1625 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_action_scsiio()
1627 csio = &ccb->csio; in mpssas_action_scsiio()
1628 KASSERT(csio->ccb_h.target_id < sassc->maxtargets, in mpssas_action_scsiio()
1630 csio->ccb_h.target_id)); in mpssas_action_scsiio()
1631 targ = &sassc->targets[csio->ccb_h.target_id]; in mpssas_action_scsiio()
1632 mps_dprint(sc, MPS_TRACE, "ccb %p target flag %x\n", ccb, targ->flags); in mpssas_action_scsiio()
1633 if (targ->handle == 0x0) { in mpssas_action_scsiio()
1634 if (targ->flags & MPSSAS_TARGET_INDIAGRESET) { in mpssas_action_scsiio()
1637 __func__, csio->ccb_h.target_id); in mpssas_action_scsiio()
1638 ccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_DEV_QFRZN; in mpssas_action_scsiio()
1639 xpt_freeze_devq(ccb->ccb_h.path, 1); in mpssas_action_scsiio()
1644 __func__, csio->ccb_h.target_id); in mpssas_action_scsiio()
1649 if (targ->flags & MPS_TARGET_FLAGS_RAID_COMPONENT) { in mpssas_action_scsiio()
1651 "supported %u\n", __func__, csio->ccb_h.target_id); in mpssas_action_scsiio()
1663 "target %u\n", __func__, csio->ccb_h.target_id); in mpssas_action_scsiio()
1676 if (targ->flags & MPSSAS_TARGET_INREMOVAL) { in mpssas_action_scsiio()
1677 if (targ->devinfo == 0) in mpssas_action_scsiio()
1685 if ((sc->mps_flags & MPS_FLAGS_SHUTDOWN) != 0) { in mpssas_action_scsiio()
1696 if (targ->flags & MPSSAS_TARGET_INRESET) { in mpssas_action_scsiio()
1697 ccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_DEV_QFRZN; in mpssas_action_scsiio()
1699 __func__, targ->tid); in mpssas_action_scsiio()
1700 xpt_freeze_devq(ccb->ccb_h.path, 1); in mpssas_action_scsiio()
1706 if (cm == NULL || (sc->mps_flags & MPS_FLAGS_DIAGRESET)) { in mpssas_action_scsiio()
1710 if ((sassc->flags & MPSSAS_QUEUE_FROZEN) == 0) { in mpssas_action_scsiio()
1711 xpt_freeze_simq(sassc->sim, 1); in mpssas_action_scsiio()
1712 sassc->flags |= MPSSAS_QUEUE_FROZEN; in mpssas_action_scsiio()
1714 ccb->ccb_h.status &= ~CAM_SIM_QUEUED; in mpssas_action_scsiio()
1715 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in mpssas_action_scsiio()
1720 req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req; in mpssas_action_scsiio()
1722 req->DevHandle = htole16(targ->handle); in mpssas_action_scsiio()
1723 req->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; in mpssas_action_scsiio()
1724 req->MsgFlags = 0; in mpssas_action_scsiio()
1725 req->SenseBufferLowAddress = htole32(cm->cm_sense_busaddr); in mpssas_action_scsiio()
1726 req->SenseBufferLength = MPS_SENSE_LEN; in mpssas_action_scsiio()
1727 req->SGLFlags = 0; in mpssas_action_scsiio()
1728 req->ChainOffset = 0; in mpssas_action_scsiio()
1729 req->SGLOffset0 = 24; /* 32bit word offset to the SGL */ in mpssas_action_scsiio()
1730 req->SGLOffset1= 0; in mpssas_action_scsiio()
1731 req->SGLOffset2= 0; in mpssas_action_scsiio()
1732 req->SGLOffset3= 0; in mpssas_action_scsiio()
1733 req->SkipCount = 0; in mpssas_action_scsiio()
1734 req->DataLength = htole32(csio->dxfer_len); in mpssas_action_scsiio()
1735 req->BidirectionalDataLength = 0; in mpssas_action_scsiio()
1736 req->IoFlags = htole16(csio->cdb_len); in mpssas_action_scsiio()
1737 req->EEDPFlags = 0; in mpssas_action_scsiio()
1740 switch (csio->ccb_h.flags & CAM_DIR_MASK) { in mpssas_action_scsiio()
1743 cm->cm_flags |= MPS_CM_FLAGS_DATAIN; in mpssas_action_scsiio()
1747 cm->cm_flags |= MPS_CM_FLAGS_DATAOUT; in mpssas_action_scsiio()
1755 if (csio->cdb_len == 32) in mpssas_action_scsiio()
1762 switch (csio->tag_action) { in mpssas_action_scsiio()
1778 mpi_control |= (csio->priority << MPI2_SCSIIO_CONTROL_TASKPRI_SHIFT) & in mpssas_action_scsiio()
1780 mpi_control |= sc->mapping_table[csio->ccb_h.target_id].TLR_bits; in mpssas_action_scsiio()
1781 req->Control = htole32(mpi_control); in mpssas_action_scsiio()
1782 if (MPS_SET_LUN(req->LUN, csio->ccb_h.target_lun) != 0) { in mpssas_action_scsiio()
1789 if (csio->ccb_h.flags & CAM_CDB_POINTER) in mpssas_action_scsiio()
1790 bcopy(csio->cdb_io.cdb_ptr, &req->CDB.CDB32[0], csio->cdb_len); in mpssas_action_scsiio()
1792 bcopy(csio->cdb_io.cdb_bytes, &req->CDB.CDB32[0],csio->cdb_len); in mpssas_action_scsiio()
1793 req->IoFlags = htole16(csio->cdb_len); in mpssas_action_scsiio()
1801 eedp_flags = op_code_prot[req->CDB.CDB32[0]]; in mpssas_action_scsiio()
1802 if (sc->eedp_enabled && eedp_flags) { in mpssas_action_scsiio()
1803 SLIST_FOREACH(lun, &targ->luns, lun_link) { in mpssas_action_scsiio()
1804 if (lun->lun_id == csio->ccb_h.target_lun) { in mpssas_action_scsiio()
1809 if ((lun != NULL) && (lun->eedp_formatted)) { in mpssas_action_scsiio()
1810 req->EEDPBlockSize = htole16(lun->eedp_block_size); in mpssas_action_scsiio()
1814 req->EEDPFlags = htole16(eedp_flags); in mpssas_action_scsiio()
1824 if (csio->cdb_len != 32) { in mpssas_action_scsiio()
1825 lba_byte = (csio->cdb_len == 16) ? 6 : 2; in mpssas_action_scsiio()
1826 ref_tag_addr = (uint8_t *)&req->CDB.EEDP32. in mpssas_action_scsiio()
1830 req->CDB.CDB32[lba_byte + i]; in mpssas_action_scsiio()
1833 req->CDB.EEDP32.PrimaryReferenceTag = in mpssas_action_scsiio()
1834 htole32(req->CDB.EEDP32.PrimaryReferenceTag); in mpssas_action_scsiio()
1835 req->CDB.EEDP32.PrimaryApplicationTagMask = in mpssas_action_scsiio()
1837 req->CDB.CDB32[1] = (req->CDB.CDB32[1] & 0x1F) | in mpssas_action_scsiio()
1842 req->EEDPFlags = htole16(eedp_flags); in mpssas_action_scsiio()
1843 req->CDB.CDB32[10] = (req->CDB.CDB32[10] & in mpssas_action_scsiio()
1849 cm->cm_length = csio->dxfer_len; in mpssas_action_scsiio()
1850 if (cm->cm_length != 0) { in mpssas_action_scsiio()
1851 cm->cm_data = ccb; in mpssas_action_scsiio()
1852 cm->cm_flags |= MPS_CM_FLAGS_USE_CCB; in mpssas_action_scsiio()
1854 cm->cm_data = NULL; in mpssas_action_scsiio()
1856 cm->cm_sge = &req->SGL; in mpssas_action_scsiio()
1857 cm->cm_sglsize = (32 - 24) * 4; in mpssas_action_scsiio()
1858 cm->cm_desc.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO; in mpssas_action_scsiio()
1859 cm->cm_desc.SCSIIO.DevHandle = htole16(targ->handle); in mpssas_action_scsiio()
1860 cm->cm_complete = mpssas_scsiio_complete; in mpssas_action_scsiio()
1861 cm->cm_complete_data = ccb; in mpssas_action_scsiio()
1862 cm->cm_targ = targ; in mpssas_action_scsiio()
1863 cm->cm_lun = csio->ccb_h.target_lun; in mpssas_action_scsiio()
1864 cm->cm_ccb = ccb; in mpssas_action_scsiio()
1871 if (sc->WD_valid_config) { in mpssas_action_scsiio()
1872 if (ccb->ccb_h.sim_priv.entries[0].field == MPS_WD_RETRY) { in mpssas_action_scsiio()
1880 if (csio->bio != NULL) in mpssas_action_scsiio()
1881 biotrack(csio->bio, __func__); in mpssas_action_scsiio()
1883 csio->ccb_h.qos.sim_data = sbinuptime(); in mpssas_action_scsiio()
1884 callout_reset_sbt(&cm->cm_callout, SBT_1MS * ccb->ccb_h.timeout, 0, in mpssas_action_scsiio()
1887 targ->issued++; in mpssas_action_scsiio()
1888 targ->outstanding++; in mpssas_action_scsiio()
1889 TAILQ_INSERT_TAIL(&targ->commands, cm, cm_link); in mpssas_action_scsiio()
1890 ccb->ccb_h.status |= CAM_SIM_QUEUED; in mpssas_action_scsiio()
1893 __func__, cm, ccb, targ->outstanding); in mpssas_action_scsiio()
1900 * mps_sc_failed_io_info - translated non-succesfull SCSI_IO request
1908 u16 ioc_status = le16toh(mpi_reply->IOCStatus) & in mps_sc_failed_io_info()
1910 u8 scsi_state = mpi_reply->SCSIState; in mps_sc_failed_io_info()
1911 u8 scsi_status = mpi_reply->SCSIStatus; in mps_sc_failed_io_info()
1912 u32 log_info = le32toh(mpi_reply->IOCLogInfo); in mps_sc_failed_io_info()
1924 le16toh(mpi_reply->DevHandle), desc_ioc_state, ioc_status); in mps_sc_failed_io_info()
1928 * TO-DO in mps_sc_failed_io_info()
1935 if (sc->mps_debug & MPS_XINFO && in mps_sc_failed_io_info()
1937 mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : Start :\n"); in mps_sc_failed_io_info()
1939 mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : End :\n"); in mps_sc_failed_io_info()
1943 response_info = le32toh(mpi_reply->ResponseInfo); in mps_sc_failed_io_info()
1969 cm->cm_desc.Default.SMID, cm->cm_ccb, cm->cm_reply, in mpssas_scsiio_complete()
1970 cm->cm_targ->outstanding); in mpssas_scsiio_complete()
1972 callout_stop(&cm->cm_callout); in mpssas_scsiio_complete()
1973 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_scsiio_complete()
1975 sassc = sc->sassc; in mpssas_scsiio_complete()
1976 ccb = cm->cm_complete_data; in mpssas_scsiio_complete()
1977 csio = &ccb->csio; in mpssas_scsiio_complete()
1978 target_id = csio->ccb_h.target_id; in mpssas_scsiio_complete()
1979 rep = (MPI2_SCSI_IO_REPLY *)cm->cm_reply; in mpssas_scsiio_complete()
1985 if (cm->cm_data != NULL) { in mpssas_scsiio_complete()
1986 if (cm->cm_flags & MPS_CM_FLAGS_DATAIN) in mpssas_scsiio_complete()
1988 else if (cm->cm_flags & MPS_CM_FLAGS_DATAOUT) in mpssas_scsiio_complete()
1990 bus_dmamap_sync(sc->buffer_dmat, cm->cm_dmamap, dir); in mpssas_scsiio_complete()
1991 bus_dmamap_unload(sc->buffer_dmat, cm->cm_dmamap); in mpssas_scsiio_complete()
1994 cm->cm_targ->completed++; in mpssas_scsiio_complete()
1995 cm->cm_targ->outstanding--; in mpssas_scsiio_complete()
1996 TAILQ_REMOVE(&cm->cm_targ->commands, cm, cm_link); in mpssas_scsiio_complete()
1997 ccb->ccb_h.status &= ~(CAM_STATUS_MASK | CAM_SIM_QUEUED); in mpssas_scsiio_complete()
2000 if (ccb->csio.bio != NULL) in mpssas_scsiio_complete()
2001 biotrack(ccb->csio.bio, __func__); in mpssas_scsiio_complete()
2004 if (cm->cm_flags & MPS_CM_FLAGS_ON_RECOVERY) { in mpssas_scsiio_complete()
2005 TAILQ_REMOVE(&cm->cm_targ->timedout_commands, cm, cm_recovery); in mpssas_scsiio_complete()
2006 KASSERT(cm->cm_state == MPS_CM_STATE_BUSY, in mpssas_scsiio_complete()
2007 ("Not busy for CM_FLAGS_TIMEDOUT: %u\n", cm->cm_state)); in mpssas_scsiio_complete()
2008 cm->cm_flags &= ~MPS_CM_FLAGS_ON_RECOVERY; in mpssas_scsiio_complete()
2009 if (cm->cm_reply != NULL) in mpssas_scsiio_complete()
2013 cm, cm->cm_ccb, le16toh(rep->IOCStatus), in mpssas_scsiio_complete()
2014 rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2015 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2019 cm, cm->cm_ccb); in mpssas_scsiio_complete()
2020 } else if (cm->cm_targ->tm != NULL) { in mpssas_scsiio_complete()
2021 if (cm->cm_reply != NULL) in mpssas_scsiio_complete()
2025 cm, cm->cm_ccb, le16toh(rep->IOCStatus), in mpssas_scsiio_complete()
2026 rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2027 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2031 cm, cm->cm_ccb); in mpssas_scsiio_complete()
2032 } else if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) { in mpssas_scsiio_complete()
2035 cm, cm->cm_ccb); in mpssas_scsiio_complete()
2038 if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_scsiio_complete()
2060 if ((sassc->flags & MPSSAS_QUEUE_FROZEN) == 0) { in mpssas_scsiio_complete()
2061 xpt_freeze_simq(sassc->sim, 1); in mpssas_scsiio_complete()
2062 sassc->flags |= MPSSAS_QUEUE_FROZEN; in mpssas_scsiio_complete()
2075 if (sc->SSU_started && (csio->cdb_io.cdb_bytes[0] == START_STOP_UNIT)) { in mpssas_scsiio_complete()
2077 sc->SSU_refcount--; in mpssas_scsiio_complete()
2081 if (cm->cm_reply == NULL) { in mpssas_scsiio_complete()
2083 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) in mpssas_scsiio_complete()
2087 ccb->csio.scsi_status = SCSI_STATUS_OK; in mpssas_scsiio_complete()
2089 if (sassc->flags & MPSSAS_QUEUE_FROZEN) { in mpssas_scsiio_complete()
2090 ccb->ccb_h.status |= CAM_RELEASE_SIMQ; in mpssas_scsiio_complete()
2091 sassc->flags &= ~MPSSAS_QUEUE_FROZEN; in mpssas_scsiio_complete()
2108 ccb->ccb_h.status |= CAM_DEV_QFRZN; in mpssas_scsiio_complete()
2109 xpt_freeze_devq(ccb->ccb_h.path, /*count*/ 1); in mpssas_scsiio_complete()
2118 le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2119 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2127 if (cm->cm_flags & MPS_CM_FLAGS_DD_IO) { in mpssas_scsiio_complete()
2129 ccb->ccb_h.sim_priv.entries[0].field = MPS_WD_RETRY; in mpssas_scsiio_complete()
2133 ccb->ccb_h.sim_priv.entries[0].field = 0; in mpssas_scsiio_complete()
2135 switch (le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK) { in mpssas_scsiio_complete()
2137 csio->resid = cm->cm_length - le32toh(rep->TransferCount); in mpssas_scsiio_complete()
2142 if ((le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK) == in mpssas_scsiio_complete()
2147 if (rep->SCSIState & (MPI2_SCSI_STATE_NO_SCSI_STATUS | in mpssas_scsiio_complete()
2157 if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_FAILED) { in mpssas_scsiio_complete()
2167 if ((rep->SCSIState & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) && in mpssas_scsiio_complete()
2168 ((le32toh(rep->ResponseInfo) & in mpssas_scsiio_complete()
2171 sc->mapping_table[target_id].TLR_bits = in mpssas_scsiio_complete()
2176 * Intentionally override the normal SCSI status reporting in mpssas_scsiio_complete()
2178 * multi-initiator environment, and we want to make sure that in mpssas_scsiio_complete()
2181 if ((rep->SCSIStatus == MPI2_SCSI_STATUS_COMMAND_TERMINATED) || in mpssas_scsiio_complete()
2182 (rep->SCSIStatus == MPI2_SCSI_STATUS_TASK_ABORTED)) { in mpssas_scsiio_complete()
2188 csio->scsi_status = rep->SCSIStatus; in mpssas_scsiio_complete()
2189 if (rep->SCSIStatus == MPI2_SCSI_STATUS_GOOD) in mpssas_scsiio_complete()
2194 if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_VALID) { in mpssas_scsiio_complete()
2197 returned_sense_len = min(le32toh(rep->SenseCount), in mpssas_scsiio_complete()
2199 if (returned_sense_len < ccb->csio.sense_len) in mpssas_scsiio_complete()
2200 ccb->csio.sense_resid = ccb->csio.sense_len - in mpssas_scsiio_complete()
2203 ccb->csio.sense_resid = 0; in mpssas_scsiio_complete()
2206 ccb->csio.sense_len - ccb->csio.sense_resid); in mpssas_scsiio_complete()
2207 bzero(&ccb->csio.sense_data, in mpssas_scsiio_complete()
2208 sizeof(ccb->csio.sense_data)); in mpssas_scsiio_complete()
2209 bcopy(cm->cm_sense, &ccb->csio.sense_data, sense_len); in mpssas_scsiio_complete()
2210 ccb->ccb_h.status |= CAM_AUTOSNS_VALID; in mpssas_scsiio_complete()
2221 if ((csio->cdb_io.cdb_bytes[0] == INQUIRY) && in mpssas_scsiio_complete()
2222 (csio->cdb_io.cdb_bytes[1] & SI_EVPD) && in mpssas_scsiio_complete()
2223 (csio->cdb_io.cdb_bytes[2] == SVPD_SUPPORTED_PAGE_LIST) && in mpssas_scsiio_complete()
2224 ((csio->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) && in mpssas_scsiio_complete()
2225 (csio->data_ptr != NULL) && in mpssas_scsiio_complete()
2226 ((csio->data_ptr[0] & 0x1f) == T_SEQUENTIAL) && in mpssas_scsiio_complete()
2227 (sc->control_TLR) && in mpssas_scsiio_complete()
2228 (sc->mapping_table[target_id].device_info & in mpssas_scsiio_complete()
2231 csio->data_ptr; in mpssas_scsiio_complete()
2232 TLR_bits = &sc->mapping_table[target_id].TLR_bits; in mpssas_scsiio_complete()
2235 alloc_len = ((u16)csio->cdb_io.cdb_bytes[3] << 8) + in mpssas_scsiio_complete()
2236 csio->cdb_io.cdb_bytes[4]; in mpssas_scsiio_complete()
2237 alloc_len -= csio->resid; in mpssas_scsiio_complete()
2238 for (i = 0; i < MIN(vpd_list->length, alloc_len); i++) { in mpssas_scsiio_complete()
2239 if (vpd_list->list[i] == 0x90) { in mpssas_scsiio_complete()
2247 * If this is a SATA direct-access end device, mark it so that in mpssas_scsiio_complete()
2251 if ((csio->cdb_io.cdb_bytes[0] == INQUIRY) && in mpssas_scsiio_complete()
2252 ((csio->data_ptr[0] & 0x1f) == T_DIRECT) && in mpssas_scsiio_complete()
2253 (sc->mapping_table[target_id].device_info & in mpssas_scsiio_complete()
2255 ((sc->mapping_table[target_id].device_info & in mpssas_scsiio_complete()
2258 target = &sassc->targets[target_id]; in mpssas_scsiio_complete()
2259 target->supports_SSU = TRUE; in mpssas_scsiio_complete()
2272 if (cm->cm_targ->devinfo == 0) in mpssas_scsiio_complete()
2291 if (cm->cm_flags & MPS_CM_FLAGS_TIMEDOUT) in mpssas_scsiio_complete()
2298 csio->resid = 0; in mpssas_scsiio_complete()
2304 * These can sometimes be transient transport-related in mpssas_scsiio_complete()
2305 * errors, and sometimes persistent drive-related errors. in mpssas_scsiio_complete()
2313 * of a topology-related error (e.g. a SAS expander problem in mpssas_scsiio_complete()
2320 if (cm->cm_targ->flags & MPSSAS_TARGET_INREMOVAL) in mpssas_scsiio_complete()
2327 le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK), in mpssas_scsiio_complete()
2328 target_id, cm->cm_desc.Default.SMID, in mpssas_scsiio_complete()
2329 le32toh(rep->IOCLogInfo), in mpssas_scsiio_complete()
2330 (cm->cm_targ->flags & MPSSAS_TARGET_INREMOVAL) ? " departing" : ""); in mpssas_scsiio_complete()
2333 rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2334 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2349 le16toh(rep->IOCStatus), le32toh(rep->IOCLogInfo), in mpssas_scsiio_complete()
2350 rep->SCSIStatus, rep->SCSIState, in mpssas_scsiio_complete()
2351 le32toh(rep->TransferCount)); in mpssas_scsiio_complete()
2352 csio->resid = cm->cm_length; in mpssas_scsiio_complete()
2359 if (sassc->flags & MPSSAS_QUEUE_FROZEN) { in mpssas_scsiio_complete()
2360 ccb->ccb_h.status |= CAM_RELEASE_SIMQ; in mpssas_scsiio_complete()
2361 sassc->flags &= ~MPSSAS_QUEUE_FROZEN; in mpssas_scsiio_complete()
2367 ccb->ccb_h.status |= CAM_DEV_QFRZN; in mpssas_scsiio_complete()
2368 xpt_freeze_devq(ccb->ccb_h.path, /*count*/ 1); in mpssas_scsiio_complete()
2377 if (cm->cm_targ->flags & MPSSAS_TARGET_INREMOVAL) { in mpssas_scsiio_complete()
2378 if (TAILQ_FIRST(&cm->cm_targ->commands) == NULL && in mpssas_scsiio_complete()
2379 cm->cm_targ->pending_remove_tm != NULL) { in mpssas_scsiio_complete()
2382 cm->cm_targ->tid, cm->cm_targ->handle); in mpssas_scsiio_complete()
2383 mps_map_command(sc, cm->cm_targ->pending_remove_tm); in mpssas_scsiio_complete()
2384 cm->cm_targ->pending_remove_tm = NULL; in mpssas_scsiio_complete()
2397 struct mps_softc *sc = sassc->sc; in mpssas_direct_drive_io()
2409 pIO_req = (pMpi2SCSIIORequest_t)cm->cm_req; in mpssas_direct_drive_io()
2410 CDB = pIO_req->CDB.CDB32; in mpssas_direct_drive_io()
2415 if ((pIO_req->DevHandle == sc->DD_dev_handle) && ((CDB[0] == READ_6) || in mpssas_direct_drive_io()
2420 io_size = (cm->cm_length >> sc->DD_block_exponent); in mpssas_direct_drive_io()
2432 if ((virtLBA + (uint64_t)io_size - 1) <= in mpssas_direct_drive_io()
2433 sc->DD_max_lba) { in mpssas_direct_drive_io()
2444 (sc->DD_stripe_size - 1); in mpssas_direct_drive_io()
2445 if ((stripe_offset + io_size) <= sc->DD_stripe_size) { in mpssas_direct_drive_io()
2447 sc->DD_stripe_exponent; in mpssas_direct_drive_io()
2448 stripe_unit = physLBA / sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2449 column = physLBA % sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2450 pIO_req->DevHandle = in mpssas_direct_drive_io()
2451 htole16(sc->DD_column_map[column].dev_handle); in mpssas_direct_drive_io()
2453 cm->cm_desc.SCSIIO.DevHandle = in mpssas_direct_drive_io()
2454 pIO_req->DevHandle; in mpssas_direct_drive_io()
2457 sc->DD_stripe_exponent) + stripe_offset; in mpssas_direct_drive_io()
2458 ptrLBA = &pIO_req->CDB.CDB32[1]; in mpssas_direct_drive_io()
2461 ptrLBA = &pIO_req->CDB.CDB32[2]; in mpssas_direct_drive_io()
2464 ptrLBA = &pIO_req->CDB.CDB32[3]; in mpssas_direct_drive_io()
2472 cm->cm_flags |= MPS_CM_FLAGS_DD_IO; in mpssas_direct_drive_io()
2481 if ((pIO_req->DevHandle == sc->DD_dev_handle) && ((CDB[0] == READ_10) || in mpssas_direct_drive_io()
2486 * For 16-byte CDB's, verify that the upper 4 bytes of the CDB in mpssas_direct_drive_io()
2488 * the else section. 10-byte and 12-byte CDB's are OK. in mpssas_direct_drive_io()
2498 io_size = (cm->cm_length >> sc->DD_block_exponent); in mpssas_direct_drive_io()
2517 if ((virtLBA + (uint64_t)io_size - 1) <= in mpssas_direct_drive_io()
2518 sc->DD_max_lba) { in mpssas_direct_drive_io()
2530 (sc->DD_stripe_size - 1); in mpssas_direct_drive_io()
2532 sc->DD_stripe_size) { in mpssas_direct_drive_io()
2534 sc->DD_stripe_exponent; in mpssas_direct_drive_io()
2536 sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2538 sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2539 pIO_req->DevHandle = in mpssas_direct_drive_io()
2540 htole16(sc->DD_column_map[column]. in mpssas_direct_drive_io()
2542 cm->cm_desc.SCSIIO.DevHandle = in mpssas_direct_drive_io()
2543 pIO_req->DevHandle; in mpssas_direct_drive_io()
2546 sc->DD_stripe_exponent) + in mpssas_direct_drive_io()
2549 &pIO_req->CDB.CDB32[lba_idx]; in mpssas_direct_drive_io()
2553 &pIO_req->CDB.CDB32[lba_idx + 1]; in mpssas_direct_drive_io()
2557 &pIO_req->CDB.CDB32[lba_idx + 2]; in mpssas_direct_drive_io()
2561 &pIO_req->CDB.CDB32[lba_idx + 3]; in mpssas_direct_drive_io()
2569 cm->cm_flags |= MPS_CM_FLAGS_DD_IO; in mpssas_direct_drive_io()
2574 * 16-byte CDB and the upper 4 bytes of the CDB are not in mpssas_direct_drive_io()
2577 io_size = (cm->cm_length >> sc->DD_block_exponent); in mpssas_direct_drive_io()
2595 if ((virtLBA + (uint64_t)io_size - 1) <= in mpssas_direct_drive_io()
2596 sc->DD_max_lba) { in mpssas_direct_drive_io()
2608 (sc->DD_stripe_size - 1); in mpssas_direct_drive_io()
2610 sc->DD_stripe_size) { in mpssas_direct_drive_io()
2612 sc->DD_stripe_exponent); in mpssas_direct_drive_io()
2614 sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2616 sc->DD_num_phys_disks; in mpssas_direct_drive_io()
2617 pIO_req->DevHandle = in mpssas_direct_drive_io()
2618 htole16(sc->DD_column_map[column]. in mpssas_direct_drive_io()
2620 cm->cm_desc.SCSIIO.DevHandle = in mpssas_direct_drive_io()
2621 pIO_req->DevHandle; in mpssas_direct_drive_io()
2624 sc->DD_stripe_exponent) + in mpssas_direct_drive_io()
2633 pIO_req->CDB.CDB32[2] = 0; in mpssas_direct_drive_io()
2634 pIO_req->CDB.CDB32[3] = 0; in mpssas_direct_drive_io()
2635 pIO_req->CDB.CDB32[4] = 0; in mpssas_direct_drive_io()
2636 pIO_req->CDB.CDB32[5] = 0; in mpssas_direct_drive_io()
2637 ptrLBA = &pIO_req->CDB.CDB32[6]; in mpssas_direct_drive_io()
2640 ptrLBA = &pIO_req->CDB.CDB32[7]; in mpssas_direct_drive_io()
2643 ptrLBA = &pIO_req->CDB.CDB32[8]; in mpssas_direct_drive_io()
2646 ptrLBA = &pIO_req->CDB.CDB32[9]; in mpssas_direct_drive_io()
2654 cm->cm_flags |= MPS_CM_FLAGS_DD_IO; in mpssas_direct_drive_io()
2669 ccb = cm->cm_complete_data; in mpssas_smpio_complete()
2677 if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_smpio_complete()
2679 __func__, cm->cm_flags); in mpssas_smpio_complete()
2684 rpl = (MPI2_SMP_PASSTHROUGH_REPLY *)cm->cm_reply; in mpssas_smpio_complete()
2691 req = (MPI2_SMP_PASSTHROUGH_REQUEST *)cm->cm_req; in mpssas_smpio_complete()
2692 sasaddr = le32toh(req->SASAddress.Low); in mpssas_smpio_complete()
2693 sasaddr |= ((uint64_t)(le32toh(req->SASAddress.High))) << 32; in mpssas_smpio_complete()
2695 if ((le16toh(rpl->IOCStatus) & MPI2_IOCSTATUS_MASK) != in mpssas_smpio_complete()
2697 rpl->SASStatus != MPI2_SASSTATUS_SUCCESS) { in mpssas_smpio_complete()
2699 __func__, le16toh(rpl->IOCStatus), rpl->SASStatus); in mpssas_smpio_complete()
2708 if (ccb->smpio.smp_response[2] == SMP_FR_ACCEPTED) in mpssas_smpio_complete()
2718 bus_dmamap_sync(sc->buffer_dmat, cm->cm_dmamap, in mpssas_smpio_complete()
2720 bus_dmamap_unload(sc->buffer_dmat, cm->cm_dmamap); in mpssas_smpio_complete()
2734 sc = sassc->sc; in mpssas_send_smpcmd()
2740 switch ((ccb->ccb_h.flags & CAM_DATA_MASK)) { in mpssas_send_smpcmd()
2753 if ((ccb->smpio.smp_request_sglist_cnt > 1) in mpssas_send_smpcmd()
2754 || (ccb->smpio.smp_response_sglist_cnt > 1)) { in mpssas_send_smpcmd()
2772 if (ccb->smpio.smp_request_sglist_cnt != 0) { in mpssas_send_smpcmd()
2775 req_sg = (bus_dma_segment_t *)ccb->smpio.smp_request; in mpssas_send_smpcmd()
2778 request = ccb->smpio.smp_request; in mpssas_send_smpcmd()
2780 if (ccb->smpio.smp_response_sglist_cnt != 0) { in mpssas_send_smpcmd()
2783 rsp_sg = (bus_dma_segment_t *)ccb->smpio.smp_response; in mpssas_send_smpcmd()
2786 response = ccb->smpio.smp_response; in mpssas_send_smpcmd()
2789 request = ccb->smpio.smp_request; in mpssas_send_smpcmd()
2790 response = ccb->smpio.smp_response; in mpssas_send_smpcmd()
2807 req = (MPI2_SMP_PASSTHROUGH_REQUEST *)cm->cm_req; in mpssas_send_smpcmd()
2809 req->Function = MPI2_FUNCTION_SMP_PASSTHROUGH; in mpssas_send_smpcmd()
2812 req->PhysicalPort = 0xff; in mpssas_send_smpcmd()
2814 req->RequestDataLength = htole16(ccb->smpio.smp_request_len); in mpssas_send_smpcmd()
2815 req->SGLFlags = in mpssas_send_smpcmd()
2821 mpi_init_sge(cm, req, &req->SGL); in mpssas_send_smpcmd()
2827 cm->cm_uio.uio_iov = cm->cm_iovec; in mpssas_send_smpcmd()
2828 cm->cm_uio.uio_iovcnt = 2; in mpssas_send_smpcmd()
2829 cm->cm_uio.uio_segflg = UIO_SYSSPACE; in mpssas_send_smpcmd()
2836 cm->cm_uio.uio_rw = UIO_WRITE; in mpssas_send_smpcmd()
2838 cm->cm_iovec[0].iov_base = request; in mpssas_send_smpcmd()
2839 cm->cm_iovec[0].iov_len = le16toh(req->RequestDataLength); in mpssas_send_smpcmd()
2840 cm->cm_iovec[1].iov_base = response; in mpssas_send_smpcmd()
2841 cm->cm_iovec[1].iov_len = ccb->smpio.smp_response_len; in mpssas_send_smpcmd()
2843 cm->cm_uio.uio_resid = cm->cm_iovec[0].iov_len + in mpssas_send_smpcmd()
2844 cm->cm_iovec[1].iov_len; in mpssas_send_smpcmd()
2851 cm->cm_max_segs = 2; in mpssas_send_smpcmd()
2853 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mpssas_send_smpcmd()
2854 cm->cm_complete = mpssas_smpio_complete; in mpssas_send_smpcmd()
2855 cm->cm_complete_data = ccb; in mpssas_send_smpcmd()
2859 * an SMP passthrough request. There is a little special-case in mpssas_send_smpcmd()
2863 cm->cm_flags |= MPS_CM_FLAGS_USE_UIO | MPS_CM_FLAGS_SMP_PASS | in mpssas_send_smpcmd()
2867 req->SASAddress.High = htole32(sasaddr >> 32); in mpssas_send_smpcmd()
2868 req->SASAddress.Low = htole32(sasaddr); in mpssas_send_smpcmd()
2903 sc = sassc->sc; in mpssas_action_smpio()
2908 KASSERT(ccb->ccb_h.target_id < sassc->maxtargets, in mpssas_action_smpio()
2909 ("Target %d out of bounds in XPT_SMP_IO\n", ccb->ccb_h.target_id)); in mpssas_action_smpio()
2910 targ = &sassc->targets[ccb->ccb_h.target_id]; in mpssas_action_smpio()
2911 if (targ->handle == 0x0) { in mpssas_action_smpio()
2914 ccb->ccb_h.target_id); in mpssas_action_smpio()
2925 if ((targ->devinfo & MPI2_SAS_DEVICE_INFO_SMP_TARGET) != 0) in mpssas_action_smpio()
2926 sasaddr = targ->sasaddr; in mpssas_action_smpio()
2932 * expander SAS address as the port-associated SAS address in in mpssas_action_smpio()
2948 sasaddr = xpt_path_sas_addr(ccb->ccb_h.path); in mpssas_action_smpio()
2960 if (targ->parent_handle == 0x0) { in mpssas_action_smpio()
2963 "parent handle!\n", __func__, targ->handle); in mpssas_action_smpio()
2969 targ->parent_handle); in mpssas_action_smpio()
2974 "parent target!\n", __func__, targ->handle); in mpssas_action_smpio()
2979 if ((parent_target->devinfo & in mpssas_action_smpio()
2984 targ->handle, parent_target->handle); in mpssas_action_smpio()
2989 sasaddr = parent_target->sasaddr; in mpssas_action_smpio()
2991 if ((targ->parent_devinfo & in mpssas_action_smpio()
2996 targ->handle, targ->parent_handle); in mpssas_action_smpio()
3000 if (targ->parent_sasaddr == 0x0) { in mpssas_action_smpio()
3004 __func__, targ->handle, targ->parent_handle); in mpssas_action_smpio()
3009 sasaddr = targ->parent_sasaddr; in mpssas_action_smpio()
3016 __func__, targ->handle); in mpssas_action_smpio()
3037 MPS_FUNCTRACE(sassc->sc); in mpssas_action_resetdev()
3038 mtx_assert(&sassc->sc->mps_mtx, MA_OWNED); in mpssas_action_resetdev()
3040 KASSERT(ccb->ccb_h.target_id < sassc->maxtargets, in mpssas_action_resetdev()
3042 ccb->ccb_h.target_id)); in mpssas_action_resetdev()
3043 sc = sassc->sc; in mpssas_action_resetdev()
3053 targ = &sassc->targets[ccb->ccb_h.target_id]; in mpssas_action_resetdev()
3054 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_action_resetdev()
3055 req->DevHandle = htole16(targ->handle); in mpssas_action_resetdev()
3056 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET; in mpssas_action_resetdev()
3059 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET; in mpssas_action_resetdev()
3061 tm->cm_data = NULL; in mpssas_action_resetdev()
3062 tm->cm_complete = mpssas_resetdev_complete; in mpssas_action_resetdev()
3063 tm->cm_complete_data = ccb; in mpssas_action_resetdev()
3064 tm->cm_targ = targ; in mpssas_action_resetdev()
3077 mtx_assert(&sc->mps_mtx, MA_OWNED); in mpssas_resetdev_complete()
3079 resp = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply; in mpssas_resetdev_complete()
3080 ccb = tm->cm_complete_data; in mpssas_resetdev_complete()
3087 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_resetdev_complete()
3090 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req; in mpssas_resetdev_complete()
3094 "This should not happen!\n", __func__, tm->cm_flags, in mpssas_resetdev_complete()
3095 req->DevHandle); in mpssas_resetdev_complete()
3102 le16toh(resp->IOCStatus), le32toh(resp->ResponseCode)); in mpssas_resetdev_complete()
3104 if (le32toh(resp->ResponseCode) == MPI2_SCSITASKMGMT_RSP_TM_COMPLETE) { in mpssas_resetdev_complete()
3106 mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid, in mpssas_resetdev_complete()
3125 if (sassc->sc->mps_debug & MPS_TRACE) { in mpssas_poll()
3129 mps_printf(sassc->sc, "%s clearing MPS_TRACE\n", __func__); in mpssas_poll()
3130 sassc->sc->mps_debug &= ~MPS_TRACE; in mpssas_poll()
3133 mps_intr_locked(sassc->sc); in mpssas_poll()
3159 sassc = sc->sassc; in mpssas_async()
3170 KASSERT(xpt_path_target_id(path) < sassc->maxtargets, in mpssas_async()
3173 target = &sassc->targets[xpt_path_target_id(path)]; in mpssas_async()
3174 if (target->handle == 0) in mpssas_async()
3179 SLIST_FOREACH(lun, &target->luns, lun_link) { in mpssas_async()
3180 if (lun->lun_id == lunid) { in mpssas_async()
3194 lun->lun_id = lunid; in mpssas_async()
3195 SLIST_INSERT_HEAD(&target->luns, lun, lun_link); in mpssas_async()
3217 lun->eedp_formatted = TRUE; in mpssas_async()
3218 lun->eedp_block_size = in mpssas_async()
3223 lun->eedp_formatted = FALSE; in mpssas_async()
3224 lun->eedp_block_size = 0; in mpssas_async()
3228 lun->eedp_formatted = FALSE; in mpssas_async()
3229 lun->eedp_block_size = 0; in mpssas_async()
3259 path_id = cam_sim_path(sc->sassc->sim); in mpssas_prepare_for_tm()
3260 if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, path_id, in mpssas_prepare_for_tm()
3261 target->tid, lun_id) != CAM_REQ_CMP) { in mpssas_prepare_for_tm()
3264 tm->cm_ccb = ccb; in mpssas_prepare_for_tm()
3265 tm->cm_targ = target; in mpssas_prepare_for_tm()
3266 if ((target->flags & MPSSAS_TARGET_INRESET) == 0) { in mpssas_prepare_for_tm()
3269 __func__, target->tid); in mpssas_prepare_for_tm()
3270 xpt_freeze_devq(ccb->ccb_h.path, 1); in mpssas_prepare_for_tm()
3271 target->flags |= MPSSAS_TARGET_INRESET; in mpssas_prepare_for_tm()
3286 sc->wait_for_port_enable = 1; in mpssas_startup()
3301 request = (MPI2_PORT_ENABLE_REQUEST *)cm->cm_req; in mpssas_send_portenable()
3302 request->Function = MPI2_FUNCTION_PORT_ENABLE; in mpssas_send_portenable()
3303 request->MsgFlags = 0; in mpssas_send_portenable()
3304 request->VP_ID = 0; in mpssas_send_portenable()
3305 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mpssas_send_portenable()
3306 cm->cm_complete = mpssas_portenable_complete; in mpssas_send_portenable()
3307 cm->cm_data = NULL; in mpssas_send_portenable()
3308 cm->cm_sge = NULL; in mpssas_send_portenable()
3313 cm, cm->cm_req, cm->cm_complete); in mpssas_send_portenable()
3324 sassc = sc->sassc; in mpssas_portenable_complete()
3331 if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) { in mpssas_portenable_complete()
3333 "This should not happen!\n", __func__, cm->cm_flags); in mpssas_portenable_complete()
3336 reply = (MPI2_PORT_ENABLE_REPLY *)cm->cm_reply; in mpssas_portenable_complete()
3339 else if (le16toh(reply->IOCStatus & MPI2_IOCSTATUS_MASK) != in mpssas_portenable_complete()
3361 sc->wait_for_port_enable = 0; in mpssas_portenable_complete()
3362 sc->port_enable_complete = 1; in mpssas_portenable_complete()
3363 wakeup(&sc->port_enable_complete); in mpssas_portenable_complete()
3370 struct mps_softc *sc = sassc->sc; in mpssas_check_id()
3374 ids = &sc->exclude_ids[0]; in mpssas_check_id()
3393 sassc = sc->sassc; in mpssas_realloc_targets()
3400 targ = &sassc->targets[i]; in mpssas_realloc_targets()
3401 SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) { in mpssas_realloc_targets()
3405 free(sassc->targets, M_MPT2); in mpssas_realloc_targets()
3407 sassc->targets = malloc(sizeof(struct mpssas_target) * maxtargets, in mpssas_realloc_targets()