Lines Matching +full:high +full:- +full:volume

1 /*-
2 * Copyright (c) 2011-2015 LSI Corp.
3 * Copyright (c) 2013-2016 Avago Technologies
4 * Copyright 2000-2020 Broadcom Inc.
28 * Broadcom Inc. (LSI) MPT-Fusion Host Adapter FreeBSD
98 u32 high; member
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 */
153 sz = le16toh(event->EventDataLength) * 4; in mprsas_evt_handler()
154 fw_event->event_data = malloc(sz, M_MPR, M_ZERO|M_NOWAIT); in mprsas_evt_handler()
155 if (!fw_event->event_data) { in mprsas_evt_handler()
161 bcopy(event->EventData, fw_event->event_data, sz); in mprsas_evt_handler()
162 fw_event->event = le16toh(event->Event); in mprsas_evt_handler()
163 if ((fw_event->event == MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST || in mprsas_evt_handler()
164 fw_event->event == MPI2_EVENT_PCIE_TOPOLOGY_CHANGE_LIST || in mprsas_evt_handler()
165 fw_event->event == MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE || in mprsas_evt_handler()
166 fw_event->event == MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST) && in mprsas_evt_handler()
167 sc->track_mapping_events) in mprsas_evt_handler()
168 sc->pending_map_events++; in mprsas_evt_handler()
175 if ((fw_event->event == MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST || in mprsas_evt_handler()
176 fw_event->event == MPI2_EVENT_PCIE_TOPOLOGY_CHANGE_LIST || in mprsas_evt_handler()
177 fw_event->event == MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST) && in mprsas_evt_handler()
178 sc->wait_for_port_enable) in mprsas_evt_handler()
179 mprsas_startup_increment(sc->sassc); in mprsas_evt_handler()
181 TAILQ_INSERT_TAIL(&sc->sassc->ev_queue, fw_event, ev_link); in mprsas_evt_handler()
182 taskqueue_enqueue(sc->sassc->ev_tq, &sc->sassc->ev_task); in mprsas_evt_handler()
189 free(fw_event->event_data, M_MPR); in mprsas_fw_event_free()
194 * _mpr_fw_work - delayed task for processing firmware events
205 sassc = sc->sassc; in mprsas_fw_work()
207 mpr_dprint(sc, MPR_EVENT, "(%d)->(%s) Working on Event: [%x]\n", in mprsas_fw_work()
208 event_count++, __func__, fw_event->event); in mprsas_fw_work()
209 switch (fw_event->event) { in mprsas_fw_work()
217 fw_event->event_data; in mprsas_fw_work()
219 mpr_mapping_topology_change_event(sc, fw_event->event_data); in mprsas_fw_work()
221 for (i = 0; i < data->NumEntries; i++) { in mprsas_fw_work()
222 phy = &data->PHY[i]; in mprsas_fw_work()
223 switch (phy->PhyStatus & MPI2_EVENT_SAS_TOPO_RC_MASK) { in mprsas_fw_work()
226 le16toh(phy->AttachedDevHandle), in mprsas_fw_work()
227 phy->LinkRate)) { in mprsas_fw_work()
231 le16toh(phy->AttachedDevHandle)); in mprsas_fw_work()
233 phy->AttachedDevHandle)); in mprsas_fw_work()
238 phy->AttachedDevHandle)); in mprsas_fw_work()
259 data = (MPI2_EVENT_DATA_SAS_DISCOVERY *)fw_event->event_data; in mprsas_fw_work()
261 if (data->ReasonCode & MPI2_EVENT_SAS_DISC_RC_STARTED) in mprsas_fw_work()
263 if (data->ReasonCode & MPI2_EVENT_SAS_DISC_RC_COMPLETED) { in mprsas_fw_work()
265 sassc->flags &= ~MPRSAS_IN_DISCOVERY; in mprsas_fw_work()
273 fw_event->event_data); in mprsas_fw_work()
286 event_data = fw_event->event_data; in mprsas_fw_work()
287 foreign_config = (le32toh(event_data->Flags) & in mprsas_fw_work()
291 (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; in mprsas_fw_work()
293 element->VolDevHandle); in mprsas_fw_work()
296 for (i = 0; i < event_data->NumElements; i++, element++) { in mprsas_fw_work()
297 reason = element->ReasonCode; in mprsas_fw_work()
298 elementType = le16toh(element->ElementFlags) & in mprsas_fw_work()
339 action = (MPI2_RAID_ACTION_REQUEST *)cm->cm_req; in mprsas_fw_work()
340 action->Function = MPI2_FUNCTION_RAID_ACTION; in mprsas_fw_work()
341 action->Action = in mprsas_fw_work()
343 action->PhysDiskNum = element->PhysDiskNum; in mprsas_fw_work()
344 cm->cm_desc.Default.RequestFlags = in mprsas_fw_work()
349 cm->cm_reply; in mprsas_fw_work()
359 if (reply && (le16toh(reply->IOCStatus) & in mprsas_fw_work()
365 le16toh(reply->IOCStatus)); in mprsas_fw_work()
374 "code %x:\n", element->ReasonCode); in mprsas_fw_work()
375 switch (element->ReasonCode) { in mprsas_fw_work()
380 le16toh(element->VolDevHandle))) { in mprsas_fw_work()
382 "volume with handle 0x%x\n", in mprsas_fw_work()
383 __func__, le16toh(element-> in mprsas_fw_work()
391 * Rescan after volume is deleted or removed. in mprsas_fw_work()
396 "for volume with handle " in mprsas_fw_work()
398 le16toh(element-> in mprsas_fw_work()
403 targ = &sassc->targets[id]; in mprsas_fw_work()
404 targ->handle = 0x0; in mprsas_fw_work()
405 targ->encl_slot = 0x0; in mprsas_fw_work()
406 targ->encl_handle = 0x0; in mprsas_fw_work()
407 targ->encl_level_valid = 0x0; in mprsas_fw_work()
408 targ->encl_level = 0x0; in mprsas_fw_work()
409 targ->connector_name[0] = ' '; in mprsas_fw_work()
410 targ->connector_name[1] = ' '; in mprsas_fw_work()
411 targ->connector_name[2] = ' '; in mprsas_fw_work()
412 targ->connector_name[3] = ' '; in mprsas_fw_work()
413 targ->exp_dev_handle = 0x0; in mprsas_fw_work()
414 targ->phy_num = 0x0; in mprsas_fw_work()
415 targ->linkrate = 0x0; in mprsas_fw_work()
418 targ->tid); in mprsas_fw_work()
424 * Phys Disk of a volume has been created. Hide in mprsas_fw_work()
428 element->PhysDiskDevHandle); in mprsas_fw_work()
431 targ->flags |= MPR_TARGET_FLAGS_RAID_COMPONENT; in mprsas_fw_work()
436 * Phys Disk of a volume has been deleted. in mprsas_fw_work()
440 le16toh(element->PhysDiskDevHandle), 0)) { in mprsas_fw_work()
443 le16toh(element-> in mprsas_fw_work()
446 le16toh(element-> in mprsas_fw_work()
462 Mpi2EventDataIrVolume_t *event_data = fw_event->event_data; in mprsas_fw_work()
467 mpr_dprint(sc, MPR_EVENT, "Received IR Volume event:\n"); in mprsas_fw_work()
468 switch (event_data->ReasonCode) { in mprsas_fw_work()
470 mpr_dprint(sc, MPR_EVENT, " Volume Settings " in mprsas_fw_work()
472 "handle 0x%x", le32toh(event_data->PreviousValue), in mprsas_fw_work()
473 le32toh(event_data->NewValue), in mprsas_fw_work()
474 le16toh(event_data->VolDevHandle)); in mprsas_fw_work()
477 mpr_dprint(sc, MPR_EVENT, " Volume Status " in mprsas_fw_work()
479 "handle 0x%x", le32toh(event_data->PreviousValue), in mprsas_fw_work()
480 le32toh(event_data->NewValue), in mprsas_fw_work()
481 le16toh(event_data->VolDevHandle)); in mprsas_fw_work()
484 mpr_dprint(sc, MPR_EVENT, " Volume State " in mprsas_fw_work()
486 "handle 0x%x", le32toh(event_data->PreviousValue), in mprsas_fw_work()
487 le32toh(event_data->NewValue), in mprsas_fw_work()
488 le16toh(event_data->VolDevHandle)); in mprsas_fw_work()
491 state = le32toh(event_data->NewValue); in mprsas_fw_work()
496 event_data->VolDevHandle); in mprsas_fw_work()
504 0, event_data->VolDevHandle); in mprsas_fw_work()
506 printf("%s %d: Volume handle " in mprsas_fw_work()
509 event_data->VolDevHandle); in mprsas_fw_work()
513 le16toh(event_data-> in mprsas_fw_work()
516 "volume with handle 0x%x\n", in mprsas_fw_work()
518 event_data->VolDevHandle)); in mprsas_fw_work()
533 fw_event->event_data; in mprsas_fw_work()
540 switch (event_data->ReasonCode) { in mprsas_fw_work()
545 "%d", le32toh(event_data->PreviousValue), in mprsas_fw_work()
546 le32toh(event_data->NewValue), in mprsas_fw_work()
547 event_data->PhysDiskNum, in mprsas_fw_work()
548 le16toh(event_data->PhysDiskDevHandle), in mprsas_fw_work()
549 le16toh(event_data->EnclosureHandle), in mprsas_fw_work()
550 le16toh(event_data->Slot)); in mprsas_fw_work()
556 le32toh(event_data->PreviousValue), in mprsas_fw_work()
557 le32toh(event_data->NewValue), in mprsas_fw_work()
558 event_data->PhysDiskNum, in mprsas_fw_work()
559 le16toh(event_data->PhysDiskDevHandle), in mprsas_fw_work()
560 le16toh(event_data->EnclosureHandle), in mprsas_fw_work()
561 le16toh(event_data->Slot)); in mprsas_fw_work()
567 le32toh(event_data->PreviousValue), in mprsas_fw_work()
568 le32toh(event_data->NewValue), in mprsas_fw_work()
569 event_data->PhysDiskNum, in mprsas_fw_work()
570 le16toh(event_data->PhysDiskDevHandle), in mprsas_fw_work()
571 le16toh(event_data->EnclosureHandle), in mprsas_fw_work()
572 le16toh(event_data->Slot)); in mprsas_fw_work()
573 switch (event_data->NewValue) { in mprsas_fw_work()
581 event_data->PhysDiskDevHandle); in mprsas_fw_work()
583 targ->flags |= in mprsas_fw_work()
588 event_data-> in mprsas_fw_work()
598 event_data->PhysDiskDevHandle); in mprsas_fw_work()
600 targ->flags |= in mprsas_fw_work()
605 event_data-> in mprsas_fw_work()
618 fw_event->event_data; in mprsas_fw_work()
625 "percent complete for Volume with handle 0x%x", in mprsas_fw_work()
626 event_data->RAIDOperation, event_data->PercentComplete, in mprsas_fw_work()
627 le16toh(event_data->VolDevHandle)); in mprsas_fw_work()
634 temp_event = (pMpi2EventDataTemperature_t)fw_event->event_data; in mprsas_fw_work()
641 if (sc->iounit_pg8.NumSensors > temp_event->SensorNum) { in mprsas_fw_work()
644 ((temp_event->Status & 0x01) == 1) ? "0 " : " ", in mprsas_fw_work()
645 ((temp_event->Status & 0x02) == 2) ? "1 " : " ", in mprsas_fw_work()
646 ((temp_event->Status & 0x04) == 4) ? "2 " : " ", in mprsas_fw_work()
647 ((temp_event->Status & 0x08) == 8) ? "3 " : " ", in mprsas_fw_work()
648 temp_event->SensorNum); in mprsas_fw_work()
650 "%d\n", temp_event->CurrentTemperature); in mprsas_fw_work()
658 (pMpi26EventDataActiveCableExcept_t)fw_event->event_data; in mprsas_fw_work()
660 switch(ace_event_data->ReasonCode) { in mprsas_fw_work()
667 ace_event_data->ReceptacleID, in mprsas_fw_work()
668 ace_event_data->ActiveCablePowerRequirement); in mprsas_fw_work()
675 "(12 Gb/s rate)\n", ace_event_data->ReceptacleID); in mprsas_fw_work()
687 (pMpi26EventDataPCIeDeviceStatusChange_t)fw_event->event_data; in mprsas_fw_work()
689 switch (pcie_status_event_data->ReasonCode) { in mprsas_fw_work()
693 "0x%x\n", pcie_status_event_data->DevHandle); in mprsas_fw_work()
708 fw_event->event_data; in mprsas_fw_work()
710 sas_address = discovery_error_data->SASAddress.High; in mprsas_fw_work()
712 discovery_error_data->SASAddress.Low; in mprsas_fw_work()
714 switch(discovery_error_data->ReasonCode) { in mprsas_fw_work()
720 discovery_error_data->DevHandle); in mprsas_fw_work()
728 discovery_error_data->DevHandle); in mprsas_fw_work()
744 fw_event->event_data; in mprsas_fw_work()
747 fw_event->event_data); in mprsas_fw_work()
749 for (i = 0; i < data->NumEntries; i++) { in mprsas_fw_work()
750 port_entry = &data->PortEntry[i]; in mprsas_fw_work()
751 handle = le16toh(port_entry->AttachedDevHandle); in mprsas_fw_work()
752 link_rate = port_entry->CurrentPortInfo & in mprsas_fw_work()
754 switch (port_entry->PortStatus) { in mprsas_fw_work()
794 fw_event->event); in mprsas_fw_work()
797 mpr_dprint(sc, MPR_EVENT, "(%d)->(%s) Event Free: [%x]\n", event_count, in mprsas_fw_work()
798 __func__, fw_event->event); in mprsas_fw_work()
810 while ((fw_event = TAILQ_FIRST(&sc->sassc->ev_queue)) != NULL) { in mprsas_firmware_event_work()
811 TAILQ_REMOVE(&sc->sassc->ev_queue, fw_event, ev_link); in mprsas_firmware_event_work()
833 sassc = sc->sassc; in mprsas_add_device()
860 parent_sas_address = parent_config_page.SASAddress.High; in mprsas_add_device()
866 sas_address = htole32(config_page.SASAddress.High); in mprsas_add_device()
892 * 1 - use the PhyNum field as a fallback to the mapping logic in mprsas_add_device()
893 * 0 - never use the PhyNum field in mprsas_add_device()
894 * -1 - only use the PhyNum field in mprsas_add_device()
904 if (sc->use_phynum != -1) in mprsas_add_device()
907 if ((sc->use_phynum == 0) || in mprsas_add_device()
908 ((id = config_page.PhyNum) > sassc->maxtargets)) { in mprsas_add_device()
921 * RAID Component. For Physical Disks of a Volume, the ID will be reused in mprsas_add_device()
922 * when a volume is deleted because the mapping entry for the PD will in mprsas_add_device()
926 targ = &sassc->targets[id]; in mprsas_add_device()
927 if (!(targ->flags & MPR_TARGET_FLAGS_RAID_COMPONENT)) { in mprsas_add_device()
935 if (targ->handle != 0x0) { in mprsas_add_device()
937 "target id %d handle 0x%04x\n", id, targ->handle); in mprsas_add_device()
943 targ->devinfo = device_info; in mprsas_add_device()
944 targ->devname = le32toh(config_page.DeviceName.High); in mprsas_add_device()
945 targ->devname = (targ->devname << 32) | in mprsas_add_device()
947 targ->encl_handle = le16toh(config_page.EnclosureHandle); in mprsas_add_device()
948 targ->encl_slot = le16toh(config_page.Slot); in mprsas_add_device()
949 targ->encl_level = config_page.EnclosureLevel; in mprsas_add_device()
950 targ->connector_name[0] = config_page.ConnectorName[0]; in mprsas_add_device()
951 targ->connector_name[1] = config_page.ConnectorName[1]; in mprsas_add_device()
952 targ->connector_name[2] = config_page.ConnectorName[2]; in mprsas_add_device()
953 targ->connector_name[3] = config_page.ConnectorName[3]; in mprsas_add_device()
954 targ->handle = handle; in mprsas_add_device()
955 targ->parent_handle = le16toh(config_page.ParentDevHandle); in mprsas_add_device()
956 targ->sasaddr = mpr_to_u64(&config_page.SASAddress); in mprsas_add_device()
957 targ->parent_sasaddr = le64toh(parent_sas_address); in mprsas_add_device()
958 targ->parent_devinfo = parent_devinfo; in mprsas_add_device()
959 targ->tid = id; in mprsas_add_device()
960 targ->linkrate = (linkrate>>4); in mprsas_add_device()
961 targ->flags = 0; in mprsas_add_device()
963 targ->flags = MPR_TARGET_IS_SATA_SSD; in mprsas_add_device()
969 targ->scsi_req_desc_type = in mprsas_add_device()
974 targ->encl_level_valid = TRUE; in mprsas_add_device()
976 TAILQ_INIT(&targ->commands); in mprsas_add_device()
977 TAILQ_INIT(&targ->timedout_commands); in mprsas_add_device()
978 while (!SLIST_EMPTY(&targ->luns)) { in mprsas_add_device()
979 lun = SLIST_FIRST(&targ->luns); in mprsas_add_device()
980 SLIST_REMOVE_HEAD(&targ->luns, lun_link); in mprsas_add_device()
983 SLIST_INIT(&targ->luns); in mprsas_add_device()
985 mpr_describe_devinfo(targ->devinfo, devstring, 80); in mprsas_add_device()
988 mpr_describe_table(mpr_linkrate_names, targ->linkrate), in mprsas_add_device()
989 targ->handle, targ->encl_handle, targ->encl_slot); in mprsas_add_device()
990 if (targ->encl_level_valid) { in mprsas_add_device()
992 "and connector name (%4s)\n", targ->encl_level, in mprsas_add_device()
993 targ->connector_name); in mprsas_add_device()
996 mpr_dprint(sc, MPR_MAPPING, "Target id 0x%x added\n", targ->tid); in mprsas_add_device()
1007 for (i = 1; i < sc->num_reqs; i++) { in mprsas_add_device()
1008 cm = &sc->commands[i]; in mprsas_add_device()
1009 if (cm->cm_flags & MPR_CM_FLAGS_SATA_ID_TIMEOUT) { in mprsas_add_device()
1010 targ->timeouts++; in mprsas_add_device()
1011 cm->cm_flags |= MPR_CM_FLAGS_TIMEDOUT; in mprsas_add_device()
1013 if ((targ->tm = mprsas_alloc_tm(sc)) != NULL) { in mprsas_add_device()
1017 targ->tm->cm_targ = targ; in mprsas_add_device()
1018 mprsas_send_reset(sc, targ->tm, in mprsas_add_device()
1067 if (sc->spinup_wait_time > 0) { in mprsas_get_sas_address_for_sata_disk()
1070 sc->spinup_wait_time); in mprsas_get_sas_address_for_sata_disk()
1071 msleep(&sc->msleep_fake_chan, &sc->mpr_mtx, 0, in mprsas_get_sas_address_for_sata_disk()
1072 "mprid", sc->spinup_wait_time * hz); in mprsas_get_sas_address_for_sata_disk()
1086 return -1; in mprsas_get_sas_address_for_sata_disk()
1106 hash_address.word.high = 0; in mprsas_get_sas_address_for_sata_disk()
1110 hash_address.word.high += *bufferptr; in mprsas_get_sas_address_for_sata_disk()
1118 if ((hash_address.word.high & 0x000000F0) == (0x00000050)) in mprsas_get_sas_address_for_sata_disk()
1119 hash_address.word.high |= 0x00000080; in mprsas_get_sas_address_for_sata_disk()
1150 mpi_request = (MPI2_SATA_PASSTHROUGH_REQUEST *)cm->cm_req; in mprsas_get_sata_identify()
1152 mpi_request->Function = MPI2_FUNCTION_SATA_PASSTHROUGH; in mprsas_get_sata_identify()
1153 mpi_request->VF_ID = 0; in mprsas_get_sata_identify()
1154 mpi_request->DevHandle = htole16(handle); in mprsas_get_sata_identify()
1155 mpi_request->PassthroughFlags = (MPI2_SATA_PT_REQ_PT_FLAGS_PIO | in mprsas_get_sata_identify()
1157 mpi_request->DataLength = htole32(sz); in mprsas_get_sata_identify()
1158 mpi_request->CommandFIS[0] = 0x27; in mprsas_get_sata_identify()
1159 mpi_request->CommandFIS[1] = 0x80; in mprsas_get_sata_identify()
1160 mpi_request->CommandFIS[2] = (devinfo & in mprsas_get_sata_identify()
1162 cm->cm_sge = &mpi_request->SGL; in mprsas_get_sata_identify()
1163 cm->cm_sglsize = sizeof(MPI2_SGE_IO_UNION); in mprsas_get_sata_identify()
1164 cm->cm_flags = MPR_CM_FLAGS_DATAIN; in mprsas_get_sata_identify()
1165 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mprsas_get_sata_identify()
1166 cm->cm_data = buffer; in mprsas_get_sata_identify()
1167 cm->cm_length = htole32(sz); in mprsas_get_sata_identify()
1175 cm->cm_timeout_handler = mprsas_ata_id_timeout; in mprsas_get_sata_identify()
1182 reply = (Mpi2SataPassthroughReply_t *)cm->cm_reply; in mprsas_get_sata_identify()
1197 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) != in mprsas_get_sata_identify()
1201 handle, reply->IOCStatus); in mprsas_get_sata_identify()
1211 if ((cm->cm_flags & MPR_CM_FLAGS_SATA_ID_TIMEOUT) == 0) { in mprsas_get_sata_identify()
1230 free(cm->cm_data, M_MPR); in mprsas_ata_id_complete()
1247 cm->cm_flags |= MPR_CM_FLAGS_SATA_ID_TIMEOUT; in mprsas_ata_id_timeout()
1253 cm->cm_complete = mprsas_ata_id_complete; in mprsas_ata_id_timeout()
1271 sassc = sc->sassc; in mprsas_add_pcie_device()
1293 parent_wwid = parent_config_page.WWID.High; in mprsas_add_pcie_device()
1300 pcie_wwid = config_page.WWID.High; in mprsas_add_pcie_device()
1332 targ = &sassc->targets[id]; in mprsas_add_pcie_device()
1333 targ->devinfo = device_info; in mprsas_add_pcie_device()
1334 targ->encl_handle = le16toh(config_page.EnclosureHandle); in mprsas_add_pcie_device()
1335 targ->encl_slot = le16toh(config_page.Slot); in mprsas_add_pcie_device()
1336 targ->encl_level = config_page.EnclosureLevel; in mprsas_add_pcie_device()
1337 targ->connector_name[0] = ((char *)&config_page.ConnectorName)[0]; in mprsas_add_pcie_device()
1338 targ->connector_name[1] = ((char *)&config_page.ConnectorName)[1]; in mprsas_add_pcie_device()
1339 targ->connector_name[2] = ((char *)&config_page.ConnectorName)[2]; in mprsas_add_pcie_device()
1340 targ->connector_name[3] = ((char *)&config_page.ConnectorName)[3]; in mprsas_add_pcie_device()
1341 targ->is_nvme = device_info & MPI26_PCIE_DEVINFO_NVME; in mprsas_add_pcie_device()
1342 targ->MDTS = config_page2.MaximumDataTransferSize; in mprsas_add_pcie_device()
1343 if (targ->is_nvme) in mprsas_add_pcie_device()
1344 targ->controller_reset_timeout = config_page2.ControllerResetTO; in mprsas_add_pcie_device()
1349 targ->encl_level_valid = TRUE; in mprsas_add_pcie_device()
1350 targ->handle = handle; in mprsas_add_pcie_device()
1351 targ->parent_handle = le16toh(config_page.ParentDevHandle); in mprsas_add_pcie_device()
1352 targ->sasaddr = mpr_to_u64(&config_page.WWID); in mprsas_add_pcie_device()
1353 targ->parent_sasaddr = le64toh(parent_wwid); in mprsas_add_pcie_device()
1354 targ->parent_devinfo = parent_devinfo; in mprsas_add_pcie_device()
1355 targ->tid = id; in mprsas_add_pcie_device()
1356 targ->linkrate = linkrate; in mprsas_add_pcie_device()
1357 targ->flags = 0; in mprsas_add_pcie_device()
1362 targ->scsi_req_desc_type = in mprsas_add_pcie_device()
1365 TAILQ_INIT(&targ->commands); in mprsas_add_pcie_device()
1366 TAILQ_INIT(&targ->timedout_commands); in mprsas_add_pcie_device()
1367 while (!SLIST_EMPTY(&targ->luns)) { in mprsas_add_pcie_device()
1368 lun = SLIST_FIRST(&targ->luns); in mprsas_add_pcie_device()
1369 SLIST_REMOVE_HEAD(&targ->luns, lun_link); in mprsas_add_pcie_device()
1372 SLIST_INIT(&targ->luns); in mprsas_add_pcie_device()
1374 mpr_describe_devinfo(targ->devinfo, devstring, 80); in mprsas_add_pcie_device()
1377 mpr_describe_table(mpr_pcie_linkrate_names, targ->linkrate), in mprsas_add_pcie_device()
1378 targ->handle, targ->encl_handle, targ->encl_slot); in mprsas_add_pcie_device()
1379 if (targ->encl_level_valid) { in mprsas_add_pcie_device()
1381 "and connector name (%4s)\n", targ->encl_level, in mprsas_add_pcie_device()
1382 targ->connector_name); in mprsas_add_pcie_device()
1385 mpr_dprint(sc, MPR_MAPPING, "Target id 0x%x added\n", targ->tid); in mprsas_add_pcie_device()
1402 sassc = sc->sassc; in mprsas_volume_add()
1407 printf("%s: invalid WWID; cannot add volume to mapping table\n", in mprsas_volume_add()
1415 printf("%s: could not get ID for volume with handle 0x%04x and " in mprsas_volume_add()
1422 targ = &sassc->targets[id]; in mprsas_volume_add()
1423 targ->tid = id; in mprsas_volume_add()
1424 targ->handle = handle; in mprsas_volume_add()
1425 targ->devname = wwid; in mprsas_volume_add()
1426 targ->flags = MPR_TARGET_FLAGS_VOLUME; in mprsas_volume_add()
1427 TAILQ_INIT(&targ->commands); in mprsas_volume_add()
1428 TAILQ_INIT(&targ->timedout_commands); in mprsas_volume_add()
1429 while (!SLIST_EMPTY(&targ->luns)) { in mprsas_volume_add()
1430 lun = SLIST_FIRST(&targ->luns); in mprsas_volume_add()
1431 SLIST_REMOVE_HEAD(&targ->luns, lun_link); in mprsas_volume_add()
1434 SLIST_INIT(&targ->luns); in mprsas_volume_add()
1437 targ->tid, wwid); in mprsas_volume_add()
1448 * SATA direct-access device. This helps to ensure that data corruption is
1457 struct mprsas_softc *sassc = sc->sassc; in mprsas_SSU_to_SATA_devices()
1459 path_id_t pathid = cam_sim_path(sassc->sim); in mprsas_SSU_to_SATA_devices()
1470 sc->SSU_started = TRUE; in mprsas_SSU_to_SATA_devices()
1471 sc->SSU_refcount = 0; in mprsas_SSU_to_SATA_devices()
1472 for (targetid = 0; targetid < sc->max_devices; targetid++) { in mprsas_SSU_to_SATA_devices()
1473 target = &sassc->targets[targetid]; in mprsas_SSU_to_SATA_devices()
1474 if (target->handle == 0x0) { in mprsas_SSU_to_SATA_devices()
1480 * a SATA direct-access end device. in mprsas_SSU_to_SATA_devices()
1482 if (target->stop_at_shutdown) { in mprsas_SSU_to_SATA_devices()
1490 if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, in mprsas_SSU_to_SATA_devices()
1498 xpt_path_string(ccb->ccb_h.path, path_str, in mprsas_SSU_to_SATA_devices()
1502 "handle %d\n", path_str, target->handle); in mprsas_SSU_to_SATA_devices()
1510 sc->SSU_refcount++; in mprsas_SSU_to_SATA_devices()
1511 ccb->ccb_h.target_id = in mprsas_SSU_to_SATA_devices()
1512 xpt_path_target_id(ccb->ccb_h.path); in mprsas_SSU_to_SATA_devices()
1513 ccb->ccb_h.ppriv_ptr1 = sassc; in mprsas_SSU_to_SATA_devices()
1514 scsi_start_stop(&ccb->csio, in mprsas_SSU_to_SATA_devices()
1543 while (sc->SSU_refcount > 0) { in mprsas_SSU_to_SATA_devices()
1546 xpt_sim_poll(sassc->sim); in mprsas_SSU_to_SATA_devices()
1548 if (--timeout == 0) { in mprsas_SSU_to_SATA_devices()
1565 sassc = (struct mprsas_softc *)done_ccb->ccb_h.ppriv_ptr1; in mprsas_stop_unit_done()
1567 xpt_path_string(done_ccb->ccb_h.path, path_str, sizeof(path_str)); in mprsas_stop_unit_done()
1568 mpr_dprint(sassc->sc, MPR_INFO, "Completing stop unit for %s\n", in mprsas_stop_unit_done()
1576 xpt_free_path(done_ccb->ccb_h.path); in mprsas_stop_unit_done()
1581 * mprsas_ir_shutdown - IR shutdown notification
1593 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in mprsas_ir_shutdown()
1605 if (!sc->ir_firmware) in mprsas_ir_shutdown()
1609 // TODO-later, this should be looked up in the RAID config structure in mprsas_ir_shutdown()
1611 volume_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) & in mprsas_ir_shutdown()
1618 start_idx = sc->max_devices - sc->max_volumes; in mprsas_ir_shutdown()
1619 end_idx = start_idx + sc->max_volumes - 1; in mprsas_ir_shutdown()
1622 mt_entry = &sc->mapping_table[id]; in mprsas_ir_shutdown()
1623 if ((mt_entry->physical_id != 0) && in mprsas_ir_shutdown()
1624 (mt_entry->missing_count == 0)) { in mprsas_ir_shutdown()
1638 action = (MPI2_RAID_ACTION_REQUEST *)cm->cm_req; in mprsas_ir_shutdown()
1639 action->Function = MPI2_FUNCTION_RAID_ACTION; in mprsas_ir_shutdown()
1640 action->Action = MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED; in mprsas_ir_shutdown()
1641 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; in mprsas_ir_shutdown()
1664 for (targetid = 0; targetid < sc->max_devices; targetid++) { in mprsas_ir_shutdown()
1665 target = &sc->sassc->targets[targetid]; in mprsas_ir_shutdown()
1666 if (target->handle == 0x0) { in mprsas_ir_shutdown()
1670 if (target->supports_SSU) { in mprsas_ir_shutdown()
1671 switch (sc->enable_ssu) { in mprsas_ir_shutdown()
1673 target->stop_at_shutdown = FALSE; in mprsas_ir_shutdown()
1676 target->stop_at_shutdown = TRUE; in mprsas_ir_shutdown()
1677 if (target->flags & MPR_TARGET_IS_SATA_SSD) { in mprsas_ir_shutdown()
1678 target->stop_at_shutdown = FALSE; in mprsas_ir_shutdown()
1682 target->stop_at_shutdown = TRUE; in mprsas_ir_shutdown()
1686 target->stop_at_shutdown = TRUE; in mprsas_ir_shutdown()
1687 if ((target->flags & in mprsas_ir_shutdown()
1689 target->stop_at_shutdown = FALSE; in mprsas_ir_shutdown()