14e400768SDavid Christensen /*-
27282444bSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause
37282444bSPedro F. Giffuni *
4e36ffbddSDavid C Somayajulu * Copyright (c) 2007-2014 QLogic Corporation. All rights reserved.
54e400768SDavid Christensen *
64e400768SDavid Christensen * Redistribution and use in source and binary forms, with or without
74e400768SDavid Christensen * modification, are permitted provided that the following conditions
84e400768SDavid Christensen * are met:
94e400768SDavid Christensen *
104e400768SDavid Christensen * 1. Redistributions of source code must retain the above copyright
114e400768SDavid Christensen * notice, this list of conditions and the following disclaimer.
124e400768SDavid Christensen * 2. Redistributions in binary form must reproduce the above copyright
134e400768SDavid Christensen * notice, this list of conditions and the following disclaimer in the
144e400768SDavid Christensen * documentation and/or other materials provided with the distribution.
154e400768SDavid Christensen *
164e400768SDavid Christensen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
174e400768SDavid Christensen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
184e400768SDavid Christensen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
194e400768SDavid Christensen * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
204e400768SDavid Christensen * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
214e400768SDavid Christensen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
224e400768SDavid Christensen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
234e400768SDavid Christensen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
244e400768SDavid Christensen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
254e400768SDavid Christensen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
264e400768SDavid Christensen * THE POSSIBILITY OF SUCH DAMAGE.
274e400768SDavid Christensen */
284e400768SDavid Christensen
294e400768SDavid Christensen #include <sys/cdefs.h>
304e400768SDavid Christensen #include "bxe.h"
314e400768SDavid Christensen
324e400768SDavid Christensen #include "ddb/ddb.h"
334e400768SDavid Christensen #include "ddb/db_sym.h"
344e400768SDavid Christensen #include "ddb/db_lex.h"
354e400768SDavid Christensen
364e400768SDavid Christensen #ifdef BXE_REG_NO_INLINE
374e400768SDavid Christensen
384e400768SDavid Christensen /*
394e400768SDavid Christensen * Debug versions of the 8/16/32 bit OS register read/write functions to
404e400768SDavid Christensen * capture/display values read/written from/to the controller.
414e400768SDavid Christensen */
424e400768SDavid Christensen
434e400768SDavid Christensen void
bxe_reg_write8(struct bxe_softc * sc,bus_size_t offset,uint8_t val)444e400768SDavid Christensen bxe_reg_write8(struct bxe_softc *sc, bus_size_t offset, uint8_t val)
454e400768SDavid Christensen {
464e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%02x\n", offset, val);
474e400768SDavid Christensen bus_space_write_1(sc->bar[BAR0].tag,
484e400768SDavid Christensen sc->bar[BAR0].handle,
494e400768SDavid Christensen offset,
504e400768SDavid Christensen val);
514e400768SDavid Christensen }
524e400768SDavid Christensen
534e400768SDavid Christensen void
bxe_reg_write16(struct bxe_softc * sc,bus_size_t offset,uint16_t val)544e400768SDavid Christensen bxe_reg_write16(struct bxe_softc *sc, bus_size_t offset, uint16_t val)
554e400768SDavid Christensen {
564e400768SDavid Christensen if ((offset % 2) != 0) {
574e400768SDavid Christensen BLOGD(sc, DBG_REGS, "Unaligned 16-bit write to 0x%08lx\n", offset);
584e400768SDavid Christensen }
594e400768SDavid Christensen
604e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%04x\n", offset, val);
614e400768SDavid Christensen bus_space_write_2(sc->bar[BAR0].tag,
624e400768SDavid Christensen sc->bar[BAR0].handle,
634e400768SDavid Christensen offset,
644e400768SDavid Christensen val);
654e400768SDavid Christensen }
664e400768SDavid Christensen
674e400768SDavid Christensen void
bxe_reg_write32(struct bxe_softc * sc,bus_size_t offset,uint32_t val)684e400768SDavid Christensen bxe_reg_write32(struct bxe_softc *sc, bus_size_t offset, uint32_t val)
694e400768SDavid Christensen {
704e400768SDavid Christensen if ((offset % 4) != 0) {
714e400768SDavid Christensen BLOGD(sc, DBG_REGS, "Unaligned 32-bit write to 0x%08lx\n", offset);
724e400768SDavid Christensen }
734e400768SDavid Christensen
744e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%08x\n", offset, val);
754e400768SDavid Christensen bus_space_write_4(sc->bar[BAR0].tag,
764e400768SDavid Christensen sc->bar[BAR0].handle,
774e400768SDavid Christensen offset,
784e400768SDavid Christensen val);
794e400768SDavid Christensen }
804e400768SDavid Christensen
814e400768SDavid Christensen uint8_t
bxe_reg_read8(struct bxe_softc * sc,bus_size_t offset)824e400768SDavid Christensen bxe_reg_read8(struct bxe_softc *sc, bus_size_t offset)
834e400768SDavid Christensen {
844e400768SDavid Christensen uint8_t val;
854e400768SDavid Christensen
864e400768SDavid Christensen val = bus_space_read_1(sc->bar[BAR0].tag,
874e400768SDavid Christensen sc->bar[BAR0].handle,
884e400768SDavid Christensen offset);
894e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%02x\n", offset, val);
904e400768SDavid Christensen
914e400768SDavid Christensen return (val);
924e400768SDavid Christensen }
934e400768SDavid Christensen
944e400768SDavid Christensen uint16_t
bxe_reg_read16(struct bxe_softc * sc,bus_size_t offset)954e400768SDavid Christensen bxe_reg_read16(struct bxe_softc *sc, bus_size_t offset)
964e400768SDavid Christensen {
974e400768SDavid Christensen uint16_t val;
984e400768SDavid Christensen
994e400768SDavid Christensen if ((offset % 2) != 0) {
1004e400768SDavid Christensen BLOGD(sc, DBG_REGS, "Unaligned 16-bit read from 0x%08lx\n", offset);
1014e400768SDavid Christensen }
1024e400768SDavid Christensen
1034e400768SDavid Christensen val = bus_space_read_2(sc->bar[BAR0].tag,
1044e400768SDavid Christensen sc->bar[BAR0].handle,
1054e400768SDavid Christensen offset);
1064e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%08x\n", offset, val);
1074e400768SDavid Christensen
1084e400768SDavid Christensen return (val);
1094e400768SDavid Christensen }
1104e400768SDavid Christensen
1114e400768SDavid Christensen uint32_t
bxe_reg_read32(struct bxe_softc * sc,bus_size_t offset)1124e400768SDavid Christensen bxe_reg_read32(struct bxe_softc *sc, bus_size_t offset)
1134e400768SDavid Christensen {
1144e400768SDavid Christensen uint32_t val;
1154e400768SDavid Christensen
1164e400768SDavid Christensen if ((offset % 4) != 0) {
1174e400768SDavid Christensen BLOGD(sc, DBG_REGS, "Unaligned 32-bit read from 0x%08lx\n", offset);
1184e400768SDavid Christensen }
1194e400768SDavid Christensen
1204e400768SDavid Christensen val = bus_space_read_4(sc->bar[BAR0].tag,
1214e400768SDavid Christensen sc->bar[BAR0].handle,
1224e400768SDavid Christensen offset);
1234e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%08x\n", offset, val);
1244e400768SDavid Christensen
1254e400768SDavid Christensen return (val);
1264e400768SDavid Christensen }
1274e400768SDavid Christensen
1284e400768SDavid Christensen #endif /* BXE_REG_NO_INLINE */
1294e400768SDavid Christensen
1304e400768SDavid Christensen #ifdef ELINK_DEBUG
1314e400768SDavid Christensen
1324e400768SDavid Christensen void
elink_cb_dbg(struct bxe_softc * sc,char * fmt)1334e400768SDavid Christensen elink_cb_dbg(struct bxe_softc *sc,
1344e400768SDavid Christensen char *fmt)
1354e400768SDavid Christensen {
1364e400768SDavid Christensen char buf[128];
1374e400768SDavid Christensen if (__predict_false(sc->debug & DBG_PHY)) {
1384e400768SDavid Christensen snprintf(buf, sizeof(buf), "ELINK: %s", fmt);
1394e400768SDavid Christensen device_printf(sc->dev, "%s", buf);
1404e400768SDavid Christensen }
1414e400768SDavid Christensen }
1424e400768SDavid Christensen
1434e400768SDavid Christensen void
elink_cb_dbg1(struct bxe_softc * sc,char * fmt,uint32_t arg1)1444e400768SDavid Christensen elink_cb_dbg1(struct bxe_softc *sc,
1454e400768SDavid Christensen char *fmt,
1464e400768SDavid Christensen uint32_t arg1)
1474e400768SDavid Christensen {
1484e400768SDavid Christensen char tmp[128], buf[128];
1494e400768SDavid Christensen if (__predict_false(sc->debug & DBG_PHY)) {
1504e400768SDavid Christensen snprintf(tmp, sizeof(tmp), "ELINK: %s", fmt);
1514e400768SDavid Christensen snprintf(buf, sizeof(buf), tmp, arg1);
1524e400768SDavid Christensen device_printf(sc->dev, "%s", buf);
1534e400768SDavid Christensen }
1544e400768SDavid Christensen }
1554e400768SDavid Christensen
1564e400768SDavid Christensen void
elink_cb_dbg2(struct bxe_softc * sc,char * fmt,uint32_t arg1,uint32_t arg2)1574e400768SDavid Christensen elink_cb_dbg2(struct bxe_softc *sc,
1584e400768SDavid Christensen char *fmt,
1594e400768SDavid Christensen uint32_t arg1,
1604e400768SDavid Christensen uint32_t arg2)
1614e400768SDavid Christensen {
1624e400768SDavid Christensen char tmp[128], buf[128];
1634e400768SDavid Christensen if (__predict_false(sc->debug & DBG_PHY)) {
1644e400768SDavid Christensen snprintf(tmp, sizeof(tmp), "ELINK: %s", fmt);
1654e400768SDavid Christensen snprintf(buf, sizeof(buf), tmp, arg1, arg2);
1664e400768SDavid Christensen device_printf(sc->dev, "%s", buf);
1674e400768SDavid Christensen }
1684e400768SDavid Christensen }
1694e400768SDavid Christensen
1704e400768SDavid Christensen void
elink_cb_dbg3(struct bxe_softc * sc,char * fmt,uint32_t arg1,uint32_t arg2,uint32_t arg3)1714e400768SDavid Christensen elink_cb_dbg3(struct bxe_softc *sc,
1724e400768SDavid Christensen char *fmt,
1734e400768SDavid Christensen uint32_t arg1,
1744e400768SDavid Christensen uint32_t arg2,
1754e400768SDavid Christensen uint32_t arg3)
1764e400768SDavid Christensen {
1774e400768SDavid Christensen char tmp[128], buf[128];
1784e400768SDavid Christensen if (__predict_false(sc->debug & DBG_PHY)) {
1794e400768SDavid Christensen snprintf(tmp, sizeof(tmp), "ELINK: %s", fmt);
1804e400768SDavid Christensen snprintf(buf, sizeof(buf), tmp, arg1, arg2, arg3);
1814e400768SDavid Christensen device_printf(sc->dev, "%s", buf);
1824e400768SDavid Christensen }
1834e400768SDavid Christensen }
1844e400768SDavid Christensen
1854e400768SDavid Christensen #endif /* ELINK_DEBUG */
1864e400768SDavid Christensen
1874e400768SDavid Christensen extern struct mtx bxe_prev_mtx;
1884e400768SDavid Christensen
1894e400768SDavid Christensen void
bxe_dump_mem(struct bxe_softc * sc,char * tag,uint8_t * mem,uint32_t len)1904e400768SDavid Christensen bxe_dump_mem(struct bxe_softc *sc,
1914e400768SDavid Christensen char *tag,
1924e400768SDavid Christensen uint8_t *mem,
1934e400768SDavid Christensen uint32_t len)
1944e400768SDavid Christensen {
1954e400768SDavid Christensen char buf[256];
1964e400768SDavid Christensen char c[32];
1974e400768SDavid Christensen int xx;
1984e400768SDavid Christensen
1994e400768SDavid Christensen mtx_lock(&bxe_prev_mtx);
2004e400768SDavid Christensen
2014e400768SDavid Christensen BLOGI(sc, "++++++++++++ %s\n", tag);
2024e400768SDavid Christensen strcpy(buf, "** 000: ");
2034e400768SDavid Christensen
2044e400768SDavid Christensen for (xx = 0; xx < len; xx++)
2054e400768SDavid Christensen {
2064e400768SDavid Christensen if ((xx != 0) && (xx % 16 == 0))
2074e400768SDavid Christensen {
2084e400768SDavid Christensen BLOGI(sc, "%s\n", buf);
2094e400768SDavid Christensen strcpy(buf, "** ");
2104e400768SDavid Christensen snprintf(c, sizeof(c), "%03x", xx);
2114e400768SDavid Christensen strcat(buf, c);
2124e400768SDavid Christensen strcat(buf, ": ");
2134e400768SDavid Christensen }
2144e400768SDavid Christensen
2154e400768SDavid Christensen snprintf(c, sizeof(c), "%02x ", *mem);
2164e400768SDavid Christensen strcat(buf, c);
2174e400768SDavid Christensen
2184e400768SDavid Christensen mem++;
2194e400768SDavid Christensen }
2204e400768SDavid Christensen
2214e400768SDavid Christensen BLOGI(sc, "%s\n", buf);
2224e400768SDavid Christensen BLOGI(sc, "------------ %s\n", tag);
2234e400768SDavid Christensen
2244e400768SDavid Christensen mtx_unlock(&bxe_prev_mtx);
2254e400768SDavid Christensen }
2264e400768SDavid Christensen
2274e400768SDavid Christensen void
bxe_dump_mbuf_data(struct bxe_softc * sc,char * tag,struct mbuf * m,uint8_t contents)2284e400768SDavid Christensen bxe_dump_mbuf_data(struct bxe_softc *sc,
2294e400768SDavid Christensen char *tag,
2304e400768SDavid Christensen struct mbuf *m,
2314e400768SDavid Christensen uint8_t contents)
2324e400768SDavid Christensen {
2334e400768SDavid Christensen char buf[256];
2344e400768SDavid Christensen char c[32];
2354e400768SDavid Christensen uint8_t *memp;
2364e400768SDavid Christensen int i, xx = 0;
2374e400768SDavid Christensen
2384e400768SDavid Christensen mtx_lock(&bxe_prev_mtx);
2394e400768SDavid Christensen
2404e400768SDavid Christensen BLOGI(sc, "++++++++++++ %s\n", tag);
2414e400768SDavid Christensen
2424e400768SDavid Christensen while (m)
2434e400768SDavid Christensen {
2444e400768SDavid Christensen memp = m->m_data;
2454e400768SDavid Christensen strcpy(buf, "** > ");
2464e400768SDavid Christensen snprintf(c, sizeof(c), "%03x", xx);
2474e400768SDavid Christensen strcat(buf, c);
2484e400768SDavid Christensen strcat(buf, ": ");
2494e400768SDavid Christensen
2504e400768SDavid Christensen if (contents)
2514e400768SDavid Christensen {
2524e400768SDavid Christensen for (i = 0; i < m->m_len; i++)
2534e400768SDavid Christensen {
2544e400768SDavid Christensen if ((xx != 0) && (xx % 16 == 0))
2554e400768SDavid Christensen {
2564e400768SDavid Christensen BLOGI(sc, "%s\n", buf);
2574e400768SDavid Christensen strcpy(buf, "** ");
2584e400768SDavid Christensen snprintf(c, sizeof(c), "%03x", xx);
2594e400768SDavid Christensen strcat(buf, c);
2604e400768SDavid Christensen strcat(buf, ": ");
2614e400768SDavid Christensen }
2624e400768SDavid Christensen
2634e400768SDavid Christensen snprintf(c, sizeof(c), "%02x ", *memp);
2644e400768SDavid Christensen strcat(buf, c);
2654e400768SDavid Christensen
2664e400768SDavid Christensen memp++;
2674e400768SDavid Christensen xx++;
2684e400768SDavid Christensen }
2694e400768SDavid Christensen }
2704e400768SDavid Christensen else
2714e400768SDavid Christensen {
2724e400768SDavid Christensen snprintf(c, sizeof(c), "%d", m->m_len);
2734e400768SDavid Christensen strcat(buf, c);
2744e400768SDavid Christensen xx += m->m_len;
2754e400768SDavid Christensen }
2764e400768SDavid Christensen
2774e400768SDavid Christensen BLOGI(sc, "%s\n", buf);
2784e400768SDavid Christensen m = m->m_next;
2794e400768SDavid Christensen }
2804e400768SDavid Christensen
2814e400768SDavid Christensen BLOGI(sc, "------------ %s\n", tag);
2824e400768SDavid Christensen
2834e400768SDavid Christensen mtx_unlock(&bxe_prev_mtx);
2844e400768SDavid Christensen }
2854e400768SDavid Christensen
2864e400768SDavid Christensen #ifdef DDB
2874e400768SDavid Christensen
bxe_ddb_usage()2884e400768SDavid Christensen static void bxe_ddb_usage()
2894e400768SDavid Christensen {
2904e400768SDavid Christensen db_printf("Usage: bxe[/hpv] <instance> [<address>]\n");
2914e400768SDavid Christensen }
2924e400768SDavid Christensen
DB_COMMAND_FLAGS(bxe,bxe_ddb,CS_OWN)293*258958b3SMitchell Horne DB_COMMAND_FLAGS(bxe, bxe_ddb, CS_OWN)
2944e400768SDavid Christensen {
2954e400768SDavid Christensen char if_xname[IFNAMSIZ];
296717568adSMarcel Moolenaar if_t ifp = NULL;
2974e400768SDavid Christensen struct bxe_softc *sc;
2984e400768SDavid Christensen db_expr_t next_arg;
2994e400768SDavid Christensen int index;
3004e400768SDavid Christensen int tok;
3014e400768SDavid Christensen int mod_phys_addr = FALSE;
3024e400768SDavid Christensen int mod_virt_addr = FALSE;
3034e400768SDavid Christensen db_addr_t addr;
3044e400768SDavid Christensen
3054e400768SDavid Christensen tok = db_read_token();
3064e400768SDavid Christensen if (tok == tSLASH) {
3074e400768SDavid Christensen tok = db_read_token();
3084e400768SDavid Christensen if (tok != tIDENT) {
3094e400768SDavid Christensen db_printf("ERROR: bad modifier\n");
3104e400768SDavid Christensen bxe_ddb_usage();
3114e400768SDavid Christensen goto bxe_ddb_done;
3124e400768SDavid Christensen }
3134e400768SDavid Christensen if (strcmp(db_tok_string, "h") == 0) {
3144e400768SDavid Christensen bxe_ddb_usage();
3154e400768SDavid Christensen goto bxe_ddb_done;
3164e400768SDavid Christensen } else if (strcmp(db_tok_string, "p") == 0) {
3174e400768SDavid Christensen mod_phys_addr = TRUE;
3184e400768SDavid Christensen } else if (strcmp(db_tok_string, "v") == 0) {
3194e400768SDavid Christensen mod_virt_addr = TRUE;
3204e400768SDavid Christensen }
3214e400768SDavid Christensen } else {
3224e400768SDavid Christensen db_unread_token(tok);
3234e400768SDavid Christensen }
3244e400768SDavid Christensen
3254e400768SDavid Christensen if (!db_expression((db_expr_t *)&index)) {
3264e400768SDavid Christensen db_printf("ERROR: bxe index missing\n");
3274e400768SDavid Christensen bxe_ddb_usage();
3284e400768SDavid Christensen goto bxe_ddb_done;
3294e400768SDavid Christensen }
3304e400768SDavid Christensen
3314e400768SDavid Christensen snprintf(if_xname, sizeof(if_xname), "bxe%d", index);
332717568adSMarcel Moolenaar if ((ifp = ifunit_ref(if_xname)) == NULL) /* XXX */
3334e400768SDavid Christensen {
3344e400768SDavid Christensen db_printf("ERROR: Invalid interface %s\n", if_xname);
3354e400768SDavid Christensen goto bxe_ddb_done;
3364e400768SDavid Christensen }
3374e400768SDavid Christensen
338717568adSMarcel Moolenaar sc = (struct bxe_softc *)if_getsoftc(ifp);
3394e400768SDavid Christensen db_printf("ifnet=%p (%s)\n", ifp, if_xname);
3404e400768SDavid Christensen db_printf("softc=%p\n", sc);
3414e400768SDavid Christensen db_printf(" dev=%p\n", sc->dev);
3424e400768SDavid Christensen db_printf(" BDF=%d:%d:%d\n",
3434e400768SDavid Christensen sc->pcie_bus, sc->pcie_device, sc->pcie_func);
3444e400768SDavid Christensen
3454e400768SDavid Christensen if (mod_phys_addr || mod_virt_addr) {
3464e400768SDavid Christensen if (!db_expression((db_addr_t *)&addr)) {
3474e400768SDavid Christensen db_printf("ERROR: Invalid address\n");
3484e400768SDavid Christensen bxe_ddb_usage();
3494e400768SDavid Christensen goto bxe_ddb_done;
3504e400768SDavid Christensen }
3514e400768SDavid Christensen
3524e400768SDavid Christensen db_printf("addr=%p", addr);
3534e400768SDavid Christensen }
3544e400768SDavid Christensen
3554e400768SDavid Christensen bxe_ddb_done:
3564e400768SDavid Christensen
3574e400768SDavid Christensen db_flush_lex();
3584e400768SDavid Christensen if (ifp) if_rele(ifp);
3594e400768SDavid Christensen }
3604e400768SDavid Christensen
3614e400768SDavid Christensen #endif /* DDB */
3624e400768SDavid Christensen
363