diff options
| author | Scott Long <scottl@FreeBSD.org> | 2016-11-02 15:13:25 +0000 |
|---|---|---|
| committer | Scott Long <scottl@FreeBSD.org> | 2016-11-02 15:13:25 +0000 |
| commit | 4ab1cdc5ad89d8da84985c674268f09545823e6d (patch) | |
| tree | 2129ce4b86192677a608f1893a5cbf4aac6b5d7b /sys/dev/mps | |
| parent | 5ffb56f0577308c76e28e1c730bb1388722749c3 (diff) | |
Notes
Diffstat (limited to 'sys/dev/mps')
| -rw-r--r-- | sys/dev/mps/mps.c | 10 | ||||
| -rw-r--r-- | sys/dev/mps/mps_sas_lsi.c | 32 | ||||
| -rw-r--r-- | sys/dev/mps/mpsvar.h | 1 |
3 files changed, 36 insertions, 7 deletions
diff --git a/sys/dev/mps/mps.c b/sys/dev/mps/mps.c index 7f9cf0ba4449..1357da8627bf 100644 --- a/sys/dev/mps/mps.c +++ b/sys/dev/mps/mps.c @@ -1353,6 +1353,7 @@ mps_get_tunables(struct mps_softc *sc) sc->max_io_pages = MPS_MAXIO_PAGES; sc->enable_ssu = MPS_SSU_ENABLE_SSD_DISABLE_HDD; sc->spinup_wait_time = DEFAULT_SPINUP_WAIT; + sc->use_phynum = 1; /* * Grab the global variables. @@ -1364,6 +1365,7 @@ mps_get_tunables(struct mps_softc *sc) TUNABLE_INT_FETCH("hw.mps.max_io_pages", &sc->max_io_pages); TUNABLE_INT_FETCH("hw.mps.enable_ssu", &sc->enable_ssu); TUNABLE_INT_FETCH("hw.mps.spinup_wait_time", &sc->spinup_wait_time); + TUNABLE_INT_FETCH("hw.mps.use_phy_num", &sc->use_phynum); /* Grab the unit-instance variables */ snprintf(tmpstr, sizeof(tmpstr), "dev.mps.%d.debug_level", @@ -1398,6 +1400,10 @@ mps_get_tunables(struct mps_softc *sc) snprintf(tmpstr, sizeof(tmpstr), "dev.mps.%d.spinup_wait_time", device_get_unit(sc->mps_dev)); TUNABLE_INT_FETCH(tmpstr, &sc->spinup_wait_time); + + snprintf(tmpstr, sizeof(tmpstr), "dev.mps.%d.use_phy_num", + device_get_unit(sc->mps_dev)); + TUNABLE_INT_FETCH(tmpstr, &sc->use_phynum); } static void @@ -1495,6 +1501,10 @@ mps_setup_sysctl(struct mps_softc *sc) SYSCTL_ADD_PROC(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree), OID_AUTO, "encl_table_dump", CTLTYPE_STRING | CTLFLAG_RD, sc, 0, mps_mapping_encl_dump, "A", "Enclosure Table Dump"); + + SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree), + OID_AUTO, "use_phy_num", CTLFLAG_RD, &sc->use_phynum, 0, + "Use the phy number for enumeration"); } int diff --git a/sys/dev/mps/mps_sas_lsi.c b/sys/dev/mps/mps_sas_lsi.c index c04a78af0b2c..0a614e01e115 100644 --- a/sys/dev/mps/mps_sas_lsi.c +++ b/sys/dev/mps/mps_sas_lsi.c @@ -669,13 +669,24 @@ mpssas_add_device(struct mps_softc *sc, u16 handle, u8 linkrate){ } } - id = mps_mapping_get_sas_id(sc, sas_address, handle); + /* + * use_phynum: + * 1 - use the PhyNum field as a fallback to the mapping logic + * 0 - never use the PhyNum field + * -1 - only use the PhyNum field + */ + id = MPS_MAP_BAD_ID; + if (sc->use_phynum != -1) + id = mps_mapping_get_sas_id(sc, sas_address, handle); if (id == MPS_MAP_BAD_ID) { - printf("failure at %s:%d/%s()! Could not get ID for device " - "with handle 0x%04x\n", __FILE__, __LINE__, __func__, - handle); - error = ENXIO; - goto out; + if ((sc->use_phynum == 0) + || ((id = config_page.PhyNum) > sassc->maxtargets)) { + mps_dprint(sc, MPS_INFO, "failure at %s:%d/%s()! " + "Could not get ID for device with handle 0x%04x\n", + __FILE__, __LINE__, __func__, handle); + error = ENXIO; + goto out; + } } if (mpssas_check_id(sassc, id) != 0) { @@ -684,9 +695,16 @@ mpssas_add_device(struct mps_softc *sc, u16 handle, u8 linkrate){ goto out; } + targ = &sassc->targets[id]; + if (targ->handle != 0x0) { + mps_dprint(sc, MPS_MAPPING, "Attempting to reuse target id " + "%d handle 0x%04x\n", id, targ->handle); + error = ENXIO; + goto out; + } + mps_dprint(sc, MPS_MAPPING, "SAS Address from SAS device page0 = %jx\n", sas_address); - targ = &sassc->targets[id]; targ->devinfo = device_info; targ->devname = le32toh(config_page.DeviceName.High); targ->devname = (targ->devname << 32) | diff --git a/sys/dev/mps/mpsvar.h b/sys/dev/mps/mpsvar.h index f3a8929b131e..d8cda89dfc12 100644 --- a/sys/dev/mps/mpsvar.h +++ b/sys/dev/mps/mpsvar.h @@ -285,6 +285,7 @@ struct mps_softc { int chain_free_lowwater; u_int enable_ssu; int spinup_wait_time; + int use_phynum; uint64_t chain_alloc_fail; struct sysctl_ctx_list sysctl_ctx; struct sysctl_oid *sysctl_tree; |
