14e400768SDavid Christensen /*- 2e36ffbddSDavid C Somayajulu * Copyright (c) 2007-2014 QLogic Corporation. All rights reserved. 34e400768SDavid Christensen * 44e400768SDavid Christensen * Redistribution and use in source and binary forms, with or without 54e400768SDavid Christensen * modification, are permitted provided that the following conditions 64e400768SDavid Christensen * are met: 74e400768SDavid Christensen * 84e400768SDavid Christensen * 1. Redistributions of source code must retain the above copyright 94e400768SDavid Christensen * notice, this list of conditions and the following disclaimer. 104e400768SDavid Christensen * 2. Redistributions in binary form must reproduce the above copyright 114e400768SDavid Christensen * notice, this list of conditions and the following disclaimer in the 124e400768SDavid Christensen * documentation and/or other materials provided with the distribution. 134e400768SDavid Christensen * 144e400768SDavid Christensen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS' 154e400768SDavid Christensen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 164e400768SDavid Christensen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 174e400768SDavid Christensen * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 184e400768SDavid Christensen * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 194e400768SDavid Christensen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 204e400768SDavid Christensen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 214e400768SDavid Christensen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 224e400768SDavid Christensen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 234e400768SDavid Christensen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 244e400768SDavid Christensen * THE POSSIBILITY OF SUCH DAMAGE. 254e400768SDavid Christensen */ 264e400768SDavid Christensen 274e400768SDavid Christensen #include <sys/cdefs.h> 284e400768SDavid Christensen __FBSDID("$FreeBSD$"); 294e400768SDavid Christensen 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 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 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 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 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 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 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 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 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 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 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 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 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 2884e400768SDavid Christensen static void bxe_ddb_usage() 2894e400768SDavid Christensen { 2904e400768SDavid Christensen db_printf("Usage: bxe[/hpv] <instance> [<address>]\n"); 2914e400768SDavid Christensen } 2924e400768SDavid Christensen 2934e400768SDavid Christensen static db_cmdfcn_t bxe_ddb; 2944e400768SDavid Christensen _DB_SET(_cmd, bxe, bxe_ddb, db_cmd_table, CS_OWN, NULL); 2954e400768SDavid Christensen 2964e400768SDavid Christensen static void bxe_ddb(db_expr_t blah1, 2974e400768SDavid Christensen boolean_t blah2, 2984e400768SDavid Christensen db_expr_t blah3, 2994e400768SDavid Christensen char *blah4) 3004e400768SDavid Christensen { 3014e400768SDavid Christensen char if_xname[IFNAMSIZ]; 302*717568adSMarcel Moolenaar if_t ifp = NULL; 3034e400768SDavid Christensen struct bxe_softc *sc; 3044e400768SDavid Christensen db_expr_t next_arg; 3054e400768SDavid Christensen int index; 3064e400768SDavid Christensen int tok; 3074e400768SDavid Christensen int mod_phys_addr = FALSE; 3084e400768SDavid Christensen int mod_virt_addr = FALSE; 3094e400768SDavid Christensen db_addr_t addr; 3104e400768SDavid Christensen 3114e400768SDavid Christensen tok = db_read_token(); 3124e400768SDavid Christensen if (tok == tSLASH) { 3134e400768SDavid Christensen tok = db_read_token(); 3144e400768SDavid Christensen if (tok != tIDENT) { 3154e400768SDavid Christensen db_printf("ERROR: bad modifier\n"); 3164e400768SDavid Christensen bxe_ddb_usage(); 3174e400768SDavid Christensen goto bxe_ddb_done; 3184e400768SDavid Christensen } 3194e400768SDavid Christensen if (strcmp(db_tok_string, "h") == 0) { 3204e400768SDavid Christensen bxe_ddb_usage(); 3214e400768SDavid Christensen goto bxe_ddb_done; 3224e400768SDavid Christensen } else if (strcmp(db_tok_string, "p") == 0) { 3234e400768SDavid Christensen mod_phys_addr = TRUE; 3244e400768SDavid Christensen } else if (strcmp(db_tok_string, "v") == 0) { 3254e400768SDavid Christensen mod_virt_addr = TRUE; 3264e400768SDavid Christensen } 3274e400768SDavid Christensen } else { 3284e400768SDavid Christensen db_unread_token(tok); 3294e400768SDavid Christensen } 3304e400768SDavid Christensen 3314e400768SDavid Christensen if (!db_expression((db_expr_t *)&index)) { 3324e400768SDavid Christensen db_printf("ERROR: bxe index missing\n"); 3334e400768SDavid Christensen bxe_ddb_usage(); 3344e400768SDavid Christensen goto bxe_ddb_done; 3354e400768SDavid Christensen } 3364e400768SDavid Christensen 3374e400768SDavid Christensen snprintf(if_xname, sizeof(if_xname), "bxe%d", index); 338*717568adSMarcel Moolenaar if ((ifp = ifunit_ref(if_xname)) == NULL) /* XXX */ 3394e400768SDavid Christensen { 3404e400768SDavid Christensen db_printf("ERROR: Invalid interface %s\n", if_xname); 3414e400768SDavid Christensen goto bxe_ddb_done; 3424e400768SDavid Christensen } 3434e400768SDavid Christensen 344*717568adSMarcel Moolenaar sc = (struct bxe_softc *)if_getsoftc(ifp); 3454e400768SDavid Christensen db_printf("ifnet=%p (%s)\n", ifp, if_xname); 3464e400768SDavid Christensen db_printf("softc=%p\n", sc); 3474e400768SDavid Christensen db_printf(" dev=%p\n", sc->dev); 3484e400768SDavid Christensen db_printf(" BDF=%d:%d:%d\n", 3494e400768SDavid Christensen sc->pcie_bus, sc->pcie_device, sc->pcie_func); 3504e400768SDavid Christensen 3514e400768SDavid Christensen if (mod_phys_addr || mod_virt_addr) { 3524e400768SDavid Christensen if (!db_expression((db_addr_t *)&addr)) { 3534e400768SDavid Christensen db_printf("ERROR: Invalid address\n"); 3544e400768SDavid Christensen bxe_ddb_usage(); 3554e400768SDavid Christensen goto bxe_ddb_done; 3564e400768SDavid Christensen } 3574e400768SDavid Christensen 3584e400768SDavid Christensen db_printf("addr=%p", addr); 3594e400768SDavid Christensen } 3604e400768SDavid Christensen 3614e400768SDavid Christensen bxe_ddb_done: 3624e400768SDavid Christensen 3634e400768SDavid Christensen db_flush_lex(); 3644e400768SDavid Christensen if (ifp) if_rele(ifp); 3654e400768SDavid Christensen } 3664e400768SDavid Christensen 3674e400768SDavid Christensen #endif /* DDB */ 3684e400768SDavid Christensen 369