1dea05b66SNattuvetty Bhavyan /*
2dea05b66SNattuvetty Bhavyan  * CDDL HEADER START
3dea05b66SNattuvetty Bhavyan  *
4dea05b66SNattuvetty Bhavyan  * The contents of this file are subject to the terms of the
5dea05b66SNattuvetty Bhavyan  * Common Development and Distribution License (the "License").
6dea05b66SNattuvetty Bhavyan  * You may not use this file except in compliance with the License.
7dea05b66SNattuvetty Bhavyan  *
8dea05b66SNattuvetty Bhavyan  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9dea05b66SNattuvetty Bhavyan  * or http://www.opensolaris.org/os/licensing.
10dea05b66SNattuvetty Bhavyan  * See the License for the specific language governing permissions
11dea05b66SNattuvetty Bhavyan  * and limitations under the License.
12dea05b66SNattuvetty Bhavyan  *
13dea05b66SNattuvetty Bhavyan  * When distributing Covered Code, include this CDDL HEADER in each
14dea05b66SNattuvetty Bhavyan  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15dea05b66SNattuvetty Bhavyan  * If applicable, add the following below this CDDL HEADER, with the
16dea05b66SNattuvetty Bhavyan  * fields enclosed by brackets "[]" replaced with your own identifying
17dea05b66SNattuvetty Bhavyan  * information: Portions Copyright [yyyy] [name of copyright owner]
18dea05b66SNattuvetty Bhavyan  *
19dea05b66SNattuvetty Bhavyan  * CDDL HEADER END
20dea05b66SNattuvetty Bhavyan  */
21dea05b66SNattuvetty Bhavyan /*
22dea05b66SNattuvetty Bhavyan  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23dea05b66SNattuvetty Bhavyan  */
24dea05b66SNattuvetty Bhavyan 
25dea05b66SNattuvetty Bhavyan #include <sys/dditypes.h>
26dea05b66SNattuvetty Bhavyan #include <sys/mdb_modapi.h>
27dea05b66SNattuvetty Bhavyan #include <sys/modctl.h>
28dea05b66SNattuvetty Bhavyan #include <sys/sunddi.h>
29dea05b66SNattuvetty Bhavyan 
30dea05b66SNattuvetty Bhavyan #include <lpif.h>
31dea05b66SNattuvetty Bhavyan #include <stmf.h>
32dea05b66SNattuvetty Bhavyan #include <stmf_ioctl.h>
33dea05b66SNattuvetty Bhavyan #include <portif.h>
34dea05b66SNattuvetty Bhavyan #include <stmf_sbd.h>
35dea05b66SNattuvetty Bhavyan #include <sbd_impl.h>
36dea05b66SNattuvetty Bhavyan #include <scsi/generic/persist.h>
37dea05b66SNattuvetty Bhavyan 
38dea05b66SNattuvetty Bhavyan #define	STMF_SBD_STR_MAX	2048
39dea05b66SNattuvetty Bhavyan #define	STMF_SBD_VERBOSE	0x00000001
40dea05b66SNattuvetty Bhavyan 
41716c1805SNattuvetty Bhavyan #define	ARRAY_SIZE(a)	(sizeof (a) / sizeof (*a))
42716c1805SNattuvetty Bhavyan 
43dea05b66SNattuvetty Bhavyan /* structure to pass arguments to mdb_walker callback function */
44dea05b66SNattuvetty Bhavyan typedef struct stmf_sbd_cb_s {
45dea05b66SNattuvetty Bhavyan 	uint32_t flag;
46dea05b66SNattuvetty Bhavyan } stmf_sbd_cb_t;
47dea05b66SNattuvetty Bhavyan 
48716c1805SNattuvetty Bhavyan 
49716c1805SNattuvetty Bhavyan static const char *stmf_protocol_str[] = {
50dea05b66SNattuvetty Bhavyan 	"FIBRE_CHANNEL",	/* PROTOCOL_FIBRE_CHANNEL	0 */
51dea05b66SNattuvetty Bhavyan 	"PARALLEL_SCSI",	/* PROTOCOL_PARALLEL_SCSI	1 */
52dea05b66SNattuvetty Bhavyan 	"SSA",			/* PROTOCOL_SSA			2 */
53dea05b66SNattuvetty Bhavyan 	"IEEE_1394",		/* PROTOCOL_IEEE_1394		3 */
54dea05b66SNattuvetty Bhavyan 	"SRP",			/* PROTOCOL_SRP			4 */
55dea05b66SNattuvetty Bhavyan 	"iSCSI",		/* PROTOCOL_iSCSI		5 */
56dea05b66SNattuvetty Bhavyan 	"SAS",			/* PROTOCOL_SAS			6 */
57dea05b66SNattuvetty Bhavyan 	"ADT",			/* PROTOCOL_ADT			7 */
58716c1805SNattuvetty Bhavyan 	"ATAPI"			/* PROTOCOL_ATAPI		8 */
59dea05b66SNattuvetty Bhavyan };
60dea05b66SNattuvetty Bhavyan 
61716c1805SNattuvetty Bhavyan 
62dea05b66SNattuvetty Bhavyan /*
63dea05b66SNattuvetty Bhavyan  * Support functions.
64dea05b66SNattuvetty Bhavyan  */
65dea05b66SNattuvetty Bhavyan 
66716c1805SNattuvetty Bhavyan static uint64_t
nhconvert_8bytes(const void * src)67716c1805SNattuvetty Bhavyan nhconvert_8bytes(const void *src) {
68716c1805SNattuvetty Bhavyan 	uint64_t dest;
69716c1805SNattuvetty Bhavyan 	mdb_nhconvert(&dest, src, 8);
70716c1805SNattuvetty Bhavyan 	return (dest);
71716c1805SNattuvetty Bhavyan }
72716c1805SNattuvetty Bhavyan 
73dea05b66SNattuvetty Bhavyan /*
74dea05b66SNattuvetty Bhavyan  *        Variable 'bits' is a collection of flags for which a corresponding
75dea05b66SNattuvetty Bhavyan  *        description string is available at flag_ary.
76716c1805SNattuvetty Bhavyan  *        So flag_ary should be an ary of strings with total_bits strings.
77dea05b66SNattuvetty Bhavyan  */
78dea05b66SNattuvetty Bhavyan static void
stmf_sbd_print_bit_flags(const char * flag_ary[],int total_bits,uint32_t bits)79716c1805SNattuvetty Bhavyan stmf_sbd_print_bit_flags(const char *flag_ary[],
80716c1805SNattuvetty Bhavyan 				int total_bits, uint32_t bits) {
81dea05b66SNattuvetty Bhavyan 	uint32_t curbit = 0x01;
82dea05b66SNattuvetty Bhavyan 	int i, delim = 0;
83dea05b66SNattuvetty Bhavyan 
84dea05b66SNattuvetty Bhavyan 	for (i = 0; i < total_bits; i++) {
85dea05b66SNattuvetty Bhavyan 		if (bits & curbit) {
86dea05b66SNattuvetty Bhavyan 			mdb_printf("%s%s", (delim) ? " | " : "", flag_ary[i]);
87dea05b66SNattuvetty Bhavyan 			delim = 1;
88dea05b66SNattuvetty Bhavyan 		}
89dea05b66SNattuvetty Bhavyan 		curbit <<= 1;
90dea05b66SNattuvetty Bhavyan 	}
91dea05b66SNattuvetty Bhavyan 	mdb_printf("\n");
92dea05b66SNattuvetty Bhavyan }
93dea05b66SNattuvetty Bhavyan 
94dea05b66SNattuvetty Bhavyan 
95dea05b66SNattuvetty Bhavyan static void
stmf_sbd_print_pgr_info(sbd_pgr_t * pgr)96dea05b66SNattuvetty Bhavyan stmf_sbd_print_pgr_info(sbd_pgr_t *pgr)
97dea05b66SNattuvetty Bhavyan {
98716c1805SNattuvetty Bhavyan 	static const char *pgr_flag_str[] = {
99dea05b66SNattuvetty Bhavyan 		"SBD_PGR_APTPL",			/* 0x01 */
100dea05b66SNattuvetty Bhavyan 		"SBD_PGR_RSVD_ONE",			/* 0x02 */
101dea05b66SNattuvetty Bhavyan 		"SBD_PGR_RSVD_ALL_REGISTRANTS",		/* 0x04 */
102dea05b66SNattuvetty Bhavyan 		"SBD_PGR_ALL_KEYS_HAS_IT"		/* 0x08 */
103dea05b66SNattuvetty Bhavyan 	};
104dea05b66SNattuvetty Bhavyan 
105716c1805SNattuvetty Bhavyan 	static const char *pgr_type_desc[] = {
106716c1805SNattuvetty Bhavyan 		"ILLEGAL",				/* 0x0 */
107716c1805SNattuvetty Bhavyan 		"Write Exclusive",			/* 0x1 */
108716c1805SNattuvetty Bhavyan 		"ILLEGAL",				/* 0x2 */
109716c1805SNattuvetty Bhavyan 		"Exclusive Access",			/* 0x3 */
110716c1805SNattuvetty Bhavyan 		"ILLEGAL",				/* 0x4 */
111716c1805SNattuvetty Bhavyan 		"Write Exclusive, Registrants Only",	/* 0x5 */
112716c1805SNattuvetty Bhavyan 		"Exclusive Access, Registrants Only",	/* 0x6 */
113716c1805SNattuvetty Bhavyan 		"Write Exclusive, All Registrants",	/* 0x7 */
114716c1805SNattuvetty Bhavyan 		"Exclusive Access, All Registrants"	/* 0x8 */
115716c1805SNattuvetty Bhavyan 	};
116dea05b66SNattuvetty Bhavyan 
117dea05b66SNattuvetty Bhavyan 	mdb_printf("PGR flags: ");
118716c1805SNattuvetty Bhavyan 	stmf_sbd_print_bit_flags(pgr_flag_str, ARRAY_SIZE(pgr_flag_str),
119716c1805SNattuvetty Bhavyan 	    pgr->pgr_flags);
120dea05b66SNattuvetty Bhavyan 	if (pgr->pgr_rsvholder || pgr->pgr_flags &
121dea05b66SNattuvetty Bhavyan 	    SBD_PGR_RSVD_ALL_REGISTRANTS) {
122dea05b66SNattuvetty Bhavyan 		mdb_printf("Reservation Details \n");
123dea05b66SNattuvetty Bhavyan 		mdb_printf("\tReservation holder: ");
124dea05b66SNattuvetty Bhavyan 		if (pgr->pgr_rsvholder)
125dea05b66SNattuvetty Bhavyan 			mdb_printf("%p\n", pgr->pgr_rsvholder);
126dea05b66SNattuvetty Bhavyan 		else
127dea05b66SNattuvetty Bhavyan 			mdb_printf("All Registrants\n");
128716c1805SNattuvetty Bhavyan 
129dea05b66SNattuvetty Bhavyan 		mdb_printf("\t            type  : %d => %s\n",
130716c1805SNattuvetty Bhavyan 		    pgr->pgr_rsv_type,
131716c1805SNattuvetty Bhavyan 		    (pgr->pgr_rsv_type < ARRAY_SIZE(pgr_type_desc)) ?
132716c1805SNattuvetty Bhavyan 		    pgr_type_desc[pgr->pgr_rsv_type] : "ILLEGAL");
133dea05b66SNattuvetty Bhavyan 		mdb_printf("\t            scope : %d\n", pgr->pgr_rsv_scope);
134dea05b66SNattuvetty Bhavyan 	} else {
135dea05b66SNattuvetty Bhavyan 		mdb_printf("No reservations.\n");
136dea05b66SNattuvetty Bhavyan 	}
137dea05b66SNattuvetty Bhavyan }
138dea05b66SNattuvetty Bhavyan 
139dea05b66SNattuvetty Bhavyan void
print_scsi_devid_desc(uintptr_t addr,uint16_t len,char * spacer)140716c1805SNattuvetty Bhavyan print_scsi_devid_desc(uintptr_t addr, uint16_t len, char *spacer)
141dea05b66SNattuvetty Bhavyan {
142dea05b66SNattuvetty Bhavyan 	scsi_devid_desc_t   *id;
143dea05b66SNattuvetty Bhavyan 
144716c1805SNattuvetty Bhavyan 	if (len < sizeof (*id)) {
145716c1805SNattuvetty Bhavyan 		mdb_warn("%sError: Devid Size = %d < sizeof(scsi_devid_desc_t)"
146716c1805SNattuvetty Bhavyan 		    "\n", spacer, len);
147716c1805SNattuvetty Bhavyan 		return;
148716c1805SNattuvetty Bhavyan 	}
149716c1805SNattuvetty Bhavyan 
150dea05b66SNattuvetty Bhavyan 	id = mdb_zalloc(len, UM_SLEEP);
151dea05b66SNattuvetty Bhavyan 	if (mdb_vread(id, len, addr) == -1) {
152dea05b66SNattuvetty Bhavyan 		mdb_warn("failed to read scsi_devid_desc at %p\n", addr);
153dea05b66SNattuvetty Bhavyan 		mdb_free(id, len);
154dea05b66SNattuvetty Bhavyan 		return;
155dea05b66SNattuvetty Bhavyan 	}
156dea05b66SNattuvetty Bhavyan 
157716c1805SNattuvetty Bhavyan 	mdb_printf("%sTotal length:\t%d\n", spacer, len);
158716c1805SNattuvetty Bhavyan 	mdb_printf("%sProtocol:\t%d => %-16s\n", spacer, id->protocol_id,
159716c1805SNattuvetty Bhavyan 	    (id->protocol_id < ARRAY_SIZE(stmf_protocol_str)) ?
160716c1805SNattuvetty Bhavyan 	    stmf_protocol_str[id->protocol_id] : "");
161716c1805SNattuvetty Bhavyan 	mdb_printf("%sCode Set:\t%d\n", spacer, id->code_set);
162716c1805SNattuvetty Bhavyan 	mdb_printf("%sIdent Length:\t%d\n", spacer, id->ident_length);
163dea05b66SNattuvetty Bhavyan 
164716c1805SNattuvetty Bhavyan 	if (len < sizeof (*id) + id->ident_length - 1) {
165716c1805SNattuvetty Bhavyan 		mdb_printf("%s(Can not recognize ident data)\n", spacer);
166dea05b66SNattuvetty Bhavyan 	} else {
167716c1805SNattuvetty Bhavyan 		id->ident[id->ident_length] = '\0';
168716c1805SNattuvetty Bhavyan 		mdb_printf("%sIdent:\t\t%s\n", spacer, id->ident);
169dea05b66SNattuvetty Bhavyan 	}
170dea05b66SNattuvetty Bhavyan 	mdb_free(id, len);
171dea05b66SNattuvetty Bhavyan 	mdb_printf("\n");
172dea05b66SNattuvetty Bhavyan }
173dea05b66SNattuvetty Bhavyan 
174716c1805SNattuvetty Bhavyan /*
175716c1805SNattuvetty Bhavyan  * Decipher and print transport id  which is pointed by addr variable.
176716c1805SNattuvetty Bhavyan  */
177716c1805SNattuvetty Bhavyan static int
print_transport_id(uintptr_t addr,uint16_t tpd_len,char * spacer)178716c1805SNattuvetty Bhavyan print_transport_id(uintptr_t addr, uint16_t tpd_len, char *spacer)
179716c1805SNattuvetty Bhavyan {
180716c1805SNattuvetty Bhavyan 	scsi_transport_id_t *tpd;
181716c1805SNattuvetty Bhavyan 
182716c1805SNattuvetty Bhavyan 	if (tpd_len < sizeof (*tpd)) {
183716c1805SNattuvetty Bhavyan 		mdb_warn("%sError: Transport ID Size = %d < "
184716c1805SNattuvetty Bhavyan 		    "sizeof (scsi_transport_id_t)\n", spacer, tpd_len);
185716c1805SNattuvetty Bhavyan 		return (DCMD_ERR);
186716c1805SNattuvetty Bhavyan 	}
187716c1805SNattuvetty Bhavyan 
188716c1805SNattuvetty Bhavyan 	tpd = mdb_zalloc(tpd_len, UM_SLEEP);
189716c1805SNattuvetty Bhavyan 	if (mdb_vread(tpd, tpd_len, addr) == -1) {
190716c1805SNattuvetty Bhavyan 		mdb_warn("failed to read scsi_transport_id at %p\n", addr);
191716c1805SNattuvetty Bhavyan 		mdb_free(tpd, tpd_len);
192716c1805SNattuvetty Bhavyan 		return (DCMD_ERR);
193716c1805SNattuvetty Bhavyan 	}
194716c1805SNattuvetty Bhavyan 
195716c1805SNattuvetty Bhavyan 	mdb_printf("%sTotal length:\t%d\n", spacer, tpd_len);
196716c1805SNattuvetty Bhavyan 	mdb_printf("%sProtocol:\t%d => %16s\n", spacer, tpd->protocol_id,
197716c1805SNattuvetty Bhavyan 	    (tpd->protocol_id < ARRAY_SIZE(stmf_protocol_str)) ?
198716c1805SNattuvetty Bhavyan 	    stmf_protocol_str[tpd->protocol_id] : "");
199716c1805SNattuvetty Bhavyan 	mdb_printf("%sFormat Code:\t0x%x\n", spacer, tpd->format_code);
200716c1805SNattuvetty Bhavyan 
201716c1805SNattuvetty Bhavyan 	switch (tpd->protocol_id) {
202716c1805SNattuvetty Bhavyan 	case PROTOCOL_FIBRE_CHANNEL:
203716c1805SNattuvetty Bhavyan 		{
204716c1805SNattuvetty Bhavyan 		uint8_t *p = ((scsi_fc_transport_id_t *)tpd)->port_name;
205716c1805SNattuvetty Bhavyan 		mdb_printf("%sFC Port Name:\t%016llX\n", spacer,
206716c1805SNattuvetty Bhavyan 		    nhconvert_8bytes(p));
207716c1805SNattuvetty Bhavyan 		}
208716c1805SNattuvetty Bhavyan 		break;
209716c1805SNattuvetty Bhavyan 	case PROTOCOL_PARALLEL_SCSI:
210716c1805SNattuvetty Bhavyan 	case PROTOCOL_SSA:
211716c1805SNattuvetty Bhavyan 	case PROTOCOL_IEEE_1394:
212716c1805SNattuvetty Bhavyan 		break;
213716c1805SNattuvetty Bhavyan 	case PROTOCOL_SRP:
214716c1805SNattuvetty Bhavyan 		{
215716c1805SNattuvetty Bhavyan 		uint8_t *p = ((scsi_srp_transport_id_t *)tpd)->srp_name;
216716c1805SNattuvetty Bhavyan 		/* Print 8 byte initiator extention and guid in order */
217716c1805SNattuvetty Bhavyan 		mdb_printf("%sSRP Name:\t%016llX:%016llX\n", spacer,
218716c1805SNattuvetty Bhavyan 		    nhconvert_8bytes(&p[8]), nhconvert_8bytes(&p[0]));
219716c1805SNattuvetty Bhavyan 		}
220716c1805SNattuvetty Bhavyan 		break;
221716c1805SNattuvetty Bhavyan 	case PROTOCOL_iSCSI:
222716c1805SNattuvetty Bhavyan 		mdb_printf("%sISCSI Name:\t%s\n", spacer,
223716c1805SNattuvetty Bhavyan 		    ((iscsi_transport_id_t *)tpd)->iscsi_name);
224716c1805SNattuvetty Bhavyan 		break;
225716c1805SNattuvetty Bhavyan 	case PROTOCOL_SAS:
226716c1805SNattuvetty Bhavyan 	case PROTOCOL_ADT:
227716c1805SNattuvetty Bhavyan 	case PROTOCOL_ATAPI:
228716c1805SNattuvetty Bhavyan 	default:
229716c1805SNattuvetty Bhavyan 		break;
230716c1805SNattuvetty Bhavyan 	}
231716c1805SNattuvetty Bhavyan 
232716c1805SNattuvetty Bhavyan 	mdb_free(tpd, tpd_len);
233716c1805SNattuvetty Bhavyan 	return (DCMD_OK);
234716c1805SNattuvetty Bhavyan }
235716c1805SNattuvetty Bhavyan 
236dea05b66SNattuvetty Bhavyan void
stmf_sbd_pgr_key_dcmd_help(void)237dea05b66SNattuvetty Bhavyan stmf_sbd_pgr_key_dcmd_help(void)
238dea05b66SNattuvetty Bhavyan {
239dea05b66SNattuvetty Bhavyan 	mdb_printf(
240dea05b66SNattuvetty Bhavyan 	    "Prints info about pgr keys and reservations on the given lun.\n\n"
241dea05b66SNattuvetty Bhavyan 	    "Usage:  <addr>::stmf_sbd_pgr_key [-akv]\n"
242dea05b66SNattuvetty Bhavyan 	    "    where <addr> represent the address of\n"
243dea05b66SNattuvetty Bhavyan 	    "          sbd_lu_t by default\n"
244dea05b66SNattuvetty Bhavyan 	    "             or\n"
245dea05b66SNattuvetty Bhavyan 	    "          sbd_pgr_key_t if '-a' option is specified.\n"
246dea05b66SNattuvetty Bhavyan 	    "Options:\n"
247dea05b66SNattuvetty Bhavyan 	    "   -a   if specified, <addr> represents address of sbd_pgr_key_t\n"
248dea05b66SNattuvetty Bhavyan 	    "   -k   if specified, only prints key information\n"
249dea05b66SNattuvetty Bhavyan 	    "   -v   verbose output\n");
250dea05b66SNattuvetty Bhavyan }
251dea05b66SNattuvetty Bhavyan 
252dea05b66SNattuvetty Bhavyan 
253dea05b66SNattuvetty Bhavyan /*
254dea05b66SNattuvetty Bhavyan  * MDB WALKERS implementations
255dea05b66SNattuvetty Bhavyan  */
256dea05b66SNattuvetty Bhavyan 
257dea05b66SNattuvetty Bhavyan static int
stmf_sbd_lu_walk_init(mdb_walk_state_t * wsp)258dea05b66SNattuvetty Bhavyan stmf_sbd_lu_walk_init(mdb_walk_state_t *wsp)
259dea05b66SNattuvetty Bhavyan {
260*892ad162SToomas Soome 	if (wsp->walk_addr == 0) {
261dea05b66SNattuvetty Bhavyan 		if (mdb_readvar(&wsp->walk_addr, "sbd_lu_list") == -1) {
262dea05b66SNattuvetty Bhavyan 			mdb_warn("failed to read sbd_lu_list\n");
263dea05b66SNattuvetty Bhavyan 			return (WALK_ERR);
264dea05b66SNattuvetty Bhavyan 		}
265dea05b66SNattuvetty Bhavyan 	}
266dea05b66SNattuvetty Bhavyan 	return (WALK_NEXT);
267dea05b66SNattuvetty Bhavyan }
268dea05b66SNattuvetty Bhavyan 
269dea05b66SNattuvetty Bhavyan static int
stmf_sbd_lu_walk_step(mdb_walk_state_t * wsp)270dea05b66SNattuvetty Bhavyan stmf_sbd_lu_walk_step(mdb_walk_state_t *wsp)
271dea05b66SNattuvetty Bhavyan {
272dea05b66SNattuvetty Bhavyan 	uintptr_t	addr = wsp->walk_addr;
273dea05b66SNattuvetty Bhavyan 	sbd_lu_t	slu;
274dea05b66SNattuvetty Bhavyan 
275*892ad162SToomas Soome 	if (wsp->walk_addr == 0)
276dea05b66SNattuvetty Bhavyan 		return (WALK_DONE);
277dea05b66SNattuvetty Bhavyan 
278dea05b66SNattuvetty Bhavyan 	if (mdb_vread(&slu, sizeof (sbd_lu_t), addr) == -1) {
279dea05b66SNattuvetty Bhavyan 		mdb_warn("failed to read sbd_lu_t at %p\n", addr);
280dea05b66SNattuvetty Bhavyan 		return (WALK_ERR);
281dea05b66SNattuvetty Bhavyan 	}
282dea05b66SNattuvetty Bhavyan 	wsp->walk_addr = (uintptr_t)slu.sl_next;
283dea05b66SNattuvetty Bhavyan 	return (wsp->walk_callback(addr, &slu, wsp->walk_cbdata));
284dea05b66SNattuvetty Bhavyan }
285dea05b66SNattuvetty Bhavyan 
286dea05b66SNattuvetty Bhavyan char *
stmf_sbd_getstr(uintptr_t addr,char * str)287dea05b66SNattuvetty Bhavyan stmf_sbd_getstr(uintptr_t addr, char *str) {
288dea05b66SNattuvetty Bhavyan 	if ((addr == 0) || (mdb_readstr(str, STMF_SBD_STR_MAX, addr) == -1))
289dea05b66SNattuvetty Bhavyan 		str = NULL;
290dea05b66SNattuvetty Bhavyan 	return (str);
291dea05b66SNattuvetty Bhavyan }
292dea05b66SNattuvetty Bhavyan 
293dea05b66SNattuvetty Bhavyan static int
stmf_sbd_lu_cb(uintptr_t addr,const sbd_lu_t * slu,stmf_sbd_cb_t * cb_st)294dea05b66SNattuvetty Bhavyan stmf_sbd_lu_cb(uintptr_t addr, const sbd_lu_t *slu, stmf_sbd_cb_t *cb_st)
295dea05b66SNattuvetty Bhavyan {
296dea05b66SNattuvetty Bhavyan 	if (cb_st->flag & STMF_SBD_VERBOSE) {
297dea05b66SNattuvetty Bhavyan 		char str[STMF_SBD_STR_MAX];
298dea05b66SNattuvetty Bhavyan 
299716c1805SNattuvetty Bhavyan 		mdb_printf("\nsbd_lu - %p\n", addr);
300716c1805SNattuvetty Bhavyan 
301716c1805SNattuvetty Bhavyan 		/* sl_device_id contains 4 bytes hdr + 16 bytes(GUID) */
302716c1805SNattuvetty Bhavyan 		mdb_printf("\tsl_deviceid:      %-?p  GUID => %016llX%016llX\n",
303716c1805SNattuvetty Bhavyan 		    slu->sl_device_id, nhconvert_8bytes(&slu->sl_device_id[4]),
304716c1805SNattuvetty Bhavyan 		    nhconvert_8bytes(&slu->sl_device_id[12]));
305dea05b66SNattuvetty Bhavyan 		mdb_printf("\tsl_name:          %-?p  %s\n", slu->sl_name,
306dea05b66SNattuvetty Bhavyan 		    stmf_sbd_getstr((uintptr_t)slu->sl_name, str));
307dea05b66SNattuvetty Bhavyan 		mdb_printf("\tsl_alias:         %-?p  %s\n", slu->sl_alias,
308dea05b66SNattuvetty Bhavyan 		    stmf_sbd_getstr((uintptr_t)slu->sl_alias, str));
309dea05b66SNattuvetty Bhavyan 		mdb_printf("\tsl_meta_filename: %-?p  %s\n",
310dea05b66SNattuvetty Bhavyan 		    slu->sl_meta_filename,
311dea05b66SNattuvetty Bhavyan 		    stmf_sbd_getstr((uintptr_t)slu->sl_meta_filename, str));
312dea05b66SNattuvetty Bhavyan 		mdb_printf("\tsl_data_filename: %-?p  %s\n",
313dea05b66SNattuvetty Bhavyan 		    slu->sl_data_filename,
314dea05b66SNattuvetty Bhavyan 		    stmf_sbd_getstr((uintptr_t)slu->sl_data_filename, str));
315dea05b66SNattuvetty Bhavyan 		mdb_printf("\tsl_mgmt_url:      %-?p  %s\n", slu->sl_mgmt_url,
316dea05b66SNattuvetty Bhavyan 		    stmf_sbd_getstr((uintptr_t)slu->sl_mgmt_url, str));
317dea05b66SNattuvetty Bhavyan 		mdb_printf("\tsl_zfs_meta:      %-?p\n", slu->sl_zfs_meta);
318dea05b66SNattuvetty Bhavyan 		mdb_printf("\tsl_it_list:       %-?p\n", slu->sl_it_list);
319dea05b66SNattuvetty Bhavyan 		mdb_printf("\tsl_pgr:           %-?p\n", slu->sl_pgr);
320dea05b66SNattuvetty Bhavyan 	} else {
321dea05b66SNattuvetty Bhavyan 		mdb_printf("%p\n", addr);
322dea05b66SNattuvetty Bhavyan 	}
323dea05b66SNattuvetty Bhavyan 	return (WALK_NEXT);
324dea05b66SNattuvetty Bhavyan }
325dea05b66SNattuvetty Bhavyan 
326dea05b66SNattuvetty Bhavyan static int
stmf_sbd_pgr_key_walk_init(mdb_walk_state_t * wsp)327dea05b66SNattuvetty Bhavyan stmf_sbd_pgr_key_walk_init(mdb_walk_state_t *wsp)
328dea05b66SNattuvetty Bhavyan {
329*892ad162SToomas Soome 	if (wsp->walk_addr == 0) {
330dea05b66SNattuvetty Bhavyan 		mdb_warn("<pgr_key_list addr>::walk stmf_sbd_pgr_key\n");
331dea05b66SNattuvetty Bhavyan 		return (WALK_ERR);
332dea05b66SNattuvetty Bhavyan 	}
333dea05b66SNattuvetty Bhavyan 	return (WALK_NEXT);
334dea05b66SNattuvetty Bhavyan }
335dea05b66SNattuvetty Bhavyan 
336dea05b66SNattuvetty Bhavyan static int
stmf_sbd_pgr_key_walk_step(mdb_walk_state_t * wsp)337dea05b66SNattuvetty Bhavyan stmf_sbd_pgr_key_walk_step(mdb_walk_state_t *wsp)
338dea05b66SNattuvetty Bhavyan {
339dea05b66SNattuvetty Bhavyan 	uintptr_t	addr = wsp->walk_addr;
340dea05b66SNattuvetty Bhavyan 	sbd_pgr_key_t	key;
341dea05b66SNattuvetty Bhavyan 
342*892ad162SToomas Soome 	if (wsp->walk_addr == 0)
343dea05b66SNattuvetty Bhavyan 		return (WALK_DONE);
344dea05b66SNattuvetty Bhavyan 
345dea05b66SNattuvetty Bhavyan 	if (mdb_vread(&key, sizeof (sbd_pgr_key_t), addr) == -1) {
346dea05b66SNattuvetty Bhavyan 		mdb_warn("failed to read sbd_pgr_key_t at %p\n", addr);
347dea05b66SNattuvetty Bhavyan 		return (WALK_ERR);
348dea05b66SNattuvetty Bhavyan 	}
349dea05b66SNattuvetty Bhavyan 	wsp->walk_addr = (uintptr_t)key.pgr_key_next;
350dea05b66SNattuvetty Bhavyan 	return (wsp->walk_callback(addr, &key, wsp->walk_cbdata));
351dea05b66SNattuvetty Bhavyan }
352dea05b66SNattuvetty Bhavyan 
353dea05b66SNattuvetty Bhavyan static int
stmf_sbd_pgr_key_cb(uintptr_t addr,const sbd_pgr_key_t * key,stmf_sbd_cb_t * cb_st)354dea05b66SNattuvetty Bhavyan stmf_sbd_pgr_key_cb(uintptr_t addr, const sbd_pgr_key_t *key,
355dea05b66SNattuvetty Bhavyan 					stmf_sbd_cb_t *cb_st)
356dea05b66SNattuvetty Bhavyan {
357716c1805SNattuvetty Bhavyan 	static const char *key_flag_str [] = {
358dea05b66SNattuvetty Bhavyan 		"SBD_PGR_KEY_ALL_TG_PT",   /* 0x01 */
359716c1805SNattuvetty Bhavyan 		"SBD_PGR_KEY_TPT_ID_FLAG"  /* 0x02 */
360dea05b66SNattuvetty Bhavyan 	};
361dea05b66SNattuvetty Bhavyan 
362dea05b66SNattuvetty Bhavyan 	if (cb_st->flag & STMF_SBD_VERBOSE) {
363dea05b66SNattuvetty Bhavyan 		mdb_printf("sbd_pgr_key - %p\n", addr);
364716c1805SNattuvetty Bhavyan 		mdb_printf("\tRegistered key:      0x%016llx\n", key->pgr_key);
365dea05b66SNattuvetty Bhavyan 		mdb_printf("\tKey Flags:           ");
366716c1805SNattuvetty Bhavyan 		stmf_sbd_print_bit_flags(key_flag_str, ARRAY_SIZE(key_flag_str),
367716c1805SNattuvetty Bhavyan 		    key->pgr_key_flags);
368dea05b66SNattuvetty Bhavyan 		mdb_printf("\tpgr_key_it:          %?-p\n", key->pgr_key_it);
369dea05b66SNattuvetty Bhavyan 		mdb_printf("\tLocal Device ID:     %?-p\n",
370dea05b66SNattuvetty Bhavyan 		    key->pgr_key_lpt_id);
371dea05b66SNattuvetty Bhavyan 		print_scsi_devid_desc((uintptr_t)key->pgr_key_lpt_id,
372dea05b66SNattuvetty Bhavyan 		    key->pgr_key_lpt_len, "		");
373716c1805SNattuvetty Bhavyan 		mdb_printf("\tRemote Transport ID: %?-p\n",
374dea05b66SNattuvetty Bhavyan 		    key->pgr_key_rpt_id);
375716c1805SNattuvetty Bhavyan 		print_transport_id((uintptr_t)key->pgr_key_rpt_id,
376dea05b66SNattuvetty Bhavyan 		    key->pgr_key_rpt_len, "		");
377dea05b66SNattuvetty Bhavyan 	} else {
378dea05b66SNattuvetty Bhavyan 		mdb_printf("%p\n", addr);
379dea05b66SNattuvetty Bhavyan 	}
380dea05b66SNattuvetty Bhavyan 	return (WALK_NEXT);
381dea05b66SNattuvetty Bhavyan }
382dea05b66SNattuvetty Bhavyan 
383dea05b66SNattuvetty Bhavyan static int
stmf_sbd_it_walk_init(mdb_walk_state_t * wsp)384dea05b66SNattuvetty Bhavyan stmf_sbd_it_walk_init(mdb_walk_state_t *wsp)
385dea05b66SNattuvetty Bhavyan {
386*892ad162SToomas Soome 	if (wsp->walk_addr == 0) {
387dea05b66SNattuvetty Bhavyan 		mdb_warn("<sbd_it_list addr>::walk stmf_sbd_pgr_key\n");
388dea05b66SNattuvetty Bhavyan 		return (WALK_ERR);
389dea05b66SNattuvetty Bhavyan 	}
390dea05b66SNattuvetty Bhavyan 	return (WALK_NEXT);
391dea05b66SNattuvetty Bhavyan }
392dea05b66SNattuvetty Bhavyan 
393dea05b66SNattuvetty Bhavyan static int
stmf_sbd_it_walk_step(mdb_walk_state_t * wsp)394dea05b66SNattuvetty Bhavyan stmf_sbd_it_walk_step(mdb_walk_state_t *wsp)
395dea05b66SNattuvetty Bhavyan {
396dea05b66SNattuvetty Bhavyan 	uintptr_t	addr = wsp->walk_addr;
397dea05b66SNattuvetty Bhavyan 	sbd_it_data_t	it;
398dea05b66SNattuvetty Bhavyan 
399*892ad162SToomas Soome 	if (wsp->walk_addr == 0)
400dea05b66SNattuvetty Bhavyan 		return (WALK_DONE);
401dea05b66SNattuvetty Bhavyan 
402dea05b66SNattuvetty Bhavyan 	if (mdb_vread(&it, sizeof (sbd_it_data_t), addr) == -1) {
403dea05b66SNattuvetty Bhavyan 		mdb_warn("failed to read sbd_it_data_t at %p\n", addr);
404dea05b66SNattuvetty Bhavyan 		return (WALK_ERR);
405dea05b66SNattuvetty Bhavyan 	}
406dea05b66SNattuvetty Bhavyan 	wsp->walk_addr = (uintptr_t)it.sbd_it_next;
407dea05b66SNattuvetty Bhavyan 	return (wsp->walk_callback(addr, &it, wsp->walk_cbdata));
408dea05b66SNattuvetty Bhavyan }
409dea05b66SNattuvetty Bhavyan 
410dea05b66SNattuvetty Bhavyan static int
stmf_sbd_it_cb(uintptr_t addr,const sbd_it_data_t * it,stmf_sbd_cb_t * cb_st)411dea05b66SNattuvetty Bhavyan stmf_sbd_it_cb(uintptr_t addr, const sbd_it_data_t *it, stmf_sbd_cb_t *cb_st)
412dea05b66SNattuvetty Bhavyan {
413716c1805SNattuvetty Bhavyan 	static const char *it_flag_str [] = {
414dea05b66SNattuvetty Bhavyan 		"SBD_IT_HAS_SCSI2_RESERVATION",		/* 0x0001 */
415dea05b66SNattuvetty Bhavyan 		"SBD_IT_PGR_REGISTERED",		/* 0x0002 */
416dea05b66SNattuvetty Bhavyan 		"SBD_IT_PGR_EXCLUSIVE_RSV_HOLDER",	/* 0x0004 */
417716c1805SNattuvetty Bhavyan 		"SBD_IT_PGR_CHECK_FLAG"			/* 0x0008 */
418dea05b66SNattuvetty Bhavyan 	};
419dea05b66SNattuvetty Bhavyan 
420dea05b66SNattuvetty Bhavyan 	if (cb_st->flag & STMF_SBD_VERBOSE) {
421dea05b66SNattuvetty Bhavyan 		mdb_printf("SBD IT DATA - %p\n", addr);
422dea05b66SNattuvetty Bhavyan 		mdb_printf("\tSession ID: 0x%0-lx\n", it->sbd_it_session_id);
423dea05b66SNattuvetty Bhavyan 		mdb_printf("\tIT Flags:   ");
424716c1805SNattuvetty Bhavyan 		stmf_sbd_print_bit_flags(it_flag_str, ARRAY_SIZE(it_flag_str),
425716c1805SNattuvetty Bhavyan 		    it->sbd_it_flags);
426dea05b66SNattuvetty Bhavyan 		mdb_printf("\tPGR Key:    %-p\n", it->pgr_key_ptr);
427dea05b66SNattuvetty Bhavyan 	} else {
428dea05b66SNattuvetty Bhavyan 		mdb_printf("%p\n", addr);
429dea05b66SNattuvetty Bhavyan 	}
430dea05b66SNattuvetty Bhavyan 	return (WALK_NEXT);
431dea05b66SNattuvetty Bhavyan }
432dea05b66SNattuvetty Bhavyan 
433dea05b66SNattuvetty Bhavyan /*
434dea05b66SNattuvetty Bhavyan  * MDB DCMDS implementations.
435dea05b66SNattuvetty Bhavyan  */
436dea05b66SNattuvetty Bhavyan 
437dea05b66SNattuvetty Bhavyan int
stmf_sbd_lu(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)438dea05b66SNattuvetty Bhavyan stmf_sbd_lu(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
439dea05b66SNattuvetty Bhavyan {
440dea05b66SNattuvetty Bhavyan 	uint_t		verbose = FALSE;
441dea05b66SNattuvetty Bhavyan 	sbd_lu_t	slu;
442dea05b66SNattuvetty Bhavyan 	stmf_sbd_cb_t	cb_st = {0};
443dea05b66SNattuvetty Bhavyan 
444dea05b66SNattuvetty Bhavyan 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose, NULL)
445dea05b66SNattuvetty Bhavyan 	    != argc)
446dea05b66SNattuvetty Bhavyan 		return (DCMD_USAGE);
447dea05b66SNattuvetty Bhavyan 	if (verbose)
448dea05b66SNattuvetty Bhavyan 		cb_st.flag |= STMF_SBD_VERBOSE;
449dea05b66SNattuvetty Bhavyan 
450dea05b66SNattuvetty Bhavyan 	if (flags & DCMD_ADDRSPEC) {
451dea05b66SNattuvetty Bhavyan 		cb_st.flag |= STMF_SBD_VERBOSE;
452dea05b66SNattuvetty Bhavyan 		if (mdb_vread(&slu, sizeof (sbd_lu_t), addr) == -1) {
453dea05b66SNattuvetty Bhavyan 			mdb_warn("failed to read sbd_lu_t at %p\n", addr);
454dea05b66SNattuvetty Bhavyan 			return (DCMD_ERR);
455dea05b66SNattuvetty Bhavyan 		}
456dea05b66SNattuvetty Bhavyan 		if (stmf_sbd_lu_cb(addr, &slu, &cb_st) == WALK_ERR)
457dea05b66SNattuvetty Bhavyan 			return (DCMD_ERR);
458dea05b66SNattuvetty Bhavyan 	} else {
459dea05b66SNattuvetty Bhavyan 		if (mdb_walk("stmf_sbd_lu", (mdb_walk_cb_t)stmf_sbd_lu_cb,
460dea05b66SNattuvetty Bhavyan 		    &cb_st) == -1) {
461dea05b66SNattuvetty Bhavyan 			mdb_warn("failed to walk sbd_lu_list\n");
462dea05b66SNattuvetty Bhavyan 			return (DCMD_ERR);
463dea05b66SNattuvetty Bhavyan 		}
464dea05b66SNattuvetty Bhavyan 	}
465dea05b66SNattuvetty Bhavyan 	return (DCMD_OK);
466dea05b66SNattuvetty Bhavyan }
467dea05b66SNattuvetty Bhavyan 
468dea05b66SNattuvetty Bhavyan static int
stmf_sbd_pgr_key(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)469dea05b66SNattuvetty Bhavyan stmf_sbd_pgr_key(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
470dea05b66SNattuvetty Bhavyan {
471dea05b66SNattuvetty Bhavyan 	uint_t		verbose = FALSE, keyonly = FALSE, pgrkeyaddr = FALSE;
472dea05b66SNattuvetty Bhavyan 	sbd_lu_t	slu;
473dea05b66SNattuvetty Bhavyan 	sbd_pgr_t	pgr;
474dea05b66SNattuvetty Bhavyan 	sbd_pgr_key_t	key;
475dea05b66SNattuvetty Bhavyan 	stmf_sbd_cb_t	cb_st = {0};
476dea05b66SNattuvetty Bhavyan 
477dea05b66SNattuvetty Bhavyan 	if (!(flags & DCMD_ADDRSPEC))
478dea05b66SNattuvetty Bhavyan 		return (DCMD_USAGE);
479dea05b66SNattuvetty Bhavyan 
480dea05b66SNattuvetty Bhavyan 	if (mdb_getopts(argc, argv,
481dea05b66SNattuvetty Bhavyan 	    'a', MDB_OPT_SETBITS, TRUE, &pgrkeyaddr,
482dea05b66SNattuvetty Bhavyan 	    'k', MDB_OPT_SETBITS, TRUE, &keyonly,
483dea05b66SNattuvetty Bhavyan 	    'v', MDB_OPT_SETBITS, TRUE, &verbose, NULL) != argc)
484dea05b66SNattuvetty Bhavyan 		return (DCMD_USAGE);
485dea05b66SNattuvetty Bhavyan 
486dea05b66SNattuvetty Bhavyan 	if (pgrkeyaddr || verbose)
487dea05b66SNattuvetty Bhavyan 		cb_st.flag |= STMF_SBD_VERBOSE;
488dea05b66SNattuvetty Bhavyan 
489dea05b66SNattuvetty Bhavyan 	/* If address of pgr_key is given, just print that key and return */
490dea05b66SNattuvetty Bhavyan 	if (pgrkeyaddr) {
491dea05b66SNattuvetty Bhavyan 		if (mdb_vread(&key, sizeof (sbd_pgr_key_t), addr) == -1) {
492dea05b66SNattuvetty Bhavyan 			mdb_warn("failed to read sbd_pgr_key at %p\n", addr);
493dea05b66SNattuvetty Bhavyan 			return (DCMD_ERR);
494dea05b66SNattuvetty Bhavyan 		}
495dea05b66SNattuvetty Bhavyan 		if (stmf_sbd_pgr_key_cb(addr, &key, &cb_st) == WALK_ERR) {
496dea05b66SNattuvetty Bhavyan 			return (DCMD_ERR);
497dea05b66SNattuvetty Bhavyan 		}
498dea05b66SNattuvetty Bhavyan 		return (DCMD_OK);
499dea05b66SNattuvetty Bhavyan 	} else {
500dea05b66SNattuvetty Bhavyan 		if (mdb_vread(&slu, sizeof (sbd_lu_t), addr) == -1) {
501dea05b66SNattuvetty Bhavyan 			mdb_warn("failed to read sbd_lu at %p\n", addr);
502dea05b66SNattuvetty Bhavyan 			return (DCMD_ERR);
503dea05b66SNattuvetty Bhavyan 		}
504dea05b66SNattuvetty Bhavyan 	}
505dea05b66SNattuvetty Bhavyan 
506dea05b66SNattuvetty Bhavyan 	if (verbose) {
507dea05b66SNattuvetty Bhavyan 		mdb_printf("\nLU:- %p\n", addr);
508dea05b66SNattuvetty Bhavyan 	}
509dea05b66SNattuvetty Bhavyan 	/* Just a sanity check, not necessarily needed */
510dea05b66SNattuvetty Bhavyan 	if (slu.sl_pgr == NULL) {
511dea05b66SNattuvetty Bhavyan 		if (verbose)
512dea05b66SNattuvetty Bhavyan 			mdb_warn("pgr structure not found for lun %p\n", addr);
513dea05b66SNattuvetty Bhavyan 		return (DCMD_OK);
514dea05b66SNattuvetty Bhavyan 	}
515dea05b66SNattuvetty Bhavyan 
516dea05b66SNattuvetty Bhavyan 	if (mdb_vread(&pgr, sizeof (sbd_pgr_t), (uintptr_t)slu.sl_pgr) == -1) {
517dea05b66SNattuvetty Bhavyan 		mdb_warn("failed to read sbd_lu at %p\n", slu.sl_pgr);
518dea05b66SNattuvetty Bhavyan 		return (DCMD_ERR);
519dea05b66SNattuvetty Bhavyan 	}
520dea05b66SNattuvetty Bhavyan 
521dea05b66SNattuvetty Bhavyan 	if (!keyonly)
522dea05b66SNattuvetty Bhavyan 		stmf_sbd_print_pgr_info(&pgr);
523dea05b66SNattuvetty Bhavyan 
524dea05b66SNattuvetty Bhavyan 	if (pgr.pgr_keylist == NULL) {
525dea05b66SNattuvetty Bhavyan 		if (verbose)
526dea05b66SNattuvetty Bhavyan 			mdb_printf("No registered pgr keys found\n");
527dea05b66SNattuvetty Bhavyan 		return (DCMD_OK);
528dea05b66SNattuvetty Bhavyan 	} else {
529dea05b66SNattuvetty Bhavyan 		if (!keyonly)
530dea05b66SNattuvetty Bhavyan 			mdb_printf("\nKeys\n");
531dea05b66SNattuvetty Bhavyan 	}
532dea05b66SNattuvetty Bhavyan 
533dea05b66SNattuvetty Bhavyan 	if (mdb_pwalk("stmf_sbd_pgr_key", (mdb_walk_cb_t)stmf_sbd_pgr_key_cb,
534dea05b66SNattuvetty Bhavyan 	    &cb_st, (uintptr_t)pgr.pgr_keylist) == -1) {
535dea05b66SNattuvetty Bhavyan 		mdb_warn("failed to walk pgr_keylist\n");
536dea05b66SNattuvetty Bhavyan 		return (DCMD_ERR);
537dea05b66SNattuvetty Bhavyan 	}
538dea05b66SNattuvetty Bhavyan 	return (DCMD_OK);
539dea05b66SNattuvetty Bhavyan }
540dea05b66SNattuvetty Bhavyan 
541716c1805SNattuvetty Bhavyan /*ARGSUSED*/
542716c1805SNattuvetty Bhavyan static int
stmf_remote_port(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)543716c1805SNattuvetty Bhavyan stmf_remote_port(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
544716c1805SNattuvetty Bhavyan {
545716c1805SNattuvetty Bhavyan 	stmf_remote_port_t rpt;
546716c1805SNattuvetty Bhavyan 	int	ret = DCMD_OK;
547716c1805SNattuvetty Bhavyan 
548716c1805SNattuvetty Bhavyan 	if (!(flags & DCMD_ADDRSPEC))
549716c1805SNattuvetty Bhavyan 		return (DCMD_USAGE);
550716c1805SNattuvetty Bhavyan 
551716c1805SNattuvetty Bhavyan 	if (mdb_vread(&rpt, sizeof (stmf_remote_port_t), addr) == -1) {
552716c1805SNattuvetty Bhavyan 		mdb_warn("failed to read stmf_remote_port_t at %p\n", addr);
553716c1805SNattuvetty Bhavyan 		return (DCMD_ERR);
554716c1805SNattuvetty Bhavyan 	}
555716c1805SNattuvetty Bhavyan 
556716c1805SNattuvetty Bhavyan 	ret = print_transport_id((uintptr_t)rpt.rport_tptid,
557716c1805SNattuvetty Bhavyan 	    rpt.rport_tptid_sz, "		");
558716c1805SNattuvetty Bhavyan 	return (ret);
559716c1805SNattuvetty Bhavyan }
560716c1805SNattuvetty Bhavyan 
561dea05b66SNattuvetty Bhavyan static int
stmf_sbd_it(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)562dea05b66SNattuvetty Bhavyan stmf_sbd_it(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
563dea05b66SNattuvetty Bhavyan {
564dea05b66SNattuvetty Bhavyan 	uint_t		verbose = FALSE;
565dea05b66SNattuvetty Bhavyan 	sbd_lu_t	slu;
566dea05b66SNattuvetty Bhavyan 	stmf_sbd_cb_t	cb_st = {0};
567dea05b66SNattuvetty Bhavyan 
568dea05b66SNattuvetty Bhavyan 	if (!(flags & DCMD_ADDRSPEC))
569dea05b66SNattuvetty Bhavyan 		return (DCMD_USAGE);
570dea05b66SNattuvetty Bhavyan 
571dea05b66SNattuvetty Bhavyan 	if (mdb_getopts(argc, argv,
572dea05b66SNattuvetty Bhavyan 	    'v', MDB_OPT_SETBITS, TRUE, &verbose, NULL) != argc)
573dea05b66SNattuvetty Bhavyan 		return (DCMD_USAGE);
574dea05b66SNattuvetty Bhavyan 
575dea05b66SNattuvetty Bhavyan 	if (verbose) {
576dea05b66SNattuvetty Bhavyan 		cb_st.flag |= STMF_SBD_VERBOSE;
577716c1805SNattuvetty Bhavyan 		mdb_printf("\nLU:- %p\n", addr);
578dea05b66SNattuvetty Bhavyan 	}
579dea05b66SNattuvetty Bhavyan 
580dea05b66SNattuvetty Bhavyan 	/* If address of pgr_key is given, just print that key and return */
581dea05b66SNattuvetty Bhavyan 	if (mdb_vread(&slu, sizeof (sbd_lu_t), addr) == -1) {
582dea05b66SNattuvetty Bhavyan 		mdb_warn("failed to read sbd_lu at %p\n", addr);
583dea05b66SNattuvetty Bhavyan 		return (DCMD_ERR);
584dea05b66SNattuvetty Bhavyan 	}
585dea05b66SNattuvetty Bhavyan 
586dea05b66SNattuvetty Bhavyan 	/* Just a sanity check, not necessarily needed */
587dea05b66SNattuvetty Bhavyan 	if (slu.sl_it_list == NULL) {
588dea05b66SNattuvetty Bhavyan 		if (verbose)
589716c1805SNattuvetty Bhavyan 			mdb_printf("sbd_it_list is empty\n", addr);
590dea05b66SNattuvetty Bhavyan 		return (DCMD_OK);
591dea05b66SNattuvetty Bhavyan 	}
592dea05b66SNattuvetty Bhavyan 
593dea05b66SNattuvetty Bhavyan 	if (mdb_pwalk("stmf_sbd_it", (mdb_walk_cb_t)stmf_sbd_it_cb, &cb_st,
594dea05b66SNattuvetty Bhavyan 	    (uintptr_t)slu.sl_it_list) == -1) {
595dea05b66SNattuvetty Bhavyan 		mdb_warn("failed to walk sbd_lu_it_list\n");
596dea05b66SNattuvetty Bhavyan 		return (DCMD_ERR);
597dea05b66SNattuvetty Bhavyan 	}
598dea05b66SNattuvetty Bhavyan 	return (DCMD_OK);
599dea05b66SNattuvetty Bhavyan }
600dea05b66SNattuvetty Bhavyan 
601dea05b66SNattuvetty Bhavyan /*
602dea05b66SNattuvetty Bhavyan  * MDB dmcds and walkers definitions
603dea05b66SNattuvetty Bhavyan  */
604dea05b66SNattuvetty Bhavyan 
605dea05b66SNattuvetty Bhavyan static const mdb_dcmd_t dcmds[] = {
606dea05b66SNattuvetty Bhavyan 	{ "stmf_sbd_lu", "?[-v]", "Print the list of sbd_lu_t",
607dea05b66SNattuvetty Bhavyan 	    stmf_sbd_lu, NULL },
608dea05b66SNattuvetty Bhavyan 	{ "stmf_sbd_it", ":[-v]", "Print the list of sbd_it_data for given lu",
609dea05b66SNattuvetty Bhavyan 	    stmf_sbd_it, NULL },
610dea05b66SNattuvetty Bhavyan 	{ "stmf_sbd_pgr_key", ":[-kov]", "Print the list of pgr keys",
611dea05b66SNattuvetty Bhavyan 	    stmf_sbd_pgr_key, stmf_sbd_pgr_key_dcmd_help },
612716c1805SNattuvetty Bhavyan 	{ "stmf_remote_port", ":", "decipher info in a stmf_remote_port",
613716c1805SNattuvetty Bhavyan 	    stmf_remote_port, NULL },
614dea05b66SNattuvetty Bhavyan 	{ NULL }
615dea05b66SNattuvetty Bhavyan };
616dea05b66SNattuvetty Bhavyan 
617dea05b66SNattuvetty Bhavyan static const mdb_walker_t walkers[] = {
618dea05b66SNattuvetty Bhavyan 	{ "stmf_sbd_lu", "walk list of stmf_sbd_lu structures",
619dea05b66SNattuvetty Bhavyan 	    stmf_sbd_lu_walk_init, stmf_sbd_lu_walk_step, NULL },
620dea05b66SNattuvetty Bhavyan 	{ "stmf_sbd_pgr_key", "walk the pgr keys of the given pgr key list",
621dea05b66SNattuvetty Bhavyan 	    stmf_sbd_pgr_key_walk_init, stmf_sbd_pgr_key_walk_step, NULL },
622dea05b66SNattuvetty Bhavyan 	{ "stmf_sbd_it", "walk the sbd_it_data for the given it list",
623dea05b66SNattuvetty Bhavyan 	    stmf_sbd_it_walk_init, stmf_sbd_it_walk_step, NULL },
624dea05b66SNattuvetty Bhavyan 	{ NULL }
625dea05b66SNattuvetty Bhavyan };
626dea05b66SNattuvetty Bhavyan 
627dea05b66SNattuvetty Bhavyan static const mdb_modinfo_t modinfo = {
628dea05b66SNattuvetty Bhavyan 	MDB_API_VERSION, dcmds, walkers
629dea05b66SNattuvetty Bhavyan };
630dea05b66SNattuvetty Bhavyan 
631dea05b66SNattuvetty Bhavyan const mdb_modinfo_t *
_mdb_init(void)632dea05b66SNattuvetty Bhavyan _mdb_init(void)
633dea05b66SNattuvetty Bhavyan {
634dea05b66SNattuvetty Bhavyan 	return (&modinfo);
635dea05b66SNattuvetty Bhavyan }
636