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

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/fm/topo/modules/common/fac_prov_mptsas/fac_prov_mptsas.c
          +++ new/usr/src/lib/fm/topo/modules/common/fac_prov_mptsas/fac_prov_mptsas.c
↓ open down ↓ 66 lines elided ↑ open up ↑
  67   67  }
  68   68  
  69   69  void
  70   70  _topo_fini(topo_mod_t *mod)
  71   71  {
  72   72          topo_mod_unregister(mod);
  73   73  }
  74   74  
  75   75  /*
  76   76   * Get or set LED state for a particular target attached to an mpt_sas
  77      - * instance at (Enclosure Number, Slot Number).
  78      - *
  79      - * Returns:
  80      - *   -2  /devices node (*devctl) does not exist
  81      - *   -1  All other failures
  82      - *    0  Success
       77 + * instance at (Enclosure Number, Slot Number).  The function returns
       78 + * -1 on error and sets errno to ENOENT _only_ if the /devices node
       79 + *  (*devctl) does not exist.
  83   80   */
  84   81  static int
  85   82  do_led_control(topo_mod_t *mod, char *devctl, uint16_t enclosure,
  86   83      uint16_t slot, uint8_t led, uint32_t *ledmode, boolean_t set)
  87   84  {
  88   85          int fd;
  89   86          mptsas_led_control_t lc;
  90   87  
  91   88          bzero(&lc, sizeof (lc));
  92   89  
  93   90          lc.Command = set ? MPTSAS_LEDCTL_FLAG_SET : MPTSAS_LEDCTL_FLAG_GET;
  94   91          lc.Enclosure = enclosure;
  95   92          lc.Slot = slot;
  96   93          lc.Led = led;
  97   94          lc.LedStatus = *ledmode;
  98   95  
  99   96          if ((fd = open(devctl, (set ? O_RDWR : O_RDONLY))) == -1) {
 100      -                int rc = (errno == ENOENT ? -2 : -1);
       97 +                int en = errno;
 101   98                  topo_mod_dprintf(mod, "devctl open failed: %s",
 102   99                      strerror(errno));
 103      -                return (rc);
      100 +                errno = en;
      101 +                return (-1);
 104  102          }
 105  103  
 106  104          if (ioctl(fd, MPTIOCTL_LED_CONTROL, &lc) == -1) {
 107  105                  if (errno == ENOENT) {
 108  106                          /*
 109  107                           * If there is not presently a target attached for
 110  108                           * a particular enclosure/slot pair then the driver
 111  109                           * does not track LED status for this bay.  Assume
 112  110                           * all LEDs are off.
 113  111                           */
 114  112                          lc.LedStatus = 0;
 115  113                  } else {
      114 +                        int en = errno;
 116  115                          topo_mod_dprintf(mod, "led control ioctl failed: %s",
 117  116                              strerror(errno));
 118  117                          (void) close(fd);
      118 +                        errno = en;
 119  119                          return (-1);
 120  120                  }
 121  121          }
 122  122  
 123  123          *ledmode = lc.LedStatus ? TOPO_LED_STATE_ON : TOPO_LED_STATE_OFF;
 124  124  
 125  125          (void) close(fd);
      126 +        errno = 0;
 126  127          return (0);
 127  128  }
 128  129  
 129  130  static int
 130  131  mptsas_led_mode(topo_mod_t *mod, tnode_t *node, topo_version_t vers,
 131  132      nvlist_t *in, nvlist_t **nvout)
 132  133  {
 133  134          int err, ret = 0;
 134  135          tnode_t *pnode = topo_node_parent(node);
 135  136          uint32_t type, ledmode = 0;
 136  137          nvlist_t *pargs, *nvl;
 137  138          char *driver = NULL, *devctl = NULL;
 138  139          uint32_t enclosure, slot;
 139  140          uint8_t mptsas_led;
 140      -        boolean_t set;
      141 +        boolean_t set, done;
 141  142          char *elem, *lastp;
 142  143  
 143  144          if (vers > TOPO_METH_MPTSAS_LED_MODE_VERSION)
 144  145                  return (topo_mod_seterrno(mod, ETOPO_METHOD_VERNEW));
 145  146  
 146  147          if (topo_prop_get_string(pnode, TOPO_PGROUP_BINDING,
 147  148              TOPO_BINDING_DRIVER, &driver, &err) != 0 ||
 148  149              strcmp("mpt_sas", driver) != 0) {
 149  150                  topo_mod_dprintf(mod, "%s: Facility driver was not mpt_sas",
 150  151                      __func__);
↓ open down ↓ 60 lines elided ↑ open up ↑
 211  212          /*
 212  213           * devctl is a (potentially) pipe-separated list of different device
 213  214           * paths to try.
 214  215           */
 215  216          if ((elem = topo_mod_strsplit(mod, devctl, "|", &lastp)) == NULL) {
 216  217                  topo_mod_dprintf(mod, "%s: could not parse devctl list",
 217  218                      __func__);
 218  219                  ret = topo_mod_seterrno(mod, EMOD_UNKNOWN);
 219  220                  goto out;
 220  221          }
      222 +        done = B_FALSE;
 221  223          do {
 222  224                  topo_mod_dprintf(mod, "%s: trying mpt_sas instance at %s\n",
 223  225                      __func__, elem);
 224  226  
 225  227                  ret = do_led_control(mod, elem, enclosure, slot,
 226  228                      mptsas_led, &ledmode, set);
 227  229  
 228      -                topo_mod_strfree(mod, elem);
 229      -
 230  230                  /*
 231  231                   * Only try further devctl paths from the list if this one
 232  232                   * was not found:
 233  233                   */
 234      -                if (ret != -2) {
 235      -                        break;
      234 +                if (ret == 0 || errno != ENOENT) {
      235 +                        done = B_TRUE;
 236  236                  } else {
 237  237                          topo_mod_dprintf(mod, "%s: instance not found\n",
 238  238                              __func__);
 239  239                  }
 240  240  
 241      -        } while ((elem = topo_mod_strsplit(mod, NULL, "|", &lastp)) != NULL);
      241 +                topo_mod_strfree(mod, elem);
      242 +
      243 +        } while (!done && (elem = topo_mod_strsplit(mod, NULL, "|",
      244 +            &lastp)) != NULL);
 242  245  
 243  246          if (ret != 0) {
 244  247                  topo_mod_dprintf(mod, "%s: do_led_control failed", __func__);
 245  248                  ret = topo_mod_seterrno(mod, EMOD_UNKNOWN);
 246  249                  goto out;
 247  250          }
 248  251  
 249  252          if (topo_mod_nvalloc(mod, &nvl, NV_UNIQUE_NAME) != 0 ||
 250  253              nvlist_add_string(nvl, TOPO_PROP_VAL_NAME, TOPO_LED_MODE) != 0 ||
 251  254              nvlist_add_uint32(nvl, TOPO_PROP_VAL_TYPE, TOPO_TYPE_UINT32) != 0 ||
↓ open down ↓ 35 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX