Print this page
4546 mpt_sas needs enhancing to support LSI MPI2.5

*** 148,163 **** mdb_printf("\n"); return (0); } void ! mdi_info(struct mptsas m, int target) { struct dev_info d; struct mdi_phci p; ! if (mdb_vread(&d, sizeof (d), (uintptr_t)m.m_dip) == -1) { mdb_warn("couldn't read m_dip"); return; } if (MDI_PHCI(&d)) { --- 148,163 ---- mdb_printf("\n"); return (0); } void ! mdi_info(struct mptsas *mp, int target) { struct dev_info d; struct mdi_phci p; ! if (mdb_vread(&d, sizeof (d), (uintptr_t)mp->m_dip) == -1) { mdb_warn("couldn't read m_dip"); return; } if (MDI_PHCI(&d)) {
*** 299,354 **** mdb_free(prev, mh.rh_obj_size); return (rp); } void ! display_targets(struct mptsas *mp) { mptsas_target_t *ptgt; mptsas_smp_t *psmp; mdb_printf("\n"); ! mdb_printf("The SCSI target information\n"); ! for (ptgt = (mptsas_target_t *)krefhash_first((uintptr_t)mp->m_targets); ! ptgt != NULL; ! ptgt = krefhash_next((uintptr_t)mp->m_targets, ptgt)) { ! mdb_printf("\n"); ! mdb_printf("devhdl %x, sasaddress %"PRIx64", phymask %x," ! "devinfo %x\n", ptgt->m_devhdl, ptgt->m_addr.mta_wwn, ! ptgt->m_addr.mta_phymask, ptgt->m_deviceinfo); ! mdb_printf("throttle %x, dr_flag %x, m_t_ncmds %x, " ! "enclosure %x, slot_num %x\n", ptgt->m_t_throttle, ! ptgt->m_dr_flag, ptgt->m_t_ncmds, ptgt->m_enclosure, ! ptgt->m_slot_num); ! } ! ! mdb_printf("\n"); ! mdb_printf("The smp child information\n"); ! for (psmp = (mptsas_smp_t *)krefhash_first( ! (uintptr_t)mp->m_smp_targets); ! psmp != NULL; ! psmp = krefhash_next((uintptr_t)mp->m_smp_targets, psmp)) { ! mdb_printf("\n"); ! mdb_printf("devhdl %x, sasaddress %"PRIx64", phymask %x \n", ! psmp->m_devhdl, psmp->m_addr.mta_wwn, ! psmp->m_addr.mta_phymask); ! } ! mdb_printf("\n"); ! #if 0 ! mdb_printf("targ wwn ncmds throttle " ! "dr_flag timeout dups\n"); mdb_printf("-------------------------------" "--------------------------------\n"); ! for (i = 0; i < MPTSAS_MAX_TARGETS; i++) { ! if (s->m_target[i].m_addr.mta_wwn || ! s->m_target[i].m_deviceinfo) { ! mdb_printf("%4d ", i); ! if (s->m_target[i].m_addr.mta_wwn) mdb_printf("%"PRIx64" ", ! s->m_target[i].m_addr.mta_wwn); ! mdb_printf("%3d", s->m_target[i].m_t_ncmds); ! switch (s->m_target[i].m_t_throttle) { case QFULL_THROTTLE: mdb_printf(" QFULL "); break; case DRAIN_THROTTLE: mdb_printf(" DRAIN "); --- 299,332 ---- mdb_free(prev, mh.rh_obj_size); return (rp); } void ! display_targets(struct mptsas *mp, uint_t verbose) { mptsas_target_t *ptgt; mptsas_smp_t *psmp; + int loop, comma; mdb_printf("\n"); ! mdb_printf("slot devhdl wwn ncmds throttle " ! "dr_flag dups\n"); mdb_printf("-------------------------------" "--------------------------------\n"); ! for (ptgt = (mptsas_target_t *)krefhash_first( ! (uintptr_t)mp->m_targets); ! ptgt != NULL; ! ptgt = krefhash_next((uintptr_t)mp->m_targets, ptgt)) { ! if (ptgt->m_addr.mta_wwn || ! ptgt->m_deviceinfo) { ! mdb_printf("%4d ", ptgt->m_slot_num); ! mdb_printf("%4d ", ptgt->m_devhdl); ! if (ptgt->m_addr.mta_wwn) mdb_printf("%"PRIx64" ", ! ptgt->m_addr.mta_wwn); ! mdb_printf("%3d", ptgt->m_t_ncmds); ! switch (ptgt->m_t_throttle) { case QFULL_THROTTLE: mdb_printf(" QFULL "); break; case DRAIN_THROTTLE: mdb_printf(" DRAIN ");
*** 357,463 **** mdb_printf(" HOLD "); break; case MAX_THROTTLE: mdb_printf(" MAX "); break; - case CHOKE_THROTTLE: - mdb_printf(" CHOKE "); - break; default: mdb_printf("%8d ", ! s->m_target[i].m_t_throttle); } ! switch (s->m_target[i].m_dr_flag) { case MPTSAS_DR_INACTIVE: mdb_printf(" INACTIVE "); break; ! case MPTSAS_DR_PRE_OFFLINE_TIMEOUT: ! mdb_printf(" TIMEOUT "); ! break; ! case MPTSAS_DR_PRE_OFFLINE_TIMEOUT_NO_CANCEL: ! mdb_printf("TIMEOUT_NC "); ! break; ! case MPTSAS_DR_OFFLINE_IN_PROGRESS: ! mdb_printf(" OFFLINING "); ! break; ! case MPTSAS_DR_ONLINE_IN_PROGRESS: ! mdb_printf(" ONLINING "); break; default: mdb_printf(" UNKNOWN "); break; } ! mdb_printf("%3d/%-3d %d/%d\n", ! s->m_target[i].m_dr_timeout, m.m_offline_delay, ! s->m_target[i].m_dr_online_dups, ! s->m_target[i].m_dr_offline_dups); if (verbose) { mdb_inc_indent(5); ! if ((s->m_target[i].m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) == MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER) mdb_printf("Fanout expander: "); ! if ((s->m_target[i].m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) == MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER) mdb_printf("Edge expander: "); ! if ((s->m_target[i].m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) == MPI2_SAS_DEVICE_INFO_END_DEVICE) mdb_printf("End device: "); ! if ((s->m_target[i].m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) == MPI2_SAS_DEVICE_INFO_NO_DEVICE) mdb_printf("No device "); for (loop = 0, comma = 0; loop < (sizeof (devinfo_array) / sizeof (devinfo_array[0])); loop++) { ! if (s->m_target[i].m_deviceinfo & devinfo_array[loop].value) { mdb_printf("%s%s", (comma ? ", " : ""), devinfo_array[loop].text); comma++; } } mdb_printf("\n"); ! ! if (s->m_target[i].m_tgt_dip) { *target_path = 0; if (construct_path((uintptr_t) ! s->m_target[i].m_tgt_dip, target_path) == DCMD_OK) mdb_printf("%s\n", target_path); } ! mdi_info(m, i); mdb_dec_indent(5); } } } ! #endif } int ! display_slotinfo() { - #if 0 int i, nslots; struct mptsas_cmd c, *q, *slots; int header_output = 0; int rv = DCMD_OK; int slots_in_use = 0; int tcmds = 0; int mismatch = 0; int wq, dq; int ncmds = 0; ulong_t saved_indent; nslots = s->m_n_normal; - slots = mdb_alloc(sizeof (mptsas_cmd_t) * nslots, UM_SLEEP); for (i = 0; i < nslots; i++) if (s->m_slot[i]) { slots_in_use++; --- 335,438 ---- mdb_printf(" HOLD "); break; case MAX_THROTTLE: mdb_printf(" MAX "); break; default: mdb_printf("%8d ", ! ptgt->m_t_throttle); } ! switch (ptgt->m_dr_flag) { case MPTSAS_DR_INACTIVE: mdb_printf(" INACTIVE "); break; ! case MPTSAS_DR_INTRANSITION: ! mdb_printf("TRANSITION "); break; default: mdb_printf(" UNKNOWN "); break; } ! mdb_printf("%d\n", ptgt->m_dups); if (verbose) { mdb_inc_indent(5); ! if ((ptgt->m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) == MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER) mdb_printf("Fanout expander: "); ! if ((ptgt->m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) == MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER) mdb_printf("Edge expander: "); ! if ((ptgt->m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) == MPI2_SAS_DEVICE_INFO_END_DEVICE) mdb_printf("End device: "); ! if ((ptgt->m_deviceinfo & MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) == MPI2_SAS_DEVICE_INFO_NO_DEVICE) mdb_printf("No device "); for (loop = 0, comma = 0; loop < (sizeof (devinfo_array) / sizeof (devinfo_array[0])); loop++) { ! if (ptgt->m_deviceinfo & devinfo_array[loop].value) { mdb_printf("%s%s", (comma ? ", " : ""), devinfo_array[loop].text); comma++; } } mdb_printf("\n"); ! #if 0 ! if (ptgt->m_tgt_dip) { ! char target_path[PATH_MAX]; *target_path = 0; if (construct_path((uintptr_t) ! ptgt->m_tgt_dip, target_path) == DCMD_OK) mdb_printf("%s\n", target_path); } ! #endif ! mdi_info(mp, ptgt->m_slot_num); mdb_dec_indent(5); } } } ! ! mdb_printf("\n"); ! mdb_printf("The smp child information\n"); ! for (psmp = (mptsas_smp_t *)krefhash_first( ! (uintptr_t)mp->m_smp_targets); ! psmp != NULL; ! psmp = krefhash_next((uintptr_t)mp->m_smp_targets, psmp)) { ! mdb_printf("\n"); ! mdb_printf("devhdl %x, sasaddress %"PRIx64", phymask %x \n", ! psmp->m_devhdl, psmp->m_addr.mta_wwn, ! psmp->m_addr.mta_phymask); ! } } int ! display_slotinfo(struct mptsas *mp, struct mptsas_slots *s) { int i, nslots; struct mptsas_cmd c, *q, *slots; + mptsas_target_t *ptgt; int header_output = 0; int rv = DCMD_OK; int slots_in_use = 0; int tcmds = 0; int mismatch = 0; int wq, dq; int ncmds = 0; ulong_t saved_indent; nslots = s->m_n_normal; slots = mdb_alloc(sizeof (mptsas_cmd_t) * nslots, UM_SLEEP); for (i = 0; i < nslots; i++) if (s->m_slot[i]) { slots_in_use++;
*** 470,507 **** tcmds++; if (i != slots[i].cmd_slot) mismatch++; } ! for (q = m.m_waitq, wq = 0; q; q = c.cmd_linkp, wq++) if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) { mdb_warn("couldn't follow m_waitq"); rv = DCMD_ERR; goto exit; } ! for (q = m.m_doneq, dq = 0; q; q = c.cmd_linkp, dq++) if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) { mdb_warn("couldn't follow m_doneq"); rv = DCMD_ERR; goto exit; } ! for (i = 0; i < MPTSAS_MAX_TARGETS; i++) ! ncmds += s->m_target[i].m_t_ncmds; mdb_printf("\n"); mdb_printf(" mpt. slot mptsas_slots slot"); mdb_printf("\n"); mdb_printf("m_ncmds total" " targ throttle m_t_ncmds targ_tot wq dq"); mdb_printf("\n"); mdb_printf("----------------------------------------------------"); mdb_printf("\n"); ! mdb_printf("%7d ", m.m_ncmds); ! mdb_printf("%s", (m.m_ncmds == slots_in_use ? " " : "!=")); mdb_printf("%3d total %3d ", slots_in_use, ncmds); mdb_printf("%s", (tcmds == ncmds ? " " : " !=")); mdb_printf("%3d %2d %2d\n", tcmds, wq, dq); saved_indent = mdb_dec_indent(0); --- 445,489 ---- tcmds++; if (i != slots[i].cmd_slot) mismatch++; } ! for (q = mp->m_waitq, wq = 0; q; q = c.cmd_linkp, wq++) if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) { mdb_warn("couldn't follow m_waitq"); rv = DCMD_ERR; goto exit; } ! for (q = mp->m_doneq, dq = 0; q; q = c.cmd_linkp, dq++) if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) { mdb_warn("couldn't follow m_doneq"); rv = DCMD_ERR; goto exit; } ! for (ptgt = (mptsas_target_t *)krefhash_first( ! (uintptr_t)mp->m_targets); ! ptgt != NULL; ! ptgt = krefhash_next((uintptr_t)mp->m_targets, ptgt)) { ! if (ptgt->m_addr.mta_wwn || ! ptgt->m_deviceinfo) { ! ncmds += ptgt->m_t_ncmds; ! } ! } mdb_printf("\n"); mdb_printf(" mpt. slot mptsas_slots slot"); mdb_printf("\n"); mdb_printf("m_ncmds total" " targ throttle m_t_ncmds targ_tot wq dq"); mdb_printf("\n"); mdb_printf("----------------------------------------------------"); mdb_printf("\n"); ! mdb_printf("%7d ", mp->m_ncmds); ! mdb_printf("%s", (mp->m_ncmds == slots_in_use ? " " : "!=")); mdb_printf("%3d total %3d ", slots_in_use, ncmds); mdb_printf("%s", (tcmds == ncmds ? " " : " !=")); mdb_printf("%3d %2d %2d\n", tcmds, wq, dq); saved_indent = mdb_dec_indent(0);
*** 530,541 **** (void) print_cdb(&slots[i]); } /* print the wait queue */ ! for (q = m.m_waitq; q; q = c.cmd_linkp) { ! if (q == m.m_waitq) mdb_printf("\n"); if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) { mdb_warn("couldn't follow m_waitq"); rv = DCMD_ERR; --- 512,523 ---- (void) print_cdb(&slots[i]); } /* print the wait queue */ ! for (q = mp->m_waitq; q; q = c.cmd_linkp) { ! if (q == mp->m_waitq) mdb_printf("\n"); if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) { mdb_warn("couldn't follow m_waitq"); rv = DCMD_ERR;
*** 547,558 **** print_cdb(&c); } /* print the done queue */ ! for (q = m.m_doneq; q; q = c.cmd_linkp) { ! if (q == m.m_doneq) mdb_printf("\n"); if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) { mdb_warn("couldn't follow m_doneq"); rv = DCMD_ERR; --- 529,540 ---- print_cdb(&c); } /* print the done queue */ ! for (q = mp->m_doneq; q; q = c.cmd_linkp) { ! if (q == mp->m_doneq) mdb_printf("\n"); if (mdb_vread(&c, sizeof (mptsas_cmd_t), (uintptr_t)q) == -1) { mdb_warn("couldn't follow m_doneq"); rv = DCMD_ERR;
*** 564,574 **** print_cdb(&c); } mdb_inc_indent(saved_indent); ! if (m.m_ncmds != slots_in_use) mdb_printf("WARNING: mpt.m_ncmds does not match the number of " "slots in use\n"); if (tcmds != ncmds) mdb_printf("WARNING: the total of m_target[].m_t_ncmds does " --- 546,556 ---- print_cdb(&c); } mdb_inc_indent(saved_indent); ! if (mp->m_ncmds != slots_in_use) mdb_printf("WARNING: mpt.m_ncmds does not match the number of " "slots in use\n"); if (tcmds != ncmds) mdb_printf("WARNING: the total of m_target[].m_t_ncmds does "
*** 578,588 **** mdb_printf("WARNING: corruption in slot table, " "m_slot[].cmd_slot incorrect\n"); /* now check for corruptions */ ! for (q = m.m_waitq; q; q = c.cmd_linkp) { for (i = 0; i < nslots; i++) if (s->m_slot[i] == q) mdb_printf("WARNING: m_waitq entry" "(mptsas_cmd_t) %p is in m_slot[%i]\n", q, i); --- 560,570 ---- mdb_printf("WARNING: corruption in slot table, " "m_slot[].cmd_slot incorrect\n"); /* now check for corruptions */ ! for (q = mp->m_waitq; q; q = c.cmd_linkp) { for (i = 0; i < nslots; i++) if (s->m_slot[i] == q) mdb_printf("WARNING: m_waitq entry" "(mptsas_cmd_t) %p is in m_slot[%i]\n", q, i);
*** 592,602 **** rv = DCMD_ERR; goto exit; } } ! for (q = m.m_doneq; q; q = c.cmd_linkp) { for (i = 0; i < nslots; i++) if (s->m_slot[i] == q) mdb_printf("WARNING: m_doneq entry " "(mptsas_cmd_t) %p is in m_slot[%i]\n", q, i); --- 574,584 ---- rv = DCMD_ERR; goto exit; } } ! for (q = mp->m_doneq; q; q = c.cmd_linkp) { for (i = 0; i < nslots; i++) if (s->m_slot[i] == q) mdb_printf("WARNING: m_doneq entry " "(mptsas_cmd_t) %p is in m_slot[%i]\n", q, i);
*** 620,633 **** } exit: mdb_free(slots, sizeof (mptsas_cmd_t) * nslots); return (rv); - #endif - mdb_printf("\n"); - mdb_printf("The slot information is not implemented yet\n"); - return (0); } void display_deviceinfo(struct mptsas *mp) { --- 602,611 ----
*** 637,720 **** if (construct_path((uintptr_t)mp->m_dip, device_path) != DCMD_OK) { strcpy(device_path, "couldn't determine device path"); } mdb_printf("\n"); - mdb_printf("Path in device tree %s\n", device_path); - #if 0 mdb_printf("base_wwid phys " ! "mptid prodid devid revid ssid\n"); mdb_printf("-----------------------------" "----------------------------------\n"); ! mdb_printf("%"PRIx64" %2d %3d " ! "0x%04x 0x%04x ", m.un.m_base_wwid, m.m_num_phys, m.m_mptid, ! m.m_productid, m.m_devid); ! switch (m.m_devid) { ! case MPTSAS_909: ! mdb_printf("(909) "); ! break; ! case MPTSAS_929: ! mdb_printf("(929) "); ! break; ! case MPTSAS_919: ! mdb_printf("(919) "); ! break; ! case MPTSAS_1030: ! mdb_printf("(1030) "); ! break; ! case MPTSAS_1064: ! mdb_printf("(1064) "); ! break; ! case MPTSAS_1068: ! mdb_printf("(1068) "); ! break; ! case MPTSAS_1064E: ! mdb_printf("(1064E) "); ! break; ! case MPTSAS_1068E: ! mdb_printf("(1068E) "); break; default: ! mdb_printf("(?????) "); break; } ! mdb_printf("0x%02x 0x%04x\n", m.m_revid, m.m_ssid); mdb_printf("%s\n", device_path); for (i = 0; i < MAX_MPI2_PORTS; i++) { if (i%4 == 0) mdb_printf("\n"); mdb_printf("%d:", i); ! switch (m.m_port_type[i]) { case MPI2_PORTFACTS_PORTTYPE_INACTIVE: mdb_printf("inactive ", ! m.m_protocol_flags[i]); break; case MPI2_PORTFACTS_PORTTYPE_SCSI: mdb_printf("SCSI (0x%1x) ", ! m.m_protocol_flags[i]); break; case MPI2_PORTFACTS_PORTTYPE_FC: mdb_printf("FC (0x%1x) ", ! m.m_protocol_flags[i]); break; case MPI2_PORTFACTS_PORTTYPE_ISCSI: mdb_printf("iSCSI (0x%1x) ", ! m.m_protocol_flags[i]); break; case MPI2_PORTFACTS_PORTTYPE_SAS: mdb_printf("SAS (0x%1x) ", ! m.m_protocol_flags[i]); break; default: mdb_printf("unknown "); } } #endif mdb_printf("\n"); } static int mptsas_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) { --- 615,733 ---- if (construct_path((uintptr_t)mp->m_dip, device_path) != DCMD_OK) { strcpy(device_path, "couldn't determine device path"); } mdb_printf("\n"); mdb_printf("base_wwid phys " ! " prodid devid revid ssid\n"); mdb_printf("-----------------------------" "----------------------------------\n"); ! mdb_printf("%"PRIx64" %2d " ! "0x%04x 0x%04x ", mp->un.m_base_wwid, mp->m_num_phys, ! mp->m_productid, mp->m_devid); ! switch (mp->m_devid) { ! case MPI2_MFGPAGE_DEVID_SAS2004: ! mdb_printf("(SAS2004) "); ! break; ! case MPI2_MFGPAGE_DEVID_SAS2008: ! mdb_printf("(SAS2008) "); ! break; ! case MPI2_MFGPAGE_DEVID_SAS2108_1: ! case MPI2_MFGPAGE_DEVID_SAS2108_2: ! case MPI2_MFGPAGE_DEVID_SAS2108_3: ! mdb_printf("(SAS2108) "); ! break; ! case MPI2_MFGPAGE_DEVID_SAS2116_1: ! case MPI2_MFGPAGE_DEVID_SAS2116_2: ! mdb_printf("(SAS2116) "); ! break; ! case MPI2_MFGPAGE_DEVID_SAS2208_1: ! case MPI2_MFGPAGE_DEVID_SAS2208_2: ! case MPI2_MFGPAGE_DEVID_SAS2208_3: ! case MPI2_MFGPAGE_DEVID_SAS2208_4: ! case MPI2_MFGPAGE_DEVID_SAS2208_5: ! case MPI2_MFGPAGE_DEVID_SAS2208_6: ! #if 0 ! /* Same as 2308_1/2 ?? */ ! case MPI2_MFGPAGE_DEVID_SAS2208_7: ! case MPI2_MFGPAGE_DEVID_SAS2208_8: ! #endif ! mdb_printf("(SAS2208) "); break; default: ! mdb_printf("(SAS????) "); break; } ! mdb_printf("0x%02x 0x%04x\n", mp->m_revid, mp->m_ssid); mdb_printf("%s\n", device_path); + #if 0 for (i = 0; i < MAX_MPI2_PORTS; i++) { if (i%4 == 0) mdb_printf("\n"); mdb_printf("%d:", i); ! switch (mp->m_port_type[i]) { case MPI2_PORTFACTS_PORTTYPE_INACTIVE: mdb_printf("inactive ", ! mp->m_protocol_flags[i]); break; case MPI2_PORTFACTS_PORTTYPE_SCSI: mdb_printf("SCSI (0x%1x) ", ! mp->m_protocol_flags[i]); break; case MPI2_PORTFACTS_PORTTYPE_FC: mdb_printf("FC (0x%1x) ", ! mp->m_protocol_flags[i]); break; case MPI2_PORTFACTS_PORTTYPE_ISCSI: mdb_printf("iSCSI (0x%1x) ", ! mp->m_protocol_flags[i]); break; case MPI2_PORTFACTS_PORTTYPE_SAS: mdb_printf("SAS (0x%1x) ", ! mp->m_protocol_flags[i]); break; default: mdb_printf("unknown "); } } + mdb_printf("\n"); #endif + } + + void + dump_debug_log(struct mptsas *mp) + { + uint_t idx; + char *logbuf; + int i; + + if (mdb_readsym(&idx, sizeof (uint_t), + "mptsas_dbglog_idx") == -1) { + mdb_warn("No debug log buffer present"); + return; + } + logbuf = mdb_alloc(16*256, UM_SLEEP); + if (idx == 0) { + mdb_warn("Logging turned off"); + return; + } + + if (mdb_readsym(logbuf, 16*256, + "mptsas_dbglog_bufs") == -1) { + mdb_warn("No debug log buffer present"); + return; + } mdb_printf("\n"); + idx &= 0xf; + for (i = 0; i < 16; i++) { + mdb_printf("%s\n", &logbuf[idx*256]); + idx = (idx+1) & 0xf; + } + mdb_free(logbuf, 16*256); } static int mptsas_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) {
*** 726,745 **** uint_t verbose = FALSE; uint_t target_info = FALSE; uint_t slot_info = FALSE; uint_t device_info = FALSE; uint_t port_info = FALSE; int rv = DCMD_OK; - void *mptsas_state; if (!(flags & DCMD_ADDRSPEC)) { ! mptsas_state = NULL; if (mdb_readvar(&mptsas_state, "mptsas_state") == -1) { mdb_warn("can't read mptsas_state"); return (DCMD_ERR); } ! if (mdb_pwalk_dcmd("genunix`softstate", "mpt_sas`mptsas", argc, argv, (uintptr_t)mptsas_state) == -1) { mdb_warn("mdb_pwalk_dcmd failed"); return (DCMD_ERR); } return (DCMD_OK); --- 739,760 ---- uint_t verbose = FALSE; uint_t target_info = FALSE; uint_t slot_info = FALSE; uint_t device_info = FALSE; uint_t port_info = FALSE; + uint_t debug_log = FALSE; int rv = DCMD_OK; if (!(flags & DCMD_ADDRSPEC)) { ! void *mptsas_state = NULL; ! if (mdb_readvar(&mptsas_state, "mptsas_state") == -1) { mdb_warn("can't read mptsas_state"); return (DCMD_ERR); } ! if (mdb_pwalk_dcmd("genunix`softstate", ! "mpt_sas`mptsas", argc, argv, (uintptr_t)mptsas_state) == -1) { mdb_warn("mdb_pwalk_dcmd failed"); return (DCMD_ERR); } return (DCMD_OK);
*** 749,758 **** --- 764,774 ---- 's', MDB_OPT_SETBITS, TRUE, &slot_info, 'd', MDB_OPT_SETBITS, TRUE, &device_info, 't', MDB_OPT_SETBITS, TRUE, &target_info, 'p', MDB_OPT_SETBITS, TRUE, &port_info, 'v', MDB_OPT_SETBITS, TRUE, &verbose, + 'D', MDB_OPT_SETBITS, TRUE, &debug_log, NULL) != argc) return (DCMD_USAGE); if (mdb_vread(&m, sizeof (m), addr) == -1) {
*** 821,840 **** mdb_printf("\n"); mdb_inc_indent(17); if (target_info) ! display_targets(&m); if (port_info) display_ports(&m); if (device_info) display_deviceinfo(&m); if (slot_info) ! display_slotinfo(); mdb_dec_indent(17); mdb_free(s, slot_size); --- 837,859 ---- mdb_printf("\n"); mdb_inc_indent(17); if (target_info) ! display_targets(&m, verbose); if (port_info) display_ports(&m); if (device_info) display_deviceinfo(&m); if (slot_info) ! display_slotinfo(&m, s); ! ! if (debug_log) ! dump_debug_log(&m); mdb_dec_indent(17); mdb_free(s, slot_size);
*** 848,864 **** "including warning\nmessages when slot usage doesn't match " "summary information.\n" "Without the address of a \"struct mptsas\", prints every " "instance.\n\n" "Switches:\n" ! " -t includes information about targets\n" " -p includes information about port\n" ! " -d includes information about the hardware\n"); } static const mdb_dcmd_t dcmds[] = { ! { "mptsas", "?[-tpd]", "print mpt_sas information", mptsas_dcmd, mptsas_help}, { NULL } }; static const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds, NULL --- 867,885 ---- "including warning\nmessages when slot usage doesn't match " "summary information.\n" "Without the address of a \"struct mptsas\", prints every " "instance.\n\n" "Switches:\n" ! " -t[v] includes information about targets, v = be more verbose\n" " -p includes information about port\n" ! " -s includes information about mpt slots\n" ! " -d includes information about the hardware\n" ! " -D print the mptsas specific debug log\n"); } static const mdb_dcmd_t dcmds[] = { ! { "mptsas", "?[-tpsdD]", "print mpt_sas information", mptsas_dcmd, mptsas_help}, { NULL } }; static const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds, NULL