diff options
author | dh142964 <David.Hollister@Sun.COM> | 2009-09-30 13:40:27 -0600 |
---|---|---|
committer | dh142964 <David.Hollister@Sun.COM> | 2009-09-30 13:40:27 -0600 |
commit | 4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6 (patch) | |
tree | 17ba947a21901975bb128b8c535cb0575d4c9a4a /usr/src/cmd/devfsadm/disk_link.c | |
parent | 7b57f05abb8796d3c91c8d4d4c75dcafb5af6b69 (diff) | |
download | illumos-gate-4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6.tar.gz |
PSARC 2008/672 thebe SAS/SATA driver
PSARC 2008/755 ddi_ssoft_state(9F) and ddi_isoft_state(9F)
PSARC 2008/764 Cfgadm SCSI-Plugin MPxIO Support
PSARC 2009/125 scsi_device property interfaces
6726110 pmcs driver (driver for thebe)
6726867 SCSAv3
Diffstat (limited to 'usr/src/cmd/devfsadm/disk_link.c')
-rw-r--r-- | usr/src/cmd/devfsadm/disk_link.c | 117 |
1 files changed, 78 insertions, 39 deletions
diff --git a/usr/src/cmd/devfsadm/disk_link.c b/usr/src/cmd/devfsadm/disk_link.c index 95cda78a19..9e447875f1 100644 --- a/usr/src/cmd/devfsadm/disk_link.c +++ b/usr/src/cmd/devfsadm/disk_link.c @@ -29,8 +29,11 @@ #include <stdlib.h> #include <limits.h> #include <ctype.h> +#include <sys/int_fmtio.h> #include <sys/stat.h> #include <bsm/devalloc.h> +#include <sys/scsi/scsi_address.h> +#include <sys/libdevid.h> #define DISK_SUBPATH_MAX 100 #define RM_STALE 0x01 @@ -68,31 +71,31 @@ static int reserved_links_exist(di_node_t node, di_minor_t minor, int nflags); static devfsadm_create_t disk_cbt[] = { - { "disk", "ddi_block", NULL, + { "disk", DDI_NT_BLOCK, NULL, TYPE_EXACT, ILEVEL_0, disk_callback_nchan }, - { "disk", "ddi_block:channel", NULL, + { "disk", DDI_NT_BLOCK_CHAN, NULL, TYPE_EXACT, ILEVEL_0, disk_callback_chan }, - { "disk", "ddi_block:fabric", NULL, + { "disk", DDI_NT_BLOCK_FABRIC, NULL, TYPE_EXACT, ILEVEL_0, disk_callback_fabric }, - { "disk", "ddi_block:wwn", NULL, + { "disk", DDI_NT_BLOCK_WWN, NULL, TYPE_EXACT, ILEVEL_0, disk_callback_wwn }, - { "disk", "ddi_block:sas", NULL, + { "disk", DDI_NT_BLOCK_SAS, NULL, TYPE_EXACT, ILEVEL_0, disk_callback_sas }, - { "disk", "ddi_block:cdrom", NULL, + { "disk", DDI_NT_CD, NULL, TYPE_EXACT, ILEVEL_0, disk_callback_nchan }, - { "disk", "ddi_block:cdrom:channel", NULL, + { "disk", DDI_NT_CD_CHAN, NULL, TYPE_EXACT, ILEVEL_0, disk_callback_chan }, - { "disk", "ddi_block:xvmd", NULL, + { "disk", DDI_NT_BLOCK_XVMD, NULL, TYPE_EXACT, ILEVEL_0, disk_callback_xvmd }, - { "disk", "ddi_block:cdrom:xvmd", NULL, + { "disk", DDI_NT_CD_XVMD, NULL, TYPE_EXACT, ILEVEL_0, disk_callback_xvmd }, }; @@ -168,11 +171,13 @@ disk_callback_wwn(di_minor_t minor, di_node_t node) int targ; int *intp; - if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, "target", &intp) <= 0) { + if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, SCSI_ADDR_PROP_TARGET, + &intp) <= 0) { return (DEVFSADM_CONTINUE); } targ = *intp; - if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, "lun", &intp) <= 0) { + if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, SCSI_ADDR_PROP_LUN, + &intp) <= 0) { lun = 0; } else { lun = *intp; @@ -207,7 +212,7 @@ disk_callback_fabric(di_minor_t minor, di_node_t node) } else if (di_prop_lookup_bytes(DDI_DEV_T_ANY, node, "port-wwn", &wwn) > 0) { if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, - "lun", &intp) > 0) { + SCSI_ADDR_PROP_LUN, &intp) > 0) { lun = *intp; } else { lun = 0; @@ -236,38 +241,72 @@ static int disk_callback_sas(di_minor_t minor, di_node_t node) { char disk[DISK_SUBPATH_MAX]; - int lun; + int lun64_found = 0; + scsi_lun64_t lun64, sl; + scsi_lun_t lun; + int64_t *lun64p; + uint64_t wwn; int *intp; - char *str; - char *wwn; - - /* - * get LUN property - */ - if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, - "lun", &intp) > 0) { - lun = *intp; - } else { - lun = 0; + char *tgt_port; + uchar_t addr_method; + + /* Get lun property */ + if (di_prop_lookup_int64(DDI_DEV_T_ANY, node, + SCSI_ADDR_PROP_LUN64, &lun64p) > 0) { + if (*lun64p != SCSI_LUN64_ILLEGAL) { + lun64_found = 1; + lun64 = (uint64_t)*lun64p; + } } + if ((!lun64_found) && (di_prop_lookup_ints(DDI_DEV_T_ANY, node, + SCSI_ADDR_PROP_LUN, &intp) > 0)) { + lun64 = (uint64_t)*intp; + } + + lun = scsi_lun64_to_lun(lun64); + + addr_method = (lun.sl_lun1_msb & SCSI_LUN_AM_MASK); + if (di_prop_lookup_strings(DDI_DEV_T_ANY, node, - "target-port", &wwn) > 0) { - /* - * If the target-port property exist - * we use wwn format naming - */ - for (str = wwn; *str != '\0'; str++) { - *str = DISK_LINK_TO_UPPER(*str); + SCSI_ADDR_PROP_TARGET_PORT, &tgt_port) > 0) { + (void) scsi_wwnstr_to_wwn(tgt_port, &wwn); + if ((addr_method == SCSI_LUN_AM_PDEV) && + (lun.sl_lun2_msb == 0) && (lun.sl_lun2_lsb == 0) && + (lun.sl_lun3_msb == 0) && (lun.sl_lun3_lsb == 0) && + (lun.sl_lun4_msb == 0) && (lun.sl_lun4_lsb == 0)) { + (void) snprintf(disk, DISK_SUBPATH_MAX, + "t%"PRIX64"d%"PRId64, wwn, lun64); + } else if ((addr_method == SCSI_LUN_AM_FLAT) && + (lun.sl_lun2_msb == 0) && (lun.sl_lun2_lsb == 0) && + (lun.sl_lun3_msb == 0) && (lun.sl_lun3_lsb == 0) && + (lun.sl_lun4_msb == 0) && (lun.sl_lun4_lsb == 0)) { + sl = (lun.sl_lun1_msb << 8) | lun.sl_lun1_lsb; + (void) snprintf(disk, DISK_SUBPATH_MAX, + "t%"PRIX64"d%"PRIX16, wwn, sl); + } else { + (void) snprintf(disk, DISK_SUBPATH_MAX, + "t%"PRIX64"d%"PRIX64, wwn, lun64); } - (void) snprintf(disk, DISK_SUBPATH_MAX, "t%sd%d", wwn, lun); - } else if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, - "sata-phy", &intp) > 0) { - /* - * For direct attached SATA device without Device Name, - * no wwn exist, we use phy format naming - */ - (void) snprintf(disk, DISK_SUBPATH_MAX, "t%dd%d", *intp, lun); + SCSI_ADDR_PROP_SATA_PHY, &intp) > 0) { + /* Use phy format naming, for SATA devices without wwn */ + if ((addr_method == SCSI_LUN_AM_PDEV) && + (lun.sl_lun2_msb == 0) && (lun.sl_lun2_lsb == 0) && + (lun.sl_lun3_msb == 0) && (lun.sl_lun3_lsb == 0) && + (lun.sl_lun4_msb == 0) && (lun.sl_lun4_lsb == 0)) { + (void) snprintf(disk, DISK_SUBPATH_MAX, + "t%sd%"PRId64, *intp, lun64); + } else if ((addr_method == SCSI_LUN_AM_FLAT) && + (lun.sl_lun2_msb == 0) && (lun.sl_lun2_lsb == 0) && + (lun.sl_lun3_msb == 0) && (lun.sl_lun3_lsb == 0) && + (lun.sl_lun4_msb == 0) && (lun.sl_lun4_lsb == 0)) { + sl = (lun.sl_lun1_msb << 8) | lun.sl_lun1_lsb; + (void) snprintf(disk, DISK_SUBPATH_MAX, + "t%sd%"PRIX16, *intp, sl); + } else { + (void) snprintf(disk, DISK_SUBPATH_MAX, + "t%sd%"PRIX64, *intp, lun64); + } } else { return (DEVFSADM_CONTINUE); } |