Print this page
LOCAL: fma: enumerate static mpt_sas disk mappings

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/fm/topo/modules/common/disk/disk.c
          +++ new/usr/src/lib/fm/topo/modules/common/disk/disk.c
↓ open down ↓ 25 lines elided ↑ open up ↑
  26   26  #include <devid.h>
  27   27  #include <pthread.h>
  28   28  #include <inttypes.h>
  29   29  #include <sys/dkio.h>
  30   30  #include <sys/scsi/scsi_types.h>
  31   31  #include <fm/topo_mod.h>
  32   32  #include <fm/topo_list.h>
  33   33  #include <fm/libdiskstatus.h>
  34   34  #include <sys/fm/protocol.h>
  35   35  #include "disk.h"
       36 +#include "disk_drivers.h"
  36   37  
  37   38  static int disk_enum(topo_mod_t *, tnode_t *, const char *,
  38   39          topo_instance_t, topo_instance_t, void *, void *);
  39   40  
  40   41  static const topo_modops_t disk_ops =
  41   42          { disk_enum, NULL };
  42   43  
  43   44  static const topo_modinfo_t disk_info =
  44   45          {DISK, FM_FMRI_SCHEME_HC, DISK_VERSION, &disk_ops};
  45   46  
       47 +static int
       48 +disk_declare_driver(topo_mod_t *mod, tnode_t *baynode, topo_list_t *dlistp,
       49 +    char *driver)
       50 +{
       51 +        int err;
       52 +
       53 +        if (strcmp("mpt_sas", driver) == 0) {
       54 +                char *sas_address = NULL;
       55 +                tnode_t *child = NULL;
       56 +
       57 +                if (disk_mptsas_find_disk(mod, baynode, &sas_address) != 0)
       58 +                        return (err);
       59 +
       60 +                err = disk_declare_addr(mod, baynode, dlistp,
       61 +                    sas_address, &child);
       62 +                topo_mod_strfree(mod, sas_address);
       63 +
       64 +                return (err);
       65 +        }
       66 +
       67 +        topo_mod_dprintf(mod, "unknown disk driver '%s'\n", driver);
       68 +        return (-1);
       69 +}
       70 +
  46   71  /*ARGSUSED*/
  47   72  static int
  48   73  disk_enum(topo_mod_t *mod, tnode_t *baynode,
  49   74      const char *name, topo_instance_t min, topo_instance_t max,
  50   75      void *arg, void *notused)
  51   76  {
  52      -        char            *device;
       77 +        char            *device, *driver;
  53   78          int             err;
  54   79          nvlist_t        *fmri;
  55   80          topo_list_t     *dlistp = topo_mod_getspecific(mod);
  56   81  
  57   82          if (strcmp(name, DISK) != 0) {
  58   83                  topo_mod_dprintf(mod, "disk_enum: "
  59   84                      "only know how to enumerate %s components.\n", DISK);
  60   85                  return (-1);
  61   86          }
  62   87  
↓ open down ↓ 5 lines elided ↑ open up ↑
  68   93          }
  69   94          if (topo_node_fru_set(baynode, fmri, 0, &err) != 0) {
  70   95                  topo_mod_dprintf(mod, "disk_enum: "
  71   96                      "topo_node_fru error %s\n", topo_strerror(err));
  72   97                  nvlist_free(fmri);
  73   98                  return (-1);
  74   99          }
  75  100          nvlist_free(fmri);
  76  101  
  77  102          /*
      103 +         * For internal storage, first check to see if we need to
      104 +         * request more detail from an HBA driver.
      105 +         */
      106 +        if (topo_prop_get_string(baynode, TOPO_PGROUP_BINDING,
      107 +            TOPO_BINDING_DRIVER, &driver, &err) == 0) {
      108 +                err = disk_declare_driver(mod, baynode, dlistp, driver);
      109 +
      110 +                topo_mod_strfree(mod, driver);
      111 +                return (err);
      112 +        } else if (err != ETOPO_PROP_NOENT) {
      113 +                topo_mod_dprintf(mod, "disk_enum: "
      114 +                    "binding error %s\n", topo_strerror(err));
      115 +                return (-1);
      116 +        }
      117 +
      118 +        /*
  78  119           * For internal storage, get the path to the occupant from the
  79  120           * binding group of the bay node
  80  121           */
  81  122          if (topo_prop_get_string(baynode, TOPO_PGROUP_BINDING,
  82  123              TOPO_BINDING_OCCUPANT, &device, &err) != 0) {
  83  124                  topo_mod_dprintf(mod, "disk_enum: "
  84  125                      "binding error %s\n", topo_strerror(err));
  85  126                  return (-1);
  86  127          }
  87  128  
↓ open down ↓ 60 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX