1 /* 2 * Copyright (c) 2013-2014 Qlogic Corporation 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 /* 29 * File: qls_dump.c 30 */ 31 #include <sys/cdefs.h> 32 __FBSDID("$FreeBSD$"); 33 34 35 #include "qls_os.h" 36 #include "qls_hw.h" 37 #include "qls_def.h" 38 #include "qls_glbl.h" 39 #include "qls_dump.h" 40 41 qls_mpi_coredump_t ql_mpi_coredump; 42 43 #define Q81_CORE_SEG_NUM 1 44 #define Q81_TEST_LOGIC_SEG_NUM 2 45 #define Q81_RMII_SEG_NUM 3 46 #define Q81_FCMAC1_SEG_NUM 4 47 #define Q81_FCMAC2_SEG_NUM 5 48 #define Q81_FC1_MBOX_SEG_NUM 6 49 #define Q81_IDE_SEG_NUM 7 50 #define Q81_NIC1_MBOX_SEG_NUM 8 51 #define Q81_SMBUS_SEG_NUM 9 52 #define Q81_FC2_MBOX_SEG_NUM 10 53 #define Q81_NIC2_MBOX_SEG_NUM 11 54 #define Q81_I2C_SEG_NUM 12 55 #define Q81_MEMC_SEG_NUM 13 56 #define Q81_PBUS_SEG_NUM 14 57 #define Q81_MDE_SEG_NUM 15 58 #define Q81_NIC1_CONTROL_SEG_NUM 16 59 #define Q81_NIC2_CONTROL_SEG_NUM 17 60 #define Q81_NIC1_XGMAC_SEG_NUM 18 61 #define Q81_NIC2_XGMAC_SEG_NUM 19 62 #define Q81_WCS_RAM_SEG_NUM 20 63 #define Q81_MEMC_RAM_SEG_NUM 21 64 #define Q81_XAUI1_AN_SEG_NUM 22 65 #define Q81_XAUI1_HSS_PCS_SEG_NUM 23 66 #define Q81_XFI1_AN_SEG_NUM 24 67 #define Q81_XFI1_TRAIN_SEG_NUM 25 68 #define Q81_XFI1_HSS_PCS_SEG_NUM 26 69 #define Q81_XFI1_HSS_TX_SEG_NUM 27 70 #define Q81_XFI1_HSS_RX_SEG_NUM 28 71 #define Q81_XFI1_HSS_PLL_SEG_NUM 29 72 #define Q81_INTR_STATES_SEG_NUM 31 73 #define Q81_ETS_SEG_NUM 34 74 #define Q81_PROBE_DUMP_SEG_NUM 35 75 #define Q81_ROUTING_INDEX_SEG_NUM 36 76 #define Q81_MAC_PROTOCOL_SEG_NUM 37 77 #define Q81_XAUI2_AN_SEG_NUM 38 78 #define Q81_XAUI2_HSS_PCS_SEG_NUM 39 79 #define Q81_XFI2_AN_SEG_NUM 40 80 #define Q81_XFI2_TRAIN_SEG_NUM 41 81 #define Q81_XFI2_HSS_PCS_SEG_NUM 42 82 #define Q81_XFI2_HSS_TX_SEG_NUM 43 83 #define Q81_XFI2_HSS_RX_SEG_NUM 44 84 #define Q81_XFI2_HSS_PLL_SEG_NUM 45 85 #define Q81_WQC1_SEG_NUM 46 86 #define Q81_CQC1_SEG_NUM 47 87 #define Q81_WQC2_SEG_NUM 48 88 #define Q81_CQC2_SEG_NUM 49 89 #define Q81_SEM_REGS_SEG_NUM 50 90 91 enum 92 { 93 Q81_PAUSE_SRC_LO = 0x00000100, 94 Q81_PAUSE_SRC_HI = 0x00000104, 95 Q81_GLOBAL_CFG = 0x00000108, 96 Q81_GLOBAL_CFG_RESET = (1 << 0), /*Control*/ 97 Q81_GLOBAL_CFG_JUMBO = (1 << 6), /*Control*/ 98 Q81_GLOBAL_CFG_TX_STAT_EN = (1 << 10), /*Control*/ 99 Q81_GLOBAL_CFG_RX_STAT_EN = (1 << 11), /*Control*/ 100 Q81_TX_CFG = 0x0000010c, 101 Q81_TX_CFG_RESET = (1 << 0), /*Control*/ 102 Q81_TX_CFG_EN = (1 << 1), /*Control*/ 103 Q81_TX_CFG_PREAM = (1 << 2), /*Control*/ 104 Q81_RX_CFG = 0x00000110, 105 Q81_RX_CFG_RESET = (1 << 0), /*Control*/ 106 Q81_RX_CFG_EN = (1 << 1), /*Control*/ 107 Q81_RX_CFG_PREAM = (1 << 2), /*Control*/ 108 Q81_FLOW_CTL = 0x0000011c, 109 Q81_PAUSE_OPCODE = 0x00000120, 110 Q81_PAUSE_TIMER = 0x00000124, 111 Q81_PAUSE_FRM_DEST_LO = 0x00000128, 112 Q81_PAUSE_FRM_DEST_HI = 0x0000012c, 113 Q81_MAC_TX_PARAMS = 0x00000134, 114 Q81_MAC_TX_PARAMS_JUMBO = (1U << 31), /*Control*/ 115 Q81_MAC_TX_PARAMS_SIZE_SHIFT = 16, /*Control*/ 116 Q81_MAC_RX_PARAMS = 0x00000138, 117 Q81_MAC_SYS_INT = 0x00000144, 118 Q81_MAC_SYS_INT_MASK = 0x00000148, 119 Q81_MAC_MGMT_INT = 0x0000014c, 120 Q81_MAC_MGMT_IN_MASK = 0x00000150, 121 Q81_EXT_ARB_MODE = 0x000001fc, 122 Q81_TX_PKTS = 0x00000200, 123 Q81_TX_PKTS_LO = 0x00000204, 124 Q81_TX_BYTES = 0x00000208, 125 Q81_TX_BYTES_LO = 0x0000020C, 126 Q81_TX_MCAST_PKTS = 0x00000210, 127 Q81_TX_MCAST_PKTS_LO = 0x00000214, 128 Q81_TX_BCAST_PKTS = 0x00000218, 129 Q81_TX_BCAST_PKTS_LO = 0x0000021C, 130 Q81_TX_UCAST_PKTS = 0x00000220, 131 Q81_TX_UCAST_PKTS_LO = 0x00000224, 132 Q81_TX_CTL_PKTS = 0x00000228, 133 Q81_TX_CTL_PKTS_LO = 0x0000022c, 134 Q81_TX_PAUSE_PKTS = 0x00000230, 135 Q81_TX_PAUSE_PKTS_LO = 0x00000234, 136 Q81_TX_64_PKT = 0x00000238, 137 Q81_TX_64_PKT_LO = 0x0000023c, 138 Q81_TX_65_TO_127_PKT = 0x00000240, 139 Q81_TX_65_TO_127_PKT_LO = 0x00000244, 140 Q81_TX_128_TO_255_PKT = 0x00000248, 141 Q81_TX_128_TO_255_PKT_LO = 0x0000024c, 142 Q81_TX_256_511_PKT = 0x00000250, 143 Q81_TX_256_511_PKT_LO = 0x00000254, 144 Q81_TX_512_TO_1023_PKT = 0x00000258, 145 Q81_TX_512_TO_1023_PKT_LO = 0x0000025c, 146 Q81_TX_1024_TO_1518_PKT = 0x00000260, 147 Q81_TX_1024_TO_1518_PKT_LO = 0x00000264, 148 Q81_TX_1519_TO_MAX_PKT = 0x00000268, 149 Q81_TX_1519_TO_MAX_PKT_LO = 0x0000026c, 150 Q81_TX_UNDERSIZE_PKT = 0x00000270, 151 Q81_TX_UNDERSIZE_PKT_LO = 0x00000274, 152 Q81_TX_OVERSIZE_PKT = 0x00000278, 153 Q81_TX_OVERSIZE_PKT_LO = 0x0000027c, 154 Q81_RX_HALF_FULL_DET = 0x000002a0, 155 Q81_TX_HALF_FULL_DET_LO = 0x000002a4, 156 Q81_RX_OVERFLOW_DET = 0x000002a8, 157 Q81_TX_OVERFLOW_DET_LO = 0x000002ac, 158 Q81_RX_HALF_FULL_MASK = 0x000002b0, 159 Q81_TX_HALF_FULL_MASK_LO = 0x000002b4, 160 Q81_RX_OVERFLOW_MASK = 0x000002b8, 161 Q81_TX_OVERFLOW_MASK_LO = 0x000002bc, 162 Q81_STAT_CNT_CTL = 0x000002c0, 163 Q81_STAT_CNT_CTL_CLEAR_TX = (1 << 0), /*Control*/ 164 Q81_STAT_CNT_CTL_CLEAR_RX = (1 << 1), /*Control*/ 165 Q81_AUX_RX_HALF_FULL_DET = 0x000002d0, 166 Q81_AUX_TX_HALF_FULL_DET = 0x000002d4, 167 Q81_AUX_RX_OVERFLOW_DET = 0x000002d8, 168 Q81_AUX_TX_OVERFLOW_DET = 0x000002dc, 169 Q81_AUX_RX_HALF_FULL_MASK = 0x000002f0, 170 Q81_AUX_TX_HALF_FULL_MASK = 0x000002f4, 171 Q81_AUX_RX_OVERFLOW_MASK = 0x000002f8, 172 Q81_AUX_TX_OVERFLOW_MASK = 0x000002fc, 173 Q81_RX_BYTES = 0x00000300, 174 Q81_RX_BYTES_LO = 0x00000304, 175 Q81_RX_BYTES_OK = 0x00000308, 176 Q81_RX_BYTES_OK_LO = 0x0000030c, 177 Q81_RX_PKTS = 0x00000310, 178 Q81_RX_PKTS_LO = 0x00000314, 179 Q81_RX_PKTS_OK = 0x00000318, 180 Q81_RX_PKTS_OK_LO = 0x0000031c, 181 Q81_RX_BCAST_PKTS = 0x00000320, 182 Q81_RX_BCAST_PKTS_LO = 0x00000324, 183 Q81_RX_MCAST_PKTS = 0x00000328, 184 Q81_RX_MCAST_PKTS_LO = 0x0000032c, 185 Q81_RX_UCAST_PKTS = 0x00000330, 186 Q81_RX_UCAST_PKTS_LO = 0x00000334, 187 Q81_RX_UNDERSIZE_PKTS = 0x00000338, 188 Q81_RX_UNDERSIZE_PKTS_LO = 0x0000033c, 189 Q81_RX_OVERSIZE_PKTS = 0x00000340, 190 Q81_RX_OVERSIZE_PKTS_LO = 0x00000344, 191 Q81_RX_JABBER_PKTS = 0x00000348, 192 Q81_RX_JABBER_PKTS_LO = 0x0000034c, 193 Q81_RX_UNDERSIZE_FCERR_PKTS = 0x00000350, 194 Q81_RX_UNDERSIZE_FCERR_PKTS_LO = 0x00000354, 195 Q81_RX_DROP_EVENTS = 0x00000358, 196 Q81_RX_DROP_EVENTS_LO = 0x0000035c, 197 Q81_RX_FCERR_PKTS = 0x00000360, 198 Q81_RX_FCERR_PKTS_LO = 0x00000364, 199 Q81_RX_ALIGN_ERR = 0x00000368, 200 Q81_RX_ALIGN_ERR_LO = 0x0000036c, 201 Q81_RX_SYMBOL_ERR = 0x00000370, 202 Q81_RX_SYMBOL_ERR_LO = 0x00000374, 203 Q81_RX_MAC_ERR = 0x00000378, 204 Q81_RX_MAC_ERR_LO = 0x0000037c, 205 Q81_RX_CTL_PKTS = 0x00000380, 206 Q81_RX_CTL_PKTS_LO = 0x00000384, 207 Q81_RX_PAUSE_PKTS = 0x00000388, 208 Q81_RX_PAUSE_PKTS_LO = 0x0000038c, 209 Q81_RX_64_PKTS = 0x00000390, 210 Q81_RX_64_PKTS_LO = 0x00000394, 211 Q81_RX_65_TO_127_PKTS = 0x00000398, 212 Q81_RX_65_TO_127_PKTS_LO = 0x0000039c, 213 Q81_RX_128_255_PKTS = 0x000003a0, 214 Q81_RX_128_255_PKTS_LO = 0x000003a4, 215 Q81_RX_256_511_PKTS = 0x000003a8, 216 Q81_RX_256_511_PKTS_LO = 0x000003ac, 217 Q81_RX_512_TO_1023_PKTS = 0x000003b0, 218 Q81_RX_512_TO_1023_PKTS_LO = 0x000003b4, 219 Q81_RX_1024_TO_1518_PKTS = 0x000003b8, 220 Q81_RX_1024_TO_1518_PKTS_LO = 0x000003bc, 221 Q81_RX_1519_TO_MAX_PKTS = 0x000003c0, 222 Q81_RX_1519_TO_MAX_PKTS_LO = 0x000003c4, 223 Q81_RX_LEN_ERR_PKTS = 0x000003c8, 224 Q81_RX_LEN_ERR_PKTS_LO = 0x000003cc, 225 Q81_MDIO_TX_DATA = 0x00000400, 226 Q81_MDIO_RX_DATA = 0x00000410, 227 Q81_MDIO_CMD = 0x00000420, 228 Q81_MDIO_PHY_ADDR = 0x00000430, 229 Q81_MDIO_PORT = 0x00000440, 230 Q81_MDIO_STATUS = 0x00000450, 231 Q81_TX_CBFC_PAUSE_FRAMES0 = 0x00000500, 232 Q81_TX_CBFC_PAUSE_FRAMES0_LO = 0x00000504, 233 Q81_TX_CBFC_PAUSE_FRAMES1 = 0x00000508, 234 Q81_TX_CBFC_PAUSE_FRAMES1_LO = 0x0000050C, 235 Q81_TX_CBFC_PAUSE_FRAMES2 = 0x00000510, 236 Q81_TX_CBFC_PAUSE_FRAMES2_LO = 0x00000514, 237 Q81_TX_CBFC_PAUSE_FRAMES3 = 0x00000518, 238 Q81_TX_CBFC_PAUSE_FRAMES3_LO = 0x0000051C, 239 Q81_TX_CBFC_PAUSE_FRAMES4 = 0x00000520, 240 Q81_TX_CBFC_PAUSE_FRAMES4_LO = 0x00000524, 241 Q81_TX_CBFC_PAUSE_FRAMES5 = 0x00000528, 242 Q81_TX_CBFC_PAUSE_FRAMES5_LO = 0x0000052C, 243 Q81_TX_CBFC_PAUSE_FRAMES6 = 0x00000530, 244 Q81_TX_CBFC_PAUSE_FRAMES6_LO = 0x00000534, 245 Q81_TX_CBFC_PAUSE_FRAMES7 = 0x00000538, 246 Q81_TX_CBFC_PAUSE_FRAMES7_LO = 0x0000053C, 247 Q81_TX_FCOE_PKTS = 0x00000540, 248 Q81_TX_FCOE_PKTS_LO = 0x00000544, 249 Q81_TX_MGMT_PKTS = 0x00000548, 250 Q81_TX_MGMT_PKTS_LO = 0x0000054C, 251 Q81_RX_CBFC_PAUSE_FRAMES0 = 0x00000568, 252 Q81_RX_CBFC_PAUSE_FRAMES0_LO = 0x0000056C, 253 Q81_RX_CBFC_PAUSE_FRAMES1 = 0x00000570, 254 Q81_RX_CBFC_PAUSE_FRAMES1_LO = 0x00000574, 255 Q81_RX_CBFC_PAUSE_FRAMES2 = 0x00000578, 256 Q81_RX_CBFC_PAUSE_FRAMES2_LO = 0x0000057C, 257 Q81_RX_CBFC_PAUSE_FRAMES3 = 0x00000580, 258 Q81_RX_CBFC_PAUSE_FRAMES3_LO = 0x00000584, 259 Q81_RX_CBFC_PAUSE_FRAMES4 = 0x00000588, 260 Q81_RX_CBFC_PAUSE_FRAMES4_LO = 0x0000058C, 261 Q81_RX_CBFC_PAUSE_FRAMES5 = 0x00000590, 262 Q81_RX_CBFC_PAUSE_FRAMES5_LO = 0x00000594, 263 Q81_RX_CBFC_PAUSE_FRAMES6 = 0x00000598, 264 Q81_RX_CBFC_PAUSE_FRAMES6_LO = 0x0000059C, 265 Q81_RX_CBFC_PAUSE_FRAMES7 = 0x000005A0, 266 Q81_RX_CBFC_PAUSE_FRAMES7_LO = 0x000005A4, 267 Q81_RX_FCOE_PKTS = 0x000005A8, 268 Q81_RX_FCOE_PKTS_LO = 0x000005AC, 269 Q81_RX_MGMT_PKTS = 0x000005B0, 270 Q81_RX_MGMT_PKTS_LO = 0x000005B4, 271 Q81_RX_NIC_FIFO_DROP = 0x000005B8, 272 Q81_RX_NIC_FIFO_DROP_LO = 0x000005BC, 273 Q81_RX_FCOE_FIFO_DROP = 0x000005C0, 274 Q81_RX_FCOE_FIFO_DROP_LO = 0x000005C4, 275 Q81_RX_MGMT_FIFO_DROP = 0x000005C8, 276 Q81_RX_MGMT_FIFO_DROP_LO = 0x000005CC, 277 Q81_RX_PKTS_PRIORITY0 = 0x00000600, 278 Q81_RX_PKTS_PRIORITY0_LO = 0x00000604, 279 Q81_RX_PKTS_PRIORITY1 = 0x00000608, 280 Q81_RX_PKTS_PRIORITY1_LO = 0x0000060C, 281 Q81_RX_PKTS_PRIORITY2 = 0x00000610, 282 Q81_RX_PKTS_PRIORITY2_LO = 0x00000614, 283 Q81_RX_PKTS_PRIORITY3 = 0x00000618, 284 Q81_RX_PKTS_PRIORITY3_LO = 0x0000061C, 285 Q81_RX_PKTS_PRIORITY4 = 0x00000620, 286 Q81_RX_PKTS_PRIORITY4_LO = 0x00000624, 287 Q81_RX_PKTS_PRIORITY5 = 0x00000628, 288 Q81_RX_PKTS_PRIORITY5_LO = 0x0000062C, 289 Q81_RX_PKTS_PRIORITY6 = 0x00000630, 290 Q81_RX_PKTS_PRIORITY6_LO = 0x00000634, 291 Q81_RX_PKTS_PRIORITY7 = 0x00000638, 292 Q81_RX_PKTS_PRIORITY7_LO = 0x0000063C, 293 Q81_RX_OCTETS_PRIORITY0 = 0x00000640, 294 Q81_RX_OCTETS_PRIORITY0_LO = 0x00000644, 295 Q81_RX_OCTETS_PRIORITY1 = 0x00000648, 296 Q81_RX_OCTETS_PRIORITY1_LO = 0x0000064C, 297 Q81_RX_OCTETS_PRIORITY2 = 0x00000650, 298 Q81_RX_OCTETS_PRIORITY2_LO = 0x00000654, 299 Q81_RX_OCTETS_PRIORITY3 = 0x00000658, 300 Q81_RX_OCTETS_PRIORITY3_LO = 0x0000065C, 301 Q81_RX_OCTETS_PRIORITY4 = 0x00000660, 302 Q81_RX_OCTETS_PRIORITY4_LO = 0x00000664, 303 Q81_RX_OCTETS_PRIORITY5 = 0x00000668, 304 Q81_RX_OCTETS_PRIORITY5_LO = 0x0000066C, 305 Q81_RX_OCTETS_PRIORITY6 = 0x00000670, 306 Q81_RX_OCTETS_PRIORITY6_LO = 0x00000674, 307 Q81_RX_OCTETS_PRIORITY7 = 0x00000678, 308 Q81_RX_OCTETS_PRIORITY7_LO = 0x0000067C, 309 Q81_TX_PKTS_PRIORITY0 = 0x00000680, 310 Q81_TX_PKTS_PRIORITY0_LO = 0x00000684, 311 Q81_TX_PKTS_PRIORITY1 = 0x00000688, 312 Q81_TX_PKTS_PRIORITY1_LO = 0x0000068C, 313 Q81_TX_PKTS_PRIORITY2 = 0x00000690, 314 Q81_TX_PKTS_PRIORITY2_LO = 0x00000694, 315 Q81_TX_PKTS_PRIORITY3 = 0x00000698, 316 Q81_TX_PKTS_PRIORITY3_LO = 0x0000069C, 317 Q81_TX_PKTS_PRIORITY4 = 0x000006A0, 318 Q81_TX_PKTS_PRIORITY4_LO = 0x000006A4, 319 Q81_TX_PKTS_PRIORITY5 = 0x000006A8, 320 Q81_TX_PKTS_PRIORITY5_LO = 0x000006AC, 321 Q81_TX_PKTS_PRIORITY6 = 0x000006B0, 322 Q81_TX_PKTS_PRIORITY6_LO = 0x000006B4, 323 Q81_TX_PKTS_PRIORITY7 = 0x000006B8, 324 Q81_TX_PKTS_PRIORITY7_LO = 0x000006BC, 325 Q81_TX_OCTETS_PRIORITY0 = 0x000006C0, 326 Q81_TX_OCTETS_PRIORITY0_LO = 0x000006C4, 327 Q81_TX_OCTETS_PRIORITY1 = 0x000006C8, 328 Q81_TX_OCTETS_PRIORITY1_LO = 0x000006CC, 329 Q81_TX_OCTETS_PRIORITY2 = 0x000006D0, 330 Q81_TX_OCTETS_PRIORITY2_LO = 0x000006D4, 331 Q81_TX_OCTETS_PRIORITY3 = 0x000006D8, 332 Q81_TX_OCTETS_PRIORITY3_LO = 0x000006DC, 333 Q81_TX_OCTETS_PRIORITY4 = 0x000006E0, 334 Q81_TX_OCTETS_PRIORITY4_LO = 0x000006E4, 335 Q81_TX_OCTETS_PRIORITY5 = 0x000006E8, 336 Q81_TX_OCTETS_PRIORITY5_LO = 0x000006EC, 337 Q81_TX_OCTETS_PRIORITY6 = 0x000006F0, 338 Q81_TX_OCTETS_PRIORITY6_LO = 0x000006F4, 339 Q81_TX_OCTETS_PRIORITY7 = 0x000006F8, 340 Q81_TX_OCTETS_PRIORITY7_LO = 0x000006FC, 341 Q81_RX_DISCARD_PRIORITY0 = 0x00000700, 342 Q81_RX_DISCARD_PRIORITY0_LO = 0x00000704, 343 Q81_RX_DISCARD_PRIORITY1 = 0x00000708, 344 Q81_RX_DISCARD_PRIORITY1_LO = 0x0000070C, 345 Q81_RX_DISCARD_PRIORITY2 = 0x00000710, 346 Q81_RX_DISCARD_PRIORITY2_LO = 0x00000714, 347 Q81_RX_DISCARD_PRIORITY3 = 0x00000718, 348 Q81_RX_DISCARD_PRIORITY3_LO = 0x0000071C, 349 Q81_RX_DISCARD_PRIORITY4 = 0x00000720, 350 Q81_RX_DISCARD_PRIORITY4_LO = 0x00000724, 351 Q81_RX_DISCARD_PRIORITY5 = 0x00000728, 352 Q81_RX_DISCARD_PRIORITY5_LO = 0x0000072C, 353 Q81_RX_DISCARD_PRIORITY6 = 0x00000730, 354 Q81_RX_DISCARD_PRIORITY6_LO = 0x00000734, 355 Q81_RX_DISCARD_PRIORITY7 = 0x00000738, 356 Q81_RX_DISCARD_PRIORITY7_LO = 0x0000073C 357 }; 358 359 static void 360 qls_mpid_seg_hdr(qls_mpid_seg_hdr_t *seg_hdr, uint32_t seg_num, 361 uint32_t seg_size, unsigned char *desc) 362 { 363 memset(seg_hdr, 0, sizeof(qls_mpid_seg_hdr_t)); 364 365 seg_hdr->cookie = Q81_MPID_COOKIE; 366 seg_hdr->seg_num = seg_num; 367 seg_hdr->seg_size = seg_size; 368 369 memcpy(seg_hdr->desc, desc, (sizeof(seg_hdr->desc))-1); 370 371 return; 372 } 373 374 static int 375 qls_wait_reg_rdy(qla_host_t *ha , uint32_t reg, uint32_t bit, uint32_t err_bit) 376 { 377 uint32_t data; 378 int count = 10; 379 380 while (count) { 381 382 data = READ_REG32(ha, reg); 383 384 if (data & err_bit) 385 return (-1); 386 else if (data & bit) 387 return (0); 388 389 qls_mdelay(__func__, 10); 390 count--; 391 } 392 return (-1); 393 } 394 395 static int 396 qls_rd_mpi_reg(qla_host_t *ha, uint32_t reg, uint32_t *data) 397 { 398 int ret; 399 400 ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY, 401 Q81_CTL_PROC_ADDR_ERR); 402 403 if (ret) 404 goto exit_qls_rd_mpi_reg; 405 406 WRITE_REG32(ha, Q81_CTL_PROC_ADDR, reg | Q81_CTL_PROC_ADDR_READ); 407 408 ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY, 409 Q81_CTL_PROC_ADDR_ERR); 410 411 if (ret) 412 goto exit_qls_rd_mpi_reg; 413 414 *data = READ_REG32(ha, Q81_CTL_PROC_DATA); 415 416 exit_qls_rd_mpi_reg: 417 return (ret); 418 } 419 420 static int 421 qls_wr_mpi_reg(qla_host_t *ha, uint32_t reg, uint32_t data) 422 { 423 int ret = 0; 424 425 ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY, 426 Q81_CTL_PROC_ADDR_ERR); 427 if (ret) 428 goto exit_qls_wr_mpi_reg; 429 430 WRITE_REG32(ha, Q81_CTL_PROC_DATA, data); 431 432 WRITE_REG32(ha, Q81_CTL_PROC_ADDR, reg); 433 434 ret = qls_wait_reg_rdy(ha, Q81_CTL_PROC_ADDR, Q81_CTL_PROC_ADDR_RDY, 435 Q81_CTL_PROC_ADDR_ERR); 436 exit_qls_wr_mpi_reg: 437 return (ret); 438 } 439 440 441 #define Q81_TEST_LOGIC_FUNC_PORT_CONFIG 0x1002 442 #define Q81_INVALID_NUM 0xFFFFFFFF 443 444 #define Q81_NIC1_FUNC_ENABLE 0x00000001 445 #define Q81_NIC1_FUNC_MASK 0x0000000e 446 #define Q81_NIC1_FUNC_SHIFT 1 447 #define Q81_NIC2_FUNC_ENABLE 0x00000010 448 #define Q81_NIC2_FUNC_MASK 0x000000e0 449 #define Q81_NIC2_FUNC_SHIFT 5 450 #define Q81_FUNCTION_SHIFT 6 451 452 static uint32_t 453 qls_get_other_fnum(qla_host_t *ha) 454 { 455 int ret; 456 uint32_t o_func; 457 uint32_t test_logic; 458 uint32_t nic1_fnum = Q81_INVALID_NUM; 459 uint32_t nic2_fnum = Q81_INVALID_NUM; 460 461 ret = qls_rd_mpi_reg(ha, Q81_TEST_LOGIC_FUNC_PORT_CONFIG, &test_logic); 462 if (ret) 463 return(Q81_INVALID_NUM); 464 465 if (test_logic & Q81_NIC1_FUNC_ENABLE) 466 nic1_fnum = (test_logic & Q81_NIC1_FUNC_MASK) >> 467 Q81_NIC1_FUNC_SHIFT; 468 469 if (test_logic & Q81_NIC2_FUNC_ENABLE) 470 nic2_fnum = (test_logic & Q81_NIC2_FUNC_MASK) >> 471 Q81_NIC2_FUNC_SHIFT; 472 473 if (ha->pci_func == 0) 474 o_func = nic2_fnum; 475 else 476 o_func = nic1_fnum; 477 478 return(o_func); 479 } 480 481 static uint32_t 482 qls_rd_ofunc_reg(qla_host_t *ha, uint32_t reg) 483 { 484 uint32_t ofunc; 485 uint32_t data; 486 int ret = 0; 487 488 ofunc = qls_get_other_fnum(ha); 489 490 if (ofunc == Q81_INVALID_NUM) 491 return(Q81_INVALID_NUM); 492 493 reg = Q81_CTL_PROC_ADDR_REG_BLOCK | (ofunc << Q81_FUNCTION_SHIFT) | reg; 494 495 ret = qls_rd_mpi_reg(ha, reg, &data); 496 497 if (ret != 0) 498 return(Q81_INVALID_NUM); 499 500 return(data); 501 } 502 503 static void 504 qls_wr_ofunc_reg(qla_host_t *ha, uint32_t reg, uint32_t value) 505 { 506 uint32_t ofunc; 507 int ret = 0; 508 509 ofunc = qls_get_other_fnum(ha); 510 511 if (ofunc == Q81_INVALID_NUM) 512 return; 513 514 reg = Q81_CTL_PROC_ADDR_REG_BLOCK | (ofunc << Q81_FUNCTION_SHIFT) | reg; 515 516 ret = qls_wr_mpi_reg(ha, reg, value); 517 518 return; 519 } 520 521 static int 522 qls_wait_ofunc_reg_rdy(qla_host_t *ha , uint32_t reg, uint32_t bit, 523 uint32_t err_bit) 524 { 525 uint32_t data; 526 int count = 10; 527 528 while (count) { 529 530 data = qls_rd_ofunc_reg(ha, reg); 531 532 if (data & err_bit) 533 return (-1); 534 else if (data & bit) 535 return (0); 536 537 qls_mdelay(__func__, 10); 538 count--; 539 } 540 return (-1); 541 } 542 543 #define Q81_XG_SERDES_ADDR_RDY BIT_31 544 #define Q81_XG_SERDES_ADDR_READ BIT_30 545 546 static int 547 qls_rd_ofunc_serdes_reg(qla_host_t *ha, uint32_t reg, uint32_t *data) 548 { 549 int ret; 550 551 /* wait for reg to come ready */ 552 ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XG_SERDES_ADDR >> 2), 553 Q81_XG_SERDES_ADDR_RDY, 0); 554 if (ret) 555 goto exit_qls_rd_ofunc_serdes_reg; 556 557 /* set up for reg read */ 558 qls_wr_ofunc_reg(ha, (Q81_CTL_XG_SERDES_ADDR >> 2), 559 (reg | Q81_XG_SERDES_ADDR_READ)); 560 561 /* wait for reg to come ready */ 562 ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XG_SERDES_ADDR >> 2), 563 Q81_XG_SERDES_ADDR_RDY, 0); 564 if (ret) 565 goto exit_qls_rd_ofunc_serdes_reg; 566 567 /* get the data */ 568 *data = qls_rd_ofunc_reg(ha, (Q81_CTL_XG_SERDES_DATA >> 2)); 569 570 exit_qls_rd_ofunc_serdes_reg: 571 return ret; 572 } 573 574 #define Q81_XGMAC_ADDR_RDY BIT_31 575 #define Q81_XGMAC_ADDR_R BIT_30 576 #define Q81_XGMAC_ADDR_XME BIT_29 577 578 static int 579 qls_rd_ofunc_xgmac_reg(qla_host_t *ha, uint32_t reg, uint32_t *data) 580 { 581 int ret = 0; 582 583 ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XGMAC_ADDR >> 2), 584 Q81_XGMAC_ADDR_RDY, Q81_XGMAC_ADDR_XME); 585 586 if (ret) 587 goto exit_qls_rd_ofunc_xgmac_reg; 588 589 qls_wr_ofunc_reg(ha, (Q81_XGMAC_ADDR_RDY >> 2), 590 (reg | Q81_XGMAC_ADDR_R)); 591 592 ret = qls_wait_ofunc_reg_rdy(ha, (Q81_CTL_XGMAC_ADDR >> 2), 593 Q81_XGMAC_ADDR_RDY, Q81_XGMAC_ADDR_XME); 594 if (ret) 595 goto exit_qls_rd_ofunc_xgmac_reg; 596 597 *data = qls_rd_ofunc_reg(ha, Q81_CTL_XGMAC_DATA); 598 599 exit_qls_rd_ofunc_xgmac_reg: 600 return ret; 601 } 602 603 static int 604 qls_rd_serdes_reg(qla_host_t *ha, uint32_t reg, uint32_t *data) 605 { 606 int ret; 607 608 ret = qls_wait_reg_rdy(ha, Q81_CTL_XG_SERDES_ADDR, 609 Q81_XG_SERDES_ADDR_RDY, 0); 610 611 if (ret) 612 goto exit_qls_rd_serdes_reg; 613 614 WRITE_REG32(ha, Q81_CTL_XG_SERDES_ADDR, \ 615 (reg | Q81_XG_SERDES_ADDR_READ)); 616 617 ret = qls_wait_reg_rdy(ha, Q81_CTL_XG_SERDES_ADDR, 618 Q81_XG_SERDES_ADDR_RDY, 0); 619 620 if (ret) 621 goto exit_qls_rd_serdes_reg; 622 623 *data = READ_REG32(ha, Q81_CTL_XG_SERDES_DATA); 624 625 exit_qls_rd_serdes_reg: 626 627 return ret; 628 } 629 630 static void 631 qls_get_both_serdes(qla_host_t *ha, uint32_t addr, uint32_t *dptr, 632 uint32_t *ind_ptr, uint32_t dvalid, uint32_t ind_valid) 633 { 634 int ret = -1; 635 636 if (dvalid) 637 ret = qls_rd_serdes_reg(ha, addr, dptr); 638 639 if (ret) 640 *dptr = Q81_BAD_DATA; 641 642 ret = -1; 643 644 if(ind_valid) 645 ret = qls_rd_ofunc_serdes_reg(ha, addr, ind_ptr); 646 647 if (ret) 648 *ind_ptr = Q81_BAD_DATA; 649 } 650 651 #define Q81_XFI1_POWERED_UP 0x00000005 652 #define Q81_XFI2_POWERED_UP 0x0000000A 653 #define Q81_XAUI_POWERED_UP 0x00000001 654 655 static int 656 qls_rd_serdes_regs(qla_host_t *ha, qls_mpi_coredump_t *mpi_dump) 657 { 658 int ret; 659 uint32_t xfi_d_valid, xfi_ind_valid, xaui_d_valid, xaui_ind_valid; 660 uint32_t temp, xaui_reg, i; 661 uint32_t *dptr, *indptr; 662 663 xfi_d_valid = xfi_ind_valid = xaui_d_valid = xaui_ind_valid = 0; 664 665 xaui_reg = 0x800; 666 667 ret = qls_rd_ofunc_serdes_reg(ha, xaui_reg, &temp); 668 if (ret) 669 temp = 0; 670 671 if ((temp & Q81_XAUI_POWERED_UP) == Q81_XAUI_POWERED_UP) 672 xaui_ind_valid = 1; 673 674 ret = qls_rd_serdes_reg(ha, xaui_reg, &temp); 675 if (ret) 676 temp = 0; 677 678 if ((temp & Q81_XAUI_POWERED_UP) == Q81_XAUI_POWERED_UP) 679 xaui_d_valid = 1; 680 681 ret = qls_rd_serdes_reg(ha, 0x1E06, &temp); 682 if (ret) 683 temp = 0; 684 685 if ((temp & Q81_XFI1_POWERED_UP) == Q81_XFI1_POWERED_UP) { 686 687 if (ha->pci_func & 1) 688 xfi_ind_valid = 1; /* NIC 2, so the indirect 689 (NIC1) xfi is up*/ 690 else 691 xfi_d_valid = 1; 692 } 693 694 if((temp & Q81_XFI2_POWERED_UP) == Q81_XFI2_POWERED_UP) { 695 696 if(ha->pci_func & 1) 697 xfi_d_valid = 1; /* NIC 2, so the indirect (NIC1) 698 xfi is up */ 699 else 700 xfi_ind_valid = 1; 701 } 702 703 if (ha->pci_func & 1) { 704 dptr = (uint32_t *)(&mpi_dump->serdes2_xaui_an); 705 indptr = (uint32_t *)(&mpi_dump->serdes1_xaui_an); 706 } else { 707 dptr = (uint32_t *)(&mpi_dump->serdes1_xaui_an); 708 indptr = (uint32_t *)(&mpi_dump->serdes2_xaui_an); 709 } 710 711 for (i = 0; i <= 0x000000034; i += 4, dptr ++, indptr ++) { 712 qls_get_both_serdes(ha, i, dptr, indptr, 713 xaui_d_valid, xaui_ind_valid); 714 } 715 716 if (ha->pci_func & 1) { 717 dptr = (uint32_t *)(&mpi_dump->serdes2_xaui_hss_pcs); 718 indptr = (uint32_t *)(&mpi_dump->serdes1_xaui_hss_pcs); 719 } else { 720 dptr = (uint32_t *)(&mpi_dump->serdes1_xaui_hss_pcs); 721 indptr = (uint32_t *)(&mpi_dump->serdes2_xaui_hss_pcs); 722 } 723 724 for (i = 0x800; i <= 0x880; i += 4, dptr ++, indptr ++) { 725 qls_get_both_serdes(ha, i, dptr, indptr, 726 xaui_d_valid, xaui_ind_valid); 727 } 728 729 if (ha->pci_func & 1) { 730 dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_an); 731 indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_an); 732 } else { 733 dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_an); 734 indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_an); 735 } 736 737 for (i = 0x1000; i <= 0x1034; i += 4, dptr ++, indptr ++) { 738 qls_get_both_serdes(ha, i, dptr, indptr, 739 xfi_d_valid, xfi_ind_valid); 740 } 741 742 if (ha->pci_func & 1) { 743 dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_train); 744 indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_train); 745 } else { 746 dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_train); 747 indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_train); 748 } 749 750 for (i = 0x1050; i <= 0x107c; i += 4, dptr ++, indptr ++) { 751 qls_get_both_serdes(ha, i, dptr, indptr, 752 xfi_d_valid, xfi_ind_valid); 753 } 754 755 if (ha->pci_func & 1) { 756 dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pcs); 757 indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pcs); 758 } else { 759 dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pcs); 760 indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pcs); 761 } 762 763 for (i = 0x1800; i <= 0x1838; i += 4, dptr++, indptr ++) { 764 qls_get_both_serdes(ha, i, dptr, indptr, 765 xfi_d_valid, xfi_ind_valid); 766 } 767 768 if (ha->pci_func & 1) { 769 dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_tx); 770 indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_tx); 771 } else { 772 dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_tx); 773 indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_tx); 774 } 775 776 for (i = 0x1c00; i <= 0x1c1f; i++, dptr ++, indptr ++) { 777 qls_get_both_serdes(ha, i, dptr, indptr, 778 xfi_d_valid, xfi_ind_valid); 779 } 780 781 if (ha->pci_func & 1) { 782 dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_rx); 783 indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_rx); 784 } else { 785 dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_rx); 786 indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_rx); 787 } 788 789 for (i = 0x1c40; i <= 0x1c5f; i++, dptr ++, indptr ++) { 790 qls_get_both_serdes(ha, i, dptr, indptr, 791 xfi_d_valid, xfi_ind_valid); 792 } 793 794 if (ha->pci_func & 1) { 795 dptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pll); 796 indptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pll); 797 } else { 798 dptr = (uint32_t *)(&mpi_dump->serdes1_xfi_hss_pll); 799 indptr = (uint32_t *)(&mpi_dump->serdes2_xfi_hss_pll); 800 } 801 802 for (i = 0x1e00; i <= 0x1e1f; i++, dptr ++, indptr ++) { 803 qls_get_both_serdes(ha, i, dptr, indptr, 804 xfi_d_valid, xfi_ind_valid); 805 } 806 807 return(0); 808 } 809 810 static int 811 qls_unpause_mpi_risc(qla_host_t *ha) 812 { 813 uint32_t data; 814 815 data = READ_REG32(ha, Q81_CTL_HOST_CMD_STATUS); 816 817 if (!(data & Q81_CTL_HCS_RISC_PAUSED)) 818 return -1; 819 820 WRITE_REG32(ha, Q81_CTL_HOST_CMD_STATUS, \ 821 Q81_CTL_HCS_CMD_CLR_RISC_PAUSE); 822 823 return 0; 824 } 825 826 static int 827 qls_pause_mpi_risc(qla_host_t *ha) 828 { 829 uint32_t data; 830 int count = 10; 831 832 WRITE_REG32(ha, Q81_CTL_HOST_CMD_STATUS, \ 833 Q81_CTL_HCS_CMD_SET_RISC_PAUSE); 834 835 do { 836 data = READ_REG32(ha, Q81_CTL_HOST_CMD_STATUS); 837 838 if (data & Q81_CTL_HCS_RISC_PAUSED) 839 break; 840 841 qls_mdelay(__func__, 10); 842 843 count--; 844 845 } while (count); 846 847 return ((count == 0) ? -1 : 0); 848 } 849 850 static void 851 qls_get_intr_states(qla_host_t *ha, uint32_t *buf) 852 { 853 int i; 854 855 for (i = 0; i < MAX_RX_RINGS; i++, buf++) { 856 857 WRITE_REG32(ha, Q81_CTL_INTR_ENABLE, (0x037f0300 + i)); 858 859 *buf = READ_REG32(ha, Q81_CTL_INTR_ENABLE); 860 } 861 } 862 863 static int 864 qls_rd_xgmac_reg(qla_host_t *ha, uint32_t reg, uint32_t*data) 865 { 866 int ret = 0; 867 868 ret = qls_wait_reg_rdy(ha, Q81_CTL_XGMAC_ADDR, Q81_XGMAC_ADDR_RDY, 869 Q81_XGMAC_ADDR_XME); 870 if (ret) 871 goto exit_qls_rd_xgmac_reg; 872 873 WRITE_REG32(ha, Q81_CTL_XGMAC_ADDR, (reg | Q81_XGMAC_ADDR_R)); 874 875 ret = qls_wait_reg_rdy(ha, Q81_CTL_XGMAC_ADDR, Q81_XGMAC_ADDR_RDY, 876 Q81_XGMAC_ADDR_XME); 877 if (ret) 878 goto exit_qls_rd_xgmac_reg; 879 880 *data = READ_REG32(ha, Q81_CTL_XGMAC_DATA); 881 882 exit_qls_rd_xgmac_reg: 883 return ret; 884 } 885 886 static int 887 qls_rd_xgmac_regs(qla_host_t *ha, uint32_t *buf, uint32_t o_func) 888 { 889 int ret = 0; 890 int i; 891 892 for (i = 0; i < Q81_XGMAC_REGISTER_END; i += 4, buf ++) { 893 894 switch (i) { 895 case Q81_PAUSE_SRC_LO : 896 case Q81_PAUSE_SRC_HI : 897 case Q81_GLOBAL_CFG : 898 case Q81_TX_CFG : 899 case Q81_RX_CFG : 900 case Q81_FLOW_CTL : 901 case Q81_PAUSE_OPCODE : 902 case Q81_PAUSE_TIMER : 903 case Q81_PAUSE_FRM_DEST_LO : 904 case Q81_PAUSE_FRM_DEST_HI : 905 case Q81_MAC_TX_PARAMS : 906 case Q81_MAC_RX_PARAMS : 907 case Q81_MAC_SYS_INT : 908 case Q81_MAC_SYS_INT_MASK : 909 case Q81_MAC_MGMT_INT : 910 case Q81_MAC_MGMT_IN_MASK : 911 case Q81_EXT_ARB_MODE : 912 case Q81_TX_PKTS : 913 case Q81_TX_PKTS_LO : 914 case Q81_TX_BYTES : 915 case Q81_TX_BYTES_LO : 916 case Q81_TX_MCAST_PKTS : 917 case Q81_TX_MCAST_PKTS_LO : 918 case Q81_TX_BCAST_PKTS : 919 case Q81_TX_BCAST_PKTS_LO : 920 case Q81_TX_UCAST_PKTS : 921 case Q81_TX_UCAST_PKTS_LO : 922 case Q81_TX_CTL_PKTS : 923 case Q81_TX_CTL_PKTS_LO : 924 case Q81_TX_PAUSE_PKTS : 925 case Q81_TX_PAUSE_PKTS_LO : 926 case Q81_TX_64_PKT : 927 case Q81_TX_64_PKT_LO : 928 case Q81_TX_65_TO_127_PKT : 929 case Q81_TX_65_TO_127_PKT_LO : 930 case Q81_TX_128_TO_255_PKT : 931 case Q81_TX_128_TO_255_PKT_LO : 932 case Q81_TX_256_511_PKT : 933 case Q81_TX_256_511_PKT_LO : 934 case Q81_TX_512_TO_1023_PKT : 935 case Q81_TX_512_TO_1023_PKT_LO : 936 case Q81_TX_1024_TO_1518_PKT : 937 case Q81_TX_1024_TO_1518_PKT_LO : 938 case Q81_TX_1519_TO_MAX_PKT : 939 case Q81_TX_1519_TO_MAX_PKT_LO : 940 case Q81_TX_UNDERSIZE_PKT : 941 case Q81_TX_UNDERSIZE_PKT_LO : 942 case Q81_TX_OVERSIZE_PKT : 943 case Q81_TX_OVERSIZE_PKT_LO : 944 case Q81_RX_HALF_FULL_DET : 945 case Q81_TX_HALF_FULL_DET_LO : 946 case Q81_RX_OVERFLOW_DET : 947 case Q81_TX_OVERFLOW_DET_LO : 948 case Q81_RX_HALF_FULL_MASK : 949 case Q81_TX_HALF_FULL_MASK_LO : 950 case Q81_RX_OVERFLOW_MASK : 951 case Q81_TX_OVERFLOW_MASK_LO : 952 case Q81_STAT_CNT_CTL : 953 case Q81_AUX_RX_HALF_FULL_DET : 954 case Q81_AUX_TX_HALF_FULL_DET : 955 case Q81_AUX_RX_OVERFLOW_DET : 956 case Q81_AUX_TX_OVERFLOW_DET : 957 case Q81_AUX_RX_HALF_FULL_MASK : 958 case Q81_AUX_TX_HALF_FULL_MASK : 959 case Q81_AUX_RX_OVERFLOW_MASK : 960 case Q81_AUX_TX_OVERFLOW_MASK : 961 case Q81_RX_BYTES : 962 case Q81_RX_BYTES_LO : 963 case Q81_RX_BYTES_OK : 964 case Q81_RX_BYTES_OK_LO : 965 case Q81_RX_PKTS : 966 case Q81_RX_PKTS_LO : 967 case Q81_RX_PKTS_OK : 968 case Q81_RX_PKTS_OK_LO : 969 case Q81_RX_BCAST_PKTS : 970 case Q81_RX_BCAST_PKTS_LO : 971 case Q81_RX_MCAST_PKTS : 972 case Q81_RX_MCAST_PKTS_LO : 973 case Q81_RX_UCAST_PKTS : 974 case Q81_RX_UCAST_PKTS_LO : 975 case Q81_RX_UNDERSIZE_PKTS : 976 case Q81_RX_UNDERSIZE_PKTS_LO : 977 case Q81_RX_OVERSIZE_PKTS : 978 case Q81_RX_OVERSIZE_PKTS_LO : 979 case Q81_RX_JABBER_PKTS : 980 case Q81_RX_JABBER_PKTS_LO : 981 case Q81_RX_UNDERSIZE_FCERR_PKTS : 982 case Q81_RX_UNDERSIZE_FCERR_PKTS_LO : 983 case Q81_RX_DROP_EVENTS : 984 case Q81_RX_DROP_EVENTS_LO : 985 case Q81_RX_FCERR_PKTS : 986 case Q81_RX_FCERR_PKTS_LO : 987 case Q81_RX_ALIGN_ERR : 988 case Q81_RX_ALIGN_ERR_LO : 989 case Q81_RX_SYMBOL_ERR : 990 case Q81_RX_SYMBOL_ERR_LO : 991 case Q81_RX_MAC_ERR : 992 case Q81_RX_MAC_ERR_LO : 993 case Q81_RX_CTL_PKTS : 994 case Q81_RX_CTL_PKTS_LO : 995 case Q81_RX_PAUSE_PKTS : 996 case Q81_RX_PAUSE_PKTS_LO : 997 case Q81_RX_64_PKTS : 998 case Q81_RX_64_PKTS_LO : 999 case Q81_RX_65_TO_127_PKTS : 1000 case Q81_RX_65_TO_127_PKTS_LO : 1001 case Q81_RX_128_255_PKTS : 1002 case Q81_RX_128_255_PKTS_LO : 1003 case Q81_RX_256_511_PKTS : 1004 case Q81_RX_256_511_PKTS_LO : 1005 case Q81_RX_512_TO_1023_PKTS : 1006 case Q81_RX_512_TO_1023_PKTS_LO : 1007 case Q81_RX_1024_TO_1518_PKTS : 1008 case Q81_RX_1024_TO_1518_PKTS_LO : 1009 case Q81_RX_1519_TO_MAX_PKTS : 1010 case Q81_RX_1519_TO_MAX_PKTS_LO : 1011 case Q81_RX_LEN_ERR_PKTS : 1012 case Q81_RX_LEN_ERR_PKTS_LO : 1013 case Q81_MDIO_TX_DATA : 1014 case Q81_MDIO_RX_DATA : 1015 case Q81_MDIO_CMD : 1016 case Q81_MDIO_PHY_ADDR : 1017 case Q81_MDIO_PORT : 1018 case Q81_MDIO_STATUS : 1019 case Q81_TX_CBFC_PAUSE_FRAMES0 : 1020 case Q81_TX_CBFC_PAUSE_FRAMES0_LO : 1021 case Q81_TX_CBFC_PAUSE_FRAMES1 : 1022 case Q81_TX_CBFC_PAUSE_FRAMES1_LO : 1023 case Q81_TX_CBFC_PAUSE_FRAMES2 : 1024 case Q81_TX_CBFC_PAUSE_FRAMES2_LO : 1025 case Q81_TX_CBFC_PAUSE_FRAMES3 : 1026 case Q81_TX_CBFC_PAUSE_FRAMES3_LO : 1027 case Q81_TX_CBFC_PAUSE_FRAMES4 : 1028 case Q81_TX_CBFC_PAUSE_FRAMES4_LO : 1029 case Q81_TX_CBFC_PAUSE_FRAMES5 : 1030 case Q81_TX_CBFC_PAUSE_FRAMES5_LO : 1031 case Q81_TX_CBFC_PAUSE_FRAMES6 : 1032 case Q81_TX_CBFC_PAUSE_FRAMES6_LO : 1033 case Q81_TX_CBFC_PAUSE_FRAMES7 : 1034 case Q81_TX_CBFC_PAUSE_FRAMES7_LO : 1035 case Q81_TX_FCOE_PKTS : 1036 case Q81_TX_FCOE_PKTS_LO : 1037 case Q81_TX_MGMT_PKTS : 1038 case Q81_TX_MGMT_PKTS_LO : 1039 case Q81_RX_CBFC_PAUSE_FRAMES0 : 1040 case Q81_RX_CBFC_PAUSE_FRAMES0_LO : 1041 case Q81_RX_CBFC_PAUSE_FRAMES1 : 1042 case Q81_RX_CBFC_PAUSE_FRAMES1_LO : 1043 case Q81_RX_CBFC_PAUSE_FRAMES2 : 1044 case Q81_RX_CBFC_PAUSE_FRAMES2_LO : 1045 case Q81_RX_CBFC_PAUSE_FRAMES3 : 1046 case Q81_RX_CBFC_PAUSE_FRAMES3_LO : 1047 case Q81_RX_CBFC_PAUSE_FRAMES4 : 1048 case Q81_RX_CBFC_PAUSE_FRAMES4_LO : 1049 case Q81_RX_CBFC_PAUSE_FRAMES5 : 1050 case Q81_RX_CBFC_PAUSE_FRAMES5_LO : 1051 case Q81_RX_CBFC_PAUSE_FRAMES6 : 1052 case Q81_RX_CBFC_PAUSE_FRAMES6_LO : 1053 case Q81_RX_CBFC_PAUSE_FRAMES7 : 1054 case Q81_RX_CBFC_PAUSE_FRAMES7_LO : 1055 case Q81_RX_FCOE_PKTS : 1056 case Q81_RX_FCOE_PKTS_LO : 1057 case Q81_RX_MGMT_PKTS : 1058 case Q81_RX_MGMT_PKTS_LO : 1059 case Q81_RX_NIC_FIFO_DROP : 1060 case Q81_RX_NIC_FIFO_DROP_LO : 1061 case Q81_RX_FCOE_FIFO_DROP : 1062 case Q81_RX_FCOE_FIFO_DROP_LO : 1063 case Q81_RX_MGMT_FIFO_DROP : 1064 case Q81_RX_MGMT_FIFO_DROP_LO : 1065 case Q81_RX_PKTS_PRIORITY0 : 1066 case Q81_RX_PKTS_PRIORITY0_LO : 1067 case Q81_RX_PKTS_PRIORITY1 : 1068 case Q81_RX_PKTS_PRIORITY1_LO : 1069 case Q81_RX_PKTS_PRIORITY2 : 1070 case Q81_RX_PKTS_PRIORITY2_LO : 1071 case Q81_RX_PKTS_PRIORITY3 : 1072 case Q81_RX_PKTS_PRIORITY3_LO : 1073 case Q81_RX_PKTS_PRIORITY4 : 1074 case Q81_RX_PKTS_PRIORITY4_LO : 1075 case Q81_RX_PKTS_PRIORITY5 : 1076 case Q81_RX_PKTS_PRIORITY5_LO : 1077 case Q81_RX_PKTS_PRIORITY6 : 1078 case Q81_RX_PKTS_PRIORITY6_LO : 1079 case Q81_RX_PKTS_PRIORITY7 : 1080 case Q81_RX_PKTS_PRIORITY7_LO : 1081 case Q81_RX_OCTETS_PRIORITY0 : 1082 case Q81_RX_OCTETS_PRIORITY0_LO : 1083 case Q81_RX_OCTETS_PRIORITY1 : 1084 case Q81_RX_OCTETS_PRIORITY1_LO : 1085 case Q81_RX_OCTETS_PRIORITY2 : 1086 case Q81_RX_OCTETS_PRIORITY2_LO : 1087 case Q81_RX_OCTETS_PRIORITY3 : 1088 case Q81_RX_OCTETS_PRIORITY3_LO : 1089 case Q81_RX_OCTETS_PRIORITY4 : 1090 case Q81_RX_OCTETS_PRIORITY4_LO : 1091 case Q81_RX_OCTETS_PRIORITY5 : 1092 case Q81_RX_OCTETS_PRIORITY5_LO : 1093 case Q81_RX_OCTETS_PRIORITY6 : 1094 case Q81_RX_OCTETS_PRIORITY6_LO : 1095 case Q81_RX_OCTETS_PRIORITY7 : 1096 case Q81_RX_OCTETS_PRIORITY7_LO : 1097 case Q81_TX_PKTS_PRIORITY0 : 1098 case Q81_TX_PKTS_PRIORITY0_LO : 1099 case Q81_TX_PKTS_PRIORITY1 : 1100 case Q81_TX_PKTS_PRIORITY1_LO : 1101 case Q81_TX_PKTS_PRIORITY2 : 1102 case Q81_TX_PKTS_PRIORITY2_LO : 1103 case Q81_TX_PKTS_PRIORITY3 : 1104 case Q81_TX_PKTS_PRIORITY3_LO : 1105 case Q81_TX_PKTS_PRIORITY4 : 1106 case Q81_TX_PKTS_PRIORITY4_LO : 1107 case Q81_TX_PKTS_PRIORITY5 : 1108 case Q81_TX_PKTS_PRIORITY5_LO : 1109 case Q81_TX_PKTS_PRIORITY6 : 1110 case Q81_TX_PKTS_PRIORITY6_LO : 1111 case Q81_TX_PKTS_PRIORITY7 : 1112 case Q81_TX_PKTS_PRIORITY7_LO : 1113 case Q81_TX_OCTETS_PRIORITY0 : 1114 case Q81_TX_OCTETS_PRIORITY0_LO : 1115 case Q81_TX_OCTETS_PRIORITY1 : 1116 case Q81_TX_OCTETS_PRIORITY1_LO : 1117 case Q81_TX_OCTETS_PRIORITY2 : 1118 case Q81_TX_OCTETS_PRIORITY2_LO : 1119 case Q81_TX_OCTETS_PRIORITY3 : 1120 case Q81_TX_OCTETS_PRIORITY3_LO : 1121 case Q81_TX_OCTETS_PRIORITY4 : 1122 case Q81_TX_OCTETS_PRIORITY4_LO : 1123 case Q81_TX_OCTETS_PRIORITY5 : 1124 case Q81_TX_OCTETS_PRIORITY5_LO : 1125 case Q81_TX_OCTETS_PRIORITY6 : 1126 case Q81_TX_OCTETS_PRIORITY6_LO : 1127 case Q81_TX_OCTETS_PRIORITY7 : 1128 case Q81_TX_OCTETS_PRIORITY7_LO : 1129 case Q81_RX_DISCARD_PRIORITY0 : 1130 case Q81_RX_DISCARD_PRIORITY0_LO : 1131 case Q81_RX_DISCARD_PRIORITY1 : 1132 case Q81_RX_DISCARD_PRIORITY1_LO : 1133 case Q81_RX_DISCARD_PRIORITY2 : 1134 case Q81_RX_DISCARD_PRIORITY2_LO : 1135 case Q81_RX_DISCARD_PRIORITY3 : 1136 case Q81_RX_DISCARD_PRIORITY3_LO : 1137 case Q81_RX_DISCARD_PRIORITY4 : 1138 case Q81_RX_DISCARD_PRIORITY4_LO : 1139 case Q81_RX_DISCARD_PRIORITY5 : 1140 case Q81_RX_DISCARD_PRIORITY5_LO : 1141 case Q81_RX_DISCARD_PRIORITY6 : 1142 case Q81_RX_DISCARD_PRIORITY6_LO : 1143 case Q81_RX_DISCARD_PRIORITY7 : 1144 case Q81_RX_DISCARD_PRIORITY7_LO : 1145 1146 if (o_func) 1147 ret = qls_rd_ofunc_xgmac_reg(ha, 1148 i, buf); 1149 else 1150 ret = qls_rd_xgmac_reg(ha, i, buf); 1151 1152 if (ret) 1153 *buf = Q81_BAD_DATA; 1154 1155 break; 1156 1157 default: 1158 break; 1159 1160 } 1161 } 1162 return 0; 1163 } 1164 1165 static int 1166 qls_get_mpi_regs(qla_host_t *ha, uint32_t *buf, uint32_t offset, uint32_t count) 1167 { 1168 int i, ret = 0; 1169 1170 for (i = 0; i < count; i++, buf++) { 1171 1172 ret = qls_rd_mpi_reg(ha, (offset + i), buf); 1173 1174 if (ret) 1175 return ret; 1176 } 1177 1178 return (ret); 1179 } 1180 1181 static int 1182 qls_get_mpi_shadow_regs(qla_host_t *ha, uint32_t *buf) 1183 { 1184 uint32_t i; 1185 int ret; 1186 1187 #define Q81_RISC_124 0x0000007c 1188 #define Q81_RISC_127 0x0000007f 1189 #define Q81_SHADOW_OFFSET 0xb0000000 1190 1191 for (i = 0; i < Q81_MPI_CORE_SH_REGS_CNT; i++, buf++) { 1192 1193 ret = qls_wr_mpi_reg(ha, 1194 (Q81_CTL_PROC_ADDR_RISC_INT_REG | Q81_RISC_124), 1195 (Q81_SHADOW_OFFSET | i << 20)); 1196 if (ret) 1197 goto exit_qls_get_mpi_shadow_regs; 1198 1199 ret = qls_mpi_risc_rd_reg(ha, 1200 (Q81_CTL_PROC_ADDR_RISC_INT_REG | Q81_RISC_127), 1201 buf); 1202 if (ret) 1203 goto exit_qls_get_mpi_shadow_regs; 1204 } 1205 1206 exit_qls_get_mpi_shadow_regs: 1207 return ret; 1208 } 1209 1210 #define SYS_CLOCK (0x00) 1211 #define PCI_CLOCK (0x80) 1212 #define FC_CLOCK (0x140) 1213 #define XGM_CLOCK (0x180) 1214 1215 #define Q81_ADDRESS_REGISTER_ENABLE 0x00010000 1216 #define Q81_UP 0x00008000 1217 #define Q81_MAX_MUX 0x40 1218 #define Q81_MAX_MODULES 0x1F 1219 1220 static uint32_t * 1221 qls_get_probe(qla_host_t *ha, uint32_t clock, uint8_t *valid, uint32_t *buf) 1222 { 1223 uint32_t module, mux_sel, probe, lo_val, hi_val; 1224 1225 for (module = 0; module < Q81_MAX_MODULES; module ++) { 1226 1227 if (valid[module]) { 1228 1229 for (mux_sel = 0; mux_sel < Q81_MAX_MUX; mux_sel++) { 1230 1231 probe = clock | Q81_ADDRESS_REGISTER_ENABLE | 1232 mux_sel | (module << 9); 1233 WRITE_REG32(ha, Q81_CTL_XG_PROBE_MUX_ADDR,\ 1234 probe); 1235 1236 lo_val = READ_REG32(ha,\ 1237 Q81_CTL_XG_PROBE_MUX_DATA); 1238 1239 if (mux_sel == 0) { 1240 *buf = probe; 1241 buf ++; 1242 } 1243 1244 probe |= Q81_UP; 1245 1246 WRITE_REG32(ha, Q81_CTL_XG_PROBE_MUX_ADDR,\ 1247 probe); 1248 hi_val = READ_REG32(ha,\ 1249 Q81_CTL_XG_PROBE_MUX_DATA); 1250 1251 *buf = lo_val; 1252 buf++; 1253 *buf = hi_val; 1254 buf++; 1255 } 1256 } 1257 } 1258 1259 return(buf); 1260 } 1261 1262 static int 1263 qls_get_probe_dump(qla_host_t *ha, uint32_t *buf) 1264 { 1265 1266 uint8_t sys_clock_valid_modules[0x20] = { 1267 1, // 0x00 1268 1, // 0x01 1269 1, // 0x02 1270 0, // 0x03 1271 1, // 0x04 1272 1, // 0x05 1273 1, // 0x06 1274 1, // 0x07 1275 1, // 0x08 1276 1, // 0x09 1277 1, // 0x0A 1278 1, // 0x0B 1279 1, // 0x0C 1280 1, // 0x0D 1281 1, // 0x0E 1282 0, // 0x0F 1283 1, // 0x10 1284 1, // 0x11 1285 1, // 0x12 1286 1, // 0x13 1287 0, // 0x14 1288 0, // 0x15 1289 0, // 0x16 1290 0, // 0x17 1291 0, // 0x18 1292 0, // 0x19 1293 0, // 0x1A 1294 0, // 0x1B 1295 0, // 0x1C 1296 0, // 0x1D 1297 0, // 0x1E 1298 0 // 0x1F 1299 }; 1300 1301 1302 uint8_t pci_clock_valid_modules[0x20] = { 1303 1, // 0x00 1304 0, // 0x01 1305 0, // 0x02 1306 0, // 0x03 1307 0, // 0x04 1308 0, // 0x05 1309 1, // 0x06 1310 1, // 0x07 1311 0, // 0x08 1312 0, // 0x09 1313 0, // 0x0A 1314 0, // 0x0B 1315 0, // 0x0C 1316 0, // 0x0D 1317 1, // 0x0E 1318 0, // 0x0F 1319 0, // 0x10 1320 0, // 0x11 1321 0, // 0x12 1322 0, // 0x13 1323 0, // 0x14 1324 0, // 0x15 1325 0, // 0x16 1326 0, // 0x17 1327 0, // 0x18 1328 0, // 0x19 1329 0, // 0x1A 1330 0, // 0x1B 1331 0, // 0x1C 1332 0, // 0x1D 1333 0, // 0x1E 1334 0 // 0x1F 1335 }; 1336 1337 1338 uint8_t xgm_clock_valid_modules[0x20] = { 1339 1, // 0x00 1340 0, // 0x01 1341 0, // 0x02 1342 1, // 0x03 1343 0, // 0x04 1344 0, // 0x05 1345 0, // 0x06 1346 0, // 0x07 1347 1, // 0x08 1348 1, // 0x09 1349 0, // 0x0A 1350 0, // 0x0B 1351 1, // 0x0C 1352 1, // 0x0D 1353 1, // 0x0E 1354 0, // 0x0F 1355 1, // 0x10 1356 1, // 0x11 1357 0, // 0x12 1358 0, // 0x13 1359 0, // 0x14 1360 0, // 0x15 1361 0, // 0x16 1362 0, // 0x17 1363 0, // 0x18 1364 0, // 0x19 1365 0, // 0x1A 1366 0, // 0x1B 1367 0, // 0x1C 1368 0, // 0x1D 1369 0, // 0x1E 1370 0 // 0x1F 1371 }; 1372 1373 uint8_t fc_clock_valid_modules[0x20] = { 1374 1, // 0x00 1375 0, // 0x01 1376 0, // 0x02 1377 0, // 0x03 1378 0, // 0x04 1379 0, // 0x05 1380 0, // 0x06 1381 0, // 0x07 1382 0, // 0x08 1383 0, // 0x09 1384 0, // 0x0A 1385 0, // 0x0B 1386 1, // 0x0C 1387 1, // 0x0D 1388 0, // 0x0E 1389 0, // 0x0F 1390 0, // 0x10 1391 0, // 0x11 1392 0, // 0x12 1393 0, // 0x13 1394 0, // 0x14 1395 0, // 0x15 1396 0, // 0x16 1397 0, // 0x17 1398 0, // 0x18 1399 0, // 0x19 1400 0, // 0x1A 1401 0, // 0x1B 1402 0, // 0x1C 1403 0, // 0x1D 1404 0, // 0x1E 1405 0 // 0x1F 1406 }; 1407 1408 qls_wr_mpi_reg(ha, 0x100e, 0x18a20000); 1409 1410 buf = qls_get_probe(ha, SYS_CLOCK, sys_clock_valid_modules, buf); 1411 1412 buf = qls_get_probe(ha, PCI_CLOCK, pci_clock_valid_modules, buf); 1413 1414 buf = qls_get_probe(ha, XGM_CLOCK, xgm_clock_valid_modules, buf); 1415 1416 buf = qls_get_probe(ha, FC_CLOCK, fc_clock_valid_modules, buf); 1417 1418 return(0); 1419 } 1420 1421 static void 1422 qls_get_ridx_registers(qla_host_t *ha, uint32_t *buf) 1423 { 1424 uint32_t type, idx, idx_max; 1425 uint32_t r_idx; 1426 uint32_t r_data; 1427 uint32_t val; 1428 1429 for (type = 0; type < 4; type ++) { 1430 if (type < 2) 1431 idx_max = 8; 1432 else 1433 idx_max = 16; 1434 1435 for (idx = 0; idx < idx_max; idx ++) { 1436 1437 val = 0x04000000 | (type << 16) | (idx << 8); 1438 WRITE_REG32(ha, Q81_CTL_ROUTING_INDEX, val); 1439 1440 r_idx = 0; 1441 while ((r_idx & 0x40000000) == 0) 1442 r_idx = READ_REG32(ha, Q81_CTL_ROUTING_INDEX); 1443 1444 r_data = READ_REG32(ha, Q81_CTL_ROUTING_DATA); 1445 1446 *buf = type; 1447 buf ++; 1448 *buf = idx; 1449 buf ++; 1450 *buf = r_idx; 1451 buf ++; 1452 *buf = r_data; 1453 buf ++; 1454 } 1455 } 1456 } 1457 1458 static void 1459 qls_get_mac_proto_regs(qla_host_t *ha, uint32_t* buf) 1460 { 1461 1462 #define Q81_RS_AND_ADR 0x06000000 1463 #define Q81_RS_ONLY 0x04000000 1464 #define Q81_NUM_TYPES 10 1465 1466 uint32_t result_index, result_data; 1467 uint32_t type; 1468 uint32_t index; 1469 uint32_t offset; 1470 uint32_t val; 1471 uint32_t initial_val; 1472 uint32_t max_index; 1473 uint32_t max_offset; 1474 1475 for (type = 0; type < Q81_NUM_TYPES; type ++) { 1476 switch (type) { 1477 1478 case 0: // CAM 1479 initial_val = Q81_RS_AND_ADR; 1480 max_index = 512; 1481 max_offset = 3; 1482 break; 1483 1484 case 1: // Multicast MAC Address 1485 initial_val = Q81_RS_ONLY; 1486 max_index = 32; 1487 max_offset = 2; 1488 break; 1489 1490 case 2: // VLAN filter mask 1491 case 3: // MC filter mask 1492 initial_val = Q81_RS_ONLY; 1493 max_index = 4096; 1494 max_offset = 1; 1495 break; 1496 1497 case 4: // FC MAC addresses 1498 initial_val = Q81_RS_ONLY; 1499 max_index = 4; 1500 max_offset = 2; 1501 break; 1502 1503 case 5: // Mgmt MAC addresses 1504 initial_val = Q81_RS_ONLY; 1505 max_index = 8; 1506 max_offset = 2; 1507 break; 1508 1509 case 6: // Mgmt VLAN addresses 1510 initial_val = Q81_RS_ONLY; 1511 max_index = 16; 1512 max_offset = 1; 1513 break; 1514 1515 case 7: // Mgmt IPv4 address 1516 initial_val = Q81_RS_ONLY; 1517 max_index = 4; 1518 max_offset = 1; 1519 break; 1520 1521 case 8: // Mgmt IPv6 address 1522 initial_val = Q81_RS_ONLY; 1523 max_index = 4; 1524 max_offset = 4; 1525 break; 1526 1527 case 9: // Mgmt TCP/UDP Dest port 1528 initial_val = Q81_RS_ONLY; 1529 max_index = 4; 1530 max_offset = 1; 1531 break; 1532 1533 default: 1534 printf("Bad type!!! 0x%08x\n", type); 1535 max_index = 0; 1536 max_offset = 0; 1537 break; 1538 } 1539 1540 for (index = 0; index < max_index; index ++) { 1541 1542 for (offset = 0; offset < max_offset; offset ++) { 1543 1544 val = initial_val | (type << 16) | 1545 (index << 4) | (offset); 1546 1547 WRITE_REG32(ha, Q81_CTL_MAC_PROTO_ADDR_INDEX,\ 1548 val); 1549 1550 result_index = 0; 1551 1552 while ((result_index & 0x40000000) == 0) 1553 result_index = 1554 READ_REG32(ha, \ 1555 Q81_CTL_MAC_PROTO_ADDR_INDEX); 1556 1557 result_data = READ_REG32(ha,\ 1558 Q81_CTL_MAC_PROTO_ADDR_DATA); 1559 1560 *buf = result_index; 1561 buf ++; 1562 1563 *buf = result_data; 1564 buf ++; 1565 } 1566 } 1567 } 1568 } 1569 1570 static int 1571 qls_get_ets_regs(qla_host_t *ha, uint32_t *buf) 1572 { 1573 int ret = 0; 1574 int i; 1575 1576 for(i = 0; i < 8; i ++, buf ++) { 1577 WRITE_REG32(ha, Q81_CTL_NIC_ENH_TX_SCHD, \ 1578 ((i << 29) | 0x08000000)); 1579 *buf = READ_REG32(ha, Q81_CTL_NIC_ENH_TX_SCHD); 1580 } 1581 1582 for(i = 0; i < 2; i ++, buf ++) { 1583 WRITE_REG32(ha, Q81_CTL_CNA_ENH_TX_SCHD, \ 1584 ((i << 29) | 0x08000000)); 1585 *buf = READ_REG32(ha, Q81_CTL_CNA_ENH_TX_SCHD); 1586 } 1587 1588 return ret; 1589 } 1590 1591 int 1592 qls_mpi_core_dump(qla_host_t *ha) 1593 { 1594 int ret; 1595 int i; 1596 uint32_t reg, reg_val; 1597 1598 qls_mpi_coredump_t *mpi_dump = &ql_mpi_coredump; 1599 1600 ret = qls_pause_mpi_risc(ha); 1601 if (ret) { 1602 printf("Failed RISC pause. Status = 0x%.08x\n",ret); 1603 return(-1); 1604 } 1605 1606 memset(&(mpi_dump->mpi_global_header), 0, 1607 sizeof(qls_mpid_glbl_hdr_t)); 1608 1609 mpi_dump->mpi_global_header.cookie = Q81_MPID_COOKIE; 1610 mpi_dump->mpi_global_header.hdr_size = 1611 sizeof(qls_mpid_glbl_hdr_t); 1612 mpi_dump->mpi_global_header.img_size = 1613 sizeof(qls_mpi_coredump_t); 1614 1615 memcpy(mpi_dump->mpi_global_header.id, "MPI Coredump", 1616 sizeof(mpi_dump->mpi_global_header.id)); 1617 1618 qls_mpid_seg_hdr(&mpi_dump->nic1_regs_seg_hdr, 1619 Q81_NIC1_CONTROL_SEG_NUM, 1620 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic1_regs)), 1621 "NIC1 Registers"); 1622 1623 qls_mpid_seg_hdr(&mpi_dump->nic2_regs_seg_hdr, 1624 Q81_NIC2_CONTROL_SEG_NUM, 1625 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic2_regs)), 1626 "NIC2 Registers"); 1627 1628 qls_mpid_seg_hdr(&mpi_dump->xgmac1_seg_hdr, 1629 Q81_NIC1_XGMAC_SEG_NUM, 1630 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->xgmac1)), 1631 "NIC1 XGMac Registers"); 1632 1633 qls_mpid_seg_hdr(&mpi_dump->xgmac2_seg_hdr, 1634 Q81_NIC2_XGMAC_SEG_NUM, 1635 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->xgmac2)), 1636 "NIC2 XGMac Registers"); 1637 1638 if (ha->pci_func & 1) { 1639 for (i = 0; i < 64; i++) 1640 mpi_dump->nic2_regs[i] = 1641 READ_REG32(ha, i * sizeof(uint32_t)); 1642 1643 for (i = 0; i < 64; i++) 1644 mpi_dump->nic1_regs[i] = 1645 qls_rd_ofunc_reg(ha, 1646 (i * sizeof(uint32_t)) / 4); 1647 1648 qls_rd_xgmac_regs(ha, &mpi_dump->xgmac2[0], 0); 1649 qls_rd_xgmac_regs(ha, &mpi_dump->xgmac1[0], 1); 1650 } else { 1651 for (i = 0; i < 64; i++) 1652 mpi_dump->nic1_regs[i] = 1653 READ_REG32(ha, i * sizeof(uint32_t)); 1654 1655 for (i = 0; i < 64; i++) 1656 mpi_dump->nic2_regs[i] = 1657 qls_rd_ofunc_reg(ha, 1658 (i * sizeof(uint32_t)) / 4); 1659 1660 qls_rd_xgmac_regs(ha, &mpi_dump->xgmac1[0], 0); 1661 qls_rd_xgmac_regs(ha, &mpi_dump->xgmac2[0], 1); 1662 } 1663 1664 1665 qls_mpid_seg_hdr(&mpi_dump->xaui1_an_hdr, 1666 Q81_XAUI1_AN_SEG_NUM, 1667 (sizeof(qls_mpid_seg_hdr_t) + 1668 sizeof(mpi_dump->serdes1_xaui_an)), 1669 "XAUI1 AN Registers"); 1670 1671 qls_mpid_seg_hdr(&mpi_dump->xaui1_hss_pcs_hdr, 1672 Q81_XAUI1_HSS_PCS_SEG_NUM, 1673 (sizeof(qls_mpid_seg_hdr_t) + 1674 sizeof(mpi_dump->serdes1_xaui_hss_pcs)), 1675 "XAUI1 HSS PCS Registers"); 1676 1677 qls_mpid_seg_hdr(&mpi_dump->xfi1_an_hdr, 1678 Q81_XFI1_AN_SEG_NUM, 1679 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->serdes1_xfi_an)), 1680 "XFI1 AN Registers"); 1681 1682 qls_mpid_seg_hdr(&mpi_dump->xfi1_train_hdr, 1683 Q81_XFI1_TRAIN_SEG_NUM, 1684 (sizeof(qls_mpid_seg_hdr_t) + 1685 sizeof(mpi_dump->serdes1_xfi_train)), 1686 "XFI1 TRAIN Registers"); 1687 1688 qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_pcs_hdr, 1689 Q81_XFI1_HSS_PCS_SEG_NUM, 1690 (sizeof(qls_mpid_seg_hdr_t) + 1691 sizeof(mpi_dump->serdes1_xfi_hss_pcs)), 1692 "XFI1 HSS PCS Registers"); 1693 1694 qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_tx_hdr, 1695 Q81_XFI1_HSS_TX_SEG_NUM, 1696 (sizeof(qls_mpid_seg_hdr_t) + 1697 sizeof(mpi_dump->serdes1_xfi_hss_tx)), 1698 "XFI1 HSS TX Registers"); 1699 1700 qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_rx_hdr, 1701 Q81_XFI1_HSS_RX_SEG_NUM, 1702 (sizeof(qls_mpid_seg_hdr_t) + 1703 sizeof(mpi_dump->serdes1_xfi_hss_rx)), 1704 "XFI1 HSS RX Registers"); 1705 1706 qls_mpid_seg_hdr(&mpi_dump->xfi1_hss_pll_hdr, 1707 Q81_XFI1_HSS_PLL_SEG_NUM, 1708 (sizeof(qls_mpid_seg_hdr_t) + 1709 sizeof(mpi_dump->serdes1_xfi_hss_pll)), 1710 "XFI1 HSS PLL Registers"); 1711 1712 qls_mpid_seg_hdr(&mpi_dump->xaui2_an_hdr, 1713 Q81_XAUI2_AN_SEG_NUM, 1714 (sizeof(qls_mpid_seg_hdr_t) + 1715 sizeof(mpi_dump->serdes2_xaui_an)), 1716 "XAUI2 AN Registers"); 1717 1718 qls_mpid_seg_hdr(&mpi_dump->xaui2_hss_pcs_hdr, 1719 Q81_XAUI2_HSS_PCS_SEG_NUM, 1720 (sizeof(qls_mpid_seg_hdr_t) + 1721 sizeof(mpi_dump->serdes2_xaui_hss_pcs)), 1722 "XAUI2 HSS PCS Registers"); 1723 1724 qls_mpid_seg_hdr(&mpi_dump->xfi2_an_hdr, 1725 Q81_XFI2_AN_SEG_NUM, 1726 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->serdes2_xfi_an)), 1727 "XFI2 AN Registers"); 1728 1729 qls_mpid_seg_hdr(&mpi_dump->xfi2_train_hdr, 1730 Q81_XFI2_TRAIN_SEG_NUM, 1731 (sizeof(qls_mpid_seg_hdr_t) + 1732 sizeof(mpi_dump->serdes2_xfi_train)), 1733 "XFI2 TRAIN Registers"); 1734 1735 qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_pcs_hdr, 1736 Q81_XFI2_HSS_PCS_SEG_NUM, 1737 (sizeof(qls_mpid_seg_hdr_t) + 1738 sizeof(mpi_dump->serdes2_xfi_hss_pcs)), 1739 "XFI2 HSS PCS Registers"); 1740 1741 qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_tx_hdr, 1742 Q81_XFI2_HSS_TX_SEG_NUM, 1743 (sizeof(qls_mpid_seg_hdr_t) + 1744 sizeof(mpi_dump->serdes2_xfi_hss_tx)), 1745 "XFI2 HSS TX Registers"); 1746 1747 qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_rx_hdr, 1748 Q81_XFI2_HSS_RX_SEG_NUM, 1749 (sizeof(qls_mpid_seg_hdr_t) + 1750 sizeof(mpi_dump->serdes2_xfi_hss_rx)), 1751 "XFI2 HSS RX Registers"); 1752 1753 qls_mpid_seg_hdr(&mpi_dump->xfi2_hss_pll_hdr, 1754 Q81_XFI2_HSS_PLL_SEG_NUM, 1755 (sizeof(qls_mpid_seg_hdr_t) + 1756 sizeof(mpi_dump->serdes2_xfi_hss_pll)), 1757 "XFI2 HSS PLL Registers"); 1758 1759 qls_rd_serdes_regs(ha, mpi_dump); 1760 1761 qls_mpid_seg_hdr(&mpi_dump->core_regs_seg_hdr, 1762 Q81_CORE_SEG_NUM, 1763 (sizeof(mpi_dump->core_regs_seg_hdr) + 1764 sizeof(mpi_dump->mpi_core_regs) + 1765 sizeof(mpi_dump->mpi_core_sh_regs)), 1766 "Core Registers"); 1767 1768 ret = qls_get_mpi_regs(ha, &mpi_dump->mpi_core_regs[0], 1769 Q81_MPI_CORE_REGS_ADDR, Q81_MPI_CORE_REGS_CNT); 1770 1771 ret = qls_get_mpi_shadow_regs(ha, 1772 &mpi_dump->mpi_core_sh_regs[0]); 1773 1774 qls_mpid_seg_hdr(&mpi_dump->test_logic_regs_seg_hdr, 1775 Q81_TEST_LOGIC_SEG_NUM, 1776 (sizeof(qls_mpid_seg_hdr_t) + 1777 sizeof(mpi_dump->test_logic_regs)), 1778 "Test Logic Regs"); 1779 1780 ret = qls_get_mpi_regs(ha, &mpi_dump->test_logic_regs[0], 1781 Q81_TEST_REGS_ADDR, Q81_TEST_REGS_CNT); 1782 1783 qls_mpid_seg_hdr(&mpi_dump->rmii_regs_seg_hdr, 1784 Q81_RMII_SEG_NUM, 1785 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->rmii_regs)), 1786 "RMII Registers"); 1787 1788 ret = qls_get_mpi_regs(ha, &mpi_dump->rmii_regs[0], 1789 Q81_RMII_REGS_ADDR, Q81_RMII_REGS_CNT); 1790 1791 qls_mpid_seg_hdr(&mpi_dump->fcmac1_regs_seg_hdr, 1792 Q81_FCMAC1_SEG_NUM, 1793 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fcmac1_regs)), 1794 "FCMAC1 Registers"); 1795 1796 ret = qls_get_mpi_regs(ha, &mpi_dump->fcmac1_regs[0], 1797 Q81_FCMAC1_REGS_ADDR, Q81_FCMAC_REGS_CNT); 1798 1799 qls_mpid_seg_hdr(&mpi_dump->fcmac2_regs_seg_hdr, 1800 Q81_FCMAC2_SEG_NUM, 1801 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fcmac2_regs)), 1802 "FCMAC2 Registers"); 1803 1804 ret = qls_get_mpi_regs(ha, &mpi_dump->fcmac2_regs[0], 1805 Q81_FCMAC2_REGS_ADDR, Q81_FCMAC_REGS_CNT); 1806 1807 qls_mpid_seg_hdr(&mpi_dump->fc1_mbx_regs_seg_hdr, 1808 Q81_FC1_MBOX_SEG_NUM, 1809 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fc1_mbx_regs)), 1810 "FC1 MBox Regs"); 1811 1812 ret = qls_get_mpi_regs(ha, &mpi_dump->fc1_mbx_regs[0], 1813 Q81_FC1_MBX_REGS_ADDR, Q81_FC_MBX_REGS_CNT); 1814 1815 qls_mpid_seg_hdr(&mpi_dump->ide_regs_seg_hdr, 1816 Q81_IDE_SEG_NUM, 1817 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->ide_regs)), 1818 "IDE Registers"); 1819 1820 ret = qls_get_mpi_regs(ha, &mpi_dump->ide_regs[0], 1821 Q81_IDE_REGS_ADDR, Q81_IDE_REGS_CNT); 1822 1823 qls_mpid_seg_hdr(&mpi_dump->nic1_mbx_regs_seg_hdr, 1824 Q81_NIC1_MBOX_SEG_NUM, 1825 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic1_mbx_regs)), 1826 "NIC1 MBox Regs"); 1827 1828 ret = qls_get_mpi_regs(ha, &mpi_dump->nic1_mbx_regs[0], 1829 Q81_NIC1_MBX_REGS_ADDR, Q81_NIC_MBX_REGS_CNT); 1830 1831 qls_mpid_seg_hdr(&mpi_dump->smbus_regs_seg_hdr, 1832 Q81_SMBUS_SEG_NUM, 1833 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->smbus_regs)), 1834 "SMBus Registers"); 1835 1836 ret = qls_get_mpi_regs(ha, &mpi_dump->smbus_regs[0], 1837 Q81_SMBUS_REGS_ADDR, Q81_SMBUS_REGS_CNT); 1838 1839 qls_mpid_seg_hdr(&mpi_dump->fc2_mbx_regs_seg_hdr, 1840 Q81_FC2_MBOX_SEG_NUM, 1841 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->fc2_mbx_regs)), 1842 "FC2 MBox Regs"); 1843 1844 ret = qls_get_mpi_regs(ha, &mpi_dump->fc2_mbx_regs[0], 1845 Q81_FC2_MBX_REGS_ADDR, Q81_FC_MBX_REGS_CNT); 1846 1847 qls_mpid_seg_hdr(&mpi_dump->nic2_mbx_regs_seg_hdr, 1848 Q81_NIC2_MBOX_SEG_NUM, 1849 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->nic2_mbx_regs)), 1850 "NIC2 MBox Regs"); 1851 1852 ret = qls_get_mpi_regs(ha, &mpi_dump->nic2_mbx_regs[0], 1853 Q81_NIC2_MBX_REGS_ADDR, Q81_NIC_MBX_REGS_CNT); 1854 1855 qls_mpid_seg_hdr(&mpi_dump->i2c_regs_seg_hdr, 1856 Q81_I2C_SEG_NUM, 1857 (sizeof(qls_mpid_seg_hdr_t) + 1858 sizeof(mpi_dump->i2c_regs)), 1859 "I2C Registers"); 1860 1861 ret = qls_get_mpi_regs(ha, &mpi_dump->i2c_regs[0], 1862 Q81_I2C_REGS_ADDR, Q81_I2C_REGS_CNT); 1863 1864 qls_mpid_seg_hdr(&mpi_dump->memc_regs_seg_hdr, 1865 Q81_MEMC_SEG_NUM, 1866 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->memc_regs)), 1867 "MEMC Registers"); 1868 1869 ret = qls_get_mpi_regs(ha, &mpi_dump->memc_regs[0], 1870 Q81_MEMC_REGS_ADDR, Q81_MEMC_REGS_CNT); 1871 1872 qls_mpid_seg_hdr(&mpi_dump->pbus_regs_seg_hdr, 1873 Q81_PBUS_SEG_NUM, 1874 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->pbus_regs)), 1875 "PBUS Registers"); 1876 1877 ret = qls_get_mpi_regs(ha, &mpi_dump->pbus_regs[0], 1878 Q81_PBUS_REGS_ADDR, Q81_PBUS_REGS_CNT); 1879 1880 qls_mpid_seg_hdr(&mpi_dump->mde_regs_seg_hdr, 1881 Q81_MDE_SEG_NUM, 1882 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->mde_regs)), 1883 "MDE Registers"); 1884 1885 ret = qls_get_mpi_regs(ha, &mpi_dump->mde_regs[0], 1886 Q81_MDE_REGS_ADDR, Q81_MDE_REGS_CNT); 1887 1888 qls_mpid_seg_hdr(&mpi_dump->intr_states_seg_hdr, 1889 Q81_INTR_STATES_SEG_NUM, 1890 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->intr_states)), 1891 "INTR States"); 1892 1893 qls_get_intr_states(ha, &mpi_dump->intr_states[0]); 1894 1895 qls_mpid_seg_hdr(&mpi_dump->probe_dump_seg_hdr, 1896 Q81_PROBE_DUMP_SEG_NUM, 1897 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->probe_dump)), 1898 "Probe Dump"); 1899 1900 qls_get_probe_dump(ha, &mpi_dump->probe_dump[0]); 1901 1902 qls_mpid_seg_hdr(&mpi_dump->routing_reg_seg_hdr, 1903 Q81_ROUTING_INDEX_SEG_NUM, 1904 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->routing_regs)), 1905 "Routing Regs"); 1906 1907 qls_get_ridx_registers(ha, &mpi_dump->routing_regs[0]); 1908 1909 qls_mpid_seg_hdr(&mpi_dump->mac_prot_reg_seg_hdr, 1910 Q81_MAC_PROTOCOL_SEG_NUM, 1911 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->mac_prot_regs)), 1912 "MAC Prot Regs"); 1913 1914 qls_get_mac_proto_regs(ha, &mpi_dump->mac_prot_regs[0]); 1915 1916 qls_mpid_seg_hdr(&mpi_dump->ets_seg_hdr, 1917 Q81_ETS_SEG_NUM, 1918 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->ets)), 1919 "ETS Registers"); 1920 1921 ret = qls_get_ets_regs(ha, &mpi_dump->ets[0]); 1922 1923 qls_mpid_seg_hdr(&mpi_dump->sem_regs_seg_hdr, 1924 Q81_SEM_REGS_SEG_NUM, 1925 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->sem_regs)), 1926 "Sem Registers"); 1927 1928 for(i = 0; i < Q81_MAX_SEMAPHORE_FUNCTIONS ; i ++) { 1929 1930 reg = Q81_CTL_PROC_ADDR_REG_BLOCK | (i << Q81_FUNCTION_SHIFT) | 1931 (Q81_CTL_SEMAPHORE >> 2); 1932 1933 ret = qls_mpi_risc_rd_reg(ha, reg, ®_val); 1934 mpi_dump->sem_regs[i] = reg_val; 1935 1936 if (ret != 0) 1937 mpi_dump->sem_regs[i] = Q81_BAD_DATA; 1938 } 1939 1940 ret = qls_unpause_mpi_risc(ha); 1941 if (ret) 1942 printf("Failed RISC unpause. Status = 0x%.08x\n",ret); 1943 1944 ret = qls_mpi_reset(ha); 1945 if (ret) 1946 printf("Failed RISC reset. Status = 0x%.08x\n",ret); 1947 1948 WRITE_REG32(ha, Q81_CTL_FUNC_SPECIFIC, 0x80008000); 1949 1950 qls_mpid_seg_hdr(&mpi_dump->memc_ram_seg_hdr, 1951 Q81_MEMC_RAM_SEG_NUM, 1952 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->memc_ram)), 1953 "MEMC RAM"); 1954 1955 ret = qls_mbx_dump_risc_ram(ha, &mpi_dump->memc_ram[0], 1956 Q81_MEMC_RAM_ADDR, Q81_MEMC_RAM_CNT); 1957 if (ret) 1958 printf("Failed Dump of MEMC RAM. Status = 0x%.08x\n",ret); 1959 1960 qls_mpid_seg_hdr(&mpi_dump->code_ram_seg_hdr, 1961 Q81_WCS_RAM_SEG_NUM, 1962 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->code_ram)), 1963 "WCS RAM"); 1964 1965 ret = qls_mbx_dump_risc_ram(ha, &mpi_dump->memc_ram[0], 1966 Q81_CODE_RAM_ADDR, Q81_CODE_RAM_CNT); 1967 if (ret) 1968 printf("Failed Dump of CODE RAM. Status = 0x%.08x\n",ret); 1969 1970 qls_mpid_seg_hdr(&mpi_dump->wqc1_seg_hdr, 1971 Q81_WQC1_SEG_NUM, 1972 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->wqc1)), 1973 "WQC 1"); 1974 1975 qls_mpid_seg_hdr(&mpi_dump->wqc2_seg_hdr, 1976 Q81_WQC2_SEG_NUM, 1977 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->wqc2)), 1978 "WQC 2"); 1979 1980 qls_mpid_seg_hdr(&mpi_dump->cqc1_seg_hdr, 1981 Q81_CQC1_SEG_NUM, 1982 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->cqc1)), 1983 "CQC 1"); 1984 1985 qls_mpid_seg_hdr(&mpi_dump->cqc2_seg_hdr, 1986 Q81_CQC2_SEG_NUM, 1987 (sizeof(qls_mpid_seg_hdr_t) + sizeof(mpi_dump->cqc2)), 1988 "CQC 2"); 1989 1990 return 0; 1991 } 1992 1993