pmcs.c revision b18a19c275d2531444fcd2f66664cbe3c6897f6a
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * See the License for the specific language governing permissions
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * and limitations under the License.
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 * CDDL HEADER END
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Use is subject to license terms.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define NOREAD(a, b) mdb_warn("could not read " #a " at 0x%p", b)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic uint32_t sas_phys, sata_phys, exp_phys, num_expanders, empty_phys;
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic void display_one_work(pmcwork_t *wp, int verbose, int idx);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readvar(&msec_per_tick, "msec_per_tick") == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_iport_phy_walk_cb(uintptr_t addr, const void *wdata, void *priv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sizeof (struct pmcs_phy)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_iport_walk_cb(uintptr_t addr, const void *wdata, void *priv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(&iport, sizeof (struct pmcs_iport), addr) !=
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sizeof (struct pmcs_iport)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_snprintf(portid, sizeof (portid), "%d", iport.portid);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Standard iport unit address */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("UA %-16s %16s %8s %8s %16s", "Iport", "UA State",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%2s %16p %16s %8s %8d %16p\n", unit_address, addr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Temporary iport unit address */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%-32s %16s %20s %8s %8s %16s", "UA", "Iport",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%32s %16p %20s %8s %8d %16p\n", unit_address, addr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return (0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_iport(struct pmcs_hw m, uintptr_t addr, int verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh list_addr = (uintptr_t)(addr + offsetof(struct pmcs_hw, iports));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_pwalk("list", pmcs_iport_walk_cb, NULL, list_addr) == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic void
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_vread(&work, sizeof (pmcwork_t), (uintptr_t)ccb.pwrk)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh != sizeof (pmcwork_t)) {
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
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (m.fwlog == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_targets(struct pmcs_hw m, int verbose, int totals_only)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t sas_targets = 0, smp_targets = 0, sata_targets = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh targets = mdb_alloc(sizeof (targets) * max_dev, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(targets, sizeof (targets) * max_dev, m.targets) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("VTGT %-16s %-16s %-5s %8s %s", "SAS Address",
b18a19c275d2531444fcd2f66664cbe3c6897f6aJesse Butler * It has to be new or assigned to be of interest.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "Configured targets:", (sas_targets + sata_targets + smp_targets),
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic char *
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh switch (state) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (idx = 0; idx < m.max_cmd; idx++, _wp += sizeof (pmcwork_t)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhprint_spcmd(pmcs_cmd_t *sp, void *kaddr, int printhdr, int verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh kaddr, sp->cmd_pkt, sp->cmd_clist, sp->cmd_tag, sp->cmd_satltag);
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * If we're printing verbose, dump the CDB as well.
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh sizeof (struct scsi_pkt)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*ARGSUSED1*/
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh targets = mdb_alloc(sizeof (targets) * max_dev, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(targets, sizeof (targets) * max_dev, m.targets) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; i < max_dev; i++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (sp) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("UNKNOWN");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("I/O");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("Other");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (qnum) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("I/O");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("General");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("Events");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("UNKNOWN");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (cat) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("NET");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("FC");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SCSI");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("???");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (opcode) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("ECHO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_VPD");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("PHY_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("PHY_STOP");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_TM_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_EXT_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_HANDLE_ACCEPT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TGT_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TGT_RESPONSE_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_EDC_EXT_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("INI_EDC_EXT_IO_START1");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TGT_EDC_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEREGISTER_DEVICE_HANDLE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_HANDLE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_REQUEST");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_RESPONSE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("ASSISTED_DISCOVERY");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("REGISTER_DEVICE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_HOST_IO_START");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("LOCAL_PHY_CONTROL");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TWI");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("FW_FLASH_UPDATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_VPD");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GPIO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_DIAG_MODE_START_END");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_DIAG_EXECUTE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_HW_EVENT_ACK");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_TIME_STAMP");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("PORT_CONTROL");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_NVMD_DATA");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_NVMD_DATA");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_DEVICE_STATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_STATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("UNKNOWN");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic char *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (opcode) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("ECHO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_VPD");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_HW_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_COMPLETION");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_COMPLETION");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("LOCAL_PHY_CONTROL");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_ASSISTED_DISCOVERY_SENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_ASSISTED_DISCOVERY_SENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_REGISTRATION");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEREGISTER_DEVICE_HANDLE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_HANDLE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_COMPLETION");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_HANDLE_ARRIVED");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_REQUEST_RECEIVED");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_REQUEST_RECEIVED");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("FW_FLASH_UPDATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_VPD");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GPIO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GPIO_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GENERAL_EVENT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("TWI");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SSP_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SATA_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_DIAG_MODE_START_END");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_DIAG_EXECUTE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_TIME_STAMP");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SAS_HW_EVENT_ACK_ACK");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("PORT_CONTROL");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SKIP_ENTRIES");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SMP_ABORT");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_NVMD_DATA");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_NVMD_DATA");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("DEVICE_HANDLE_REMOVED");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_DEVICE_STATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("GET_DEVICE_STATE");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("SET_DEVICE_INFO");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return ("UNKNOWN");
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh iomb_cat((word0 & PMCS_IOMB_CAT_MASK) >> PMCS_IOMB_CAT_SHIFT));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (qeidx = 1; qeidx < (PMCS_QENTRY_SIZE / 4); qeidx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_outbound_queues(struct pmcs_hw ss, uint_t verbose)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t *qentryp = mdb_alloc(PMCS_QENTRY_SIZE, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Outbound Queue #%d (Queue Type = %s)\n", qidx,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Chip is the producer, so read the actual producer index
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * and not the driver's version
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh iomb_cat((word0 & PMCS_IOMB_CAT_MASK) >> PMCS_IOMB_CAT_SHIFT));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (qeidx = 2; qeidx < (PMCS_QENTRY_SIZE / 4); qeidx++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t *qentryp = mdb_alloc(PMCS_QENTRY_SIZE, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Inbound Queue #%d (Queue Type = %s)\n", qidx,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (iqci == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_phy(struct pmcs_phy phy, int verbose, int totals_only)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhdisplay_phys(struct pmcs_hw ss, int verbose, struct pmcs_phy *parent, int level,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (level == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (level == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (level == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "Occupied PHYs:",
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 /* Get the address of the first element */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Get the total number */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readvar(&tbuf_num_elems, "pmcs_tbuf_num_elems") == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Get the current index */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Indicator as to whether the buffer has wrapped */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Figure out where we start and stop */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Dump the buffer contents */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh while (elems_to_print != 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&tbuf, sizeof (pmcs_tbuf_t), (tbuf_addr + idx))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Skip the driver name */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* Get the instance */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Address provided belongs to HBA softstate. Get the targets pointer
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to begin the walk.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(&ss, sizeof (pmcs_hw_t), wsp->walk_addr) !=
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sizeof (pmcs_hw_t)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh targets = mdb_alloc(sizeof (targets) * ss.max_dev, UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(targets, sizeof (targets) * ss.max_dev, ss.targets) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_data = mdb_alloc(sizeof (pmcs_xscsi_t), UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_warn("Failed to read target at %p", (void *)wsp->walk_addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh } while ((wsp->walk_addr == NULL) && (target_idx < ss.max_dev));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * First, if this is a root PHY, there are no more siblings
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Otherwise, next sibling is the parent's sibling
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Address provided belongs to HBA softstate. Get the targets pointer
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to begin the walk.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_vread(&ss, sizeof (pmcs_hw_t), wsp->walk_addr) !=
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh sizeof (pmcs_hw_t)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wsp->walk_data = mdb_alloc(sizeof (pmcs_phy_t), UM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
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.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstatic void
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhstatic void
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhdisplay_matching_work(struct pmcs_hw ss, uintmax_t index, uintmax_t snum,
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh for (idx = 0; idx < ss.max_cmd; idx++, _wp += sizeof (pmcwork_t)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdhpmcs_tag(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_readvar(&pmcs_state, "pmcs_softc_state") == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (mdb_pwalk_dcmd("genunix`softstate", "pmcs`pmcs_tag", argc,
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 if (snum > (PMCS_TAG_SERNO_MASK >> PMCS_TAG_SERNO_SHIFT)) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh * Make sure 1 and only 1 option is specified
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_warn("Exactly one of -i, -s and -t must be specified\n");
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh if (MDB_RD(&dip, sizeof (struct dev_info), ss.dip) == -1) {
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh /* processing completed */
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh mdb_printf("%16s %9s %4s B C WorkFlags wserno DbgMsk %16s\n",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "============================================\n");
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,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_readvar(&pmcs_state, "pmcs_softc_state") == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (mdb_pwalk_dcmd("genunix`softstate", "pmcs`pmcs", argc, argv,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (MDB_RD(&dip, sizeof (struct dev_info), ss.dip) == -1) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Dumping the trace log is special. It's global, not per-HBA.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Thus, a provided address is ignored. In addition, other options
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * cannot be specified at the same time.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (hw_info || ic_info || iport_info || phy_info || work_info ||
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh target_info || waitqs_info || ibq || obq || tgt_phy_count ||
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh /* processing completed */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (flags & DCMD_LOOPFIRST) || phy_info || target_info || hw_info ||
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh work_info || waitqs_info || ibq || obq || tgt_phy_count || compq) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("%16s %9s %4s B C WorkFlags wserno DbgMsk %16s\n",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "============================================\n");
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 return (rv);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh mdb_printf("Prints summary information about each pmcs instance.\n"
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh " -c: Dump the completion queue\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -h: Print more detailed hardware information\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -i: Print interrupt coalescing information\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -I: Print information about each iport\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -l: Dump the trace log (cannot be used with other options)\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -p: Print information about each attached PHY\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -q: Dump inbound queues\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -Q: Dump outbound queues\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -t: Print information about each known target\n"
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh " -T: Print target and PHY count summary\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");
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 { "pmcs", "?[-chiIpQqtTwWv] | -l", "print pmcs information",
14d6cf0a831fafb130183d4a32c30acbe84b9f4bdh "Find work structures by tag type, serial number or index",