Lines Matching +full:per +full:- +full:device
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2011-2015 LSI Corp.
5 * Copyright (c) 2013-2015 Avago Technologies
29 * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
63 * _mapping_clear_map_entry - Clear a particular mapping entry.
71 map_entry->physical_id = 0; in _mapping_clear_map_entry()
72 map_entry->device_info = 0; in _mapping_clear_map_entry()
73 map_entry->phy_bits = 0; in _mapping_clear_map_entry()
74 map_entry->dpm_entry_num = MPS_DPM_BAD_IDX; in _mapping_clear_map_entry()
75 map_entry->dev_handle = 0; in _mapping_clear_map_entry()
76 map_entry->id = -1; in _mapping_clear_map_entry()
77 map_entry->missing_count = 0; in _mapping_clear_map_entry()
78 map_entry->init_complete = 0; in _mapping_clear_map_entry()
79 map_entry->TLR_bits = (u8)MPI2_SCSIIO_CONTROL_NO_TLR; in _mapping_clear_map_entry()
83 * _mapping_clear_enc_entry - Clear a particular enclosure table entry.
91 enc_entry->enclosure_id = 0; in _mapping_clear_enc_entry()
92 enc_entry->start_index = MPS_MAPTABLE_BAD_IDX; in _mapping_clear_enc_entry()
93 enc_entry->phy_bits = 0; in _mapping_clear_enc_entry()
94 enc_entry->dpm_entry_num = MPS_DPM_BAD_IDX; in _mapping_clear_enc_entry()
95 enc_entry->enc_handle = 0; in _mapping_clear_enc_entry()
96 enc_entry->num_slots = 0; in _mapping_clear_enc_entry()
97 enc_entry->start_slot = 0; in _mapping_clear_enc_entry()
98 enc_entry->missing_count = 0; in _mapping_clear_enc_entry()
99 enc_entry->removal_flag = 0; in _mapping_clear_enc_entry()
100 enc_entry->skip_search = 0; in _mapping_clear_enc_entry()
101 enc_entry->init_complete = 0; in _mapping_clear_enc_entry()
105 * _mapping_commit_enc_entry - write a particular enc entry in DPM page0.
106 * @sc: per adapter object
109 * Returns 0 for success, non-zero for failure.
120 if (!sc->is_dpm_enable) in _mapping_commit_enc_entry()
124 memcpy(&config_page.Header, (u8 *) sc->dpm_pg0, in _mapping_commit_enc_entry()
126 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in _mapping_commit_enc_entry()
128 dpm_entry += et_entry->dpm_entry_num; in _mapping_commit_enc_entry()
129 dpm_entry->PhysicalIdentifier.Low = in _mapping_commit_enc_entry()
130 ( 0xFFFFFFFF & et_entry->enclosure_id); in _mapping_commit_enc_entry()
131 dpm_entry->PhysicalIdentifier.High = in _mapping_commit_enc_entry()
132 ( et_entry->enclosure_id >> 32); in _mapping_commit_enc_entry()
133 mt_entry = &sc->mapping_table[et_entry->start_index]; in _mapping_commit_enc_entry()
134 dpm_entry->DeviceIndex = htole16(mt_entry->id); in _mapping_commit_enc_entry()
135 dpm_entry->MappingInformation = et_entry->num_slots; in _mapping_commit_enc_entry()
136 dpm_entry->MappingInformation <<= MPI2_DRVMAP0_MAPINFO_SLOT_SHIFT; in _mapping_commit_enc_entry()
137 dpm_entry->MappingInformation |= et_entry->missing_count; in _mapping_commit_enc_entry()
138 dpm_entry->MappingInformation = htole16(dpm_entry->MappingInformation); in _mapping_commit_enc_entry()
139 dpm_entry->PhysicalBitsMapping = htole32(et_entry->phy_bits); in _mapping_commit_enc_entry()
140 dpm_entry->Reserved1 = 0; in _mapping_commit_enc_entry()
143 __func__, et_entry->dpm_entry_num); in _mapping_commit_enc_entry()
147 et_entry->dpm_entry_num)) { in _mapping_commit_enc_entry()
150 et_entry->dpm_entry_num); in _mapping_commit_enc_entry()
151 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_commit_enc_entry()
153 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_commit_enc_entry()
154 dpm_entry->PhysicalBitsMapping = in _mapping_commit_enc_entry()
155 le32toh(dpm_entry->PhysicalBitsMapping); in _mapping_commit_enc_entry()
156 return -1; in _mapping_commit_enc_entry()
158 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_commit_enc_entry()
160 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_commit_enc_entry()
161 dpm_entry->PhysicalBitsMapping = in _mapping_commit_enc_entry()
162 le32toh(dpm_entry->PhysicalBitsMapping); in _mapping_commit_enc_entry()
167 * _mapping_commit_map_entry - write a particular map table entry in DPM page0.
168 * @sc: per adapter object
171 * Returns 0 for success, non-zero for failure.
182 if (!sc->is_dpm_enable) in _mapping_commit_map_entry()
187 * can happen if the Map Entry is a for a missing device and the DPM in _mapping_commit_map_entry()
188 * entry that was being used by this device is now being used by some in _mapping_commit_map_entry()
189 * new device. So, check for a BAD DPM index and just return if so. in _mapping_commit_map_entry()
191 if (mt_entry->dpm_entry_num == MPS_DPM_BAD_IDX) { in _mapping_commit_map_entry()
194 mt_entry->id); in _mapping_commit_map_entry()
199 memcpy(&config_page.Header, (u8 *)sc->dpm_pg0, in _mapping_commit_map_entry()
201 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *) sc->dpm_pg0 + in _mapping_commit_map_entry()
203 dpm_entry = dpm_entry + mt_entry->dpm_entry_num; in _mapping_commit_map_entry()
204 dpm_entry->PhysicalIdentifier.Low = (0xFFFFFFFF & in _mapping_commit_map_entry()
205 mt_entry->physical_id); in _mapping_commit_map_entry()
206 dpm_entry->PhysicalIdentifier.High = (mt_entry->physical_id >> 32); in _mapping_commit_map_entry()
207 dpm_entry->DeviceIndex = htole16(mt_entry->id); in _mapping_commit_map_entry()
208 dpm_entry->MappingInformation = htole16(mt_entry->missing_count); in _mapping_commit_map_entry()
209 dpm_entry->PhysicalBitsMapping = 0; in _mapping_commit_map_entry()
210 dpm_entry->Reserved1 = 0; in _mapping_commit_map_entry()
215 __func__, mt_entry->dpm_entry_num, mt_entry->id); in _mapping_commit_map_entry()
217 mt_entry->dpm_entry_num)) { in _mapping_commit_map_entry()
220 mt_entry->dpm_entry_num, mt_entry->id); in _mapping_commit_map_entry()
221 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_commit_map_entry()
223 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_commit_map_entry()
224 return -1; in _mapping_commit_map_entry()
227 dpm_entry->MappingInformation = le16toh(dpm_entry->MappingInformation); in _mapping_commit_map_entry()
228 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_commit_map_entry()
233 * _mapping_get_ir_maprange - get start and end index for IR map range.
234 * @sc: per adapter object
240 * in the device mapping table
248 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_get_ir_maprange()
250 volume_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) & in _mapping_get_ir_maprange()
257 *start_idx = sc->max_devices - sc->max_volumes; in _mapping_get_ir_maprange()
258 *end_idx = *start_idx + sc->max_volumes - 1; in _mapping_get_ir_maprange()
262 * _mapping_get_enc_idx_from_id - get enclosure index from enclosure ID
263 * @sc: per adapter object
275 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; enc_idx++) { in _mapping_get_enc_idx_from_id()
276 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_get_enc_idx_from_id()
277 if ((et_entry->enclosure_id == le64toh(enc_id)) && in _mapping_get_enc_idx_from_id()
278 (!et_entry->phy_bits || (et_entry->phy_bits & in _mapping_get_enc_idx_from_id()
286 * _mapping_get_enc_idx_from_handle - get enclosure index from handle
287 * @sc: per adapter object
298 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; enc_idx++) { in _mapping_get_enc_idx_from_handle()
299 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_get_enc_idx_from_handle()
300 if (et_entry->missing_count) in _mapping_get_enc_idx_from_handle()
302 if (et_entry->enc_handle == handle) in _mapping_get_enc_idx_from_handle()
309 * _mapping_get_high_missing_et_idx - get missing enclosure index
310 * @sc: per adapter object
324 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; enc_idx++) { in _mapping_get_high_missing_et_idx()
325 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_get_high_missing_et_idx()
326 if ((et_entry->missing_count > high_missing_count) && in _mapping_get_high_missing_et_idx()
327 !et_entry->skip_search) { in _mapping_get_high_missing_et_idx()
328 high_missing_count = et_entry->missing_count; in _mapping_get_high_missing_et_idx()
336 * _mapping_get_high_missing_mt_idx - get missing map table index
337 * @sc: per adapter object
339 * Search through the map table and identifies the device entry
351 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_get_high_missing_mt_idx()
356 end_idx = sc->max_devices; in _mapping_get_high_missing_mt_idx()
359 if (sc->ir_firmware) { in _mapping_get_high_missing_mt_idx()
366 mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_high_missing_mt_idx()
368 if (mt_entry->missing_count > high_missing_count) { in _mapping_get_high_missing_mt_idx()
369 high_missing_count = mt_entry->missing_count; in _mapping_get_high_missing_mt_idx()
377 * _mapping_get_ir_mt_idx_from_wwid - get map table index from volume WWID
378 * @sc: per adapter object
390 mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_ir_mt_idx_from_wwid()
392 if (mt_entry->physical_id == wwid) in _mapping_get_ir_mt_idx_from_wwid()
399 * _mapping_get_mt_idx_from_id - get map table index from a device ID
400 * @sc: per adapter object
401 * @dev_id: device identifer (SAS Address)
411 for (map_idx = 0; map_idx < sc->max_devices; map_idx++) { in _mapping_get_mt_idx_from_id()
412 mt_entry = &sc->mapping_table[map_idx]; in _mapping_get_mt_idx_from_id()
413 if (mt_entry->physical_id == dev_id) in _mapping_get_mt_idx_from_id()
420 * _mapping_get_ir_mt_idx_from_handle - get map table index from volume handle
421 * @sc: per adapter object
422 * @wwid: volume device handle
433 mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_ir_mt_idx_from_handle()
435 if (mt_entry->dev_handle == volHandle) in _mapping_get_ir_mt_idx_from_handle()
442 * _mapping_get_mt_idx_from_handle - get map table index from handle
443 * @sc: per adapter object
444 * @dev_id: device handle
454 for (map_idx = 0; map_idx < sc->max_devices; map_idx++) { in _mapping_get_mt_idx_from_handle()
455 mt_entry = &sc->mapping_table[map_idx]; in _mapping_get_mt_idx_from_handle()
456 if (mt_entry->dev_handle == handle) in _mapping_get_mt_idx_from_handle()
463 * _mapping_get_free_ir_mt_idx - get first free index for a volume
464 * @sc: per adapter object
488 mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_free_ir_mt_idx()
490 if (!(mt_entry->device_info & MPS_MAP_IN_USE)) in _mapping_get_free_ir_mt_idx()
493 if (mt_entry->missing_count > high_missing_count) { in _mapping_get_free_ir_mt_idx()
494 high_missing_count = mt_entry->missing_count; in _mapping_get_free_ir_mt_idx()
509 * _mapping_get_free_mt_idx - get first free index for a device
510 * @sc: per adapter object
518 u32 map_idx, max_idx = sc->max_devices; in _mapping_get_free_mt_idx()
519 struct dev_mapping_table *mt_entry = &sc->mapping_table[start_idx]; in _mapping_get_free_mt_idx()
522 volume_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) & in _mapping_get_free_mt_idx()
524 if (sc->ir_firmware && (volume_mapping_flags == in _mapping_get_free_mt_idx()
526 max_idx -= sc->max_volumes; in _mapping_get_free_mt_idx()
529 if (!(mt_entry->device_info & (MPS_MAP_IN_USE | in _mapping_get_free_mt_idx()
537 * _mapping_get_dpm_idx_from_id - get DPM index from ID
538 * @sc: per adapter object
539 * @id: volume WWID or enclosure ID or device ID
550 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in _mapping_get_dpm_idx_from_id()
552 PhysicalIdentifier = dpm_entry->PhysicalIdentifier.High; in _mapping_get_dpm_idx_from_id()
554 dpm_entry->PhysicalIdentifier.Low; in _mapping_get_dpm_idx_from_id()
555 for (entry_num = 0; entry_num < sc->max_dpm_entries; entry_num++, in _mapping_get_dpm_idx_from_id()
558 (!phy_bits || !dpm_entry->PhysicalBitsMapping || in _mapping_get_dpm_idx_from_id()
559 (phy_bits & dpm_entry->PhysicalBitsMapping))) in _mapping_get_dpm_idx_from_id()
566 * _mapping_get_free_dpm_idx - get first available DPM index
567 * @sc: per adapter object
581 for (entry_num = 0; entry_num < sc->max_dpm_entries; entry_num++) { in _mapping_get_free_dpm_idx()
582 dpm_entry = (Mpi2DriverMap0Entry_t *) ((u8 *)sc->dpm_pg0 + in _mapping_get_free_dpm_idx()
585 missing_cnt = dpm_entry->MappingInformation & in _mapping_get_free_dpm_idx()
592 if (sc->dpm_entry_used[entry_num] && !missing_cnt) in _mapping_get_free_dpm_idx()
601 if (!sc->dpm_entry_used[entry_num]) { in _mapping_get_free_dpm_idx()
614 * it means that some device was already using this entry but it's in _mapping_get_free_dpm_idx()
616 * device's DPM entry and the mapping table needs to be cleared. To do in _mapping_get_free_dpm_idx()
617 * this, use the Physical ID of the old device still in the DPM entry in _mapping_get_free_dpm_idx()
621 sc->dpm_entry_used[current_entry]) { in _mapping_get_free_dpm_idx()
622 dpm_entry = (Mpi2DriverMap0Entry_t *) ((u8 *)sc->dpm_pg0 + in _mapping_get_free_dpm_idx()
625 physical_id = dpm_entry->PhysicalIdentifier.High; in _mapping_get_free_dpm_idx()
627 dpm_entry->PhysicalIdentifier.Low; in _mapping_get_free_dpm_idx()
630 mt_entry = &sc->mapping_table[map_idx]; in _mapping_get_free_dpm_idx()
631 mt_entry->dpm_entry_num = MPS_DPM_BAD_IDX; in _mapping_get_free_dpm_idx()
638 * _mapping_update_ir_missing_cnt - Updates missing count for a volume
639 * @sc: per adapter object
653 u8 missing_cnt, reason = element->ReasonCode, update_dpm = 1; in _mapping_update_ir_missing_cnt()
666 mt_entry = &sc->mapping_table[map_idx]; in _mapping_update_ir_missing_cnt()
667 mt_entry->init_complete = 1; in _mapping_update_ir_missing_cnt()
670 mt_entry->missing_count = 0; in _mapping_update_ir_missing_cnt()
672 if (mt_entry->missing_count < MPS_MAX_MISSING_COUNT) in _mapping_update_ir_missing_cnt()
673 mt_entry->missing_count++; in _mapping_update_ir_missing_cnt()
675 mt_entry->device_info &= ~MPS_MAP_IN_USE; in _mapping_update_ir_missing_cnt()
676 mt_entry->dev_handle = 0; in _mapping_update_ir_missing_cnt()
685 if (!sc->is_dpm_enable) in _mapping_update_ir_missing_cnt()
687 dpm_idx = mt_entry->dpm_entry_num; in _mapping_update_ir_missing_cnt()
705 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in _mapping_update_ir_missing_cnt()
708 missing_cnt = dpm_entry->MappingInformation & in _mapping_update_ir_missing_cnt()
710 if ((mt_entry->physical_id == in _mapping_update_ir_missing_cnt()
711 le64toh(((u64)dpm_entry->PhysicalIdentifier.High << 32) | in _mapping_update_ir_missing_cnt()
712 (u64)dpm_entry->PhysicalIdentifier.Low)) && (missing_cnt == in _mapping_update_ir_missing_cnt()
713 mt_entry->missing_count)) { in _mapping_update_ir_missing_cnt()
716 __func__, mt_entry->id); in _mapping_update_ir_missing_cnt()
728 "with target ID %d.\n", __func__, mt_entry->id); in _mapping_update_ir_missing_cnt()
730 mt_entry->dpm_entry_num = dpm_idx; in _mapping_update_ir_missing_cnt()
731 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in _mapping_update_ir_missing_cnt()
734 dpm_entry->PhysicalIdentifier.Low = in _mapping_update_ir_missing_cnt()
735 (0xFFFFFFFF & mt_entry->physical_id); in _mapping_update_ir_missing_cnt()
736 dpm_entry->PhysicalIdentifier.High = in _mapping_update_ir_missing_cnt()
737 (mt_entry->physical_id >> 32); in _mapping_update_ir_missing_cnt()
738 dpm_entry->DeviceIndex = map_idx; in _mapping_update_ir_missing_cnt()
739 dpm_entry->MappingInformation = mt_entry->missing_count; in _mapping_update_ir_missing_cnt()
740 dpm_entry->PhysicalBitsMapping = 0; in _mapping_update_ir_missing_cnt()
741 dpm_entry->Reserved1 = 0; in _mapping_update_ir_missing_cnt()
742 sc->dpm_flush_entry[dpm_idx] = 1; in _mapping_update_ir_missing_cnt()
743 sc->dpm_entry_used[dpm_idx] = 1; in _mapping_update_ir_missing_cnt()
747 __func__, mt_entry->id); in _mapping_update_ir_missing_cnt()
752 * _mapping_add_to_removal_table - add DPM index to the removal table
753 * @sc: per adapter object
770 if (!sc->is_dpm_enable) in _mapping_add_to_removal_table()
777 remove_entry = sc->removal_table; in _mapping_add_to_removal_table()
779 for (i = 0; i < sc->max_devices; i++, remove_entry++) { in _mapping_add_to_removal_table()
780 if (remove_entry->dpm_entry_num != MPS_DPM_BAD_IDX) in _mapping_add_to_removal_table()
785 remove_entry->dpm_entry_num = dpm_idx; in _mapping_add_to_removal_table()
792 * _mapping_update_missing_count - Update missing count for a device
793 * @sc: per adapter object
796 * Increment the missing count in the mapping table for a device that is not
798 * Currently, this function only increments the missing count if the device
810 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_update_missing_count()
817 for (entry = 0; entry < topo_change->num_entries; entry++) { in _mapping_update_missing_count()
818 phy_change = &topo_change->phy_details[entry]; in _mapping_update_missing_count()
819 if (!phy_change->dev_handle || (phy_change->reason != in _mapping_update_missing_count()
822 map_idx = _mapping_get_mt_idx_from_handle(sc, phy_change-> in _mapping_update_missing_count()
824 phy_change->is_processed = 1; in _mapping_update_missing_count()
826 mps_dprint(sc, MPS_INFO | MPS_MAPPING, "%s: device is " in _mapping_update_missing_count()
830 mt_entry = &sc->mapping_table[map_idx]; in _mapping_update_missing_count()
831 if (mt_entry->missing_count < MPS_MAX_MISSING_COUNT) in _mapping_update_missing_count()
832 mt_entry->missing_count++; in _mapping_update_missing_count()
835 * When using Enc/Slot mapping, when a device is removed, it's in _mapping_update_missing_count()
837 * target ID will be incorrect if this same device is re-added in _mapping_update_missing_count()
846 * When using device mapping, update the missing count in the in _mapping_update_missing_count()
851 sc->is_dpm_enable && in _mapping_update_missing_count()
852 mt_entry->dpm_entry_num != MPS_DPM_BAD_IDX) { in _mapping_update_missing_count()
854 (Mpi2DriverMap0Entry_t *) ((u8 *)sc->dpm_pg0 + in _mapping_update_missing_count()
856 dpm_entry += mt_entry->dpm_entry_num; in _mapping_update_missing_count()
857 if (dpm_entry->MappingInformation != in _mapping_update_missing_count()
858 mt_entry->missing_count) { in _mapping_update_missing_count()
859 dpm_entry->MappingInformation = in _mapping_update_missing_count()
860 mt_entry->missing_count; in _mapping_update_missing_count()
861 sc->dpm_flush_entry[mt_entry->dpm_entry_num] = in _mapping_update_missing_count()
869 * _mapping_find_enc_map_space -find map table entries for enclosure
870 * @sc: per adapter object
889 u16 max_num_phy_ids = le16toh(sc->ioc_pg8.MaxNumPhysicalMappedIDs); in _mapping_find_enc_map_space()
891 skip_count = sc->num_rsvd_entries; in _mapping_find_enc_map_space()
894 vol_mapping_flags = le16toh(sc->ioc_pg8.IRVolumeMappingFlags) & in _mapping_find_enc_map_space()
901 if (!sc->ir_firmware) in _mapping_find_enc_map_space()
902 end_of_table = sc->max_devices; in _mapping_find_enc_map_space()
904 end_of_table = sc->max_devices; in _mapping_find_enc_map_space()
906 end_of_table = sc->max_devices - sc->max_volumes; in _mapping_find_enc_map_space()
915 * enclosure and the device that is already mapped. in _mapping_find_enc_map_space()
921 mt_entry = &sc->mapping_table[map_idx]; in _mapping_find_enc_map_space()
922 if ((et_entry->enclosure_id == mt_entry->physical_id) && in _mapping_find_enc_map_space()
923 (!mt_entry->phy_bits || (mt_entry->phy_bits & in _mapping_find_enc_map_space()
924 et_entry->phy_bits))) { in _mapping_find_enc_map_space()
926 if (num_found == et_entry->num_slots) { in _mapping_find_enc_map_space()
927 start_idx = (map_idx - num_found) + 1; in _mapping_find_enc_map_space()
945 mt_entry = &sc->mapping_table[map_idx]; in _mapping_find_enc_map_space()
946 if (!(mt_entry->device_info & MPS_DEV_RESERVED)) { in _mapping_find_enc_map_space()
948 if (num_found == et_entry->num_slots) { in _mapping_find_enc_map_space()
949 start_idx = (map_idx - num_found) + 1; in _mapping_find_enc_map_space()
985 enc_entry = &sc->enclosure_table[enc_idx]; in _mapping_find_enc_map_space()
986 enc_entry->skip_search = 1; in _mapping_find_enc_map_space()
989 * Unmark all of the missing enclosure's device's reserved in _mapping_find_enc_map_space()
995 mt_entry = &sc->mapping_table[enc_entry->start_index]; in _mapping_find_enc_map_space()
996 for (map_idx = enc_entry->start_index; map_idx < in _mapping_find_enc_map_space()
997 (enc_entry->start_index + enc_entry->num_slots); map_idx++, in _mapping_find_enc_map_space()
999 mt_entry->device_info &= ~MPS_DEV_RESERVED; in _mapping_find_enc_map_space()
1011 mt_entry = &sc->mapping_table[map_idx]; in _mapping_find_enc_map_space()
1012 if (!(mt_entry->device_info & MPS_DEV_RESERVED)) { in _mapping_find_enc_map_space()
1014 if (num_found == et_entry->num_slots) { in _mapping_find_enc_map_space()
1015 start_idx = (map_idx - num_found) + 1; in _mapping_find_enc_map_space()
1037 enc_entry = sc->enclosure_table; in _mapping_find_enc_map_space()
1038 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; in _mapping_find_enc_map_space()
1040 if (map_idx < enc_entry->start_index || in _mapping_find_enc_map_space()
1041 map_idx > (enc_entry->start_index + in _mapping_find_enc_map_space()
1042 enc_entry->num_slots)) in _mapping_find_enc_map_space()
1044 if (!enc_entry->removal_flag) { in _mapping_find_enc_map_space()
1049 enc_entry->removal_flag = 1; in _mapping_find_enc_map_space()
1051 enc_entry->dpm_entry_num); in _mapping_find_enc_map_space()
1053 mt_entry = &sc->mapping_table[map_idx]; in _mapping_find_enc_map_space()
1055 if (map_idx == (enc_entry->start_index + in _mapping_find_enc_map_space()
1056 enc_entry->num_slots - 1)) in _mapping_find_enc_map_space()
1070 enc_entry = sc->enclosure_table; in _mapping_find_enc_map_space()
1071 for (enc_idx = 0; enc_idx < sc->num_enc_table_entries; in _mapping_find_enc_map_space()
1073 if (!enc_entry->removal_flag) { in _mapping_find_enc_map_space()
1077 mt_entry = &sc->mapping_table[enc_entry-> in _mapping_find_enc_map_space()
1079 for (map_idx = enc_entry->start_index; map_idx < in _mapping_find_enc_map_space()
1080 (enc_entry->start_index + in _mapping_find_enc_map_space()
1081 enc_entry->num_slots); map_idx++, in _mapping_find_enc_map_space()
1083 mt_entry->device_info |= in _mapping_find_enc_map_space()
1085 et_entry->skip_search = 0; in _mapping_find_enc_map_space()
1094 * _mapping_get_dev_info -get information about newly added devices
1095 * @sc: per adapter object
1098 * Search through the topology change event list and issues sas device pg0
1099 * requests for the newly added device and reserved entries in tables
1107 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_get_dev_info()
1119 for (entry = 0; entry < topo_change->num_entries; entry++) { in _mapping_get_dev_info()
1120 phy_change = &topo_change->phy_details[entry]; in _mapping_get_dev_info()
1121 if (phy_change->is_processed || !phy_change->dev_handle || in _mapping_get_dev_info()
1122 phy_change->reason != MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED) in _mapping_get_dev_info()
1127 phy_change->dev_handle)) { in _mapping_get_dev_info()
1128 phy_change->is_processed = 1; in _mapping_get_dev_info()
1144 &sas_address, phy_change->dev_handle, device_info, in _mapping_get_dev_info()
1145 &phy_change->is_SATA_SSD); in _mapping_get_dev_info()
1149 "for SATA device with handle 0x%04x\n", in _mapping_get_dev_info()
1150 __func__, phy_change->dev_handle); in _mapping_get_dev_info()
1154 phy_change->physical_id = sas_address; in _mapping_get_dev_info()
1155 phy_change->slot = le16toh(sas_device_pg0.Slot); in _mapping_get_dev_info()
1156 phy_change->device_info = device_info; in _mapping_get_dev_info()
1159 * When using Enc/Slot mapping, if this device is an enclosure in _mapping_get_dev_info()
1171 topo_change->enc_handle); in _mapping_get_dev_info()
1173 phy_change->is_processed = 1; in _mapping_get_dev_info()
1175 "failed to add the device with handle " in _mapping_get_dev_info()
1178 phy_change->dev_handle, in _mapping_get_dev_info()
1179 topo_change->enc_handle); in _mapping_get_dev_info()
1182 if (!((phy_change->device_info & in _mapping_get_dev_info()
1184 (phy_change->device_info & in _mapping_get_dev_info()
1188 phy_change->is_processed = 1; in _mapping_get_dev_info()
1191 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_get_dev_info()
1197 if (et_entry->start_index != MPS_MAPTABLE_BAD_IDX) in _mapping_get_dev_info()
1206 if (!topo_change->exp_handle) { in _mapping_get_dev_info()
1207 map_idx = sc->num_rsvd_entries; in _mapping_get_dev_info()
1208 et_entry->start_index = map_idx; in _mapping_get_dev_info()
1212 et_entry->start_index = map_idx; in _mapping_get_dev_info()
1224 if (et_entry->start_index == in _mapping_get_dev_info()
1232 (uintmax_t)et_entry->enclosure_id); in _mapping_get_dev_info()
1233 phy_change->is_processed = 1; in _mapping_get_dev_info()
1235 topo_change->num_entries; in _mapping_get_dev_info()
1238 &topo_change->phy_details in _mapping_get_dev_info()
1240 if (tmp_phy_change->reason == in _mapping_get_dev_info()
1242 tmp_phy_change-> in _mapping_get_dev_info()
1256 " %d.\n", __func__, et_entry->num_slots, map_idx); in _mapping_get_dev_info()
1257 mt_entry = &sc->mapping_table[map_idx]; in _mapping_get_dev_info()
1258 for (index = map_idx; index < (et_entry->num_slots in _mapping_get_dev_info()
1260 mt_entry->device_info = MPS_DEV_RESERVED; in _mapping_get_dev_info()
1261 mt_entry->physical_id = et_entry->enclosure_id; in _mapping_get_dev_info()
1262 mt_entry->phy_bits = et_entry->phy_bits; in _mapping_get_dev_info()
1263 mt_entry->missing_count = 0; in _mapping_get_dev_info()
1270 * _mapping_set_mid_to_eid -set map table data from enclosure table
1271 * @sc: per adapter object
1281 u16 slots = et_entry->num_slots, map_idx; in _mapping_set_mid_to_eid()
1282 u32 start_idx = et_entry->start_index; in _mapping_set_mid_to_eid()
1285 mt_entry = &sc->mapping_table[start_idx]; in _mapping_set_mid_to_eid()
1287 mt_entry->physical_id = et_entry->enclosure_id; in _mapping_set_mid_to_eid()
1292 * _mapping_clear_removed_entries - mark the entries to be cleared
1293 * @sc: per adapter object
1309 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_clear_removed_entries()
1311 if (sc->is_dpm_enable) { in _mapping_clear_removed_entries()
1312 remove_entry = sc->removal_table; in _mapping_clear_removed_entries()
1313 for (remove_idx = 0; remove_idx < sc->max_devices; in _mapping_clear_removed_entries()
1315 if (remove_entry->dpm_entry_num != MPS_DPM_BAD_IDX) { in _mapping_clear_removed_entries()
1317 ((u8 *) sc->dpm_pg0 + in _mapping_clear_removed_entries()
1319 dpm_entry += remove_entry->dpm_entry_num; in _mapping_clear_removed_entries()
1320 dpm_entry->PhysicalIdentifier.Low = 0; in _mapping_clear_removed_entries()
1321 dpm_entry->PhysicalIdentifier.High = 0; in _mapping_clear_removed_entries()
1322 dpm_entry->DeviceIndex = 0; in _mapping_clear_removed_entries()
1323 dpm_entry->MappingInformation = 0; in _mapping_clear_removed_entries()
1324 dpm_entry->PhysicalBitsMapping = 0; in _mapping_clear_removed_entries()
1325 sc->dpm_flush_entry[remove_entry-> in _mapping_clear_removed_entries()
1327 sc->dpm_entry_used[remove_entry->dpm_entry_num] in _mapping_clear_removed_entries()
1329 remove_entry->dpm_entry_num = MPS_DPM_BAD_IDX; in _mapping_clear_removed_entries()
1342 num_entries = sc->num_enc_table_entries; in _mapping_clear_removed_entries()
1345 et_entry = sc->enclosure_table; in _mapping_clear_removed_entries()
1347 if (!et_entry->enc_handle && et_entry-> in _mapping_clear_removed_entries()
1350 if (i != (num_entries - 1)) { in _mapping_clear_removed_entries()
1351 from = &sc->enclosure_table in _mapping_clear_removed_entries()
1353 to = &sc->enclosure_table[i]; in _mapping_clear_removed_entries()
1354 for (m = i; m < (num_entries - in _mapping_clear_removed_entries()
1361 sc->num_enc_table_entries--; in _mapping_clear_removed_entries()
1363 sc->num_enc_table_entries; in _mapping_clear_removed_entries()
1367 sc->num_enc_table_entries--; in _mapping_clear_removed_entries()
1369 sc->num_enc_table_entries; in _mapping_clear_removed_entries()
1378 * _mapping_add_new_device -Add the new device into mapping table
1379 * @sc: per adapter object
1398 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_add_new_device()
1403 u16 max_num_phy_ids = le16toh(sc->ioc_pg8.MaxNumPhysicalMappedIDs); in _mapping_add_new_device()
1405 for (entry = 0; entry < topo_change->num_entries; entry++) { in _mapping_add_new_device()
1406 phy_change = &topo_change->phy_details[entry]; in _mapping_add_new_device()
1407 if (phy_change->is_processed) in _mapping_add_new_device()
1409 if (phy_change->reason != MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED || in _mapping_add_new_device()
1410 !phy_change->dev_handle) { in _mapping_add_new_device()
1411 phy_change->is_processed = 1; in _mapping_add_new_device()
1417 (sc, topo_change->enc_handle); in _mapping_add_new_device()
1419 phy_change->is_processed = 1; in _mapping_add_new_device()
1421 "failed to add the device with handle " in _mapping_add_new_device()
1424 phy_change->dev_handle, in _mapping_add_new_device()
1425 topo_change->enc_handle); in _mapping_add_new_device()
1436 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_add_new_device()
1437 if (et_entry->start_index == MPS_MAPTABLE_BAD_IDX) { in _mapping_add_new_device()
1438 phy_change->is_processed = 1; in _mapping_add_new_device()
1440 "failed to add the device with handle " in _mapping_add_new_device()
1443 __func__, phy_change->dev_handle); in _mapping_add_new_device()
1448 * Add this device to the mapping table at the correct in _mapping_add_new_device()
1452 map_idx = et_entry->start_index + phy_change->slot - in _mapping_add_new_device()
1453 et_entry->start_slot; in _mapping_add_new_device()
1454 mt_entry = &sc->mapping_table[map_idx]; in _mapping_add_new_device()
1455 mt_entry->physical_id = phy_change->physical_id; in _mapping_add_new_device()
1456 mt_entry->id = map_idx; in _mapping_add_new_device()
1457 mt_entry->dev_handle = phy_change->dev_handle; in _mapping_add_new_device()
1458 mt_entry->missing_count = 0; in _mapping_add_new_device()
1459 mt_entry->dpm_entry_num = et_entry->dpm_entry_num; in _mapping_add_new_device()
1460 mt_entry->device_info = phy_change->device_info | in _mapping_add_new_device()
1462 if (sc->is_dpm_enable) { in _mapping_add_new_device()
1463 dpm_idx = et_entry->dpm_entry_num; in _mapping_add_new_device()
1466 (sc, et_entry->enclosure_id, in _mapping_add_new_device()
1467 et_entry->phy_bits); in _mapping_add_new_device()
1473 ((u8 *) sc->dpm_pg0 + in _mapping_add_new_device()
1476 dpm_entry-> in _mapping_add_new_device()
1479 et_entry->enclosure_id); in _mapping_add_new_device()
1480 dpm_entry-> in _mapping_add_new_device()
1482 (et_entry->enclosure_id in _mapping_add_new_device()
1484 dpm_entry->DeviceIndex = in _mapping_add_new_device()
1485 (U16)et_entry->start_index; in _mapping_add_new_device()
1486 dpm_entry->MappingInformation = in _mapping_add_new_device()
1487 et_entry->num_slots; in _mapping_add_new_device()
1488 dpm_entry->MappingInformation in _mapping_add_new_device()
1490 dpm_entry->PhysicalBitsMapping in _mapping_add_new_device()
1491 = et_entry->phy_bits; in _mapping_add_new_device()
1492 et_entry->dpm_entry_num = in _mapping_add_new_device()
1494 sc->dpm_entry_used[dpm_idx] = 1; in _mapping_add_new_device()
1495 sc->dpm_flush_entry[dpm_idx] = in _mapping_add_new_device()
1497 phy_change->is_processed = 1; in _mapping_add_new_device()
1499 phy_change->is_processed = 1; in _mapping_add_new_device()
1502 "to add the device with " in _mapping_add_new_device()
1507 phy_change->dev_handle); in _mapping_add_new_device()
1510 et_entry->dpm_entry_num = dpm_idx; in _mapping_add_new_device()
1511 mt_entry->dpm_entry_num = dpm_idx; in _mapping_add_new_device()
1514 et_entry->init_complete = 1; in _mapping_add_new_device()
1519 * Get the mapping table index for this device. If it's in _mapping_add_new_device()
1528 (sc, phy_change->physical_id); in _mapping_add_new_device()
1530 search_idx = sc->num_rsvd_entries; in _mapping_add_new_device()
1531 if (topo_change->exp_handle) in _mapping_add_new_device()
1538 * If an entry will be used that has a missing device, in _mapping_add_new_device()
1544 mt_entry = &sc->mapping_table[map_idx]; in _mapping_add_new_device()
1546 mt_entry->dpm_entry_num); in _mapping_add_new_device()
1548 mt_entry->init_complete = 0; in _mapping_add_new_device()
1552 mt_entry = &sc->mapping_table[map_idx]; in _mapping_add_new_device()
1553 mt_entry->physical_id = phy_change->physical_id; in _mapping_add_new_device()
1554 mt_entry->id = map_idx; in _mapping_add_new_device()
1555 mt_entry->dev_handle = phy_change->dev_handle; in _mapping_add_new_device()
1556 mt_entry->missing_count = 0; in _mapping_add_new_device()
1557 mt_entry->device_info = phy_change->device_info in _mapping_add_new_device()
1560 phy_change->is_processed = 1; in _mapping_add_new_device()
1562 "failed to add the device with handle " in _mapping_add_new_device()
1565 __func__, phy_change->dev_handle); in _mapping_add_new_device()
1568 if (sc->is_dpm_enable) { in _mapping_add_new_device()
1569 if (mt_entry->dpm_entry_num != in _mapping_add_new_device()
1571 dpm_idx = mt_entry->dpm_entry_num; in _mapping_add_new_device()
1573 ((u8 *)sc->dpm_pg0 + hdr_sz); in _mapping_add_new_device()
1575 missing_cnt = dpm_entry-> in _mapping_add_new_device()
1578 temp64_var = dpm_entry-> in _mapping_add_new_device()
1581 dpm_entry->PhysicalIdentifier.Low; in _mapping_add_new_device()
1589 if ((mt_entry->physical_id == in _mapping_add_new_device()
1591 mt_entry->init_complete = 1; in _mapping_add_new_device()
1593 mt_entry->init_complete = 0; in _mapping_add_new_device()
1596 mt_entry->init_complete = 0; in _mapping_add_new_device()
1599 !mt_entry->init_complete) { in _mapping_add_new_device()
1600 mt_entry->dpm_entry_num = dpm_idx; in _mapping_add_new_device()
1602 ((u8 *)sc->dpm_pg0 + hdr_sz); in _mapping_add_new_device()
1604 dpm_entry->PhysicalIdentifier.Low = in _mapping_add_new_device()
1606 mt_entry->physical_id); in _mapping_add_new_device()
1607 dpm_entry->PhysicalIdentifier.High = in _mapping_add_new_device()
1608 (mt_entry->physical_id >> 32); in _mapping_add_new_device()
1609 dpm_entry->DeviceIndex = (U16) map_idx; in _mapping_add_new_device()
1610 dpm_entry->MappingInformation = 0; in _mapping_add_new_device()
1611 dpm_entry->PhysicalBitsMapping = 0; in _mapping_add_new_device()
1612 sc->dpm_entry_used[dpm_idx] = 1; in _mapping_add_new_device()
1613 sc->dpm_flush_entry[dpm_idx] = 1; in _mapping_add_new_device()
1614 phy_change->is_processed = 1; in _mapping_add_new_device()
1616 phy_change->is_processed = 1; in _mapping_add_new_device()
1618 "%s: failed to add the device with " in _mapping_add_new_device()
1622 phy_change->dev_handle); in _mapping_add_new_device()
1625 mt_entry->init_complete = 1; in _mapping_add_new_device()
1628 phy_change->is_processed = 1; in _mapping_add_new_device()
1635 * _mapping_flush_dpm_pages -Flush the DPM pages to NVRAM
1636 * @sc: per adapter object
1648 for (entry_num = 0; entry_num < sc->max_dpm_entries; entry_num++) { in _mapping_flush_dpm_pages()
1649 if (!sc->dpm_flush_entry[entry_num]) in _mapping_flush_dpm_pages()
1652 memcpy(&config_page.Header, (u8 *)sc->dpm_pg0, in _mapping_flush_dpm_pages()
1654 dpm_entry = (Mpi2DriverMap0Entry_t *) ((u8 *)sc->dpm_pg0 + in _mapping_flush_dpm_pages()
1657 dpm_entry->MappingInformation = htole16(dpm_entry-> in _mapping_flush_dpm_pages()
1659 dpm_entry->DeviceIndex = htole16(dpm_entry->DeviceIndex); in _mapping_flush_dpm_pages()
1660 dpm_entry->PhysicalBitsMapping = htole32(dpm_entry-> in _mapping_flush_dpm_pages()
1664 /* TODO-How to handle failed writes? */ in _mapping_flush_dpm_pages()
1670 "DPM entry %d for device failed\n", __func__, in _mapping_flush_dpm_pages()
1673 sc->dpm_flush_entry[entry_num] = 0; in _mapping_flush_dpm_pages()
1674 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_flush_dpm_pages()
1676 dpm_entry->DeviceIndex = le16toh(dpm_entry->DeviceIndex); in _mapping_flush_dpm_pages()
1677 dpm_entry->PhysicalBitsMapping = le32toh(dpm_entry-> in _mapping_flush_dpm_pages()
1683 * _mapping_allocate_memory- allocates the memory required for mapping tables
1684 * @sc: per adapter object
1688 * Return 0 on success or non-zero on failure.
1695 sc->mapping_table = malloc((sizeof(struct dev_mapping_table) * in mps_mapping_allocate_memory()
1696 sc->max_devices), M_MPT2, M_ZERO|M_NOWAIT); in mps_mapping_allocate_memory()
1697 if (!sc->mapping_table) in mps_mapping_allocate_memory()
1700 sc->removal_table = malloc((sizeof(struct map_removal_table) * in mps_mapping_allocate_memory()
1701 sc->max_devices), M_MPT2, M_ZERO|M_NOWAIT); in mps_mapping_allocate_memory()
1702 if (!sc->removal_table) in mps_mapping_allocate_memory()
1705 sc->enclosure_table = malloc((sizeof(struct enc_mapping_table) * in mps_mapping_allocate_memory()
1706 sc->max_enclosures), M_MPT2, M_ZERO|M_NOWAIT); in mps_mapping_allocate_memory()
1707 if (!sc->enclosure_table) in mps_mapping_allocate_memory()
1710 sc->dpm_entry_used = malloc((sizeof(u8) * sc->max_dpm_entries), in mps_mapping_allocate_memory()
1712 if (!sc->dpm_entry_used) in mps_mapping_allocate_memory()
1715 sc->dpm_flush_entry = malloc((sizeof(u8) * sc->max_dpm_entries), in mps_mapping_allocate_memory()
1717 if (!sc->dpm_flush_entry) in mps_mapping_allocate_memory()
1721 (sc->max_dpm_entries * sizeof(MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY)); in mps_mapping_allocate_memory()
1723 sc->dpm_pg0 = malloc(dpm_pg0_sz, M_MPT2, M_ZERO|M_NOWAIT); in mps_mapping_allocate_memory()
1724 if (!sc->dpm_pg0) { in mps_mapping_allocate_memory()
1727 sc->is_dpm_enable = 0; in mps_mapping_allocate_memory()
1733 free(sc->mapping_table, M_MPT2); in mps_mapping_allocate_memory()
1734 free(sc->removal_table, M_MPT2); in mps_mapping_allocate_memory()
1735 free(sc->enclosure_table, M_MPT2); in mps_mapping_allocate_memory()
1736 free(sc->dpm_entry_used, M_MPT2); in mps_mapping_allocate_memory()
1737 free(sc->dpm_flush_entry, M_MPT2); in mps_mapping_allocate_memory()
1738 free(sc->dpm_pg0, M_MPT2); in mps_mapping_allocate_memory()
1739 printf("%s: device initialization failed due to failure in mapping " in mps_mapping_allocate_memory()
1741 return -1; in mps_mapping_allocate_memory()
1745 * mps_mapping_free_memory- frees the memory allocated for mapping tables
1746 * @sc: per adapter object
1753 free(sc->mapping_table, M_MPT2); in mps_mapping_free_memory()
1754 free(sc->removal_table, M_MPT2); in mps_mapping_free_memory()
1755 free(sc->enclosure_table, M_MPT2); in mps_mapping_free_memory()
1756 free(sc->dpm_entry_used, M_MPT2); in mps_mapping_free_memory()
1757 free(sc->dpm_flush_entry, M_MPT2); in mps_mapping_free_memory()
1758 free(sc->dpm_pg0, M_MPT2); in mps_mapping_free_memory()
1769 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in _mapping_process_dpm_pg0()
1770 u16 max_num_phy_ids = le16toh(sc->ioc_pg8.MaxNumPhysicalMappedIDs); in _mapping_process_dpm_pg0()
1778 if (sc->ir_firmware) in _mapping_process_dpm_pg0()
1784 * have a non-zero ID. At this point, any ID with a value of 0 would be in _mapping_process_dpm_pg0()
1788 "mapping table.\n", __func__, sc->max_dpm_entries); in _mapping_process_dpm_pg0()
1789 dpm_entry = (Mpi2DriverMap0Entry_t *) ((uint8_t *) sc->dpm_pg0 + in _mapping_process_dpm_pg0()
1791 for (entry_num = 0; entry_num < sc->max_dpm_entries; entry_num++, in _mapping_process_dpm_pg0()
1793 physical_id = dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
1795 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
1797 sc->dpm_entry_used[entry_num] = 0; in _mapping_process_dpm_pg0()
1800 sc->dpm_entry_used[entry_num] = 1; in _mapping_process_dpm_pg0()
1801 dpm_entry->MappingInformation = le16toh(dpm_entry-> in _mapping_process_dpm_pg0()
1803 missing_cnt = dpm_entry->MappingInformation & in _mapping_process_dpm_pg0()
1805 dev_idx = le16toh(dpm_entry->DeviceIndex); in _mapping_process_dpm_pg0()
1806 phy_bits = le32toh(dpm_entry->PhysicalBitsMapping); in _mapping_process_dpm_pg0()
1814 if (sc->ir_firmware && (dev_idx >= start_idx) && in _mapping_process_dpm_pg0()
1816 mt_entry = &sc->mapping_table[dev_idx]; in _mapping_process_dpm_pg0()
1817 mt_entry->physical_id = in _mapping_process_dpm_pg0()
1818 dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
1819 mt_entry->physical_id = (mt_entry->physical_id << 32) | in _mapping_process_dpm_pg0()
1820 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
1821 mt_entry->id = dev_idx; in _mapping_process_dpm_pg0()
1822 mt_entry->missing_count = missing_cnt; in _mapping_process_dpm_pg0()
1823 mt_entry->dpm_entry_num = entry_num; in _mapping_process_dpm_pg0()
1824 mt_entry->device_info = MPS_DEV_RESERVED; in _mapping_process_dpm_pg0()
1837 if (dev_idx < (sc->num_rsvd_entries + in _mapping_process_dpm_pg0()
1846 num_slots = dpm_entry->MappingInformation & in _mapping_process_dpm_pg0()
1850 enc_idx = sc->num_enc_table_entries; in _mapping_process_dpm_pg0()
1851 if (enc_idx >= sc->max_enclosures) { in _mapping_process_dpm_pg0()
1855 sc->max_enclosures); in _mapping_process_dpm_pg0()
1858 sc->num_enc_table_entries++; in _mapping_process_dpm_pg0()
1859 et_entry = &sc->enclosure_table[enc_idx]; in _mapping_process_dpm_pg0()
1860 physical_id = dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
1861 et_entry->enclosure_id = (physical_id << 32) | in _mapping_process_dpm_pg0()
1862 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
1863 et_entry->start_index = dev_idx; in _mapping_process_dpm_pg0()
1864 et_entry->dpm_entry_num = entry_num; in _mapping_process_dpm_pg0()
1865 et_entry->num_slots = num_slots; in _mapping_process_dpm_pg0()
1866 et_entry->start_slot = slot_id; in _mapping_process_dpm_pg0()
1867 et_entry->missing_count = missing_cnt; in _mapping_process_dpm_pg0()
1868 et_entry->phy_bits = phy_bits; in _mapping_process_dpm_pg0()
1880 mt_entry = &sc->mapping_table[dev_idx]; in _mapping_process_dpm_pg0()
1883 if (mt_entry->dpm_entry_num != in _mapping_process_dpm_pg0()
1887 "enclosure %d device %d\n", in _mapping_process_dpm_pg0()
1892 dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
1893 mt_entry->physical_id = (physical_id << 32) | in _mapping_process_dpm_pg0()
1894 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
1895 mt_entry->phy_bits = phy_bits; in _mapping_process_dpm_pg0()
1896 mt_entry->id = dev_idx; in _mapping_process_dpm_pg0()
1897 mt_entry->dpm_entry_num = entry_num; in _mapping_process_dpm_pg0()
1898 mt_entry->missing_count = missing_cnt; in _mapping_process_dpm_pg0()
1899 mt_entry->device_info = MPS_DEV_RESERVED; in _mapping_process_dpm_pg0()
1905 * Device mapping, so simply copy the DPM entries to the in _mapping_process_dpm_pg0()
1910 mt_entry = &sc->mapping_table[map_idx]; in _mapping_process_dpm_pg0()
1911 if (mt_entry->dpm_entry_num != MPS_DPM_BAD_IDX) { in _mapping_process_dpm_pg0()
1913 "Conflict in mapping table for device %d\n", in _mapping_process_dpm_pg0()
1917 physical_id = dpm_entry->PhysicalIdentifier.High; in _mapping_process_dpm_pg0()
1918 mt_entry->physical_id = (physical_id << 32) | in _mapping_process_dpm_pg0()
1919 dpm_entry->PhysicalIdentifier.Low; in _mapping_process_dpm_pg0()
1920 mt_entry->phy_bits = phy_bits; in _mapping_process_dpm_pg0()
1921 mt_entry->id = dev_idx; in _mapping_process_dpm_pg0()
1922 mt_entry->missing_count = missing_cnt; in _mapping_process_dpm_pg0()
1923 mt_entry->dpm_entry_num = entry_num; in _mapping_process_dpm_pg0()
1924 mt_entry->device_info = MPS_DEV_RESERVED; in _mapping_process_dpm_pg0()
1930 * mps_mapping_check_devices - start of the day check for device availabilty
1931 * @sc: per adapter object
1941 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in mps_mapping_check_devices()
1954 sc->track_mapping_events = 0; in mps_mapping_check_devices()
1962 mtx_assert(&sc->mps_mtx, MA_OWNED); in mps_mapping_check_devices()
1963 if ((callout_pending(&sc->device_check_callout)) || in mps_mapping_check_devices()
1964 (!callout_active(&sc->device_check_callout))) { in mps_mapping_check_devices()
1965 mps_dprint(sc, MPS_MAPPING, "%s: Device Check Callout is " in mps_mapping_check_devices()
1969 callout_deactivate(&sc->device_check_callout); in mps_mapping_check_devices()
1980 et_entry = sc->enclosure_table; in mps_mapping_check_devices()
1981 for (i = 0; i < sc->num_enc_table_entries; i++, et_entry++) { in mps_mapping_check_devices()
1982 if (et_entry->init_complete) { in mps_mapping_check_devices()
1989 mt_entry = sc->mapping_table; in mps_mapping_check_devices()
1990 for (i = 0; i < sc->max_devices; i++, mt_entry++) { in mps_mapping_check_devices()
1991 if (mt_entry->init_complete) { in mps_mapping_check_devices()
2006 callout_reset(&sc->device_check_callout, in mps_mapping_check_devices()
2011 mps_dprint(sc, MPS_MAPPING, "%s: Device check complete.\n", __func__); in mps_mapping_check_devices()
2019 et_entry = sc->enclosure_table; in mps_mapping_check_devices()
2020 for (i = 0; i < sc->num_enc_table_entries; i++, et_entry++) { in mps_mapping_check_devices()
2021 if (!et_entry->init_complete) { in mps_mapping_check_devices()
2022 if (et_entry->missing_count < in mps_mapping_check_devices()
2028 et_entry->missing_count++; in mps_mapping_check_devices()
2029 if (et_entry->dpm_entry_num != in mps_mapping_check_devices()
2035 et_entry->init_complete = 1; in mps_mapping_check_devices()
2038 if (!sc->ir_firmware) in mps_mapping_check_devices()
2041 mt_entry = &sc->mapping_table[start_idx]; in mps_mapping_check_devices()
2045 end_idx = sc->max_devices - 1; in mps_mapping_check_devices()
2046 mt_entry = sc->mapping_table; in mps_mapping_check_devices()
2057 if (mt_entry->device_info & MPS_DEV_RESERVED in mps_mapping_check_devices()
2058 && !mt_entry->physical_id) in mps_mapping_check_devices()
2059 mt_entry->init_complete = 1; in mps_mapping_check_devices()
2060 else if (mt_entry->device_info & MPS_DEV_RESERVED) { in mps_mapping_check_devices()
2061 if (!mt_entry->init_complete) { in mps_mapping_check_devices()
2062 mps_dprint(sc, MPS_MAPPING, "%s: Device in " in mps_mapping_check_devices()
2066 if (mt_entry->missing_count < in mps_mapping_check_devices()
2068 mt_entry->missing_count++; in mps_mapping_check_devices()
2069 if (mt_entry->dpm_entry_num != in mps_mapping_check_devices()
2075 mt_entry->init_complete = 1; in mps_mapping_check_devices()
2082 * mps_mapping_initialize - initialize mapping tables
2083 * @sc: per adapter object
2087 * Return 0 for success or non-zero for failure.
2097 uint16_t ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in mps_mapping_initialize()
2102 sc->max_enclosures = sc->facts->MaxEnclosures + 1; in mps_mapping_initialize()
2103 sc->max_expanders = sc->facts->MaxSasExpanders; in mps_mapping_initialize()
2104 sc->max_volumes = sc->facts->MaxVolumes; in mps_mapping_initialize()
2105 sc->max_devices = sc->facts->MaxTargets + sc->max_volumes; in mps_mapping_initialize()
2106 sc->pending_map_events = 0; in mps_mapping_initialize()
2107 sc->num_enc_table_entries = 0; in mps_mapping_initialize()
2108 sc->num_rsvd_entries = 0; in mps_mapping_initialize()
2109 sc->max_dpm_entries = sc->ioc_pg8.MaxPersistentEntries; in mps_mapping_initialize()
2110 sc->is_dpm_enable = (sc->max_dpm_entries) ? 1 : 0; in mps_mapping_initialize()
2111 sc->track_mapping_events = 0; in mps_mapping_initialize()
2114 "and DPM has a max of %d entries.\n", __func__, sc->max_devices, in mps_mapping_initialize()
2115 sc->max_dpm_entries); in mps_mapping_initialize()
2117 sc->is_dpm_enable = 0; in mps_mapping_initialize()
2120 sc->num_rsvd_entries = 1; in mps_mapping_initialize()
2122 volume_mapping_flags = sc->ioc_pg8.IRVolumeMappingFlags & in mps_mapping_initialize()
2124 if (sc->ir_firmware && (volume_mapping_flags == in mps_mapping_initialize()
2126 sc->num_rsvd_entries += sc->max_volumes; in mps_mapping_initialize()
2132 for (i = 0; i < sc->max_devices; i++) in mps_mapping_initialize()
2133 _mapping_clear_map_entry(sc->mapping_table + i); in mps_mapping_initialize()
2135 for (i = 0; i < sc->max_enclosures; i++) in mps_mapping_initialize()
2136 _mapping_clear_enc_entry(sc->enclosure_table + i); in mps_mapping_initialize()
2138 for (i = 0; i < sc->max_devices; i++) { in mps_mapping_initialize()
2139 sc->removal_table[i].dev_handle = 0; in mps_mapping_initialize()
2140 sc->removal_table[i].dpm_entry_num = MPS_DPM_BAD_IDX; in mps_mapping_initialize()
2143 memset(sc->dpm_entry_used, 0, sc->max_dpm_entries); in mps_mapping_initialize()
2144 memset(sc->dpm_flush_entry, 0, sc->max_dpm_entries); in mps_mapping_initialize()
2146 if (sc->is_dpm_enable) { in mps_mapping_initialize()
2148 (sc->max_dpm_entries * in mps_mapping_initialize()
2153 if (mps_config_get_dpm_pg0(sc, &mpi_reply, sc->dpm_pg0, in mps_mapping_initialize()
2161 sc->is_dpm_enable = 0; in mps_mapping_initialize()
2165 if (sc->is_dpm_enable) in mps_mapping_initialize()
2169 "Device mappings will not persist across reboots or " in mps_mapping_initialize()
2173 sc->track_mapping_events = 1; in mps_mapping_initialize()
2178 * mps_mapping_exit - clear mapping table and associated memory
2179 * @sc: per adapter object
2191 * mps_mapping_get_tid - return the target id for sas device and handle
2192 * @sc: per adapter object
2193 * @sas_address: sas address of the device
2194 * @handle: device handle
2204 for (map_idx = 0; map_idx < sc->max_devices; map_idx++) { in mps_mapping_get_tid()
2205 mt_entry = &sc->mapping_table[map_idx]; in mps_mapping_get_tid()
2206 if (mt_entry->dev_handle == handle && mt_entry->physical_id == in mps_mapping_get_tid()
2208 return mt_entry->id; in mps_mapping_get_tid()
2215 * mps_mapping_get_tid_from_handle - find a target id in mapping table using
2218 * @sc: per adapter object
2219 * @handle: device handle
2230 * mps_mapping_get_raid_tid - return the target id for raid device
2231 * @sc: per adapter object
2233 * @volHandle: volume device handle
2244 mt_entry = &sc->mapping_table[start_idx]; in mps_mapping_get_raid_tid()
2246 if (mt_entry->dev_handle == volHandle && in mps_mapping_get_raid_tid()
2247 mt_entry->physical_id == wwid) in mps_mapping_get_raid_tid()
2248 return mt_entry->id; in mps_mapping_get_raid_tid()
2255 * mps_mapping_get_raid_tid_from_handle - find raid device in mapping table
2258 * @sc: per adapter object
2259 * @volHandle: volume device handle
2270 * mps_mapping_enclosure_dev_status_change_event - handle enclosure events
2271 * @sc: per adapter object
2283 u16 ioc_pg8_flags = le16toh(sc->ioc_pg8.Flags); in mps_mapping_enclosure_dev_status_change_event()
2293 dpm_entry = (Mpi2DriverMap0Entry_t *)((u8 *)sc->dpm_pg0 + in mps_mapping_enclosure_dev_status_change_event()
2296 if (event_data->ReasonCode == MPI2_EVENT_SAS_ENCL_RC_ADDED) { in mps_mapping_enclosure_dev_status_change_event()
2297 if (!event_data->NumSlots) { in mps_mapping_enclosure_dev_status_change_event()
2300 le16toh(event_data->EnclosureHandle)); in mps_mapping_enclosure_dev_status_change_event()
2303 temp64_var = event_data->EnclosureLogicalID.High; in mps_mapping_enclosure_dev_status_change_event()
2305 event_data->EnclosureLogicalID.Low; in mps_mapping_enclosure_dev_status_change_event()
2307 event_data->PhyBits); in mps_mapping_enclosure_dev_status_change_event()
2318 et_entry = &sc->enclosure_table[enc_idx]; in mps_mapping_enclosure_dev_status_change_event()
2319 if (et_entry->init_complete && in mps_mapping_enclosure_dev_status_change_event()
2320 !et_entry->missing_count) { in mps_mapping_enclosure_dev_status_change_event()
2323 __func__, enc_idx, et_entry->enc_handle); in mps_mapping_enclosure_dev_status_change_event()
2326 et_entry->enc_handle = le16toh(event_data-> in mps_mapping_enclosure_dev_status_change_event()
2328 et_entry->start_slot = le16toh(event_data->StartSlot); in mps_mapping_enclosure_dev_status_change_event()
2329 saved_phy_bits = et_entry->phy_bits; in mps_mapping_enclosure_dev_status_change_event()
2330 et_entry->phy_bits |= le32toh(event_data->PhyBits); in mps_mapping_enclosure_dev_status_change_event()
2331 if (saved_phy_bits != et_entry->phy_bits) in mps_mapping_enclosure_dev_status_change_event()
2333 if (et_entry->missing_count || update_phy_bits) { in mps_mapping_enclosure_dev_status_change_event()
2334 et_entry->missing_count = 0; in mps_mapping_enclosure_dev_status_change_event()
2335 if (sc->is_dpm_enable && in mps_mapping_enclosure_dev_status_change_event()
2336 et_entry->dpm_entry_num != in mps_mapping_enclosure_dev_status_change_event()
2338 dpm_entry += et_entry->dpm_entry_num; in mps_mapping_enclosure_dev_status_change_event()
2340 (u8)(dpm_entry->MappingInformation & in mps_mapping_enclosure_dev_status_change_event()
2343 dpm_entry->MappingInformation in mps_mapping_enclosure_dev_status_change_event()
2344 = et_entry->num_slots; in mps_mapping_enclosure_dev_status_change_event()
2345 dpm_entry->MappingInformation in mps_mapping_enclosure_dev_status_change_event()
2347 dpm_entry->PhysicalBitsMapping in mps_mapping_enclosure_dev_status_change_event()
2348 = et_entry->phy_bits; in mps_mapping_enclosure_dev_status_change_event()
2349 sc->dpm_flush_entry[et_entry-> in mps_mapping_enclosure_dev_status_change_event()
2358 * finalized when a device is added for the enclosure in mps_mapping_enclosure_dev_status_change_event()
2362 if (sc->num_enc_table_entries < sc->max_enclosures) { in mps_mapping_enclosure_dev_status_change_event()
2363 enc_idx = sc->num_enc_table_entries; in mps_mapping_enclosure_dev_status_change_event()
2364 sc->num_enc_table_entries++; in mps_mapping_enclosure_dev_status_change_event()
2368 et_entry = &sc->enclosure_table[enc_idx]; in mps_mapping_enclosure_dev_status_change_event()
2370 et_entry->dpm_entry_num); in mps_mapping_enclosure_dev_status_change_event()
2380 et_entry = &sc->enclosure_table[enc_idx]; in mps_mapping_enclosure_dev_status_change_event()
2381 et_entry->enc_handle = le16toh(event_data-> in mps_mapping_enclosure_dev_status_change_event()
2383 et_entry->enclosure_id = le64toh(event_data-> in mps_mapping_enclosure_dev_status_change_event()
2385 et_entry->enclosure_id = in mps_mapping_enclosure_dev_status_change_event()
2386 ((et_entry->enclosure_id << 32) | in mps_mapping_enclosure_dev_status_change_event()
2387 le64toh(event_data->EnclosureLogicalID.Low)); in mps_mapping_enclosure_dev_status_change_event()
2388 et_entry->start_index = MPS_MAPTABLE_BAD_IDX; in mps_mapping_enclosure_dev_status_change_event()
2389 et_entry->dpm_entry_num = MPS_DPM_BAD_IDX; in mps_mapping_enclosure_dev_status_change_event()
2390 et_entry->num_slots = le16toh(event_data->NumSlots); in mps_mapping_enclosure_dev_status_change_event()
2391 et_entry->start_slot = le16toh(event_data->StartSlot); in mps_mapping_enclosure_dev_status_change_event()
2392 et_entry->phy_bits = le32toh(event_data->PhyBits); in mps_mapping_enclosure_dev_status_change_event()
2394 et_entry->init_complete = 1; in mps_mapping_enclosure_dev_status_change_event()
2395 } else if (event_data->ReasonCode == in mps_mapping_enclosure_dev_status_change_event()
2403 le16toh(event_data->EnclosureHandle)); in mps_mapping_enclosure_dev_status_change_event()
2408 le16toh(event_data->EnclosureHandle)); in mps_mapping_enclosure_dev_status_change_event()
2411 et_entry = &sc->enclosure_table[enc_idx]; in mps_mapping_enclosure_dev_status_change_event()
2412 if (et_entry->missing_count < MPS_MAX_MISSING_COUNT) in mps_mapping_enclosure_dev_status_change_event()
2413 et_entry->missing_count++; in mps_mapping_enclosure_dev_status_change_event()
2414 if (sc->is_dpm_enable && in mps_mapping_enclosure_dev_status_change_event()
2415 et_entry->dpm_entry_num != MPS_DPM_BAD_IDX) { in mps_mapping_enclosure_dev_status_change_event()
2416 dpm_entry += et_entry->dpm_entry_num; in mps_mapping_enclosure_dev_status_change_event()
2417 dpm_entry->MappingInformation = et_entry->num_slots; in mps_mapping_enclosure_dev_status_change_event()
2418 dpm_entry->MappingInformation <<= map_shift; in mps_mapping_enclosure_dev_status_change_event()
2419 dpm_entry->MappingInformation |= in mps_mapping_enclosure_dev_status_change_event()
2420 et_entry->missing_count; in mps_mapping_enclosure_dev_status_change_event()
2421 sc->dpm_flush_entry[et_entry->dpm_entry_num] = 1; in mps_mapping_enclosure_dev_status_change_event()
2423 et_entry->init_complete = 1; in mps_mapping_enclosure_dev_status_change_event()
2428 if (sc->pending_map_events) in mps_mapping_enclosure_dev_status_change_event()
2429 sc->pending_map_events--; in mps_mapping_enclosure_dev_status_change_event()
2433 * mps_mapping_topology_change_event - handle topology change events
2434 * @sc: per adapter object
2448 topo_change.enc_handle = le16toh(event_data->EnclosureHandle); in mps_mapping_topology_change_event()
2449 topo_change.exp_handle = le16toh(event_data->ExpanderDevHandle); in mps_mapping_topology_change_event()
2450 num_entries = event_data->NumEntries; in mps_mapping_topology_change_event()
2452 topo_change.start_phy_num = event_data->StartPhyNum; in mps_mapping_topology_change_event()
2453 topo_change.num_phys = event_data->NumPhys; in mps_mapping_topology_change_event()
2454 topo_change.exp_status = event_data->ExpStatus; in mps_mapping_topology_change_event()
2455 event_phy_change = event_data->PHY; in mps_mapping_topology_change_event()
2466 phy_change->dev_handle = le16toh(event_phy_change-> in mps_mapping_topology_change_event()
2468 phy_change->reason = event_phy_change->PhyStatus & in mps_mapping_topology_change_event()
2479 if (sc->pending_map_events) in mps_mapping_topology_change_event()
2480 sc->pending_map_events--; in mps_mapping_topology_change_event()
2484 * mps_mapping_ir_config_change_event - handle IR config change list events
2485 * @sc: per adapter object
2501 wwid_table = malloc(sizeof(u64) * event_data->NumElements, M_MPT2, in mps_mapping_ir_config_change_event()
2505 element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; in mps_mapping_ir_config_change_event()
2506 flags = le32toh(event_data->Flags); in mps_mapping_ir_config_change_event()
2512 for (i = 0; i < event_data->NumElements; i++, element++) { in mps_mapping_ir_config_change_event()
2513 element_flags = le16toh(element->ElementFlags); in mps_mapping_ir_config_change_event()
2514 if ((element->ReasonCode != MPI2_EVENT_IR_CHANGE_RC_ADDED) && in mps_mapping_ir_config_change_event()
2515 (element->ReasonCode != MPI2_EVENT_IR_CHANGE_RC_REMOVED) && in mps_mapping_ir_config_change_event()
2516 (element->ReasonCode != MPI2_EVENT_IR_CHANGE_RC_NO_CHANGE) in mps_mapping_ir_config_change_event()
2517 && (element->ReasonCode != in mps_mapping_ir_config_change_event()
2524 le16toh(element->VolDevHandle), &wwid_table[i]); in mps_mapping_ir_config_change_event()
2536 element = (Mpi2EventIrConfigElement_t *)&event_data-> in mps_mapping_ir_config_change_event()
2538 for (i = 0; i < event_data->NumElements; i++, element++) { in mps_mapping_ir_config_change_event()
2539 if (element->ReasonCode == in mps_mapping_ir_config_change_event()
2541 element->ReasonCode == in mps_mapping_ir_config_change_event()
2550 mt_entry = &sc->mapping_table[map_idx]; in mps_mapping_ir_config_change_event()
2551 mt_entry->id = map_idx; in mps_mapping_ir_config_change_event()
2552 mt_entry->dev_handle = le16toh in mps_mapping_ir_config_change_event()
2553 (element->VolDevHandle); in mps_mapping_ir_config_change_event()
2554 mt_entry->device_info = in mps_mapping_ir_config_change_event()
2577 le16toh(element->VolDevHandle)); in mps_mapping_ir_config_change_event()
2580 mt_entry = &sc->mapping_table[map_idx]; in mps_mapping_ir_config_change_event()
2581 mt_entry->physical_id = wwid_table[i]; in mps_mapping_ir_config_change_event()
2582 mt_entry->id = map_idx; in mps_mapping_ir_config_change_event()
2583 mt_entry->dev_handle = le16toh(element-> in mps_mapping_ir_config_change_event()
2585 mt_entry->device_info = MPS_DEV_RESERVED | in mps_mapping_ir_config_change_event()
2589 } else if (element->ReasonCode == in mps_mapping_ir_config_change_event()
2602 } else if (element->ReasonCode == in mps_mapping_ir_config_change_event()
2605 le16toh(element->VolDevHandle)); in mps_mapping_ir_config_change_event()
2611 le16toh(element->VolDevHandle)); in mps_mapping_ir_config_change_event()
2614 mt_entry = &sc->mapping_table[map_idx]; in mps_mapping_ir_config_change_event()
2616 element, mt_entry->physical_id); in mps_mapping_ir_config_change_event()
2624 if (sc->pending_map_events) in mps_mapping_ir_config_change_event()
2625 sc->pending_map_events--; in mps_mapping_ir_config_change_event()
2644 for (i = 0; i < sc->max_devices; i++) { in mps_mapping_dump()
2645 mt_entry = &sc->mapping_table[i]; in mps_mapping_dump()
2646 if (mt_entry->physical_id == 0) in mps_mapping_dump()
2649 i, mt_entry->physical_id, mt_entry->dev_handle, in mps_mapping_dump()
2650 mt_entry->id); in mps_mapping_dump()
2673 for (i = 0; i < sc->max_enclosures; i++) { in mps_mapping_encl_dump()
2674 enc_entry = &sc->enclosure_table[i]; in mps_mapping_encl_dump()
2675 if (enc_entry->enclosure_id == 0) in mps_mapping_encl_dump()
2678 i, enc_entry->enclosure_id, enc_entry->enc_handle, in mps_mapping_encl_dump()
2679 enc_entry->start_index); in mps_mapping_encl_dump()