Print this page
OS-2444 richmond hardware maps need to support ivy bridge
*** 30,39 ****
--- 30,48 ----
#include <sys/scsi/adapters/mpt_sas/mptsas_ioctl.h>
#include "disk.h"
#include "disk_drivers.h"
+ /*
+ * Request the SAS address of the disk (if any) attached to this mpt_sas
+ * instance at (Enclosure Number, Slot Number).
+ *
+ * Returns:
+ * -2 /devices node (*devctl) does not exist
+ * -1 All other failures
+ * 0 Success
+ */
static int
get_sas_address(topo_mod_t *mod, char *devctl, uint32_t enclosure,
uint32_t slot, char **sas_address)
{
int fd, err, i;
*** 42,54 ****
size_t disz;
bzero(&gdi, sizeof (gdi));
if ((fd = open(devctl, O_RDWR)) == -1) {
topo_mod_dprintf(mod, "could not open '%s' for ioctl: %s\n",
devctl, strerror(errno));
! return (-1);
}
if (ioctl(fd, MPTIOCTL_GET_DISK_INFO, &gdi) == -1) {
topo_mod_dprintf(mod, "ioctl 1 on '%s' failed: %s\n", devctl,
strerror(errno));
--- 51,64 ----
size_t disz;
bzero(&gdi, sizeof (gdi));
if ((fd = open(devctl, O_RDWR)) == -1) {
+ int rc = (errno == ENOENT ? -2 : -1);
topo_mod_dprintf(mod, "could not open '%s' for ioctl: %s\n",
devctl, strerror(errno));
! return (rc);
}
if (ioctl(fd, MPTIOCTL_GET_DISK_INFO, &gdi) == -1) {
topo_mod_dprintf(mod, "ioctl 1 on '%s' failed: %s\n", devctl,
strerror(errno));
*** 95,104 ****
--- 105,116 ----
disk_mptsas_find_disk(topo_mod_t *mod, tnode_t *baynode, char **sas_address)
{
char *devctl = NULL;
uint32_t enclosure, slot;
int err;
+ char *elem, *lastp;
+ int ret = -1;
/*
* Get the required properties from the node. These come from
* the static XML mapping.
*/
*** 113,120 ****
topo_mod_dprintf(mod, "bay node was missing mpt_sas binding "
"properties\n");
return (-1);
}
! return (get_sas_address(mod, devctl, enclosure, slot, sas_address));
}
--- 125,160 ----
topo_mod_dprintf(mod, "bay node was missing mpt_sas binding "
"properties\n");
return (-1);
}
! /*
! * devctl is a (potentially) pipe-separated list of different device
! * paths to try.
! */
! if ((elem = topo_mod_strsplit(mod, devctl, "|", &lastp)) != NULL) {
! do {
! topo_mod_dprintf(mod, "trying mpt_sas instance at %s\n",
! elem);
!
! ret = get_sas_address(mod, elem, enclosure,
! slot, sas_address);
!
! topo_mod_strfree(mod, elem);
!
! /*
! * Only try further devctl paths from the list if this
! * one was not found:
! */
! if (ret != -2) {
! break;
! } else {
! topo_mod_dprintf(mod, "instance not found\n");
! }
!
! } while ((elem = topo_mod_strsplit(mod, NULL, "|",
! &lastp)) != NULL);
! }
+ topo_mod_strfree(mod, devctl);
+ return (ret);
}