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