Lines Matching +full:per +full:- +full:device

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
62 * _mapping_clear_map_entry - Clear a particular mapping entry.
70 map_entry->physical_id = 0; in _mapping_clear_map_entry()
71 map_entry->device_info = 0; in _mapping_clear_map_entry()
72 map_entry->phy_bits = 0; in _mapping_clear_map_entry()
73 map_entry->dpm_entry_num = MPR_DPM_BAD_IDX; in _mapping_clear_map_entry()
74 map_entry->dev_handle = 0; in _mapping_clear_map_entry()
75 map_entry->id = -1; in _mapping_clear_map_entry()
76 map_entry->missing_count = 0; in _mapping_clear_map_entry()
77 map_entry->init_complete = 0; in _mapping_clear_map_entry()
78 map_entry->TLR_bits = (u8)MPI2_SCSIIO_CONTROL_NO_TLR; in _mapping_clear_map_entry()
82 * _mapping_clear_enc_entry - Clear a particular enclosure table entry.
90 enc_entry->enclosure_id = 0; in _mapping_clear_enc_entry()
91 enc_entry->start_index = MPR_MAPTABLE_BAD_IDX; in _mapping_clear_enc_entry()
92 enc_entry->phy_bits = 0; in _mapping_clear_enc_entry()
93 enc_entry->dpm_entry_num = MPR_DPM_BAD_IDX; in _mapping_clear_enc_entry()
94 enc_entry->enc_handle = 0; in _mapping_clear_enc_entry()
95 enc_entry->num_slots = 0; in _mapping_clear_enc_entry()
96 enc_entry->start_slot = 0; in _mapping_clear_enc_entry()
97 enc_entry->missing_count = 0; in _mapping_clear_enc_entry()
98 enc_entry->removal_flag = 0; in _mapping_clear_enc_entry()
99 enc_entry->skip_search = 0; in _mapping_clear_enc_entry()
100 enc_entry->init_complete = 0; in _mapping_clear_enc_entry()
104 * _mapping_commit_enc_entry - write a particular enc entry in DPM page0.
105 * @sc: per adapter object
108 * Returns 0 for success, non-zero for failure.
119 if (!sc->is_dpm_enable) in _mapping_commit_enc_entry()
123 memcpy(&config_page.Header, (u8 *) sc->dpm_pg0, in _mapping_commit_enc_entry()
125 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in _mapping_commit_enc_entry()
127 dpm_entry += et_entry->dpm_entry_num; in _mapping_commit_enc_entry()
128 dpm_entry->PhysicalIdentifier.Low = in _mapping_commit_enc_entry()
129 ( 0xFFFFFFFF & et_entry->enclosure_id); in _mapping_commit_enc_entry()
130 dpm_entry->PhysicalIdentifier.High = in _mapping_commit_enc_entry()
131 ( et_entry->enclosure_id >> 32); in _mapping_commit_enc_entry()
132 mt_entry = &sc->mapping_table[et_entry->start_index]; in _mapping_commit_enc_entry()
133 dpm_entry->DeviceIndex = htole16(mt_entry->id); in _mapping_commit_enc_entry()
134 dpm_entry->MappingInformation = et_entry->num_slots; in _mapping_commit_enc_entry()
135 dpm_entry->MappingInformation <<= MPI2_DRVMAP0_MAPINFO_SLOT_SHIFT; in _mapping_commit_enc_entry()
136 dpm_entry->MappingInformation |= et_entry->missing_count; in _mapping_commit_enc_entry()
137 dpm_entry->MappingInformation = htole16(dpm_entry->MappingInformation); in _mapping_commit_enc_entry()
138 dpm_entry->PhysicalBitsMapping = htole32(et_entry->phy_bits); in _mapping_commit_enc_entry()
139 dpm_entry->Reserved1 = 0; in _mapping_commit_enc_entry()
142 __func__, et_entry->dpm_entry_num); in _mapping_commit_enc_entry()
146 et_entry->dpm_entry_num)) { in _mapping_commit_enc_entry()
149 et_entry->dpm_entry_num); in _mapping_commit_enc_entry()
150 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_commit_enc_entry()
152 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_commit_enc_entry()
153 dpm_entry->PhysicalBitsMapping = in _mapping_commit_enc_entry()
154 le32toh(dpm_entry->PhysicalBitsMapping); in _mapping_commit_enc_entry()
155 return -1; in _mapping_commit_enc_entry()
157 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_commit_enc_entry()
159 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_commit_enc_entry()
160 dpm_entry->PhysicalBitsMapping = in _mapping_commit_enc_entry()
161 le32toh(dpm_entry->PhysicalBitsMapping); in _mapping_commit_enc_entry()
166 * _mapping_commit_map_entry - write a particular map table entry in DPM page0.
167 * @sc: per adapter object
170 * Returns 0 for success, non-zero for failure.
181 if (!sc->is_dpm_enable) in _mapping_commit_map_entry()
186 * can happen if the Map Entry is a for a missing device and the DPM in _mapping_commit_map_entry()
187 * entry that was being used by this device is now being used by some in _mapping_commit_map_entry()
188 * new device. So, check for a BAD DPM index and just return if so. in _mapping_commit_map_entry()
190 if (mt_entry->dpm_entry_num == MPR_DPM_BAD_IDX) { in _mapping_commit_map_entry()
193 mt_entry->id); in _mapping_commit_map_entry()
198 memcpy(&config_page.Header, (u8 *)sc->dpm_pg0, in _mapping_commit_map_entry()
200 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *) sc->dpm_pg0 + in _mapping_commit_map_entry()
202 dpm_entry = dpm_entry + mt_entry->dpm_entry_num; in _mapping_commit_map_entry()
203 dpm_entry->PhysicalIdentifier.Low = (0xFFFFFFFF & in _mapping_commit_map_entry()
204 mt_entry->physical_id); in _mapping_commit_map_entry()
205 dpm_entry->PhysicalIdentifier.High = (mt_entry->physical_id >> 32); in _mapping_commit_map_entry()
206 dpm_entry->DeviceIndex = htole16(mt_entry->id); in _mapping_commit_map_entry()
207 dpm_entry->MappingInformation = htole16(mt_entry->missing_count); in _mapping_commit_map_entry()
208 dpm_entry->PhysicalBitsMapping = 0; in _mapping_commit_map_entry()
209 dpm_entry->Reserved1 = 0; in _mapping_commit_map_entry()
214 __func__, mt_entry->dpm_entry_num, mt_entry->id); in _mapping_commit_map_entry()
216 mt_entry->dpm_entry_num)) { in _mapping_commit_map_entry()
219 mt_entry->dpm_entry_num, mt_entry->id); in _mapping_commit_map_entry()
220 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_commit_map_entry()
222 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_commit_map_entry()
223 return -1; in _mapping_commit_map_entry()
226 dpm_entry->MappingInformation = le16toh(dpm_entry->MappingInformation); in _mapping_commit_map_entry()
227 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_commit_map_entry()
232 * _mapping_get_ir_maprange - get start and end index for IR map range.
233 * @sc: per adapter object
239 * in the device mapping table
247 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_get_ir_maprange()
249 volume_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) & in _mapping_get_ir_maprange()
256 *start_idx = sc->max_devices - sc->max_volumes; in _mapping_get_ir_maprange()
257 *end_idx = *start_idx + sc->max_volumes - 1; in _mapping_get_ir_maprange()
261 * _mapping_get_enc_idx_from_id - get enclosure index from enclosure ID
262 * @sc: per adapter object
274 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; enc_idx++) { in _mapping_get_enc_idx_from_id()
275 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_get_enc_idx_from_id()
276 if ((et_entry->enclosure_id == le64toh(enc_id)) && in _mapping_get_enc_idx_from_id()
277 (!et_entry->phy_bits || (et_entry->phy_bits & in _mapping_get_enc_idx_from_id()
285 * _mapping_get_enc_idx_from_handle - get enclosure index from handle
286 * @sc: per adapter object
297 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; enc_idx++) { in _mapping_get_enc_idx_from_handle()
298 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_get_enc_idx_from_handle()
299 if (et_entry->missing_count) in _mapping_get_enc_idx_from_handle()
301 if (et_entry->enc_handle == handle) in _mapping_get_enc_idx_from_handle()
308 * _mapping_get_high_missing_et_idx - get missing enclosure index
309 * @sc: per adapter object
323 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; enc_idx++) { in _mapping_get_high_missing_et_idx()
324 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_get_high_missing_et_idx()
325 if ((et_entry->missing_count > high_missing_count) && in _mapping_get_high_missing_et_idx()
326 !et_entry->skip_search) { in _mapping_get_high_missing_et_idx()
327 high_missing_count = et_entry->missing_count; in _mapping_get_high_missing_et_idx()
335 * _mapping_get_high_missing_mt_idx - get missing map table index
336 * @sc: per adapter object
338 * Search through the map table and identifies the device entry
350 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_get_high_missing_mt_idx()
355 end_idx = sc->max_devices; in _mapping_get_high_missing_mt_idx()
358 if (sc->ir_firmware) { in _mapping_get_high_missing_mt_idx()
365 mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_high_missing_mt_idx()
367 if (mt_entry->missing_count > high_missing_count) { in _mapping_get_high_missing_mt_idx()
368 high_missing_count = mt_entry->missing_count; in _mapping_get_high_missing_mt_idx()
376 * _mapping_get_ir_mt_idx_from_wwid - get map table index from volume WWID
377 * @sc: per adapter object
389 mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_ir_mt_idx_from_wwid()
391 if (mt_entry->physical_id == wwid) in _mapping_get_ir_mt_idx_from_wwid()
398 * _mapping_get_mt_idx_from_id - get map table index from a device ID
399 * @sc: per adapter object
400 * @dev_id: device identifer (SAS Address)
410 for (map_idx = 0; map_idx < sc->max_devices; map_idx++) { in _mapping_get_mt_idx_from_id()
411 mt_entry = &sc->mapping_table[map_idx]; in _mapping_get_mt_idx_from_id()
412 if (mt_entry->physical_id == dev_id) in _mapping_get_mt_idx_from_id()
419 * _mapping_get_ir_mt_idx_from_handle - get map table index from volume handle
420 * @sc: per adapter object
421 * @wwid: volume device handle
432 mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_ir_mt_idx_from_handle()
434 if (mt_entry->dev_handle == volHandle) in _mapping_get_ir_mt_idx_from_handle()
441 * _mapping_get_mt_idx_from_handle - get map table index from handle
442 * @sc: per adapter object
443 * @dev_id: device handle
453 for (map_idx = 0; map_idx < sc->max_devices; map_idx++) { in _mapping_get_mt_idx_from_handle()
454 mt_entry = &sc->mapping_table[map_idx]; in _mapping_get_mt_idx_from_handle()
455 if (mt_entry->dev_handle == handle) in _mapping_get_mt_idx_from_handle()
462 * _mapping_get_free_ir_mt_idx - get first free index for a volume
463 * @sc: per adapter object
486 mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_free_ir_mt_idx()
488 if (!(mt_entry->device_info & MPR_MAP_IN_USE)) in _mapping_get_free_ir_mt_idx()
491 if (mt_entry->missing_count > high_missing_count) { in _mapping_get_free_ir_mt_idx()
492 high_missing_count = mt_entry->missing_count; in _mapping_get_free_ir_mt_idx()
507 * _mapping_get_free_mt_idx - get first free index for a device
508 * @sc: per adapter object
516 u32 map_idx, max_idx = sc->max_devices; in _mapping_get_free_mt_idx()
517 struct dev_mapping_table *mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_free_mt_idx()
520 volume_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) & in _mapping_get_free_mt_idx()
522 if (sc->ir_firmware && (volume_mapping_flags == in _mapping_get_free_mt_idx()
524 max_idx -= sc->max_volumes; in _mapping_get_free_mt_idx()
527 if (!(mt_entry->device_info & (MPR_MAP_IN_USE | in _mapping_get_free_mt_idx()
535 * _mapping_get_dpm_idx_from_id - get DPM index from ID
536 * @sc: per adapter object
537 * @id: volume WWID or enclosure ID or device ID
548 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in _mapping_get_dpm_idx_from_id()
550 PhysicalIdentifier = dpm_entry->PhysicalIdentifier.High; in _mapping_get_dpm_idx_from_id()
552 dpm_entry->PhysicalIdentifier.Low; in _mapping_get_dpm_idx_from_id()
553 for (entry_num = 0; entry_num < sc->max_dpm_entries; entry_num++, in _mapping_get_dpm_idx_from_id()
556 (!phy_bits || !dpm_entry->PhysicalBitsMapping || in _mapping_get_dpm_idx_from_id()
557 (phy_bits & dpm_entry->PhysicalBitsMapping))) in _mapping_get_dpm_idx_from_id()
564 * _mapping_get_free_dpm_idx - get first available DPM index
565 * @sc: per adapter object
579 for (entry_num = 0; entry_num < sc->max_dpm_entries; entry_num++) { in _mapping_get_free_dpm_idx()
580 dpm_entry = (Mpi2DriverMap0Entry_t *) ((u8 *)sc->dpm_pg0 + in _mapping_get_free_dpm_idx()
583 missing_cnt = dpm_entry->MappingInformation & in _mapping_get_free_dpm_idx()
590 if (sc->dpm_entry_used[entry_num] && !missing_cnt) in _mapping_get_free_dpm_idx()
599 if (!sc->dpm_entry_used[entry_num]) { in _mapping_get_free_dpm_idx()
612 * it means that some device was already using this entry but it's in _mapping_get_free_dpm_idx()
614 * device's DPM entry and the mapping table needs to be cleared. To do in _mapping_get_free_dpm_idx()
615 * this, use the Physical ID of the old device still in the DPM entry in _mapping_get_free_dpm_idx()
619 sc->dpm_entry_used[current_entry]) { in _mapping_get_free_dpm_idx()
620 dpm_entry = (Mpi2DriverMap0Entry_t *) ((u8 *)sc->dpm_pg0 + in _mapping_get_free_dpm_idx()
623 physical_id = dpm_entry->PhysicalIdentifier.High; in _mapping_get_free_dpm_idx()
625 dpm_entry->PhysicalIdentifier.Low; in _mapping_get_free_dpm_idx()
628 mt_entry = &sc->mapping_table[map_idx]; in _mapping_get_free_dpm_idx()
629 mt_entry->dpm_entry_num = MPR_DPM_BAD_IDX; in _mapping_get_free_dpm_idx()
636 * _mapping_update_ir_missing_cnt - Updates missing count for a volume
637 * @sc: per adapter object
651 u8 missing_cnt, reason = element->ReasonCode, update_dpm = 1; in _mapping_update_ir_missing_cnt()
664 mt_entry = &sc->mapping_table[map_idx]; in _mapping_update_ir_missing_cnt()
665 mt_entry->init_complete = 1; in _mapping_update_ir_missing_cnt()
668 mt_entry->missing_count = 0; in _mapping_update_ir_missing_cnt()
670 if (mt_entry->missing_count < MPR_MAX_MISSING_COUNT) in _mapping_update_ir_missing_cnt()
671 mt_entry->missing_count++; in _mapping_update_ir_missing_cnt()
673 mt_entry->device_info &= ~MPR_MAP_IN_USE; in _mapping_update_ir_missing_cnt()
674 mt_entry->dev_handle = 0; in _mapping_update_ir_missing_cnt()
683 if (!sc->is_dpm_enable) in _mapping_update_ir_missing_cnt()
685 dpm_idx = mt_entry->dpm_entry_num; in _mapping_update_ir_missing_cnt()
703 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in _mapping_update_ir_missing_cnt()
706 missing_cnt = dpm_entry->MappingInformation & in _mapping_update_ir_missing_cnt()
708 if ((mt_entry->physical_id == in _mapping_update_ir_missing_cnt()
709 le64toh(((u64)dpm_entry->PhysicalIdentifier.High << 32) | in _mapping_update_ir_missing_cnt()
710 (u64)dpm_entry->PhysicalIdentifier.Low)) && (missing_cnt == in _mapping_update_ir_missing_cnt()
711 mt_entry->missing_count)) { in _mapping_update_ir_missing_cnt()
714 __func__, mt_entry->id); in _mapping_update_ir_missing_cnt()
726 "with target ID %d.\n", __func__, mt_entry->id); in _mapping_update_ir_missing_cnt()
727 mt_entry->dpm_entry_num = dpm_idx; in _mapping_update_ir_missing_cnt()
728 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in _mapping_update_ir_missing_cnt()
731 dpm_entry->PhysicalIdentifier.Low = in _mapping_update_ir_missing_cnt()
732 (0xFFFFFFFF & mt_entry->physical_id); in _mapping_update_ir_missing_cnt()
733 dpm_entry->PhysicalIdentifier.High = in _mapping_update_ir_missing_cnt()
734 (mt_entry->physical_id >> 32); in _mapping_update_ir_missing_cnt()
735 dpm_entry->DeviceIndex = map_idx; in _mapping_update_ir_missing_cnt()
736 dpm_entry->MappingInformation = mt_entry->missing_count; in _mapping_update_ir_missing_cnt()
737 dpm_entry->PhysicalBitsMapping = 0; in _mapping_update_ir_missing_cnt()
738 dpm_entry->Reserved1 = 0; in _mapping_update_ir_missing_cnt()
739 sc->dpm_flush_entry[dpm_idx] = 1; in _mapping_update_ir_missing_cnt()
740 sc->dpm_entry_used[dpm_idx] = 1; in _mapping_update_ir_missing_cnt()
744 __func__, mt_entry->id); in _mapping_update_ir_missing_cnt()
749 * _mapping_add_to_removal_table - add DPM index to the removal table
750 * @sc: per adapter object
767 if (!sc->is_dpm_enable) in _mapping_add_to_removal_table()
774 remove_entry = sc->removal_table; in _mapping_add_to_removal_table()
775 for (i = 0; i < sc->max_devices; i++, remove_entry++) { in _mapping_add_to_removal_table()
776 if (remove_entry->dpm_entry_num != MPR_DPM_BAD_IDX) in _mapping_add_to_removal_table()
781 remove_entry->dpm_entry_num = dpm_idx; in _mapping_add_to_removal_table()
789 * @sc: per adapter object
790 * @map_idx: index into the mapping table for the device that is missing
793 * device that is not responding. If Persitent Mapping is used, increment the
805 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_inc_missing_count()
810 mpr_dprint(sc, MPR_INFO | MPR_MAPPING, "%s: device is already " in _mapping_inc_missing_count()
814 mt_entry = &sc->mapping_table[map_idx]; in _mapping_inc_missing_count()
815 if (mt_entry->missing_count < MPR_MAX_MISSING_COUNT) in _mapping_inc_missing_count()
816 mt_entry->missing_count++; in _mapping_inc_missing_count()
819 * When using Enc/Slot mapping, when a device is removed, it's mapping in _mapping_inc_missing_count()
821 * be incorrect if this same device is re-added to a different slot. in _mapping_inc_missing_count()
829 * When using device mapping, update the missing count in the DPM entry, in _mapping_inc_missing_count()
834 sc->is_dpm_enable && in _mapping_inc_missing_count()
835 mt_entry->dpm_entry_num != MPR_DPM_BAD_IDX) { in _mapping_inc_missing_count()
836 dpm_entry = (Mpi2DriverMap0Entry_t *) ((u8 *)sc->dpm_pg0 + in _mapping_inc_missing_count()
838 dpm_entry += mt_entry->dpm_entry_num; in _mapping_inc_missing_count()
839 if (dpm_entry->MappingInformation != mt_entry->missing_count) { in _mapping_inc_missing_count()
840 dpm_entry->MappingInformation = mt_entry->missing_count; in _mapping_inc_missing_count()
841 sc->dpm_flush_entry[mt_entry->dpm_entry_num] = 1; in _mapping_inc_missing_count()
847 * _mapping_update_missing_count - Update missing count for a device
848 * @sc: per adapter object
851 * Search through the topology change list and if any device is found not
864 for (entry = 0; entry < topo_change->num_entries; entry++) { in _mapping_update_missing_count()
865 phy_change = &topo_change->phy_details[entry]; in _mapping_update_missing_count()
866 if (!phy_change->dev_handle || (phy_change->reason != in _mapping_update_missing_count()
869 map_idx = _mapping_get_mt_idx_from_handle(sc, phy_change-> in _mapping_update_missing_count()
871 phy_change->is_processed = 1; in _mapping_update_missing_count()
877 * _mapping_update_pcie_missing_count - Update missing count for a PCIe device
878 * @sc: per adapter object
881 * Search through the PCIe topology change list and if any device is found not
894 for (entry = 0; entry < topo_change->num_entries; entry++) { in _mapping_update_pcie_missing_count()
895 port_change = &topo_change->port_details[entry]; in _mapping_update_pcie_missing_count()
896 if (!port_change->dev_handle || (port_change->reason != in _mapping_update_pcie_missing_count()
899 map_idx = _mapping_get_mt_idx_from_handle(sc, port_change-> in _mapping_update_pcie_missing_count()
901 port_change->is_processed = 1; in _mapping_update_pcie_missing_count()
907 * _mapping_find_enc_map_space -find map table entries for enclosure
908 * @sc: per adapter object
927 u16 max_num_phy_ids = le16toh(sc->ioc_pg8.MaxNumPhysicalMappedIDs); in _mapping_find_enc_map_space()
929 skip_count = sc->num_rsvd_entries; in _mapping_find_enc_map_space()
932 vol_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) & in _mapping_find_enc_map_space()
939 if (!sc->ir_firmware) in _mapping_find_enc_map_space()
940 end_of_table = sc->max_devices; in _mapping_find_enc_map_space()
942 end_of_table = sc->max_devices; in _mapping_find_enc_map_space()
944 end_of_table = sc->max_devices - sc->max_volumes; in _mapping_find_enc_map_space()
953 * enclosure and the device that is already mapped. in _mapping_find_enc_map_space()
959 mt_entry = &sc->mapping_table[map_idx]; in _mapping_find_enc_map_space()
960 if ((et_entry->enclosure_id == mt_entry->physical_id) && in _mapping_find_enc_map_space()
961 (!mt_entry->phy_bits || (mt_entry->phy_bits & in _mapping_find_enc_map_space()
962 et_entry->phy_bits))) { in _mapping_find_enc_map_space()
964 if (num_found == et_entry->num_slots) { in _mapping_find_enc_map_space()
965 start_idx = (map_idx - num_found) + 1; in _mapping_find_enc_map_space()
983 mt_entry = &sc->mapping_table[map_idx]; in _mapping_find_enc_map_space()
984 if (!(mt_entry->device_info & MPR_DEV_RESERVED)) { in _mapping_find_enc_map_space()
986 if (num_found == et_entry->num_slots) { in _mapping_find_enc_map_space()
987 start_idx = (map_idx - num_found) + 1; in _mapping_find_enc_map_space()
1023 enc_entry = &sc->enclosure_table[enc_idx]; in _mapping_find_enc_map_space()
1024 enc_entry->skip_search = 1; in _mapping_find_enc_map_space()
1027 * Unmark all of the missing enclosure's device's reserved in _mapping_find_enc_map_space()
1033 mt_entry = &sc->mapping_table[enc_entry->start_index]; in _mapping_find_enc_map_space()
1034 for (map_idx = enc_entry->start_index; map_idx < in _mapping_find_enc_map_space()
1035 (enc_entry->start_index + enc_entry->num_slots); map_idx++, in _mapping_find_enc_map_space()
1037 mt_entry->device_info &= ~MPR_DEV_RESERVED; in _mapping_find_enc_map_space()
1049 mt_entry = &sc->mapping_table[map_idx]; in _mapping_find_enc_map_space()
1050 if (!(mt_entry->device_info & MPR_DEV_RESERVED)) { in _mapping_find_enc_map_space()
1052 if (num_found == et_entry->num_slots) { in _mapping_find_enc_map_space()
1053 start_idx = (map_idx - num_found) + 1; in _mapping_find_enc_map_space()
1075 enc_entry = sc->enclosure_table; in _mapping_find_enc_map_space()
1076 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; in _mapping_find_enc_map_space()
1078 if (map_idx < enc_entry->start_index || in _mapping_find_enc_map_space()
1079 map_idx > (enc_entry->start_index + in _mapping_find_enc_map_space()
1080 enc_entry->num_slots)) in _mapping_find_enc_map_space()
1082 if (!enc_entry->removal_flag) { in _mapping_find_enc_map_space()
1087 enc_entry->removal_flag = 1; in _mapping_find_enc_map_space()
1089 enc_entry->dpm_entry_num); in _mapping_find_enc_map_space()
1091 mt_entry = &sc->mapping_table[map_idx]; in _mapping_find_enc_map_space()
1093 if (map_idx == (enc_entry->start_index + in _mapping_find_enc_map_space()
1094 enc_entry->num_slots - 1)) in _mapping_find_enc_map_space()
1108 enc_entry = sc->enclosure_table; in _mapping_find_enc_map_space()
1109 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; in _mapping_find_enc_map_space()
1111 if (!enc_entry->removal_flag) { in _mapping_find_enc_map_space()
1115 mt_entry = &sc->mapping_table[enc_entry-> in _mapping_find_enc_map_space()
1117 for (map_idx = enc_entry->start_index; map_idx < in _mapping_find_enc_map_space()
1118 (enc_entry->start_index + in _mapping_find_enc_map_space()
1119 enc_entry->num_slots); map_idx++, in _mapping_find_enc_map_space()
1121 mt_entry->device_info |= in _mapping_find_enc_map_space()
1123 et_entry->skip_search = 0; in _mapping_find_enc_map_space()
1132 * _mapping_get_dev_info -get information about newly added devices
1133 * @sc: per adapter object
1136 * Search through the topology change event list and issues sas device pg0
1137 * requests for the newly added device and reserved entries in tables
1145 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_get_dev_info()
1157 for (entry = 0; entry < topo_change->num_entries; entry++) { in _mapping_get_dev_info()
1158 phy_change = &topo_change->phy_details[entry]; in _mapping_get_dev_info()
1159 if (phy_change->is_processed || !phy_change->dev_handle || in _mapping_get_dev_info()
1160 phy_change->reason != MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED) in _mapping_get_dev_info()
1165 phy_change->dev_handle)) { in _mapping_get_dev_info()
1166 phy_change->is_processed = 1; in _mapping_get_dev_info()
1182 &sas_address, phy_change->dev_handle, device_info, in _mapping_get_dev_info()
1183 &phy_change->is_SATA_SSD); in _mapping_get_dev_info()
1187 "for SATA device with handle 0x%04x\n", in _mapping_get_dev_info()
1188 __func__, phy_change->dev_handle); in _mapping_get_dev_info()
1192 phy_change->physical_id = sas_address; in _mapping_get_dev_info()
1193 phy_change->slot = le16toh(sas_device_pg0.Slot); in _mapping_get_dev_info()
1194 phy_change->device_info = device_info; in _mapping_get_dev_info()
1197 * When using Enc/Slot mapping, if this device is an enclosure in _mapping_get_dev_info()
1209 topo_change->enc_handle); in _mapping_get_dev_info()
1211 phy_change->is_processed = 1; in _mapping_get_dev_info()
1213 "failed to add the device with handle " in _mapping_get_dev_info()
1216 phy_change->dev_handle, in _mapping_get_dev_info()
1217 topo_change->enc_handle); in _mapping_get_dev_info()
1220 if (!((phy_change->device_info & in _mapping_get_dev_info()
1222 (phy_change->device_info & in _mapping_get_dev_info()
1226 phy_change->is_processed = 1; in _mapping_get_dev_info()
1229 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_get_dev_info()
1235 if (et_entry->start_index != MPR_MAPTABLE_BAD_IDX) in _mapping_get_dev_info()
1244 if (!topo_change->exp_handle) { in _mapping_get_dev_info()
1245 map_idx = sc->num_rsvd_entries; in _mapping_get_dev_info()
1246 et_entry->start_index = map_idx; in _mapping_get_dev_info()
1250 et_entry->start_index = map_idx; in _mapping_get_dev_info()
1262 if (et_entry->start_index == in _mapping_get_dev_info()
1270 (uintmax_t)et_entry->enclosure_id); in _mapping_get_dev_info()
1271 phy_change->is_processed = 1; in _mapping_get_dev_info()
1273 topo_change->num_entries; in _mapping_get_dev_info()
1276 &topo_change->phy_details in _mapping_get_dev_info()
1278 if (tmp_phy_change->reason == in _mapping_get_dev_info()
1280 tmp_phy_change-> in _mapping_get_dev_info()
1294 " %d.\n", __func__, et_entry->num_slots, map_idx); in _mapping_get_dev_info()
1295 mt_entry = &sc->mapping_table[map_idx]; in _mapping_get_dev_info()
1296 for (index = map_idx; index < (et_entry->num_slots in _mapping_get_dev_info()
1298 mt_entry->device_info = MPR_DEV_RESERVED; in _mapping_get_dev_info()
1299 mt_entry->physical_id = et_entry->enclosure_id; in _mapping_get_dev_info()
1300 mt_entry->phy_bits = et_entry->phy_bits; in _mapping_get_dev_info()
1301 mt_entry->missing_count = 0; in _mapping_get_dev_info()
1308 * _mapping_get_pcie_dev_info -get information about newly added PCIe devices
1309 * @sc: per adapter object
1312 * Searches through the PCIe topology change event list and issues PCIe device
1313 * pg0 requests for the newly added PCIe device. If the device is in an
1315 * device and reserve that space.
1323 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_get_pcie_dev_info()
1334 for (entry = 0; entry < topo_change->num_entries; entry++) { in _mapping_get_pcie_dev_info()
1335 port_change = &topo_change->port_details[entry]; in _mapping_get_pcie_dev_info()
1336 if (port_change->is_processed || !port_change->dev_handle || in _mapping_get_pcie_dev_info()
1337 port_change->reason != MPI26_EVENT_PCIE_TOPO_PS_DEV_ADDED) in _mapping_get_pcie_dev_info()
1341 port_change->dev_handle)) { in _mapping_get_pcie_dev_info()
1342 port_change->is_processed = 1; in _mapping_get_pcie_dev_info()
1348 port_change->physical_id = pcie_wwid; in _mapping_get_pcie_dev_info()
1349 port_change->slot = le16toh(pcie_device_pg0.Slot); in _mapping_get_pcie_dev_info()
1350 port_change->device_info = le32toh(pcie_device_pg0.DeviceInfo); in _mapping_get_pcie_dev_info()
1353 * When using Enc/Slot mapping, if this device is an enclosure in _mapping_get_pcie_dev_info()
1365 topo_change->enc_handle); in _mapping_get_pcie_dev_info()
1367 port_change->is_processed = 1; in _mapping_get_pcie_dev_info()
1369 "failed to add the device with handle " in _mapping_get_pcie_dev_info()
1372 port_change->dev_handle, in _mapping_get_pcie_dev_info()
1373 topo_change->enc_handle); in _mapping_get_pcie_dev_info()
1376 if (!(port_change->device_info & in _mapping_get_pcie_dev_info()
1378 port_change->is_processed = 1; in _mapping_get_pcie_dev_info()
1381 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_get_pcie_dev_info()
1387 if (et_entry->start_index != MPR_MAPTABLE_BAD_IDX) in _mapping_get_pcie_dev_info()
1396 if (!topo_change->switch_dev_handle) { in _mapping_get_pcie_dev_info()
1397 map_idx = sc->num_rsvd_entries; in _mapping_get_pcie_dev_info()
1398 et_entry->start_index = map_idx; in _mapping_get_pcie_dev_info()
1402 et_entry->start_index = map_idx; in _mapping_get_pcie_dev_info()
1414 if (et_entry->start_index == in _mapping_get_pcie_dev_info()
1422 (uintmax_t)et_entry->enclosure_id); in _mapping_get_pcie_dev_info()
1423 port_change->is_processed = 1; in _mapping_get_pcie_dev_info()
1425 topo_change->num_entries; in _mapping_get_pcie_dev_info()
1428 &topo_change->port_details in _mapping_get_pcie_dev_info()
1430 if (tmp_port_change->reason == in _mapping_get_pcie_dev_info()
1432 tmp_port_change-> in _mapping_get_pcie_dev_info()
1446 " %d.\n", __func__, et_entry->num_slots, map_idx); in _mapping_get_pcie_dev_info()
1447 mt_entry = &sc->mapping_table[map_idx]; in _mapping_get_pcie_dev_info()
1448 for (index = map_idx; index < (et_entry->num_slots in _mapping_get_pcie_dev_info()
1450 mt_entry->device_info = MPR_DEV_RESERVED; in _mapping_get_pcie_dev_info()
1451 mt_entry->physical_id = et_entry->enclosure_id; in _mapping_get_pcie_dev_info()
1452 mt_entry->phy_bits = et_entry->phy_bits; in _mapping_get_pcie_dev_info()
1453 mt_entry->missing_count = 0; in _mapping_get_pcie_dev_info()
1460 * _mapping_set_mid_to_eid -set map table data from enclosure table
1461 * @sc: per adapter object
1471 u16 slots = et_entry->num_slots, map_idx; in _mapping_set_mid_to_eid()
1472 u32 start_idx = et_entry->start_index; in _mapping_set_mid_to_eid()
1475 mt_entry = &sc->mapping_table[start_idx]; in _mapping_set_mid_to_eid()
1477 mt_entry->physical_id = et_entry->enclosure_id; in _mapping_set_mid_to_eid()
1482 * _mapping_clear_removed_entries - mark the entries to be cleared
1483 * @sc: per adapter object
1499 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_clear_removed_entries()
1501 if (sc->is_dpm_enable) { in _mapping_clear_removed_entries()
1502 remove_entry = sc->removal_table; in _mapping_clear_removed_entries()
1503 for (remove_idx = 0; remove_idx < sc->max_devices; in _mapping_clear_removed_entries()
1505 if (remove_entry->dpm_entry_num != MPR_DPM_BAD_IDX) { in _mapping_clear_removed_entries()
1507 ((u8 *) sc->dpm_pg0 + in _mapping_clear_removed_entries()
1509 dpm_entry += remove_entry->dpm_entry_num; in _mapping_clear_removed_entries()
1510 dpm_entry->PhysicalIdentifier.Low = 0; in _mapping_clear_removed_entries()
1511 dpm_entry->PhysicalIdentifier.High = 0; in _mapping_clear_removed_entries()
1512 dpm_entry->DeviceIndex = 0; in _mapping_clear_removed_entries()
1513 dpm_entry->MappingInformation = 0; in _mapping_clear_removed_entries()
1514 dpm_entry->PhysicalBitsMapping = 0; in _mapping_clear_removed_entries()
1515 sc->dpm_flush_entry[remove_entry-> in _mapping_clear_removed_entries()
1517 sc->dpm_entry_used[remove_entry->dpm_entry_num] in _mapping_clear_removed_entries()
1519 remove_entry->dpm_entry_num = MPR_DPM_BAD_IDX; in _mapping_clear_removed_entries()
1532 num_entries = sc->num_enc_table_entries; in _mapping_clear_removed_entries()
1535 et_entry = sc->enclosure_table; in _mapping_clear_removed_entries()
1537 if (!et_entry->enc_handle && et_entry-> in _mapping_clear_removed_entries()
1540 if (i != (num_entries - 1)) { in _mapping_clear_removed_entries()
1541 from = &sc->enclosure_table in _mapping_clear_removed_entries()
1543 to = &sc->enclosure_table[i]; in _mapping_clear_removed_entries()
1544 for (m = i; m < (num_entries - in _mapping_clear_removed_entries()
1551 sc->num_enc_table_entries--; in _mapping_clear_removed_entries()
1553 sc->num_enc_table_entries; in _mapping_clear_removed_entries()
1557 sc->num_enc_table_entries--; in _mapping_clear_removed_entries()
1559 sc->num_enc_table_entries; in _mapping_clear_removed_entries()
1568 * _mapping_add_new_device -Add the new device into mapping table
1569 * @sc: per adapter object
1588 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_add_new_device()
1593 u16 max_num_phy_ids = le16toh(sc->ioc_pg8.MaxNumPhysicalMappedIDs); in _mapping_add_new_device()
1595 for (entry = 0; entry < topo_change->num_entries; entry++) { in _mapping_add_new_device()
1596 phy_change = &topo_change->phy_details[entry]; in _mapping_add_new_device()
1597 if (phy_change->is_processed) in _mapping_add_new_device()
1599 if (phy_change->reason != MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED || in _mapping_add_new_device()
1600 !phy_change->dev_handle) { in _mapping_add_new_device()
1601 phy_change->is_processed = 1; in _mapping_add_new_device()
1607 (sc, topo_change->enc_handle); in _mapping_add_new_device()
1609 phy_change->is_processed = 1; in _mapping_add_new_device()
1611 "failed to add the device with handle " in _mapping_add_new_device()
1614 phy_change->dev_handle, in _mapping_add_new_device()
1615 topo_change->enc_handle); in _mapping_add_new_device()
1626 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_add_new_device()
1627 if (et_entry->start_index == MPR_MAPTABLE_BAD_IDX) { in _mapping_add_new_device()
1628 phy_change->is_processed = 1; in _mapping_add_new_device()
1630 "failed to add the device with handle " in _mapping_add_new_device()
1633 __func__, phy_change->dev_handle); in _mapping_add_new_device()
1638 * Add this device to the mapping table at the correct in _mapping_add_new_device()
1642 map_idx = et_entry->start_index + phy_change->slot - in _mapping_add_new_device()
1643 et_entry->start_slot; in _mapping_add_new_device()
1644 mt_entry = &sc->mapping_table[map_idx]; in _mapping_add_new_device()
1645 mt_entry->physical_id = phy_change->physical_id; in _mapping_add_new_device()
1646 mt_entry->id = map_idx; in _mapping_add_new_device()
1647 mt_entry->dev_handle = phy_change->dev_handle; in _mapping_add_new_device()
1648 mt_entry->missing_count = 0; in _mapping_add_new_device()
1649 mt_entry->dpm_entry_num = et_entry->dpm_entry_num; in _mapping_add_new_device()
1650 mt_entry->device_info = phy_change->device_info | in _mapping_add_new_device()
1652 if (sc->is_dpm_enable) { in _mapping_add_new_device()
1653 dpm_idx = et_entry->dpm_entry_num; in _mapping_add_new_device()
1656 (sc, et_entry->enclosure_id, in _mapping_add_new_device()
1657 et_entry->phy_bits); in _mapping_add_new_device()
1663 ((u8 *) sc->dpm_pg0 + in _mapping_add_new_device()
1666 dpm_entry-> in _mapping_add_new_device()
1669 et_entry->enclosure_id); in _mapping_add_new_device()
1670 dpm_entry-> in _mapping_add_new_device()
1672 (et_entry->enclosure_id in _mapping_add_new_device()
1674 dpm_entry->DeviceIndex = in _mapping_add_new_device()
1675 (U16)et_entry->start_index; in _mapping_add_new_device()
1676 dpm_entry->MappingInformation = in _mapping_add_new_device()
1677 et_entry->num_slots; in _mapping_add_new_device()
1678 dpm_entry->MappingInformation in _mapping_add_new_device()
1680 dpm_entry->PhysicalBitsMapping in _mapping_add_new_device()
1681 = et_entry->phy_bits; in _mapping_add_new_device()
1682 et_entry->dpm_entry_num = in _mapping_add_new_device()
1684 sc->dpm_entry_used[dpm_idx] = 1; in _mapping_add_new_device()
1685 sc->dpm_flush_entry[dpm_idx] = in _mapping_add_new_device()
1687 phy_change->is_processed = 1; in _mapping_add_new_device()
1689 phy_change->is_processed = 1; in _mapping_add_new_device()
1692 "to add the device with " in _mapping_add_new_device()
1697 phy_change->dev_handle); in _mapping_add_new_device()
1700 et_entry->dpm_entry_num = dpm_idx; in _mapping_add_new_device()
1701 mt_entry->dpm_entry_num = dpm_idx; in _mapping_add_new_device()
1704 et_entry->init_complete = 1; in _mapping_add_new_device()
1709 * Get the mapping table index for this device. If it's in _mapping_add_new_device()
1718 (sc, phy_change->physical_id); in _mapping_add_new_device()
1720 search_idx = sc->num_rsvd_entries; in _mapping_add_new_device()
1721 if (topo_change->exp_handle) in _mapping_add_new_device()
1728 * If an entry will be used that has a missing device, in _mapping_add_new_device()
1734 mt_entry = &sc->mapping_table[map_idx]; in _mapping_add_new_device()
1736 mt_entry->dpm_entry_num); in _mapping_add_new_device()
1738 mt_entry->init_complete = 0; in _mapping_add_new_device()
1742 mt_entry = &sc->mapping_table[map_idx]; in _mapping_add_new_device()
1743 mt_entry->physical_id = phy_change->physical_id; in _mapping_add_new_device()
1744 mt_entry->id = map_idx; in _mapping_add_new_device()
1745 mt_entry->dev_handle = phy_change->dev_handle; in _mapping_add_new_device()
1746 mt_entry->missing_count = 0; in _mapping_add_new_device()
1747 mt_entry->device_info = phy_change->device_info in _mapping_add_new_device()
1750 phy_change->is_processed = 1; in _mapping_add_new_device()
1752 "failed to add the device with handle " in _mapping_add_new_device()
1755 __func__, phy_change->dev_handle); in _mapping_add_new_device()
1758 if (sc->is_dpm_enable) { in _mapping_add_new_device()
1759 if (mt_entry->dpm_entry_num != in _mapping_add_new_device()
1761 dpm_idx = mt_entry->dpm_entry_num; in _mapping_add_new_device()
1763 ((u8 *)sc->dpm_pg0 + hdr_sz); in _mapping_add_new_device()
1765 missing_cnt = dpm_entry-> in _mapping_add_new_device()
1768 temp64_var = dpm_entry-> in _mapping_add_new_device()
1771 dpm_entry->PhysicalIdentifier.Low; in _mapping_add_new_device()
1779 if ((mt_entry->physical_id == in _mapping_add_new_device()
1781 mt_entry->init_complete = 1; in _mapping_add_new_device()
1783 mt_entry->init_complete = 0; in _mapping_add_new_device()
1786 mt_entry->init_complete = 0; in _mapping_add_new_device()
1789 !mt_entry->init_complete) { in _mapping_add_new_device()
1790 mt_entry->dpm_entry_num = dpm_idx; in _mapping_add_new_device()
1792 ((u8 *)sc->dpm_pg0 + hdr_sz); in _mapping_add_new_device()
1794 dpm_entry->PhysicalIdentifier.Low = in _mapping_add_new_device()
1796 mt_entry->physical_id); in _mapping_add_new_device()
1797 dpm_entry->PhysicalIdentifier.High = in _mapping_add_new_device()
1798 (mt_entry->physical_id >> 32); in _mapping_add_new_device()
1799 dpm_entry->DeviceIndex = (U16) map_idx; in _mapping_add_new_device()
1800 dpm_entry->MappingInformation = 0; in _mapping_add_new_device()
1801 dpm_entry->PhysicalBitsMapping = 0; in _mapping_add_new_device()
1802 sc->dpm_entry_used[dpm_idx] = 1; in _mapping_add_new_device()
1803 sc->dpm_flush_entry[dpm_idx] = 1; in _mapping_add_new_device()
1804 phy_change->is_processed = 1; in _mapping_add_new_device()
1806 phy_change->is_processed = 1; in _mapping_add_new_device()
1808 "%s: failed to add the device with " in _mapping_add_new_device()
1812 phy_change->dev_handle); in _mapping_add_new_device()
1815 mt_entry->init_complete = 1; in _mapping_add_new_device()
1818 phy_change->is_processed = 1; in _mapping_add_new_device()
1825 * _mapping_add_new_pcie_device -Add the new PCIe device into mapping table
1826 * @sc: per adapter object
1845 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_add_new_pcie_device()
1850 u16 max_num_phy_ids = le16toh(sc->ioc_pg8.MaxNumPhysicalMappedIDs); in _mapping_add_new_pcie_device()
1852 for (entry = 0; entry < topo_change->num_entries; entry++) { in _mapping_add_new_pcie_device()
1853 port_change = &topo_change->port_details[entry]; in _mapping_add_new_pcie_device()
1854 if (port_change->is_processed) in _mapping_add_new_pcie_device()
1856 if (port_change->reason != MPI26_EVENT_PCIE_TOPO_PS_DEV_ADDED || in _mapping_add_new_pcie_device()
1857 !port_change->dev_handle) { in _mapping_add_new_pcie_device()
1858 port_change->is_processed = 1; in _mapping_add_new_pcie_device()
1864 (sc, topo_change->enc_handle); in _mapping_add_new_pcie_device()
1866 port_change->is_processed = 1; in _mapping_add_new_pcie_device()
1868 "failed to add the device with handle " in _mapping_add_new_pcie_device()
1871 port_change->dev_handle, in _mapping_add_new_pcie_device()
1872 topo_change->enc_handle); in _mapping_add_new_pcie_device()
1883 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_add_new_pcie_device()
1884 if (et_entry->start_index == MPR_MAPTABLE_BAD_IDX) { in _mapping_add_new_pcie_device()
1885 port_change->is_processed = 1; in _mapping_add_new_pcie_device()
1887 "failed to add the device with handle " in _mapping_add_new_pcie_device()
1890 __func__, port_change->dev_handle); in _mapping_add_new_pcie_device()
1895 * Add this device to the mapping table at the correct in _mapping_add_new_pcie_device()
1899 map_idx = et_entry->start_index + port_change->slot - in _mapping_add_new_pcie_device()
1900 et_entry->start_slot; in _mapping_add_new_pcie_device()
1901 mt_entry = &sc->mapping_table[map_idx]; in _mapping_add_new_pcie_device()
1902 mt_entry->physical_id = port_change->physical_id; in _mapping_add_new_pcie_device()
1903 mt_entry->id = map_idx; in _mapping_add_new_pcie_device()
1904 mt_entry->dev_handle = port_change->dev_handle; in _mapping_add_new_pcie_device()
1905 mt_entry->missing_count = 0; in _mapping_add_new_pcie_device()
1906 mt_entry->dpm_entry_num = et_entry->dpm_entry_num; in _mapping_add_new_pcie_device()
1907 mt_entry->device_info = port_change->device_info | in _mapping_add_new_pcie_device()
1909 if (sc->is_dpm_enable) { in _mapping_add_new_pcie_device()
1910 dpm_idx = et_entry->dpm_entry_num; in _mapping_add_new_pcie_device()
1913 (sc, et_entry->enclosure_id, in _mapping_add_new_pcie_device()
1914 et_entry->phy_bits); in _mapping_add_new_pcie_device()
1920 ((u8 *) sc->dpm_pg0 + in _mapping_add_new_pcie_device()
1923 dpm_entry-> in _mapping_add_new_pcie_device()
1926 et_entry->enclosure_id); in _mapping_add_new_pcie_device()
1927 dpm_entry-> in _mapping_add_new_pcie_device()
1929 (et_entry->enclosure_id in _mapping_add_new_pcie_device()
1931 dpm_entry->DeviceIndex = in _mapping_add_new_pcie_device()
1932 (U16)et_entry->start_index; in _mapping_add_new_pcie_device()
1933 dpm_entry->MappingInformation = in _mapping_add_new_pcie_device()
1934 et_entry->num_slots; in _mapping_add_new_pcie_device()
1935 dpm_entry->MappingInformation in _mapping_add_new_pcie_device()
1937 dpm_entry->PhysicalBitsMapping in _mapping_add_new_pcie_device()
1938 = et_entry->phy_bits; in _mapping_add_new_pcie_device()
1939 et_entry->dpm_entry_num = in _mapping_add_new_pcie_device()
1941 sc->dpm_entry_used[dpm_idx] = 1; in _mapping_add_new_pcie_device()
1942 sc->dpm_flush_entry[dpm_idx] = in _mapping_add_new_pcie_device()
1944 port_change->is_processed = 1; in _mapping_add_new_pcie_device()
1946 port_change->is_processed = 1; in _mapping_add_new_pcie_device()
1949 "to add the device with " in _mapping_add_new_pcie_device()
1954 port_change->dev_handle); in _mapping_add_new_pcie_device()
1957 et_entry->dpm_entry_num = dpm_idx; in _mapping_add_new_pcie_device()
1958 mt_entry->dpm_entry_num = dpm_idx; in _mapping_add_new_pcie_device()
1961 et_entry->init_complete = 1; in _mapping_add_new_pcie_device()
1966 * Get the mapping table index for this device. If it's in _mapping_add_new_pcie_device()
1975 (sc, port_change->physical_id); in _mapping_add_new_pcie_device()
1977 search_idx = sc->num_rsvd_entries; in _mapping_add_new_pcie_device()
1978 if (topo_change->switch_dev_handle) in _mapping_add_new_pcie_device()
1985 * If an entry will be used that has a missing device, in _mapping_add_new_pcie_device()
1991 mt_entry = &sc->mapping_table[map_idx]; in _mapping_add_new_pcie_device()
1993 mt_entry->dpm_entry_num); in _mapping_add_new_pcie_device()
1995 mt_entry->init_complete = 0; in _mapping_add_new_pcie_device()
1999 mt_entry = &sc->mapping_table[map_idx]; in _mapping_add_new_pcie_device()
2000 mt_entry->physical_id = in _mapping_add_new_pcie_device()
2001 port_change->physical_id; in _mapping_add_new_pcie_device()
2002 mt_entry->id = map_idx; in _mapping_add_new_pcie_device()
2003 mt_entry->dev_handle = port_change->dev_handle; in _mapping_add_new_pcie_device()
2004 mt_entry->missing_count = 0; in _mapping_add_new_pcie_device()
2005 mt_entry->device_info = in _mapping_add_new_pcie_device()
2006 port_change->device_info | in _mapping_add_new_pcie_device()
2009 port_change->is_processed = 1; in _mapping_add_new_pcie_device()
2011 "failed to add the device with handle " in _mapping_add_new_pcie_device()
2014 __func__, port_change->dev_handle); in _mapping_add_new_pcie_device()
2017 if (sc->is_dpm_enable) { in _mapping_add_new_pcie_device()
2018 if (mt_entry->dpm_entry_num != in _mapping_add_new_pcie_device()
2020 dpm_idx = mt_entry->dpm_entry_num; in _mapping_add_new_pcie_device()
2022 ((u8 *)sc->dpm_pg0 + hdr_sz); in _mapping_add_new_pcie_device()
2024 missing_cnt = dpm_entry-> in _mapping_add_new_pcie_device()
2027 temp64_var = dpm_entry-> in _mapping_add_new_pcie_device()
2030 dpm_entry->PhysicalIdentifier.Low; in _mapping_add_new_pcie_device()
2038 if ((mt_entry->physical_id == in _mapping_add_new_pcie_device()
2040 mt_entry->init_complete = 1; in _mapping_add_new_pcie_device()
2042 mt_entry->init_complete = 0; in _mapping_add_new_pcie_device()
2045 mt_entry->init_complete = 0; in _mapping_add_new_pcie_device()
2048 !mt_entry->init_complete) { in _mapping_add_new_pcie_device()
2049 mt_entry->dpm_entry_num = dpm_idx; in _mapping_add_new_pcie_device()
2051 ((u8 *)sc->dpm_pg0 + hdr_sz); in _mapping_add_new_pcie_device()
2053 dpm_entry->PhysicalIdentifier.Low = in _mapping_add_new_pcie_device()
2055 mt_entry->physical_id); in _mapping_add_new_pcie_device()
2056 dpm_entry->PhysicalIdentifier.High = in _mapping_add_new_pcie_device()
2057 (mt_entry->physical_id >> 32); in _mapping_add_new_pcie_device()
2058 dpm_entry->DeviceIndex = (U16) map_idx; in _mapping_add_new_pcie_device()
2059 dpm_entry->MappingInformation = 0; in _mapping_add_new_pcie_device()
2060 dpm_entry->PhysicalBitsMapping = 0; in _mapping_add_new_pcie_device()
2061 sc->dpm_entry_used[dpm_idx] = 1; in _mapping_add_new_pcie_device()
2062 sc->dpm_flush_entry[dpm_idx] = 1; in _mapping_add_new_pcie_device()
2063 port_change->is_processed = 1; in _mapping_add_new_pcie_device()
2065 port_change->is_processed = 1; in _mapping_add_new_pcie_device()
2067 "%s: failed to add the device with " in _mapping_add_new_pcie_device()
2071 port_change->dev_handle); in _mapping_add_new_pcie_device()
2074 mt_entry->init_complete = 1; in _mapping_add_new_pcie_device()
2077 port_change->is_processed = 1; in _mapping_add_new_pcie_device()
2084 * _mapping_flush_dpm_pages -Flush the DPM pages to NVRAM
2085 * @sc: per adapter object
2097 for (entry_num = 0; entry_num < sc->max_dpm_entries; entry_num++) { in _mapping_flush_dpm_pages()
2098 if (!sc->dpm_flush_entry[entry_num]) in _mapping_flush_dpm_pages()
2101 memcpy(&config_page.Header, (u8 *)sc->dpm_pg0, in _mapping_flush_dpm_pages()
2103 dpm_entry = (Mpi2DriverMap0Entry_t *) ((u8 *)sc->dpm_pg0 + in _mapping_flush_dpm_pages()
2106 dpm_entry->MappingInformation = htole16(dpm_entry-> in _mapping_flush_dpm_pages()
2108 dpm_entry->DeviceIndex = htole16(dpm_entry->DeviceIndex); in _mapping_flush_dpm_pages()
2109 dpm_entry->PhysicalBitsMapping = htole32(dpm_entry-> in _mapping_flush_dpm_pages()
2113 /* TODO-How to handle failed writes? */ in _mapping_flush_dpm_pages()
2119 "DPM entry %d for device failed\n", __func__, in _mapping_flush_dpm_pages()
2122 sc->dpm_flush_entry[entry_num] = 0; in _mapping_flush_dpm_pages()
2123 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_flush_dpm_pages()
2125 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_flush_dpm_pages()
2126 dpm_entry->PhysicalBitsMapping = le32toh(dpm_entry-> in _mapping_flush_dpm_pages()
2132 * _mapping_allocate_memory- allocates the memory required for mapping tables
2133 * @sc: per adapter object
2137 * Return 0 on success or non-zero on failure.
2144 sc->mapping_table = malloc((sizeof(struct dev_mapping_table) * in mpr_mapping_allocate_memory()
2145 sc->max_devices), M_MPR, M_ZERO|M_NOWAIT); in mpr_mapping_allocate_memory()
2146 if (!sc->mapping_table) in mpr_mapping_allocate_memory()
2149 sc->removal_table = malloc((sizeof(struct map_removal_table) * in mpr_mapping_allocate_memory()
2150 sc->max_devices), M_MPR, M_ZERO|M_NOWAIT); in mpr_mapping_allocate_memory()
2151 if (!sc->removal_table) in mpr_mapping_allocate_memory()
2154 sc->enclosure_table = malloc((sizeof(struct enc_mapping_table) * in mpr_mapping_allocate_memory()
2155 sc->max_enclosures), M_MPR, M_ZERO|M_NOWAIT); in mpr_mapping_allocate_memory()
2156 if (!sc->enclosure_table) in mpr_mapping_allocate_memory()
2159 sc->dpm_entry_used = malloc((sizeof(u8) * sc->max_dpm_entries), in mpr_mapping_allocate_memory()
2161 if (!sc->dpm_entry_used) in mpr_mapping_allocate_memory()
2164 sc->dpm_flush_entry = malloc((sizeof(u8) * sc->max_dpm_entries), in mpr_mapping_allocate_memory()
2166 if (!sc->dpm_flush_entry) in mpr_mapping_allocate_memory()
2170 (sc->max_dpm_entries * sizeof(MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY)); in mpr_mapping_allocate_memory()
2172 sc->dpm_pg0 = malloc(dpm_pg0_sz, M_MPR, M_ZERO|M_NOWAIT); in mpr_mapping_allocate_memory()
2173 if (!sc->dpm_pg0) { in mpr_mapping_allocate_memory()
2176 sc->is_dpm_enable = 0; in mpr_mapping_allocate_memory()
2182 free(sc->mapping_table, M_MPR); in mpr_mapping_allocate_memory()
2183 free(sc->removal_table, M_MPR); in mpr_mapping_allocate_memory()
2184 free(sc->enclosure_table, M_MPR); in mpr_mapping_allocate_memory()
2185 free(sc->dpm_entry_used, M_MPR); in mpr_mapping_allocate_memory()
2186 free(sc->dpm_flush_entry, M_MPR); in mpr_mapping_allocate_memory()
2187 free(sc->dpm_pg0, M_MPR); in mpr_mapping_allocate_memory()
2188 printf("%s: device initialization failed due to failure in mapping " in mpr_mapping_allocate_memory()
2190 return -1; in mpr_mapping_allocate_memory()
2194 * mpr_mapping_free_memory- frees the memory allocated for mapping tables
2195 * @sc: per adapter object
2202 free(sc->mapping_table, M_MPR); in mpr_mapping_free_memory()
2203 free(sc->removal_table, M_MPR); in mpr_mapping_free_memory()
2204 free(sc->enclosure_table, M_MPR); in mpr_mapping_free_memory()
2205 free(sc->dpm_entry_used, M_MPR); in mpr_mapping_free_memory()
2206 free(sc->dpm_flush_entry, M_MPR); in mpr_mapping_free_memory()
2207 free(sc->dpm_pg0, M_MPR); in mpr_mapping_free_memory()
2218 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_process_dpm_pg0()
2219 u16 max_num_phy_ids = le16toh(sc->ioc_pg8.MaxNumPhysicalMappedIDs); in _mapping_process_dpm_pg0()
2227 if (sc->ir_firmware) in _mapping_process_dpm_pg0()
2233 * have a non-zero ID. At this point, any ID with a value of 0 would be in _mapping_process_dpm_pg0()
2237 "mapping table.\n", __func__, sc->max_dpm_entries); in _mapping_process_dpm_pg0()
2238 dpm_entry = (Mpi2DriverMap0Entry_t *) ((uint8_t *) sc->dpm_pg0 + in _mapping_process_dpm_pg0()
2240 for (entry_num = 0; entry_num < sc->max_dpm_entries; entry_num++, in _mapping_process_dpm_pg0()
2242 physical_id = dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
2244 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
2246 sc->dpm_entry_used[entry_num] = 0; in _mapping_process_dpm_pg0()
2249 sc->dpm_entry_used[entry_num] = 1; in _mapping_process_dpm_pg0()
2250 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_process_dpm_pg0()
2252 missing_cnt = dpm_entry->MappingInformation & in _mapping_process_dpm_pg0()
2254 dev_idx = le16toh(dpm_entry->DeviceIndex); in _mapping_process_dpm_pg0()
2255 phy_bits = le32toh(dpm_entry->PhysicalBitsMapping); in _mapping_process_dpm_pg0()
2263 if (sc->ir_firmware && (dev_idx >= start_idx) && in _mapping_process_dpm_pg0()
2265 mt_entry = &sc->mapping_table[dev_idx]; in _mapping_process_dpm_pg0()
2266 mt_entry->physical_id = in _mapping_process_dpm_pg0()
2267 dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
2268 mt_entry->physical_id = (mt_entry->physical_id << 32) | in _mapping_process_dpm_pg0()
2269 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
2270 mt_entry->id = dev_idx; in _mapping_process_dpm_pg0()
2271 mt_entry->missing_count = missing_cnt; in _mapping_process_dpm_pg0()
2272 mt_entry->dpm_entry_num = entry_num; in _mapping_process_dpm_pg0()
2273 mt_entry->device_info = MPR_DEV_RESERVED; in _mapping_process_dpm_pg0()
2286 if (dev_idx < (sc->num_rsvd_entries + in _mapping_process_dpm_pg0()
2295 num_slots = dpm_entry->MappingInformation & in _mapping_process_dpm_pg0()
2299 enc_idx = sc->num_enc_table_entries; in _mapping_process_dpm_pg0()
2300 if (enc_idx >= sc->max_enclosures) { in _mapping_process_dpm_pg0()
2304 sc->max_enclosures); in _mapping_process_dpm_pg0()
2307 sc->num_enc_table_entries++; in _mapping_process_dpm_pg0()
2308 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_process_dpm_pg0()
2309 physical_id = dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
2310 et_entry->enclosure_id = (physical_id << 32) | in _mapping_process_dpm_pg0()
2311 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
2312 et_entry->start_index = dev_idx; in _mapping_process_dpm_pg0()
2313 et_entry->dpm_entry_num = entry_num; in _mapping_process_dpm_pg0()
2314 et_entry->num_slots = num_slots; in _mapping_process_dpm_pg0()
2315 et_entry->start_slot = slot_id; in _mapping_process_dpm_pg0()
2316 et_entry->missing_count = missing_cnt; in _mapping_process_dpm_pg0()
2317 et_entry->phy_bits = phy_bits; in _mapping_process_dpm_pg0()
2329 mt_entry = &sc->mapping_table[dev_idx]; in _mapping_process_dpm_pg0()
2332 if (mt_entry->dpm_entry_num != in _mapping_process_dpm_pg0()
2336 "enclosure %d device %d\n", in _mapping_process_dpm_pg0()
2341 dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
2342 mt_entry->physical_id = (physical_id << 32) | in _mapping_process_dpm_pg0()
2343 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
2344 mt_entry->phy_bits = phy_bits; in _mapping_process_dpm_pg0()
2345 mt_entry->id = dev_idx; in _mapping_process_dpm_pg0()
2346 mt_entry->dpm_entry_num = entry_num; in _mapping_process_dpm_pg0()
2347 mt_entry->missing_count = missing_cnt; in _mapping_process_dpm_pg0()
2348 mt_entry->device_info = MPR_DEV_RESERVED; in _mapping_process_dpm_pg0()
2354 * Device mapping, so simply copy the DPM entries to the in _mapping_process_dpm_pg0()
2359 mt_entry = &sc->mapping_table[map_idx]; in _mapping_process_dpm_pg0()
2360 if (mt_entry->dpm_entry_num != MPR_DPM_BAD_IDX) { in _mapping_process_dpm_pg0()
2362 "Conflict in mapping table for device %d\n", in _mapping_process_dpm_pg0()
2366 physical_id = dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
2367 mt_entry->physical_id = (physical_id << 32) | in _mapping_process_dpm_pg0()
2368 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
2369 mt_entry->phy_bits = phy_bits; in _mapping_process_dpm_pg0()
2370 mt_entry->id = dev_idx; in _mapping_process_dpm_pg0()
2371 mt_entry->missing_count = missing_cnt; in _mapping_process_dpm_pg0()
2372 mt_entry->dpm_entry_num = entry_num; in _mapping_process_dpm_pg0()
2373 mt_entry->device_info = MPR_DEV_RESERVED; in _mapping_process_dpm_pg0()
2381 dpm_entry = (Mpi2DriverMap0Entry_t *) ((uint8_t *) sc->dpm_pg0 + in _mapping_process_dpm_pg0()
2383 bzero(dpm_entry, sizeof(Mpi2DriverMap0Entry_t) * sc->max_dpm_entries); in _mapping_process_dpm_pg0()
2384 for (entry_num = 0; entry_num < sc->max_dpm_entries; entry_num++) { in _mapping_process_dpm_pg0()
2385 sc->dpm_flush_entry[entry_num] = 1; in _mapping_process_dpm_pg0()
2386 sc->dpm_entry_used[entry_num] = 0; in _mapping_process_dpm_pg0()
2389 * sc->mapping_table volumes tooi in _mapping_process_dpm_pg0()
2393 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; enc_idx++) in _mapping_process_dpm_pg0()
2394 _mapping_clear_enc_entry(sc->enclosure_table + enc_idx); in _mapping_process_dpm_pg0()
2395 sc->num_enc_table_entries = 0; in _mapping_process_dpm_pg0()
2399 * mpr_mapping_check_devices - start of the day check for device availabilty
2400 * @sc: per adapter object
2410 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in mpr_mapping_check_devices()
2423 sc->track_mapping_events = 0; in mpr_mapping_check_devices()
2431 mtx_assert(&sc->mpr_mtx, MA_OWNED); in mpr_mapping_check_devices()
2432 if ((callout_pending(&sc->device_check_callout)) || in mpr_mapping_check_devices()
2433 (!callout_active(&sc->device_check_callout))) { in mpr_mapping_check_devices()
2434 mpr_dprint(sc, MPR_MAPPING, "%s: Device Check Callout is " in mpr_mapping_check_devices()
2438 callout_deactivate(&sc->device_check_callout); in mpr_mapping_check_devices()
2449 et_entry = sc->enclosure_table; in mpr_mapping_check_devices()
2450 for (i = 0; i < sc->num_enc_table_entries; i++, et_entry++) { in mpr_mapping_check_devices()
2451 if (et_entry->init_complete) { in mpr_mapping_check_devices()
2458 mt_entry = sc->mapping_table; in mpr_mapping_check_devices()
2459 for (i = 0; i < sc->max_devices; i++, mt_entry++) { in mpr_mapping_check_devices()
2460 if (mt_entry->init_complete) { in mpr_mapping_check_devices()
2475 callout_reset(&sc->device_check_callout, in mpr_mapping_check_devices()
2480 mpr_dprint(sc, MPR_MAPPING, "%s: Device check complete.\n", __func__); in mpr_mapping_check_devices()
2488 et_entry = sc->enclosure_table; in mpr_mapping_check_devices()
2489 for (i = 0; i < sc->num_enc_table_entries; i++, et_entry++) { in mpr_mapping_check_devices()
2490 if (!et_entry->init_complete) { in mpr_mapping_check_devices()
2491 if (et_entry->missing_count < in mpr_mapping_check_devices()
2497 et_entry->missing_count++; in mpr_mapping_check_devices()
2498 if (et_entry->dpm_entry_num != in mpr_mapping_check_devices()
2504 et_entry->init_complete = 1; in mpr_mapping_check_devices()
2507 if (!sc->ir_firmware) in mpr_mapping_check_devices()
2510 mt_entry = &sc->mapping_table[start_idx]; in mpr_mapping_check_devices()
2514 end_idx = sc->max_devices - 1; in mpr_mapping_check_devices()
2515 mt_entry = sc->mapping_table; in mpr_mapping_check_devices()
2526 if (mt_entry->device_info & MPR_DEV_RESERVED in mpr_mapping_check_devices()
2527 && !mt_entry->physical_id) in mpr_mapping_check_devices()
2528 mt_entry->init_complete = 1; in mpr_mapping_check_devices()
2529 else if (mt_entry->device_info & MPR_DEV_RESERVED) { in mpr_mapping_check_devices()
2530 if (!mt_entry->init_complete) { in mpr_mapping_check_devices()
2531 mpr_dprint(sc, MPR_MAPPING, "%s: Device in " in mpr_mapping_check_devices()
2535 if (mt_entry->missing_count < in mpr_mapping_check_devices()
2537 mt_entry->missing_count++; in mpr_mapping_check_devices()
2538 if (mt_entry->dpm_entry_num != in mpr_mapping_check_devices()
2544 mt_entry->init_complete = 1; in mpr_mapping_check_devices()
2551 * mpr_mapping_initialize - initialize mapping tables
2552 * @sc: per adapter object
2556 * Return 0 for success or non-zero for failure.
2566 uint16_t ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in mpr_mapping_initialize()
2571 sc->max_enclosures = sc->facts->MaxEnclosures + 1; in mpr_mapping_initialize()
2572 sc->max_expanders = sc->facts->MaxSasExpanders; in mpr_mapping_initialize()
2573 sc->max_volumes = sc->facts->MaxVolumes; in mpr_mapping_initialize()
2574 sc->max_devices = sc->facts->MaxTargets + sc->max_volumes; in mpr_mapping_initialize()
2575 sc->pending_map_events = 0; in mpr_mapping_initialize()
2576 sc->num_enc_table_entries = 0; in mpr_mapping_initialize()
2577 sc->num_rsvd_entries = 0; in mpr_mapping_initialize()
2578 sc->max_dpm_entries = le16toh(sc->ioc_pg8.MaxPersistentEntries); in mpr_mapping_initialize()
2579 sc->is_dpm_enable = (sc->max_dpm_entries) ? 1 : 0; in mpr_mapping_initialize()
2580 sc->track_mapping_events = 0; in mpr_mapping_initialize()
2583 "and DPM has a max of %d entries.\n", __func__, sc->max_devices, in mpr_mapping_initialize()
2584 sc->max_dpm_entries); in mpr_mapping_initialize()
2587 sc->is_dpm_enable = 0; in mpr_mapping_initialize()
2590 sc->num_rsvd_entries = 1; in mpr_mapping_initialize()
2592 volume_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) & in mpr_mapping_initialize()
2594 if (sc->ir_firmware && (volume_mapping_flags == in mpr_mapping_initialize()
2596 sc->num_rsvd_entries += sc->max_volumes; in mpr_mapping_initialize()
2602 for (i = 0; i < sc->max_devices; i++) in mpr_mapping_initialize()
2603 _mapping_clear_map_entry(sc->mapping_table + i); in mpr_mapping_initialize()
2605 for (i = 0; i < sc->max_enclosures; i++) in mpr_mapping_initialize()
2606 _mapping_clear_enc_entry(sc->enclosure_table + i); in mpr_mapping_initialize()
2608 for (i = 0; i < sc->max_devices; i++) { in mpr_mapping_initialize()
2609 sc->removal_table[i].dev_handle = 0; in mpr_mapping_initialize()
2610 sc->removal_table[i].dpm_entry_num = MPR_DPM_BAD_IDX; in mpr_mapping_initialize()
2613 memset(sc->dpm_entry_used, 0, sc->max_dpm_entries); in mpr_mapping_initialize()
2614 memset(sc->dpm_flush_entry, 0, sc->max_dpm_entries); in mpr_mapping_initialize()
2616 if (sc->is_dpm_enable) { in mpr_mapping_initialize()
2618 (sc->max_dpm_entries * in mpr_mapping_initialize()
2623 if (mpr_config_get_dpm_pg0(sc, &mpi_reply, sc->dpm_pg0, in mpr_mapping_initialize()
2631 sc->is_dpm_enable = 0; in mpr_mapping_initialize()
2635 if (sc->is_dpm_enable) in mpr_mapping_initialize()
2637 if (! sc->is_dpm_enable) { in mpr_mapping_initialize()
2639 "Device mappings will not persist across reboots or " in mpr_mapping_initialize()
2643 sc->track_mapping_events = 1; in mpr_mapping_initialize()
2648 * mpr_mapping_exit - clear mapping table and associated memory
2649 * @sc: per adapter object
2661 * mpr_mapping_get_tid - return the target id for sas device and handle
2662 * @sc: per adapter object
2663 * @sas_address: sas address of the device
2664 * @handle: device handle
2674 for (map_idx = 0; map_idx < sc->max_devices; map_idx++) { in mpr_mapping_get_tid()
2675 mt_entry = &sc->mapping_table[map_idx]; in mpr_mapping_get_tid()
2676 if (mt_entry->dev_handle == handle && mt_entry->physical_id == in mpr_mapping_get_tid()
2678 return mt_entry->id; in mpr_mapping_get_tid()
2685 * mpr_mapping_get_tid_from_handle - find a target id in mapping table using
2688 * @sc: per adapter object
2689 * @handle: device handle
2700 * mpr_mapping_get_raid_tid - return the target id for raid device
2701 * @sc: per adapter object
2703 * @volHandle: volume device handle
2714 mt_entry = &sc->mapping_table[start_idx]; in mpr_mapping_get_raid_tid()
2716 if (mt_entry->dev_handle == volHandle && in mpr_mapping_get_raid_tid()
2717 mt_entry->physical_id == wwid) in mpr_mapping_get_raid_tid()
2718 return mt_entry->id; in mpr_mapping_get_raid_tid()
2725 * mpr_mapping_get_raid_tid_from_handle - find raid device in mapping table
2728 * @sc: per adapter object
2729 * @volHandle: volume device handle
2740 * mpr_mapping_enclosure_dev_status_change_event - handle enclosure events
2741 * @sc: per adapter object
2753 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in mpr_mapping_enclosure_dev_status_change_event()
2763 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in mpr_mapping_enclosure_dev_status_change_event()
2766 if (event_data->ReasonCode == MPI2_EVENT_SAS_ENCL_RC_ADDED) { in mpr_mapping_enclosure_dev_status_change_event()
2767 if (!event_data->NumSlots) { in mpr_mapping_enclosure_dev_status_change_event()
2770 le16toh(event_data->EnclosureHandle)); in mpr_mapping_enclosure_dev_status_change_event()
2773 temp64_var = event_data->EnclosureLogicalID.High; in mpr_mapping_enclosure_dev_status_change_event()
2775 event_data->EnclosureLogicalID.Low; in mpr_mapping_enclosure_dev_status_change_event()
2777 event_data->PhyBits); in mpr_mapping_enclosure_dev_status_change_event()
2788 et_entry = &sc->enclosure_table[enc_idx]; in mpr_mapping_enclosure_dev_status_change_event()
2789 if (et_entry->init_complete && in mpr_mapping_enclosure_dev_status_change_event()
2790 !et_entry->missing_count) { in mpr_mapping_enclosure_dev_status_change_event()
2793 __func__, enc_idx, et_entry->enc_handle); in mpr_mapping_enclosure_dev_status_change_event()
2796 et_entry->enc_handle = le16toh(event_data-> in mpr_mapping_enclosure_dev_status_change_event()
2798 et_entry->start_slot = le16toh(event_data->StartSlot); in mpr_mapping_enclosure_dev_status_change_event()
2799 saved_phy_bits = et_entry->phy_bits; in mpr_mapping_enclosure_dev_status_change_event()
2800 et_entry->phy_bits |= le32toh(event_data->PhyBits); in mpr_mapping_enclosure_dev_status_change_event()
2801 if (saved_phy_bits != et_entry->phy_bits) in mpr_mapping_enclosure_dev_status_change_event()
2803 if (et_entry->missing_count || update_phy_bits) { in mpr_mapping_enclosure_dev_status_change_event()
2804 et_entry->missing_count = 0; in mpr_mapping_enclosure_dev_status_change_event()
2805 if (sc->is_dpm_enable && in mpr_mapping_enclosure_dev_status_change_event()
2806 et_entry->dpm_entry_num != in mpr_mapping_enclosure_dev_status_change_event()
2808 dpm_entry += et_entry->dpm_entry_num; in mpr_mapping_enclosure_dev_status_change_event()
2810 (u8)(dpm_entry->MappingInformation & in mpr_mapping_enclosure_dev_status_change_event()
2813 dpm_entry->MappingInformation in mpr_mapping_enclosure_dev_status_change_event()
2814 = et_entry->num_slots; in mpr_mapping_enclosure_dev_status_change_event()
2815 dpm_entry->MappingInformation in mpr_mapping_enclosure_dev_status_change_event()
2817 dpm_entry->PhysicalBitsMapping in mpr_mapping_enclosure_dev_status_change_event()
2818 = et_entry->phy_bits; in mpr_mapping_enclosure_dev_status_change_event()
2819 sc->dpm_flush_entry[et_entry-> in mpr_mapping_enclosure_dev_status_change_event()
2828 * finalized when a device is added for the enclosure in mpr_mapping_enclosure_dev_status_change_event()
2832 if (sc->num_enc_table_entries < sc->max_enclosures) { in mpr_mapping_enclosure_dev_status_change_event()
2833 enc_idx = sc->num_enc_table_entries; in mpr_mapping_enclosure_dev_status_change_event()
2834 sc->num_enc_table_entries++; in mpr_mapping_enclosure_dev_status_change_event()
2838 et_entry = &sc->enclosure_table[enc_idx]; in mpr_mapping_enclosure_dev_status_change_event()
2840 et_entry->dpm_entry_num); in mpr_mapping_enclosure_dev_status_change_event()
2850 et_entry = &sc->enclosure_table[enc_idx]; in mpr_mapping_enclosure_dev_status_change_event()
2851 et_entry->enc_handle = le16toh(event_data-> in mpr_mapping_enclosure_dev_status_change_event()
2853 et_entry->enclosure_id = le64toh(event_data-> in mpr_mapping_enclosure_dev_status_change_event()
2855 et_entry->enclosure_id = in mpr_mapping_enclosure_dev_status_change_event()
2856 ((et_entry->enclosure_id << 32) | in mpr_mapping_enclosure_dev_status_change_event()
2857 le64toh(event_data->EnclosureLogicalID.Low)); in mpr_mapping_enclosure_dev_status_change_event()
2858 et_entry->start_index = MPR_MAPTABLE_BAD_IDX; in mpr_mapping_enclosure_dev_status_change_event()
2859 et_entry->dpm_entry_num = MPR_DPM_BAD_IDX; in mpr_mapping_enclosure_dev_status_change_event()
2860 et_entry->num_slots = le16toh(event_data->NumSlots); in mpr_mapping_enclosure_dev_status_change_event()
2861 et_entry->start_slot = le16toh(event_data->StartSlot); in mpr_mapping_enclosure_dev_status_change_event()
2862 et_entry->phy_bits = le32toh(event_data->PhyBits); in mpr_mapping_enclosure_dev_status_change_event()
2864 et_entry->init_complete = 1; in mpr_mapping_enclosure_dev_status_change_event()
2865 } else if (event_data->ReasonCode == in mpr_mapping_enclosure_dev_status_change_event()
2873 le16toh(event_data->EnclosureHandle)); in mpr_mapping_enclosure_dev_status_change_event()
2878 le16toh(event_data->EnclosureHandle)); in mpr_mapping_enclosure_dev_status_change_event()
2881 et_entry = &sc->enclosure_table[enc_idx]; in mpr_mapping_enclosure_dev_status_change_event()
2882 if (et_entry->missing_count < MPR_MAX_MISSING_COUNT) in mpr_mapping_enclosure_dev_status_change_event()
2883 et_entry->missing_count++; in mpr_mapping_enclosure_dev_status_change_event()
2884 if (sc->is_dpm_enable && in mpr_mapping_enclosure_dev_status_change_event()
2885 et_entry->dpm_entry_num != MPR_DPM_BAD_IDX) { in mpr_mapping_enclosure_dev_status_change_event()
2886 dpm_entry += et_entry->dpm_entry_num; in mpr_mapping_enclosure_dev_status_change_event()
2887 dpm_entry->MappingInformation = et_entry->num_slots; in mpr_mapping_enclosure_dev_status_change_event()
2888 dpm_entry->MappingInformation <<= map_shift; in mpr_mapping_enclosure_dev_status_change_event()
2889 dpm_entry->MappingInformation |= in mpr_mapping_enclosure_dev_status_change_event()
2890 et_entry->missing_count; in mpr_mapping_enclosure_dev_status_change_event()
2891 sc->dpm_flush_entry[et_entry->dpm_entry_num] = 1; in mpr_mapping_enclosure_dev_status_change_event()
2893 et_entry->init_complete = 1; in mpr_mapping_enclosure_dev_status_change_event()
2898 if (sc->pending_map_events) in mpr_mapping_enclosure_dev_status_change_event()
2899 sc->pending_map_events--; in mpr_mapping_enclosure_dev_status_change_event()
2903 * mpr_mapping_topology_change_event - handle topology change events
2904 * @sc: per adapter object
2918 topo_change.enc_handle = le16toh(event_data->EnclosureHandle); in mpr_mapping_topology_change_event()
2919 topo_change.exp_handle = le16toh(event_data->ExpanderDevHandle); in mpr_mapping_topology_change_event()
2920 num_entries = event_data->NumEntries; in mpr_mapping_topology_change_event()
2922 topo_change.start_phy_num = event_data->StartPhyNum; in mpr_mapping_topology_change_event()
2923 topo_change.num_phys = event_data->NumPhys; in mpr_mapping_topology_change_event()
2924 topo_change.exp_status = event_data->ExpStatus; in mpr_mapping_topology_change_event()
2925 event_phy_change = event_data->PHY; in mpr_mapping_topology_change_event()
2936 phy_change->dev_handle = le16toh(event_phy_change-> in mpr_mapping_topology_change_event()
2938 phy_change->reason = event_phy_change->PhyStatus & in mpr_mapping_topology_change_event()
2949 if (sc->pending_map_events) in mpr_mapping_topology_change_event()
2950 sc->pending_map_events--; in mpr_mapping_topology_change_event()
2954 * mpr_mapping_pcie_topology_change_event - handle PCIe topology change events
2955 * @sc: per adapter object
2969 topo_change.switch_dev_handle = le16toh(event_data->SwitchDevHandle); in mpr_mapping_pcie_topology_change_event()
2970 topo_change.enc_handle = le16toh(event_data->EnclosureHandle); in mpr_mapping_pcie_topology_change_event()
2971 num_entries = event_data->NumEntries; in mpr_mapping_pcie_topology_change_event()
2973 topo_change.start_port_num = event_data->StartPortNum; in mpr_mapping_pcie_topology_change_event()
2974 topo_change.num_ports = event_data->NumPorts; in mpr_mapping_pcie_topology_change_event()
2975 topo_change.switch_status = event_data->SwitchStatus; in mpr_mapping_pcie_topology_change_event()
2976 event_port_change = event_data->PortEntry; in mpr_mapping_pcie_topology_change_event()
2987 port_change->dev_handle = le16toh(event_port_change-> in mpr_mapping_pcie_topology_change_event()
2989 port_change->reason = event_port_change->PortStatus; in mpr_mapping_pcie_topology_change_event()
2999 if (sc->pending_map_events) in mpr_mapping_pcie_topology_change_event()
3000 sc->pending_map_events--; in mpr_mapping_pcie_topology_change_event()
3004 * mpr_mapping_ir_config_change_event - handle IR config change list events
3005 * @sc: per adapter object
3021 wwid_table = malloc(sizeof(u64) * event_data->NumElements, M_MPR, in mpr_mapping_ir_config_change_event()
3025 element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; in mpr_mapping_ir_config_change_event()
3026 flags = le32toh(event_data->Flags); in mpr_mapping_ir_config_change_event()
3032 for (i = 0; i < event_data->NumElements; i++, element++) { in mpr_mapping_ir_config_change_event()
3033 element_flags = le16toh(element->ElementFlags); in mpr_mapping_ir_config_change_event()
3034 if ((element->ReasonCode != MPI2_EVENT_IR_CHANGE_RC_ADDED) && in mpr_mapping_ir_config_change_event()
3035 (element->ReasonCode != MPI2_EVENT_IR_CHANGE_RC_REMOVED) && in mpr_mapping_ir_config_change_event()
3036 (element->ReasonCode != MPI2_EVENT_IR_CHANGE_RC_NO_CHANGE) in mpr_mapping_ir_config_change_event()
3037 && (element->ReasonCode != in mpr_mapping_ir_config_change_event()
3044 le16toh(element->VolDevHandle), &wwid_table[i]); in mpr_mapping_ir_config_change_event()
3056 element = (Mpi2EventIrConfigElement_t *)&event_data-> in mpr_mapping_ir_config_change_event()
3058 for (i = 0; i < event_data->NumElements; i++, element++) { in mpr_mapping_ir_config_change_event()
3059 if (element->ReasonCode == in mpr_mapping_ir_config_change_event()
3061 element->ReasonCode == in mpr_mapping_ir_config_change_event()
3070 mt_entry = &sc->mapping_table[map_idx]; in mpr_mapping_ir_config_change_event()
3071 mt_entry->id = map_idx; in mpr_mapping_ir_config_change_event()
3072 mt_entry->dev_handle = le16toh in mpr_mapping_ir_config_change_event()
3073 (element->VolDevHandle); in mpr_mapping_ir_config_change_event()
3074 mt_entry->device_info = in mpr_mapping_ir_config_change_event()
3097 le16toh(element->VolDevHandle)); in mpr_mapping_ir_config_change_event()
3100 mt_entry = &sc->mapping_table[map_idx]; in mpr_mapping_ir_config_change_event()
3101 mt_entry->physical_id = wwid_table[i]; in mpr_mapping_ir_config_change_event()
3102 mt_entry->id = map_idx; in mpr_mapping_ir_config_change_event()
3103 mt_entry->dev_handle = le16toh(element-> in mpr_mapping_ir_config_change_event()
3105 mt_entry->device_info = MPR_DEV_RESERVED | in mpr_mapping_ir_config_change_event()
3109 } else if (element->ReasonCode == in mpr_mapping_ir_config_change_event()
3122 } else if (element->ReasonCode == in mpr_mapping_ir_config_change_event()
3125 le16toh(element->VolDevHandle)); in mpr_mapping_ir_config_change_event()
3131 le16toh(element->VolDevHandle)); in mpr_mapping_ir_config_change_event()
3134 mt_entry = &sc->mapping_table[map_idx]; in mpr_mapping_ir_config_change_event()
3136 element, mt_entry->physical_id); in mpr_mapping_ir_config_change_event()
3144 if (sc->pending_map_events) in mpr_mapping_ir_config_change_event()
3145 sc->pending_map_events--; in mpr_mapping_ir_config_change_event()