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 __FBSDID("$FreeBSD$"); 314e400768SDavid Christensen 324e400768SDavid Christensen #include "bxe.h" 334e400768SDavid Christensen 344e400768SDavid Christensen #include "ddb/ddb.h" 354e400768SDavid Christensen #include "ddb/db_sym.h" 364e400768SDavid Christensen #include "ddb/db_lex.h" 374e400768SDavid Christensen 384e400768SDavid Christensen #ifdef BXE_REG_NO_INLINE 394e400768SDavid Christensen 404e400768SDavid Christensen /* 414e400768SDavid Christensen * Debug versions of the 8/16/32 bit OS register read/write functions to 424e400768SDavid Christensen * capture/display values read/written from/to the controller. 434e400768SDavid Christensen */ 444e400768SDavid Christensen 454e400768SDavid Christensen void 464e400768SDavid Christensen bxe_reg_write8(struct bxe_softc *sc, bus_size_t offset, uint8_t val) 474e400768SDavid Christensen { 484e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%02x\n", offset, val); 494e400768SDavid Christensen bus_space_write_1(sc->bar[BAR0].tag, 504e400768SDavid Christensen sc->bar[BAR0].handle, 514e400768SDavid Christensen offset, 524e400768SDavid Christensen val); 534e400768SDavid Christensen } 544e400768SDavid Christensen 554e400768SDavid Christensen void 564e400768SDavid Christensen bxe_reg_write16(struct bxe_softc *sc, bus_size_t offset, uint16_t val) 574e400768SDavid Christensen { 584e400768SDavid Christensen if ((offset % 2) != 0) { 594e400768SDavid Christensen BLOGD(sc, DBG_REGS, "Unaligned 16-bit write to 0x%08lx\n", offset); 604e400768SDavid Christensen } 614e400768SDavid Christensen 624e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%04x\n", offset, val); 634e400768SDavid Christensen bus_space_write_2(sc->bar[BAR0].tag, 644e400768SDavid Christensen sc->bar[BAR0].handle, 654e400768SDavid Christensen offset, 664e400768SDavid Christensen val); 674e400768SDavid Christensen } 684e400768SDavid Christensen 694e400768SDavid Christensen void 704e400768SDavid Christensen bxe_reg_write32(struct bxe_softc *sc, bus_size_t offset, uint32_t val) 714e400768SDavid Christensen { 724e400768SDavid Christensen if ((offset % 4) != 0) { 734e400768SDavid Christensen BLOGD(sc, DBG_REGS, "Unaligned 32-bit write to 0x%08lx\n", offset); 744e400768SDavid Christensen } 754e400768SDavid Christensen 764e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%08x\n", offset, val); 774e400768SDavid Christensen bus_space_write_4(sc->bar[BAR0].tag, 784e400768SDavid Christensen sc->bar[BAR0].handle, 794e400768SDavid Christensen offset, 804e400768SDavid Christensen val); 814e400768SDavid Christensen } 824e400768SDavid Christensen 834e400768SDavid Christensen uint8_t 844e400768SDavid Christensen bxe_reg_read8(struct bxe_softc *sc, bus_size_t offset) 854e400768SDavid Christensen { 864e400768SDavid Christensen uint8_t val; 874e400768SDavid Christensen 884e400768SDavid Christensen val = bus_space_read_1(sc->bar[BAR0].tag, 894e400768SDavid Christensen sc->bar[BAR0].handle, 904e400768SDavid Christensen offset); 914e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%02x\n", offset, val); 924e400768SDavid Christensen 934e400768SDavid Christensen return (val); 944e400768SDavid Christensen } 954e400768SDavid Christensen 964e400768SDavid Christensen uint16_t 974e400768SDavid Christensen bxe_reg_read16(struct bxe_softc *sc, bus_size_t offset) 984e400768SDavid Christensen { 994e400768SDavid Christensen uint16_t val; 1004e400768SDavid Christensen 1014e400768SDavid Christensen if ((offset % 2) != 0) { 1024e400768SDavid Christensen BLOGD(sc, DBG_REGS, "Unaligned 16-bit read from 0x%08lx\n", offset); 1034e400768SDavid Christensen } 1044e400768SDavid Christensen 1054e400768SDavid Christensen val = bus_space_read_2(sc->bar[BAR0].tag, 1064e400768SDavid Christensen sc->bar[BAR0].handle, 1074e400768SDavid Christensen offset); 1084e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%08x\n", offset, val); 1094e400768SDavid Christensen 1104e400768SDavid Christensen return (val); 1114e400768SDavid Christensen } 1124e400768SDavid Christensen 1134e400768SDavid Christensen uint32_t 1144e400768SDavid Christensen bxe_reg_read32(struct bxe_softc *sc, bus_size_t offset) 1154e400768SDavid Christensen { 1164e400768SDavid Christensen uint32_t val; 1174e400768SDavid Christensen 1184e400768SDavid Christensen if ((offset % 4) != 0) { 1194e400768SDavid Christensen BLOGD(sc, DBG_REGS, "Unaligned 32-bit read from 0x%08lx\n", offset); 1204e400768SDavid Christensen } 1214e400768SDavid Christensen 1224e400768SDavid Christensen val = bus_space_read_4(sc->bar[BAR0].tag, 1234e400768SDavid Christensen sc->bar[BAR0].handle, 1244e400768SDavid Christensen offset); 1254e400768SDavid Christensen BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%08x\n", offset, val); 1264e400768SDavid Christensen 1274e400768SDavid Christensen return (val); 1284e400768SDavid Christensen } 1294e400768SDavid Christensen 1304e400768SDavid Christensen #endif /* BXE_REG_NO_INLINE */ 1314e400768SDavid Christensen 1324e400768SDavid Christensen #ifdef ELINK_DEBUG 1334e400768SDavid Christensen 1344e400768SDavid Christensen void 1354e400768SDavid Christensen elink_cb_dbg(struct bxe_softc *sc, 1364e400768SDavid Christensen char *fmt) 1374e400768SDavid Christensen { 1384e400768SDavid Christensen char buf[128]; 1394e400768SDavid Christensen if (__predict_false(sc->debug & DBG_PHY)) { 1404e400768SDavid Christensen snprintf(buf, sizeof(buf), "ELINK: %s", fmt); 1414e400768SDavid Christensen device_printf(sc->dev, "%s", buf); 1424e400768SDavid Christensen } 1434e400768SDavid Christensen } 1444e400768SDavid Christensen 1454e400768SDavid Christensen void 1464e400768SDavid Christensen elink_cb_dbg1(struct bxe_softc *sc, 1474e400768SDavid Christensen char *fmt, 1484e400768SDavid Christensen uint32_t arg1) 1494e400768SDavid Christensen { 1504e400768SDavid Christensen char tmp[128], buf[128]; 1514e400768SDavid Christensen if (__predict_false(sc->debug & DBG_PHY)) { 1524e400768SDavid Christensen snprintf(tmp, sizeof(tmp), "ELINK: %s", fmt); 1534e400768SDavid Christensen snprintf(buf, sizeof(buf), tmp, arg1); 1544e400768SDavid Christensen device_printf(sc->dev, "%s", buf); 1554e400768SDavid Christensen } 1564e400768SDavid Christensen } 1574e400768SDavid Christensen 1584e400768SDavid Christensen void 1594e400768SDavid Christensen elink_cb_dbg2(struct bxe_softc *sc, 1604e400768SDavid Christensen char *fmt, 1614e400768SDavid Christensen uint32_t arg1, 1624e400768SDavid Christensen uint32_t arg2) 1634e400768SDavid Christensen { 1644e400768SDavid Christensen char tmp[128], buf[128]; 1654e400768SDavid Christensen if (__predict_false(sc->debug & DBG_PHY)) { 1664e400768SDavid Christensen snprintf(tmp, sizeof(tmp), "ELINK: %s", fmt); 1674e400768SDavid Christensen snprintf(buf, sizeof(buf), tmp, arg1, arg2); 1684e400768SDavid Christensen device_printf(sc->dev, "%s", buf); 1694e400768SDavid Christensen } 1704e400768SDavid Christensen } 1714e400768SDavid Christensen 1724e400768SDavid Christensen void 1734e400768SDavid Christensen elink_cb_dbg3(struct bxe_softc *sc, 1744e400768SDavid Christensen char *fmt, 1754e400768SDavid Christensen uint32_t arg1, 1764e400768SDavid Christensen uint32_t arg2, 1774e400768SDavid Christensen uint32_t arg3) 1784e400768SDavid Christensen { 1794e400768SDavid Christensen char tmp[128], buf[128]; 1804e400768SDavid Christensen if (__predict_false(sc->debug & DBG_PHY)) { 1814e400768SDavid Christensen snprintf(tmp, sizeof(tmp), "ELINK: %s", fmt); 1824e400768SDavid Christensen snprintf(buf, sizeof(buf), tmp, arg1, arg2, arg3); 1834e400768SDavid Christensen device_printf(sc->dev, "%s", buf); 1844e400768SDavid Christensen } 1854e400768SDavid Christensen } 1864e400768SDavid Christensen 1874e400768SDavid Christensen #endif /* ELINK_DEBUG */ 1884e400768SDavid Christensen 1894e400768SDavid Christensen extern struct mtx bxe_prev_mtx; 1904e400768SDavid Christensen 1914e400768SDavid Christensen void 1924e400768SDavid Christensen bxe_dump_mem(struct bxe_softc *sc, 1934e400768SDavid Christensen char *tag, 1944e400768SDavid Christensen uint8_t *mem, 1954e400768SDavid Christensen uint32_t len) 1964e400768SDavid Christensen { 1974e400768SDavid Christensen char buf[256]; 1984e400768SDavid Christensen char c[32]; 1994e400768SDavid Christensen int xx; 2004e400768SDavid Christensen 2014e400768SDavid Christensen mtx_lock(&bxe_prev_mtx); 2024e400768SDavid Christensen 2034e400768SDavid Christensen BLOGI(sc, "++++++++++++ %s\n", tag); 2044e400768SDavid Christensen strcpy(buf, "** 000: "); 2054e400768SDavid Christensen 2064e400768SDavid Christensen for (xx = 0; xx < len; xx++) 2074e400768SDavid Christensen { 2084e400768SDavid Christensen if ((xx != 0) && (xx % 16 == 0)) 2094e400768SDavid Christensen { 2104e400768SDavid Christensen BLOGI(sc, "%s\n", buf); 2114e400768SDavid Christensen strcpy(buf, "** "); 2124e400768SDavid Christensen snprintf(c, sizeof(c), "%03x", xx); 2134e400768SDavid Christensen strcat(buf, c); 2144e400768SDavid Christensen strcat(buf, ": "); 2154e400768SDavid Christensen } 2164e400768SDavid Christensen 2174e400768SDavid Christensen snprintf(c, sizeof(c), "%02x ", *mem); 2184e400768SDavid Christensen strcat(buf, c); 2194e400768SDavid Christensen 2204e400768SDavid Christensen mem++; 2214e400768SDavid Christensen } 2224e400768SDavid Christensen 2234e400768SDavid Christensen BLOGI(sc, "%s\n", buf); 2244e400768SDavid Christensen BLOGI(sc, "------------ %s\n", tag); 2254e400768SDavid Christensen 2264e400768SDavid Christensen mtx_unlock(&bxe_prev_mtx); 2274e400768SDavid Christensen } 2284e400768SDavid Christensen 2294e400768SDavid Christensen void 2304e400768SDavid Christensen bxe_dump_mbuf_data(struct bxe_softc *sc, 2314e400768SDavid Christensen char *tag, 2324e400768SDavid Christensen struct mbuf *m, 2334e400768SDavid Christensen uint8_t contents) 2344e400768SDavid Christensen { 2354e400768SDavid Christensen char buf[256]; 2364e400768SDavid Christensen char c[32]; 2374e400768SDavid Christensen uint8_t *memp; 2384e400768SDavid Christensen int i, xx = 0; 2394e400768SDavid Christensen 2404e400768SDavid Christensen mtx_lock(&bxe_prev_mtx); 2414e400768SDavid Christensen 2424e400768SDavid Christensen BLOGI(sc, "++++++++++++ %s\n", tag); 2434e400768SDavid Christensen 2444e400768SDavid Christensen while (m) 2454e400768SDavid Christensen { 2464e400768SDavid Christensen memp = m->m_data; 2474e400768SDavid Christensen strcpy(buf, "** > "); 2484e400768SDavid Christensen snprintf(c, sizeof(c), "%03x", xx); 2494e400768SDavid Christensen strcat(buf, c); 2504e400768SDavid Christensen strcat(buf, ": "); 2514e400768SDavid Christensen 2524e400768SDavid Christensen if (contents) 2534e400768SDavid Christensen { 2544e400768SDavid Christensen for (i = 0; i < m->m_len; i++) 2554e400768SDavid Christensen { 2564e400768SDavid Christensen if ((xx != 0) && (xx % 16 == 0)) 2574e400768SDavid Christensen { 2584e400768SDavid Christensen BLOGI(sc, "%s\n", buf); 2594e400768SDavid Christensen strcpy(buf, "** "); 2604e400768SDavid Christensen snprintf(c, sizeof(c), "%03x", xx); 2614e400768SDavid Christensen strcat(buf, c); 2624e400768SDavid Christensen strcat(buf, ": "); 2634e400768SDavid Christensen } 2644e400768SDavid Christensen 2654e400768SDavid Christensen snprintf(c, sizeof(c), "%02x ", *memp); 2664e400768SDavid Christensen strcat(buf, c); 2674e400768SDavid Christensen 2684e400768SDavid Christensen memp++; 2694e400768SDavid Christensen xx++; 2704e400768SDavid Christensen } 2714e400768SDavid Christensen } 2724e400768SDavid Christensen else 2734e400768SDavid Christensen { 2744e400768SDavid Christensen snprintf(c, sizeof(c), "%d", m->m_len); 2754e400768SDavid Christensen strcat(buf, c); 2764e400768SDavid Christensen xx += m->m_len; 2774e400768SDavid Christensen } 2784e400768SDavid Christensen 2794e400768SDavid Christensen BLOGI(sc, "%s\n", buf); 2804e400768SDavid Christensen m = m->m_next; 2814e400768SDavid Christensen } 2824e400768SDavid Christensen 2834e400768SDavid Christensen BLOGI(sc, "------------ %s\n", tag); 2844e400768SDavid Christensen 2854e400768SDavid Christensen mtx_unlock(&bxe_prev_mtx); 2864e400768SDavid Christensen } 2874e400768SDavid Christensen 2884e400768SDavid Christensen #ifdef DDB 2894e400768SDavid Christensen 2904e400768SDavid Christensen static void bxe_ddb_usage() 2914e400768SDavid Christensen { 2924e400768SDavid Christensen db_printf("Usage: bxe[/hpv] <instance> [<address>]\n"); 2934e400768SDavid Christensen } 2944e400768SDavid Christensen 295*258958b3SMitchell Horne DB_COMMAND_FLAGS(bxe, bxe_ddb, CS_OWN) 2964e400768SDavid Christensen { 2974e400768SDavid Christensen char if_xname[IFNAMSIZ]; 298717568adSMarcel Moolenaar if_t ifp = NULL; 2994e400768SDavid Christensen struct bxe_softc *sc; 3004e400768SDavid Christensen db_expr_t next_arg; 3014e400768SDavid Christensen int index; 3024e400768SDavid Christensen int tok; 3034e400768SDavid Christensen int mod_phys_addr = FALSE; 3044e400768SDavid Christensen int mod_virt_addr = FALSE; 3054e400768SDavid Christensen db_addr_t addr; 3064e400768SDavid Christensen 3074e400768SDavid Christensen tok = db_read_token(); 3084e400768SDavid Christensen if (tok == tSLASH) { 3094e400768SDavid Christensen tok = db_read_token(); 3104e400768SDavid Christensen if (tok != tIDENT) { 3114e400768SDavid Christensen db_printf("ERROR: bad modifier\n"); 3124e400768SDavid Christensen bxe_ddb_usage(); 3134e400768SDavid Christensen goto bxe_ddb_done; 3144e400768SDavid Christensen } 3154e400768SDavid Christensen if (strcmp(db_tok_string, "h") == 0) { 3164e400768SDavid Christensen bxe_ddb_usage(); 3174e400768SDavid Christensen goto bxe_ddb_done; 3184e400768SDavid Christensen } else if (strcmp(db_tok_string, "p") == 0) { 3194e400768SDavid Christensen mod_phys_addr = TRUE; 3204e400768SDavid Christensen } else if (strcmp(db_tok_string, "v") == 0) { 3214e400768SDavid Christensen mod_virt_addr = TRUE; 3224e400768SDavid Christensen } 3234e400768SDavid Christensen } else { 3244e400768SDavid Christensen db_unread_token(tok); 3254e400768SDavid Christensen } 3264e400768SDavid Christensen 3274e400768SDavid Christensen if (!db_expression((db_expr_t *)&index)) { 3284e400768SDavid Christensen db_printf("ERROR: bxe index missing\n"); 3294e400768SDavid Christensen bxe_ddb_usage(); 3304e400768SDavid Christensen goto bxe_ddb_done; 3314e400768SDavid Christensen } 3324e400768SDavid Christensen 3334e400768SDavid Christensen snprintf(if_xname, sizeof(if_xname), "bxe%d", index); 334717568adSMarcel Moolenaar if ((ifp = ifunit_ref(if_xname)) == NULL) /* XXX */ 3354e400768SDavid Christensen { 3364e400768SDavid Christensen db_printf("ERROR: Invalid interface %s\n", if_xname); 3374e400768SDavid Christensen goto bxe_ddb_done; 3384e400768SDavid Christensen } 3394e400768SDavid Christensen 340717568adSMarcel Moolenaar sc = (struct bxe_softc *)if_getsoftc(ifp); 3414e400768SDavid Christensen db_printf("ifnet=%p (%s)\n", ifp, if_xname); 3424e400768SDavid Christensen db_printf("softc=%p\n", sc); 3434e400768SDavid Christensen db_printf(" dev=%p\n", sc->dev); 3444e400768SDavid Christensen db_printf(" BDF=%d:%d:%d\n", 3454e400768SDavid Christensen sc->pcie_bus, sc->pcie_device, sc->pcie_func); 3464e400768SDavid Christensen 3474e400768SDavid Christensen if (mod_phys_addr || mod_virt_addr) { 3484e400768SDavid Christensen if (!db_expression((db_addr_t *)&addr)) { 3494e400768SDavid Christensen db_printf("ERROR: Invalid address\n"); 3504e400768SDavid Christensen bxe_ddb_usage(); 3514e400768SDavid Christensen goto bxe_ddb_done; 3524e400768SDavid Christensen } 3534e400768SDavid Christensen 3544e400768SDavid Christensen db_printf("addr=%p", addr); 3554e400768SDavid Christensen } 3564e400768SDavid Christensen 3574e400768SDavid Christensen bxe_ddb_done: 3584e400768SDavid Christensen 3594e400768SDavid Christensen db_flush_lex(); 3604e400768SDavid Christensen if (ifp) if_rele(ifp); 3614e400768SDavid Christensen } 3624e400768SDavid Christensen 3634e400768SDavid Christensen #endif /* DDB */ 3644e400768SDavid Christensen 365