15b504601Sjiang wu - Sun Microsystems - Beijing China /*
25b504601Sjiang wu - Sun Microsystems - Beijing China  * CDDL HEADER START
35b504601Sjiang wu - Sun Microsystems - Beijing China  *
45b504601Sjiang wu - Sun Microsystems - Beijing China  * The contents of this file are subject to the terms of the
55b504601Sjiang wu - Sun Microsystems - Beijing China  * Common Development and Distribution License (the "License").
65b504601Sjiang wu - Sun Microsystems - Beijing China  * You may not use this file except in compliance with the License.
75b504601Sjiang wu - Sun Microsystems - Beijing China  *
85b504601Sjiang wu - Sun Microsystems - Beijing China  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95b504601Sjiang wu - Sun Microsystems - Beijing China  * or http://www.opensolaris.org/os/licensing.
105b504601Sjiang wu - Sun Microsystems - Beijing China  * See the License for the specific language governing permissions
115b504601Sjiang wu - Sun Microsystems - Beijing China  * and limitations under the License.
125b504601Sjiang wu - Sun Microsystems - Beijing China  *
135b504601Sjiang wu - Sun Microsystems - Beijing China  * When distributing Covered Code, include this CDDL HEADER in each
145b504601Sjiang wu - Sun Microsystems - Beijing China  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155b504601Sjiang wu - Sun Microsystems - Beijing China  * If applicable, add the following below this CDDL HEADER, with the
165b504601Sjiang wu - Sun Microsystems - Beijing China  * fields enclosed by brackets "[]" replaced with your own identifying
175b504601Sjiang wu - Sun Microsystems - Beijing China  * information: Portions Copyright [yyyy] [name of copyright owner]
185b504601Sjiang wu - Sun Microsystems - Beijing China  *
195b504601Sjiang wu - Sun Microsystems - Beijing China  * CDDL HEADER END
205b504601Sjiang wu - Sun Microsystems - Beijing China  */
215b504601Sjiang wu - Sun Microsystems - Beijing China /*
225b504601Sjiang wu - Sun Microsystems - Beijing China  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
235b504601Sjiang wu - Sun Microsystems - Beijing China  * Use is subject to license terms.
245b504601Sjiang wu - Sun Microsystems - Beijing China  */
255b504601Sjiang wu - Sun Microsystems - Beijing China 
26da5ab83fSKeith M Wesolowski /*
27e89016e7SRobert Mustacchi  * Copyright (c) 2017 Joyent, Inc.
2850c45111SAndy Giles  * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
29*72a2c484SHans Rosenfeld  * Copyright 2023 Racktop Systems, Inc.
30da5ab83fSKeith M Wesolowski  */
31da5ab83fSKeith M Wesolowski 
325b504601Sjiang wu - Sun Microsystems - Beijing China #include <limits.h>
335b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/mdb_modapi.h>
345b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/sysinfo.h>
355b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/sunmdi.h>
36da5ab83fSKeith M Wesolowski #include <sys/list.h>
375b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/scsi.h>
38db2effc6SRobert Mustacchi #include <sys/refhash.h>
395b504601Sjiang wu - Sun Microsystems - Beijing China 
405b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack(1)
41*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_type.h>
42*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2.h>
43*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_cnfg.h>
44*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_init.h>
45*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_ioc.h>
46*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_sas.h>
47*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_raid.h>
48*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_tool.h>
495b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack()
505b504601Sjiang wu - Sun Microsystems - Beijing China 
515b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mptsas_var.h>
525b504601Sjiang wu - Sun Microsystems - Beijing China 
535b504601Sjiang wu - Sun Microsystems - Beijing China struct {
545b504601Sjiang wu - Sun Microsystems - Beijing China 	int	value;
555b504601Sjiang wu - Sun Microsystems - Beijing China 	char	*text;
565b504601Sjiang wu - Sun Microsystems - Beijing China } devinfo_array[] = {
575b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_SEP,		"SEP" },
585b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_ATAPI_DEVICE,	"ATAPI device" },
595b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_LSI_DEVICE,	"LSI device" },
605b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_DIRECT_ATTACH,	"direct attach" },
615b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_SSP_TARGET,	"SSP tgt" },
625b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_STP_TARGET,	"STP tgt" },
635b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_SMP_TARGET,	"SMP tgt" },
645b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_SATA_DEVICE,	"SATA dev" },
655b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_SSP_INITIATOR,	"SSP init" },
665b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_STP_INITIATOR,	"STP init" },
675b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_SMP_INITIATOR,	"SMP init" },
685b504601Sjiang wu - Sun Microsystems - Beijing China 	{ MPI2_SAS_DEVICE_INFO_SATA_HOST,	"SATA host" }
695b504601Sjiang wu - Sun Microsystems - Beijing China };
705b504601Sjiang wu - Sun Microsystems - Beijing China 
715b504601Sjiang wu - Sun Microsystems - Beijing China int
construct_path(uintptr_t addr,char * result)725b504601Sjiang wu - Sun Microsystems - Beijing China construct_path(uintptr_t addr, char *result)
735b504601Sjiang wu - Sun Microsystems - Beijing China {
745b504601Sjiang wu - Sun Microsystems - Beijing China 	struct	dev_info	d;
755b504601Sjiang wu - Sun Microsystems - Beijing China 	char	devi_node[PATH_MAX];
765b504601Sjiang wu - Sun Microsystems - Beijing China 	char	devi_addr[PATH_MAX];
775b504601Sjiang wu - Sun Microsystems - Beijing China 
785b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mdb_vread(&d, sizeof (d), addr) == -1) {
795b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read dev_info");
805b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DCMD_ERR);
815b504601Sjiang wu - Sun Microsystems - Beijing China 	}
825b504601Sjiang wu - Sun Microsystems - Beijing China 
835b504601Sjiang wu - Sun Microsystems - Beijing China 	if (d.devi_parent) {
845b504601Sjiang wu - Sun Microsystems - Beijing China 		construct_path((uintptr_t)d.devi_parent, result);
855b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_readstr(devi_node, sizeof (devi_node),
865b504601Sjiang wu - Sun Microsystems - Beijing China 		    (uintptr_t)d.devi_node_name);
875b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_readstr(devi_addr, sizeof (devi_addr),
885b504601Sjiang wu - Sun Microsystems - Beijing China 		    (uintptr_t)d.devi_addr);
895b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_snprintf(result+strlen(result),
905b504601Sjiang wu - Sun Microsystems - Beijing China 		    PATH_MAX-strlen(result),
915b504601Sjiang wu - Sun Microsystems - Beijing China 		    "/%s%s%s", devi_node, (*devi_addr ? "@" : ""),
925b504601Sjiang wu - Sun Microsystems - Beijing China 		    devi_addr);
935b504601Sjiang wu - Sun Microsystems - Beijing China 	}
945b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DCMD_OK);
955b504601Sjiang wu - Sun Microsystems - Beijing China }
965b504601Sjiang wu - Sun Microsystems - Beijing China 
975b504601Sjiang wu - Sun Microsystems - Beijing China /* ARGSUSED */
985b504601Sjiang wu - Sun Microsystems - Beijing China int
mdi_info_cb(uintptr_t addr,const void * data,void * cbdata)995b504601Sjiang wu - Sun Microsystems - Beijing China mdi_info_cb(uintptr_t addr, const void *data, void *cbdata)
1005b504601Sjiang wu - Sun Microsystems - Beijing China {
1015b504601Sjiang wu - Sun Microsystems - Beijing China 	struct	mdi_pathinfo	pi;
1025b504601Sjiang wu - Sun Microsystems - Beijing China 	struct	mdi_client	c;
1035b504601Sjiang wu - Sun Microsystems - Beijing China 	char	dev_path[PATH_MAX];
1045b504601Sjiang wu - Sun Microsystems - Beijing China 	char	string[PATH_MAX];
1055b504601Sjiang wu - Sun Microsystems - Beijing China 	int	mdi_target = 0, mdi_lun = 0;
1065b504601Sjiang wu - Sun Microsystems - Beijing China 	int	target = *(int *)cbdata;
1075b504601Sjiang wu - Sun Microsystems - Beijing China 
1085b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mdb_vread(&pi, sizeof (pi), addr) == -1) {
1095b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read mdi_pathinfo");
1105b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DCMD_ERR);
1115b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1125b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_readstr(string, sizeof (string), (uintptr_t)pi.pi_addr);
113da5ab83fSKeith M Wesolowski 	mdi_target = (int)mdb_strtoull(string);
114da5ab83fSKeith M Wesolowski 	mdi_lun = (int)mdb_strtoull(strchr(string, ',') + 1);
1155b504601Sjiang wu - Sun Microsystems - Beijing China 	if (target != mdi_target)
1165b504601Sjiang wu - Sun Microsystems - Beijing China 		return (0);
1175b504601Sjiang wu - Sun Microsystems - Beijing China 
1185b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mdb_vread(&c, sizeof (c), (uintptr_t)pi.pi_client) == -1) {
1195b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read mdi_client");
1205b504601Sjiang wu - Sun Microsystems - Beijing China 		return (-1);
1215b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1225b504601Sjiang wu - Sun Microsystems - Beijing China 
123892ad162SToomas Soome 	*dev_path = '\0';
1245b504601Sjiang wu - Sun Microsystems - Beijing China 	if (construct_path((uintptr_t)c.ct_dip, dev_path) != DCMD_OK)
1255b504601Sjiang wu - Sun Microsystems - Beijing China 		strcpy(dev_path, "unknown");
1265b504601Sjiang wu - Sun Microsystems - Beijing China 
1275b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("LUN %d: %s\n", mdi_lun, dev_path);
1285b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("       dip: %p %s path", c.ct_dip,
1295b504601Sjiang wu - Sun Microsystems - Beijing China 	    (pi.pi_preferred ? "preferred" : ""));
1305b504601Sjiang wu - Sun Microsystems - Beijing China 	switch (pi.pi_state & MDI_PATHINFO_STATE_MASK) {
1315b504601Sjiang wu - Sun Microsystems - Beijing China 		case MDI_PATHINFO_STATE_INIT:
1325b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf(" initializing");
1335b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
1345b504601Sjiang wu - Sun Microsystems - Beijing China 		case MDI_PATHINFO_STATE_ONLINE:
1355b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf(" online");
1365b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
1375b504601Sjiang wu - Sun Microsystems - Beijing China 		case MDI_PATHINFO_STATE_STANDBY:
1385b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf(" standby");
1395b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
1405b504601Sjiang wu - Sun Microsystems - Beijing China 		case MDI_PATHINFO_STATE_FAULT:
1415b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf(" fault");
1425b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
1435b504601Sjiang wu - Sun Microsystems - Beijing China 		case MDI_PATHINFO_STATE_OFFLINE:
1445b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf(" offline");
1455b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
1465b504601Sjiang wu - Sun Microsystems - Beijing China 		default:
1475b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf(" invalid state");
1485b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
1495b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1505b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
1515b504601Sjiang wu - Sun Microsystems - Beijing China 	return (0);
1525b504601Sjiang wu - Sun Microsystems - Beijing China }
1535b504601Sjiang wu - Sun Microsystems - Beijing China 
1545b504601Sjiang wu - Sun Microsystems - Beijing China void
mdi_info(struct mptsas * mp,int target)15550c45111SAndy Giles mdi_info(struct mptsas *mp, int target)
1565b504601Sjiang wu - Sun Microsystems - Beijing China {
1575b504601Sjiang wu - Sun Microsystems - Beijing China 	struct	dev_info	d;
1585b504601Sjiang wu - Sun Microsystems - Beijing China 	struct	mdi_phci	p;
1595b504601Sjiang wu - Sun Microsystems - Beijing China 
16050c45111SAndy Giles 	if (mdb_vread(&d, sizeof (d), (uintptr_t)mp->m_dip) == -1) {
1615b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read m_dip");
1625b504601Sjiang wu - Sun Microsystems - Beijing China 		return;
1635b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1645b504601Sjiang wu - Sun Microsystems - Beijing China 
1655b504601Sjiang wu - Sun Microsystems - Beijing China 	if (MDI_PHCI(&d)) {
1665b504601Sjiang wu - Sun Microsystems - Beijing China 		if (mdb_vread(&p, sizeof (p), (uintptr_t)d.devi_mdi_xhci)
1675b504601Sjiang wu - Sun Microsystems - Beijing China 		    == -1) {
1685b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_warn("couldn't read m_dip.devi_mdi_xhci");
1695b504601Sjiang wu - Sun Microsystems - Beijing China 			return;
1705b504601Sjiang wu - Sun Microsystems - Beijing China 		}
1715b504601Sjiang wu - Sun Microsystems - Beijing China 		if (p.ph_path_head)
1725b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_pwalk("mdipi_phci_list", (mdb_walk_cb_t)mdi_info_cb,
1735b504601Sjiang wu - Sun Microsystems - Beijing China 			    &target, (uintptr_t)p.ph_path_head);
1745b504601Sjiang wu - Sun Microsystems - Beijing China 		return;
1755b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1765b504601Sjiang wu - Sun Microsystems - Beijing China }
1775b504601Sjiang wu - Sun Microsystems - Beijing China 
1785b504601Sjiang wu - Sun Microsystems - Beijing China void
print_cdb(mptsas_cmd_t * m)1795b504601Sjiang wu - Sun Microsystems - Beijing China print_cdb(mptsas_cmd_t *m)
1805b504601Sjiang wu - Sun Microsystems - Beijing China {
1815b504601Sjiang wu - Sun Microsystems - Beijing China 	struct	scsi_pkt	pkt;
1825b504601Sjiang wu - Sun Microsystems - Beijing China 	uchar_t	cdb[512];	/* an arbitrarily large number */
1835b504601Sjiang wu - Sun Microsystems - Beijing China 	int	j;
1845b504601Sjiang wu - Sun Microsystems - Beijing China 
1855b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mdb_vread(&pkt, sizeof (pkt), (uintptr_t)m->cmd_pkt) == -1) {
1865b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read cmd_pkt");
1875b504601Sjiang wu - Sun Microsystems - Beijing China 		return;
1885b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1895b504601Sjiang wu - Sun Microsystems - Beijing China 
1905b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
1915b504601Sjiang wu - Sun Microsystems - Beijing China 	 * We use cmd_cdblen here because 5.10 doesn't
1925b504601Sjiang wu - Sun Microsystems - Beijing China 	 * have the cdb length in the pkt
1935b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
1945b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mdb_vread(&cdb, m->cmd_cdblen, (uintptr_t)pkt.pkt_cdbp) == -1) {
1955b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read pkt_cdbp");
1965b504601Sjiang wu - Sun Microsystems - Beijing China 		return;
1975b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1985b504601Sjiang wu - Sun Microsystems - Beijing China 
1995b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("%3d,%-3d [ ",
2005b504601Sjiang wu - Sun Microsystems - Beijing China 	    pkt.pkt_address.a_target, pkt.pkt_address.a_lun);
2015b504601Sjiang wu - Sun Microsystems - Beijing China 
2025b504601Sjiang wu - Sun Microsystems - Beijing China 	for (j = 0; j < m->cmd_cdblen; j++)
2035b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("%02x ", cdb[j]);
2045b504601Sjiang wu - Sun Microsystems - Beijing China 
2055b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("]\n");
2065b504601Sjiang wu - Sun Microsystems - Beijing China }
2075b504601Sjiang wu - Sun Microsystems - Beijing China 
2085b504601Sjiang wu - Sun Microsystems - Beijing China 
2095b504601Sjiang wu - Sun Microsystems - Beijing China void
display_ports(struct mptsas * mp)210da5ab83fSKeith M Wesolowski display_ports(struct mptsas *mp)
2115b504601Sjiang wu - Sun Microsystems - Beijing China {
2125b504601Sjiang wu - Sun Microsystems - Beijing China 	int i;
2135b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
2145b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("phy number and port mapping table\n");
2155b504601Sjiang wu - Sun Microsystems - Beijing China 	for (i = 0; i < MPTSAS_MAX_PHYS; i++) {
216da5ab83fSKeith M Wesolowski 		if (mp->m_phy_info[i].attached_devhdl) {
2175b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("phy %x --> port %x, phymask %x,"
218da5ab83fSKeith M Wesolowski 			"attached_devhdl %x\n", i, mp->m_phy_info[i].port_num,
219da5ab83fSKeith M Wesolowski 			    mp->m_phy_info[i].phy_mask,
220da5ab83fSKeith M Wesolowski 			    mp->m_phy_info[i].attached_devhdl);
2215b504601Sjiang wu - Sun Microsystems - Beijing China 		}
2225b504601Sjiang wu - Sun Microsystems - Beijing China 	}
2235b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
2245b504601Sjiang wu - Sun Microsystems - Beijing China }
225da5ab83fSKeith M Wesolowski 
226da5ab83fSKeith M Wesolowski static uintptr_t
klist_head(list_t * lp,uintptr_t klp)227da5ab83fSKeith M Wesolowski klist_head(list_t *lp, uintptr_t klp)
2285b504601Sjiang wu - Sun Microsystems - Beijing China {
229da5ab83fSKeith M Wesolowski 	if ((uintptr_t)lp->list_head.list_next ==
230da5ab83fSKeith M Wesolowski 	    klp + offsetof(struct list, list_head))
231892ad162SToomas Soome 		return (0);
2325b504601Sjiang wu - Sun Microsystems - Beijing China 
233da5ab83fSKeith M Wesolowski 	return ((uintptr_t)(((char *)lp->list_head.list_next) -
234da5ab83fSKeith M Wesolowski 	    lp->list_offset));
235da5ab83fSKeith M Wesolowski }
236da5ab83fSKeith M Wesolowski 
237da5ab83fSKeith M Wesolowski static uintptr_t
klist_next(list_t * lp,uintptr_t klp,void * op)238da5ab83fSKeith M Wesolowski klist_next(list_t *lp, uintptr_t klp, void *op)
239da5ab83fSKeith M Wesolowski {
240da5ab83fSKeith M Wesolowski 	/* LINTED E_BAD_PTR_CAST_ALIG */
241da5ab83fSKeith M Wesolowski 	struct list_node *np = (struct list_node *)(((char *)op) +
242da5ab83fSKeith M Wesolowski 	    lp->list_offset);
2435b504601Sjiang wu - Sun Microsystems - Beijing China 
244da5ab83fSKeith M Wesolowski 	if ((uintptr_t)np->list_next == klp + offsetof(struct list, list_head))
245892ad162SToomas Soome 		return (0);
246da5ab83fSKeith M Wesolowski 
247da5ab83fSKeith M Wesolowski 	return (((uintptr_t)(np->list_next)) - lp->list_offset);
248da5ab83fSKeith M Wesolowski }
249da5ab83fSKeith M Wesolowski 
250da5ab83fSKeith M Wesolowski static void *
krefhash_first(uintptr_t khp,uintptr_t * addr)25150c45111SAndy Giles krefhash_first(uintptr_t khp, uintptr_t *addr)
252da5ab83fSKeith M Wesolowski {
253da5ab83fSKeith M Wesolowski 	refhash_t mh;
254da5ab83fSKeith M Wesolowski 	uintptr_t klp;
255da5ab83fSKeith M Wesolowski 	uintptr_t kop;
256da5ab83fSKeith M Wesolowski 	void *rp;
257da5ab83fSKeith M Wesolowski 
258da5ab83fSKeith M Wesolowski 	mdb_vread(&mh, sizeof (mh), khp);
259da5ab83fSKeith M Wesolowski 	klp = klist_head(&mh.rh_objs, khp + offsetof(refhash_t, rh_objs));
260da5ab83fSKeith M Wesolowski 	if (klp == 0)
261da5ab83fSKeith M Wesolowski 		return (NULL);
262da5ab83fSKeith M Wesolowski 
263da5ab83fSKeith M Wesolowski 	kop = klp - mh.rh_link_off;
26450c45111SAndy Giles 	if (addr)
26550c45111SAndy Giles 		*addr = kop;
266da5ab83fSKeith M Wesolowski 	rp = mdb_alloc(mh.rh_obj_size, UM_SLEEP);
267da5ab83fSKeith M Wesolowski 	mdb_vread(rp, mh.rh_obj_size, kop);
268da5ab83fSKeith M Wesolowski 
269da5ab83fSKeith M Wesolowski 	return (rp);
270da5ab83fSKeith M Wesolowski }
271da5ab83fSKeith M Wesolowski 
272da5ab83fSKeith M Wesolowski static void *
krefhash_next(uintptr_t khp,void * op,uintptr_t * addr)27350c45111SAndy Giles krefhash_next(uintptr_t khp, void *op, uintptr_t *addr)
274da5ab83fSKeith M Wesolowski {
275da5ab83fSKeith M Wesolowski 	refhash_t mh;
276da5ab83fSKeith M Wesolowski 	void *prev = op;
277da5ab83fSKeith M Wesolowski 	refhash_link_t *lp;
278da5ab83fSKeith M Wesolowski 	uintptr_t klp;
279da5ab83fSKeith M Wesolowski 	uintptr_t kop;
280da5ab83fSKeith M Wesolowski 	refhash_link_t ml;
281da5ab83fSKeith M Wesolowski 	void *rp;
282da5ab83fSKeith M Wesolowski 
283da5ab83fSKeith M Wesolowski 	mdb_vread(&mh, sizeof (mh), khp);
284da5ab83fSKeith M Wesolowski 	/* LINTED E_BAD_PTR_CAST_ALIG */
285da5ab83fSKeith M Wesolowski 	lp = (refhash_link_t *)(((char *)(op)) + mh.rh_link_off);
286da5ab83fSKeith M Wesolowski 	ml = *lp;
287da5ab83fSKeith M Wesolowski 	while ((klp = klist_next(&mh.rh_objs,
288892ad162SToomas Soome 	    khp + offsetof(refhash_t, rh_objs), &ml)) != 0) {
289da5ab83fSKeith M Wesolowski 		mdb_vread(&ml, sizeof (ml), klp);
290da5ab83fSKeith M Wesolowski 		if (!(ml.rhl_flags & RHL_F_DEAD))
291da5ab83fSKeith M Wesolowski 			break;
2925b504601Sjiang wu - Sun Microsystems - Beijing China 	}
293da5ab83fSKeith M Wesolowski 
294da5ab83fSKeith M Wesolowski 	if (klp == 0) {
295da5ab83fSKeith M Wesolowski 		mdb_free(prev, mh.rh_obj_size);
2965b504601Sjiang wu - Sun Microsystems - Beijing China 		return (NULL);
2975b504601Sjiang wu - Sun Microsystems - Beijing China 	}
298da5ab83fSKeith M Wesolowski 
299da5ab83fSKeith M Wesolowski 	kop = klp - mh.rh_link_off;
30050c45111SAndy Giles 	if (addr)
30150c45111SAndy Giles 		*addr = kop;
302da5ab83fSKeith M Wesolowski 	rp = mdb_alloc(mh.rh_obj_size, UM_SLEEP);
303da5ab83fSKeith M Wesolowski 	mdb_vread(rp, mh.rh_obj_size, kop);
304da5ab83fSKeith M Wesolowski 
305da5ab83fSKeith M Wesolowski 	mdb_free(prev, mh.rh_obj_size);
306da5ab83fSKeith M Wesolowski 	return (rp);
3075b504601Sjiang wu - Sun Microsystems - Beijing China }
308da5ab83fSKeith M Wesolowski 
3095b504601Sjiang wu - Sun Microsystems - Beijing China void
display_targets(struct mptsas * mp,uint_t verbose)31050c45111SAndy Giles display_targets(struct mptsas *mp, uint_t verbose)
3115b504601Sjiang wu - Sun Microsystems - Beijing China {
3125b504601Sjiang wu - Sun Microsystems - Beijing China 	mptsas_target_t *ptgt;
3135b504601Sjiang wu - Sun Microsystems - Beijing China 	mptsas_smp_t *psmp;
31450c45111SAndy Giles 	int loop, comma;
31550c45111SAndy Giles 	uintptr_t p_addr;
3165b504601Sjiang wu - Sun Microsystems - Beijing China 
3175b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
31850c45111SAndy Giles 	mdb_printf(" mptsas_target_t slot devhdl      wwn     ncmds throttle   "
31950c45111SAndy Giles 	    "dr_flag dups\n");
32050c45111SAndy Giles 	mdb_printf("---------------------------------------"
32150c45111SAndy Giles 	    "-------------------------------\n");
32250c45111SAndy Giles 	for (ptgt = krefhash_first((uintptr_t)mp->m_targets, &p_addr);
323da5ab83fSKeith M Wesolowski 	    ptgt != NULL;
32450c45111SAndy Giles 	    ptgt = krefhash_next((uintptr_t)mp->m_targets, ptgt, &p_addr)) {
32550c45111SAndy Giles 		if (ptgt->m_addr.mta_wwn ||
32650c45111SAndy Giles 		    ptgt->m_deviceinfo) {
32750c45111SAndy Giles 			mdb_printf("%16p ", p_addr);
32850c45111SAndy Giles 			mdb_printf("%4d ", ptgt->m_slot_num);
32950c45111SAndy Giles 			mdb_printf("%4d ", ptgt->m_devhdl);
33050c45111SAndy Giles 			if (ptgt->m_addr.mta_wwn)
3315b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_printf("%"PRIx64" ",
33250c45111SAndy Giles 				    ptgt->m_addr.mta_wwn);
33350c45111SAndy Giles 			mdb_printf("%3d", ptgt->m_t_ncmds);
33450c45111SAndy Giles 			switch (ptgt->m_t_throttle) {
3355b504601Sjiang wu - Sun Microsystems - Beijing China 				case QFULL_THROTTLE:
3365b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("   QFULL ");
3375b504601Sjiang wu - Sun Microsystems - Beijing China 					break;
3385b504601Sjiang wu - Sun Microsystems - Beijing China 				case DRAIN_THROTTLE:
3395b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("   DRAIN ");
3405b504601Sjiang wu - Sun Microsystems - Beijing China 					break;
3415b504601Sjiang wu - Sun Microsystems - Beijing China 				case HOLD_THROTTLE:
3425b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("    HOLD ");
3435b504601Sjiang wu - Sun Microsystems - Beijing China 					break;
3445b504601Sjiang wu - Sun Microsystems - Beijing China 				case MAX_THROTTLE:
3455b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("     MAX ");
3465b504601Sjiang wu - Sun Microsystems - Beijing China 					break;
3475b504601Sjiang wu - Sun Microsystems - Beijing China 				default:
3485b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("%8d ",
34950c45111SAndy Giles 					    ptgt->m_t_throttle);
3505b504601Sjiang wu - Sun Microsystems - Beijing China 			}
35150c45111SAndy Giles 			switch (ptgt->m_dr_flag) {
3525b504601Sjiang wu - Sun Microsystems - Beijing China 				case MPTSAS_DR_INACTIVE:
3535b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("  INACTIVE ");
3545b504601Sjiang wu - Sun Microsystems - Beijing China 					break;
35550c45111SAndy Giles 				case MPTSAS_DR_INTRANSITION:
35650c45111SAndy Giles 					mdb_printf("TRANSITION ");
3575b504601Sjiang wu - Sun Microsystems - Beijing China 					break;
3585b504601Sjiang wu - Sun Microsystems - Beijing China 				default:
3595b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("   UNKNOWN ");
3605b504601Sjiang wu - Sun Microsystems - Beijing China 					break;
3615b504601Sjiang wu - Sun Microsystems - Beijing China 				}
36250c45111SAndy Giles 			mdb_printf("%d\n",
36350c45111SAndy Giles 			    ptgt->m_dups);
3645b504601Sjiang wu - Sun Microsystems - Beijing China 
3655b504601Sjiang wu - Sun Microsystems - Beijing China 			if (verbose) {
3665b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_inc_indent(5);
36750c45111SAndy Giles 				if ((ptgt->m_deviceinfo &
3685b504601Sjiang wu - Sun Microsystems - Beijing China 				    MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) ==
3695b504601Sjiang wu - Sun Microsystems - Beijing China 				    MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER)
3705b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("Fanout expander: ");
37150c45111SAndy Giles 				if ((ptgt->m_deviceinfo &
3725b504601Sjiang wu - Sun Microsystems - Beijing China 				    MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) ==
3735b504601Sjiang wu - Sun Microsystems - Beijing China 				    MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER)
3745b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("Edge expander: ");
37550c45111SAndy Giles 				if ((ptgt->m_deviceinfo &
3765b504601Sjiang wu - Sun Microsystems - Beijing China 				    MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) ==
3775b504601Sjiang wu - Sun Microsystems - Beijing China 				    MPI2_SAS_DEVICE_INFO_END_DEVICE)
3785b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("End device: ");
37950c45111SAndy Giles 				if ((ptgt->m_deviceinfo &
3805b504601Sjiang wu - Sun Microsystems - Beijing China 				    MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) ==
3815b504601Sjiang wu - Sun Microsystems - Beijing China 				    MPI2_SAS_DEVICE_INFO_NO_DEVICE)
3825b504601Sjiang wu - Sun Microsystems - Beijing China 					mdb_printf("No device ");
3835b504601Sjiang wu - Sun Microsystems - Beijing China 
3845b504601Sjiang wu - Sun Microsystems - Beijing China 				for (loop = 0, comma = 0;
3855b504601Sjiang wu - Sun Microsystems - Beijing China 				    loop < (sizeof (devinfo_array) /
3865b504601Sjiang wu - Sun Microsystems - Beijing China 				    sizeof (devinfo_array[0])); loop++) {
38750c45111SAndy Giles 					if (ptgt->m_deviceinfo &
3885b504601Sjiang wu - Sun Microsystems - Beijing China 					    devinfo_array[loop].value) {
3895b504601Sjiang wu - Sun Microsystems - Beijing China 						mdb_printf("%s%s",
3905b504601Sjiang wu - Sun Microsystems - Beijing China 						    (comma ? ", " : ""),
3915b504601Sjiang wu - Sun Microsystems - Beijing China 						    devinfo_array[loop].text);
3925b504601Sjiang wu - Sun Microsystems - Beijing China 						comma++;
3935b504601Sjiang wu - Sun Microsystems - Beijing China 					}
3945b504601Sjiang wu - Sun Microsystems - Beijing China 				}
3955b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_printf("\n");
39650c45111SAndy Giles 				mdi_info(mp, ptgt->m_slot_num);
3975b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_dec_indent(5);
3985b504601Sjiang wu - Sun Microsystems - Beijing China 			}
3995b504601Sjiang wu - Sun Microsystems - Beijing China 		}
4005b504601Sjiang wu - Sun Microsystems - Beijing China 	}
40150c45111SAndy Giles 
40250c45111SAndy Giles 	mdb_printf("\n");
40350c45111SAndy Giles 	mdb_printf("    mptsas_smp_t devhdl      wwn          phymask\n");
40450c45111SAndy Giles 	mdb_printf("---------------------------------------"
40550c45111SAndy Giles 	    "------------------\n");
40650c45111SAndy Giles 	for (psmp = (mptsas_smp_t *)krefhash_first(
40750c45111SAndy Giles 	    (uintptr_t)mp->m_smp_targets, &p_addr);
40850c45111SAndy Giles 	    psmp != NULL;
40950c45111SAndy Giles 	    psmp = krefhash_next((uintptr_t)mp->m_smp_targets, psmp,
41050c45111SAndy Giles 	    &p_addr)) {
41150c45111SAndy Giles 		mdb_printf("%16p   ", p_addr);
41250c45111SAndy Giles 		mdb_printf("%4d  %"PRIx64"    %04x\n",
41350c45111SAndy Giles 		    psmp->m_devhdl, psmp->m_addr.mta_wwn,
41450c45111SAndy Giles 		    psmp->m_addr.mta_phymask);
41550c45111SAndy Giles 
41650c45111SAndy Giles 		if (!verbose)
41750c45111SAndy Giles 			continue;
41850c45111SAndy Giles 
41950c45111SAndy Giles 		mdb_inc_indent(5);
42050c45111SAndy Giles 		if ((psmp->m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE)
42150c45111SAndy Giles 		    == MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER)
42250c45111SAndy Giles 			mdb_printf("Fanout expander: ");
42350c45111SAndy Giles 		if ((psmp->m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE)
42450c45111SAndy Giles 		    == MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER)
42550c45111SAndy Giles 			mdb_printf("Edge expander: ");
42650c45111SAndy Giles 		if ((psmp->m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE)
42750c45111SAndy Giles 		    == MPI2_SAS_DEVICE_INFO_END_DEVICE)
42850c45111SAndy Giles 			mdb_printf("End device: ");
42950c45111SAndy Giles 		if ((psmp->m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE)
43050c45111SAndy Giles 		    == MPI2_SAS_DEVICE_INFO_NO_DEVICE)
43150c45111SAndy Giles 			mdb_printf("No device ");
43250c45111SAndy Giles 
43350c45111SAndy Giles 		for (loop = 0, comma = 0;
43450c45111SAndy Giles 		    loop < (sizeof (devinfo_array)
43550c45111SAndy Giles 		    / sizeof (devinfo_array[0]));
43650c45111SAndy Giles 		    loop++) {
43750c45111SAndy Giles 			if (psmp->m_deviceinfo &
43850c45111SAndy Giles 			    devinfo_array[loop].value) {
43950c45111SAndy Giles 				mdb_printf("%s%s",
44050c45111SAndy Giles 				    (comma ? ", " : ""),
44150c45111SAndy Giles 				    devinfo_array[loop].text);
44250c45111SAndy Giles 				comma++;
44350c45111SAndy Giles 			}
44450c45111SAndy Giles 		}
44550c45111SAndy Giles 		mdb_printf("\n");
44650c45111SAndy Giles 		mdb_dec_indent(5);
44750c45111SAndy Giles 	}
4485b504601Sjiang wu - Sun Microsystems - Beijing China }
4495b504601Sjiang wu - Sun Microsystems - Beijing China 
4505b504601Sjiang wu - Sun Microsystems - Beijing China int
display_slotinfo(struct mptsas * mp,struct mptsas_slots * s)45150c45111SAndy Giles display_slotinfo(struct mptsas *mp, struct mptsas_slots *s)
4525b504601Sjiang wu - Sun Microsystems - Beijing China {
45350c45111SAndy Giles 	int			i, nslots;
45450c45111SAndy Giles 	struct mptsas_cmd	c, *q, *slots;
45550c45111SAndy Giles 	mptsas_target_t		*ptgt;
45650c45111SAndy Giles 	int			header_output = 0;
45750c45111SAndy Giles 	int			rv = DCMD_OK;
45850c45111SAndy Giles 	int			slots_in_use = 0;
45950c45111SAndy Giles 	int			tcmds = 0;
46050c45111SAndy Giles 	int			mismatch = 0;
46150c45111SAndy Giles 	int			wq, dq;
46250c45111SAndy Giles 	int			ncmds = 0;
46350c45111SAndy Giles 	ulong_t			saved_indent;
46450c45111SAndy Giles 	uintptr_t		panicstr;
46550c45111SAndy Giles 	int			state;
46650c45111SAndy Giles 
46750c45111SAndy Giles 	if ((state = mdb_get_state()) == MDB_STATE_RUNNING) {
46850c45111SAndy Giles 		mdb_warn("mptsas: slot info can only be displayed on a system "
46950c45111SAndy Giles 		    "dump or under kmdb\n");
47050c45111SAndy Giles 		return (DCMD_ERR);
47150c45111SAndy Giles 	}
4725b504601Sjiang wu - Sun Microsystems - Beijing China 
47350c45111SAndy Giles 	if (mdb_readvar(&panicstr, "panicstr") == -1) {
47450c45111SAndy Giles 		mdb_warn("can't read variable 'panicstr'");
47550c45111SAndy Giles 		return (DCMD_ERR);
47650c45111SAndy Giles 	}
47750c45111SAndy Giles 
478892ad162SToomas Soome 	if (state != MDB_STATE_STOPPED && panicstr == 0) {
47950c45111SAndy Giles 		mdb_warn("mptsas: slot info not available for live dump\n");
48050c45111SAndy Giles 		return (DCMD_ERR);
48150c45111SAndy Giles 	}
4825b504601Sjiang wu - Sun Microsystems - Beijing China 
48350c45111SAndy Giles 	nslots = s->m_n_normal;
4845b504601Sjiang wu - Sun Microsystems - Beijing China 	slots = mdb_alloc(sizeof (mptsas_cmd_t) * nslots, UM_SLEEP);
4855b504601Sjiang wu - Sun Microsystems - Beijing China 
4865b504601Sjiang wu - Sun Microsystems - Beijing China 	for (i = 0; i < nslots; i++)
4875b504601Sjiang wu - Sun Microsystems - Beijing China 		if (s->m_slot[i]) {
4885b504601Sjiang wu - Sun Microsystems - Beijing China 			slots_in_use++;
4895b504601Sjiang wu - Sun Microsystems - Beijing China 			if (mdb_vread(&slots[i], sizeof (mptsas_cmd_t),
4905b504601Sjiang wu - Sun Microsystems - Beijing China 			    (uintptr_t)s->m_slot[i]) == -1) {
4915b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_warn("couldn't read slot");
4925b504601Sjiang wu - Sun Microsystems - Beijing China 				s->m_slot[i] = NULL;
4935b504601Sjiang wu - Sun Microsystems - Beijing China 			}
4945b504601Sjiang wu - Sun Microsystems - Beijing China 			if ((slots[i].cmd_flags & CFLAG_CMDIOC) == 0)
4955b504601Sjiang wu - Sun Microsystems - Beijing China 				tcmds++;
4965b504601Sjiang wu - Sun Microsystems - Beijing China 			if (i != slots[i].cmd_slot)
4975b504601Sjiang wu - Sun Microsystems - Beijing China 				mismatch++;
4985b504601Sjiang wu - Sun Microsystems - Beijing China 		}
4995b504601Sjiang wu - Sun Microsystems - Beijing China 
50050c45111SAndy Giles 	for (q = mp->m_waitq, wq = 0; q; q = c.cmd_linkp, wq++)
5015b504601Sjiang wu - Sun Microsystems - Beijing China 		if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) {
5025b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_warn("couldn't follow m_waitq");
5035b504601Sjiang wu - Sun Microsystems - Beijing China 			rv = DCMD_ERR;
5045b504601Sjiang wu - Sun Microsystems - Beijing China 			goto exit;
5055b504601Sjiang wu - Sun Microsystems - Beijing China 		}
5065b504601Sjiang wu - Sun Microsystems - Beijing China 
50750c45111SAndy Giles 	for (q = mp->m_doneq, dq = 0; q; q = c.cmd_linkp, dq++)
5085b504601Sjiang wu - Sun Microsystems - Beijing China 		if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) {
5095b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_warn("couldn't follow m_doneq");
5105b504601Sjiang wu - Sun Microsystems - Beijing China 			rv = DCMD_ERR;
5115b504601Sjiang wu - Sun Microsystems - Beijing China 			goto exit;
5125b504601Sjiang wu - Sun Microsystems - Beijing China 		}
5135b504601Sjiang wu - Sun Microsystems - Beijing China 
51450c45111SAndy Giles 	for (ptgt = krefhash_first((uintptr_t)mp->m_targets, NULL);
51550c45111SAndy Giles 	    ptgt != NULL;
51650c45111SAndy Giles 	    ptgt = krefhash_next((uintptr_t)mp->m_targets, ptgt, NULL)) {
51750c45111SAndy Giles 		if (ptgt->m_addr.mta_wwn ||
51850c45111SAndy Giles 		    ptgt->m_deviceinfo) {
51950c45111SAndy Giles 			ncmds += ptgt->m_t_ncmds;
52050c45111SAndy Giles 		}
52150c45111SAndy Giles 	}
5225b504601Sjiang wu - Sun Microsystems - Beijing China 
5235b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
5245b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("   mpt.  slot               mptsas_slots     slot");
5255b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
5265b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("m_ncmds total"
5275b504601Sjiang wu - Sun Microsystems - Beijing China 	    " targ throttle m_t_ncmds targ_tot wq dq");
5285b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
5295b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("----------------------------------------------------");
5305b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
5315b504601Sjiang wu - Sun Microsystems - Beijing China 
53250c45111SAndy Giles 	mdb_printf("%7d ", mp->m_ncmds);
53350c45111SAndy Giles 	mdb_printf("%s", (mp->m_ncmds == slots_in_use ? "  " : "!="));
5345b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("%3d               total %3d ", slots_in_use, ncmds);
5355b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("%s", (tcmds == ncmds ? "     " : "   !="));
5365b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("%3d %2d %2d\n", tcmds, wq, dq);
5375b504601Sjiang wu - Sun Microsystems - Beijing China 
5385b504601Sjiang wu - Sun Microsystems - Beijing China 	saved_indent = mdb_dec_indent(0);
5395b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_dec_indent(saved_indent);
5405b504601Sjiang wu - Sun Microsystems - Beijing China 
541da5ab83fSKeith M Wesolowski 	for (i = 0; i < s->m_n_normal; i++)
5425b504601Sjiang wu - Sun Microsystems - Beijing China 		if (s->m_slot[i]) {
5435b504601Sjiang wu - Sun Microsystems - Beijing China 			if (!header_output) {
5445b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_printf("\n");
5455b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_printf("mptsas_cmd          slot cmd_slot "
5465b504601Sjiang wu - Sun Microsystems - Beijing China 				    "cmd_flags cmd_pkt_flags scsi_pkt      "
5475b504601Sjiang wu - Sun Microsystems - Beijing China 				    "  targ,lun [ pkt_cdbp ...\n");
5485b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_printf("-------------------------------"
5495b504601Sjiang wu - Sun Microsystems - Beijing China 				    "--------------------------------------"
5505b504601Sjiang wu - Sun Microsystems - Beijing China 				    "--------------------------------------"
5515b504601Sjiang wu - Sun Microsystems - Beijing China 				    "------\n");
5525b504601Sjiang wu - Sun Microsystems - Beijing China 				header_output = 1;
5535b504601Sjiang wu - Sun Microsystems - Beijing China 			}
5545b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("%16p %4d %s %4d  %8x      %8x %16p ",
5555b504601Sjiang wu - Sun Microsystems - Beijing China 			    s->m_slot[i], i,
5565b504601Sjiang wu - Sun Microsystems - Beijing China 			    (i == slots[i].cmd_slot?"   ":"BAD"),
5575b504601Sjiang wu - Sun Microsystems - Beijing China 			    slots[i].cmd_slot,
5585b504601Sjiang wu - Sun Microsystems - Beijing China 			    slots[i].cmd_flags,
5595b504601Sjiang wu - Sun Microsystems - Beijing China 			    slots[i].cmd_pkt_flags,
5605b504601Sjiang wu - Sun Microsystems - Beijing China 			    slots[i].cmd_pkt);
5615b504601Sjiang wu - Sun Microsystems - Beijing China 			(void) print_cdb(&slots[i]);
5625b504601Sjiang wu - Sun Microsystems - Beijing China 		}
5635b504601Sjiang wu - Sun Microsystems - Beijing China 
5645b504601Sjiang wu - Sun Microsystems - Beijing China 	/* print the wait queue */
5655b504601Sjiang wu - Sun Microsystems - Beijing China 
56650c45111SAndy Giles 	for (q = mp->m_waitq; q; q = c.cmd_linkp) {
56750c45111SAndy Giles 		if (q == mp->m_waitq)
5685b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("\n");
5695b504601Sjiang wu - Sun Microsystems - Beijing China 		if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q)
5705b504601Sjiang wu - Sun Microsystems - Beijing China 		    == -1) {
5715b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_warn("couldn't follow m_waitq");
5725b504601Sjiang wu - Sun Microsystems - Beijing China 			rv = DCMD_ERR;
5735b504601Sjiang wu - Sun Microsystems - Beijing China 			goto exit;
5745b504601Sjiang wu - Sun Microsystems - Beijing China 		}
5755b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("%16p wait n/a %4d  %8x      %8x %16p ",
5765b504601Sjiang wu - Sun Microsystems - Beijing China 		    q, c.cmd_slot, c.cmd_flags, c.cmd_pkt_flags,
5775b504601Sjiang wu - Sun Microsystems - Beijing China 		    c.cmd_pkt);
5785b504601Sjiang wu - Sun Microsystems - Beijing China 		print_cdb(&c);
5795b504601Sjiang wu - Sun Microsystems - Beijing China 	}
5805b504601Sjiang wu - Sun Microsystems - Beijing China 
5815b504601Sjiang wu - Sun Microsystems - Beijing China 	/* print the done queue */
5825b504601Sjiang wu - Sun Microsystems - Beijing China 
58350c45111SAndy Giles 	for (q = mp->m_doneq; q; q = c.cmd_linkp) {
58450c45111SAndy Giles 		if (q == mp->m_doneq)
5855b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("\n");
5865b504601Sjiang wu - Sun Microsystems - Beijing China 		if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q)
5875b504601Sjiang wu - Sun Microsystems - Beijing China 		    == -1) {
5885b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_warn("couldn't follow m_doneq");
5895b504601Sjiang wu - Sun Microsystems - Beijing China 			rv = DCMD_ERR;
5905b504601Sjiang wu - Sun Microsystems - Beijing China 			goto exit;
5915b504601Sjiang wu - Sun Microsystems - Beijing China 		}
5925b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("%16p done  n/a %4d  %8x      %8x %16p ",
5935b504601Sjiang wu - Sun Microsystems - Beijing China 		    q, c.cmd_slot, c.cmd_flags, c.cmd_pkt_flags,
5945b504601Sjiang wu - Sun Microsystems - Beijing China 		    c.cmd_pkt);
5955b504601Sjiang wu - Sun Microsystems - Beijing China 		print_cdb(&c);
5965b504601Sjiang wu - Sun Microsystems - Beijing China 	}
5975b504601Sjiang wu - Sun Microsystems - Beijing China 
5985b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_inc_indent(saved_indent);
5995b504601Sjiang wu - Sun Microsystems - Beijing China 
60050c45111SAndy Giles 	if (mp->m_ncmds != slots_in_use)
6015b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("WARNING: mpt.m_ncmds does not match the number of "
6025b504601Sjiang wu - Sun Microsystems - Beijing China 		    "slots in use\n");
6035b504601Sjiang wu - Sun Microsystems - Beijing China 
6045b504601Sjiang wu - Sun Microsystems - Beijing China 	if (tcmds != ncmds)
6055b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("WARNING: the total of m_target[].m_t_ncmds does "
6065b504601Sjiang wu - Sun Microsystems - Beijing China 		    "not match the slots in use\n");
6075b504601Sjiang wu - Sun Microsystems - Beijing China 
6085b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mismatch)
6095b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("WARNING: corruption in slot table, "
6105b504601Sjiang wu - Sun Microsystems - Beijing China 		    "m_slot[].cmd_slot incorrect\n");
6115b504601Sjiang wu - Sun Microsystems - Beijing China 
6125b504601Sjiang wu - Sun Microsystems - Beijing China 	/* now check for corruptions */
6135b504601Sjiang wu - Sun Microsystems - Beijing China 
61450c45111SAndy Giles 	for (q = mp->m_waitq; q; q = c.cmd_linkp) {
6155b504601Sjiang wu - Sun Microsystems - Beijing China 		for (i = 0; i < nslots; i++)
6165b504601Sjiang wu - Sun Microsystems - Beijing China 			if (s->m_slot[i] == q)
6175b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_printf("WARNING: m_waitq entry"
6185b504601Sjiang wu - Sun Microsystems - Beijing China 				    "(mptsas_cmd_t) %p is in m_slot[%i]\n",
6195b504601Sjiang wu - Sun Microsystems - Beijing China 				    q, i);
6205b504601Sjiang wu - Sun Microsystems - Beijing China 
6215b504601Sjiang wu - Sun Microsystems - Beijing China 		if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) {
6225b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_warn("couldn't follow m_waitq");
6235b504601Sjiang wu - Sun Microsystems - Beijing China 			rv = DCMD_ERR;
6245b504601Sjiang wu - Sun Microsystems - Beijing China 			goto exit;
6255b504601Sjiang wu - Sun Microsystems - Beijing China 		}
6265b504601Sjiang wu - Sun Microsystems - Beijing China 	}
6275b504601Sjiang wu - Sun Microsystems - Beijing China 
62850c45111SAndy Giles 	for (q = mp->m_doneq; q; q = c.cmd_linkp) {
6295b504601Sjiang wu - Sun Microsystems - Beijing China 		for (i = 0; i < nslots; i++)
6305b504601Sjiang wu - Sun Microsystems - Beijing China 			if (s->m_slot[i] == q)
6315b504601Sjiang wu - Sun Microsystems - Beijing China 				mdb_printf("WARNING: m_doneq entry "
6325b504601Sjiang wu - Sun Microsystems - Beijing China 				"(mptsas_cmd_t) %p is in m_slot[%i]\n", q, i);
6335b504601Sjiang wu - Sun Microsystems - Beijing China 
6345b504601Sjiang wu - Sun Microsystems - Beijing China 		if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) {
6355b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_warn("couldn't follow m_doneq");
6365b504601Sjiang wu - Sun Microsystems - Beijing China 			rv = DCMD_ERR;
6375b504601Sjiang wu - Sun Microsystems - Beijing China 			goto exit;
6385b504601Sjiang wu - Sun Microsystems - Beijing China 		}
6395b504601Sjiang wu - Sun Microsystems - Beijing China 		if ((c.cmd_flags & CFLAG_FINISHED) == 0)
6405b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("WARNING: m_doneq entry (mptsas_cmd_t) %p "
6415b504601Sjiang wu - Sun Microsystems - Beijing China 			    "should have CFLAG_FINISHED set\n", q);
6425b504601Sjiang wu - Sun Microsystems - Beijing China 		if (c.cmd_flags & CFLAG_IN_TRANSPORT)
6435b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("WARNING: m_doneq entry (mptsas_cmd_t) %p "
6445b504601Sjiang wu - Sun Microsystems - Beijing China 			    "should not have CFLAG_IN_TRANSPORT set\n", q);
6455b504601Sjiang wu - Sun Microsystems - Beijing China 		if (c.cmd_flags & CFLAG_CMDARQ)
6465b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("WARNING: m_doneq entry (mptsas_cmd_t) %p "
6475b504601Sjiang wu - Sun Microsystems - Beijing China 			    "should not have CFLAG_CMDARQ set\n", q);
6485b504601Sjiang wu - Sun Microsystems - Beijing China 		if (c.cmd_flags & CFLAG_COMPLETED)
6495b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("WARNING: m_doneq entry (mptsas_cmd_t) %p "
6505b504601Sjiang wu - Sun Microsystems - Beijing China 			    "should not have CFLAG_COMPLETED set\n", q);
6515b504601Sjiang wu - Sun Microsystems - Beijing China 	}
6525b504601Sjiang wu - Sun Microsystems - Beijing China 
6535b504601Sjiang wu - Sun Microsystems - Beijing China exit:
6545b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_free(slots, sizeof (mptsas_cmd_t) * nslots);
6555b504601Sjiang wu - Sun Microsystems - Beijing China 	return (rv);
6565b504601Sjiang wu - Sun Microsystems - Beijing China }
6575b504601Sjiang wu - Sun Microsystems - Beijing China 
6585b504601Sjiang wu - Sun Microsystems - Beijing China void
display_deviceinfo(struct mptsas * mp)659da5ab83fSKeith M Wesolowski display_deviceinfo(struct mptsas *mp)
6605b504601Sjiang wu - Sun Microsystems - Beijing China {
6615b504601Sjiang wu - Sun Microsystems - Beijing China 	char	device_path[PATH_MAX];
6625b504601Sjiang wu - Sun Microsystems - Beijing China 
6635b504601Sjiang wu - Sun Microsystems - Beijing China 	*device_path = 0;
664da5ab83fSKeith M Wesolowski 	if (construct_path((uintptr_t)mp->m_dip, device_path) != DCMD_OK) {
6655b504601Sjiang wu - Sun Microsystems - Beijing China 		strcpy(device_path, "couldn't determine device path");
6665b504601Sjiang wu - Sun Microsystems - Beijing China 	}
6675b504601Sjiang wu - Sun Microsystems - Beijing China 
6685b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
6695b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("base_wwid          phys "
67050c45111SAndy Giles 	    " prodid  devid          revid   ssid\n");
6715b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("-----------------------------"
6725b504601Sjiang wu - Sun Microsystems - Beijing China 	    "----------------------------------\n");
67350c45111SAndy Giles 	mdb_printf("%"PRIx64"     %2d  "
67450c45111SAndy Giles 	    "0x%04x 0x%04x ", mp->un.m_base_wwid, mp->m_num_phys,
67550c45111SAndy Giles 	    mp->m_productid, mp->m_devid);
67650c45111SAndy Giles 	switch (mp->m_devid) {
67750c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2004:
67850c45111SAndy Giles 			mdb_printf("(SAS2004) ");
6795b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
68050c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2008:
68150c45111SAndy Giles 			mdb_printf("(SAS2008) ");
6825b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
68350c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2108_1:
68450c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2108_2:
68550c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2108_3:
68650c45111SAndy Giles 			mdb_printf("(SAS2108) ");
6875b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
68850c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2116_1:
68950c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2116_2:
69050c45111SAndy Giles 			mdb_printf("(SAS2116) ");
6915b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
69250c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SSS6200:
69350c45111SAndy Giles 			mdb_printf("(SSS6200) ");
6945b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
69550c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2208_1:
69650c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2208_2:
69750c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2208_3:
69850c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2208_4:
69950c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2208_5:
70050c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2208_6:
70150c45111SAndy Giles 			mdb_printf("(SAS2208) ");
7025b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
70350c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2308_1:
70450c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2308_2:
70550c45111SAndy Giles 		case MPI2_MFGPAGE_DEVID_SAS2308_3:
70650c45111SAndy Giles 			mdb_printf("(SAS2308) ");
7075b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
70850c45111SAndy Giles 		case MPI25_MFGPAGE_DEVID_SAS3004:
70950c45111SAndy Giles 			mdb_printf("(SAS3004) ");
71050c45111SAndy Giles 			break;
71150c45111SAndy Giles 		case MPI25_MFGPAGE_DEVID_SAS3008:
71250c45111SAndy Giles 			mdb_printf("(SAS3008) ");
71350c45111SAndy Giles 			break;
71450c45111SAndy Giles 		case MPI25_MFGPAGE_DEVID_SAS3108_1:
71550c45111SAndy Giles 		case MPI25_MFGPAGE_DEVID_SAS3108_2:
71650c45111SAndy Giles 		case MPI25_MFGPAGE_DEVID_SAS3108_5:
71750c45111SAndy Giles 		case MPI25_MFGPAGE_DEVID_SAS3108_6:
71850c45111SAndy Giles 			mdb_printf("(SAS3108) ");
7195b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
720e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3216:
721e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3316_1:
722e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3316_2:
723e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3316_3:
724e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3316_4:
725e89016e7SRobert Mustacchi 			mdb_printf("(SAS3216) ");
726e89016e7SRobert Mustacchi 			break;
727e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3224:
728e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3324_1:
729e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3324_2:
730e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3324_3:
731e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3324_4:
732e89016e7SRobert Mustacchi 			mdb_printf("(SAS3224) ");
733e89016e7SRobert Mustacchi 			break;
734e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3408:
735e89016e7SRobert Mustacchi 			mdb_printf("(SAS3408) ");
736e89016e7SRobert Mustacchi 			break;
737e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3416:
738e89016e7SRobert Mustacchi 			mdb_printf("(SAS3416) ");
739e89016e7SRobert Mustacchi 			break;
740e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3508:
741e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3508_1:
742e89016e7SRobert Mustacchi 			mdb_printf("(SAS3508) ");
743e89016e7SRobert Mustacchi 			break;
744e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3516:
745e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3516_1:
746e89016e7SRobert Mustacchi 			mdb_printf("(SAS3516) ");
747e89016e7SRobert Mustacchi 			break;
748e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3616:
749e89016e7SRobert Mustacchi 			mdb_printf("(SAS3616) ");
750e89016e7SRobert Mustacchi 			break;
751e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3708:
752e89016e7SRobert Mustacchi 			mdb_printf("(SAS3708) ");
753e89016e7SRobert Mustacchi 			break;
754e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS3716:
755e89016e7SRobert Mustacchi 			mdb_printf("(SAS3716) ");
756e89016e7SRobert Mustacchi 			break;
757e89016e7SRobert Mustacchi 		case MPI26_MFGPAGE_DEVID_SAS4008:
758e89016e7SRobert Mustacchi 			mdb_printf("(SAS4008) ");
759e89016e7SRobert Mustacchi 			break;
7605b504601Sjiang wu - Sun Microsystems - Beijing China 		default:
76150c45111SAndy Giles 			mdb_printf("(SAS????) ");
7625b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
7635b504601Sjiang wu - Sun Microsystems - Beijing China 	}
76450c45111SAndy Giles 	mdb_printf("0x%02x 0x%04x\n", mp->m_revid, mp->m_ssid);
7655b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("%s\n", device_path);
7665b504601Sjiang wu - Sun Microsystems - Beijing China 
76750c45111SAndy Giles }
7685b504601Sjiang wu - Sun Microsystems - Beijing China 
76950c45111SAndy Giles void
dump_debug_log(void)77050c45111SAndy Giles dump_debug_log(void)
77150c45111SAndy Giles {
77250c45111SAndy Giles 	uint32_t idx;
77350c45111SAndy Giles 	size_t	linecnt, linelen;
77450c45111SAndy Giles 	char	*logbuf;
77550c45111SAndy Giles 	int	i;
77650c45111SAndy Giles 
77750c45111SAndy Giles 	if (mdb_readsym(&idx, sizeof (uint32_t), "mptsas_dbglog_idx") == -1) {
77850c45111SAndy Giles 		mdb_warn("No debug log buffer present");
77950c45111SAndy Giles 		return;
78050c45111SAndy Giles 	}
78150c45111SAndy Giles 	if (mdb_readsym(&linecnt, sizeof (size_t), "mptsas_dbglog_linecnt")
78250c45111SAndy Giles 	    == -1) {
78350c45111SAndy Giles 		mdb_warn("No debug linecnt present");
78450c45111SAndy Giles 		return;
78550c45111SAndy Giles 	}
78650c45111SAndy Giles 	if (mdb_readsym(&linelen, sizeof (size_t), "mptsas_dbglog_linelen")
78750c45111SAndy Giles 	    == -1) {
78850c45111SAndy Giles 		mdb_warn("No debug linelen present");
78950c45111SAndy Giles 		return;
79050c45111SAndy Giles 	}
79150c45111SAndy Giles 	logbuf = mdb_alloc(linelen * linecnt, UM_SLEEP);
79250c45111SAndy Giles 
79350c45111SAndy Giles 	if (mdb_readsym(logbuf, linelen * linecnt, "mptsas_dbglog_bufs")
79450c45111SAndy Giles 	    == -1) {
79550c45111SAndy Giles 		mdb_warn("No debug log buffer present");
79650c45111SAndy Giles 		return;
7975b504601Sjiang wu - Sun Microsystems - Beijing China 	}
7985b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
79950c45111SAndy Giles 	idx &= linecnt - 1;
80050c45111SAndy Giles 	for (i = 0; i < linecnt; i++) {
80150c45111SAndy Giles 		mdb_printf("%s\n", &logbuf[idx * linelen]);
80250c45111SAndy Giles 		idx++;
80350c45111SAndy Giles 		idx &= linecnt - 1;
80450c45111SAndy Giles 	}
80550c45111SAndy Giles 	mdb_free(logbuf, linelen * linecnt);
8065b504601Sjiang wu - Sun Microsystems - Beijing China }
8075b504601Sjiang wu - Sun Microsystems - Beijing China 
8085b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_dcmd(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)8095b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
8105b504601Sjiang wu - Sun Microsystems - Beijing China {
8115b504601Sjiang wu - Sun Microsystems - Beijing China 	struct mptsas		m;
812da5ab83fSKeith M Wesolowski 	struct mptsas_slots	*s;
8135b504601Sjiang wu - Sun Microsystems - Beijing China 
8145b504601Sjiang wu - Sun Microsystems - Beijing China 	int			nslots;
8155b504601Sjiang wu - Sun Microsystems - Beijing China 	int			slot_size = 0;
8165b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t			verbose = FALSE;
8175b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t			target_info = FALSE;
8185b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t			slot_info = FALSE;
8195b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t			device_info = FALSE;
8205b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t			port_info = FALSE;
82150c45111SAndy Giles 	uint_t			debug_log = FALSE;
8225b504601Sjiang wu - Sun Microsystems - Beijing China 	int			rv = DCMD_OK;
8235b504601Sjiang wu - Sun Microsystems - Beijing China 
8245b504601Sjiang wu - Sun Microsystems - Beijing China 	if (!(flags & DCMD_ADDRSPEC)) {
82550c45111SAndy Giles 		void		*mptsas_state = NULL;
82650c45111SAndy Giles 
8275b504601Sjiang wu - Sun Microsystems - Beijing China 		if (mdb_readvar(&mptsas_state, "mptsas_state") == -1) {
8285b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_warn("can't read mptsas_state");
8295b504601Sjiang wu - Sun Microsystems - Beijing China 			return (DCMD_ERR);
8305b504601Sjiang wu - Sun Microsystems - Beijing China 		}
8315b504601Sjiang wu - Sun Microsystems - Beijing China 		if (mdb_pwalk_dcmd("genunix`softstate", "mpt_sas`mptsas", argc,
8325b504601Sjiang wu - Sun Microsystems - Beijing China 		    argv, (uintptr_t)mptsas_state) == -1) {
8335b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_warn("mdb_pwalk_dcmd failed");
8345b504601Sjiang wu - Sun Microsystems - Beijing China 			return (DCMD_ERR);
8355b504601Sjiang wu - Sun Microsystems - Beijing China 		}
8365b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DCMD_OK);
8375b504601Sjiang wu - Sun Microsystems - Beijing China 	}
8385b504601Sjiang wu - Sun Microsystems - Beijing China 
8395b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mdb_getopts(argc, argv,
8405b504601Sjiang wu - Sun Microsystems - Beijing China 	    's', MDB_OPT_SETBITS, TRUE, &slot_info,
8415b504601Sjiang wu - Sun Microsystems - Beijing China 	    'd', MDB_OPT_SETBITS, TRUE, &device_info,
8425b504601Sjiang wu - Sun Microsystems - Beijing China 	    't', MDB_OPT_SETBITS, TRUE, &target_info,
8435b504601Sjiang wu - Sun Microsystems - Beijing China 	    'p', MDB_OPT_SETBITS, TRUE, &port_info,
8445b504601Sjiang wu - Sun Microsystems - Beijing China 	    'v', MDB_OPT_SETBITS, TRUE, &verbose,
84550c45111SAndy Giles 	    'D', MDB_OPT_SETBITS, TRUE, &debug_log,
8465b504601Sjiang wu - Sun Microsystems - Beijing China 	    NULL) != argc)
8475b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DCMD_USAGE);
8485b504601Sjiang wu - Sun Microsystems - Beijing China 
8495b504601Sjiang wu - Sun Microsystems - Beijing China 
8505b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mdb_vread(&m, sizeof (m), addr) == -1) {
8515b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read mpt struct at 0x%p", addr);
8525b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DCMD_ERR);
8535b504601Sjiang wu - Sun Microsystems - Beijing China 	}
8545b504601Sjiang wu - Sun Microsystems - Beijing China 
8555b504601Sjiang wu - Sun Microsystems - Beijing China 	s = mdb_alloc(sizeof (mptsas_slots_t), UM_SLEEP);
8565b504601Sjiang wu - Sun Microsystems - Beijing China 
8575b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mdb_vread(s, sizeof (mptsas_slots_t),
8585b504601Sjiang wu - Sun Microsystems - Beijing China 	    (uintptr_t)m.m_active) == -1) {
8595b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read small mptsas_slots_t at 0x%p",
8605b504601Sjiang wu - Sun Microsystems - Beijing China 		    m.m_active);
8615b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_free(s, sizeof (mptsas_slots_t));
8625b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DCMD_ERR);
8635b504601Sjiang wu - Sun Microsystems - Beijing China 	}
8645b504601Sjiang wu - Sun Microsystems - Beijing China 
865da5ab83fSKeith M Wesolowski 	nslots = s->m_n_normal;
8665b504601Sjiang wu - Sun Microsystems - Beijing China 
8675b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_free(s, sizeof (mptsas_slots_t));
8685b504601Sjiang wu - Sun Microsystems - Beijing China 
8695b504601Sjiang wu - Sun Microsystems - Beijing China 	slot_size = sizeof (mptsas_slots_t) +
8705b504601Sjiang wu - Sun Microsystems - Beijing China 	    (sizeof (mptsas_cmd_t *) * (nslots-1));
8715b504601Sjiang wu - Sun Microsystems - Beijing China 
8725b504601Sjiang wu - Sun Microsystems - Beijing China 	s = mdb_alloc(slot_size, UM_SLEEP);
8735b504601Sjiang wu - Sun Microsystems - Beijing China 
8745b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mdb_vread(s, slot_size, (uintptr_t)m.m_active) == -1) {
8755b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_warn("couldn't read large mptsas_slots_t at 0x%p",
8765b504601Sjiang wu - Sun Microsystems - Beijing China 		    m.m_active);
8775b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_free(s, slot_size);
8785b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DCMD_ERR);
8795b504601Sjiang wu - Sun Microsystems - Beijing China 	}
8805b504601Sjiang wu - Sun Microsystems - Beijing China 
8815b504601Sjiang wu - Sun Microsystems - Beijing China 	/* processing completed */
8825b504601Sjiang wu - Sun Microsystems - Beijing China 
8835b504601Sjiang wu - Sun Microsystems - Beijing China 	if (((flags & DCMD_ADDRSPEC) && !(flags & DCMD_LOOP)) ||
8845b504601Sjiang wu - Sun Microsystems - Beijing China 	    (flags & DCMD_LOOPFIRST) || slot_info || device_info ||
8855b504601Sjiang wu - Sun Microsystems - Beijing China 	    target_info) {
8865b504601Sjiang wu - Sun Microsystems - Beijing China 		if ((flags & DCMD_LOOP) && !(flags & DCMD_LOOPFIRST))
8875b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("\n");
8885b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("        mptsas_t inst ncmds suspend  power");
8895b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("\n");
8905b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("========================================="
8915b504601Sjiang wu - Sun Microsystems - Beijing China 		    "=======================================");
8925b504601Sjiang wu - Sun Microsystems - Beijing China 		mdb_printf("\n");
8935b504601Sjiang wu - Sun Microsystems - Beijing China 	}
8945b504601Sjiang wu - Sun Microsystems - Beijing China 
8955b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("%16p %4d %5d ", addr, m.m_instance, m.m_ncmds);
8965b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("%7d", m.m_suspended);
8975b504601Sjiang wu - Sun Microsystems - Beijing China 	switch (m.m_power_level) {
8985b504601Sjiang wu - Sun Microsystems - Beijing China 		case PM_LEVEL_D0:
8995b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf(" ON=D0 ");
9005b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
9015b504601Sjiang wu - Sun Microsystems - Beijing China 		case PM_LEVEL_D1:
9025b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("    D1 ");
9035b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
9045b504601Sjiang wu - Sun Microsystems - Beijing China 		case PM_LEVEL_D2:
9055b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("    D2 ");
9065b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
9075b504601Sjiang wu - Sun Microsystems - Beijing China 		case PM_LEVEL_D3:
9085b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("OFF=D3 ");
9095b504601Sjiang wu - Sun Microsystems - Beijing China 			break;
9105b504601Sjiang wu - Sun Microsystems - Beijing China 		default:
9115b504601Sjiang wu - Sun Microsystems - Beijing China 			mdb_printf("INVALD ");
9125b504601Sjiang wu - Sun Microsystems - Beijing China 	}
9135b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("\n");
9145b504601Sjiang wu - Sun Microsystems - Beijing China 
9155b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_inc_indent(17);
9165b504601Sjiang wu - Sun Microsystems - Beijing China 
9175b504601Sjiang wu - Sun Microsystems - Beijing China 	if (target_info)
91850c45111SAndy Giles 		display_targets(&m, verbose);
9195b504601Sjiang wu - Sun Microsystems - Beijing China 
9205b504601Sjiang wu - Sun Microsystems - Beijing China 	if (port_info)
921da5ab83fSKeith M Wesolowski 		display_ports(&m);
9225b504601Sjiang wu - Sun Microsystems - Beijing China 
9235b504601Sjiang wu - Sun Microsystems - Beijing China 	if (device_info)
924da5ab83fSKeith M Wesolowski 		display_deviceinfo(&m);
9255b504601Sjiang wu - Sun Microsystems - Beijing China 
9265b504601Sjiang wu - Sun Microsystems - Beijing China 	if (slot_info)
92750c45111SAndy Giles 		display_slotinfo(&m, s);
92850c45111SAndy Giles 
92950c45111SAndy Giles 	if (debug_log)
93050c45111SAndy Giles 		dump_debug_log();
9315b504601Sjiang wu - Sun Microsystems - Beijing China 
9325b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_dec_indent(17);
9335b504601Sjiang wu - Sun Microsystems - Beijing China 
9345b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_free(s, slot_size);
9355b504601Sjiang wu - Sun Microsystems - Beijing China 
9365b504601Sjiang wu - Sun Microsystems - Beijing China 	return (rv);
9375b504601Sjiang wu - Sun Microsystems - Beijing China }
938da5ab83fSKeith M Wesolowski 
9395b504601Sjiang wu - Sun Microsystems - Beijing China void
mptsas_help()9405b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_help()
9415b504601Sjiang wu - Sun Microsystems - Beijing China {
9425b504601Sjiang wu - Sun Microsystems - Beijing China 	mdb_printf("Prints summary information about each mpt_sas instance, "
9435b504601Sjiang wu - Sun Microsystems - Beijing China 	    "including warning\nmessages when slot usage doesn't match "
9445b504601Sjiang wu - Sun Microsystems - Beijing China 	    "summary information.\n"
9455b504601Sjiang wu - Sun Microsystems - Beijing China 	    "Without the address of a \"struct mptsas\", prints every "
9465b504601Sjiang wu - Sun Microsystems - Beijing China 	    "instance.\n\n"
9475b504601Sjiang wu - Sun Microsystems - Beijing China 	    "Switches:\n"
94850c45111SAndy Giles 	    "  -t[v]  includes information about targets, v = be more verbose\n"
94950c45111SAndy Giles 	    "  -p     includes information about port\n"
95050c45111SAndy Giles 	    "  -s     includes information about mpt slots\n"
95150c45111SAndy Giles 	    "  -d     includes information about the hardware\n"
95250c45111SAndy Giles 	    "  -D     print the mptsas specific debug log\n");
9535b504601Sjiang wu - Sun Microsystems - Beijing China }
9545b504601Sjiang wu - Sun Microsystems - Beijing China 
9555b504601Sjiang wu - Sun Microsystems - Beijing China static const mdb_dcmd_t dcmds[] = {
95650c45111SAndy Giles 	{ "mptsas", "?[-tpsdD]", "print mpt_sas information", mptsas_dcmd,
9575b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_help}, { NULL }
9585b504601Sjiang wu - Sun Microsystems - Beijing China };
9595b504601Sjiang wu - Sun Microsystems - Beijing China 
9605b504601Sjiang wu - Sun Microsystems - Beijing China static const mdb_modinfo_t modinfo = {
9615b504601Sjiang wu - Sun Microsystems - Beijing China 	MDB_API_VERSION, dcmds, NULL
9625b504601Sjiang wu - Sun Microsystems - Beijing China };
9635b504601Sjiang wu - Sun Microsystems - Beijing China 
9645b504601Sjiang wu - Sun Microsystems - Beijing China const mdb_modinfo_t *
_mdb_init(void)9655b504601Sjiang wu - Sun Microsystems - Beijing China _mdb_init(void)
9665b504601Sjiang wu - Sun Microsystems - Beijing China {
9675b504601Sjiang wu - Sun Microsystems - Beijing China 	return (&modinfo);
9685b504601Sjiang wu - Sun Microsystems - Beijing China }
969