Lines Matching +full:32 +full:- +full:rail

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2011-2015 LSI Corp.
5 * Copyright (c) 2013-2015 Avago Technologies
29 * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
107 u16 reserved1[10]; /* 0-9 */
108 u16 serial_number[10]; /* 10-19 */
109 u16 reserved2[7]; /* 20-26 */
110 u16 model_number[20]; /* 27-46*/
111 u16 reserved3[170]; /* 47-216 */
113 u16 reserved4[38]; /* 218-255 */
151 sz = le16toh(event->EventDataLength) * 4; in mpssas_evt_handler()
152 fw_event->event_data = malloc(sz, M_MPT2, M_ZERO|M_NOWAIT); in mpssas_evt_handler()
153 if (!fw_event->event_data) { in mpssas_evt_handler()
159 bcopy(event->EventData, fw_event->event_data, sz); in mpssas_evt_handler()
160 fw_event->event = event->Event; in mpssas_evt_handler()
161 if ((event->Event == MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST || in mpssas_evt_handler()
162 event->Event == MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE || in mpssas_evt_handler()
163 event->Event == MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST) && in mpssas_evt_handler()
164 sc->track_mapping_events) in mpssas_evt_handler()
165 sc->pending_map_events++; in mpssas_evt_handler()
172 if ((event->Event == MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST || in mpssas_evt_handler()
173 event->Event == MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST) && in mpssas_evt_handler()
174 sc->wait_for_port_enable) in mpssas_evt_handler()
175 mpssas_startup_increment(sc->sassc); in mpssas_evt_handler()
177 TAILQ_INSERT_TAIL(&sc->sassc->ev_queue, fw_event, ev_link); in mpssas_evt_handler()
178 taskqueue_enqueue(sc->sassc->ev_tq, &sc->sassc->ev_task); in mpssas_evt_handler()
186 free(fw_event->event_data, M_MPT2); in mpssas_fw_event_free()
191 * _mps_fw_work - delayed task for processing firmware events
202 sassc = sc->sassc; in mpssas_fw_work()
204 mps_dprint(sc, MPS_EVENT, "(%d)->(%s) Working on Event: [%x]\n", in mpssas_fw_work()
205 event_count++,__func__,fw_event->event); in mpssas_fw_work()
206 switch (fw_event->event) { in mpssas_fw_work()
214 fw_event->event_data; in mpssas_fw_work()
216 mps_mapping_topology_change_event(sc, fw_event->event_data); in mpssas_fw_work()
218 for (i = 0; i < data->NumEntries; i++) { in mpssas_fw_work()
219 phy = &data->PHY[i]; in mpssas_fw_work()
220 switch (phy->PhyStatus & MPI2_EVENT_SAS_TOPO_RC_MASK) { in mpssas_fw_work()
223 le16toh(phy->AttachedDevHandle), in mpssas_fw_work()
224 phy->LinkRate)){ in mpssas_fw_work()
228 le16toh(phy->AttachedDevHandle)); in mpssas_fw_work()
230 phy->AttachedDevHandle)); in mpssas_fw_work()
235 phy->AttachedDevHandle)); in mpssas_fw_work()
256 data = (MPI2_EVENT_DATA_SAS_DISCOVERY *)fw_event->event_data; in mpssas_fw_work()
258 if (data->ReasonCode & MPI2_EVENT_SAS_DISC_RC_STARTED) in mpssas_fw_work()
260 if (data->ReasonCode & MPI2_EVENT_SAS_DISC_RC_COMPLETED) { in mpssas_fw_work()
262 sassc->flags &= ~MPSSAS_IN_DISCOVERY; in mpssas_fw_work()
270 fw_event->event_data); in mpssas_fw_work()
282 event_data = fw_event->event_data; in mpssas_fw_work()
283 foreign_config = (le32toh(event_data->Flags) & in mpssas_fw_work()
287 (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; in mpssas_fw_work()
289 element->VolDevHandle); in mpssas_fw_work()
293 for (i = 0; i < event_data->NumElements; i++, element++) { in mpssas_fw_work()
294 switch (element->ReasonCode) { in mpssas_fw_work()
299 le16toh(element->VolDevHandle))){ in mpssas_fw_work()
302 __func__, le16toh(element-> in mpssas_fw_work()
317 le16toh(element->VolDevHandle)); in mpssas_fw_work()
321 targ = &sassc->targets[id]; in mpssas_fw_work()
322 targ->handle = 0x0; in mpssas_fw_work()
323 targ->encl_slot = 0x0; in mpssas_fw_work()
324 targ->encl_handle = 0x0; in mpssas_fw_work()
325 targ->exp_dev_handle = 0x0; in mpssas_fw_work()
326 targ->phy_num = 0x0; in mpssas_fw_work()
327 targ->linkrate = 0x0; in mpssas_fw_work()
330 targ->tid); in mpssas_fw_work()
340 element->PhysDiskDevHandle); in mpssas_fw_work()
350 if((!sc->WD_available) || in mpssas_fw_work()
351 ((sc->WD_available && in mpssas_fw_work()
352 (sc->WD_hide_expose == MPS_WD_HIDE_ALWAYS)) || in mpssas_fw_work()
353 (sc->WD_valid_config && (sc->WD_hide_expose == in mpssas_fw_work()
355 targ->flags |= MPS_TARGET_FLAGS_RAID_COMPONENT; in mpssas_fw_work()
366 le16toh(element->PhysDiskDevHandle), 0)){ in mpssas_fw_work()
369 le16toh(element->PhysDiskDevHandle)); in mpssas_fw_work()
370 mpssas_prepare_remove(sassc, le16toh(element-> in mpssas_fw_work()
386 Mpi2EventDataIrVolume_t *event_data = fw_event->event_data; in mpssas_fw_work()
392 switch (event_data->ReasonCode) { in mpssas_fw_work()
396 "handle 0x%x", le32toh(event_data->PreviousValue), in mpssas_fw_work()
397 le32toh(event_data->NewValue), in mpssas_fw_work()
398 le16toh(event_data->VolDevHandle)); in mpssas_fw_work()
403 "handle 0x%x", le32toh(event_data->PreviousValue), in mpssas_fw_work()
404 le32toh(event_data->NewValue), in mpssas_fw_work()
405 le16toh(event_data->VolDevHandle)); in mpssas_fw_work()
410 "handle 0x%x", le32toh(event_data->PreviousValue), in mpssas_fw_work()
411 le32toh(event_data->NewValue), in mpssas_fw_work()
412 le16toh(event_data->VolDevHandle)); in mpssas_fw_work()
415 state = le32toh(event_data->NewValue); in mpssas_fw_work()
419 mpssas_prepare_volume_remove(sassc, event_data-> in mpssas_fw_work()
426 targ = mpssas_find_target_by_handle(sassc, 0, event_data->VolDevHandle); in mpssas_fw_work()
429 __func__, __LINE__ , event_data->VolDevHandle); in mpssas_fw_work()
432 if (mpssas_volume_add(sc, le16toh(event_data->VolDevHandle))) { in mpssas_fw_work()
435 __func__, le16toh(event_data-> in mpssas_fw_work()
451 fw_event->event_data; in mpssas_fw_work()
458 switch (event_data->ReasonCode) { in mpssas_fw_work()
463 "%d", le32toh(event_data->PreviousValue), in mpssas_fw_work()
464 le32toh(event_data->NewValue), in mpssas_fw_work()
465 event_data->PhysDiskNum, in mpssas_fw_work()
466 le16toh(event_data->PhysDiskDevHandle), in mpssas_fw_work()
467 le16toh(event_data->EnclosureHandle), le16toh(event_data->Slot)); in mpssas_fw_work()
473 le32toh(event_data->PreviousValue), in mpssas_fw_work()
474 le32toh(event_data->NewValue), event_data->PhysDiskNum, in mpssas_fw_work()
475 le16toh(event_data->PhysDiskDevHandle), in mpssas_fw_work()
476 le16toh(event_data->EnclosureHandle), le16toh(event_data->Slot)); in mpssas_fw_work()
482 le32toh(event_data->PreviousValue), in mpssas_fw_work()
483 le32toh(event_data->NewValue), event_data->PhysDiskNum, in mpssas_fw_work()
484 le16toh(event_data->PhysDiskDevHandle), in mpssas_fw_work()
485 le16toh(event_data->EnclosureHandle), le16toh(event_data->Slot)); in mpssas_fw_work()
486 switch (event_data->NewValue) { in mpssas_fw_work()
493 event_data->PhysDiskDevHandle); in mpssas_fw_work()
495 if(!sc->WD_available) { in mpssas_fw_work()
496 targ->flags |= MPS_TARGET_FLAGS_RAID_COMPONENT; in mpssas_fw_work()
498 __func__, __LINE__ , event_data->PhysDiskDevHandle); in mpssas_fw_work()
499 } else if ((sc->WD_available && in mpssas_fw_work()
500 (sc->WD_hide_expose == MPS_WD_HIDE_ALWAYS)) || in mpssas_fw_work()
501 (sc->WD_valid_config && (sc->WD_hide_expose == in mpssas_fw_work()
503 targ->flags |= MPS_TARGET_FLAGS_RAID_COMPONENT; in mpssas_fw_work()
505 __func__, __LINE__ , event_data->PhysDiskDevHandle); in mpssas_fw_work()
514 event_data->PhysDiskDevHandle); in mpssas_fw_work()
516 targ->flags |= ~MPS_TARGET_FLAGS_RAID_COMPONENT; in mpssas_fw_work()
518 __func__, __LINE__ , event_data->PhysDiskDevHandle); in mpssas_fw_work()
530 fw_event->event_data; in mpssas_fw_work()
538 event_data->RAIDOperation, event_data->PercentComplete, in mpssas_fw_work()
539 le16toh(event_data->VolDevHandle)); in mpssas_fw_work()
548 logEntry = (pMpi2EventDataLogEntryAdded_t)fw_event->event_data; in mpssas_fw_work()
549 logQualifier = logEntry->LogEntryQualifier; in mpssas_fw_work()
552 logCode = logEntry->LogData[0]; in mpssas_fw_work()
571 "read-only mode. Check WarpDrive " in mpssas_fw_work()
575 printf("WarpDrive Fatal Error: The Backup Rail " in mpssas_fw_work()
590 fw_event->event); in mpssas_fw_work()
593 mps_dprint(sc, MPS_EVENT, "(%d)->(%s) Event Free: [%x]\n",event_count,__func__, fw_event->event); in mpssas_fw_work()
605 while ((fw_event = TAILQ_FIRST(&sc->sassc->ev_queue)) != NULL) { in mpssas_firmware_event_work()
606 TAILQ_REMOVE(&sc->sassc->ev_queue, fw_event, ev_link); in mpssas_firmware_event_work()
628 sassc = sc->sassc; in mpssas_add_device()
656 parent_sas_address = (parent_sas_address << 32) | in mpssas_add_device()
663 sas_address = (sas_address << 32) | config_page.SASAddress.Low; in mpssas_add_device()
688 * 1 - use the PhyNum field as a fallback to the mapping logic in mpssas_add_device()
689 * 0 - never use the PhyNum field in mpssas_add_device()
690 * -1 - only use the PhyNum field in mpssas_add_device()
700 if (sc->use_phynum != -1) in mpssas_add_device()
703 if ((sc->use_phynum == 0) in mpssas_add_device()
704 || ((id = config_page.PhyNum) > sassc->maxtargets)) { in mpssas_add_device()
722 targ = &sassc->targets[id]; in mpssas_add_device()
723 if (!(targ->flags & MPS_TARGET_FLAGS_RAID_COMPONENT)) { in mpssas_add_device()
731 if (targ->handle != 0x0) { in mpssas_add_device()
733 "target id %d handle 0x%04x\n", id, targ->handle); in mpssas_add_device()
739 targ->devinfo = device_info; in mpssas_add_device()
740 targ->devname = le32toh(config_page.DeviceName.High); in mpssas_add_device()
741 targ->devname = (targ->devname << 32) | in mpssas_add_device()
743 targ->encl_handle = le16toh(config_page.EnclosureHandle); in mpssas_add_device()
744 targ->encl_slot = le16toh(config_page.Slot); in mpssas_add_device()
745 targ->handle = handle; in mpssas_add_device()
746 targ->parent_handle = le16toh(config_page.ParentDevHandle); in mpssas_add_device()
747 targ->sasaddr = mps_to_u64(&config_page.SASAddress); in mpssas_add_device()
748 targ->parent_sasaddr = le64toh(parent_sas_address); in mpssas_add_device()
749 targ->parent_devinfo = parent_devinfo; in mpssas_add_device()
750 targ->tid = id; in mpssas_add_device()
751 targ->linkrate = (linkrate>>4); in mpssas_add_device()
752 targ->flags = 0; in mpssas_add_device()
754 targ->flags = MPS_TARGET_IS_SATA_SSD; in mpssas_add_device()
756 TAILQ_INIT(&targ->commands); in mpssas_add_device()
757 TAILQ_INIT(&targ->timedout_commands); in mpssas_add_device()
758 while(!SLIST_EMPTY(&targ->luns)) { in mpssas_add_device()
759 lun = SLIST_FIRST(&targ->luns); in mpssas_add_device()
760 SLIST_REMOVE_HEAD(&targ->luns, lun_link); in mpssas_add_device()
763 SLIST_INIT(&targ->luns); in mpssas_add_device()
765 mps_describe_devinfo(targ->devinfo, devstring, 80); in mpssas_add_device()
767 devstring, mps_describe_table(mps_linkrate_names, targ->linkrate), in mpssas_add_device()
768 targ->handle, targ->encl_handle, targ->encl_slot); in mpssas_add_device()
771 mps_dprint(sc, MPS_MAPPING, "Target id 0x%x added\n", targ->tid); in mpssas_add_device()
782 for (i = 1; i < sc->num_reqs; i++) { in mpssas_add_device()
783 cm = &sc->commands[i]; in mpssas_add_device()
784 if (cm->cm_flags & MPS_CM_FLAGS_SATA_ID_TIMEOUT) { in mpssas_add_device()
785 targ->timeouts++; in mpssas_add_device()
786 cm->cm_flags |= MPS_CM_FLAGS_TIMEDOUT; in mpssas_add_device()
788 if ((targ->tm = mpssas_alloc_tm(sc)) != NULL) { in mpssas_add_device()
792 targ->tm->cm_targ = targ; in mpssas_add_device()
793 mpssas_send_reset(sc, targ->tm, in mpssas_add_device()
841 if (sc->spinup_wait_time > 0) { in mpssas_get_sas_address_for_sata_disk()
844 sc->spinup_wait_time); in mpssas_get_sas_address_for_sata_disk()
845 msleep(&sc->msleep_fake_chan, &sc->mps_mtx, 0, in mpssas_get_sas_address_for_sata_disk()
846 "mpsid", sc->spinup_wait_time * hz); in mpssas_get_sas_address_for_sata_disk()
861 return -1; in mpssas_get_sas_address_for_sata_disk()
897 (u64)hash_address.wwid[3] << 32 | (u64)hash_address.wwid[4] << 24 | in mpssas_get_sas_address_for_sata_disk()
925 mpi_request = (MPI2_SATA_PASSTHROUGH_REQUEST *)cm->cm_req; in mpssas_get_sata_identify()
927 mpi_request->Function = MPI2_FUNCTION_SATA_PASSTHROUGH; in mpssas_get_sata_identify()
928 mpi_request->VF_ID = 0; in mpssas_get_sata_identify()
929 mpi_request->DevHandle = htole16(handle); in mpssas_get_sata_identify()
930 mpi_request->PassthroughFlags = (MPI2_SATA_PT_REQ_PT_FLAGS_PIO | in mpssas_get_sata_identify()
932 mpi_request->DataLength = htole32(sz); in mpssas_get_sata_identify()
933 mpi_request->CommandFIS[0] = 0x27; in mpssas_get_sata_identify()
934 mpi_request->CommandFIS[1] = 0x80; in mpssas_get_sata_identify()
935 mpi_request->CommandFIS[2] = (devinfo & in mpssas_get_sata_identify()
937 cm->cm_sge = &mpi_request->SGL; in mpssas_get_sata_identify()
938 cm->cm_sglsize = sizeof(MPI2_SGE_IO_UNION); in mpssas_get_sata_identify()
939 cm->cm_flags = MPS_CM_FLAGS_SGE_SIMPLE | MPS_CM_FLAGS_DATAIN; in mpssas_get_sata_identify()
940 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mpssas_get_sata_identify()
941 cm->cm_data = buffer; in mpssas_get_sata_identify()
942 cm->cm_length = htole32(sz); in mpssas_get_sata_identify()
950 cm->cm_timeout_handler = mpssas_ata_id_timeout; in mpssas_get_sata_identify()
957 reply = (Mpi2SataPassthroughReply_t *)cm->cm_reply; in mpssas_get_sata_identify()
972 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) != in mpssas_get_sata_identify()
976 handle, reply->IOCStatus); in mpssas_get_sata_identify()
986 if ((cm->cm_flags & MPS_CM_FLAGS_SATA_ID_TIMEOUT) == 0) { in mpssas_get_sata_identify()
1005 free(cm->cm_data, M_MPT2); in mpssas_ata_id_complete()
1021 cm->cm_flags |= MPS_CM_FLAGS_SATA_ID_TIMEOUT; in mpssas_ata_id_timeout()
1027 cm->cm_complete = mpssas_ata_id_complete; in mpssas_ata_id_timeout()
1040 sassc = sc->sassc; in mpssas_volume_add()
1060 targ = &sassc->targets[id]; in mpssas_volume_add()
1061 targ->tid = id; in mpssas_volume_add()
1062 targ->handle = handle; in mpssas_volume_add()
1063 targ->devname = wwid; in mpssas_volume_add()
1064 TAILQ_INIT(&targ->commands); in mpssas_volume_add()
1065 TAILQ_INIT(&targ->timedout_commands); in mpssas_volume_add()
1066 while(!SLIST_EMPTY(&targ->luns)) { in mpssas_volume_add()
1067 lun = SLIST_FIRST(&targ->luns); in mpssas_volume_add()
1068 SLIST_REMOVE_HEAD(&targ->luns, lun_link); in mpssas_volume_add()
1071 SLIST_INIT(&targ->luns); in mpssas_volume_add()
1074 targ->tid, wwid); in mpssas_volume_add()
1086 * SATA direct-access device. This helps to ensure that data corruption is
1095 struct mpssas_softc *sassc = sc->sassc; in mpssas_SSU_to_SATA_devices()
1097 path_id_t pathid = cam_sim_path(sassc->sim); in mpssas_SSU_to_SATA_devices()
1106 sc->SSU_started = TRUE; in mpssas_SSU_to_SATA_devices()
1107 sc->SSU_refcount = 0; in mpssas_SSU_to_SATA_devices()
1108 for (targetid = 0; targetid < sc->max_devices; targetid++) { in mpssas_SSU_to_SATA_devices()
1109 target = &sassc->targets[targetid]; in mpssas_SSU_to_SATA_devices()
1110 if (target->handle == 0x0) { in mpssas_SSU_to_SATA_devices()
1123 * a SATA direct-access end device. in mpssas_SSU_to_SATA_devices()
1125 if (target->stop_at_shutdown) { in mpssas_SSU_to_SATA_devices()
1126 if (xpt_create_path(&ccb->ccb_h.path, in mpssas_SSU_to_SATA_devices()
1134 xpt_path_string(ccb->ccb_h.path, path_str, in mpssas_SSU_to_SATA_devices()
1138 "handle %d\n", path_str, target->handle); in mpssas_SSU_to_SATA_devices()
1146 sc->SSU_refcount++; in mpssas_SSU_to_SATA_devices()
1147 ccb->ccb_h.target_id = in mpssas_SSU_to_SATA_devices()
1148 xpt_path_target_id(ccb->ccb_h.path); in mpssas_SSU_to_SATA_devices()
1149 ccb->ccb_h.ppriv_ptr1 = sassc; in mpssas_SSU_to_SATA_devices()
1150 scsi_start_stop(&ccb->csio, in mpssas_SSU_to_SATA_devices()
1177 while (sc->SSU_refcount > 0) { in mpssas_SSU_to_SATA_devices()
1180 xpt_sim_poll(sassc->sim); in mpssas_SSU_to_SATA_devices()
1182 if (--timeout == 0) { in mpssas_SSU_to_SATA_devices()
1199 sassc = (struct mpssas_softc *)done_ccb->ccb_h.ppriv_ptr1; in mpssas_stop_unit_done()
1201 xpt_path_string(done_ccb->ccb_h.path, path_str, sizeof(path_str)); in mpssas_stop_unit_done()
1202 mps_dprint(sassc->sc, MPS_INFO, "Completing stop unit for %s\n", in mpssas_stop_unit_done()
1210 xpt_free_path(done_ccb->ccb_h.path); in mpssas_stop_unit_done()
1215 * mpssas_ir_shutdown - IR shutdown notification
1228 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in mpssas_ir_shutdown()
1240 if (!sc->ir_firmware) in mpssas_ir_shutdown()
1244 // TODO-later, this should be looked up in the RAID config structure in mpssas_ir_shutdown()
1246 volume_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) & in mpssas_ir_shutdown()
1253 start_idx = sc->max_devices - sc->max_volumes; in mpssas_ir_shutdown()
1254 end_idx = start_idx + sc->max_volumes - 1; in mpssas_ir_shutdown()
1257 mt_entry = &sc->mapping_table[id]; in mpssas_ir_shutdown()
1258 if ((mt_entry->physical_id != 0) && in mpssas_ir_shutdown()
1259 (mt_entry->missing_count == 0)) { in mpssas_ir_shutdown()
1273 action = (MPI2_RAID_ACTION_REQUEST *)cm->cm_req; in mpssas_ir_shutdown()
1274 action->Function = MPI2_FUNCTION_RAID_ACTION; in mpssas_ir_shutdown()
1275 action->Action = MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED; in mpssas_ir_shutdown()
1276 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mpssas_ir_shutdown()
1299 for (targetid = 0; targetid < sc->max_devices; targetid++) { in mpssas_ir_shutdown()
1300 target = &sc->sassc->targets[targetid]; in mpssas_ir_shutdown()
1301 if (target->handle == 0x0) { in mpssas_ir_shutdown()
1305 if (target->supports_SSU) { in mpssas_ir_shutdown()
1306 switch (sc->enable_ssu) { in mpssas_ir_shutdown()
1308 target->stop_at_shutdown = FALSE; in mpssas_ir_shutdown()
1311 target->stop_at_shutdown = TRUE; in mpssas_ir_shutdown()
1312 if (target->flags & MPS_TARGET_IS_SATA_SSD) { in mpssas_ir_shutdown()
1313 target->stop_at_shutdown = FALSE; in mpssas_ir_shutdown()
1317 target->stop_at_shutdown = TRUE; in mpssas_ir_shutdown()
1321 target->stop_at_shutdown = TRUE; in mpssas_ir_shutdown()
1322 if ((target->flags & in mpssas_ir_shutdown()
1324 target->stop_at_shutdown = FALSE; in mpssas_ir_shutdown()