From owner-svn-src-all@FreeBSD.ORG Sat Jun 1 02:07:38 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 431CF692; Sat, 1 Jun 2013 02:07:38 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 24FCB7FD; Sat, 1 Jun 2013 02:07:38 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r5127c2B070186; Sat, 1 Jun 2013 02:07:38 GMT (envelope-from np@svn.freebsd.org) Received: (from np@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r5127c0u070185; Sat, 1 Jun 2013 02:07:38 GMT (envelope-from np@svn.freebsd.org) Message-Id: <201306010207.r5127c0u070185@svn.freebsd.org> From: Navdeep Parhar Date: Sat, 1 Jun 2013 02:07:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r251213 - head/sys/dev/cxgbe X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 01 Jun 2013 02:07:38 -0000 Author: np Date: Sat Jun 1 02:07:37 2013 New Revision: 251213 URL: http://svnweb.freebsd.org/changeset/base/251213 Log: cxgbe(4): Some more debug sysctls. These work on both T4 and T5 based cards. dev.t5nex.0.misc.cim_ma_la: CIM MA logic analyzer dev.t5nex.0.misc.cim_pif_la: CIM PIF logic analyzer dev.t5nex.0.misc.mps_tcam: MPS TCAM entries dev.t5nex.0.misc.tp_la: TP logic analyzer dev.t5nex.0.misc.ulprx_la: ULPRX logic analyzer Obtained from: Chelsio MFC after: 1 week Modified: head/sys/dev/cxgbe/t4_main.c Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Sat Jun 1 01:02:24 2013 (r251212) +++ head/sys/dev/cxgbe/t4_main.c Sat Jun 1 02:07:37 2013 (r251213) @@ -382,6 +382,8 @@ static int sysctl_handle_t4_reg64(SYSCTL static int sysctl_cctrl(SYSCTL_HANDLER_ARGS); static int sysctl_cim_ibq_obq(SYSCTL_HANDLER_ARGS); static int sysctl_cim_la(SYSCTL_HANDLER_ARGS); +static int sysctl_cim_ma_la(SYSCTL_HANDLER_ARGS); +static int sysctl_cim_pif_la(SYSCTL_HANDLER_ARGS); static int sysctl_cim_qcfg(SYSCTL_HANDLER_ARGS); static int sysctl_cpl_stats(SYSCTL_HANDLER_ARGS); static int sysctl_ddp_stats(SYSCTL_HANDLER_ARGS); @@ -390,13 +392,16 @@ static int sysctl_fcoe_stats(SYSCTL_HAND static int sysctl_hw_sched(SYSCTL_HANDLER_ARGS); static int sysctl_lb_stats(SYSCTL_HANDLER_ARGS); static int sysctl_meminfo(SYSCTL_HANDLER_ARGS); +static int sysctl_mps_tcam(SYSCTL_HANDLER_ARGS); static int sysctl_path_mtus(SYSCTL_HANDLER_ARGS); static int sysctl_pm_stats(SYSCTL_HANDLER_ARGS); static int sysctl_rdma_stats(SYSCTL_HANDLER_ARGS); static int sysctl_tcp_stats(SYSCTL_HANDLER_ARGS); static int sysctl_tids(SYSCTL_HANDLER_ARGS); static int sysctl_tp_err_stats(SYSCTL_HANDLER_ARGS); +static int sysctl_tp_la(SYSCTL_HANDLER_ARGS); static int sysctl_tx_rate(SYSCTL_HANDLER_ARGS); +static int sysctl_ulprx_la(SYSCTL_HANDLER_ARGS); static int sysctl_wcwr_stats(SYSCTL_HANDLER_ARGS); #endif static inline void txq_start(struct ifnet *, struct sge_txq *); @@ -4220,6 +4225,10 @@ t4_sysctls(struct adapter *sc) CTLTYPE_STRING | CTLFLAG_RD, sc, 0, sysctl_cim_la, "A", "CIM logic analyzer"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ma_la", + CTLTYPE_STRING | CTLFLAG_RD, sc, 0, + sysctl_cim_ma_la, "A", "CIM MA logic analyzer"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp0", CTLTYPE_STRING | CTLFLAG_RD, sc, 0 + CIM_NUM_IBQ, sysctl_cim_ibq_obq, "A", "CIM OBQ 0 (ULP0)"); @@ -4254,6 +4263,10 @@ t4_sysctls(struct adapter *sc) sysctl_cim_ibq_obq, "A", "CIM OBQ 7 (SGE1-RX)"); } + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_pif_la", + CTLTYPE_STRING | CTLFLAG_RD, sc, 0, + sysctl_cim_pif_la, "A", "CIM PIF logic analyzer"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_qcfg", CTLTYPE_STRING | CTLFLAG_RD, sc, 0, sysctl_cim_qcfg, "A", "CIM queue configuration"); @@ -4290,6 +4303,10 @@ t4_sysctls(struct adapter *sc) CTLTYPE_STRING | CTLFLAG_RD, sc, 0, sysctl_meminfo, "A", "memory regions"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "mps_tcam", + CTLTYPE_STRING | CTLFLAG_RD, sc, 0, + sysctl_mps_tcam, "A", "MPS TCAM entries"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "path_mtus", CTLTYPE_STRING | CTLFLAG_RD, sc, 0, sysctl_path_mtus, "A", "path MTUs"); @@ -4314,10 +4331,18 @@ t4_sysctls(struct adapter *sc) CTLTYPE_STRING | CTLFLAG_RD, sc, 0, sysctl_tp_err_stats, "A", "TP error statistics"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_la", + CTLTYPE_STRING | CTLFLAG_RD, sc, 0, + sysctl_tp_la, "A", "TP logic analyzer"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tx_rate", CTLTYPE_STRING | CTLFLAG_RD, sc, 0, sysctl_tx_rate, "A", "Tx rate"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "ulprx_la", + CTLTYPE_STRING | CTLFLAG_RD, sc, 0, + sysctl_ulprx_la, "A", "ULPRX logic analyzer"); + if (is_t5(sc)) { SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "wcwr_stats", CTLTYPE_STRING | CTLFLAG_RD, sc, 0, @@ -4912,6 +4937,92 @@ done: } static int +sysctl_cim_ma_la(SYSCTL_HANDLER_ARGS) +{ + struct adapter *sc = arg1; + u_int i; + struct sbuf *sb; + uint32_t *buf, *p; + int rc; + + rc = sysctl_wire_old_buffer(req, 0); + if (rc != 0) + return (rc); + + sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); + if (sb == NULL) + return (ENOMEM); + + buf = malloc(2 * CIM_MALA_SIZE * 5 * sizeof(uint32_t), M_CXGBE, + M_ZERO | M_WAITOK); + + t4_cim_read_ma_la(sc, buf, buf + 5 * CIM_MALA_SIZE); + p = buf; + + for (i = 0; i < CIM_MALA_SIZE; i++, p += 5) { + sbuf_printf(sb, "\n%02x%08x%08x%08x%08x", p[4], p[3], p[2], + p[1], p[0]); + } + + sbuf_printf(sb, "\n\nCnt ID Tag UE Data RDY VLD"); + for (i = 0; i < CIM_MALA_SIZE; i++, p += 5) { + sbuf_printf(sb, "\n%3u %2u %x %u %08x%08x %u %u", + (p[2] >> 10) & 0xff, (p[2] >> 7) & 7, + (p[2] >> 3) & 0xf, (p[2] >> 2) & 1, + (p[1] >> 2) | ((p[2] & 3) << 30), + (p[0] >> 2) | ((p[1] & 3) << 30), (p[0] >> 1) & 1, + p[0] & 1); + } + + rc = sbuf_finish(sb); + sbuf_delete(sb); + free(buf, M_CXGBE); + return (rc); +} + +static int +sysctl_cim_pif_la(SYSCTL_HANDLER_ARGS) +{ + struct adapter *sc = arg1; + u_int i; + struct sbuf *sb; + uint32_t *buf, *p; + int rc; + + rc = sysctl_wire_old_buffer(req, 0); + if (rc != 0) + return (rc); + + sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); + if (sb == NULL) + return (ENOMEM); + + buf = malloc(2 * CIM_PIFLA_SIZE * 6 * sizeof(uint32_t), M_CXGBE, + M_ZERO | M_WAITOK); + + t4_cim_read_pif_la(sc, buf, buf + 6 * CIM_PIFLA_SIZE, NULL, NULL); + p = buf; + + sbuf_printf(sb, "Cntl ID DataBE Addr Data"); + for (i = 0; i < CIM_MALA_SIZE; i++, p += 6) { + sbuf_printf(sb, "\n %02x %02x %04x %08x %08x%08x%08x%08x", + (p[5] >> 22) & 0xff, (p[5] >> 16) & 0x3f, p[5] & 0xffff, + p[4], p[3], p[2], p[1], p[0]); + } + + sbuf_printf(sb, "\n\nCntl ID Data"); + for (i = 0; i < CIM_MALA_SIZE; i++, p += 6) { + sbuf_printf(sb, "\n %02x %02x %08x%08x%08x%08x", + (p[4] >> 6) & 0xff, p[4] & 0x3f, p[3], p[2], p[1], p[0]); + } + + rc = sbuf_finish(sb); + sbuf_delete(sb); + free(buf, M_CXGBE); + return (rc); +} + +static int sysctl_cim_qcfg(SYSCTL_HANDLER_ARGS) { struct adapter *sc = arg1; @@ -5534,6 +5645,104 @@ sysctl_meminfo(SYSCTL_HANDLER_ARGS) return (rc); } +static inline void +tcamxy2valmask(uint64_t x, uint64_t y, uint8_t *addr, uint64_t *mask) +{ + *mask = x | y; + y = htobe64(y); + memcpy(addr, (char *)&y + 2, ETHER_ADDR_LEN); +} + +static int +sysctl_mps_tcam(SYSCTL_HANDLER_ARGS) +{ + struct adapter *sc = arg1; + struct sbuf *sb; + int rc, i, n; + + rc = sysctl_wire_old_buffer(req, 0); + if (rc != 0) + return (rc); + + sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); + if (sb == NULL) + return (ENOMEM); + + sbuf_printf(sb, + "Idx Ethernet address Mask Vld Ports PF" + " VF Replication P0 P1 P2 P3 ML"); + n = is_t4(sc) ? NUM_MPS_CLS_SRAM_L_INSTANCES : + NUM_MPS_T5_CLS_SRAM_L_INSTANCES; + for (i = 0; i < n; i++) { + uint64_t tcamx, tcamy, mask; + uint32_t cls_lo, cls_hi; + uint8_t addr[ETHER_ADDR_LEN]; + + tcamy = t4_read_reg64(sc, MPS_CLS_TCAM_Y_L(i)); + tcamx = t4_read_reg64(sc, MPS_CLS_TCAM_X_L(i)); + cls_lo = t4_read_reg(sc, MPS_CLS_SRAM_L(i)); + cls_hi = t4_read_reg(sc, MPS_CLS_SRAM_H(i)); + + if (tcamx & tcamy) + continue; + + tcamxy2valmask(tcamx, tcamy, addr, &mask); + sbuf_printf(sb, "\n%3u %02x:%02x:%02x:%02x:%02x:%02x %012jx" + " %c %#x%4u%4d", i, addr[0], addr[1], addr[2], + addr[3], addr[4], addr[5], (uintmax_t)mask, + (cls_lo & F_SRAM_VLD) ? 'Y' : 'N', + G_PORTMAP(cls_hi), G_PF(cls_lo), + (cls_lo & F_VF_VALID) ? G_VF(cls_lo) : -1); + + if (cls_lo & F_REPLICATE) { + struct fw_ldst_cmd ldst_cmd; + + memset(&ldst_cmd, 0, sizeof(ldst_cmd)); + ldst_cmd.op_to_addrspace = + htobe32(V_FW_CMD_OP(FW_LDST_CMD) | + F_FW_CMD_REQUEST | F_FW_CMD_READ | + V_FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_MPS)); + ldst_cmd.cycles_to_len16 = htobe32(FW_LEN16(ldst_cmd)); + ldst_cmd.u.mps.fid_ctl = + htobe16(V_FW_LDST_CMD_FID(FW_LDST_MPS_RPLC) | + V_FW_LDST_CMD_CTL(i)); + + rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, + "t4mps"); + if (rc) + break; + rc = -t4_wr_mbox(sc, sc->mbox, &ldst_cmd, + sizeof(ldst_cmd), &ldst_cmd); + end_synchronized_op(sc, 0); + + if (rc != 0) { + sbuf_printf(sb, + " ------------ error %3u ------------", rc); + rc = 0; + } else { + sbuf_printf(sb, " %08x %08x %08x %08x", + be32toh(ldst_cmd.u.mps.rplc127_96), + be32toh(ldst_cmd.u.mps.rplc95_64), + be32toh(ldst_cmd.u.mps.rplc63_32), + be32toh(ldst_cmd.u.mps.rplc31_0)); + } + } else + sbuf_printf(sb, "%36s", ""); + + sbuf_printf(sb, "%4u%3u%3u%3u %#3x", G_SRAM_PRIO0(cls_lo), + G_SRAM_PRIO1(cls_lo), G_SRAM_PRIO2(cls_lo), + G_SRAM_PRIO3(cls_lo), (cls_lo >> S_MULTILISTEN0) & 0xf); + } + + if (rc) + (void) sbuf_finish(sb); + else + rc = sbuf_finish(sb); + sbuf_delete(sb); + + return (rc); +} + static int sysctl_path_mtus(SYSCTL_HANDLER_ARGS) { @@ -5771,6 +5980,242 @@ sysctl_tp_err_stats(SYSCTL_HANDLER_ARGS) return (rc); } +struct field_desc { + const char *name; + u_int start; + u_int width; +}; + +static void +field_desc_show(struct sbuf *sb, uint64_t v, const struct field_desc *f) +{ + char buf[32]; + int line_size = 0; + + while (f->name) { + uint64_t mask = (1ULL << f->width) - 1; + int len = snprintf(buf, sizeof(buf), "%s: %ju", f->name, + ((uintmax_t)v >> f->start) & mask); + + if (line_size + len >= 79) { + line_size = 8; + sbuf_printf(sb, "\n "); + } + sbuf_printf(sb, "%s ", buf); + line_size += len + 1; + f++; + } + sbuf_printf(sb, "\n"); +} + +static struct field_desc tp_la0[] = { + { "RcfOpCodeOut", 60, 4 }, + { "State", 56, 4 }, + { "WcfState", 52, 4 }, + { "RcfOpcSrcOut", 50, 2 }, + { "CRxError", 49, 1 }, + { "ERxError", 48, 1 }, + { "SanityFailed", 47, 1 }, + { "SpuriousMsg", 46, 1 }, + { "FlushInputMsg", 45, 1 }, + { "FlushInputCpl", 44, 1 }, + { "RssUpBit", 43, 1 }, + { "RssFilterHit", 42, 1 }, + { "Tid", 32, 10 }, + { "InitTcb", 31, 1 }, + { "LineNumber", 24, 7 }, + { "Emsg", 23, 1 }, + { "EdataOut", 22, 1 }, + { "Cmsg", 21, 1 }, + { "CdataOut", 20, 1 }, + { "EreadPdu", 19, 1 }, + { "CreadPdu", 18, 1 }, + { "TunnelPkt", 17, 1 }, + { "RcfPeerFin", 16, 1 }, + { "RcfReasonOut", 12, 4 }, + { "TxCchannel", 10, 2 }, + { "RcfTxChannel", 8, 2 }, + { "RxEchannel", 6, 2 }, + { "RcfRxChannel", 5, 1 }, + { "RcfDataOutSrdy", 4, 1 }, + { "RxDvld", 3, 1 }, + { "RxOoDvld", 2, 1 }, + { "RxCongestion", 1, 1 }, + { "TxCongestion", 0, 1 }, + { NULL } +}; + +static struct field_desc tp_la1[] = { + { "CplCmdIn", 56, 8 }, + { "CplCmdOut", 48, 8 }, + { "ESynOut", 47, 1 }, + { "EAckOut", 46, 1 }, + { "EFinOut", 45, 1 }, + { "ERstOut", 44, 1 }, + { "SynIn", 43, 1 }, + { "AckIn", 42, 1 }, + { "FinIn", 41, 1 }, + { "RstIn", 40, 1 }, + { "DataIn", 39, 1 }, + { "DataInVld", 38, 1 }, + { "PadIn", 37, 1 }, + { "RxBufEmpty", 36, 1 }, + { "RxDdp", 35, 1 }, + { "RxFbCongestion", 34, 1 }, + { "TxFbCongestion", 33, 1 }, + { "TxPktSumSrdy", 32, 1 }, + { "RcfUlpType", 28, 4 }, + { "Eread", 27, 1 }, + { "Ebypass", 26, 1 }, + { "Esave", 25, 1 }, + { "Static0", 24, 1 }, + { "Cread", 23, 1 }, + { "Cbypass", 22, 1 }, + { "Csave", 21, 1 }, + { "CPktOut", 20, 1 }, + { "RxPagePoolFull", 18, 2 }, + { "RxLpbkPkt", 17, 1 }, + { "TxLpbkPkt", 16, 1 }, + { "RxVfValid", 15, 1 }, + { "SynLearned", 14, 1 }, + { "SetDelEntry", 13, 1 }, + { "SetInvEntry", 12, 1 }, + { "CpcmdDvld", 11, 1 }, + { "CpcmdSave", 10, 1 }, + { "RxPstructsFull", 8, 2 }, + { "EpcmdDvld", 7, 1 }, + { "EpcmdFlush", 6, 1 }, + { "EpcmdTrimPrefix", 5, 1 }, + { "EpcmdTrimPostfix", 4, 1 }, + { "ERssIp4Pkt", 3, 1 }, + { "ERssIp6Pkt", 2, 1 }, + { "ERssTcpUdpPkt", 1, 1 }, + { "ERssFceFipPkt", 0, 1 }, + { NULL } +}; + +static struct field_desc tp_la2[] = { + { "CplCmdIn", 56, 8 }, + { "MpsVfVld", 55, 1 }, + { "MpsPf", 52, 3 }, + { "MpsVf", 44, 8 }, + { "SynIn", 43, 1 }, + { "AckIn", 42, 1 }, + { "FinIn", 41, 1 }, + { "RstIn", 40, 1 }, + { "DataIn", 39, 1 }, + { "DataInVld", 38, 1 }, + { "PadIn", 37, 1 }, + { "RxBufEmpty", 36, 1 }, + { "RxDdp", 35, 1 }, + { "RxFbCongestion", 34, 1 }, + { "TxFbCongestion", 33, 1 }, + { "TxPktSumSrdy", 32, 1 }, + { "RcfUlpType", 28, 4 }, + { "Eread", 27, 1 }, + { "Ebypass", 26, 1 }, + { "Esave", 25, 1 }, + { "Static0", 24, 1 }, + { "Cread", 23, 1 }, + { "Cbypass", 22, 1 }, + { "Csave", 21, 1 }, + { "CPktOut", 20, 1 }, + { "RxPagePoolFull", 18, 2 }, + { "RxLpbkPkt", 17, 1 }, + { "TxLpbkPkt", 16, 1 }, + { "RxVfValid", 15, 1 }, + { "SynLearned", 14, 1 }, + { "SetDelEntry", 13, 1 }, + { "SetInvEntry", 12, 1 }, + { "CpcmdDvld", 11, 1 }, + { "CpcmdSave", 10, 1 }, + { "RxPstructsFull", 8, 2 }, + { "EpcmdDvld", 7, 1 }, + { "EpcmdFlush", 6, 1 }, + { "EpcmdTrimPrefix", 5, 1 }, + { "EpcmdTrimPostfix", 4, 1 }, + { "ERssIp4Pkt", 3, 1 }, + { "ERssIp6Pkt", 2, 1 }, + { "ERssTcpUdpPkt", 1, 1 }, + { "ERssFceFipPkt", 0, 1 }, + { NULL } +}; + +static void +tp_la_show(struct sbuf *sb, uint64_t *p, int idx) +{ + + field_desc_show(sb, *p, tp_la0); +} + +static void +tp_la_show2(struct sbuf *sb, uint64_t *p, int idx) +{ + + if (idx) + sbuf_printf(sb, "\n"); + field_desc_show(sb, p[0], tp_la0); + if (idx < (TPLA_SIZE / 2 - 1) || p[1] != ~0ULL) + field_desc_show(sb, p[1], tp_la0); +} + +static void +tp_la_show3(struct sbuf *sb, uint64_t *p, int idx) +{ + + if (idx) + sbuf_printf(sb, "\n"); + field_desc_show(sb, p[0], tp_la0); + if (idx < (TPLA_SIZE / 2 - 1) || p[1] != ~0ULL) + field_desc_show(sb, p[1], (p[0] & (1 << 17)) ? tp_la2 : tp_la1); +} + +static int +sysctl_tp_la(SYSCTL_HANDLER_ARGS) +{ + struct adapter *sc = arg1; + struct sbuf *sb; + uint64_t *buf, *p; + int rc; + u_int i, inc; + void (*show_func)(struct sbuf *, uint64_t *, int); + + rc = sysctl_wire_old_buffer(req, 0); + if (rc != 0) + return (rc); + + sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); + if (sb == NULL) + return (ENOMEM); + + buf = malloc(TPLA_SIZE * sizeof(uint64_t), M_CXGBE, M_ZERO | M_WAITOK); + + t4_tp_read_la(sc, buf, NULL); + p = buf; + + switch (G_DBGLAMODE(t4_read_reg(sc, A_TP_DBG_LA_CONFIG))) { + case 2: + inc = 2; + show_func = tp_la_show2; + break; + case 3: + inc = 2; + show_func = tp_la_show3; + break; + default: + inc = 1; + show_func = tp_la_show; + } + + for (i = 0; i < TPLA_SIZE / inc; i++, p += inc) + (*show_func)(sb, p, i); + + rc = sbuf_finish(sb); + sbuf_delete(sb); + free(buf, M_CXGBE); + return (rc); +} + static int sysctl_tx_rate(SYSCTL_HANDLER_ARGS) { @@ -5802,6 +6247,41 @@ sysctl_tx_rate(SYSCTL_HANDLER_ARGS) } static int +sysctl_ulprx_la(SYSCTL_HANDLER_ARGS) +{ + struct adapter *sc = arg1; + struct sbuf *sb; + uint32_t *buf, *p; + int rc, i; + + rc = sysctl_wire_old_buffer(req, 0); + if (rc != 0) + return (rc); + + sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); + if (sb == NULL) + return (ENOMEM); + + buf = malloc(ULPRX_LA_SIZE * 8 * sizeof(uint32_t), M_CXGBE, + M_ZERO | M_WAITOK); + + t4_ulprx_read_la(sc, buf); + p = buf; + + sbuf_printf(sb, " Pcmd Type Message" + " Data"); + for (i = 0; i < ULPRX_LA_SIZE; i++, p += 8) { + sbuf_printf(sb, "\n%08x%08x %4x %08x %08x%08x%08x%08x", + p[1], p[0], p[2], p[3], p[7], p[6], p[5], p[4]); + } + + rc = sbuf_finish(sb); + sbuf_delete(sb); + free(buf, M_CXGBE); + return (rc); +} + +static int sysctl_wcwr_stats(SYSCTL_HANDLER_ARGS) { struct adapter *sc = arg1;