1*10923SEvan.Yan@Sun.COM /*
2*10923SEvan.Yan@Sun.COM * CDDL HEADER START
3*10923SEvan.Yan@Sun.COM *
4*10923SEvan.Yan@Sun.COM * The contents of this file are subject to the terms of the
5*10923SEvan.Yan@Sun.COM * Common Development and Distribution License (the "License").
6*10923SEvan.Yan@Sun.COM * You may not use this file except in compliance with the License.
7*10923SEvan.Yan@Sun.COM *
8*10923SEvan.Yan@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10923SEvan.Yan@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*10923SEvan.Yan@Sun.COM * See the License for the specific language governing permissions
11*10923SEvan.Yan@Sun.COM * and limitations under the License.
12*10923SEvan.Yan@Sun.COM *
13*10923SEvan.Yan@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*10923SEvan.Yan@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10923SEvan.Yan@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*10923SEvan.Yan@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*10923SEvan.Yan@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*10923SEvan.Yan@Sun.COM *
19*10923SEvan.Yan@Sun.COM * CDDL HEADER END
20*10923SEvan.Yan@Sun.COM */
21*10923SEvan.Yan@Sun.COM /*
22*10923SEvan.Yan@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23*10923SEvan.Yan@Sun.COM * Use is subject to license terms.
24*10923SEvan.Yan@Sun.COM */
25*10923SEvan.Yan@Sun.COM
26*10923SEvan.Yan@Sun.COM #include <sys/mdb_modapi.h>
27*10923SEvan.Yan@Sun.COM #include <sys/proc.h>
28*10923SEvan.Yan@Sun.COM #include <sys/types.h>
29*10923SEvan.Yan@Sun.COM #include <sys/sunddi.h>
30*10923SEvan.Yan@Sun.COM #include <sys/ddi_hp.h>
31*10923SEvan.Yan@Sun.COM #include "devinfo.h"
32*10923SEvan.Yan@Sun.COM
33*10923SEvan.Yan@Sun.COM static char *
ddihp_get_cn_state(ddi_hp_cn_state_t state)34*10923SEvan.Yan@Sun.COM ddihp_get_cn_state(ddi_hp_cn_state_t state)
35*10923SEvan.Yan@Sun.COM {
36*10923SEvan.Yan@Sun.COM switch (state) {
37*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_EMPTY:
38*10923SEvan.Yan@Sun.COM return ("Empty");
39*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_PRESENT:
40*10923SEvan.Yan@Sun.COM return ("Present");
41*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_POWERED:
42*10923SEvan.Yan@Sun.COM return ("Powered");
43*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_ENABLED:
44*10923SEvan.Yan@Sun.COM return ("Enabled");
45*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_PORT_EMPTY:
46*10923SEvan.Yan@Sun.COM return ("Port_Empty");
47*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_PORT_PRESENT:
48*10923SEvan.Yan@Sun.COM return ("Port_Present");
49*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_OFFLINE:
50*10923SEvan.Yan@Sun.COM return ("Offline");
51*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_ATTACHED:
52*10923SEvan.Yan@Sun.COM return ("Attached");
53*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_MAINTENANCE:
54*10923SEvan.Yan@Sun.COM return ("Maintenance");
55*10923SEvan.Yan@Sun.COM case DDI_HP_CN_STATE_ONLINE:
56*10923SEvan.Yan@Sun.COM return ("Online");
57*10923SEvan.Yan@Sun.COM default:
58*10923SEvan.Yan@Sun.COM return ("Unknown");
59*10923SEvan.Yan@Sun.COM }
60*10923SEvan.Yan@Sun.COM }
61*10923SEvan.Yan@Sun.COM
62*10923SEvan.Yan@Sun.COM /*ARGSUSED*/
63*10923SEvan.Yan@Sun.COM static int
hotplug_print(uintptr_t addr,struct dev_info * dev,devinfo_cb_data_t * data)64*10923SEvan.Yan@Sun.COM hotplug_print(uintptr_t addr, struct dev_info *dev, devinfo_cb_data_t *data)
65*10923SEvan.Yan@Sun.COM {
66*10923SEvan.Yan@Sun.COM ddi_hp_cn_handle_t hdl;
67*10923SEvan.Yan@Sun.COM uintptr_t hdlp = (uintptr_t)dev->devi_hp_hdlp;
68*10923SEvan.Yan@Sun.COM char cn_type[15];
69*10923SEvan.Yan@Sun.COM char cn_name[15];
70*10923SEvan.Yan@Sun.COM
71*10923SEvan.Yan@Sun.COM while (hdlp) {
72*10923SEvan.Yan@Sun.COM if (mdb_vread(&hdl, sizeof (ddi_hp_cn_handle_t), hdlp) == -1) {
73*10923SEvan.Yan@Sun.COM mdb_warn("Failed to read hdlp!\n");
74*10923SEvan.Yan@Sun.COM return (DCMD_ERR);
75*10923SEvan.Yan@Sun.COM }
76*10923SEvan.Yan@Sun.COM
77*10923SEvan.Yan@Sun.COM if (!(data->di_flags & DEVINFO_HP_PHYSICAL) ||
78*10923SEvan.Yan@Sun.COM hdl.cn_info.cn_type != DDI_HP_CN_TYPE_VIRTUAL_PORT) {
79*10923SEvan.Yan@Sun.COM if (mdb_readstr(cn_type, sizeof (cn_type),
80*10923SEvan.Yan@Sun.COM (uintptr_t)hdl.cn_info.cn_type_str) == -1) {
81*10923SEvan.Yan@Sun.COM mdb_warn("Failed to read cn_type!\n");
82*10923SEvan.Yan@Sun.COM return (DCMD_ERR);
83*10923SEvan.Yan@Sun.COM }
84*10923SEvan.Yan@Sun.COM if (mdb_readstr(cn_name, sizeof (cn_name),
85*10923SEvan.Yan@Sun.COM (uintptr_t)hdl.cn_info.cn_name) == -1) {
86*10923SEvan.Yan@Sun.COM mdb_warn("Failed to read cn_name!\n");
87*10923SEvan.Yan@Sun.COM return (DCMD_ERR);
88*10923SEvan.Yan@Sun.COM }
89*10923SEvan.Yan@Sun.COM mdb_printf("%?p %?p %-12s %-15s %-15s\n", hdl.cn_dip,
90*10923SEvan.Yan@Sun.COM hdlp, ddihp_get_cn_state(hdl.cn_info.cn_state),
91*10923SEvan.Yan@Sun.COM cn_type, cn_name);
92*10923SEvan.Yan@Sun.COM }
93*10923SEvan.Yan@Sun.COM hdlp = (uintptr_t)hdl.next;
94*10923SEvan.Yan@Sun.COM };
95*10923SEvan.Yan@Sun.COM
96*10923SEvan.Yan@Sun.COM return (WALK_NEXT);
97*10923SEvan.Yan@Sun.COM }
98*10923SEvan.Yan@Sun.COM
99*10923SEvan.Yan@Sun.COM void
hotplug_help(void)100*10923SEvan.Yan@Sun.COM hotplug_help(void)
101*10923SEvan.Yan@Sun.COM {
102*10923SEvan.Yan@Sun.COM mdb_printf("Switches:\n"
103*10923SEvan.Yan@Sun.COM " -p only print the physical hotplug connectors\n");
104*10923SEvan.Yan@Sun.COM }
105*10923SEvan.Yan@Sun.COM
106*10923SEvan.Yan@Sun.COM int
hotplug(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)107*10923SEvan.Yan@Sun.COM hotplug(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
108*10923SEvan.Yan@Sun.COM {
109*10923SEvan.Yan@Sun.COM devinfo_cb_data_t data;
110*10923SEvan.Yan@Sun.COM uintptr_t devinfo_root; /* Address of root of devinfo tree */
111*10923SEvan.Yan@Sun.COM ddi_hp_cn_handle_t hdl;
112*10923SEvan.Yan@Sun.COM char cn_type[15];
113*10923SEvan.Yan@Sun.COM char cn_name[15];
114*10923SEvan.Yan@Sun.COM int status;
115*10923SEvan.Yan@Sun.COM
116*10923SEvan.Yan@Sun.COM data.di_flags = 0;
117*10923SEvan.Yan@Sun.COM if (mdb_getopts(argc, argv,
118*10923SEvan.Yan@Sun.COM 'p', MDB_OPT_SETBITS, DEVINFO_HP_PHYSICAL, &data.di_flags, NULL)
119*10923SEvan.Yan@Sun.COM != argc)
120*10923SEvan.Yan@Sun.COM return (DCMD_USAGE);
121*10923SEvan.Yan@Sun.COM
122*10923SEvan.Yan@Sun.COM if (DCMD_HDRSPEC(flags)) {
123*10923SEvan.Yan@Sun.COM mdb_printf("%<u>%?s %?s %-12s %-15s %-15s%</u>\n",
124*10923SEvan.Yan@Sun.COM "PARENT_DEVINFO", "HANDLE", "STATE", "TYPE", "CN_NAME");
125*10923SEvan.Yan@Sun.COM }
126*10923SEvan.Yan@Sun.COM
127*10923SEvan.Yan@Sun.COM if ((flags & DCMD_ADDRSPEC) == 0) {
128*10923SEvan.Yan@Sun.COM data.di_flags |= DEVINFO_PARENT | DEVINFO_CHILD;
129*10923SEvan.Yan@Sun.COM
130*10923SEvan.Yan@Sun.COM if (mdb_readvar(&devinfo_root, "top_devinfo") == -1) {
131*10923SEvan.Yan@Sun.COM mdb_warn("failed to read 'top_devinfo'");
132*10923SEvan.Yan@Sun.COM return (NULL);
133*10923SEvan.Yan@Sun.COM }
134*10923SEvan.Yan@Sun.COM
135*10923SEvan.Yan@Sun.COM data.di_base = devinfo_root;
136*10923SEvan.Yan@Sun.COM status = mdb_pwalk("devinfo", (mdb_walk_cb_t)hotplug_print,
137*10923SEvan.Yan@Sun.COM &data, devinfo_root);
138*10923SEvan.Yan@Sun.COM if (status == -1) {
139*10923SEvan.Yan@Sun.COM mdb_warn("couldn't walk devinfo tree");
140*10923SEvan.Yan@Sun.COM return (DCMD_ERR);
141*10923SEvan.Yan@Sun.COM }
142*10923SEvan.Yan@Sun.COM return (DCMD_OK);
143*10923SEvan.Yan@Sun.COM }
144*10923SEvan.Yan@Sun.COM
145*10923SEvan.Yan@Sun.COM if (mdb_vread(&hdl, sizeof (ddi_hp_cn_handle_t), (uintptr_t)addr)
146*10923SEvan.Yan@Sun.COM == -1) {
147*10923SEvan.Yan@Sun.COM mdb_warn("Failed to read hdlp!\n");
148*10923SEvan.Yan@Sun.COM return (DCMD_ERR);
149*10923SEvan.Yan@Sun.COM }
150*10923SEvan.Yan@Sun.COM if (mdb_readstr(cn_type, sizeof (cn_type),
151*10923SEvan.Yan@Sun.COM (uintptr_t)hdl.cn_info.cn_type_str) == -1) {
152*10923SEvan.Yan@Sun.COM mdb_warn("Failed to read cn_type!\n");
153*10923SEvan.Yan@Sun.COM return (DCMD_ERR);
154*10923SEvan.Yan@Sun.COM }
155*10923SEvan.Yan@Sun.COM if (mdb_readstr(cn_name, sizeof (cn_name),
156*10923SEvan.Yan@Sun.COM (uintptr_t)hdl.cn_info.cn_name) == -1) {
157*10923SEvan.Yan@Sun.COM mdb_warn("Failed to read cn_name!\n");
158*10923SEvan.Yan@Sun.COM return (DCMD_ERR);
159*10923SEvan.Yan@Sun.COM }
160*10923SEvan.Yan@Sun.COM mdb_printf("%?p %?p %-12s %-15s %-15s\n", hdl.cn_dip, addr,
161*10923SEvan.Yan@Sun.COM ddihp_get_cn_state(hdl.cn_info.cn_state), cn_type, cn_name);
162*10923SEvan.Yan@Sun.COM
163*10923SEvan.Yan@Sun.COM return (DCMD_OK);
164*10923SEvan.Yan@Sun.COM }
165