Lines Matching defs:mpt

101 #include <dev/mpt/mpt.h>
102 #include <dev/mpt/mpt_cam.h>
103 #include <dev/mpt/mpt_raid.h>
105 #include "dev/mpt/mpilib/mpi_ioc.h" /* XXX Fix Event Handling!!! */
106 #include "dev/mpt/mpilib/mpi_init.h"
107 #include "dev/mpt/mpilib/mpi_targ.h"
108 #include "dev/mpt/mpilib/mpi_fc.h"
109 #include "dev/mpt/mpilib/mpi_sas.h"
132 static int mpt_spawn_recovery_thread(struct mpt_softc *mpt);
133 static void mpt_terminate_recovery_thread(struct mpt_softc *mpt);
135 static void mpt_recover_commands(struct mpt_softc *mpt);
140 static void mpt_fc_post_els(struct mpt_softc *mpt, request_t *, int);
142 static int mpt_add_els_buffers(struct mpt_softc *mpt);
143 static int mpt_add_target_commands(struct mpt_softc *mpt);
188 TUNABLE_INT("hw.mpt.enable_sata_wc", &mpt_enable_sata_wc);
191 mpt_cam_probe(struct mpt_softc *mpt)
200 if (mpt->do_cfg_role) {
201 role = mpt->cfg_role;
203 role = mpt->role;
206 (mpt->ioc_page2 != NULL && mpt->ioc_page2->MaxPhysDisks != 0)) {
213 mpt_cam_attach(struct mpt_softc *mpt)
220 MPT_LOCK(mpt);
221 TAILQ_INIT(&mpt->request_timeout_list);
222 maxq = (mpt->ioc_facts.GlobalCredits < MPT_MAX_REQUESTS(mpt))?
223 mpt->ioc_facts.GlobalCredits : MPT_MAX_REQUESTS(mpt);
226 error = mpt_register_handler(mpt, MPT_HANDLER_REPLY, handler,
229 MPT_UNLOCK(mpt);
234 error = mpt_register_handler(mpt, MPT_HANDLER_REPLY, handler,
237 MPT_UNLOCK(mpt);
245 if (mpt->is_fc && (mpt->role & MPT_ROLE_TARGET) != 0) {
247 error = mpt_register_handler(mpt, MPT_HANDLER_REPLY, handler,
250 MPT_UNLOCK(mpt);
253 if (mpt_add_els_buffers(mpt) == FALSE) {
255 MPT_UNLOCK(mpt);
258 maxq -= mpt->els_cmds_allocated;
266 if (mpt->is_fc && (mpt->role & MPT_ROLE_TARGET) != 0) {
268 error = mpt_register_handler(mpt, MPT_HANDLER_REPLY, handler,
269 &mpt->scsi_tgt_handler_id);
271 MPT_UNLOCK(mpt);
276 if (mpt->is_sas) {
278 error = mpt_register_handler(mpt, MPT_HANDLER_REPLY, handler,
281 MPT_UNLOCK(mpt);
289 mpt->tmf_req = mpt_get_request(mpt, FALSE);
290 if (mpt->tmf_req == NULL) {
291 mpt_prt(mpt, "Unable to allocate dedicated TMF request!\n");
293 MPT_UNLOCK(mpt);
303 mpt->tmf_req->state = REQ_STATE_FREE;
309 MPT_UNLOCK(mpt);
311 if (mpt_spawn_recovery_thread(mpt) != 0) {
312 mpt_prt(mpt, "Unable to spawn recovery thread!\n");
322 mpt_prt(mpt, "Unable to allocate CAM SIMQ!\n");
330 mpt->sim =
331 mpt_sim_alloc(mpt_action, mpt_poll, "mpt", mpt, 1, maxq, devq);
332 if (mpt->sim == NULL) {
333 mpt_prt(mpt, "Unable to allocate CAM SIM!\n");
342 MPT_LOCK(mpt);
343 if (xpt_bus_register(mpt->sim, mpt->dev, 0) != CAM_SUCCESS) {
344 mpt_prt(mpt, "Bus registration Failed!\n");
346 MPT_UNLOCK(mpt);
350 if (xpt_create_path(&mpt->path, NULL, cam_sim_path(mpt->sim),
352 mpt_prt(mpt, "Unable to allocate Path!\n");
354 MPT_UNLOCK(mpt);
357 MPT_UNLOCK(mpt);
363 if (mpt->ioc_page2 == NULL || mpt->ioc_page2->MaxPhysDisks == 0) {
370 mpt->phydisk_sim =
371 mpt_sim_alloc(mpt_action, mpt_poll, "mpt", mpt, 1, maxq, devq);
372 if (mpt->phydisk_sim == NULL) {
373 mpt_prt(mpt, "Unable to allocate Physical Disk CAM SIM!\n");
381 MPT_LOCK(mpt);
382 if (xpt_bus_register(mpt->phydisk_sim, mpt->dev, 1) !=
384 mpt_prt(mpt, "Physical Disk Bus registration Failed!\n");
386 MPT_UNLOCK(mpt);
390 if (xpt_create_path(&mpt->phydisk_path, NULL,
391 cam_sim_path(mpt->phydisk_sim),
393 mpt_prt(mpt, "Unable to allocate Physical Disk Path!\n");
395 MPT_UNLOCK(mpt);
398 MPT_UNLOCK(mpt);
399 mpt_lprt(mpt, MPT_PRT_DEBUG, "attached cam\n");
403 mpt_cam_detach(mpt);
411 mpt_read_config_info_fc(struct mpt_softc *mpt)
418 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_FC_PORT, 0,
419 0, &mpt->mpt_fcport_page0.Header, FALSE, 5000);
423 mpt_lprt(mpt, MPT_PRT_DEBUG, "FC Port Page 0 Header: %x %x %x %x\n",
424 mpt->mpt_fcport_page0.Header.PageVersion,
425 mpt->mpt_fcport_page0.Header.PageLength,
426 mpt->mpt_fcport_page0.Header.PageNumber,
427 mpt->mpt_fcport_page0.Header.PageType);
429 rv = mpt_read_cur_cfg_page(mpt, 0, &mpt->mpt_fcport_page0.Header,
430 sizeof(mpt->mpt_fcport_page0), FALSE, 5000);
432 mpt_prt(mpt, "failed to read FC Port Page 0\n");
435 mpt2host_config_page_fc_port_0(&mpt->mpt_fcport_page0);
437 switch (mpt->mpt_fcport_page0.CurrentSpeed) {
439 mpt->mpt_fcport_speed = 1;
442 mpt->mpt_fcport_speed = 2;
445 mpt->mpt_fcport_speed = 10;
448 mpt->mpt_fcport_speed = 4;
451 mpt->mpt_fcport_speed = 0;
455 switch (mpt->mpt_fcport_page0.Flags &
458 mpt->mpt_fcport_speed = 0;
474 mpt->mpt_fcport_speed = 0;
479 mpt->scinfo.fc.wwnn = ((uint64_t)mpt->mpt_fcport_page0.WWNN.High << 32)
480 | mpt->mpt_fcport_page0.WWNN.Low;
481 mpt->scinfo.fc.wwpn = ((uint64_t)mpt->mpt_fcport_page0.WWPN.High << 32)
482 | mpt->mpt_fcport_page0.WWPN.Low;
483 mpt->scinfo.fc.portid = mpt->mpt_fcport_page0.PortIdentifier;
485 mpt_lprt(mpt, MPT_PRT_INFO,
488 (uintmax_t)mpt->scinfo.fc.wwnn, (uintmax_t)mpt->scinfo.fc.wwpn,
489 mpt->mpt_fcport_speed);
490 MPT_UNLOCK(mpt);
491 ctx = device_get_sysctl_ctx(mpt->dev);
492 tree = device_get_sysctl_tree(mpt->dev);
495 "wwnn", CTLFLAG_RD, &mpt->scinfo.fc.wwnn,
499 "wwpn", CTLFLAG_RD, &mpt->scinfo.fc.wwpn,
502 MPT_LOCK(mpt);
510 mpt_set_initial_config_fc(struct mpt_softc *mpt)
517 r = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0,
520 mpt_prt(mpt, "failed to read FC page 1 header\n");
521 return (mpt_fc_reset_link(mpt, 1));
524 r = mpt_read_cfg_page(mpt, MPI_CONFIG_ACTION_PAGE_READ_NVRAM, 0,
527 mpt_prt(mpt, "failed to read FC page 1\n");
528 return (mpt_fc_reset_link(mpt, 1));
548 if (mpt->do_cfg_role == 0) {
549 role = mpt->cfg_role;
551 mpt->do_cfg_role = 0;
554 if (role != mpt->cfg_role) {
555 if (mpt->cfg_role & MPT_ROLE_INITIATOR) {
557 mpt_prt(mpt, "adding initiator role\n");
561 mpt_prt(mpt, "keeping initiator role\n");
564 mpt_prt(mpt, "removing initiator role\n");
567 if (mpt->cfg_role & MPT_ROLE_TARGET) {
569 mpt_prt(mpt, "adding target role\n");
573 mpt_prt(mpt, "keeping target role\n");
576 mpt_prt(mpt, "removing target role\n");
579 mpt->role = mpt->cfg_role;
584 mpt_prt(mpt, "adding OXID option\n");
593 r = mpt_write_cfg_page(mpt,
597 mpt_prt(mpt, "failed to update NVRAM with changes\n");
600 mpt_prt(mpt, "NOTE: NVRAM changes will not take "
607 mptsas_sas_io_unit_pg0(struct mpt_softc *mpt, struct mptsas_portinfo *portinfo)
614 error = mpt_read_extcfg_header(mpt, MPI_SASIOUNITPAGE0_PAGEVERSION,
631 error = mpt_read_extcfg_page(mpt, MPI_CONFIG_ACTION_PAGE_READ_CURRENT,
663 mptsas_sas_phy_pg0(struct mpt_softc *mpt, struct mptsas_phyinfo *phy_info,
670 error = mpt_read_extcfg_header(mpt, MPI_SASPHY0_PAGEVERSION, 0, 0,
686 error = mpt_read_extcfg_page(mpt, MPI_CONFIG_ACTION_PAGE_READ_CURRENT,
705 mptsas_sas_device_pg0(struct mpt_softc *mpt, struct mptsas_devinfo *device_info,
714 error = mpt_read_extcfg_header(mpt, MPI_SASDEVICE0_PAGEVERSION, 0, 0,
730 error = mpt_read_extcfg_page(mpt, MPI_CONFIG_ACTION_PAGE_READ_CURRENT,
759 mpt_read_config_info_sas(struct mpt_softc *mpt)
769 error = mptsas_sas_io_unit_pg0(mpt, portinfo);
777 error = mptsas_sas_phy_pg0(mpt, phyinfo,
782 error = mptsas_sas_device_pg0(mpt, &phyinfo->identify,
790 error = mptsas_sas_device_pg0(mpt,
798 mpt->sas_portinfo = portinfo;
803 mptsas_set_sata_wc(struct mpt_softc *mpt, struct mptsas_devinfo *devinfo,
810 req = mpt_get_request(mpt, 0);
830 mpt_check_doorbell(mpt);
831 mpt_send_cmd(mpt, req);
832 error = mpt_wait_req(mpt, req, REQ_STATE_DONE, REQ_STATE_DONE, 0,
835 mpt_free_request(mpt, req);
842 mpt_free_request(mpt, req);
847 mpt_free_request(mpt, req);
854 mpt_set_initial_config_sas(struct mpt_softc *mpt)
859 if ((mpt_enable_sata_wc != -1) && (mpt->sas_portinfo != NULL)) {
860 for (i = 0; i < mpt->sas_portinfo->num_phys; i++) {
861 phyinfo = &mpt->sas_portinfo->phy_info[i];
868 device_printf(mpt->dev,
871 mptsas_set_sata_wc(mpt, &phyinfo->attached,
880 mpt_sata_pass_reply_handler(struct mpt_softc *mpt, request_t *req,
890 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
897 mpt_free_request(mpt, req);
908 mpt_read_config_info_spi(struct mpt_softc *mpt)
912 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_SCSI_PORT, 0, 0,
913 &mpt->mpt_port_page0.Header, FALSE, 5000);
917 mpt_lprt(mpt, MPT_PRT_DEBUG, "SPI Port Page 0 Header: %x %x %x %x\n",
918 mpt->mpt_port_page0.Header.PageVersion,
919 mpt->mpt_port_page0.Header.PageLength,
920 mpt->mpt_port_page0.Header.PageNumber,
921 mpt->mpt_port_page0.Header.PageType);
923 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_SCSI_PORT, 1, 0,
924 &mpt->mpt_port_page1.Header, FALSE, 5000);
928 mpt_lprt(mpt, MPT_PRT_DEBUG, "SPI Port Page 1 Header: %x %x %x %x\n",
929 mpt->mpt_port_page1.Header.PageVersion,
930 mpt->mpt_port_page1.Header.PageLength,
931 mpt->mpt_port_page1.Header.PageNumber,
932 mpt->mpt_port_page1.Header.PageType);
934 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_SCSI_PORT, 2, 0,
935 &mpt->mpt_port_page2.Header, FALSE, 5000);
939 mpt_lprt(mpt, MPT_PRT_DEBUG, "SPI Port Page 2 Header: %x %x %x %x\n",
940 mpt->mpt_port_page2.Header.PageVersion,
941 mpt->mpt_port_page2.Header.PageLength,
942 mpt->mpt_port_page2.Header.PageNumber,
943 mpt->mpt_port_page2.Header.PageType);
946 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_SCSI_DEVICE,
947 0, i, &mpt->mpt_dev_page0[i].Header, FALSE, 5000);
951 mpt_lprt(mpt, MPT_PRT_DEBUG,
953 mpt->mpt_dev_page0[i].Header.PageVersion,
954 mpt->mpt_dev_page0[i].Header.PageLength,
955 mpt->mpt_dev_page0[i].Header.PageNumber,
956 mpt->mpt_dev_page0[i].Header.PageType);
958 rv = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_SCSI_DEVICE,
959 1, i, &mpt->mpt_dev_page1[i].Header, FALSE, 5000);
963 mpt_lprt(mpt, MPT_PRT_DEBUG,
965 mpt->mpt_dev_page1[i].Header.PageVersion,
966 mpt->mpt_dev_page1[i].Header.PageLength,
967 mpt->mpt_dev_page1[i].Header.PageNumber,
968 mpt->mpt_dev_page1[i].Header.PageType);
977 rv = mpt_read_cur_cfg_page(mpt, 0, &mpt->mpt_port_page0.Header,
978 sizeof(mpt->mpt_port_page0), FALSE, 5000);
980 mpt_prt(mpt, "failed to read SPI Port Page 0\n");
982 mpt2host_config_page_scsi_port_0(&mpt->mpt_port_page0);
983 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
985 mpt->mpt_port_page0.Capabilities,
986 mpt->mpt_port_page0.PhysicalInterface);
989 rv = mpt_read_cur_cfg_page(mpt, 0, &mpt->mpt_port_page1.Header,
990 sizeof(mpt->mpt_port_page1), FALSE, 5000);
992 mpt_prt(mpt, "failed to read SPI Port Page 1\n");
994 mpt2host_config_page_scsi_port_1(&mpt->mpt_port_page1);
995 mpt_lprt(mpt, MPT_PRT_DEBUG,
997 mpt->mpt_port_page1.Configuration,
998 mpt->mpt_port_page1.OnBusTimerValue);
1001 rv = mpt_read_cur_cfg_page(mpt, 0, &mpt->mpt_port_page2.Header,
1002 sizeof(mpt->mpt_port_page2), FALSE, 5000);
1004 mpt_prt(mpt, "failed to read SPI Port Page 2\n");
1006 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
1008 mpt->mpt_port_page2.PortFlags,
1009 mpt->mpt_port_page2.PortSettings);
1010 mpt2host_config_page_scsi_port_2(&mpt->mpt_port_page2);
1012 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
1014 i, mpt->mpt_port_page2.DeviceSettings[i].Timeout,
1015 mpt->mpt_port_page2.DeviceSettings[i].SyncFactor,
1016 mpt->mpt_port_page2.DeviceSettings[i].DeviceFlags);
1021 rv = mpt_read_cur_cfg_page(mpt, i,
1022 &mpt->mpt_dev_page0[i].Header, sizeof(*mpt->mpt_dev_page0),
1025 mpt_prt(mpt,
1029 mpt2host_config_page_scsi_device_0(&mpt->mpt_dev_page0[i]);
1030 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
1032 i, mpt->mpt_dev_page0[i].NegotiatedParameters,
1033 mpt->mpt_dev_page0[i].Information);
1035 rv = mpt_read_cur_cfg_page(mpt, i,
1036 &mpt->mpt_dev_page1[i].Header, sizeof(*mpt->mpt_dev_page1),
1039 mpt_prt(mpt,
1043 mpt2host_config_page_scsi_device_1(&mpt->mpt_dev_page1[i]);
1044 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
1046 i, mpt->mpt_dev_page1[i].RequestedParameters,
1047 mpt->mpt_dev_page1[i].Configuration);
1058 mpt_set_initial_config_spi(struct mpt_softc *mpt)
1062 mpt->mpt_disc_enable = 0xff;
1063 mpt->mpt_tag_enable = 0;
1065 pp1val = ((1 << mpt->mpt_ini_id) <<
1066 MPI_SCSIPORTPAGE1_CFG_SHIFT_PORT_RESPONSE_ID) | mpt->mpt_ini_id;
1067 if (mpt->mpt_port_page1.Configuration != pp1val) {
1070 mpt_prt(mpt, "SPI Port Page 1 Config value bad (%x)- should "
1071 "be %x\n", mpt->mpt_port_page1.Configuration, pp1val);
1072 tmp = mpt->mpt_port_page1;
1075 error = mpt_write_cur_cfg_page(mpt, 0,
1080 error = mpt_read_cur_cfg_page(mpt, 0,
1087 mpt_prt(mpt,
1091 mpt->mpt_port_page1 = tmp;
1101 i = mpt->mpt_port_page2.PortSettings &
1104 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
1108 mpt->mpt_dev_page1[i].RequestedParameters = 0;
1109 mpt->mpt_dev_page1[i].Configuration = 0;
1110 (void) mpt_update_spi_config(mpt, i);
1117 mpt_cam_enable(struct mpt_softc *mpt)
1121 MPT_LOCK(mpt);
1124 if (mpt->is_fc) {
1125 if (mpt_read_config_info_fc(mpt)) {
1128 if (mpt_set_initial_config_fc(mpt)) {
1131 } else if (mpt->is_sas) {
1132 if (mpt_read_config_info_sas(mpt)) {
1135 if (mpt_set_initial_config_sas(mpt)) {
1138 } else if (mpt->is_spi) {
1139 if (mpt_read_config_info_spi(mpt)) {
1142 if (mpt_set_initial_config_spi(mpt)) {
1149 MPT_UNLOCK(mpt);
1154 mpt_cam_ready(struct mpt_softc *mpt)
1161 if (mpt->is_fc && (mpt->role & MPT_ROLE_TARGET)) {
1165 MPT_LOCK(mpt);
1166 if (mpt_add_target_commands(mpt) == FALSE) {
1167 mpt_prt(mpt, "failed to add target commands\n");
1169 MPT_UNLOCK(mpt);
1171 mpt->ready = 1;
1175 mpt_cam_detach(struct mpt_softc *mpt)
1179 MPT_LOCK(mpt);
1180 mpt->ready = 0;
1181 mpt_terminate_recovery_thread(mpt);
1184 mpt_deregister_handler(mpt, MPT_HANDLER_REPLY, handler,
1187 mpt_deregister_handler(mpt, MPT_HANDLER_REPLY, handler,
1190 mpt_deregister_handler(mpt, MPT_HANDLER_REPLY, handler,
1193 mpt_deregister_handler(mpt, MPT_HANDLER_REPLY, handler,
1194 mpt->scsi_tgt_handler_id);
1196 mpt_deregister_handler(mpt, MPT_HANDLER_REPLY, handler,
1199 if (mpt->tmf_req != NULL) {
1200 mpt->tmf_req->state = REQ_STATE_ALLOCATED;
1201 mpt_free_request(mpt, mpt->tmf_req);
1202 mpt->tmf_req = NULL;
1204 if (mpt->sas_portinfo != NULL) {
1205 free(mpt->sas_portinfo, M_DEVBUF);
1206 mpt->sas_portinfo = NULL;
1209 if (mpt->sim != NULL) {
1210 xpt_free_path(mpt->path);
1211 xpt_bus_deregister(cam_sim_path(mpt->sim));
1212 cam_sim_free(mpt->sim, TRUE);
1213 mpt->sim = NULL;
1216 if (mpt->phydisk_sim != NULL) {
1217 xpt_free_path(mpt->phydisk_path);
1218 xpt_bus_deregister(cam_sim_path(mpt->phydisk_sim));
1219 cam_sim_free(mpt->phydisk_sim, TRUE);
1220 mpt->phydisk_sim = NULL;
1222 MPT_UNLOCK(mpt);
1230 struct mpt_softc *mpt;
1232 mpt = (struct mpt_softc *)cam_sim_softc(sim);
1233 mpt_intr(mpt);
1243 struct mpt_softc *mpt;
1247 mpt = ccb->ccb_h.ccb_mpt_ptr;
1249 MPT_LOCK_ASSERT(mpt);
1251 mpt_prt(mpt, "request %p:%u timed out for ccb %p (req->ccb %p)\n", req,
1255 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
1256 TAILQ_INSERT_TAIL(&mpt->request_timeout_list, req, links);
1258 mpt_wakeup_recovery_thread(mpt);
1276 struct mpt_softc *mpt;
1289 mpt = ccb->ccb_h.ccb_mpt_ptr;
1307 mpt_prt(mpt, "bad fct 0x%x in mpt_execute_req_a64\n",
1317 mpt_prt(mpt, "mpt_execute_req_a64: err %d\n", error);
1325 if (mpt->outofbeer == 0) {
1326 mpt->outofbeer = 1;
1327 xpt_freeze_simq(mpt->sim, 1);
1328 mpt_lprt(mpt, MPT_PRT_DEBUG,
1339 MPT_TAG_2_REQ(mpt, ccb->csio.tag_id);
1340 MPT_TGT_STATE(mpt, cmd_req)->state = TGT_STATE_IN_CAM;
1341 MPT_TGT_STATE(mpt, cmd_req)->ccb = NULL;
1342 MPT_TGT_STATE(mpt, cmd_req)->req = NULL;
1347 mpt_free_request(mpt, req);
1356 if (mpt->verbose >= MPT_PRT_DEBUG) {
1396 bus_dmamap_sync(mpt->buffer_dmat, req->dmap, op);
1409 if (nseg < MPT_NSGL_FIRST(mpt)) {
1415 first_lim = MPT_NSGL_FIRST(mpt) - 1;
1427 if (mpt->is_1078 && (((uint64_t)dm_segs->ds_addr +
1453 nxt_off = MPT_RQSL(mpt);
1476 if ((nxt_off + MPT_RQSL(mpt)) > MPT_REQUEST_AREA) {
1487 nxt_off += MPT_RQSL(mpt);
1512 if ((nseg - seg) > MPT_NSGL(mpt)) {
1513 this_seg_lim = seg + MPT_NSGL(mpt) - 1;
1548 if (mpt->is_1078 &&
1580 nrq = mpt_get_request(mpt, FALSE);
1600 if (mpt->verbose >= MPT_PRT_DEBUG) {
1614 MPT_TAG_2_REQ(mpt, ccb->csio.tag_id);
1615 MPT_TGT_STATE(mpt, cmd_req)->state = TGT_STATE_IN_CAM;
1616 MPT_TGT_STATE(mpt, cmd_req)->ccb = NULL;
1617 MPT_TGT_STATE(mpt, cmd_req)->req = NULL;
1619 mpt_prt(mpt,
1623 bus_dmamap_unload(mpt->buffer_dmat, req->dmap);
1628 mpt_free_request(mpt, req);
1637 if (mpt->verbose > MPT_PRT_DEBUG) {
1647 request_t *cmd_req = MPT_TAG_2_REQ(mpt, ccb->csio.tag_id);
1648 mpt_tgt_state_t *tgt = MPT_TGT_STATE(mpt, cmd_req);
1660 mpt_send_cmd(mpt, req);
1669 struct mpt_softc *mpt;
1681 mpt = ccb->ccb_h.ccb_mpt_ptr;
1698 mpt_prt(mpt, "bad fct 0x%x in mpt_execute_req\n",
1708 mpt_prt(mpt, "mpt_execute_req: err %d\n", error);
1716 if (mpt->outofbeer == 0) {
1717 mpt->outofbeer = 1;
1718 xpt_freeze_simq(mpt->sim, 1);
1719 mpt_lprt(mpt, MPT_PRT_DEBUG,
1730 MPT_TAG_2_REQ(mpt, ccb->csio.tag_id);
1731 MPT_TGT_STATE(mpt, cmd_req)->state = TGT_STATE_IN_CAM;
1732 MPT_TGT_STATE(mpt, cmd_req)->ccb = NULL;
1733 MPT_TGT_STATE(mpt, cmd_req)->req = NULL;
1738 mpt_free_request(mpt, req);
1747 if (mpt->verbose >= MPT_PRT_DEBUG) {
1787 bus_dmamap_sync(mpt->buffer_dmat, req->dmap, op);
1800 if (nseg < MPT_NSGL_FIRST(mpt)) {
1806 first_lim = MPT_NSGL_FIRST(mpt) - 1;
1837 nxt_off = MPT_RQSL(mpt);
1864 if ((nxt_off + MPT_RQSL(mpt)) > MPT_REQUEST_AREA) {
1875 nxt_off += MPT_RQSL(mpt);
1896 if ((nseg - seg) > MPT_NSGL(mpt)) {
1897 this_seg_lim = seg + MPT_NSGL(mpt) - 1;
1952 nrq = mpt_get_request(mpt, FALSE);
1972 if (mpt->verbose >= MPT_PRT_DEBUG) {
1986 MPT_TAG_2_REQ(mpt, ccb->csio.tag_id);
1987 MPT_TGT_STATE(mpt, cmd_req)->state = TGT_STATE_IN_CAM;
1988 MPT_TGT_STATE(mpt, cmd_req)->ccb = NULL;
1989 MPT_TGT_STATE(mpt, cmd_req)->req = NULL;
1991 mpt_prt(mpt,
1995 bus_dmamap_unload(mpt->buffer_dmat, req->dmap);
2000 mpt_free_request(mpt, req);
2009 if (mpt->verbose > MPT_PRT_DEBUG) {
2019 request_t *cmd_req = MPT_TAG_2_REQ(mpt, ccb->csio.tag_id);
2020 mpt_tgt_state_t *tgt = MPT_TGT_STATE(mpt, cmd_req);
2032 mpt_send_cmd(mpt, req);
2039 struct mpt_softc *mpt;
2049 mpt = ccb->ccb_h.ccb_mpt_ptr;
2050 raid_passthru = (sim == mpt->phydisk_sim);
2052 if ((req = mpt_get_request(mpt, FALSE)) == NULL) {
2053 if (mpt->outofbeer == 0) {
2054 mpt->outofbeer = 1;
2055 xpt_freeze_simq(mpt->sim, 1);
2056 mpt_lprt(mpt, MPT_PRT_DEBUG, "FREEZEQ\n");
2064 mpt_req_not_spcl(mpt, req, "mpt_start", __LINE__);
2087 if (mpt_map_physdisk(mpt, ccb, &tgt) != 0) {
2140 if (mpt->is_fc || mpt->is_sas) {
2148 if (mpt->is_spi) {
2169 if (mpt->verbose == MPT_PRT_DEBUG) {
2171 mpt_prt(mpt, "mpt_start: %s op 0x%x ",
2176 mpt_prtc(mpt, "(%s %u byte%s ",
2181 mpt_prtc(mpt, "tgt %u lun %jx req %p:%u\n", tgt,
2185 error = bus_dmamap_load_ccb(mpt->buffer_dmat, req->dmap, ccb, cb,
2192 xpt_freeze_simq(mpt->sim, 1);
2198 mpt_bus_reset(struct mpt_softc *mpt, target_id_t tgt, lun_id_t lun,
2205 error = mpt_scsi_send_tmf(mpt,
2209 mpt->is_fc ? MPI_SCSITASKMGMT_MSGFLAGS_LIP_RESET_OPTION : 0,
2220 mpt_prt(mpt,
2226 error = mpt_wait_req(mpt, mpt->tmf_req, REQ_STATE_DONE,
2229 status = le16toh(mpt->tmf_req->IOCStatus);
2230 response = mpt->tmf_req->ResponseCode;
2231 mpt->tmf_req->state = REQ_STATE_FREE;
2234 mpt_prt(mpt, "mpt_bus_reset: Reset timed-out. "
2236 mpt_reset(mpt, TRUE);
2241 mpt_prt(mpt, "mpt_bus_reset: TMF IOC Status 0x%x. "
2243 mpt_reset(mpt, TRUE);
2249 mpt_prt(mpt, "mpt_bus_reset: TMF Response 0x%x. "
2251 mpt_reset(mpt, TRUE);
2258 mpt_fc_reset_link(struct mpt_softc *mpt, int dowait)
2264 req = mpt_get_request(mpt, FALSE);
2273 mpt_send_cmd(mpt, req);
2275 r = mpt_wait_req(mpt, req, REQ_STATE_DONE,
2278 mpt_free_request(mpt, req);
2285 mpt_cam_event(struct mpt_softc *mpt, request_t *req,
2294 mpt_prt(mpt, "UNIT ATTENTION: Bus: 0x%02x TargetID: 0x%02x\n",
2300 mpt_prt(mpt, "IOC Generated Bus Reset Port: %d\n",
2302 xpt_async(AC_BUS_RESET, mpt->path, NULL);
2307 mpt_prt(mpt, "External Bus Reset Detected\n");
2312 xpt_async(AC_BUS_RESET, mpt->path, NULL);
2322 mpt_prt(mpt, "Rescan Port: %d\n", (data0 >> 8) & 0xff);
2323 if (mpt->ready == 0) {
2326 if (mpt->phydisk_sim) {
2327 pathid = cam_sim_path(mpt->phydisk_sim);
2329 pathid = cam_sim_path(mpt->sim);
2337 mpt_prt(mpt, "unable to alloc CCB for rescan\n");
2343 mpt_prt(mpt, "unable to create path for rescan\n");
2352 mpt_prt(mpt, "Port %d: LinkState: %s\n",
2360 mpt_prt(mpt,
2369 mpt_prt(mpt, "Device needs AL_PA\n");
2371 mpt_prt(mpt, "Device %02x doesn't like "
2378 mpt_prt(mpt, "Device had loop failure "
2382 mpt_prt(mpt, "Device %02x detected loop"
2388 mpt_prt(mpt, "Device %02x requests that device "
2396 mpt_prt(mpt, "Port 0x%x: FC LinkEvent: "
2403 mpt_prt(mpt, "Port 0x%x: FC LinkEvent: "
2410 mpt_prt(mpt, "Port 0x%x: FC LinkEvent: Unknown "
2420 mpt_prt(mpt, "FC Logout Port: %d N_PortID: %02x\n",
2434 mpt_prt(mpt, "QUEUE FULL EVENT: Bus 0x%02x Target 0x%02x "
2438 if (mpt->phydisk_sim && mpt_is_raid_member(mpt,
2440 sim = mpt->phydisk_sim;
2442 sim = mpt->sim;
2447 mpt_prt(mpt, "unable to create a path to send "
2458 mpt_prt(mpt, "XPT_REL_SIMQ failed\n");
2465 mpt_prt(mpt, "IR resync update %d completed\n",
2476 if (mpt->phydisk_sim && mpt_is_raid_member(mpt,
2478 sim = mpt->phydisk_sim;
2480 sim = mpt->sim;
2485 mpt_prt(mpt,
2492 mpt_prt(mpt,
2503 mpt_prt(mpt,
2515 mpt_lprt(mpt, MPT_PRT_WARN,
2529 mpt_lprt(mpt, MPT_PRT_WARN,
2543 mpt_lprt(mpt, MPT_PRT_WARN, "mpt_cam_event: 0x%x\n",
2561 mpt_scsi_reply_handler(struct mpt_softc *mpt, request_t *req,
2568 mpt_prt(mpt, "mpt_scsi_reply_handler: req already free\n");
2575 mpt_prt(mpt, "mpt_scsi_reply_handler: req %p:%u with no ccb\n",
2590 bus_dmamap_sync(mpt->buffer_dmat, req->dmap, op);
2591 bus_dmamap_unload(mpt->buffer_dmat, req->dmap);
2602 mpt_scsi_reply_frame_handler(mpt, req, reply_frame);
2605 if (mpt->outofbeer) {
2607 mpt->outofbeer = 0;
2608 mpt_lprt(mpt, MPT_PRT_DEBUG, "THAWQ\n");
2623 if (mpt->verbose == MPT_PRT_DEBUG) {
2624 mpt_prt(mpt, "mpt_scsi_reply_handler: %p:%u complete\n",
2630 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
2632 mpt_prt(mpt, "completing timedout/aborted req %p:%u\n",
2634 TAILQ_REMOVE(&mpt->request_timeout_list, req, links);
2639 mpt_req_not_spcl(mpt, req, "mpt_scsi_reply_handler", __LINE__);
2641 mpt_free_request(mpt, req);
2646 mpt_scsi_tmf_reply_handler(struct mpt_softc *mpt, request_t *req,
2651 KASSERT(req == mpt->tmf_req, ("TMF Reply not using mpt->tmf_req"));
2653 mpt_req_not_spcl(mpt, req, "mpt_scsi_tmf_reply_handler", __LINE__);
2660 mpt_lprt(mpt, MPT_PRT_DEBUG, "TMF complete: req %p:%u status 0x%x\n",
2662 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
2667 mpt->tmf_req->state = REQ_STATE_FREE;
2691 mpt_fc_els_send_response(struct mpt_softc *mpt, request_t *req,
2727 memcpy((U8 *)&rsp->SGL, &((U8 *)req->req_vbuf)[MPT_RQSL(mpt)], length);
2732 paddr += MPT_RQSL(mpt);
2750 mpt_send_cmd(mpt, req);
2754 mpt_fc_els_reply_handler(struct mpt_softc *mpt, request_t *req,
2768 KASSERT(mpt_req_on_free_list(mpt, req) == 0,
2772 mpt_req_spcl(mpt, req, "fc_els_reply_handler", __LINE__);
2774 mpt_req_not_spcl(mpt, req, "fc_els_reply_handler", __LINE__);
2777 mpt_lprt(mpt, MPT_PRT_DEBUG,
2782 mpt_prt(mpt, "ELS REPLY STATUS 0x%x for Function %x\n",
2788 mpt->disabled = 1;
2804 for (ioindex = 0; ioindex < mpt->els_cmds_allocated; ioindex++)
2805 if (mpt->els_cmd_ptrs[ioindex] == req) {
2809 KASSERT(ioindex < mpt->els_cmds_allocated,
2813 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
2816 mpt_fc_post_els(mpt, req, ioindex);
2822 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
2826 mpt_lprt(mpt, MPT_PRT_DEBUG,
2828 mpt_free_request(mpt, req);
2830 mpt_lprt(mpt, MPT_PRT_DEBUG,
2832 mpt_free_request(mpt, req);
2834 mpt_lprt(mpt, MPT_PRT_DEBUG,
2842 mpt_prt(mpt, "unexpected ELS_REPLY: Function 0x%x Flags %x "
2852 mpt_lprt(mpt, MPT_PRT_DEBUG,
2860 elsbuf = &((U32 *)req->req_vbuf)[MPT_RQSL(mpt)/sizeof (U32)];
2864 mpt_lprt(mpt, MPT_PRT_ALWAYS, "ELS_REPLY: response unneeded\n");
2869 req = mpt->els_cmd_ptrs[ioindex];
2877 mpt_prt(mpt, "PRLI from 0x%08x%08x\n",
2883 if (mpt->role & MPT_ROLE_TARGET)
2885 if (mpt->role & MPT_ROLE_INITIATOR)
2888 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
2891 mpt_fc_els_send_response(mpt, req, rp, 20);
2898 mpt_prt(mpt, "PRLO from 0x%08x%08x\n",
2902 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
2905 mpt_fc_els_send_response(mpt, req, rp, 20);
2909 mpt_prt(mpt, "ELS TYPE 1 COMMAND: %x\n", cmd);
2920 mpt_prt(mpt,
2924 if (rx_id >= mpt->mpt_max_tgtcmds) {
2925 mpt_prt(mpt, "Bad RX_ID 0x%x\n", rx_id);
2926 } else if (mpt->tgt_cmd_ptrs == NULL) {
2927 mpt_prt(mpt, "No TGT CMD PTRS\n");
2929 tgt_req = mpt->tgt_cmd_ptrs[rx_id];
2932 mpt_prt(mpt, "no back pointer for RX_ID 0x%x\n", rx_id);
2935 tgt = MPT_TGT_STATE(mpt, tgt_req);
2940 mpt_lprt(mpt, MPT_PRT_ERROR, "ABORT Mismatch: "
2945 mpt_lprt(mpt, MPT_PRT_ERROR, "ABORT Mismatch: "
2951 mpt_prt(mpt, "CCB (%p): lun %jx flags %x status %x\n",
2955 mpt_prt(mpt, "target state 0x%x resid %u xfrd %u rpwrd "
2958 if (mpt_abort_target_cmd(mpt, tgt_req))
2959 mpt_prt(mpt, "unable to start TargetAbort\n");
2972 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
2975 mpt_fc_els_send_response(mpt, req, rp, 12);
2978 mpt_prt(mpt, "ELS: RCTL %x TYPE %x CMD %x\n", rctl, type, cmd);
2982 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
2985 mpt_fc_post_els(mpt, req, ioindex);
2995 mpt_cam_ioc_reset(struct mpt_softc *mpt, int type)
3003 mpt_complete_request_chain(mpt, &mpt->request_timeout_list,
3013 xpt_async(AC_BUS_RESET, mpt->path, NULL);
3021 mpt_scsi_reply_frame_handler(struct mpt_softc *mpt, request_t *req,
3029 MPT_DUMP_REPLY_FRAME(mpt, reply_frame);
3068 mpt_set_tags(mpt, devinfo, MPT_QUEUE_NONE);
3187 struct mpt_softc *mpt;
3195 mpt = (struct mpt_softc *)cam_sim_softc(sim);
3196 raid_passthru = (sim == mpt->phydisk_sim);
3197 MPT_LOCK_ASSERT(mpt);
3205 if (mpt_map_physdisk(mpt, ccb, &tgt) != 0) {
3212 ccb->ccb_h.ccb_mpt_ptr = mpt;
3235 if (mpt->failure_id == ccb->ccb_h.target_id) {
3259 (void) mpt_bus_reset(mpt, tgt, lun, FALSE);
3276 ccb->ccb_h.status = mpt_abort_target_ccb(mpt, ccb);
3279 mpt_prt(mpt, "cannot abort active CTIOs yet\n");
3319 if (mpt->is_fc || mpt->is_sas) {
3339 if (mpt->phydisk_sim && raid_passthru == 0 &&
3340 mpt_is_raid_volume(mpt, tgt) != 0) {
3341 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
3347 i = mpt->mpt_port_page2.PortSettings &
3349 j = mpt->mpt_port_page2.PortFlags &
3353 mpt_lprt(mpt, MPT_PRT_ALWAYS,
3383 &mpt->mpt_dev_page1[tgt];
3393 &mpt->mpt_dev_page1[tgt];
3400 mpt->mpt_disc_enable |= (1 << tgt);
3402 mpt->mpt_disc_enable &= ~(1 << tgt);
3405 mpt->mpt_tag_enable |= (1 << tgt);
3407 mpt->mpt_tag_enable &= ~(1 << tgt);
3410 mpt_setwidth(mpt, tgt, 1);
3413 mpt_setsync(mpt, tgt, period, offset);
3419 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
3422 if (mpt_update_spi_config(mpt, tgt)) {
3434 if (mpt->is_fc) {
3440 if (mpt->mpt_fcport_speed != 0) {
3442 fc->bitrate = 100000 * mpt->mpt_fcport_speed;
3444 } else if (mpt->is_sas) {
3456 if (mpt_get_spi_settings(mpt, cts) != 0) {
3485 if (mpt->is_fc) {
3486 kp->xport_specific.fc.wwnn = mpt->scinfo.fc.wwnn;
3487 kp->xport_specific.fc.wwpn = mpt->scinfo.fc.wwpn;
3488 switch (mpt->role) {
3518 cpi->max_target = mpt->port_facts[0].MaxDevices - 1;
3519 cpi->maxio = (mpt->max_cam_seg_cnt - 1) * PAGE_SIZE;
3534 if (mpt->is_spi && cpi->max_target > 15) {
3537 if (mpt->is_spi)
3541 cpi->initiator_id = mpt->mpt_ini_id;
3548 if (mpt->is_fc) {
3556 cpi->xport_specific.fc.wwnn = mpt->scinfo.fc.wwnn;
3557 cpi->xport_specific.fc.wwpn = mpt->scinfo.fc.wwpn;
3558 cpi->xport_specific.fc.port = mpt->scinfo.fc.portid;
3560 100000 * mpt->mpt_fcport_speed;
3561 } else if (mpt->is_sas) {
3584 cpi->max_target = mpt->ioc_page2->MaxPhysDisks - 1;
3589 if ((mpt->role & MPT_ROLE_INITIATOR) == 0) {
3592 if (mpt->is_fc && (mpt->role & MPT_ROLE_TARGET)) {
3610 result = mpt_enable_lun(mpt,
3613 result = mpt_disable_lun(mpt,
3628 ccb->ccb_h.sim_priv.entries[1].ptr = mpt;
3635 trtp = &mpt->trt_wildcard;
3640 trtp = &mpt->trt[lun];
3643 mpt_lprt(mpt, MPT_PRT_DEBUG1,
3648 mpt_lprt(mpt, MPT_PRT_DEBUG1,
3658 request_t *req = MPT_TAG_2_REQ(mpt, ccb->cna2.tag_id);
3660 mpt_lprt(mpt, MPT_PRT_DEBUG, "Got Notify ACK\n");
3661 mpt_scsi_tgt_status(mpt, NULL, req, 0, NULL, 0);
3666 mpt_target_start_io(mpt, ccb);
3677 mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
3687 } else if (xpt_path_sim(cts->ccb_h.path) == mpt->phydisk_sim) {
3688 if (mpt_map_physdisk(mpt, (union ccb *)cts, &tgt)) {
3708 tmp = mpt->mpt_dev_page0[tgt];
3709 rv = mpt_read_cur_cfg_page(mpt, tgt, &tmp.Header,
3712 mpt_prt(mpt, "can't get tgt %d config page 0\n", tgt);
3717 mpt_lprt(mpt, MPT_PRT_DEBUG,
3722 dval |= (mpt->mpt_disc_enable & (1 << tgt)) ?
3724 dval |= (mpt->mpt_tag_enable & (1 << tgt)) ?
3732 mpt->mpt_dev_page0[tgt] = tmp;
3735 oval = mpt->mpt_port_page0.Capabilities;
3737 pval = mpt->mpt_port_page0.Capabilities;
3766 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
3773 mpt_setwidth(struct mpt_softc *mpt, int tgt, int onoff)
3777 ptr = &mpt->mpt_dev_page1[tgt];
3786 mpt_setsync(struct mpt_softc *mpt, int tgt, int period, int offset)
3790 ptr = &mpt->mpt_dev_page1[tgt];
3813 mpt_update_spi_config(struct mpt_softc *mpt, int tgt)
3818 mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
3820 tgt, mpt->mpt_dev_page1[tgt].RequestedParameters);
3821 tmp = mpt->mpt_dev_page1[tgt];
3823 rv = mpt_write_cur_cfg_page(mpt, tgt,
3826 mpt_prt(mpt, "mpt_update_spi_config: write cur page failed\n");
3834 mpt_spawn_recovery_thread(struct mpt_softc *mpt)
3838 error = kproc_create(mpt_recovery_thread, mpt,
3839 &mpt->recovery_thread, /*flags*/0,
3840 /*altstack*/0, "mpt_recovery%d", mpt->unit);
3845 mpt_terminate_recovery_thread(struct mpt_softc *mpt)
3848 if (mpt->recovery_thread == NULL) {
3851 mpt->shutdwn_recovery = 1;
3852 wakeup(mpt);
3857 mpt_sleep(mpt, &mpt->recovery_thread, PUSER, "thtrm", 0);
3863 struct mpt_softc *mpt;
3865 mpt = (struct mpt_softc *)arg;
3866 MPT_LOCK(mpt);
3868 if (TAILQ_EMPTY(&mpt->request_timeout_list) != 0) {
3869 if (mpt->shutdwn_recovery == 0) {
3870 mpt_sleep(mpt, mpt, PUSER, "idle", 0);
3873 if (mpt->shutdwn_recovery != 0) {
3876 mpt_recover_commands(mpt);
3878 mpt->recovery_thread = NULL;
3879 wakeup(&mpt->recovery_thread);
3880 MPT_UNLOCK(mpt);
3885 mpt_scsi_send_tmf(struct mpt_softc *mpt, u_int type, u_int flags,
3896 error = mpt_wait_req(mpt, mpt->tmf_req, REQ_STATE_FREE, REQ_STATE_FREE,
3899 mpt_reset(mpt, TRUE);
3903 mpt_assign_serno(mpt, mpt->tmf_req);
3904 mpt->tmf_req->state = REQ_STATE_ALLOCATED|REQ_STATE_QUEUED;
3906 tmf_req = (MSG_SCSI_TASK_MGMT *)mpt->tmf_req->req_vbuf;
3914 htole32(mpt->tmf_req->index | scsi_tmf_handler_id);
3918 mpt_lprt(mpt, MPT_PRT_DEBUG,
3919 "Issuing TMF %p:%u with MsgContext of 0x%x\n", mpt->tmf_req,
3920 mpt->tmf_req->serno, tmf_req->MsgContext);
3921 if (mpt->verbose > MPT_PRT_DEBUG) {
3925 KASSERT(mpt_req_on_pending_list(mpt, mpt->tmf_req) == 0,
3927 TAILQ_INSERT_HEAD(&mpt->request_pending_list, mpt->tmf_req, links);
3928 error = mpt_send_handshake_cmd(mpt, sizeof(*tmf_req), tmf_req);
3930 TAILQ_REMOVE(&mpt->request_pending_list, mpt->tmf_req, links);
3931 mpt->tmf_req->state = REQ_STATE_FREE;
3932 mpt_reset(mpt, TRUE);
3946 mpt_recover_commands(struct mpt_softc *mpt)
3952 if (TAILQ_EMPTY(&mpt->request_timeout_list) != 0) {
3956 mpt_prt(mpt, "mpt_recover_commands: no requests.\n");
3963 mpt_intr(mpt);
3965 if (TAILQ_EMPTY(&mpt->request_timeout_list) != 0) {
3974 mpt_prt(mpt, "Timedout requests already complete. "
3976 mpt_enable_ints(mpt);
3987 while ((req = TAILQ_FIRST(&mpt->request_timeout_list)) != NULL) {
3992 mpt_prt(mpt, "attempting to abort req %p:%u function %x\n",
3996 mpt_prt(mpt, "null ccb in timed out request. "
3998 mpt_reset(mpt, TRUE);
4015 mpt_prt(mpt, "just putting it back on the pend q\n");
4016 TAILQ_REMOVE(&mpt->request_timeout_list, req, links);
4017 TAILQ_INSERT_HEAD(&mpt->request_pending_list, req,
4022 error = mpt_scsi_send_tmf(mpt,
4036 error = mpt_wait_req(mpt, mpt->tmf_req, REQ_STATE_DONE,
4039 status = le16toh(mpt->tmf_req->IOCStatus);
4040 response = mpt->tmf_req->ResponseCode;
4041 mpt->tmf_req->state = REQ_STATE_FREE;
4047 mpt_prt(mpt, "mpt_recover_commands: abort timed-out. "
4049 mpt_reset(mpt, TRUE);
4054 mpt_prt(mpt, "mpt_recover_commands: IOC Status 0x%x. "
4056 mpt_reset(mpt, TRUE);
4062 mpt_prt(mpt, "mpt_recover_commands: TMF Response 0x%x. "
4064 mpt_reset(mpt, TRUE);
4067 mpt_prt(mpt, "abort of req %p:%u completed\n", req, req->serno);
4073 mpt_fc_post_els(struct mpt_softc *mpt, request_t *req, int ioindex)
4082 paddr += MPT_RQSL(mpt);
4111 fl |= (MPT_NRFM(mpt) - MPT_RQSL(mpt));
4114 mpt_lprt(mpt, MPT_PRT_DEBUG,
4119 mpt_send_cmd(mpt, req);
4123 mpt_post_target_command(struct mpt_softc *mpt, request_t *req, int ioindex)
4130 paddr += MPT_RQSL(mpt);
4132 MPT_TGT_STATE(mpt, req)->state = TGT_STATE_LOADING;
4137 fc->BufferLength = MIN(MPT_REQUEST_AREA - MPT_RQSL(mpt), UINT8_MAX);
4138 fc->MsgContext = htole32(req->index | mpt->scsi_tgt_handler_id);
4144 mpt_check_doorbell(mpt);
4145 mpt_send_cmd(mpt, req);
4149 mpt_add_els_buffers(struct mpt_softc *mpt)
4153 if (mpt->is_fc == 0) {
4157 if (mpt->els_cmds_allocated) {
4161 mpt->els_cmd_ptrs = malloc(MPT_MAX_ELS * sizeof (request_t *),
4164 if (mpt->els_cmd_ptrs == NULL) {
4172 request_t *req = mpt_get_request(mpt, FALSE);
4177 mpt->els_cmd_ptrs[i] = req;
4178 mpt_fc_post_els(mpt, req, i);
4182 mpt_prt(mpt, "unable to add ELS buffer resources\n");
4183 free(mpt->els_cmd_ptrs, M_DEVBUF);
4184 mpt->els_cmd_ptrs = NULL;
4188 mpt_lprt(mpt, MPT_PRT_INFO,
4191 mpt->els_cmds_allocated = i;
4196 mpt_add_target_commands(struct mpt_softc *mpt)
4200 if (mpt->tgt_cmd_ptrs) {
4204 max = MPT_MAX_REQUESTS(mpt) >> 1;
4205 if (max > mpt->mpt_max_tgtcmds) {
4206 max = mpt->mpt_max_tgtcmds;
4208 mpt->tgt_cmd_ptrs =
4210 if (mpt->tgt_cmd_ptrs == NULL) {
4211 mpt_prt(mpt,
4219 req = mpt_get_request(mpt, FALSE);
4224 mpt->tgt_cmd_ptrs[i] = req;
4225 mpt_post_target_command(mpt, req, i);
4229 mpt_lprt(mpt, MPT_PRT_ERROR, "could not add any target bufs\n");
4230 free(mpt->tgt_cmd_ptrs, M_DEVBUF);
4231 mpt->tgt_cmd_ptrs = NULL;
4235 mpt->tgt_cmds_allocated = i;
4238 mpt_lprt(mpt, MPT_PRT_INFO,
4245 mpt_enable_lun(struct mpt_softc *mpt, target_id_t tgt, lun_id_t lun)
4249 mpt->twildcard = 1;
4255 if (mpt->tenabled == 0) {
4256 if (mpt->is_fc) {
4257 (void) mpt_fc_reset_link(mpt, 0);
4259 mpt->tenabled = 1;
4262 mpt->trt_wildcard.enabled = 1;
4264 mpt->trt[lun].enabled = 1;
4270 mpt_disable_lun(struct mpt_softc *mpt, target_id_t tgt, lun_id_t lun)
4275 mpt->twildcard = 0;
4282 mpt->trt_wildcard.enabled = 0;
4284 mpt->trt[lun].enabled = 0;
4287 if (mpt->trt[i].enabled) {
4291 if (i == MPT_MAX_LUNS && mpt->twildcard == 0) {
4292 if (mpt->is_fc) {
4293 (void) mpt_fc_reset_link(mpt, 0);
4295 mpt->tenabled = 0;
4304 mpt_target_start_io(struct mpt_softc *mpt, union ccb *ccb)
4307 request_t *cmd_req = MPT_TAG_2_REQ(mpt, csio->tag_id);
4308 mpt_tgt_state_t *tgt = MPT_TGT_STATE(mpt, cmd_req);
4315 xpt_freeze_simq(mpt->sim, 1);
4321 mpt_prt(mpt, "ccb %p flags 0x%x tag 0x%08x had bad request "
4323 mpt_tgt_dump_req_state(mpt, cmd_req);
4338 if ((req = mpt_get_request(mpt, FALSE)) == NULL) {
4339 if (mpt->outofbeer == 0) {
4340 mpt->outofbeer = 1;
4341 xpt_freeze_simq(mpt->sim, 1);
4342 mpt_lprt(mpt, MPT_PRT_DEBUG, "FREEZEQ\n");
4366 memset(req->req_vbuf, 0, MPT_RQSL(mpt));
4369 if (mpt->is_sas) {
4373 } else if (mpt->is_spi) {
4379 ta->MsgContext = htole32(req->index | mpt->scsi_tgt_handler_id);
4410 mpt_lprt(mpt, MPT_PRT_DEBUG,
4415 error = bus_dmamap_load_ccb(mpt->buffer_dmat, req->dmap, ccb,
4418 xpt_freeze_simq(mpt->sim, 1);
4429 mpt_lprt(mpt, MPT_PRT_DEBUG,
4438 mpt_scsi_tgt_status(mpt, ccb, cmd_req, csio->scsi_status,
4446 mpt_scsi_tgt_local(struct mpt_softc *mpt, request_t *cmd_req,
4460 tgt = MPT_TGT_STATE(mpt, cmd_req);
4463 mpt_scsi_tgt_status(mpt, NULL, cmd_req, 0, NULL, 0);
4467 if ((req = mpt_get_request(mpt, FALSE)) == NULL) {
4468 mpt_prt(mpt, "out of resources- dropping local response\n");
4473 memset(req->req_vbuf, 0, MPT_RQSL(mpt));
4476 if (mpt->is_sas) {
4479 } else if (mpt->is_spi) {
4484 ta->MsgContext = htole32(req->index | mpt->scsi_tgt_handler_id);
4491 dptr += MPT_RQSL(mpt);
4493 pptr += MPT_RQSL(mpt);
4494 memcpy(dptr, data, min(length, MPT_RQSL(mpt)));
4519 mpt_send_cmd(mpt, req);
4526 mpt_abort_target_ccb(struct mpt_softc *mpt, union ccb *ccb)
4536 mpt_lprt(mpt, MPT_PRT_DEBUG, "aborting ccb %p\n", accb);
4538 trtp = &mpt->trt_wildcard;
4540 trtp = &mpt->trt[ccb->ccb_h.target_lun];
4560 req = MPT_TAG_2_REQ(mpt, tag);
4561 tgt = MPT_TGT_STATE(mpt, req);
4563 mpt_abort_target_cmd(mpt, req);
4574 mpt_abort_target_cmd(struct mpt_softc *mpt, request_t *cmd_req)
4580 req = mpt_get_request(mpt, FALSE);
4587 abtp->MsgContext = htole32(req->index | mpt->scsi_tgt_handler_id);
4590 abtp->ReplyWord = htole32(MPT_TGT_STATE(mpt, cmd_req)->reply_desc);
4592 if (mpt->is_fc || mpt->is_sas) {
4593 mpt_send_cmd(mpt, req);
4595 error = mpt_send_handshake_cmd(mpt, sizeof(*req), req);
4613 mpt_scsi_tgt_status(struct mpt_softc *mpt, union ccb *ccb, request_t *cmd_req,
4625 cmd_vbuf += MPT_RQSL(mpt);
4626 tgt = MPT_TGT_STATE(mpt, cmd_req);
4628 if ((req = mpt_get_request(mpt, FALSE)) == NULL) {
4629 if (mpt->outofbeer == 0) {
4630 mpt->outofbeer = 1;
4631 xpt_freeze_simq(mpt->sim, 1);
4632 mpt_lprt(mpt, MPT_PRT_DEBUG, "FREEZEQ\n");
4639 mpt_prt(mpt,
4646 ccb->ccb_h.ccb_mpt_ptr = mpt;
4660 paddr += MPT_RQSL(mpt);
4665 if (mpt->is_fc) {
4672 sts_vbuf += MPT_RQSL(mpt);
4709 } else if (mpt->is_sas) {
4721 tp->MsgContext = htole32(req->index | mpt->scsi_tgt_handler_id);
4740 mpt_lprt(mpt, MPT_PRT_DEBUG,
4744 if (mpt->verbose > MPT_PRT_DEBUG)
4750 mpt_send_cmd(mpt, req);
4754 mpt_scsi_tgt_tsk_mgmt(struct mpt_softc *mpt, request_t *req, mpt_task_mgmt_t fc,
4760 tgt = MPT_TGT_STATE(mpt, req);
4763 mpt_lprt(mpt, MPT_PRT_WARN, "no INOTSs- sending back BSY\n");
4764 mpt_scsi_tgt_status(mpt, NULL, req, SCSI_STATUS_BUSY, NULL, 0);
4768 mpt_lprt(mpt, MPT_PRT_DEBUG1,
4811 mpt_scsi_tgt_atio(struct mpt_softc *mpt, request_t *req, uint32_t reply_desc)
4835 vbuf += MPT_RQSL(mpt);
4836 if (mpt->verbose >= MPT_PRT_DEBUG) {
4837 mpt_dump_data(mpt, "mpt_scsi_tgt_atio response", vbuf,
4846 tgt = MPT_TGT_STATE(mpt, req);
4848 mpt_tgt_dump_req_state(mpt, req);
4863 tgt->tag_id = MPT_MAKE_TAGID(mpt, req, ioindex);
4865 if (mpt->is_fc) {
4895 mpt_prt(mpt, "CORRUPTED TASK MGMT BITS: 0x%x\n",
4897 mpt_scsi_tgt_status(mpt, NULL, req,
4924 } else if (mpt->is_sas) {
4943 if (lun >= MPT_MAX_LUNS || mpt->tenabled == 0 ||
4944 mpt->trt[lun].enabled == 0) {
4945 if (mpt->twildcard) {
4946 trtp = &mpt->trt_wildcard;
4976 mpt_lprt(mpt, MPT_PRT_DEBUG,
4978 mpt_scsi_tgt_local(mpt, req, lun, 1,
4987 mpt_lprt(mpt, MPT_PRT_DEBUG,
4989 mpt_scsi_tgt_local(mpt, req, lun, 1,
4994 mpt_lprt(mpt, MPT_PRT_DEBUG, "REPORT LUNS\n");
4998 mpt_lprt(mpt, MPT_PRT_DEBUG,
5004 mpt_scsi_tgt_status(mpt, NULL, req,
5010 trtp = &mpt->trt[lun];
5018 mpt_prt(mpt, "task mgmt function %x but no listener\n",
5020 mpt_scsi_tgt_status(mpt, NULL, req,
5023 mpt_scsi_tgt_tsk_mgmt(mpt, req, fct, trtp,
5031 mpt_lprt(mpt, MPT_PRT_WARN,
5033 mpt->tenabled? "QUEUE FULL" : "BUSY");
5034 mpt_scsi_tgt_status(mpt, NULL, req,
5035 mpt->tenabled? SCSI_STATUS_QUEUE_FULL : SCSI_STATUS_BUSY,
5040 mpt_lprt(mpt, MPT_PRT_DEBUG1,
5043 atiop->ccb_h.ccb_mpt_ptr = mpt;
5055 if (mpt->verbose >= MPT_PRT_DEBUG) {
5057 mpt_prt(mpt, "START_CCB %p for lun %jx CDB=<", atiop,
5060 mpt_prtc(mpt, "%02x%c", cdbp[i] & 0xff,
5063 mpt_prtc(mpt, " itag %x tag %x rdesc %x dl=%u\n",
5071 mpt_tgt_dump_tgt_state(struct mpt_softc *mpt, request_t *req)
5073 mpt_tgt_state_t *tgt = MPT_TGT_STATE(mpt, req);
5075 mpt_prt(mpt, "req %p:%u tgt:rdesc 0x%x resid %u xfrd %u ccb %p treq %p "
5082 mpt_tgt_dump_req_state(struct mpt_softc *mpt, request_t *req)
5085 mpt_prt(mpt, "req %p:%u index %u (%x) state %x\n", req, req->serno,
5087 mpt_tgt_dump_tgt_state(mpt, req);
5091 mpt_scsi_tgt_reply_handler(struct mpt_softc *mpt, request_t *req,
5102 mpt_tgt_state_t *tgt = MPT_TGT_STATE(mpt, req);
5105 mpt_req_spcl(mpt, req, "turbo scsi_tgt_reply", __LINE__);
5107 mpt_req_not_spcl(mpt, tgt->req,
5116 mpt_scsi_tgt_atio(mpt, req, reply_desc);
5122 panic("mpt: turbo target reply with null "
5128 panic("mpt: turbo target reply with "
5132 mpt_lprt(mpt, MPT_PRT_DEBUG,
5134 TAILQ_REMOVE(&mpt->request_pending_list,
5136 mpt_free_request(mpt, tgt->req);
5138 mpt_scsi_tgt_status(mpt, NULL, req,
5145 mpt_lprt(mpt, MPT_PRT_DEBUG,
5154 TAILQ_REMOVE(&mpt->request_pending_list,
5156 mpt_free_request(mpt, tgt->req);
5169 if (mpt->outofbeer) {
5171 mpt->outofbeer = 0;
5172 mpt_lprt(mpt, MPT_PRT_DEBUG, "THAWQ\n");
5180 mpt_scsi_tgt_status(mpt, ccb, req,
5194 panic("mpt: turbo target reply with null "
5209 mpt_lprt(mpt, MPT_PRT_DEBUG,
5228 mpt_lprt(mpt, MPT_PRT_DEBUG,
5232 TAILQ_REMOVE(&mpt->request_pending_list,
5234 mpt_free_request(mpt, tgt->req);
5242 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
5244 mpt_post_target_command(mpt, req, ioindex);
5250 if (mpt->outofbeer) {
5252 mpt->outofbeer = 0;
5253 mpt_lprt(mpt, MPT_PRT_DEBUG, "THAWQ\n");
5263 mpt_prt(mpt, "Unknown Target State 0x%x in Context "
5276 mpt_lprt(mpt, dbg,
5285 mpt_req_spcl(mpt, req, "tgt reply BUFFER POST", __LINE__);
5293 tgt = MPT_TGT_STATE(mpt, req);
5296 mpt_assign_serno(mpt, req);
5302 mpt_req_not_spcl(mpt, req, "tgt reply TARGET ASSIST", __LINE__);
5304 mpt_prt(mpt, "target assist completion\n");
5305 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
5306 mpt_free_request(mpt, req);
5310 mpt_req_not_spcl(mpt, req, "tgt reply STATUS SEND", __LINE__);
5312 mpt_prt(mpt, "status send completion\n");
5313 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
5314 mpt_free_request(mpt, req);
5324 mpt_req_not_spcl(mpt, req, "tgt reply TMODE ABORT", __LINE__);
5326 mpt_prt(mpt, "ABORT RX_ID 0x%x Complete; status 0x%x cnt %u\n",
5328 TAILQ_REMOVE(&mpt->request_pending_list, req, links);
5329 mpt_free_request(mpt, req);
5333 mpt_prt(mpt, "Unknown Target Address Reply Function code: "