1252206Sdavidcs/* 2252206Sdavidcs * Copyright (c) 2013-2014 Qlogic Corporation 3252206Sdavidcs * All rights reserved. 4252206Sdavidcs * 5252206Sdavidcs * Redistribution and use in source and binary forms, with or without 6252206Sdavidcs * modification, are permitted provided that the following conditions 7252206Sdavidcs * are met: 8252206Sdavidcs * 9252206Sdavidcs * 1. Redistributions of source code must retain the above copyright 10252206Sdavidcs * notice, this list of conditions and the following disclaimer. 11252206Sdavidcs * 2. Redistributions in binary form must reproduce the above copyright 12252206Sdavidcs * notice, this list of conditions and the following disclaimer in the 13252206Sdavidcs * documentation and/or other materials provided with the distribution. 14252206Sdavidcs * 15252206Sdavidcs * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16252206Sdavidcs * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17252206Sdavidcs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18252206Sdavidcs * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19252206Sdavidcs * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20252206Sdavidcs * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21252206Sdavidcs * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22252206Sdavidcs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23252206Sdavidcs * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24252206Sdavidcs * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25252206Sdavidcs * POSSIBILITY OF SUCH DAMAGE. 26252206Sdavidcs */ 27252206Sdavidcs/* 28252206Sdavidcs * File : qls_dbg.c 29252206Sdavidcs * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656. 30252206Sdavidcs */ 31252206Sdavidcs#include <sys/cdefs.h> 32252206Sdavidcs__FBSDID("$FreeBSD: releng/10.3/sys/dev/qlxge/qls_dbg.c 252206 2013-06-25 17:50:22Z davidcs $"); 33252206Sdavidcs 34252206Sdavidcs#include "qls_os.h" 35252206Sdavidcs#include "qls_hw.h" 36252206Sdavidcs#include "qls_def.h" 37252206Sdavidcs#include "qls_inline.h" 38252206Sdavidcs#include "qls_ver.h" 39252206Sdavidcs#include "qls_glbl.h" 40252206Sdavidcs#include "qls_dbg.h" 41252206Sdavidcs 42252206Sdavidcs 43252206Sdavidcsuint32_t qls_dbg_level = 0 ; 44252206Sdavidcs/* 45252206Sdavidcs * Name: qls_dump_buf32 46252206Sdavidcs * Function: dumps a buffer as 32 bit words 47252206Sdavidcs */ 48252206Sdavidcsvoid 49252206Sdavidcsqls_dump_buf32(qla_host_t *ha, const char *msg, void *dbuf32, uint32_t len32) 50252206Sdavidcs{ 51252206Sdavidcs device_t dev; 52252206Sdavidcs uint32_t i = 0; 53252206Sdavidcs uint32_t *buf; 54252206Sdavidcs 55252206Sdavidcs dev = ha->pci_dev; 56252206Sdavidcs buf = dbuf32; 57252206Sdavidcs 58252206Sdavidcs device_printf(dev, "%s: %s dump start\n", __func__, msg); 59252206Sdavidcs 60252206Sdavidcs while (len32 >= 4) { 61252206Sdavidcs device_printf(dev,"0x%08x:\t0x%08x, 0x%08x, 0x%08x, 0x%08x,\n", 62252206Sdavidcs i, buf[0], buf[1], buf[2], buf[3]); 63252206Sdavidcs i += 4 * 4; 64252206Sdavidcs len32 -= 4; 65252206Sdavidcs buf += 4; 66252206Sdavidcs } 67252206Sdavidcs switch (len32) { 68252206Sdavidcs case 1: 69252206Sdavidcs device_printf(dev,"0x%08x: 0x%08x\n", i, buf[0]); 70252206Sdavidcs break; 71252206Sdavidcs case 2: 72252206Sdavidcs device_printf(dev,"0x%08x: 0x%08x 0x%08x\n", i, buf[0], buf[1]); 73252206Sdavidcs break; 74252206Sdavidcs case 3: 75252206Sdavidcs device_printf(dev,"0x%08x: 0x%08x 0x%08x 0x%08x\n", 76252206Sdavidcs i, buf[0], buf[1], buf[2]); 77252206Sdavidcs break; 78252206Sdavidcs default: 79252206Sdavidcs break; 80252206Sdavidcs } 81252206Sdavidcs device_printf(dev, "%s: %s dump end\n", __func__, msg); 82252206Sdavidcs 83252206Sdavidcs return; 84252206Sdavidcs} 85252206Sdavidcs 86252206Sdavidcs/* 87252206Sdavidcs * Name: qls_dump_buf16 88252206Sdavidcs * Function: dumps a buffer as 16 bit words 89252206Sdavidcs */ 90252206Sdavidcsvoid 91252206Sdavidcsqls_dump_buf16(qla_host_t *ha, const char *msg, void *dbuf16, uint32_t len16) 92252206Sdavidcs{ 93252206Sdavidcs device_t dev; 94252206Sdavidcs uint32_t i = 0; 95252206Sdavidcs uint16_t *buf; 96252206Sdavidcs 97252206Sdavidcs dev = ha->pci_dev; 98252206Sdavidcs buf = dbuf16; 99252206Sdavidcs 100252206Sdavidcs device_printf(dev, "%s: %s dump start\n", __func__, msg); 101252206Sdavidcs 102252206Sdavidcs while (len16 >= 8) { 103252206Sdavidcs device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x 0x%04x" 104252206Sdavidcs " 0x%04x 0x%04x 0x%04x 0x%04x\n", i, buf[0], 105252206Sdavidcs buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); 106252206Sdavidcs i += 16; 107252206Sdavidcs len16 -= 8; 108252206Sdavidcs buf += 8; 109252206Sdavidcs } 110252206Sdavidcs switch (len16) { 111252206Sdavidcs case 1: 112252206Sdavidcs device_printf(dev,"0x%08x: 0x%04x\n", i, buf[0]); 113252206Sdavidcs break; 114252206Sdavidcs case 2: 115252206Sdavidcs device_printf(dev,"0x%08x: 0x%04x 0x%04x\n", i, buf[0], buf[1]); 116252206Sdavidcs break; 117252206Sdavidcs case 3: 118252206Sdavidcs device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x\n", 119252206Sdavidcs i, buf[0], buf[1], buf[2]); 120252206Sdavidcs break; 121252206Sdavidcs case 4: 122252206Sdavidcs device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x 0x%04x\n", i, 123252206Sdavidcs buf[0], buf[1], buf[2], buf[3]); 124252206Sdavidcs break; 125252206Sdavidcs case 5: 126252206Sdavidcs device_printf(dev,"0x%08x:" 127252206Sdavidcs " 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n", i, 128252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4]); 129252206Sdavidcs break; 130252206Sdavidcs case 6: 131252206Sdavidcs device_printf(dev,"0x%08x:" 132252206Sdavidcs " 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n", i, 133252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); 134252206Sdavidcs break; 135252206Sdavidcs case 7: 136252206Sdavidcs device_printf(dev,"0x%04x: 0x%04x 0x%04x 0x%04x 0x%04x" 137252206Sdavidcs " 0x%04x 0x%04x 0x%04x\n", i, buf[0], buf[1], 138252206Sdavidcs buf[2], buf[3], buf[4], buf[5], buf[6]); 139252206Sdavidcs break; 140252206Sdavidcs default: 141252206Sdavidcs break; 142252206Sdavidcs } 143252206Sdavidcs device_printf(dev, "%s: %s dump end\n", __func__, msg); 144252206Sdavidcs 145252206Sdavidcs return; 146252206Sdavidcs} 147252206Sdavidcs 148252206Sdavidcs/* 149252206Sdavidcs * Name: qls_dump_buf8 150252206Sdavidcs * Function: dumps a buffer as bytes 151252206Sdavidcs */ 152252206Sdavidcsvoid 153252206Sdavidcsqls_dump_buf8(qla_host_t *ha, const char *msg, void *dbuf, uint32_t len) 154252206Sdavidcs{ 155252206Sdavidcs device_t dev; 156252206Sdavidcs uint32_t i = 0; 157252206Sdavidcs uint8_t *buf; 158252206Sdavidcs 159252206Sdavidcs dev = ha->pci_dev; 160252206Sdavidcs buf = dbuf; 161252206Sdavidcs 162252206Sdavidcs device_printf(dev, "%s: %s 0x%x dump start\n", __func__, msg, len); 163252206Sdavidcs 164252206Sdavidcs while (len >= 16) { 165252206Sdavidcs device_printf(dev,"0x%08x:" 166252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x" 167252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x\n", i, 168252206Sdavidcs buf[0], buf[1], buf[2], buf[3], 169252206Sdavidcs buf[4], buf[5], buf[6], buf[7], 170252206Sdavidcs buf[8], buf[9], buf[10], buf[11], 171252206Sdavidcs buf[12], buf[13], buf[14], buf[15]); 172252206Sdavidcs i += 16; 173252206Sdavidcs len -= 16; 174252206Sdavidcs buf += 16; 175252206Sdavidcs } 176252206Sdavidcs switch (len) { 177252206Sdavidcs case 1: 178252206Sdavidcs device_printf(dev,"0x%08x: %02x\n", i, buf[0]); 179252206Sdavidcs break; 180252206Sdavidcs case 2: 181252206Sdavidcs device_printf(dev,"0x%08x: %02x %02x\n", i, buf[0], buf[1]); 182252206Sdavidcs break; 183252206Sdavidcs case 3: 184252206Sdavidcs device_printf(dev,"0x%08x: %02x %02x %02x\n", 185252206Sdavidcs i, buf[0], buf[1], buf[2]); 186252206Sdavidcs break; 187252206Sdavidcs case 4: 188252206Sdavidcs device_printf(dev,"0x%08x: %02x %02x %02x %02x\n", i, 189252206Sdavidcs buf[0], buf[1], buf[2], buf[3]); 190252206Sdavidcs break; 191252206Sdavidcs case 5: 192252206Sdavidcs device_printf(dev,"0x%08x:" 193252206Sdavidcs " %02x %02x %02x %02x %02x\n", i, 194252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4]); 195252206Sdavidcs break; 196252206Sdavidcs case 6: 197252206Sdavidcs device_printf(dev,"0x%08x:" 198252206Sdavidcs " %02x %02x %02x %02x %02x %02x\n", i, 199252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); 200252206Sdavidcs break; 201252206Sdavidcs case 7: 202252206Sdavidcs device_printf(dev,"0x%08x:" 203252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x\n", i, 204252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); 205252206Sdavidcs break; 206252206Sdavidcs case 8: 207252206Sdavidcs device_printf(dev,"0x%08x:" 208252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x\n", i, 209252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], 210252206Sdavidcs buf[7]); 211252206Sdavidcs break; 212252206Sdavidcs case 9: 213252206Sdavidcs device_printf(dev,"0x%08x:" 214252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x" 215252206Sdavidcs " %02x\n", i, 216252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], 217252206Sdavidcs buf[7], buf[8]); 218252206Sdavidcs break; 219252206Sdavidcs case 10: 220252206Sdavidcs device_printf(dev,"0x%08x:" 221252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x" 222252206Sdavidcs " %02x %02x\n", i, 223252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], 224252206Sdavidcs buf[7], buf[8], buf[9]); 225252206Sdavidcs break; 226252206Sdavidcs case 11: 227252206Sdavidcs device_printf(dev,"0x%08x:" 228252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x" 229252206Sdavidcs " %02x %02x %02x\n", i, 230252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], 231252206Sdavidcs buf[7], buf[8], buf[9], buf[10]); 232252206Sdavidcs break; 233252206Sdavidcs case 12: 234252206Sdavidcs device_printf(dev,"0x%08x:" 235252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x" 236252206Sdavidcs " %02x %02x %02x %02x\n", i, 237252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], 238252206Sdavidcs buf[7], buf[8], buf[9], buf[10], buf[11]); 239252206Sdavidcs break; 240252206Sdavidcs case 13: 241252206Sdavidcs device_printf(dev,"0x%08x:" 242252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x" 243252206Sdavidcs " %02x %02x %02x %02x %02x\n", i, 244252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], 245252206Sdavidcs buf[7], buf[8], buf[9], buf[10], buf[11], buf[12]); 246252206Sdavidcs break; 247252206Sdavidcs case 14: 248252206Sdavidcs device_printf(dev,"0x%08x:" 249252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x" 250252206Sdavidcs " %02x %02x %02x %02x %02x %02x\n", i, 251252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], 252252206Sdavidcs buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], 253252206Sdavidcs buf[13]); 254252206Sdavidcs break; 255252206Sdavidcs case 15: 256252206Sdavidcs device_printf(dev,"0x%08x:" 257252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x %02x" 258252206Sdavidcs " %02x %02x %02x %02x %02x %02x %02x\n", i, 259252206Sdavidcs buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], 260252206Sdavidcs buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], 261252206Sdavidcs buf[13], buf[14]); 262252206Sdavidcs break; 263252206Sdavidcs default: 264252206Sdavidcs break; 265252206Sdavidcs } 266252206Sdavidcs 267252206Sdavidcs device_printf(dev, "%s: %s dump end\n", __func__, msg); 268252206Sdavidcs 269252206Sdavidcs return; 270252206Sdavidcs} 271252206Sdavidcs 272252206Sdavidcsvoid 273252206Sdavidcsqls_dump_cq(qla_host_t *ha) 274252206Sdavidcs{ 275252206Sdavidcs qls_dump_buf32(ha, "cq_icb", ha->rx_ring[0].cq_icb_vaddr, 276252206Sdavidcs (sizeof (q81_cq_icb_t) >> 2)); 277252206Sdavidcs 278252206Sdavidcs device_printf(ha->pci_dev, "%s: lbq_addr_tbl_paddr %p\n", __func__, 279252206Sdavidcs (void *)ha->rx_ring[0].lbq_addr_tbl_paddr); 280252206Sdavidcs 281252206Sdavidcs qls_dump_buf32(ha, "lbq_addr_tbl", ha->rx_ring[0].lbq_addr_tbl_vaddr, 282252206Sdavidcs (PAGE_SIZE >> 2)); 283252206Sdavidcs 284252206Sdavidcs device_printf(ha->pci_dev, "%s: lbq_paddr %p\n", __func__, 285252206Sdavidcs (void *)ha->rx_ring[0].lbq_paddr); 286252206Sdavidcs 287252206Sdavidcs qls_dump_buf32(ha, "lbq", ha->rx_ring[0].lbq_vaddr, 288252206Sdavidcs (QLA_LBQ_SIZE >> 2)); 289252206Sdavidcs 290252206Sdavidcs device_printf(ha->pci_dev, "%s: sbq_addr_tbl_paddr %p\n", __func__, 291252206Sdavidcs (void *)ha->rx_ring[0].sbq_addr_tbl_paddr); 292252206Sdavidcs 293252206Sdavidcs qls_dump_buf32(ha, "sbq_addr_tbl", ha->rx_ring[0].sbq_addr_tbl_vaddr, 294252206Sdavidcs (PAGE_SIZE >> 2)); 295252206Sdavidcs 296252206Sdavidcs device_printf(ha->pci_dev, "%s: sbq_paddr %p\n", __func__, 297252206Sdavidcs (void *)ha->rx_ring[0].sbq_paddr); 298252206Sdavidcs 299252206Sdavidcs qls_dump_buf32(ha, "sbq", ha->rx_ring[0].sbq_vaddr, 300252206Sdavidcs (QLA_SBQ_SIZE >> 2) ); 301252206Sdavidcs 302252206Sdavidcs device_printf(ha->pci_dev, "%s: lb_paddr %p\n", __func__, 303252206Sdavidcs (void *)ha->rx_ring[0].lb_paddr); 304252206Sdavidcs 305252206Sdavidcs return; 306252206Sdavidcs} 307252206Sdavidcs 308