summaryrefslogtreecommitdiff
path: root/usr/src/cmd/devfsadm/disk_link.c
diff options
context:
space:
mode:
authordh142964 <David.Hollister@Sun.COM>2009-09-30 13:40:27 -0600
committerdh142964 <David.Hollister@Sun.COM>2009-09-30 13:40:27 -0600
commit4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6 (patch)
tree17ba947a21901975bb128b8c535cb0575d4c9a4a /usr/src/cmd/devfsadm/disk_link.c
parent7b57f05abb8796d3c91c8d4d4c75dcafb5af6b69 (diff)
downloadillumos-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.c117
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);
}