4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * CDDL HEADER START
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The contents of this file are subject to the terms of the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Common Development and Distribution License (the "License").
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * You may not use this file except in compliance with the License.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * or http://www.opensolaris.org/os/licensing.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * See the License for the specific language governing permissions
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * and limitations under the License.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * When distributing Covered Code, include this CDDL HEADER in each
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * If applicable, add the following below this CDDL HEADER, with the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * fields enclosed by brackets "[]" replaced with your own identifying
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * information: Portions Copyright [yyyy] [name of copyright owner]
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * CDDL HEADER END
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <limits.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/mdb_modapi.h>
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed#include <mdb/mdb_ctf.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/sysinfo.h>
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh#include <sys/byteorder.h>
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed#include <sys/nvpair.h>
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed#include <sys/damap.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/scsi/scsi.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/scsi/adapters/pmcs/pmcs.h>
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#ifndef _KMDB
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#include <sys/types.h>
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#include <sys/stat.h>
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#include <fcntl.h>
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#include <unistd.h>
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#endif /* _KMDB */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed/*
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed * We need use this to pass the settings when display_iport
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reedtypedef struct per_iport_setting {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uint_t pis_damap_info; /* -m: DAM/damap */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uint_t pis_dtc_info; /* -d: device tree children: dev_info/path_info */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed} per_iport_setting_t;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister/*
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister * This structure is used for sorting work structures by the wserno
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollistertypedef struct wserno_list {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister int serno;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister int idx;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister struct wserno_list *next;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister struct wserno_list *prev;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister} wserno_list_t;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed#define MDB_RD(a, b, c) mdb_vread(a, b, (uintptr_t)c)
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed#define NOREAD(a, b) mdb_warn("could not read " #a " at 0x%p", b)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic pmcs_hw_t ss;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic pmcs_xscsi_t **targets = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int target_idx;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic uint32_t sas_phys, sata_phys, exp_phys, num_expanders, empty_phys;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic pmcs_phy_t *pmcs_next_sibling(pmcs_phy_t *phyp);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic void display_one_work(pmcwork_t *wp, int verbose, int idx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhprint_sas_address(pmcs_phy_t *phy)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int idx;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (idx = 0; idx < 8; idx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%02x", phy->sas_address[idx]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollisterstatic void
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollisterpmcs_fwtime_to_systime(struct pmcs_hw ss, uint32_t fw_hi, uint32_t fw_lo,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister struct timespec *stime)
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister{
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister uint64_t fwtime;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister time_t secs;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister long nsecs;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister boolean_t backward_time = B_FALSE;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fwtime = ((uint64_t)fw_hi << 32) | fw_lo;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister /*
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister * If fwtime < ss.fw_timestamp, then we need to adjust the clock
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister * time backwards from ss.sys_timestamp. Otherwise, the adjustment
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister * goes forward in time
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister */
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (fwtime >= ss.fw_timestamp) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fwtime -= ss.fw_timestamp;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister } else {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fwtime = ss.fw_timestamp - fwtime;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister backward_time = B_TRUE;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister secs = ((time_t)fwtime / NSECS_PER_SEC);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister nsecs = ((long)fwtime % NSECS_PER_SEC);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister stime->tv_sec = ss.sys_timestamp.tv_sec;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister stime->tv_nsec = ss.sys_timestamp.tv_nsec;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (backward_time) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (stime->tv_nsec < nsecs) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister stime->tv_sec--;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister stime->tv_nsec = stime->tv_nsec + NSECS_PER_SEC - nsecs;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister } else {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister stime->tv_nsec -= nsecs;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister stime->tv_sec -= secs;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister } else {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (stime->tv_nsec + nsecs > NSECS_PER_SEC) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister stime->tv_sec++;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister stime->tv_nsec = (stime->tv_nsec + nsecs) % NSECS_PER_SEC;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister stime->tv_sec += secs;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister}
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_ic(struct pmcs_hw m, int verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int msec_per_tick;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readvar(&msec_per_tick, "msec_per_tick") == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("can't read msec_per_tick");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh msec_per_tick = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Interrupt coalescing timer info\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("-------------------------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (msec_per_tick == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Quantum : ?? ms\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Quantum : %d ms\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh m.io_intr_coal.quantum * msec_per_tick);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Timer enabled : ");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (m.io_intr_coal.timer_on) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Yes\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Coalescing timer value : %d us\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh m.io_intr_coal.intr_coal_timer);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("No\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Total nsecs between interrupts: %ld\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh m.io_intr_coal.nsecs_between_intrs);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Time of last I/O interrupt : %ld\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh m.io_intr_coal.last_io_comp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Number of I/O interrupts : %d\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh m.io_intr_coal.num_intrs);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Number of I/O completions : %d\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh m.io_intr_coal.num_io_completions);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Max I/O completion interrupts : %d\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh m.io_intr_coal.max_io_completions);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Measured ECHO int latency : %d ns\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh m.io_intr_coal.intr_latency);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Interrupt threshold : %d\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh m.io_intr_coal.intr_threshold);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_iport_phy_walk_cb(uintptr_t addr, const void *wdata, void *priv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct pmcs_phy phy;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(&phy, sizeof (struct pmcs_phy), addr) !=
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sizeof (struct pmcs_phy)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%16p %2d\n", addr, phy.phynum);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reedstatic int
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reeddisplay_iport_damap(dev_info_t *pdip)
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed{
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed int rval = DCMD_ERR;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed struct dev_info dip;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed scsi_hba_tran_t sht;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_ctf_id_t istm_ctfid; /* impl_scsi_tgtmap_t ctf_id */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed ulong_t tmd_offset = 0; /* tgtmap_dam offset to impl_scsi_tgtmap_t */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uintptr_t dam0;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uintptr_t dam1;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_vread(&dip, sizeof (struct dev_info), (uintptr_t)pdip) !=
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed sizeof (struct dev_info)) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (dip.devi_driver_data == NULL) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_vread(&sht, sizeof (scsi_hba_tran_t),
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (uintptr_t)dip.devi_driver_data) != sizeof (scsi_hba_tran_t)) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (sht.tran_tgtmap == NULL) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_ctf_lookup_by_name("impl_scsi_tgtmap_t", &istm_ctfid) != 0) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_ctf_offsetof(istm_ctfid, "tgtmap_dam", &tmd_offset) != 0) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed tmd_offset /= NBBY;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_vread(&dam0, sizeof (dam0),
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (uintptr_t)(tmd_offset + (char *)sht.tran_tgtmap));
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_vread(&dam1, sizeof (dam1),
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (uintptr_t)(sizeof (dam0) + tmd_offset + (char *)sht.tran_tgtmap));
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (dam0 != NULL) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed rval = mdb_call_dcmd("damap", dam0, DCMD_ADDRSPEC, 0, NULL);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (rval != DCMD_OK) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (dam1 != NULL) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed rval = mdb_call_dcmd("damap", dam1, DCMD_ADDRSPEC, 0, NULL);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed}
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed/* ARGSUSED */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reedstatic int
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reeddisplay_iport_di_cb(uintptr_t addr, const void *wdata, void *priv)
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed{
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uint_t *idx = (uint_t *)priv;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed struct dev_info dip;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed char devi_name[MAXNAMELEN];
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed char devi_addr[MAXNAMELEN];
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_vread(&dip, sizeof (struct dev_info), (uintptr_t)addr) !=
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed sizeof (struct dev_info)) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (DCMD_ERR);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_readstr(devi_name, sizeof (devi_name),
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (uintptr_t)dip.devi_node_name) == -1) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed devi_name[0] = '?';
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed devi_name[1] = '\0';
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_readstr(devi_addr, sizeof (devi_addr),
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (uintptr_t)dip.devi_addr) == -1) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed devi_addr[0] = '?';
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed devi_addr[1] = '\0';
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf(" %3d: @%-21s%10s@\t%p::devinfo -s\n",
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (*idx)++, devi_addr, devi_name, addr);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (DCMD_OK);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed}
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed/* ARGSUSED */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reedstatic int
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reeddisplay_iport_pi_cb(uintptr_t addr, const void *wdata, void *priv)
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed{
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uint_t *idx = (uint_t *)priv;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed struct mdi_pathinfo mpi;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed char pi_addr[MAXNAMELEN];
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_vread(&mpi, sizeof (struct mdi_pathinfo), (uintptr_t)addr) !=
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed sizeof (struct mdi_pathinfo)) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (DCMD_ERR);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_readstr(pi_addr, sizeof (pi_addr),
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (uintptr_t)mpi.pi_addr) == -1) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed pi_addr[0] = '?';
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed pi_addr[1] = '\0';
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf(" %3d: @%-21s %p::print struct mdi_pathinfo\n",
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (*idx)++, pi_addr, addr);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (DCMD_OK);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed}
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reedstatic int
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reeddisplay_iport_dtc(dev_info_t *pdip)
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed{
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed int rval = DCMD_ERR;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed struct dev_info dip;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed struct mdi_phci phci;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uint_t didx = 1;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uint_t pidx = 1;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_vread(&dip, sizeof (struct dev_info), (uintptr_t)pdip) !=
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed sizeof (struct dev_info)) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("Device tree children - dev_info:\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (dip.devi_child == NULL) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("\tdevi_child is NULL, no dev_info\n\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed goto skip_di;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed /*
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed * First, we dump the iport's children dev_info node information.
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed * use existing walker: devinfo_siblings
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("\t#: @unit-address name@\tdrill-down\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed rval = mdb_pwalk("devinfo_siblings", display_iport_di_cb,
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (void *)&didx, (uintptr_t)dip.devi_child);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reedskip_di:
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed /*
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed * Then we try to dump the iport's path_info node information.
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed * use existing walker: mdipi_phci_list
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("Device tree children - path_info:\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_vread(&phci, sizeof (struct mdi_phci),
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (uintptr_t)dip.devi_mdi_xhci) != sizeof (struct mdi_phci)) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("\tdevi_mdi_xhci is NULL, no path_info\n\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (phci.ph_path_head == NULL) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("\tph_path_head is NULL, no path_info\n\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("\t#: @unit-address drill-down\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed rval = mdb_pwalk("mdipi_phci_list", display_iport_pi_cb,
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (void *)&pidx, (uintptr_t)phci.ph_path_head);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed mdb_printf("\n");
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed return (rval);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed}
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reedstatic void
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reeddisplay_iport_more(dev_info_t *dip, per_iport_setting_t *pis)
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed{
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (pis->pis_damap_info) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (void) display_iport_damap(dip);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (pis->pis_dtc_info) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed (void) display_iport_dtc(dip);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed}
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_iport_walk_cb(uintptr_t addr, const void *wdata, void *priv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct pmcs_iport iport;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uintptr_t list_addr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *ua_state;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char portid[4];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char unit_address[34];
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed per_iport_setting_t *pis = (per_iport_setting_t *)priv;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(&iport, sizeof (struct pmcs_iport), addr) !=
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sizeof (struct pmcs_iport)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readstr(unit_address, sizeof (unit_address),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (uintptr_t)(iport.ua)) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh strncpy(unit_address, "Unset", sizeof (unit_address));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (iport.portid == 0xffff) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_snprintf(portid, sizeof (portid), "%s", "-");
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana } else if (iport.portid == PMCS_IPORT_INVALID_PORT_ID) {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana mdb_snprintf(portid, sizeof (portid), "%s", "N/A");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_snprintf(portid, sizeof (portid), "%d", iport.portid);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (iport.ua_state) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case UA_INACTIVE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ua_state = "Inactive";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case UA_PEND_ACTIVATE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ua_state = "PendActivate";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case UA_ACTIVE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ua_state = "Active";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case UA_PEND_DEACTIVATE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ua_state = "PendDeactivate";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ua_state = "Unknown";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strlen(unit_address) < 3) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Standard iport unit address */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("UA %-16s %16s %8s %8s %16s", "Iport", "UA State",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "PortID", "NumPhys", "DIP\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%2s %16p %16s %8s %8d %16p\n", unit_address, addr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ua_state, portid, iport.nphy, iport.dip);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Temporary iport unit address */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%-32s %16s %20s %8s %8s %16s", "UA", "Iport",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "UA State", "PortID", "NumPhys", "DIP\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%32s %16p %20s %8s %8d %16p\n", unit_address, addr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ua_state, portid, iport.nphy, iport.dip);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (iport.nphy > 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(4);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%-18s %8s", "Phy", "PhyNum\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh list_addr =
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (uintptr_t)(addr + offsetof(struct pmcs_iport, phys));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_pwalk("list", pmcs_iport_phy_walk_cb, NULL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh list_addr) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("pmcs iport walk failed");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(6);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed /*
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed * See if we need to show more information based on 'd' or 'm' options
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed display_iport_more(iport.dip, pis);
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reeddisplay_iport(struct pmcs_hw m, uintptr_t addr, int verbose,
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed per_iport_setting_t *pis)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uintptr_t list_addr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (m.iports_attached) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Iport information:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("-----------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("No Iports found.\n\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh list_addr = (uintptr_t)(addr + offsetof(struct pmcs_hw, iports));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (mdb_pwalk("list", pmcs_iport_walk_cb, pis, list_addr) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("pmcs iport walk failed");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh/* ARGSUSED */
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhstatic int
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhpmcs_utarget_walk_cb(uintptr_t addr, const void *wdata, void *priv)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh{
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_phy_t phy;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (mdb_vread(&phy, sizeof (pmcs_phy_t), (uintptr_t)addr) == -1) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_warn("pmcs_utarget_walk_cb: Failed to read PHY at %p",
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (void *)addr);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (DCMD_ERR);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (phy.configured && (phy.target == NULL)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_printf("SAS address: ");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh print_sas_address(&phy);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_printf(" DType: ");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh switch (phy.dtype) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh case SAS:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_printf("%4s", "SAS");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh break;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh case SATA:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_printf("%4s", "SATA");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh break;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh case EXPANDER:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_printf("%4s", "SMP");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh break;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh default:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_printf("%4s", "N/A");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh break;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_printf(" Path: %s\n", phy.path);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (0);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh}
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhstatic void
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhdisplay_unconfigured_targets(uintptr_t addr)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh{
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_printf("Unconfigured target SAS address:\n\n");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (mdb_pwalk("pmcs_phys", pmcs_utarget_walk_cb, NULL, addr) == -1) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_warn("pmcs phys walk failed");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh}
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic void
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhdisplay_completion_queue(struct pmcs_hw ss)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh{
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh pmcs_iocomp_cb_t ccb, *ccbp;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh pmcwork_t work;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (ss.iocomp_cb_head == NULL) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("Completion queue is empty.\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh ccbp = ss.iocomp_cb_head;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%8s %10s %20s %8s %8s O D\n",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "HTag", "State", "Phy Path", "Target", "Timer");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh while (ccbp) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_vread(&ccb, sizeof (pmcs_iocomp_cb_t),
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh (uintptr_t)ccbp) != sizeof (pmcs_iocomp_cb_t)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("Unable to read completion queue entry\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_vread(&work, sizeof (pmcwork_t), (uintptr_t)ccb.pwrk)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh != sizeof (pmcwork_t)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("Unable to read work structure\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh /*
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * Only print the work structure if it's still active. If
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * it's not, it's been completed since we started looking at
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * it.
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh */
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (work.state != PMCS_WORK_STATE_NIL) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh display_one_work(&work, 0, 0);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh ccbp = ccb.next;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh}
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollisterstatic void
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollisterdisplay_event_log(struct pmcs_hw ss)
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister{
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister pmcs_fw_event_hdr_t fwhdr;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister char *header_id, *entry, *fwlogp;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister uint32_t total_size = PMCS_FWLOG_SIZE, log_size, index, *swapp, sidx;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister pmcs_fw_event_entry_t *fw_entryp;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister struct timespec systime;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (ss.fwlogp == NULL) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("There is no firmware event log.\n");
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister return;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fwlogp = (char *)ss.fwlogp;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister while (total_size != 0) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (mdb_vread(&fwhdr, sizeof (pmcs_fw_event_hdr_t),
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister (uintptr_t)fwlogp) != sizeof (pmcs_fw_event_hdr_t)) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_warn("Unable to read firmware event log header\n");
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister return;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister /*
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister * Firmware event log is little-endian
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister */
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister swapp = (uint32_t *)&fwhdr;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister for (sidx = 0; sidx < (sizeof (pmcs_fw_event_hdr_t) /
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister sizeof (uint32_t)); sidx++) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister *swapp = LE_32(*swapp);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister swapp++;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (fwhdr.fw_el_signature == PMCS_FWLOG_AAP1_SIG) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister header_id = "AAP1";
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister } else if (fwhdr.fw_el_signature == PMCS_FWLOG_IOP_SIG) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister header_id = "IOP";
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister } else {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_warn("Invalid firmware event log signature\n");
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister return;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("Event Log: %s\n", header_id);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("Oldest entry: %d\n", fwhdr.fw_el_oldest_idx);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("Latest entry: %d\n", fwhdr.fw_el_latest_idx);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister entry = mdb_alloc(fwhdr.fw_el_entry_size, UM_SLEEP);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fw_entryp = (pmcs_fw_event_entry_t *)((void *)entry);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister total_size -= sizeof (pmcs_fw_event_hdr_t);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister log_size = fwhdr.fw_el_buf_size;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fwlogp += fwhdr.fw_el_entry_start_offset;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister swapp = (uint32_t *)((void *)entry);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister index = 0;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("%8s %16s %32s %8s %3s %8s %8s %8s %8s",
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister "Index", "Timestamp", "Time", "Seq Num", "Sev", "Word 0",
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister "Word 1", "Word 2", "Word 3");
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("\n");
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister while (log_size != 0) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (mdb_vread(entry, fwhdr.fw_el_entry_size,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister (uintptr_t)fwlogp) != fwhdr.fw_el_entry_size) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_warn("Unable to read event log entry\n");
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister goto bail_out;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister for (sidx = 0; sidx < (fwhdr.fw_el_entry_size /
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister sizeof (uint32_t)); sidx++) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister *(swapp + sidx) = LE_32(*(swapp + sidx));
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (fw_entryp->ts_upper || fw_entryp->ts_lower) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister pmcs_fwtime_to_systime(ss, fw_entryp->ts_upper,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fw_entryp->ts_lower, &systime);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("%8d %08x%08x [%Y.%09ld] %8d %3d "
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister "%08x %08x %08x %08x\n", index,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fw_entryp->ts_upper, fw_entryp->ts_lower,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister systime, fw_entryp->seq_num,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fw_entryp->severity, fw_entryp->logw0,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fw_entryp->logw1, fw_entryp->logw2,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fw_entryp->logw3);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister fwlogp += fwhdr.fw_el_entry_size;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister total_size -= fwhdr.fw_el_entry_size;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister log_size -= fwhdr.fw_el_entry_size;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister index++;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("\n");
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollisterbail_out:
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_free(entry, fwhdr.fw_el_entry_size);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister}
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_hwinfo(struct pmcs_hw m, int verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct pmcs_hw *mp = &m;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *fwsupport;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (PMCS_FW_TYPE(mp)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_FW_TYPE_RELEASED:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fwsupport = "Released";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_FW_TYPE_DEVELOPMENT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fwsupport = "Development";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_FW_TYPE_ALPHA:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fwsupport = "Alpha";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_FW_TYPE_BETA:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fwsupport = "Beta";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fwsupport = "Special";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\nHardware information:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("---------------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Chip revision: %c\n", 'A' + m.chiprev);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("SAS WWID: %"PRIx64"\n", m.sas_wwns[0]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Firmware version: %x.%x.%x (%s)\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh PMCS_FW_MAJOR(mp), PMCS_FW_MINOR(mp), PMCS_FW_MICRO(mp),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh fwsupport);
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister mdb_printf("ILA version: %08x\n", m.ila_ver);
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister mdb_printf("Active f/w img: %c\n", (m.fw_active_img) ? 'A' : 'B');
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Number of PHYs: %d\n", m.nphy);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Maximum commands: %d\n", m.max_cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Maximum devices: %d\n", m.max_dev);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("I/O queue depth: %d\n", m.ioq_depth);
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister mdb_printf("Open retry intvl: %d usecs\n", m.open_retry_interval);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (m.fwlog == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Firmware logging: Disabled\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Firmware logging: Enabled (%d)\n", m.fwlog);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister if (m.fwlog_file == 0) {
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister mdb_printf("Firmware logfile: Not configured\n");
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister } else {
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister mdb_printf("Firmware logfile: Configured\n");
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister mdb_inc_indent(2);
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister mdb_printf("AAP1 log file: %s\n", m.fwlogfile_aap1);
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister mdb_printf("IOP logfile: %s\n", m.fwlogfile_iop);
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister mdb_dec_indent(2);
2ac4abe882db38ef90020f7c5ca28586e3d57258David Hollister }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_targets(struct pmcs_hw m, int verbose, int totals_only)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *dtype;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_xscsi_t xs;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_phy_t phy;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint16_t max_dev, idx;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t sas_targets = 0, smp_targets = 0, sata_targets = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh max_dev = m.max_dev;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (targets == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh targets = mdb_alloc(sizeof (targets) * max_dev, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(targets, sizeof (targets) * max_dev, m.targets) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(targets, m.targets);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!totals_only) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\nTarget information:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("---------------------------------------\n");
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana mdb_printf("VTGT %-16s %-16s %-5s %4s %6s %s", "SAS Address",
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana "PHY Address", "DType", "Actv", "OnChip", "DS");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (idx = 0; idx < max_dev; idx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (targets[idx] == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&xs, sizeof (xs), targets[idx]) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_xscsi_t, targets[idx]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
b18a19c275d2531444fcd2f66664cbe3c6897f6aJesse Butler * It has to be new or assigned to be of interest.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
b18a19c275d2531444fcd2f66664cbe3c6897f6aJesse Butler if (xs.new == 0 && xs.assigned == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (xs.dtype) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case NOTHING:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dtype = "None";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case SATA:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dtype = "SATA";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sata_targets++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case SAS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dtype = "SAS";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sas_targets++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case EXPANDER:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dtype = "SMP";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh smp_targets++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (totals_only) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.phy) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&phy, sizeof (phy), xs.phy) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_phy_t, xs.phy);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%4d ", idx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_sas_address(&phy);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" %16p", xs.phy);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%4d %16s", idx, "<no phy avail>");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" %5s", dtype);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana mdb_printf(" %4d", xs.actv_pkts);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana mdb_printf(" %6d", xs.actv_cnt);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" %2d", xs.dev_state);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (verbose) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.new) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" new");
b18a19c275d2531444fcd2f66664cbe3c6897f6aJesse Butler }
b18a19c275d2531444fcd2f66664cbe3c6897f6aJesse Butler if (xs.assigned) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" assigned");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.draining) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" draining");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.reset_wait) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" reset_wait");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.resetting) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" resetting");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.recover_wait) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" recover_wait");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.recovering) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" recovering");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.event_recovery) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" event recovery");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.special_running) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" special_active");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (xs.ncq) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" ncq_tagmap=0x%x qdepth=%d",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh xs.tagmap, xs.qdepth);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else if (xs.pio) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" pio");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!totals_only) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%19s %d (%d SAS + %d SATA + %d SMP)\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "Configured targets:", (sas_targets + sata_targets + smp_targets),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sas_targets, sata_targets, smp_targets);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic char *
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhwork_state_to_string(uint32_t state)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh{
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh char *state_string;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh switch (state) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_WORK_STATE_NIL:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_string = "Free";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_WORK_STATE_READY:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_string = "Ready";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_WORK_STATE_ONCHIP:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_string = "On Chip";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_WORK_STATE_INTR:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_string = "In Intr";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_WORK_STATE_IOCOMPQ:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_string = "I/O Comp";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_WORK_STATE_ABORTED:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_string = "I/O Aborted";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_WORK_STATE_TIMED_OUT:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_string = "I/O Timed Out";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh default:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_string = "INVALID";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (state_string);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh}
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhdisplay_one_work(pmcwork_t *wp, int verbose, int idx)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh char *state, *last_state;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh char *path;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_xscsi_t xs;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_phy_t phy;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh int tgt;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state = work_state_to_string(wp->state);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh last_state = work_state_to_string(wp->last_state);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (wp->ssp_event && wp->ssp_event != 0xffffffff) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("SSP event 0x%x", wp->ssp_event);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh tgt = -1;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (wp->xp) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (MDB_RD(&xs, sizeof (xs), wp->xp) == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh NOREAD(pmcs_xscsi_t, wp->xp);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh tgt = xs.target_num;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (wp->phy) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (MDB_RD(&phy, sizeof (phy), wp->phy) == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh NOREAD(pmcs_phy_t, wp->phy);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh path = phy.path;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh path = "N/A";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (verbose) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%4d ", idx);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (tgt == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%08x %10s %20s N/A %8u %1d %1d ",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh wp->htag, state, path, wp->timer,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh wp->onwire, wp->dead);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%08x %10s %20s %8d %8u %1d %1d ",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh wp->htag, state, path, tgt, wp->timer,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh wp->onwire, wp->dead);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (verbose) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister mdb_printf("%08x %10s 0x%016p 0x%016p 0x%016p\n",
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister wp->last_htag, last_state, wp->last_phy, wp->last_xp,
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister wp->last_arg);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh}
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic void
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollisterdisplay_work(struct pmcs_hw m, int verbose, int wserno)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh{
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh int idx;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh boolean_t header_printed = B_FALSE;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister pmcwork_t *wp;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister wserno_list_t *sernop, *sp, *newsp, *sphead = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uintptr_t _wp;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister int serno;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister wp = mdb_alloc(sizeof (pmcwork_t) * m.max_cmd, UM_SLEEP);
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister _wp = (uintptr_t)m.work;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sernop = mdb_alloc(sizeof (wserno_list_t) * m.max_cmd, UM_SLEEP);
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister bzero(sernop, sizeof (wserno_list_t) * m.max_cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\nActive Work structure information:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("----------------------------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister /*
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister * Read in all the work structures
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (idx = 0; idx < m.max_cmd; idx++, _wp += sizeof (pmcwork_t)) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if (MDB_RD(wp + idx, sizeof (pmcwork_t), _wp) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcwork_t, _wp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister /*
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister * Sort by serial number?
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if (wserno) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister for (idx = 0; idx < m.max_cmd; idx++) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if ((wp + idx)->htag == 0) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister serno = PMCS_TAG_SERNO((wp + idx)->last_htag);
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister } else {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister serno = PMCS_TAG_SERNO((wp + idx)->htag);
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister /* Start at the beginning of the list */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sp = sphead;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister newsp = sernop + idx;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister /* If this is the first entry, just add it */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if (sphead == NULL) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sphead = sernop;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sphead->serno = serno;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sphead->idx = idx;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sphead->next = NULL;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sphead->prev = NULL;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister continue;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister newsp->serno = serno;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister newsp->idx = idx;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister /* Find out where in the list this goes */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister while (sp) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister /* This item goes before sp */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if (serno < sp->serno) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister newsp->next = sp;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister newsp->prev = sp->prev;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if (newsp->prev == NULL) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sphead = newsp;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister } else {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister newsp->prev->next = newsp;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sp->prev = newsp;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister break;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister /*
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister * If sp->next is NULL, this entry goes at the
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister * end of the list
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if (sp->next == NULL) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sp->next = newsp;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister newsp->next = NULL;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister newsp->prev = sp;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister break;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sp = sp->next;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister /*
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister * Now print the sorted list
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister mdb_printf(" Idx %8s %10s %20s %8s %8s O D ",
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister "HTag", "State", "Phy Path", "Target", "Timer");
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister mdb_printf("%8s %10s %18s %18s %18s\n", "LastHTAG",
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister "LastState", "LastPHY", "LastTgt", "LastArg");
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sp = sphead;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister while (sp) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister display_one_work(wp + sp->idx, 1, sp->idx);
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister sp = sp->next;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister goto out;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister /*
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister * Now print the list, sorted by index
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister for (idx = 0; idx < m.max_cmd; idx++) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if (!verbose && ((wp + idx)->htag == PMCS_TAG_TYPE_FREE)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (header_printed == B_FALSE) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (verbose) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%4s ", "Idx");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%8s %10s %20s %8s %8s O D ",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "HTag", "State", "Phy Path", "Target", "Timer");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (verbose) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister mdb_printf("%8s %10s %18s %18s %18s\n",
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister "LastHTAG", "LastState", "LastPHY",
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister "LastTgt", "LastArg");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh header_printed = B_TRUE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister display_one_work(wp + idx, verbose, idx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollisterout:
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister mdb_free(wp, sizeof (pmcwork_t) * m.max_cmd);
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister mdb_free(sernop, sizeof (wserno_list_t) * m.max_cmd);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhprint_spcmd(pmcs_cmd_t *sp, void *kaddr, int printhdr, int verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh int cdb_size, idx;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh struct scsi_pkt pkt;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh uchar_t cdb[256];
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (printhdr) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (verbose) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%16s %16s %16s %8s %s CDB\n", "Command",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "SCSA pkt", "DMA Chunks", "HTAG", "SATL Tag");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%16s %16s %16s %8s %s\n", "Command",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "SCSA pkt", "DMA Chunks", "HTAG", "SATL Tag");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%16p %16p %16p %08x %08x ",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh kaddr, sp->cmd_pkt, sp->cmd_clist, sp->cmd_tag, sp->cmd_satltag);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh /*
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * If we're printing verbose, dump the CDB as well.
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh */
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (verbose) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (sp->cmd_pkt) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_vread(&pkt, sizeof (struct scsi_pkt),
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh (uintptr_t)sp->cmd_pkt) !=
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh sizeof (struct scsi_pkt)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("Unable to read SCSI pkt\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh cdb_size = pkt.pkt_cdblen;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_vread(&cdb[0], cdb_size,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh (uintptr_t)pkt.pkt_cdbp) != cdb_size) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("Unable to read CDB\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh for (idx = 0; idx < cdb_size; idx++) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%02x ", cdb[idx]);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("N/A");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED1*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_waitqs(struct pmcs_hw m, int verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_cmd_t *sp, s;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_xscsi_t xs;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int first, i;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int max_dev = m.max_dev;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = m.dq.stqh_first;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (first) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\nDead Command Queue:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("---------------------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&s, sizeof (s), sp) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_cmd_t, sp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh print_spcmd(&s, sp, first, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = s.cmd_next.stqe_next;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = m.cq.stqh_first;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (first) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\nCompletion Command Queue:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("---------------------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&s, sizeof (s), sp) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_cmd_t, sp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh print_spcmd(&s, sp, first, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = s.cmd_next.stqe_next;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (targets == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh targets = mdb_alloc(sizeof (targets) * max_dev, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(targets, sizeof (targets) * max_dev, m.targets) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(targets, m.targets);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; i < max_dev; i++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (targets[i] == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&xs, sizeof (xs), targets[i]) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_xscsi_t, targets[i]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = xs.wq.stqh_first;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (first) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\nTarget %u Wait Queue:\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh xs.target_num);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("---------------------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&s, sizeof (s), sp) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_cmd_t, sp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh print_spcmd(&s, sp, first, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = s.cmd_next.stqe_next;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = xs.aq.stqh_first;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (first) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\nTarget %u Active Queue:\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh xs.target_num);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("---------------------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&s, sizeof (s), sp) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_cmd_t, sp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh print_spcmd(&s, sp, first, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = s.cmd_next.stqe_next;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = xs.sq.stqh_first;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (first) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\nTarget %u Special Queue:\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh xs.target_num);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("---------------------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&s, sizeof (s), sp) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_cmd_t, sp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh print_spcmd(&s, sp, first, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sp = s.cmd_next.stqe_next;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh first = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhibq_type(int qnum)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (qnum < 0 || qnum >= PMCS_NIQ) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("UNKNOWN");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (qnum < PMCS_IQ_OTHER) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("I/O");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("Other");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhobq_type(int qnum)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (qnum) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_OQ_IODONE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("I/O");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_OQ_GENERAL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("General");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_OQ_EVENTS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("Events");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("UNKNOWN");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhiomb_cat(uint32_t cat)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cat) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_IOMB_CAT_NET:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("NET");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_IOMB_CAT_FC:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("FC");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_IOMB_CAT_SAS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCS_IOMB_CAT_SCSI:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SCSI");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("???");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollisterstatic char *
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollisteriomb_event(uint8_t event)
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister{
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister switch (event) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PHY_STOP_STATUS:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("PHY STOP");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_SAS_PHY_UP:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("PHY UP");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_SATA_PHY_UP:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("SATA PHY UP");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_SATA_SPINUP_HOLD:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("SATA SPINUP HOLD");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PHY_DOWN:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("PHY DOWN");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_BROADCAST_CHANGE:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("BROADCAST CHANGE");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_BROADCAST_SES:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("BROADCAST SES");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PHY_ERR_INBOUND_CRC:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("INBOUND CRC ERROR");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_HARD_RESET_RECEIVED:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("HARD RESET");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_EVENT_ID_FRAME_TIMO:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("IDENTIFY FRAME TIMEOUT");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_BROADCAST_EXP:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("BROADCAST EXPANDER");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PHY_START_STATUS:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("PHY START");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PHY_ERR_INVALID_DWORD:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("INVALID DWORD");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PHY_ERR_DISPARITY_ERROR:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("DISPARITY ERROR");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PHY_ERR_CODE_VIOLATION:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("CODE VIOLATION");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PHY_ERR_LOSS_OF_DWORD_SYN:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("LOSS OF DWORD SYNC");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PHY_ERR_PHY_RESET_FAILD:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("PHY RESET FAILED");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PORT_RECOVERY_TIMER_TMO:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("PORT RECOVERY TIMEOUT");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PORT_RECOVER:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("PORT RECOVERY");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PORT_RESET_TIMER_TMO:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("PORT RESET TIMEOUT");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_PORT_RESET_COMPLETE:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("PORT RESET COMPLETE");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_BROADCAST_ASYNC_EVENT:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("BROADCAST ASYNC");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case IOP_EVENT_IT_NEXUS_LOSS:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("I/T NEXUS LOSS");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister default:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister return ("Unknown Event");
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister }
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister}
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhinbound_iomb_opcode(uint32_t opcode)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (opcode) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_ECHO:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("ECHO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_GET_INFO:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_GET_VPD:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_VPD");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_PHY_START:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("PHY_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_PHY_STOP:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("PHY_STOP");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SSP_INI_IO_START:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SSP_INI_TM_START:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_TM_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SSP_INI_EXT_IO_START:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_EXT_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_DEVICE_HANDLE_ACCEPT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_HANDLE_ACCEPT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SSP_TGT_IO_START:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TGT_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SSP_TGT_RESPONSE_START:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TGT_RESPONSE_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SSP_INI_EDC_EXT_IO_START:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_EDC_EXT_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SSP_INI_EDC_EXT_IO_START1:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_EDC_EXT_IO_START1");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SSP_TGT_EDC_IO_START:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TGT_EDC_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SSP_ABORT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_DEREGISTER_DEVICE_HANDLE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEREGISTER_DEVICE_HANDLE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_GET_DEVICE_HANDLE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_HANDLE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SMP_REQUEST:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_REQUEST");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SMP_RESPONSE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_RESPONSE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SMP_ABORT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_ASSISTED_DISCOVERY:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("ASSISTED_DISCOVERY");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_REGISTER_DEVICE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("REGISTER_DEVICE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SATA_HOST_IO_START:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_HOST_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SATA_ABORT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_LOCAL_PHY_CONTROL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("LOCAL_PHY_CONTROL");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_GET_DEVICE_INFO:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_TWI:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TWI");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_FW_FLASH_UPDATE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("FW_FLASH_UPDATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SET_VPD:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_VPD");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_GPIO:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GPIO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SAS_DIAG_MODE_START_END:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_DIAG_MODE_START_END");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SAS_DIAG_EXECUTE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_DIAG_EXECUTE");
978d7443a924cda8208d6a10e72be89383bc7becSrikanth Suravajhala case PMCIN_SAS_HW_EVENT_ACK:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_HW_EVENT_ACK");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_GET_TIME_STAMP:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_TIME_STAMP");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_PORT_CONTROL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("PORT_CONTROL");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_GET_NVMD_DATA:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_NVMD_DATA");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SET_NVMD_DATA:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_NVMD_DATA");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_SET_DEVICE_STATE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_DEVICE_STATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCIN_GET_DEVICE_STATE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_STATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("UNKNOWN");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhoutbound_iomb_opcode(uint32_t opcode)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (opcode) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_ECHO:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("ECHO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_GET_INFO:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_GET_VPD:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_VPD");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SAS_HW_EVENT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_HW_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SSP_COMPLETION:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_COMPLETION");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SMP_COMPLETION:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_COMPLETION");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_LOCAL_PHY_CONTROL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("LOCAL_PHY_CONTROL");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SAS_ASSISTED_DISCOVERY_EVENT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_ASSISTED_DISCOVERY_SENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SATA_ASSISTED_DISCOVERY_EVENT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_ASSISTED_DISCOVERY_SENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_DEVICE_REGISTRATION:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_REGISTRATION");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_DEREGISTER_DEVICE_HANDLE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEREGISTER_DEVICE_HANDLE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_GET_DEVICE_HANDLE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_HANDLE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SATA_COMPLETION:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_COMPLETION");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SATA_EVENT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SSP_EVENT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_DEVICE_HANDLE_ARRIVED:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_HANDLE_ARRIVED");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SSP_REQUEST_RECEIVED:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_REQUEST_RECEIVED");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_DEVICE_INFO:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_FW_FLASH_UPDATE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("FW_FLASH_UPDATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SET_VPD:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_VPD");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_GPIO:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GPIO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_GPIO_EVENT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GPIO_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_GENERAL_EVENT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GENERAL_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_TWI:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TWI");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SSP_ABORT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SATA_ABORT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SAS_DIAG_MODE_START_END:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_DIAG_MODE_START_END");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SAS_DIAG_EXECUTE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_DIAG_EXECUTE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_GET_TIME_STAMP:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_TIME_STAMP");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SAS_HW_EVENT_ACK_ACK:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_HW_EVENT_ACK_ACK");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_PORT_CONTROL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("PORT_CONTROL");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SKIP_ENTRIES:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SKIP_ENTRIES");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SMP_ABORT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_GET_NVMD_DATA:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_NVMD_DATA");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SET_NVMD_DATA:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_NVMD_DATA");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_DEVICE_HANDLE_REMOVED:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_HANDLE_REMOVED");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SET_DEVICE_STATE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_DEVICE_STATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_GET_DEVICE_STATE:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_STATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case PMCOUT_SET_DEVICE_INFO:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_DEVICE_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("UNKNOWN");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollisterstatic uint32_t
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollisterget_devid_from_ob_iomb(struct pmcs_hw ss, uint32_t *qentryp, uint16_t opcode)
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister{
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uint32_t devid = PMCS_INVALID_DEVICE_ID;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister switch (opcode) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * These are obtained via the HTAG which is in word 1
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SSP_COMPLETION:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SMP_COMPLETION:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEREGISTER_DEVICE_HANDLE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_GET_DEVICE_HANDLE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SATA_COMPLETION:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SSP_ABORT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SATA_ABORT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SMP_ABORT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SAS_HW_EVENT_ACK_ACK: {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uint32_t htag;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister pmcwork_t *wp;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister pmcs_phy_t *phy;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uintptr_t _wp, _phy;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uint16_t index;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister htag = LE_32(*(qentryp + 1));
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister index = htag & PMCS_TAG_INDEX_MASK;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister wp = mdb_alloc(sizeof (pmcwork_t), UM_SLEEP);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister _wp = (uintptr_t)ss.work + (sizeof (pmcwork_t) * index);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (MDB_RD(wp, sizeof (pmcwork_t), _wp) == -1) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister NOREAD(pmcwork_t, _wp);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister mdb_free(wp, sizeof (pmcwork_t));
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister break;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister phy = mdb_alloc(sizeof (pmcs_phy_t), UM_SLEEP);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (wp->phy == NULL) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister _phy = (uintptr_t)wp->last_phy;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister } else {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister _phy = (uintptr_t)wp->phy;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * If we have a PHY, read it in and get it's handle
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (_phy != NULL) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (MDB_RD(phy, sizeof (*phy), _phy) == -1) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister NOREAD(pmcs_phy_t, phy);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister } else {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid = phy->device_id;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister mdb_free(phy, sizeof (pmcs_phy_t));
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister mdb_free(wp, sizeof (pmcwork_t));
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister break;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * The device ID is in the outbound IOMB at word 1
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SSP_REQUEST_RECEIVED:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid = LE_32(*(qentryp + 1)) & PMCS_DEVICE_ID_MASK;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister break;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * The device ID is in the outbound IOMB at word 2
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEVICE_HANDLE_ARRIVED:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEVICE_HANDLE_REMOVED:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid = LE_32(*(qentryp + 2)) & PMCS_DEVICE_ID_MASK;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister break;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * In this (very rare - never seen it) state, the device ID
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * comes from the HTAG in the inbound IOMB, which would be word
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * 3 in the outbound IOMB
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_GENERAL_EVENT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * The device ID is in the outbound IOMB at word 3
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEVICE_REGISTRATION:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEVICE_INFO:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SET_DEVICE_STATE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_GET_DEVICE_STATE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SET_DEVICE_INFO:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid = LE_32(*(qentryp + 3)) & PMCS_DEVICE_ID_MASK;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister break;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * Device ID is in the outbound IOMB at word 4
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SATA_EVENT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SSP_EVENT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid = LE_32(*(qentryp + 4)) & PMCS_DEVICE_ID_MASK;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister break;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return (devid);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister}
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollisterstatic boolean_t
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollisteriomb_is_dev_hdl_specific(uint32_t word0, boolean_t inbound)
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister{
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uint16_t opcode = word0 & PMCS_IOMB_OPCODE_MASK;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (inbound) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister switch (opcode) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SSP_INI_IO_START:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SSP_INI_TM_START:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SSP_INI_EXT_IO_START:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SSP_TGT_IO_START:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SSP_TGT_RESPONSE_START:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SSP_ABORT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_DEREGISTER_DEVICE_HANDLE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SMP_REQUEST:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SMP_RESPONSE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SMP_ABORT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_ASSISTED_DISCOVERY:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SATA_HOST_IO_START:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SATA_ABORT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_GET_DEVICE_INFO:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_SET_DEVICE_STATE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCIN_GET_DEVICE_STATE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return (B_TRUE);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return (B_FALSE);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister switch (opcode) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SSP_COMPLETION:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SMP_COMPLETION:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEVICE_REGISTRATION:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEREGISTER_DEVICE_HANDLE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_GET_DEVICE_HANDLE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SATA_COMPLETION:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SATA_EVENT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SSP_EVENT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEVICE_HANDLE_ARRIVED:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SSP_REQUEST_RECEIVED:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEVICE_INFO:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_FW_FLASH_UPDATE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_GENERAL_EVENT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SSP_ABORT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SATA_ABORT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SAS_HW_EVENT_ACK_ACK:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SMP_ABORT:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_DEVICE_HANDLE_REMOVED:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SET_DEVICE_STATE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_GET_DEVICE_STATE:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister case PMCOUT_SET_DEVICE_INFO:
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return (B_TRUE);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return (B_FALSE);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister}
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollisterdump_one_qentry_outbound(struct pmcs_hw ss, uint32_t *qentryp, int idx,
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uint64_t devid_filter)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int qeidx;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t word0 = LE_32(*qentryp);
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister uint32_t word1 = LE_32(*(qentryp + 1));
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister uint8_t iop_event;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uint32_t devid;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * Check to see if we're filtering on a device ID
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (devid_filter != PMCS_INVALID_DEVICE_ID) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (!iomb_is_dev_hdl_specific(word0, B_FALSE)) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * Go find the device id. It might be in the outbound
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * IOMB or we may have to go find the work structure and
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * get it from there.
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid = get_devid_from_ob_iomb(ss, qentryp,
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister word0 & PMCS_IOMB_OPCODE_MASK);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if ((devid == PMCS_INVALID_DEVICE_ID) ||
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister (devid_filter != devid)) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Entry #%02d\n", idx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Header: 0x%08x (", word0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (word0 & PMCS_IOMB_VALID) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("VALID, ");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (word0 & PMCS_IOMB_HIPRI) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("HIPRI, ");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("OBID=%d, ",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (word0 & PMCS_IOMB_OBID_MASK) >> PMCS_IOMB_OBID_SHIFT);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("CAT=%s, ",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh iomb_cat((word0 & PMCS_IOMB_CAT_MASK) >> PMCS_IOMB_CAT_SHIFT));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("OPCODE=%s",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh outbound_iomb_opcode(word0 & PMCS_IOMB_OPCODE_MASK));
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister if ((word0 & PMCS_IOMB_OPCODE_MASK) == PMCOUT_SAS_HW_EVENT) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister iop_event = IOP_EVENT_EVENT(word1);
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister mdb_printf(" <%s>", iomb_event(iop_event));
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(")\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Remaining Payload:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (qeidx = 1; qeidx < (PMCS_QENTRY_SIZE / 4); qeidx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%08x ", LE_32(*(qentryp + qeidx)));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(4);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollisterdisplay_outbound_queues(struct pmcs_hw ss, uint64_t devid_filter,
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uint_t verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int idx, qidx;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uintptr_t obqp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t *cip;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t *qentryp = mdb_alloc(PMCS_QENTRY_SIZE, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t last_consumed, oqpi;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Outbound Queues\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("---------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (qidx = 0; qidx < PMCS_NOQ; qidx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh obqp = (uintptr_t)ss.oqp[qidx];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (obqp == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("No outbound queue ptr for queue #%d\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh qidx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Outbound Queue #%d (Queue Type = %s)\n", qidx,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh obq_type(qidx));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Chip is the producer, so read the actual producer index
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * and not the driver's version
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh cip = (uint32_t *)((void *)ss.cip);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&oqpi, 4, cip + OQPI_BASE_OFFSET +
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (qidx * 4)) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Couldn't read oqpi\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Producer index: %d Consumer index: %d\n\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh LE_32(oqpi), ss.oqci[qidx]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ss.oqci[qidx] == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh last_consumed = ss.ioq_depth - 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh last_consumed = ss.oqci[qidx] - 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!verbose) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Last processed entry:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(qentryp, PMCS_QENTRY_SIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (obqp + (PMCS_QENTRY_SIZE * last_consumed)))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Couldn't read queue entry at 0x%p\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (obqp + (PMCS_QENTRY_SIZE *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh last_consumed)));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister dump_one_qentry_outbound(ss, qentryp, last_consumed,
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid_filter);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (idx = 0; idx < ss.ioq_depth; idx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(qentryp, PMCS_QENTRY_SIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (obqp + (PMCS_QENTRY_SIZE * idx))) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Couldn't read queue entry at 0x%p\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (obqp + (PMCS_QENTRY_SIZE * idx)));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister dump_one_qentry_outbound(ss, qentryp, idx,
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid_filter);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_free(qentryp, PMCS_QENTRY_SIZE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollisterdump_one_qentry_inbound(uint32_t *qentryp, int idx, uint64_t devid_filter)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int qeidx;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t word0 = LE_32(*qentryp);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uint32_t devid = LE_32(*(qentryp + 2));
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * Check to see if we're filtering on a device ID
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (devid_filter != PMCS_INVALID_DEVICE_ID) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (iomb_is_dev_hdl_specific(word0, B_TRUE)) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (devid_filter != devid) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister } else {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Entry #%02d\n", idx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Header: 0x%08x (", word0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (word0 & PMCS_IOMB_VALID) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("VALID, ");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (word0 & PMCS_IOMB_HIPRI) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("HIPRI, ");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("OBID=%d, ",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (word0 & PMCS_IOMB_OBID_MASK) >> PMCS_IOMB_OBID_SHIFT);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("CAT=%s, ",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh iomb_cat((word0 & PMCS_IOMB_CAT_MASK) >> PMCS_IOMB_CAT_SHIFT));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("OPCODE=%s",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh inbound_iomb_opcode(word0 & PMCS_IOMB_OPCODE_MASK));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(")\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("HTAG: 0x%08x\n", LE_32(*(qentryp + 1)));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Remaining Payload:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (qeidx = 2; qeidx < (PMCS_QENTRY_SIZE / 4); qeidx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%08x ", LE_32(*(qentryp + qeidx)));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(4);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollisterdisplay_inbound_queues(struct pmcs_hw ss, uint64_t devid_filter, uint_t verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int idx, qidx, iqci, last_consumed;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uintptr_t ibqp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t *qentryp = mdb_alloc(PMCS_QENTRY_SIZE, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t *cip;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Inbound Queues\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("--------------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (qidx = 0; qidx < PMCS_NIQ; qidx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ibqp = (uintptr_t)ss.iqp[qidx];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ibqp == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("No inbound queue ptr for queue #%d\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh qidx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Inbound Queue #%d (Queue Type = %s)\n", qidx,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ibq_type(qidx));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh cip = (uint32_t *)((void *)ss.cip);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&iqci, 4, cip + (qidx * 4)) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Couldn't read iqci\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh iqci = LE_32(iqci);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Producer index: %d Consumer index: %d\n\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ss.shadow_iqpi[qidx], iqci);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (iqci == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh last_consumed = ss.ioq_depth - 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh last_consumed = iqci - 1;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!verbose) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Last processed entry:\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(qentryp, PMCS_QENTRY_SIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (ibqp + (PMCS_QENTRY_SIZE * last_consumed)))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Couldn't read queue entry at 0x%p\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (ibqp + (PMCS_QENTRY_SIZE *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh last_consumed)));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister dump_one_qentry_inbound(qentryp, last_consumed,
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid_filter);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh continue;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (idx = 0; idx < ss.ioq_depth; idx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(qentryp, PMCS_QENTRY_SIZE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (ibqp + (PMCS_QENTRY_SIZE * idx))) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Couldn't read queue entry at 0x%p\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (ibqp + (PMCS_QENTRY_SIZE * idx)));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister dump_one_qentry_inbound(qentryp, idx, devid_filter);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(2);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_free(qentryp, PMCS_QENTRY_SIZE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister/*
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister * phy is our copy of the PHY structure. phyp is the pointer to the actual
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister * kernel PHY data structure
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollisterdisplay_phy(struct pmcs_phy phy, struct pmcs_phy *phyp, int verbose,
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister int totals_only)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *dtype, *speed;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *yes = "Yes";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *no = "No";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *cfgd = no;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *apend = no;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *asent = no;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *dead = no;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *changed = no;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister char route_attr, route_method;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (phy.dtype) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case NOTHING:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dtype = "None";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case SATA:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dtype = "SATA";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.configured) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ++sata_phys;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case SAS:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dtype = "SAS";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.configured) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ++sas_phys;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case EXPANDER:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dtype = "EXP";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.configured) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ++exp_phys;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.dtype == NOTHING) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh empty_phys++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else if ((phy.dtype == EXPANDER) && phy.configured) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh num_expanders++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (totals_only) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (phy.link_rate) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case SAS_LINK_RATE_1_5GBIT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh speed = "1.5Gb/s";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case SAS_LINK_RATE_3GBIT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh speed = "3 Gb/s";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case SAS_LINK_RATE_6GBIT:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh speed = "6 Gb/s";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh speed = "N/A";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((phy.dtype != NOTHING) || verbose) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh print_sas_address(&phy);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.device_id != PMCS_INVALID_DEVICE_ID) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" %3d %4d %6s %4s ",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy.device_id, phy.phynum, speed, dtype);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf(" N/A %4d %6s %4s ",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy.phynum, speed, dtype);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (verbose) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.abort_sent) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh asent = yes;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.abort_pending) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh apend = yes;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.configured) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh cfgd = yes;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.dead) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh dead = yes;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.changed) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh changed = yes;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister switch (phy.routing_attr) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case SMP_ROUTING_DIRECT:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister route_attr = 'D';
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case SMP_ROUTING_SUBTRACTIVE:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister route_attr = 'S';
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case SMP_ROUTING_TABLE:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister route_attr = 'T';
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister default:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister route_attr = '?';
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister }
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister switch (phy.routing_method) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case SMP_ROUTING_DIRECT:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister route_method = 'D';
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case SMP_ROUTING_SUBTRACTIVE:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister route_method = 'S';
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case SMP_ROUTING_TABLE:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister route_method = 'T';
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister default:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister route_attr = '?';
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister }
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister mdb_printf("%-4s %-4s %-4s %-4s %-4s %3d %3c/%1c %3d "
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister "%1d 0x%p ", cfgd, apend, asent, changed, dead,
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister phy.ref_count, route_attr, route_method,
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister phy.enum_attempts, phy.reenumerate, phy.phy_lock);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Path: %s\n", phy.path);
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister /*
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister * In verbose mode, on the next line print the drill down
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister * info to see either the DISCOVER response or the REPORT
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister * GENERAL response depending on the PHY's dtype
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister */
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister if (verbose) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister uintptr_t tphyp = (uintptr_t)phyp;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister mdb_inc_indent(4);
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister switch (phy.dtype) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case EXPANDER:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister if (!phy.configured) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister }
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister mdb_printf("REPORT GENERAL response: %p::"
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister "print smp_report_general_resp_t\n",
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister (tphyp + offsetof(struct pmcs_phy,
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister rg_resp)));
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case SAS:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister case SATA:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister mdb_printf("DISCOVER response: %p::"
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister "print smp_discover_resp_t\n",
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister (tphyp + offsetof(struct pmcs_phy,
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister disc_resp)));
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister default:
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister break;
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister }
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister mdb_dec_indent(4);
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_phys(struct pmcs_hw ss, int verbose, struct pmcs_phy *parent, int level,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int totals_only)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_phy_t phy;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_phy_t *pphy = parent;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(3);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parent == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pphy = (pmcs_phy_t *)ss.root_phys;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pphy = (pmcs_phy_t *)parent;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (level == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sas_phys = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sata_phys = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh exp_phys = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh num_expanders = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh empty_phys = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!totals_only) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (level == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("PHY information\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("--------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Level %2d\n", level);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("--------\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("SAS Address Hdl Phy# Speed Type ");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (verbose) {
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister mdb_printf("Cfgd AbtP AbtS Chgd Dead Ref RtA/M Enm R "
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister "Lock\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (pphy) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&phy, sizeof (phy), (uintptr_t)pphy) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_phy_t, phy);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
9aed162131f1840d0bc1cd0275f4d7144f3690f0David Hollister display_phy(phy, pphy, verbose, totals_only);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy.children) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh display_phys(ss, verbose, phy.children, level + 1,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh totals_only);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!totals_only) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pphy = phy.sibling;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(3);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (level == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (verbose) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%19s %d (%d SAS + %d SATA + %d SMP) "
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "(+%d subsidiary + %d empty)\n", "Occupied PHYs:",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (sas_phys + sata_phys + num_expanders),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sas_phys, sata_phys, num_expanders,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (exp_phys - num_expanders), empty_phys);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%19s %d (%d SAS + %d SATA + %d SMP)\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "Occupied PHYs:",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (sas_phys + sata_phys + num_expanders),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sas_phys, sata_phys, num_expanders);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * filter is used to indicate whether we are filtering log messages based
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * on "instance". The other filtering (based on options) depends on the
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * values that are passed in for "sas_addr" and "phy_path".
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * MAX_INST_STRLEN is the largest string size from which we will attempt
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to convert to an instance number. The string will be formed up as
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * "0t<inst>\0" so that mdb_strtoull can parse it properly.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define MAX_INST_STRLEN 8
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramanapmcs_dump_tracelog(boolean_t filter, int instance, uint64_t tail_lines,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister const char *phy_path, uint64_t sas_address, uint64_t verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_tbuf_t *tbuf_addr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t tbuf_idx;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_tbuf_t tbuf;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh boolean_t wrap, elem_filtered;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t start_idx, elems_to_print, idx, tbuf_num_elems;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *bufp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char elem_inst[MAX_INST_STRLEN], ei_idx;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh uint64_t sas_addr;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh uint8_t *sas_addressp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Get the address of the first element */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readvar(&tbuf_addr, "pmcs_tbuf") == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("can't read pmcs_tbuf");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Get the total number */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readvar(&tbuf_num_elems, "pmcs_tbuf_num_elems") == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("can't read pmcs_tbuf_num_elems");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Get the current index */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readvar(&tbuf_idx, "pmcs_tbuf_idx") == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("can't read pmcs_tbuf_idx");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Indicator as to whether the buffer has wrapped */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readvar(&wrap, "pmcs_tbuf_wrap") == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("can't read pmcs_tbuf_wrap");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh /*
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * On little-endian systems, the SAS address passed in will be
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * byte swapped. Take care of that here.
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh */
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh#if defined(_LITTLE_ENDIAN)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh sas_addr = ((sas_address << 56) |
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ((sas_address << 40) & 0xff000000000000ULL) |
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ((sas_address << 24) & 0xff0000000000ULL) |
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ((sas_address << 8) & 0xff00000000ULL) |
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ((sas_address >> 8) & 0xff000000ULL) |
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ((sas_address >> 24) & 0xff0000ULL) |
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh ((sas_address >> 40) & 0xff00ULL) |
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh (sas_address >> 56));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh#else
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh sas_addr = sas_address;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh#endif
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh sas_addressp = (uint8_t *)&sas_addr;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana /* Ensure the tail number isn't greater than the size of the log */
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana if (tail_lines > tbuf_num_elems) {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana tail_lines = tbuf_num_elems;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana }
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Figure out where we start and stop */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (wrap) {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana if (tail_lines) {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana /* Do we need to wrap backwards? */
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana if (tail_lines > tbuf_idx) {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana start_idx = tbuf_num_elems - (tail_lines -
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana tbuf_idx);
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana } else {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana start_idx = tbuf_idx - tail_lines;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana }
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana elems_to_print = tail_lines;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana } else {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana start_idx = tbuf_idx;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana elems_to_print = tbuf_num_elems;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana if (tail_lines > tbuf_idx) {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana tail_lines = tbuf_idx;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana }
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana if (tail_lines) {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana start_idx = tbuf_idx - tail_lines;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana elems_to_print = tail_lines;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana } else {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana start_idx = 0;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana elems_to_print = tbuf_idx;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idx = start_idx;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Dump the buffer contents */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (elems_to_print != 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&tbuf, sizeof (pmcs_tbuf_t), (tbuf_addr + idx))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(tbuf, (tbuf_addr + idx));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh /*
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * Check for filtering on HBA instance
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh elem_filtered = B_FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (filter) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bufp = tbuf.buf;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Skip the driver name */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (*bufp < '0' || *bufp > '9') {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bufp++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ei_idx = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh elem_inst[ei_idx++] = '0';
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh elem_inst[ei_idx++] = 't';
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (*bufp != ':' && ei_idx < (MAX_INST_STRLEN - 1)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh elem_inst[ei_idx++] = *bufp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh bufp++;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh elem_inst[ei_idx] = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Get the instance */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((int)mdb_strtoull(elem_inst) != instance) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh elem_filtered = B_TRUE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (!elem_filtered && (phy_path || sas_address)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh /*
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * This message is not being filtered by HBA instance.
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * Now check to see if we're filtering based on
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * PHY path or SAS address.
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * Filtering is an "OR" operation. So, if any of the
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh * criteria matches, this message will be printed.
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh */
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh elem_filtered = B_TRUE;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (phy_path != NULL) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (strncmp(phy_path, tbuf.phy_path,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh PMCS_TBUF_UA_MAX_SIZE) == 0) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh elem_filtered = B_FALSE;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (sas_address != 0) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (memcmp(sas_addressp, tbuf.phy_sas_address,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh 8) == 0) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh elem_filtered = B_FALSE;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!elem_filtered) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister /*
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister * If the -v flag was given, print the firmware
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister * timestamp along with the clock time
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister */
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("%Y.%09ld ", tbuf.timestamp);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (verbose) {
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("(0x%" PRIx64 ") ",
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister tbuf.fw_timestamp);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister }
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister mdb_printf("%s\n", tbuf.buf);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh --elems_to_print;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (++idx == tbuf_num_elems) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh idx = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_OK);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Walkers
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhtargets_walk_i(mdb_walk_state_t *wsp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (wsp->walk_addr == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Can not perform global walk\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Address provided belongs to HBA softstate. Get the targets pointer
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to begin the walk.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(&ss, sizeof (pmcs_hw_t), wsp->walk_addr) !=
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sizeof (pmcs_hw_t)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Unable to read HBA softstate\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (targets == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh targets = mdb_alloc(sizeof (targets) * ss.max_dev, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(targets, sizeof (targets) * ss.max_dev, ss.targets) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(targets, ss.targets);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh target_idx = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_addr = (uintptr_t)(targets[0]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_data = mdb_alloc(sizeof (pmcs_xscsi_t), UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_NEXT);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhtargets_walk_s(mdb_walk_state_t *wsp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int status;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (target_idx == ss.max_dev) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_DONE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(wsp->walk_data, sizeof (pmcs_xscsi_t),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_addr) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Failed to read target at %p", (void *)wsp->walk_addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_DONE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_cbdata);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh do {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_addr = (uintptr_t)(targets[++target_idx]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } while ((wsp->walk_addr == NULL) && (target_idx < ss.max_dev));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (target_idx == ss.max_dev) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_DONE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (status);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhtargets_walk_f(mdb_walk_state_t *wsp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_free(wsp->walk_data, sizeof (pmcs_xscsi_t));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic pmcs_phy_t *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_next_sibling(pmcs_phy_t *phyp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_phy_t parent;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * First, if this is a root PHY, there are no more siblings
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phyp->level == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Otherwise, next sibling is the parent's sibling
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (phyp->level > 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(&parent, sizeof (pmcs_phy_t),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (uintptr_t)phyp->parent) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("pmcs_next_sibling: Failed to read PHY at %p",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void *)phyp->parent);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (parent.sibling != NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
e71c81d1003489d75b970c7d0a3a33772608b3abJesse Butler /*
e71c81d1003489d75b970c7d0a3a33772608b3abJesse Butler * If this PHY's sibling is NULL and it's a root phy,
e71c81d1003489d75b970c7d0a3a33772608b3abJesse Butler * we're done.
e71c81d1003489d75b970c7d0a3a33772608b3abJesse Butler */
e71c81d1003489d75b970c7d0a3a33772608b3abJesse Butler if (parent.level == 0) {
e71c81d1003489d75b970c7d0a3a33772608b3abJesse Butler return (NULL);
e71c81d1003489d75b970c7d0a3a33772608b3abJesse Butler }
e71c81d1003489d75b970c7d0a3a33772608b3abJesse Butler
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phyp = phyp->parent;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (parent.sibling);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhphy_walk_i(mdb_walk_state_t *wsp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (wsp->walk_addr == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Can not perform global walk\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Address provided belongs to HBA softstate. Get the targets pointer
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to begin the walk.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(&ss, sizeof (pmcs_hw_t), wsp->walk_addr) !=
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sizeof (pmcs_hw_t)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Unable to read HBA softstate\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_addr = (uintptr_t)(ss.root_phys);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_data = mdb_alloc(sizeof (pmcs_phy_t), UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_NEXT);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhphy_walk_s(mdb_walk_state_t *wsp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_phy_t *phyp, *nphyp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int status;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(wsp->walk_data, sizeof (pmcs_phy_t),
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_addr) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("phy_walk_s: Failed to read PHY at %p",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void *)wsp->walk_addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_DONE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_cbdata);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phyp = (pmcs_phy_t *)wsp->walk_data;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phyp->children) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_addr = (uintptr_t)(phyp->children);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } else {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_addr = (uintptr_t)(phyp->sibling);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (wsp->walk_addr == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * We reached the end of this sibling list. Trudge back up
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to the parent and find the next sibling after the expander
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * we just finished traversing, if there is one.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh nphyp = pmcs_next_sibling(phyp);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nphyp == NULL) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (WALK_DONE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_addr = (uintptr_t)nphyp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (status);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhphy_walk_f(mdb_walk_state_t *wsp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_free(wsp->walk_data, sizeof (pmcs_phy_t));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic void
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhdisplay_matching_work(struct pmcs_hw ss, uintmax_t index, uintmax_t snum,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh uintmax_t tag_type)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh{
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh int idx;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh pmcwork_t work, *wp = &work;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh uintptr_t _wp;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh boolean_t printed_header = B_FALSE;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh uint32_t mask, mask_val, match_val;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh char *match_type;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (index != UINT_MAX) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh match_type = "index";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mask = PMCS_TAG_INDEX_MASK;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mask_val = index << PMCS_TAG_INDEX_SHIFT;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh match_val = index;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else if (snum != UINT_MAX) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh match_type = "serial number";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mask = PMCS_TAG_SERNO_MASK;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mask_val = snum << PMCS_TAG_SERNO_SHIFT;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh match_val = snum;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh switch (tag_type) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_TAG_TYPE_NONE:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh match_type = "tag type NONE";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_TAG_TYPE_CBACK:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh match_type = "tag type CBACK";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_TAG_TYPE_WAIT:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh match_type = "tag type WAIT";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mask = PMCS_TAG_TYPE_MASK;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mask_val = tag_type << PMCS_TAG_TYPE_SHIFT;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh match_val = tag_type;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh _wp = (uintptr_t)ss.work;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh for (idx = 0; idx < ss.max_cmd; idx++, _wp += sizeof (pmcwork_t)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (MDB_RD(&work, sizeof (pmcwork_t), _wp) == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh NOREAD(pmcwork_t, _wp);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh continue;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if ((work.htag & mask) != mask_val) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh continue;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (printed_header == B_FALSE) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (tag_type) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("\nWork structures matching %s\n\n",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh match_type, match_val);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh } else {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("\nWork structures matching %s of "
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "0x%x\n\n", match_type, match_val);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%8s %10s %20s %8s %8s O D\n",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "HTag", "State", "Phy Path", "Target", "Timer");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh printed_header = B_TRUE;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh display_one_work(wp, 0, 0);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (!printed_header) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("No work structure matches found\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh}
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic int
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhpmcs_tag(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh{
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh struct pmcs_hw ss;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh uintmax_t tag_type = UINT_MAX;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh uintmax_t snum = UINT_MAX;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh uintmax_t index = UINT_MAX;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh int args = 0;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh void *pmcs_state;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh char *state_str;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh struct dev_info dip;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (!(flags & DCMD_ADDRSPEC)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh pmcs_state = NULL;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_readvar(&pmcs_state, "pmcs_softc_state") == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("can't read pmcs_softc_state");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_ERR);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_pwalk_dcmd("genunix`softstate", "pmcs`pmcs_tag", argc,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh argv, (uintptr_t)pmcs_state) == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("mdb_pwalk_dcmd failed");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_ERR);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_OK);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_getopts(argc, argv,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh 'i', MDB_OPT_UINT64, &index,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh 's', MDB_OPT_UINT64, &snum,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh 't', MDB_OPT_UINT64, &tag_type) != argc)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_USAGE);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh /*
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * Count the number of supplied options and make sure they are
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * within appropriate ranges. If they're set to UINT_MAX, that means
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * they were not supplied, in which case reset them to 0.
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh */
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (index != UINT_MAX) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh args++;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (index > PMCS_TAG_INDEX_MASK) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("Index is out of range\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_USAGE);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (tag_type != UINT_MAX) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh args++;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh switch (tag_type) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_TAG_TYPE_NONE:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_TAG_TYPE_CBACK:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case PMCS_TAG_TYPE_WAIT:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh default:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("Invalid tag type\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_USAGE);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (snum != UINT_MAX) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh args++;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (snum > (PMCS_TAG_SERNO_MASK >> PMCS_TAG_SERNO_SHIFT)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("Serial number is out of range\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_USAGE);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh /*
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * Make sure 1 and only 1 option is specified
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh */
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if ((args == 0) || (args > 1)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("Exactly one of -i, -s and -t must be specified\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_USAGE);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (MDB_RD(&ss, sizeof (ss), addr) == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh NOREAD(pmcs_hw_t, addr);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_ERR);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (MDB_RD(&dip, sizeof (struct dev_info), ss.dip) == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh NOREAD(pmcs_hw_t, addr);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_ERR);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh /* processing completed */
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (((flags & DCMD_ADDRSPEC) && !(flags & DCMD_LOOP)) ||
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh (flags & DCMD_LOOPFIRST)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if ((flags & DCMD_LOOP) && !(flags & DCMD_LOOPFIRST))
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%16s %9s %4s B C WorkFlags wserno DbgMsk %16s\n",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "Address", "State", "Inst", "DIP");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("================================="
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "============================================\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh switch (ss.state) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case STATE_NIL:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_str = "Invalid";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case STATE_PROBING:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_str = "Probing";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case STATE_RUNNING:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_str = "Running";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case STATE_UNPROBING:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_str = "Unprobing";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh case STATE_DEAD:
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_str = "Dead";
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh break;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler case STATE_IN_RESET:
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler state_str = "In Reset";
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler break;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh }
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%16p %9s %4d %1d %1d 0x%08x 0x%04x 0x%04x %16p\n", addr,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh state_str, dip.devi_instance, ss.blocked, ss.configuring,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh ss.work_flags, ss.wserno, ss.debug_mask, ss.dip);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_inc_indent(4);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh display_matching_work(ss, index, snum, tag_type);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_dec_indent(4);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh return (DCMD_OK);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh}
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#ifndef _KMDB
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollisterstatic int
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollisterpmcs_dump_fwlog(struct pmcs_hw *ss, int instance, const char *ofile)
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister{
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister uint8_t *fwlogp;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister int ofilefd = -1;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister char ofilename[MAXPATHLEN];
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister int rval = DCMD_OK;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (ss->fwlogp == NULL) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister mdb_warn("Firmware event log disabled for instance %d",
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister instance);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (DCMD_OK);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (snprintf(ofilename, MAXPATHLEN, "%s%d", ofile, instance) >
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister MAXPATHLEN) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister mdb_warn("Output filename is too long for instance %d",
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister instance);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (DCMD_ERR);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister fwlogp = mdb_alloc(PMCS_FWLOG_SIZE, UM_SLEEP);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (MDB_RD(fwlogp, PMCS_FWLOG_SIZE, ss->fwlogp) == -1) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister NOREAD(fwlogp, ss->fwlogp);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister rval = DCMD_ERR;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister goto cleanup;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister ofilefd = open(ofilename, O_WRONLY | O_CREAT,
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister S_IRUSR | S_IRGRP | S_IROTH);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (ofilefd < 0) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister mdb_warn("Unable to open '%s' to dump instance %d event log",
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister ofilename, instance);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister rval = DCMD_ERR;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister goto cleanup;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (write(ofilefd, fwlogp, PMCS_FWLOG_SIZE) != PMCS_FWLOG_SIZE) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister mdb_warn("Failed to write %d bytes to output file: instance %d",
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister PMCS_FWLOG_SIZE, instance);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister rval = DCMD_ERR;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister goto cleanup;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister mdb_printf("Event log for instance %d written to %s\n", instance,
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister ofilename);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollistercleanup:
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (ofilefd >= 0) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister close(ofilefd);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister mdb_free(fwlogp, PMCS_FWLOG_SIZE);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (rval);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister}
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollisterstatic int
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollisterpmcs_fwlog(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister{
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister void *pmcs_state;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister const char *ofile = NULL;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister struct pmcs_hw ss;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister struct dev_info dip;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (mdb_getopts(argc, argv, 'o', MDB_OPT_STR, &ofile, NULL) != argc) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (DCMD_USAGE);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (ofile == NULL) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister mdb_printf("No output file specified\n");
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (DCMD_USAGE);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (!(flags & DCMD_ADDRSPEC)) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister pmcs_state = NULL;
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (mdb_readvar(&pmcs_state, "pmcs_softc_state") == -1) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister mdb_warn("can't read pmcs_softc_state");
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (DCMD_ERR);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (mdb_pwalk_dcmd("genunix`softstate", "pmcs`pmcs_fwlog", argc,
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister argv, (uintptr_t)pmcs_state) == -1) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister mdb_warn("mdb_pwalk_dcmd failed for pmcs_log");
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (DCMD_ERR);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (DCMD_OK);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (MDB_RD(&ss, sizeof (ss), addr) == -1) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister NOREAD(pmcs_hw_t, addr);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (DCMD_ERR);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister if (MDB_RD(&dip, sizeof (struct dev_info), ss.dip) == -1) {
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister NOREAD(pmcs_hw_t, addr);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (DCMD_ERR);
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister }
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister return (pmcs_dump_fwlog(&ss, dip.devi_instance, ofile));
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister}
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#endif /* _KMDB */
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhstatic int
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhpmcs_log(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh{
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh void *pmcs_state;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh struct pmcs_hw ss;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh struct dev_info dip;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh const char *match_phy_path = NULL;
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana uint64_t match_sas_address = 0, tail_lines = 0;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister uint_t verbose = 0;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (!(flags & DCMD_ADDRSPEC)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_state = NULL;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (mdb_readvar(&pmcs_state, "pmcs_softc_state") == -1) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_warn("can't read pmcs_softc_state");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (DCMD_ERR);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (mdb_pwalk_dcmd("genunix`softstate", "pmcs`pmcs_log", argc,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh argv, (uintptr_t)pmcs_state) == -1) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_warn("mdb_pwalk_dcmd failed for pmcs_log");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (DCMD_ERR);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (DCMD_OK);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (mdb_getopts(argc, argv,
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana 'l', MDB_OPT_UINT64, &tail_lines,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh 'p', MDB_OPT_STR, &match_phy_path,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh 's', MDB_OPT_UINT64, &match_sas_address,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister 'v', MDB_OPT_SETBITS, TRUE, &verbose,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh NULL) != argc) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (DCMD_USAGE);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (MDB_RD(&ss, sizeof (ss), addr) == -1) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh NOREAD(pmcs_hw_t, addr);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (DCMD_ERR);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (MDB_RD(&dip, sizeof (struct dev_info), ss.dip) == -1) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh NOREAD(pmcs_hw_t, addr);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (DCMD_ERR);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (!(flags & DCMD_LOOP)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (pmcs_dump_tracelog(B_TRUE, dip.devi_instance,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister tail_lines, match_phy_path, match_sas_address, verbose));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh } else if (flags & DCMD_LOOPFIRST) {
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana return (pmcs_dump_tracelog(B_FALSE, 0, tail_lines,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister match_phy_path, match_sas_address, verbose));
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh } else {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh return (DCMD_OK);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh }
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh}
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic int
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh struct pmcs_hw ss;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t verbose = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t phy_info = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t hw_info = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t target_info = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t work_info = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t ic_info = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t iport_info = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t waitqs_info = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t ibq = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t obq = FALSE;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint_t tgt_phy_count = FALSE;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh uint_t compq = FALSE;
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh uint_t unconfigured = FALSE;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uint_t damap_info = FALSE;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed uint_t dtc_info = FALSE;
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister uint_t wserno = FALSE;
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister uint_t fwlog = FALSE;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister boolean_t devid_filter = FALSE;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uintptr_t pdevid;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister uint32_t devid;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int rv = DCMD_OK;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh void *pmcs_state;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *state_str;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct dev_info dip;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed per_iport_setting_t pis;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (!(flags & DCMD_ADDRSPEC)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_state = NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readvar(&pmcs_state, "pmcs_softc_state") == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("can't read pmcs_softc_state");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_pwalk_dcmd("genunix`softstate", "pmcs`pmcs", argc, argv,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (uintptr_t)pmcs_state) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("mdb_pwalk_dcmd failed");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_OK);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_getopts(argc, argv,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh 'c', MDB_OPT_SETBITS, TRUE, &compq,
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed 'd', MDB_OPT_SETBITS, TRUE, &dtc_info,
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister 'D', MDB_OPT_UINTPTR_SET, &devid_filter, &pdevid,
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister 'e', MDB_OPT_SETBITS, TRUE, &fwlog,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'h', MDB_OPT_SETBITS, TRUE, &hw_info,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'i', MDB_OPT_SETBITS, TRUE, &ic_info,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'I', MDB_OPT_SETBITS, TRUE, &iport_info,
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed 'm', MDB_OPT_SETBITS, TRUE, &damap_info,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'p', MDB_OPT_SETBITS, TRUE, &phy_info,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'q', MDB_OPT_SETBITS, TRUE, &ibq,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'Q', MDB_OPT_SETBITS, TRUE, &obq,
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister 's', MDB_OPT_SETBITS, TRUE, &wserno,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 't', MDB_OPT_SETBITS, TRUE, &target_info,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'T', MDB_OPT_SETBITS, TRUE, &tgt_phy_count,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh 'u', MDB_OPT_SETBITS, TRUE, &unconfigured,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'v', MDB_OPT_SETBITS, TRUE, &verbose,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'w', MDB_OPT_SETBITS, TRUE, &work_info,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh 'W', MDB_OPT_SETBITS, TRUE, &waitqs_info,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NULL) != argc)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_USAGE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed /*
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed * The 'd' and 'm' options implicitly enable the 'I' option
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed */
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed pis.pis_damap_info = damap_info;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed pis.pis_dtc_info = dtc_info;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed if (damap_info || dtc_info) {
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed iport_info = TRUE;
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed }
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister /*
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * The -D option is meaningless without -q and/or -Q, and implies
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister * verbosity.
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister */
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (devid_filter) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister devid = (uint64_t)pdevid & 0xffffffff;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (!ibq && !obq) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister mdb_printf("-D requires either -q or -Q\n");
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return (DCMD_USAGE);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister if (devid > PMCS_DEVICE_ID_MASK) {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister mdb_printf("Device ID invalid\n");
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister return (DCMD_USAGE);
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister verbose = TRUE;
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister }
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&ss, sizeof (ss), addr) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_hw_t, addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&dip, sizeof (struct dev_info), ss.dip) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NOREAD(pmcs_hw_t, addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (DCMD_ERR);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* processing completed */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (((flags & DCMD_ADDRSPEC) && !(flags & DCMD_LOOP)) ||
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (flags & DCMD_LOOPFIRST) || phy_info || target_info || hw_info ||
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh work_info || waitqs_info || ibq || obq || tgt_phy_count || compq ||
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister unconfigured || fwlog) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((flags & DCMD_LOOP) && !(flags & DCMD_LOOPFIRST))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%16s %9s %4s B C WorkFlags wserno DbgMsk %16s\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "Address", "State", "Inst", "DIP");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("================================="
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "============================================\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (ss.state) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case STATE_NIL:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh state_str = "Invalid";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case STATE_PROBING:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh state_str = "Probing";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case STATE_RUNNING:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh state_str = "Running";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case STATE_UNPROBING:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh state_str = "Unprobing";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case STATE_DEAD:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh state_str = "Dead";
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler case STATE_IN_RESET:
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler state_str = "In Reset";
5c45adf04db8ffdcb5dd969bb5203ff9b17677dbJesse Butler break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%16p %9s %4d %1d %1d 0x%08x 0x%04x 0x%04x %16p\n", addr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh state_str, dip.devi_instance, ss.blocked, ss.configuring,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ss.work_flags, ss.wserno, ss.debug_mask, ss.dip);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_inc_indent(4);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (waitqs_info)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh display_waitqs(ss, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (hw_info)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh display_hwinfo(ss, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phy_info || tgt_phy_count)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh display_phys(ss, verbose, NULL, 0, tgt_phy_count);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (target_info || tgt_phy_count)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh display_targets(ss, verbose, tgt_phy_count);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if (work_info || wserno)
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister display_work(ss, verbose, wserno);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ic_info)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh display_ic(ss, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ibq)
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister display_inbound_queues(ss, devid, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (obq)
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister display_outbound_queues(ss, devid, verbose);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (iport_info)
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed display_iport(ss, addr, verbose, &pis);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (compq)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh display_completion_queue(ss);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh if (unconfigured)
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh display_unconfigured_targets(addr);
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister if (fwlog)
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister display_event_log(ss);
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_dec_indent(4);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (rv);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_help()
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Prints summary information about each pmcs instance.\n"
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh " -c: Dump the completion queue\n"
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed " -d: Print per-iport information about device tree children\n"
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister " -D <device ID>: With -q/-Q, filter by device handle\n"
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister " -e: Display the in-memory firmware event log\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -h: Print more detailed hardware information\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -i: Print interrupt coalescing information\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -I: Print information about each iport\n"
f7aef0b0ce0e9a2c3da9c2e3aa9122f3642c1459Reed " -m: Print per-iport information about DAM/damap state\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -p: Print information about each attached PHY\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -q: Dump inbound queues\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -Q: Dump outbound queues\n"
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister " -s: Dump all work structures sorted by serial number\n"
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh " -t: Print information about each configured target\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -T: Print target and PHY count summary\n"
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh " -u: Show SAS address of all unconfigured targets\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -w: Dump work structures\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -W: List pmcs cmds waiting on various queues\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -v: Add verbosity to the above options\n");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhvoid
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdhpmcs_log_help()
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh{
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh mdb_printf("Dump the pmcs log buffer, possibly with filtering.\n"
601c90f161ff0319c1b4a2c3362b466043a65d8dSrikanth, Ramana " -l TAIL_LINES: Dump the last TAIL_LINES messages\n"
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh " -p PHY_PATH: Dump messages matching PHY_PATH\n"
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh " -s SAS_ADDRESS: Dump messages matching SAS_ADDRESS\n\n"
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh "Where: PHY_PATH can be found with ::pmcs -p (e.g. pp04.18.18.01)\n"
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh " SAS_ADDRESS can be found with ::pmcs -t "
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh "(e.g. 5000c5000358c221)\n");
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh}
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhvoid
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhpmcs_tag_help()
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh{
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("Print all work structures by matching the tag.\n"
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh " -i index: Match tag index (0x000 - 0xfff)\n"
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh " -s serialnumber: Match serial number (0x0000 - 0xffff)\n"
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh " -t tagtype: Match tag type [NONE(1), CBACK(2), "
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "WAIT(3)]\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh}
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic const mdb_dcmd_t dcmds[] = {
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister { "pmcs", "?[-cdehiImpQqtTuwWv] [-D <device ID>]",
65e70c04884b95e29d10e9933a3d55f0ec5af3beDavid Hollister "print pmcs information", pmcs_dcmd, pmcs_help
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh },
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh { "pmcs_log",
1f81b46471e38fdeb9ab74c25510b2f903f8af12David Hollister "?[-v] [-p PHY_PATH | -s SAS_ADDRESS | -l TAIL_LINES]",
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh "dump pmcs log file", pmcs_log, pmcs_log_help
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh },
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh { "pmcs_tag", "?[-t tagtype|-s serialnum|-i index]",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "Find work structures by tag type, serial number or index",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh pmcs_tag, pmcs_tag_help
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh },
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#ifndef _KMDB
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister { "pmcs_fwlog",
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister "?-o output_file",
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister "dump pmcs firmware event log to output_file", pmcs_fwlog, NULL
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister },
9719310a57482091af0a7f0ee31b5e2eec35f154David Hollister#endif /* _KMDB */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh { NULL }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh};
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic const mdb_walker_t walkers[] = {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh { "pmcs_targets", "walk target structures",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh targets_walk_i, targets_walk_s, targets_walk_f },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh { "pmcs_phys", "walk PHY structures",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_walk_i, phy_walk_s, phy_walk_f },
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh { NULL }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh};
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic const mdb_modinfo_t modinfo = {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh MDB_API_VERSION, dcmds, walkers
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh};
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhconst mdb_modinfo_t *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh_mdb_init(void)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (&modinfo);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}