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