134841cc2SYu Wu - Sun Microsystems - Beijing China /*
234841cc2SYu Wu - Sun Microsystems - Beijing China  * CDDL HEADER START
334841cc2SYu Wu - Sun Microsystems - Beijing China  *
434841cc2SYu Wu - Sun Microsystems - Beijing China  * The contents of this file are subject to the terms of the
534841cc2SYu Wu - Sun Microsystems - Beijing China  * Common Development and Distribution License (the "License").
634841cc2SYu Wu - Sun Microsystems - Beijing China  * You may not use this file except in compliance with the License.
734841cc2SYu Wu - Sun Microsystems - Beijing China  *
834841cc2SYu Wu - Sun Microsystems - Beijing China  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
934841cc2SYu Wu - Sun Microsystems - Beijing China  * or http://www.opensolaris.org/os/licensing.
1034841cc2SYu Wu - Sun Microsystems - Beijing China  * See the License for the specific language governing permissions
1134841cc2SYu Wu - Sun Microsystems - Beijing China  * and limitations under the License.
1234841cc2SYu Wu - Sun Microsystems - Beijing China  *
1334841cc2SYu Wu - Sun Microsystems - Beijing China  * When distributing Covered Code, include this CDDL HEADER in each
1434841cc2SYu Wu - Sun Microsystems - Beijing China  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1534841cc2SYu Wu - Sun Microsystems - Beijing China  * If applicable, add the following below this CDDL HEADER, with the
1634841cc2SYu Wu - Sun Microsystems - Beijing China  * fields enclosed by brackets "[]" replaced with your own identifying
1734841cc2SYu Wu - Sun Microsystems - Beijing China  * information: Portions Copyright [yyyy] [name of copyright owner]
1834841cc2SYu Wu - Sun Microsystems - Beijing China  *
1934841cc2SYu Wu - Sun Microsystems - Beijing China  * CDDL HEADER END
2034841cc2SYu Wu - Sun Microsystems - Beijing China  */
2134841cc2SYu Wu - Sun Microsystems - Beijing China /*
2234841cc2SYu Wu - Sun Microsystems - Beijing China  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
2334841cc2SYu Wu - Sun Microsystems - Beijing China  * Use is subject to license terms.
2434841cc2SYu Wu - Sun Microsystems - Beijing China  */
2534841cc2SYu Wu - Sun Microsystems - Beijing China 
26*a1c36c8bSDan McDonald /*
27*a1c36c8bSDan McDonald  * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
28*a1c36c8bSDan McDonald  */
29*a1c36c8bSDan McDonald 
3034841cc2SYu Wu - Sun Microsystems - Beijing China #include <limits.h>
3134841cc2SYu Wu - Sun Microsystems - Beijing China #include <sys/mdb_modapi.h>
3234841cc2SYu Wu - Sun Microsystems - Beijing China #include <sys/sysinfo.h>
3334841cc2SYu Wu - Sun Microsystems - Beijing China #include <sys/sunmdi.h>
3434841cc2SYu Wu - Sun Microsystems - Beijing China #include <sys/scsi/scsi.h>
3534841cc2SYu Wu - Sun Microsystems - Beijing China #include "mr_sas.h"
3634841cc2SYu Wu - Sun Microsystems - Beijing China 
3734841cc2SYu Wu - Sun Microsystems - Beijing China int
construct_path(uintptr_t addr,char * result)3834841cc2SYu Wu - Sun Microsystems - Beijing China construct_path(uintptr_t addr, char *result)
3934841cc2SYu Wu - Sun Microsystems - Beijing China {
4034841cc2SYu Wu - Sun Microsystems - Beijing China 	struct	dev_info	d;
4134841cc2SYu Wu - Sun Microsystems - Beijing China 	char	devi_node[PATH_MAX];
4234841cc2SYu Wu - Sun Microsystems - Beijing China 	char	devi_addr[PATH_MAX];
4334841cc2SYu Wu - Sun Microsystems - Beijing China 
4434841cc2SYu Wu - Sun Microsystems - Beijing China 	if (mdb_vread(&d, sizeof (d), addr) == -1) {
4534841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read dev_info");
4634841cc2SYu Wu - Sun Microsystems - Beijing China 		return (DCMD_ERR);
4734841cc2SYu Wu - Sun Microsystems - Beijing China 	}
4834841cc2SYu Wu - Sun Microsystems - Beijing China 
4934841cc2SYu Wu - Sun Microsystems - Beijing China 	if (d.devi_parent) {
5034841cc2SYu Wu - Sun Microsystems - Beijing China 		construct_path((uintptr_t)d.devi_parent, result);
5134841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_readstr(devi_node, sizeof (devi_node),
5234841cc2SYu Wu - Sun Microsystems - Beijing China 		    (uintptr_t)d.devi_node_name);
5334841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_readstr(devi_addr, sizeof (devi_addr),
5434841cc2SYu Wu - Sun Microsystems - Beijing China 		    (uintptr_t)d.devi_addr);
5534841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_snprintf(result+strlen(result),
5634841cc2SYu Wu - Sun Microsystems - Beijing China 		    PATH_MAX-strlen(result),
5734841cc2SYu Wu - Sun Microsystems - Beijing China 		    "/%s%s%s", devi_node, (*devi_addr ? "@" : ""),
5834841cc2SYu Wu - Sun Microsystems - Beijing China 		    devi_addr);
5934841cc2SYu Wu - Sun Microsystems - Beijing China 	}
6034841cc2SYu Wu - Sun Microsystems - Beijing China 	return (DCMD_OK);
6134841cc2SYu Wu - Sun Microsystems - Beijing China }
6234841cc2SYu Wu - Sun Microsystems - Beijing China 
6334841cc2SYu Wu - Sun Microsystems - Beijing China void
display_targets(struct mrsas_instance * m,int verbose)64*a1c36c8bSDan McDonald display_targets(struct mrsas_instance *m, int verbose)
6534841cc2SYu Wu - Sun Microsystems - Beijing China {
6634841cc2SYu Wu - Sun Microsystems - Beijing China 	int	tgt;
67*a1c36c8bSDan McDonald 	struct mrsas_ld mr_ldp[MRDRV_MAX_LD];
68*a1c36c8bSDan McDonald 	struct mrsas_tbolt_pd mr_pdp[MRSAS_TBOLT_PD_TGT_MAX];
6934841cc2SYu Wu - Sun Microsystems - Beijing China 	char	device_path[PATH_MAX];
7034841cc2SYu Wu - Sun Microsystems - Beijing China 
7134841cc2SYu Wu - Sun Microsystems - Beijing China 	if (verbose) {
7234841cc2SYu Wu - Sun Microsystems - Beijing China 		*device_path = 0;
73*a1c36c8bSDan McDonald 		if (construct_path((uintptr_t)m->dip, device_path) != DCMD_OK) {
7434841cc2SYu Wu - Sun Microsystems - Beijing China 			strcpy(device_path, "couldn't determine device path");
7534841cc2SYu Wu - Sun Microsystems - Beijing China 		}
7634841cc2SYu Wu - Sun Microsystems - Beijing China 	}
7734841cc2SYu Wu - Sun Microsystems - Beijing China 
7834841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
7934841cc2SYu Wu - Sun Microsystems - Beijing China 	if (verbose)
8034841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_printf("%s\n", device_path);
81*a1c36c8bSDan McDonald 	mdb_printf("Physical/Logical Target\n");
82*a1c36c8bSDan McDonald 	mdb_printf("-----------------------\n");
83*a1c36c8bSDan McDonald 
84*a1c36c8bSDan McDonald 	if (mdb_vread(&mr_ldp, sizeof (mr_ldp), (uintptr_t)m->mr_ld_list)
85*a1c36c8bSDan McDonald 	    == -1 ||
86*a1c36c8bSDan McDonald 	    mdb_vread(&mr_pdp, sizeof (mr_pdp), (uintptr_t)m->mr_tbolt_pd_list)
87*a1c36c8bSDan McDonald 	    == -1) {
88*a1c36c8bSDan McDonald 		mdb_warn("can't read list of disks");
89*a1c36c8bSDan McDonald 		return;
90*a1c36c8bSDan McDonald 	}
91*a1c36c8bSDan McDonald 
9234841cc2SYu Wu - Sun Microsystems - Beijing China 	for (tgt = 0; tgt < MRDRV_MAX_LD; tgt++) {
93*a1c36c8bSDan McDonald 		if (mr_ldp[tgt].dip != NULL &&
94*a1c36c8bSDan McDonald 		    mr_ldp[tgt].lun_type == MRSAS_LD_LUN) {
95*a1c36c8bSDan McDonald 			mdb_printf("Logical          sd %d\n", tgt);
96*a1c36c8bSDan McDonald 		}
97*a1c36c8bSDan McDonald 	}
98*a1c36c8bSDan McDonald 	for (tgt = 0; tgt < MRSAS_TBOLT_PD_TGT_MAX; tgt++) {
99*a1c36c8bSDan McDonald 		if (mr_pdp[tgt].dip != NULL &&
100*a1c36c8bSDan McDonald 		    mr_pdp[tgt].lun_type == MRSAS_TBOLT_PD_LUN) {
101*a1c36c8bSDan McDonald 			mdb_printf("Physical         sd %d\n", tgt);
10234841cc2SYu Wu - Sun Microsystems - Beijing China 		}
10334841cc2SYu Wu - Sun Microsystems - Beijing China 	}
10434841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
10534841cc2SYu Wu - Sun Microsystems - Beijing China }
10634841cc2SYu Wu - Sun Microsystems - Beijing China 
10734841cc2SYu Wu - Sun Microsystems - Beijing China void
display_deviceinfo(struct mrsas_instance * m)108*a1c36c8bSDan McDonald display_deviceinfo(struct mrsas_instance *m)
10934841cc2SYu Wu - Sun Microsystems - Beijing China {
11034841cc2SYu Wu - Sun Microsystems - Beijing China 	uint16_t vid, did, svid, sid;
11134841cc2SYu Wu - Sun Microsystems - Beijing China 
112*a1c36c8bSDan McDonald 	vid = m->vendor_id;
113*a1c36c8bSDan McDonald 	did = m->device_id;
114*a1c36c8bSDan McDonald 	svid = m->subsysvid;
115*a1c36c8bSDan McDonald 	sid = m->subsysid;
11634841cc2SYu Wu - Sun Microsystems - Beijing China 
11734841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
11834841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("vendor_id device_id subsysvid subsysid");
11934841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
12034841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("--------------------------------------");
12134841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
12234841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("    0x%x   0x%x    0x%x    0x%x",
12334841cc2SYu Wu - Sun Microsystems - Beijing China 	    vid, did, svid, sid);
12434841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
12534841cc2SYu Wu - Sun Microsystems - Beijing China }
12634841cc2SYu Wu - Sun Microsystems - Beijing China 
12734841cc2SYu Wu - Sun Microsystems - Beijing China static int
mr_sas_dcmd(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)12834841cc2SYu Wu - Sun Microsystems - Beijing China mr_sas_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
12934841cc2SYu Wu - Sun Microsystems - Beijing China {
13034841cc2SYu Wu - Sun Microsystems - Beijing China 	struct mrsas_instance m;
13134841cc2SYu Wu - Sun Microsystems - Beijing China 
13234841cc2SYu Wu - Sun Microsystems - Beijing China 	int	instance;
13334841cc2SYu Wu - Sun Microsystems - Beijing China 	uint16_t ncmds;
13434841cc2SYu Wu - Sun Microsystems - Beijing China 	uint_t	verbose = FALSE;
13534841cc2SYu Wu - Sun Microsystems - Beijing China 	uint_t	device_info = FALSE;
13634841cc2SYu Wu - Sun Microsystems - Beijing China 	uint_t	target_info = FALSE;
13734841cc2SYu Wu - Sun Microsystems - Beijing China 	int	rv = DCMD_OK;
13834841cc2SYu Wu - Sun Microsystems - Beijing China 	void	*mrsas_state;
13934841cc2SYu Wu - Sun Microsystems - Beijing China 
14034841cc2SYu Wu - Sun Microsystems - Beijing China 	if (!(flags & DCMD_ADDRSPEC)) {
14134841cc2SYu Wu - Sun Microsystems - Beijing China 		mrsas_state = NULL;
14234841cc2SYu Wu - Sun Microsystems - Beijing China 		if (mdb_readvar(&mrsas_state, "mrsas_state") == -1) {
14334841cc2SYu Wu - Sun Microsystems - Beijing China 			mdb_warn("can't read mrsas_state");
14434841cc2SYu Wu - Sun Microsystems - Beijing China 			return (DCMD_ERR);
14534841cc2SYu Wu - Sun Microsystems - Beijing China 		}
14634841cc2SYu Wu - Sun Microsystems - Beijing China 		if (mdb_pwalk_dcmd("genunix`softstate", "mr_sas`mr_sas",
14734841cc2SYu Wu - Sun Microsystems - Beijing China 		    argc, argv, (uintptr_t)mrsas_state) == -1) {
14834841cc2SYu Wu - Sun Microsystems - Beijing China 			mdb_warn("mdb_pwalk_dcmd failed");
14934841cc2SYu Wu - Sun Microsystems - Beijing China 			return (DCMD_ERR);
15034841cc2SYu Wu - Sun Microsystems - Beijing China 		}
15134841cc2SYu Wu - Sun Microsystems - Beijing China 		return (DCMD_OK);
15234841cc2SYu Wu - Sun Microsystems - Beijing China 	}
15334841cc2SYu Wu - Sun Microsystems - Beijing China 
15434841cc2SYu Wu - Sun Microsystems - Beijing China 	if (mdb_getopts(argc, argv,
15534841cc2SYu Wu - Sun Microsystems - Beijing China 	    'd', MDB_OPT_SETBITS, TRUE, &device_info,
15634841cc2SYu Wu - Sun Microsystems - Beijing China 	    't', MDB_OPT_SETBITS, TRUE, &target_info,
15734841cc2SYu Wu - Sun Microsystems - Beijing China 	    'v', MDB_OPT_SETBITS, TRUE, &verbose,
15834841cc2SYu Wu - Sun Microsystems - Beijing China 	    NULL) != argc)
15934841cc2SYu Wu - Sun Microsystems - Beijing China 		return (DCMD_USAGE);
16034841cc2SYu Wu - Sun Microsystems - Beijing China 
16134841cc2SYu Wu - Sun Microsystems - Beijing China 	if (mdb_vread(&m, sizeof (m), addr) == -1) {
16234841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read mrsas_instance struct at 0x%p", addr);
16334841cc2SYu Wu - Sun Microsystems - Beijing China 		return (DCMD_ERR);
16434841cc2SYu Wu - Sun Microsystems - Beijing China 	}
16534841cc2SYu Wu - Sun Microsystems - Beijing China 	instance = m.instance;
16634841cc2SYu Wu - Sun Microsystems - Beijing China 
16734841cc2SYu Wu - Sun Microsystems - Beijing China 	/* cmd slot info */
16834841cc2SYu Wu - Sun Microsystems - Beijing China 	ncmds = m.max_fw_cmds;
16934841cc2SYu Wu - Sun Microsystems - Beijing China 
17034841cc2SYu Wu - Sun Microsystems - Beijing China 	/* processing completed */
17134841cc2SYu Wu - Sun Microsystems - Beijing China 	if (((flags & DCMD_ADDRSPEC) && !(flags & DCMD_LOOP)) ||
17234841cc2SYu Wu - Sun Microsystems - Beijing China 	    (flags & DCMD_LOOPFIRST)) {
17334841cc2SYu Wu - Sun Microsystems - Beijing China 		if ((flags & DCMD_LOOP) && !(flags & DCMD_LOOPFIRST))
17434841cc2SYu Wu - Sun Microsystems - Beijing China 			mdb_printf("\n");
17534841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_printf("         mrsas_t inst max_fw_cmds intr_type");
17634841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_printf("\n");
17734841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_printf("===========================================");
17834841cc2SYu Wu - Sun Microsystems - Beijing China 		mdb_printf("\n");
17934841cc2SYu Wu - Sun Microsystems - Beijing China 	}
18034841cc2SYu Wu - Sun Microsystems - Beijing China 
18134841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("%16p %4d      %4d    ", addr, instance, ncmds);
18234841cc2SYu Wu - Sun Microsystems - Beijing China 	switch (m.intr_type) {
18334841cc2SYu Wu - Sun Microsystems - Beijing China 		case DDI_INTR_TYPE_MSIX:
18434841cc2SYu Wu - Sun Microsystems - Beijing China 			mdb_printf("MSI-X");
18534841cc2SYu Wu - Sun Microsystems - Beijing China 			break;
18634841cc2SYu Wu - Sun Microsystems - Beijing China 		case DDI_INTR_TYPE_MSI:
18734841cc2SYu Wu - Sun Microsystems - Beijing China 			mdb_printf("MSI");
18834841cc2SYu Wu - Sun Microsystems - Beijing China 			break;
18934841cc2SYu Wu - Sun Microsystems - Beijing China 		case DDI_INTR_TYPE_FIXED:
19034841cc2SYu Wu - Sun Microsystems - Beijing China 			mdb_printf("FIXED");
19134841cc2SYu Wu - Sun Microsystems - Beijing China 			break;
19234841cc2SYu Wu - Sun Microsystems - Beijing China 		default:
19334841cc2SYu Wu - Sun Microsystems - Beijing China 			mdb_printf("INVALD");
19434841cc2SYu Wu - Sun Microsystems - Beijing China 	}
19534841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
19634841cc2SYu Wu - Sun Microsystems - Beijing China 
19734841cc2SYu Wu - Sun Microsystems - Beijing China 	if (target_info)
198*a1c36c8bSDan McDonald 		display_targets(&m, verbose);
19934841cc2SYu Wu - Sun Microsystems - Beijing China 
20034841cc2SYu Wu - Sun Microsystems - Beijing China 	if (device_info)
201*a1c36c8bSDan McDonald 		display_deviceinfo(&m);
20234841cc2SYu Wu - Sun Microsystems - Beijing China 
20334841cc2SYu Wu - Sun Microsystems - Beijing China 	return (rv);
20434841cc2SYu Wu - Sun Microsystems - Beijing China }
20534841cc2SYu Wu - Sun Microsystems - Beijing China 
20634841cc2SYu Wu - Sun Microsystems - Beijing China void
mr_sas_help(void)20734841cc2SYu Wu - Sun Microsystems - Beijing China mr_sas_help(void)
20834841cc2SYu Wu - Sun Microsystems - Beijing China {
20934841cc2SYu Wu - Sun Microsystems - Beijing China 	mdb_printf("Prints summary information about each mr_sas instance, "
21034841cc2SYu Wu - Sun Microsystems - Beijing China 	    "Without the address of a \"struct mrsas_instance\", prints every "
21134841cc2SYu Wu - Sun Microsystems - Beijing China 	    "instance.\n\n"
21234841cc2SYu Wu - Sun Microsystems - Beijing China 	    "Switches:\n"
21334841cc2SYu Wu - Sun Microsystems - Beijing China 	    "  -t   includes information about targets\n"
21434841cc2SYu Wu - Sun Microsystems - Beijing China 	    "  -d   includes information about the hardware\n"
21534841cc2SYu Wu - Sun Microsystems - Beijing China 	    "  -v   displays extra information for some options\n");
21634841cc2SYu Wu - Sun Microsystems - Beijing China }
21734841cc2SYu Wu - Sun Microsystems - Beijing China 
21834841cc2SYu Wu - Sun Microsystems - Beijing China static const mdb_dcmd_t dcmds[] = {
21934841cc2SYu Wu - Sun Microsystems - Beijing China 	{ "mr_sas", "?[-tdv]", "print mr_sas information", mr_sas_dcmd,
22034841cc2SYu Wu - Sun Microsystems - Beijing China 	    mr_sas_help },
22134841cc2SYu Wu - Sun Microsystems - Beijing China 	{ NULL }
22234841cc2SYu Wu - Sun Microsystems - Beijing China };
22334841cc2SYu Wu - Sun Microsystems - Beijing China 
22434841cc2SYu Wu - Sun Microsystems - Beijing China static const mdb_modinfo_t modinfo = {
22534841cc2SYu Wu - Sun Microsystems - Beijing China 	MDB_API_VERSION, dcmds, NULL
22634841cc2SYu Wu - Sun Microsystems - Beijing China };
22734841cc2SYu Wu - Sun Microsystems - Beijing China 
22834841cc2SYu Wu - Sun Microsystems - Beijing China const mdb_modinfo_t *
_mdb_init(void)22934841cc2SYu Wu - Sun Microsystems - Beijing China _mdb_init(void)
23034841cc2SYu Wu - Sun Microsystems - Beijing China {
23134841cc2SYu Wu - Sun Microsystems - Beijing China 	return (&modinfo);
23234841cc2SYu Wu - Sun Microsystems - Beijing China }
233