Print this page
OS-2444 richmond hardware maps need to support ivy bridge (review fixes)

*** 72,87 **** topo_mod_unregister(mod); } /* * Get or set LED state for a particular target attached to an mpt_sas ! * instance at (Enclosure Number, Slot Number). ! * ! * Returns: ! * -2 /devices node (*devctl) does not exist ! * -1 All other failures ! * 0 Success */ static int do_led_control(topo_mod_t *mod, char *devctl, uint16_t enclosure, uint16_t slot, uint8_t led, uint32_t *ledmode, boolean_t set) { --- 72,84 ---- topo_mod_unregister(mod); } /* * Get or set LED state for a particular target attached to an mpt_sas ! * instance at (Enclosure Number, Slot Number). The function returns ! * -1 on error and sets errno to ENOENT _only_ if the /devices node ! * (*devctl) does not exist. */ static int do_led_control(topo_mod_t *mod, char *devctl, uint16_t enclosure, uint16_t slot, uint8_t led, uint32_t *ledmode, boolean_t set) {
*** 95,108 **** lc.Slot = slot; lc.Led = led; lc.LedStatus = *ledmode; if ((fd = open(devctl, (set ? O_RDWR : O_RDONLY))) == -1) { ! int rc = (errno == ENOENT ? -2 : -1); topo_mod_dprintf(mod, "devctl open failed: %s", strerror(errno)); ! return (rc); } if (ioctl(fd, MPTIOCTL_LED_CONTROL, &lc) == -1) { if (errno == ENOENT) { /* --- 92,106 ---- lc.Slot = slot; lc.Led = led; lc.LedStatus = *ledmode; if ((fd = open(devctl, (set ? O_RDWR : O_RDONLY))) == -1) { ! int en = errno; topo_mod_dprintf(mod, "devctl open failed: %s", strerror(errno)); ! errno = en; ! return (-1); } if (ioctl(fd, MPTIOCTL_LED_CONTROL, &lc) == -1) { if (errno == ENOENT) { /*
*** 111,130 **** --- 109,131 ---- * does not track LED status for this bay. Assume * all LEDs are off. */ lc.LedStatus = 0; } else { + int en = errno; topo_mod_dprintf(mod, "led control ioctl failed: %s", strerror(errno)); (void) close(fd); + errno = en; return (-1); } } *ledmode = lc.LedStatus ? TOPO_LED_STATE_ON : TOPO_LED_STATE_OFF; (void) close(fd); + errno = 0; return (0); } static int mptsas_led_mode(topo_mod_t *mod, tnode_t *node, topo_version_t vers,
*** 135,145 **** uint32_t type, ledmode = 0; nvlist_t *pargs, *nvl; char *driver = NULL, *devctl = NULL; uint32_t enclosure, slot; uint8_t mptsas_led; ! boolean_t set; char *elem, *lastp; if (vers > TOPO_METH_MPTSAS_LED_MODE_VERSION) return (topo_mod_seterrno(mod, ETOPO_METHOD_VERNEW)); --- 136,146 ---- uint32_t type, ledmode = 0; nvlist_t *pargs, *nvl; char *driver = NULL, *devctl = NULL; uint32_t enclosure, slot; uint8_t mptsas_led; ! boolean_t set, done; char *elem, *lastp; if (vers > TOPO_METH_MPTSAS_LED_MODE_VERSION) return (topo_mod_seterrno(mod, ETOPO_METHOD_VERNEW));
*** 216,246 **** topo_mod_dprintf(mod, "%s: could not parse devctl list", __func__); ret = topo_mod_seterrno(mod, EMOD_UNKNOWN); goto out; } do { topo_mod_dprintf(mod, "%s: trying mpt_sas instance at %s\n", __func__, elem); ret = do_led_control(mod, elem, enclosure, slot, mptsas_led, &ledmode, set); - 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, "%s: instance not found\n", __func__); } ! } while ((elem = topo_mod_strsplit(mod, NULL, "|", &lastp)) != NULL); if (ret != 0) { topo_mod_dprintf(mod, "%s: do_led_control failed", __func__); ret = topo_mod_seterrno(mod, EMOD_UNKNOWN); goto out; --- 217,249 ---- topo_mod_dprintf(mod, "%s: could not parse devctl list", __func__); ret = topo_mod_seterrno(mod, EMOD_UNKNOWN); goto out; } + done = B_FALSE; do { topo_mod_dprintf(mod, "%s: trying mpt_sas instance at %s\n", __func__, elem); ret = do_led_control(mod, elem, enclosure, slot, mptsas_led, &ledmode, set); /* * Only try further devctl paths from the list if this one * was not found: */ ! if (ret == 0 || errno != ENOENT) { ! done = B_TRUE; } else { topo_mod_dprintf(mod, "%s: instance not found\n", __func__); } ! topo_mod_strfree(mod, elem); ! ! } while (!done && (elem = topo_mod_strsplit(mod, NULL, "|", ! &lastp)) != NULL); if (ret != 0) { topo_mod_dprintf(mod, "%s: do_led_control failed", __func__); ret = topo_mod_seterrno(mod, EMOD_UNKNOWN); goto out;