Page MenuHomeFreeBSD

D14403.id39400.diff
No OneTemporary

D14403.id39400.diff

Index: sys/dev/mpr/mpr_sas_lsi.c
===================================================================
--- sys/dev/mpr/mpr_sas_lsi.c
+++ sys/dev/mpr/mpr_sas_lsi.c
@@ -839,23 +839,30 @@
/*
* use_phynum:
- * 1 - use the PhyNum field as a fallback to the mapping logic
+ * 1 - use the PhyNum (and other) fields as fallback to the mapping logic
* 0 - never use the PhyNum field
* -1 - only use the PhyNum field
*
- * Note that using the Phy number to map a device can cause device adds
- * to fail if multiple enclosures/expanders are in the topology. For
- * example, if two devices are in the same slot number in two different
- * enclosures within the topology, only one of those devices will be
- * added. PhyNum mapping should not be used if multiple enclosures are
- * in the topology.
+ * Note that the fallback logic is falliable, and should only be used
+ * if the mapping logic isn't working. It will fail in the following
+ * situations:
+ * - A single enclosure has more than 128 slots
+ * - More than 8 enclosures are present on one bus
+ * - The SEP assigns the same slot number to multiple drives
*/
id = MPR_MAP_BAD_ID;
if (sc->use_phynum != -1)
id = mpr_mapping_get_tid(sc, sas_address, handle);
if (id == MPR_MAP_BAD_ID) {
- if ((sc->use_phynum == 0) ||
- ((id = config_page.PhyNum) > sassc->maxtargets)) {
+ /*
+ * No mapping table. Generate an id based on the
+ * EnclosureHandle and Slot. We can't use PhyNum alone because
+ * there may be multiple expanders on a single bus. Ditto for
+ * Slot. And we can't use EnclosureHandle + Phynum because some
+ * enclosures legitimately contain multiple expanders
+ */
+ id = ((config_page.EnclosureHandle - 1) << 7) | config_page.Slot;
+ if ((sc->use_phynum == 0) || (id > sassc->maxtargets)) {
mpr_dprint(sc, MPR_INFO, "failure at %s:%d/%s()! "
"Could not get ID for device with handle 0x%04x\n",
__FILE__, __LINE__, __func__, handle);

File Metadata

Mime Type
text/plain
Expires
Thu, Nov 27, 8:17 AM (3 h, 49 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26250140
Default Alt Text
D14403.id39400.diff (1 KB)

Event Timeline