1291a2b48SSukumar Swaminathan /* 2291a2b48SSukumar Swaminathan * CDDL HEADER START 3291a2b48SSukumar Swaminathan * 4291a2b48SSukumar Swaminathan * The contents of this file are subject to the terms of the 5291a2b48SSukumar Swaminathan * Common Development and Distribution License (the "License"). 6291a2b48SSukumar Swaminathan * You may not use this file except in compliance with the License. 7291a2b48SSukumar Swaminathan * 8*8f23e9faSHans Rosenfeld * You can obtain a copy of the license at 9*8f23e9faSHans Rosenfeld * http://www.opensource.org/licenses/cddl1.txt. 10291a2b48SSukumar Swaminathan * See the License for the specific language governing permissions 11291a2b48SSukumar Swaminathan * and limitations under the License. 12291a2b48SSukumar Swaminathan * 13291a2b48SSukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each 14291a2b48SSukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15291a2b48SSukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the 16291a2b48SSukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying 17291a2b48SSukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner] 18291a2b48SSukumar Swaminathan * 19291a2b48SSukumar Swaminathan * CDDL HEADER END 20291a2b48SSukumar Swaminathan */ 21291a2b48SSukumar Swaminathan 22291a2b48SSukumar Swaminathan /* 23*8f23e9faSHans Rosenfeld * Copyright (c) 2004-2012 Emulex. All rights reserved. 2482527734SSukumar Swaminathan * Use is subject to license terms. 25291a2b48SSukumar Swaminathan */ 26291a2b48SSukumar Swaminathan 27291a2b48SSukumar Swaminathan #include <emlxs.h> 28291a2b48SSukumar Swaminathan 29291a2b48SSukumar Swaminathan #ifdef DUMP_SUPPORT 30291a2b48SSukumar Swaminathan 31291a2b48SSukumar Swaminathan /* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */ 32291a2b48SSukumar Swaminathan EMLXS_MSG_DEF(EMLXS_DUMP_C); 33291a2b48SSukumar Swaminathan 34291a2b48SSukumar Swaminathan /* ************************************************************************* */ 35291a2b48SSukumar Swaminathan /* Utility functions */ 36291a2b48SSukumar Swaminathan /* ************************************************************************* */ 37291a2b48SSukumar Swaminathan 38291a2b48SSukumar Swaminathan static uint32_t 39291a2b48SSukumar Swaminathan emlxs_menlo_set_mode( 40291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 41291a2b48SSukumar Swaminathan uint32_t mode) 42291a2b48SSukumar Swaminathan { 43291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 44291a2b48SSukumar Swaminathan uint32_t cmd_size; 45291a2b48SSukumar Swaminathan uint32_t rsp_size; 46291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL; 47291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf = NULL; 48291a2b48SSukumar Swaminathan uint32_t rval = 0; 49291a2b48SSukumar Swaminathan 50*8f23e9faSHans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) { 5182527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER); 52291a2b48SSukumar Swaminathan } 53291a2b48SSukumar Swaminathan 5482527734SSukumar Swaminathan cmd_size = sizeof (menlo_set_cmd_t); 5582527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP); 56291a2b48SSukumar Swaminathan 5782527734SSukumar Swaminathan rsp_size = 4; 5882527734SSukumar Swaminathan rsp_buf = (menlo_rsp_t *)kmem_zalloc(rsp_size, KM_SLEEP); 59291a2b48SSukumar Swaminathan 60291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_SET_MODE; 61291a2b48SSukumar Swaminathan cmd_buf->set.value1 = mode; 62291a2b48SSukumar Swaminathan cmd_buf->set.value2 = 0; 63291a2b48SSukumar Swaminathan 64291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 65291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size); 66291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 67291a2b48SSukumar Swaminathan 68291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size, 69291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) { 70291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 71*8f23e9faSHans Rosenfeld "menlo_set_mode: Unable to send command."); 72291a2b48SSukumar Swaminathan goto done; 73291a2b48SSukumar Swaminathan } 74291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 75291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size); 76291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 77291a2b48SSukumar Swaminathan 78291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) { 79291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 80*8f23e9faSHans Rosenfeld "menlo_set_mode: Menlo command error. code=%d.\n", 81291a2b48SSukumar Swaminathan rsp_buf->code); 82291a2b48SSukumar Swaminathan } 83291a2b48SSukumar Swaminathan 84291a2b48SSukumar Swaminathan rval = rsp_buf->code; 85291a2b48SSukumar Swaminathan 86291a2b48SSukumar Swaminathan done: 87291a2b48SSukumar Swaminathan 88291a2b48SSukumar Swaminathan if (cmd_buf) { 89291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_set_cmd_t)); 90291a2b48SSukumar Swaminathan } 91291a2b48SSukumar Swaminathan 92291a2b48SSukumar Swaminathan if (rsp_buf) { 93291a2b48SSukumar Swaminathan kmem_free(rsp_buf, 4); 94291a2b48SSukumar Swaminathan } 95291a2b48SSukumar Swaminathan 96291a2b48SSukumar Swaminathan return (rval); 97291a2b48SSukumar Swaminathan 9882527734SSukumar Swaminathan } /* emlxs_menlo_set_mode() */ 99291a2b48SSukumar Swaminathan 100291a2b48SSukumar Swaminathan 101291a2b48SSukumar Swaminathan static uint32_t 102291a2b48SSukumar Swaminathan emlxs_menlo_reset( 103291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 104291a2b48SSukumar Swaminathan uint32_t firmware) 105291a2b48SSukumar Swaminathan { 106291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 107291a2b48SSukumar Swaminathan uint32_t cmd_size; 108291a2b48SSukumar Swaminathan uint32_t rsp_size; 109291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL; 110291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf = NULL; 111291a2b48SSukumar Swaminathan uint32_t rval = 0; 112291a2b48SSukumar Swaminathan 113*8f23e9faSHans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) { 11482527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER); 115291a2b48SSukumar Swaminathan } 116291a2b48SSukumar Swaminathan 11782527734SSukumar Swaminathan cmd_size = sizeof (menlo_reset_cmd_t); 11882527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP); 119291a2b48SSukumar Swaminathan 12082527734SSukumar Swaminathan rsp_size = 4; 12182527734SSukumar Swaminathan rsp_buf = (menlo_rsp_t *)kmem_zalloc(rsp_size, KM_SLEEP); 122291a2b48SSukumar Swaminathan 123291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_RESET; 124291a2b48SSukumar Swaminathan cmd_buf->reset.firmware = firmware; 125291a2b48SSukumar Swaminathan 126291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 127291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size); 128291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 129291a2b48SSukumar Swaminathan 130291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size, 131291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) { 132291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 133*8f23e9faSHans Rosenfeld "menlo_reset: Unable to send command."); 134291a2b48SSukumar Swaminathan goto done; 135291a2b48SSukumar Swaminathan } 136291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 137291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size); 138291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 139291a2b48SSukumar Swaminathan 140291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) { 141291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 142*8f23e9faSHans Rosenfeld "menlo_reset: Menlo command error. code=%d.\n", 143291a2b48SSukumar Swaminathan rsp_buf->code); 144291a2b48SSukumar Swaminathan } 145291a2b48SSukumar Swaminathan 146291a2b48SSukumar Swaminathan rval = rsp_buf->code; 147291a2b48SSukumar Swaminathan 148291a2b48SSukumar Swaminathan done: 149291a2b48SSukumar Swaminathan 150291a2b48SSukumar Swaminathan if (cmd_buf) { 151291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_reset_cmd_t)); 152291a2b48SSukumar Swaminathan } 153291a2b48SSukumar Swaminathan 154291a2b48SSukumar Swaminathan if (rsp_buf) { 155291a2b48SSukumar Swaminathan kmem_free(rsp_buf, 4); 156291a2b48SSukumar Swaminathan } 157291a2b48SSukumar Swaminathan 158291a2b48SSukumar Swaminathan return (rval); 159291a2b48SSukumar Swaminathan 16082527734SSukumar Swaminathan } /* emlxs_menlo_reset() */ 161291a2b48SSukumar Swaminathan 162291a2b48SSukumar Swaminathan 163291a2b48SSukumar Swaminathan static uint32_t 164291a2b48SSukumar Swaminathan emlxs_menlo_get_cfg( 165291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 166291a2b48SSukumar Swaminathan menlo_get_config_rsp_t *rsp_buf, 167291a2b48SSukumar Swaminathan uint32_t rsp_size) 168291a2b48SSukumar Swaminathan { 169291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 170291a2b48SSukumar Swaminathan uint32_t cmd_size; 171291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL; 172291a2b48SSukumar Swaminathan uint32_t rval = 0; 173291a2b48SSukumar Swaminathan 174*8f23e9faSHans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) { 17582527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER); 176291a2b48SSukumar Swaminathan } 177291a2b48SSukumar Swaminathan 17882527734SSukumar Swaminathan cmd_size = sizeof (menlo_get_cmd_t); 17982527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP); 18082527734SSukumar Swaminathan 181291a2b48SSukumar Swaminathan rsp_size = sizeof (menlo_get_config_rsp_t); 182291a2b48SSukumar Swaminathan 183291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_CONFIG; 184291a2b48SSukumar Swaminathan cmd_buf->get.context = 0; 185291a2b48SSukumar Swaminathan cmd_buf->get.length = rsp_size; 186291a2b48SSukumar Swaminathan 187291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 188291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size); 189291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 190291a2b48SSukumar Swaminathan 191291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size, 192291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) { 193291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 194*8f23e9faSHans Rosenfeld "menlo_get_cfg: Unable to send command."); 195291a2b48SSukumar Swaminathan goto done; 196291a2b48SSukumar Swaminathan } 197291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 198291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size); 199291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 200291a2b48SSukumar Swaminathan 201291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) { 202291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 203*8f23e9faSHans Rosenfeld "menlo_get_cfg: Menlo command error. code=%d.\n", 204291a2b48SSukumar Swaminathan rsp_buf->code); 205291a2b48SSukumar Swaminathan } 206291a2b48SSukumar Swaminathan 207291a2b48SSukumar Swaminathan rval = rsp_buf->code; 208291a2b48SSukumar Swaminathan 209291a2b48SSukumar Swaminathan done: 210291a2b48SSukumar Swaminathan 211291a2b48SSukumar Swaminathan if (cmd_buf) { 212291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t)); 213291a2b48SSukumar Swaminathan } 214291a2b48SSukumar Swaminathan 215291a2b48SSukumar Swaminathan return (rval); 216291a2b48SSukumar Swaminathan 21782527734SSukumar Swaminathan } /* emlxs_menlo_get_cfg() */ 218291a2b48SSukumar Swaminathan 219291a2b48SSukumar Swaminathan 220291a2b48SSukumar Swaminathan 221291a2b48SSukumar Swaminathan static uint32_t 222291a2b48SSukumar Swaminathan emlxs_menlo_get_logcfg( 223291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 224291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf, 225291a2b48SSukumar Swaminathan uint32_t rsp_size) 226291a2b48SSukumar Swaminathan { 227291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 228291a2b48SSukumar Swaminathan uint32_t cmd_size; 229291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL; 230291a2b48SSukumar Swaminathan uint32_t rval = 0; 231291a2b48SSukumar Swaminathan 232*8f23e9faSHans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) { 23382527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER); 234291a2b48SSukumar Swaminathan } 235291a2b48SSukumar Swaminathan 23682527734SSukumar Swaminathan cmd_size = sizeof (menlo_get_cmd_t); 23782527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP); 23882527734SSukumar Swaminathan 239291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_LOG_CONFIG; 240291a2b48SSukumar Swaminathan cmd_buf->get.context = 0; 241291a2b48SSukumar Swaminathan cmd_buf->get.length = rsp_size; 242291a2b48SSukumar Swaminathan 243291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 244291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size); 245291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 246291a2b48SSukumar Swaminathan 247291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size, 248291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) { 249291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 250*8f23e9faSHans Rosenfeld "menlo_get_logcfg: Unable to send command."); 251291a2b48SSukumar Swaminathan goto done; 252291a2b48SSukumar Swaminathan } 253291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 254291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size); 255291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 256291a2b48SSukumar Swaminathan 257291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) { 258291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 259*8f23e9faSHans Rosenfeld "menlo_get_logcfg: Menlo command error. code=%d.\n", 260291a2b48SSukumar Swaminathan rsp_buf->code); 261291a2b48SSukumar Swaminathan } 262291a2b48SSukumar Swaminathan 263291a2b48SSukumar Swaminathan rval = rsp_buf->code; 264291a2b48SSukumar Swaminathan 265291a2b48SSukumar Swaminathan done: 266291a2b48SSukumar Swaminathan 267291a2b48SSukumar Swaminathan if (cmd_buf) { 268291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t)); 269291a2b48SSukumar Swaminathan } 270291a2b48SSukumar Swaminathan 271291a2b48SSukumar Swaminathan return (rval); 272291a2b48SSukumar Swaminathan 27382527734SSukumar Swaminathan } /* emlxs_menlo_get_logcfg() */ 274291a2b48SSukumar Swaminathan 275291a2b48SSukumar Swaminathan 276291a2b48SSukumar Swaminathan static uint32_t 277291a2b48SSukumar Swaminathan emlxs_menlo_get_log( 278291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 279291a2b48SSukumar Swaminathan uint32_t id, 280291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf, 281291a2b48SSukumar Swaminathan uint32_t rsp_size) 282291a2b48SSukumar Swaminathan { 283291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 284291a2b48SSukumar Swaminathan uint32_t cmd_size; 285291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL; 286291a2b48SSukumar Swaminathan uint32_t rval = 0; 287291a2b48SSukumar Swaminathan 288*8f23e9faSHans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) { 28982527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER); 290291a2b48SSukumar Swaminathan } 291291a2b48SSukumar Swaminathan 29282527734SSukumar Swaminathan cmd_size = sizeof (menlo_get_cmd_t); 29382527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP); 29482527734SSukumar Swaminathan 295291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_LOG_DATA; 296291a2b48SSukumar Swaminathan cmd_buf->get.context = id; 297291a2b48SSukumar Swaminathan cmd_buf->get.length = rsp_size; 298291a2b48SSukumar Swaminathan 299291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 300291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size); 301291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 302291a2b48SSukumar Swaminathan 303291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size, 304291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) { 305291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 306*8f23e9faSHans Rosenfeld "menlo_get_log: Unable to send command."); 307291a2b48SSukumar Swaminathan goto done; 308291a2b48SSukumar Swaminathan } 309291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 310291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size); 311291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 312291a2b48SSukumar Swaminathan 313291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) { 314291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 315*8f23e9faSHans Rosenfeld "menlo_get_log: Menlo command error. code=%d.\n", 316291a2b48SSukumar Swaminathan rsp_buf->code); 317291a2b48SSukumar Swaminathan } 318291a2b48SSukumar Swaminathan 319291a2b48SSukumar Swaminathan rval = rsp_buf->code; 320291a2b48SSukumar Swaminathan 321291a2b48SSukumar Swaminathan done: 322291a2b48SSukumar Swaminathan 323291a2b48SSukumar Swaminathan if (cmd_buf) { 324291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t)); 325291a2b48SSukumar Swaminathan } 326291a2b48SSukumar Swaminathan 327291a2b48SSukumar Swaminathan return (rval); 328291a2b48SSukumar Swaminathan 32982527734SSukumar Swaminathan } /* emlxs_menlo_get_log() */ 330291a2b48SSukumar Swaminathan 331291a2b48SSukumar Swaminathan 332291a2b48SSukumar Swaminathan static uint32_t 333291a2b48SSukumar Swaminathan emlxs_menlo_get_paniclog( 334291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 335291a2b48SSukumar Swaminathan menlo_rsp_t *rsp_buf, 336291a2b48SSukumar Swaminathan uint32_t rsp_size) 337291a2b48SSukumar Swaminathan { 338291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 339291a2b48SSukumar Swaminathan uint32_t cmd_size; 340291a2b48SSukumar Swaminathan menlo_cmd_t *cmd_buf = NULL; 341291a2b48SSukumar Swaminathan uint32_t rval = 0; 342291a2b48SSukumar Swaminathan 343*8f23e9faSHans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) { 34482527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER); 345291a2b48SSukumar Swaminathan } 346291a2b48SSukumar Swaminathan 34782527734SSukumar Swaminathan cmd_size = sizeof (menlo_get_cmd_t); 34882527734SSukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP); 34982527734SSukumar Swaminathan 350291a2b48SSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_PANIC_LOG; 351291a2b48SSukumar Swaminathan cmd_buf->get.context = 0; 352291a2b48SSukumar Swaminathan cmd_buf->get.length = rsp_size; 353291a2b48SSukumar Swaminathan 354291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 355291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size); 356291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 357291a2b48SSukumar Swaminathan 358291a2b48SSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size, 359291a2b48SSukumar Swaminathan (uint8_t *)rsp_buf, &rsp_size)) { 360291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 361*8f23e9faSHans Rosenfeld "menlo_get_paniclog: Unable to send command."); 362291a2b48SSukumar Swaminathan goto done; 363291a2b48SSukumar Swaminathan } 364291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 365291a2b48SSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size); 366291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 367291a2b48SSukumar Swaminathan 368291a2b48SSukumar Swaminathan if (rsp_buf->code != 0) { 369291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg, 370*8f23e9faSHans Rosenfeld "menlo_get_paniclog: Menlo command error. code=%d.\n", 371291a2b48SSukumar Swaminathan rsp_buf->code); 372291a2b48SSukumar Swaminathan } 373291a2b48SSukumar Swaminathan 374291a2b48SSukumar Swaminathan rval = rsp_buf->code; 375291a2b48SSukumar Swaminathan 376291a2b48SSukumar Swaminathan done: 377291a2b48SSukumar Swaminathan 378291a2b48SSukumar Swaminathan if (cmd_buf) { 379291a2b48SSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t)); 380291a2b48SSukumar Swaminathan } 381291a2b48SSukumar Swaminathan 382291a2b48SSukumar Swaminathan return (rval); 383291a2b48SSukumar Swaminathan 38482527734SSukumar Swaminathan } /* emlxs_menlo_get_paniclog() */ 385291a2b48SSukumar Swaminathan 386291a2b48SSukumar Swaminathan 387291a2b48SSukumar Swaminathan 388291a2b48SSukumar Swaminathan 38982527734SSukumar Swaminathan extern void 390291a2b48SSukumar Swaminathan emlxs_fflush( 391291a2b48SSukumar Swaminathan emlxs_file_t *fp) 392291a2b48SSukumar Swaminathan { 393291a2b48SSukumar Swaminathan uint32_t offset; 394291a2b48SSukumar Swaminathan 395291a2b48SSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer); 396291a2b48SSukumar Swaminathan 397291a2b48SSukumar Swaminathan if (offset > fp->size) { 398291a2b48SSukumar Swaminathan fp->ptr = fp->buffer + fp->size; 399291a2b48SSukumar Swaminathan } 400291a2b48SSukumar Swaminathan 401291a2b48SSukumar Swaminathan return; 402291a2b48SSukumar Swaminathan 40382527734SSukumar Swaminathan } /* emlxs_fflush() */ 404291a2b48SSukumar Swaminathan 405291a2b48SSukumar Swaminathan 406291a2b48SSukumar Swaminathan extern uint32_t 407291a2b48SSukumar Swaminathan emlxs_ftell( 408291a2b48SSukumar Swaminathan emlxs_file_t *fp) 409291a2b48SSukumar Swaminathan { 410291a2b48SSukumar Swaminathan uint32_t offset; 411291a2b48SSukumar Swaminathan 412291a2b48SSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer); 413291a2b48SSukumar Swaminathan 414291a2b48SSukumar Swaminathan return (offset); 415291a2b48SSukumar Swaminathan 41682527734SSukumar Swaminathan } /* emlxs_ftell() */ 417291a2b48SSukumar Swaminathan 418291a2b48SSukumar Swaminathan 419291a2b48SSukumar Swaminathan static void 420291a2b48SSukumar Swaminathan emlxs_fputc( 421291a2b48SSukumar Swaminathan uint8_t value, 422291a2b48SSukumar Swaminathan emlxs_file_t *fp) 423291a2b48SSukumar Swaminathan { 424291a2b48SSukumar Swaminathan uint32_t offset; 425291a2b48SSukumar Swaminathan 426291a2b48SSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer); 427291a2b48SSukumar Swaminathan 428291a2b48SSukumar Swaminathan if ((offset + 1) <= fp->size) { 429291a2b48SSukumar Swaminathan *fp->ptr++ = value; 430291a2b48SSukumar Swaminathan } 431291a2b48SSukumar Swaminathan 432291a2b48SSukumar Swaminathan return; 433291a2b48SSukumar Swaminathan 43482527734SSukumar Swaminathan } /* emlxs_fputc() */ 435291a2b48SSukumar Swaminathan 436291a2b48SSukumar Swaminathan 437291a2b48SSukumar Swaminathan static uint32_t 438291a2b48SSukumar Swaminathan emlxs_fwrite( 439291a2b48SSukumar Swaminathan uint8_t *buffer, 440291a2b48SSukumar Swaminathan uint32_t size, 441291a2b48SSukumar Swaminathan uint32_t nitems, 442291a2b48SSukumar Swaminathan emlxs_file_t *fp) 443291a2b48SSukumar Swaminathan { 444291a2b48SSukumar Swaminathan uint32_t offset; 445291a2b48SSukumar Swaminathan uint32_t length; 446291a2b48SSukumar Swaminathan 447291a2b48SSukumar Swaminathan length = size * nitems; 448291a2b48SSukumar Swaminathan 449291a2b48SSukumar Swaminathan if (length) { 450291a2b48SSukumar Swaminathan offset = 451291a2b48SSukumar Swaminathan (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer); 452291a2b48SSukumar Swaminathan 453291a2b48SSukumar Swaminathan if ((offset + length) > fp->size) { 454291a2b48SSukumar Swaminathan length = fp->size - offset; 455291a2b48SSukumar Swaminathan } 456291a2b48SSukumar Swaminathan 457291a2b48SSukumar Swaminathan if (length) { 458291a2b48SSukumar Swaminathan bcopy(buffer, fp->ptr, length); 459291a2b48SSukumar Swaminathan fp->ptr += length; 460291a2b48SSukumar Swaminathan } 461291a2b48SSukumar Swaminathan } 462291a2b48SSukumar Swaminathan 463291a2b48SSukumar Swaminathan return (length); 464291a2b48SSukumar Swaminathan 46582527734SSukumar Swaminathan } /* emlxs_fwrite() */ 466291a2b48SSukumar Swaminathan 467291a2b48SSukumar Swaminathan 468291a2b48SSukumar Swaminathan static uint32_t 469291a2b48SSukumar Swaminathan emlxs_fprintf( 470291a2b48SSukumar Swaminathan emlxs_file_t *fp, 471291a2b48SSukumar Swaminathan const char *fmt, ...) 472291a2b48SSukumar Swaminathan { 473291a2b48SSukumar Swaminathan va_list valist; 474291a2b48SSukumar Swaminathan char va_str[1024]; 475291a2b48SSukumar Swaminathan uint32_t length; 476291a2b48SSukumar Swaminathan 477291a2b48SSukumar Swaminathan va_start(valist, fmt); 478*8f23e9faSHans Rosenfeld (void) vsnprintf(va_str, sizeof (va_str), fmt, valist); 479291a2b48SSukumar Swaminathan va_end(valist); 480291a2b48SSukumar Swaminathan 481291a2b48SSukumar Swaminathan length = emlxs_fwrite((uint8_t *)va_str, strlen(va_str), 1, fp); 482291a2b48SSukumar Swaminathan 483291a2b48SSukumar Swaminathan return (length); 484291a2b48SSukumar Swaminathan 48582527734SSukumar Swaminathan } /* emlxs_fprintf() */ 486291a2b48SSukumar Swaminathan 487291a2b48SSukumar Swaminathan 48882527734SSukumar Swaminathan extern emlxs_file_t * 489291a2b48SSukumar Swaminathan emlxs_fopen( 490291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 491291a2b48SSukumar Swaminathan uint32_t file_type) 492291a2b48SSukumar Swaminathan { 493291a2b48SSukumar Swaminathan emlxs_file_t *fp; 494291a2b48SSukumar Swaminathan 495291a2b48SSukumar Swaminathan switch (file_type) { 496291a2b48SSukumar Swaminathan case EMLXS_TXT_FILE: 497291a2b48SSukumar Swaminathan fp = &hba->dump_txtfile; 498291a2b48SSukumar Swaminathan fp->size = EMLXS_TXT_FILE_SIZE; 499291a2b48SSukumar Swaminathan break; 500291a2b48SSukumar Swaminathan 501291a2b48SSukumar Swaminathan case EMLXS_DMP_FILE: 502291a2b48SSukumar Swaminathan fp = &hba->dump_dmpfile; 503291a2b48SSukumar Swaminathan fp->size = EMLXS_DMP_FILE_SIZE; 504291a2b48SSukumar Swaminathan break; 505291a2b48SSukumar Swaminathan 506291a2b48SSukumar Swaminathan case EMLXS_CEE_FILE: 507291a2b48SSukumar Swaminathan fp = &hba->dump_ceefile; 508291a2b48SSukumar Swaminathan fp->size = EMLXS_CEE_FILE_SIZE; 509291a2b48SSukumar Swaminathan break; 510291a2b48SSukumar Swaminathan 511291a2b48SSukumar Swaminathan default: 512291a2b48SSukumar Swaminathan return (NULL); 513291a2b48SSukumar Swaminathan } 514291a2b48SSukumar Swaminathan 515291a2b48SSukumar Swaminathan /* Make sure it is word aligned */ 516291a2b48SSukumar Swaminathan fp->size &= 0xFFFFFFFC; 517291a2b48SSukumar Swaminathan 518291a2b48SSukumar Swaminathan if (!fp->buffer) { 51982527734SSukumar Swaminathan fp->buffer = 52082527734SSukumar Swaminathan (uint8_t *)kmem_zalloc(fp->size, KM_SLEEP); 521291a2b48SSukumar Swaminathan 522291a2b48SSukumar Swaminathan } else { 523291a2b48SSukumar Swaminathan bzero(fp->buffer, fp->size); 524291a2b48SSukumar Swaminathan } 525291a2b48SSukumar Swaminathan 526291a2b48SSukumar Swaminathan fp->ptr = fp->buffer; 527291a2b48SSukumar Swaminathan 528291a2b48SSukumar Swaminathan return (fp); 529291a2b48SSukumar Swaminathan 53082527734SSukumar Swaminathan } /* emlxs_fopen() */ 531291a2b48SSukumar Swaminathan 532291a2b48SSukumar Swaminathan 53382527734SSukumar Swaminathan extern uint32_t 534291a2b48SSukumar Swaminathan emlxs_fclose( 535291a2b48SSukumar Swaminathan emlxs_file_t *fp) 536291a2b48SSukumar Swaminathan { 537291a2b48SSukumar Swaminathan uint32_t offset; 538291a2b48SSukumar Swaminathan 539291a2b48SSukumar Swaminathan if (fp == NULL) { 540291a2b48SSukumar Swaminathan return (0); 541291a2b48SSukumar Swaminathan } 542291a2b48SSukumar Swaminathan 543291a2b48SSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer); 544291a2b48SSukumar Swaminathan offset = offset % 4; 545291a2b48SSukumar Swaminathan 546291a2b48SSukumar Swaminathan switch (offset) { 547291a2b48SSukumar Swaminathan case 0: 548291a2b48SSukumar Swaminathan break; 549291a2b48SSukumar Swaminathan 550291a2b48SSukumar Swaminathan case 1: 551291a2b48SSukumar Swaminathan *fp->ptr++ = 0; 552291a2b48SSukumar Swaminathan *fp->ptr++ = 0; 553291a2b48SSukumar Swaminathan *fp->ptr++ = 0; 554291a2b48SSukumar Swaminathan break; 555291a2b48SSukumar Swaminathan 556291a2b48SSukumar Swaminathan case 2: 557291a2b48SSukumar Swaminathan *fp->ptr++ = 0; 558291a2b48SSukumar Swaminathan *fp->ptr++ = 0; 559291a2b48SSukumar Swaminathan break; 560291a2b48SSukumar Swaminathan 561291a2b48SSukumar Swaminathan case 3: 562291a2b48SSukumar Swaminathan *fp->ptr++ = 0; 563291a2b48SSukumar Swaminathan break; 564291a2b48SSukumar Swaminathan } 565291a2b48SSukumar Swaminathan 566291a2b48SSukumar Swaminathan return (0); 567291a2b48SSukumar Swaminathan 56882527734SSukumar Swaminathan } /* emlxs_fclose() */ 569291a2b48SSukumar Swaminathan 570291a2b48SSukumar Swaminathan 571291a2b48SSukumar Swaminathan static void 572291a2b48SSukumar Swaminathan emlxs_fdelete( 573291a2b48SSukumar Swaminathan emlxs_file_t *fp) 574291a2b48SSukumar Swaminathan { 575291a2b48SSukumar Swaminathan if (fp == NULL) { 576291a2b48SSukumar Swaminathan return; 577291a2b48SSukumar Swaminathan } 578291a2b48SSukumar Swaminathan 579291a2b48SSukumar Swaminathan if (fp->buffer && fp->size) { 580291a2b48SSukumar Swaminathan kmem_free(fp->buffer, fp->size); 581291a2b48SSukumar Swaminathan } 582291a2b48SSukumar Swaminathan 583291a2b48SSukumar Swaminathan fp->buffer = NULL; 584291a2b48SSukumar Swaminathan fp->ptr = NULL; 585291a2b48SSukumar Swaminathan fp->size = 0; 586291a2b48SSukumar Swaminathan 587291a2b48SSukumar Swaminathan return; 588291a2b48SSukumar Swaminathan 58982527734SSukumar Swaminathan } /* emlxs_fdelete() */ 590291a2b48SSukumar Swaminathan 591291a2b48SSukumar Swaminathan 592291a2b48SSukumar Swaminathan /* This builds a single core buffer for the IOCTL interface */ 593291a2b48SSukumar Swaminathan extern uint32_t 594291a2b48SSukumar Swaminathan emlxs_get_dump( 595291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 596291a2b48SSukumar Swaminathan uint8_t *buffer, 597291a2b48SSukumar Swaminathan uint32_t *buflen) 598291a2b48SSukumar Swaminathan { 599291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 600291a2b48SSukumar Swaminathan int32_t i; 601291a2b48SSukumar Swaminathan int32_t size; 602291a2b48SSukumar Swaminathan int32_t count; 603291a2b48SSukumar Swaminathan uint32_t size_dmp; 604291a2b48SSukumar Swaminathan uint32_t size_txt; 605291a2b48SSukumar Swaminathan uint32_t size_cee; 606291a2b48SSukumar Swaminathan emlxs_file_t *fp_txt; 607291a2b48SSukumar Swaminathan emlxs_file_t *fp_dmp; 608291a2b48SSukumar Swaminathan emlxs_file_t *fp_cee; 609291a2b48SSukumar Swaminathan uint32_t *wptr; 610291a2b48SSukumar Swaminathan uint8_t *bptr; 611291a2b48SSukumar Swaminathan 612291a2b48SSukumar Swaminathan if (!buflen) { 613291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 614*8f23e9faSHans Rosenfeld "get_dump: Buffer length = 0"); 615291a2b48SSukumar Swaminathan return (1); 616291a2b48SSukumar Swaminathan } 617291a2b48SSukumar Swaminathan 618291a2b48SSukumar Swaminathan fp_txt = &hba->dump_txtfile; 619291a2b48SSukumar Swaminathan fp_dmp = &hba->dump_dmpfile; 620291a2b48SSukumar Swaminathan fp_cee = &hba->dump_ceefile; 621291a2b48SSukumar Swaminathan 622291a2b48SSukumar Swaminathan size_txt = emlxs_ftell(fp_txt); 623291a2b48SSukumar Swaminathan size_dmp = emlxs_ftell(fp_dmp); 624291a2b48SSukumar Swaminathan size_cee = emlxs_ftell(fp_cee); 625291a2b48SSukumar Swaminathan 626291a2b48SSukumar Swaminathan size = 0; 627291a2b48SSukumar Swaminathan count = 0; 628291a2b48SSukumar Swaminathan if (size_txt) { 629291a2b48SSukumar Swaminathan count++; 630291a2b48SSukumar Swaminathan size += size_txt + 8; 631291a2b48SSukumar Swaminathan } 632291a2b48SSukumar Swaminathan if (size_dmp) { 633291a2b48SSukumar Swaminathan count++; 634291a2b48SSukumar Swaminathan size += size_dmp + 8; 635291a2b48SSukumar Swaminathan } 636291a2b48SSukumar Swaminathan if (size_cee) { 637291a2b48SSukumar Swaminathan count++; 638291a2b48SSukumar Swaminathan size += size_cee + 8; 639291a2b48SSukumar Swaminathan } 640291a2b48SSukumar Swaminathan 641291a2b48SSukumar Swaminathan if (size) { 642291a2b48SSukumar Swaminathan size += 4; 643291a2b48SSukumar Swaminathan } 644291a2b48SSukumar Swaminathan 645291a2b48SSukumar Swaminathan if (!buffer) { 646291a2b48SSukumar Swaminathan goto done; 647291a2b48SSukumar Swaminathan } 648291a2b48SSukumar Swaminathan 649291a2b48SSukumar Swaminathan bzero(buffer, *buflen); 650291a2b48SSukumar Swaminathan 651291a2b48SSukumar Swaminathan if (*buflen < size) { 652291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 653*8f23e9faSHans Rosenfeld "get_dump: Buffer length too small. %d < %d", 654291a2b48SSukumar Swaminathan *buflen, size); 655291a2b48SSukumar Swaminathan 656291a2b48SSukumar Swaminathan *buflen = 0; 657291a2b48SSukumar Swaminathan return (1); 658291a2b48SSukumar Swaminathan } 659291a2b48SSukumar Swaminathan 660291a2b48SSukumar Swaminathan wptr = (uint32_t *)buffer; 661291a2b48SSukumar Swaminathan wptr[0] = count; 662291a2b48SSukumar Swaminathan i = 1; 663291a2b48SSukumar Swaminathan 664291a2b48SSukumar Swaminathan if (size_txt) { 665291a2b48SSukumar Swaminathan wptr[i++] = EMLXS_TXT_FILE_ID; 666291a2b48SSukumar Swaminathan wptr[i++] = size_txt; 667291a2b48SSukumar Swaminathan } 668291a2b48SSukumar Swaminathan 669291a2b48SSukumar Swaminathan if (size_dmp) { 670291a2b48SSukumar Swaminathan wptr[i++] = EMLXS_DMP_FILE_ID; 671291a2b48SSukumar Swaminathan wptr[i++] = size_dmp; 672291a2b48SSukumar Swaminathan } 673291a2b48SSukumar Swaminathan 674291a2b48SSukumar Swaminathan if (size_cee) { 675a9800bebSGarrett D'Amore if ((hba->model_info.chip == EMLXS_BE2_CHIP) || 676a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE3_CHIP)) { 67782527734SSukumar Swaminathan wptr[i++] = EMLXS_FAT_FILE_ID; 67882527734SSukumar Swaminathan } else { 67982527734SSukumar Swaminathan wptr[i++] = EMLXS_CEE_FILE_ID; 68082527734SSukumar Swaminathan } 68182527734SSukumar Swaminathan 682291a2b48SSukumar Swaminathan wptr[i++] = size_cee; 683291a2b48SSukumar Swaminathan } 684291a2b48SSukumar Swaminathan 685291a2b48SSukumar Swaminathan bptr = (uint8_t *)&wptr[i]; 686291a2b48SSukumar Swaminathan 687291a2b48SSukumar Swaminathan if (size_txt) { 688291a2b48SSukumar Swaminathan bcopy(fp_txt->buffer, bptr, size_txt); 689291a2b48SSukumar Swaminathan bptr += size_txt; 690291a2b48SSukumar Swaminathan } 691291a2b48SSukumar Swaminathan 692291a2b48SSukumar Swaminathan if (size_dmp) { 693291a2b48SSukumar Swaminathan bcopy(fp_dmp->buffer, bptr, size_dmp); 694291a2b48SSukumar Swaminathan bptr += size_dmp; 695291a2b48SSukumar Swaminathan } 696291a2b48SSukumar Swaminathan 697291a2b48SSukumar Swaminathan if (size_cee) { 698291a2b48SSukumar Swaminathan bcopy(fp_cee->buffer, bptr, size_cee); 699291a2b48SSukumar Swaminathan bptr += size_cee; 700291a2b48SSukumar Swaminathan } 701291a2b48SSukumar Swaminathan 702291a2b48SSukumar Swaminathan done: 703291a2b48SSukumar Swaminathan 704291a2b48SSukumar Swaminathan *buflen = size; 705291a2b48SSukumar Swaminathan 706291a2b48SSukumar Swaminathan /* printf("Done. buflen=%d \n", *buflen); */ 707291a2b48SSukumar Swaminathan 708291a2b48SSukumar Swaminathan return (0); 709291a2b48SSukumar Swaminathan 71082527734SSukumar Swaminathan } /* emlxs_get_dump() */ 711291a2b48SSukumar Swaminathan 712291a2b48SSukumar Swaminathan 713291a2b48SSukumar Swaminathan static uint32_t 714291a2b48SSukumar Swaminathan emlxs_read_cfg_region( 715291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 716291a2b48SSukumar Swaminathan uint32_t Identifier, 717291a2b48SSukumar Swaminathan uint32_t ByteCount, 718291a2b48SSukumar Swaminathan uint32_t *pRetByteCount, 719291a2b48SSukumar Swaminathan uint8_t *pBuffer) 720291a2b48SSukumar Swaminathan { 721291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 722291a2b48SSukumar Swaminathan MAILBOXQ *mbq; 723291a2b48SSukumar Swaminathan uint32_t ByteCountRem; /* remaining portion of original byte count */ 724291a2b48SSukumar Swaminathan uint32_t ByteCountReq; /* requested byte count for a particular dump */ 725291a2b48SSukumar Swaminathan uint32_t CopyCount; /* bytes to copy after each successful dump */ 726291a2b48SSukumar Swaminathan uint32_t Offset; /* Offset into Config Region, for each dump */ 727291a2b48SSukumar Swaminathan uint8_t *pLocalBuf; /* ptr to buffer to receive each dump */ 728291a2b48SSukumar Swaminathan 729*8f23e9faSHans Rosenfeld if (! ByteCount) { 730*8f23e9faSHans Rosenfeld return (0); 731*8f23e9faSHans Rosenfeld } 732*8f23e9faSHans Rosenfeld 73382527734SSukumar Swaminathan mbq = 73482527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP); 735291a2b48SSukumar Swaminathan 736291a2b48SSukumar Swaminathan pLocalBuf = pBuffer; /* init local pointer to caller's buffer */ 737291a2b48SSukumar Swaminathan Offset = 0; /* start at offset 0 */ 738291a2b48SSukumar Swaminathan *pRetByteCount = 0; /* init returned byte count */ 739291a2b48SSukumar Swaminathan CopyCount = 0; 740291a2b48SSukumar Swaminathan 741291a2b48SSukumar Swaminathan for (ByteCountRem = ByteCount; ByteCountRem > 0; 742291a2b48SSukumar Swaminathan ByteCountRem -= CopyCount) { 743291a2b48SSukumar Swaminathan 74482527734SSukumar Swaminathan if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) { 74582527734SSukumar Swaminathan MAILBOX4 *mb = (MAILBOX4 *)mbq; 746291a2b48SSukumar Swaminathan 74782527734SSukumar Swaminathan ByteCountReq = 74882527734SSukumar Swaminathan (ByteCountRem < hba->sli.sli4.dump_region.size) ? 74982527734SSukumar Swaminathan ByteCountRem : hba->sli.sli4.dump_region.size; 750291a2b48SSukumar Swaminathan 75182527734SSukumar Swaminathan /* Clear the local dump_region */ 75282527734SSukumar Swaminathan bzero(hba->sli.sli4.dump_region.virt, 75382527734SSukumar Swaminathan hba->sli.sli4.dump_region.size); 754291a2b48SSukumar Swaminathan 75582527734SSukumar Swaminathan bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE); 756291a2b48SSukumar Swaminathan 75782527734SSukumar Swaminathan mb->mbxCommand = MBX_DUMP_MEMORY; 75882527734SSukumar Swaminathan mb->un.varDmp4.type = DMP_NV_PARAMS; 75982527734SSukumar Swaminathan mb->un.varDmp4.entry_index = Offset; 76082527734SSukumar Swaminathan mb->un.varDmp4.region_id = Identifier; 761291a2b48SSukumar Swaminathan 76282527734SSukumar Swaminathan mb->un.varDmp4.available_cnt = ByteCountReq; 76382527734SSukumar Swaminathan mb->un.varDmp4.addrHigh = 76482527734SSukumar Swaminathan PADDR_HI(hba->sli.sli4.dump_region.phys); 76582527734SSukumar Swaminathan mb->un.varDmp4.addrLow = 76682527734SSukumar Swaminathan PADDR_LO(hba->sli.sli4.dump_region.phys); 76782527734SSukumar Swaminathan mb->un.varDmp4.rsp_cnt = 0; 768291a2b48SSukumar Swaminathan 76982527734SSukumar Swaminathan mb->mbxOwner = OWN_HOST; 77082527734SSukumar Swaminathan mbq->mbox_cmpl = NULL; 771291a2b48SSukumar Swaminathan 77282527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != 77382527734SSukumar Swaminathan MBX_SUCCESS) { 77482527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 77582527734SSukumar Swaminathan "Unable to read config region. id=%x "\ 77682527734SSukumar Swaminathan "offset=%x status=%x", 77782527734SSukumar Swaminathan Identifier, Offset, mb->mbxStatus); 77882527734SSukumar Swaminathan 77982527734SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 78082527734SSukumar Swaminathan return (1); 78182527734SSukumar Swaminathan } 78282527734SSukumar Swaminathan 78382527734SSukumar Swaminathan CopyCount = mb->un.varDmp4.rsp_cnt; 78482527734SSukumar Swaminathan 78582527734SSukumar Swaminathan /* if no more data returned */ 78682527734SSukumar Swaminathan if (CopyCount == 0) { 78782527734SSukumar Swaminathan break; 78882527734SSukumar Swaminathan } 78982527734SSukumar Swaminathan 79082527734SSukumar Swaminathan if (CopyCount > ByteCountReq) { 79182527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 792*8f23e9faSHans Rosenfeld "read_cfg_region: " \ 79382527734SSukumar Swaminathan "Byte count too big. %d > %d\n", 79482527734SSukumar Swaminathan CopyCount, ByteCountReq); 79582527734SSukumar Swaminathan 79682527734SSukumar Swaminathan CopyCount = ByteCountReq; 79782527734SSukumar Swaminathan } 79882527734SSukumar Swaminathan 79982527734SSukumar Swaminathan bcopy((uint8_t *)hba->sli.sli4.dump_region.virt, 80082527734SSukumar Swaminathan pLocalBuf, CopyCount); 80182527734SSukumar Swaminathan 80282527734SSukumar Swaminathan } else { 80382527734SSukumar Swaminathan MAILBOX *mb = (MAILBOX *)mbq; 80482527734SSukumar Swaminathan 80582527734SSukumar Swaminathan ByteCountReq = 80682527734SSukumar Swaminathan (ByteCountRem < DUMP_BC_MAX) ? ByteCountRem : 80782527734SSukumar Swaminathan DUMP_BC_MAX; 80882527734SSukumar Swaminathan 80982527734SSukumar Swaminathan bzero((void *)mb, MAILBOX_CMD_BSIZE); 81082527734SSukumar Swaminathan 81182527734SSukumar Swaminathan mb->mbxCommand = MBX_DUMP_MEMORY; 81282527734SSukumar Swaminathan mb->un.varDmp.type = DMP_NV_PARAMS; 81382527734SSukumar Swaminathan mb->un.varDmp.cv = 1; 81482527734SSukumar Swaminathan mb->un.varDmp.region_id = Identifier; 81582527734SSukumar Swaminathan mb->un.varDmp.entry_index = Offset; 81682527734SSukumar Swaminathan mb->un.varDmp.word_cnt = ByteCountReq / 4; 81782527734SSukumar Swaminathan mb->mbxOwner = OWN_HOST; 81882527734SSukumar Swaminathan mbq->mbox_cmpl = NULL; 81982527734SSukumar Swaminathan 82082527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != 82182527734SSukumar Swaminathan MBX_SUCCESS) { 82282527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 82382527734SSukumar Swaminathan "Unable to read config region. id=%x "\ 82482527734SSukumar Swaminathan "offset=%x status=%x", 82582527734SSukumar Swaminathan Identifier, Offset, mb->mbxStatus); 82682527734SSukumar Swaminathan 82782527734SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 82882527734SSukumar Swaminathan return (1); 82982527734SSukumar Swaminathan } 83082527734SSukumar Swaminathan 83182527734SSukumar Swaminathan /* Note: for Type 2/3 Dumps, varDmp.word_cnt is */ 83282527734SSukumar Swaminathan /* actually a byte count. */ 83382527734SSukumar Swaminathan CopyCount = mb->un.varDmp.word_cnt; 83482527734SSukumar Swaminathan 83582527734SSukumar Swaminathan /* if no more data returned */ 83682527734SSukumar Swaminathan if (CopyCount == 0) { 83782527734SSukumar Swaminathan break; 83882527734SSukumar Swaminathan } 83982527734SSukumar Swaminathan 84082527734SSukumar Swaminathan if (CopyCount > ByteCountReq) { 84182527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 842*8f23e9faSHans Rosenfeld "read_cfg_region: " \ 84382527734SSukumar Swaminathan "Byte count too big. %d > %d\n", 84482527734SSukumar Swaminathan CopyCount, ByteCountReq); 84582527734SSukumar Swaminathan 84682527734SSukumar Swaminathan CopyCount = ByteCountReq; 84782527734SSukumar Swaminathan } 848291a2b48SSukumar Swaminathan 84982527734SSukumar Swaminathan bcopy((uint8_t *)&mb->un.varDmp.resp_offset, pLocalBuf, 85082527734SSukumar Swaminathan CopyCount); 85182527734SSukumar Swaminathan } 852291a2b48SSukumar Swaminathan 853291a2b48SSukumar Swaminathan pLocalBuf += CopyCount; 854291a2b48SSukumar Swaminathan Offset += CopyCount; 855291a2b48SSukumar Swaminathan *pRetByteCount += CopyCount; 856291a2b48SSukumar Swaminathan } 857291a2b48SSukumar Swaminathan 858291a2b48SSukumar Swaminathan return (0); 859291a2b48SSukumar Swaminathan 86082527734SSukumar Swaminathan } /* emlxs_read_cfg_region() */ 861291a2b48SSukumar Swaminathan 862291a2b48SSukumar Swaminathan 863291a2b48SSukumar Swaminathan 864291a2b48SSukumar Swaminathan /* ************************************************************************* */ 865291a2b48SSukumar Swaminathan /* ************************************************************************* */ 866291a2b48SSukumar Swaminathan /* Dump Generators, Low-Level */ 867291a2b48SSukumar Swaminathan /* ************************************************************************* */ 868291a2b48SSukumar Swaminathan /* ************************************************************************* */ 869291a2b48SSukumar Swaminathan 870291a2b48SSukumar Swaminathan static uint32_t 871291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile( 872291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 873291a2b48SSukumar Swaminathan char *pString, 874291a2b48SSukumar Swaminathan char *pSidLegend, 875291a2b48SSukumar Swaminathan char *pLidLegend, 876291a2b48SSukumar Swaminathan uint32_t pure) 877291a2b48SSukumar Swaminathan { 878291a2b48SSukumar Swaminathan 879291a2b48SSukumar Swaminathan if (!fpTxtFile) { 880291a2b48SSukumar Swaminathan return (1); 881291a2b48SSukumar Swaminathan } 882291a2b48SSukumar Swaminathan 883291a2b48SSukumar Swaminathan if (pSidLegend && pLidLegend) { 884291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpTxtFile, "%s: %s\n", pSidLegend, 885291a2b48SSukumar Swaminathan pLidLegend); 886291a2b48SSukumar Swaminathan 887291a2b48SSukumar Swaminathan if (pure == 0) { 888291a2b48SSukumar Swaminathan emlxs_fputc(' ', fpTxtFile); 889291a2b48SSukumar Swaminathan } 890291a2b48SSukumar Swaminathan 891291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)pString, strlen(pString), 1, 892291a2b48SSukumar Swaminathan fpTxtFile); 893291a2b48SSukumar Swaminathan 894291a2b48SSukumar Swaminathan if (pure == 0) { 895291a2b48SSukumar Swaminathan emlxs_fputc('\n', fpTxtFile); 896291a2b48SSukumar Swaminathan emlxs_fputc('\n', fpTxtFile); 897291a2b48SSukumar Swaminathan } 898291a2b48SSukumar Swaminathan } else { 899291a2b48SSukumar Swaminathan if (pure == 0) { 900291a2b48SSukumar Swaminathan emlxs_fputc(' ', fpTxtFile); 901291a2b48SSukumar Swaminathan } 902291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)pString, strlen(pString), 1, 903291a2b48SSukumar Swaminathan fpTxtFile); 904291a2b48SSukumar Swaminathan } 905291a2b48SSukumar Swaminathan 906291a2b48SSukumar Swaminathan emlxs_fflush(fpTxtFile); 907291a2b48SSukumar Swaminathan 908291a2b48SSukumar Swaminathan return (0); 909291a2b48SSukumar Swaminathan 91082527734SSukumar Swaminathan } /* emlxs_dump_string_txtfile() */ 911291a2b48SSukumar Swaminathan 912291a2b48SSukumar Swaminathan 913291a2b48SSukumar Swaminathan static uint32_t 914291a2b48SSukumar Swaminathan emlxs_dump_word_txtfile( 915291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 916291a2b48SSukumar Swaminathan uint32_t *pBuffer, 917291a2b48SSukumar Swaminathan uint32_t WordCount, 918291a2b48SSukumar Swaminathan char *pSidLegend, 919291a2b48SSukumar Swaminathan char *pLidLegend) 920291a2b48SSukumar Swaminathan { 921291a2b48SSukumar Swaminathan char buf1[256]; 922291a2b48SSukumar Swaminathan char buf2[256]; 923291a2b48SSukumar Swaminathan uint32_t *ptr; 924291a2b48SSukumar Swaminathan uint32_t j; 925291a2b48SSukumar Swaminathan 926291a2b48SSukumar Swaminathan if (!fpTxtFile) { 927291a2b48SSukumar Swaminathan return (1); 928291a2b48SSukumar Swaminathan } 929291a2b48SSukumar Swaminathan 930291a2b48SSukumar Swaminathan /* Write Legend String to the TXT File */ 931291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpTxtFile, "%s: %s\n", pSidLegend, pLidLegend); 932291a2b48SSukumar Swaminathan 933291a2b48SSukumar Swaminathan /* Write the buffer to the TXT File */ 934291a2b48SSukumar Swaminathan ptr = pBuffer; 935291a2b48SSukumar Swaminathan 936291a2b48SSukumar Swaminathan for (j = 0; j < WordCount; j++) { 937291a2b48SSukumar Swaminathan buf1[0] = 0; 938291a2b48SSukumar Swaminathan buf2[0] = 0; 939291a2b48SSukumar Swaminathan 940291a2b48SSukumar Swaminathan if ((j & 0x03) == 0) { 941*8f23e9faSHans Rosenfeld (void) snprintf(buf1, sizeof (buf1), "\n%04x:", j * 4); 942*8f23e9faSHans Rosenfeld (void) strlcat(buf2, buf1, sizeof (buf2)); 943291a2b48SSukumar Swaminathan } 944*8f23e9faSHans Rosenfeld /* print 1 word */ 945*8f23e9faSHans Rosenfeld (void) snprintf(buf1, sizeof (buf1), " %08x", ptr[j]); 946*8f23e9faSHans Rosenfeld (void) strlcat(buf2, buf1, sizeof (buf2)); 947291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)buf2, strlen(buf2), 1, 948291a2b48SSukumar Swaminathan fpTxtFile); 949291a2b48SSukumar Swaminathan } 950291a2b48SSukumar Swaminathan 951291a2b48SSukumar Swaminathan emlxs_fputc('\n', fpTxtFile); 952291a2b48SSukumar Swaminathan emlxs_fputc('\n', fpTxtFile); 953291a2b48SSukumar Swaminathan emlxs_fflush(fpTxtFile); 954291a2b48SSukumar Swaminathan return (0); 955291a2b48SSukumar Swaminathan 95682527734SSukumar Swaminathan } /* emlxs_dump_word_txtfile() */ 957291a2b48SSukumar Swaminathan 958291a2b48SSukumar Swaminathan 959291a2b48SSukumar Swaminathan 960291a2b48SSukumar Swaminathan 961291a2b48SSukumar Swaminathan static uint32_t 962291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile( 963291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 964291a2b48SSukumar Swaminathan char *pString, 965291a2b48SSukumar Swaminathan uint8_t sid, 966291a2b48SSukumar Swaminathan char *pSidLegend, 967291a2b48SSukumar Swaminathan char *pLidLegend) 968291a2b48SSukumar Swaminathan { 969291a2b48SSukumar Swaminathan uint32_t length; 970291a2b48SSukumar Swaminathan uint8_t byte; 971291a2b48SSukumar Swaminathan uint32_t pos; 972291a2b48SSukumar Swaminathan 973291a2b48SSukumar Swaminathan if (!fpDmpFile) { 974291a2b48SSukumar Swaminathan return (1); 975291a2b48SSukumar Swaminathan } 976291a2b48SSukumar Swaminathan 977291a2b48SSukumar Swaminathan /* Write Legend SID to the DMP File */ 978291a2b48SSukumar Swaminathan emlxs_fputc(SID_LEGEND, fpDmpFile); 979291a2b48SSukumar Swaminathan 980291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */ 981291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile); 982291a2b48SSukumar Swaminathan 983291a2b48SSukumar Swaminathan /* Write Legend String to the DMP File, including a Null Byte */ 984291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpDmpFile, "%s: %s", pSidLegend, pLidLegend); 985291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 986291a2b48SSukumar Swaminathan 987291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */ 988291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile); 989291a2b48SSukumar Swaminathan 990291a2b48SSukumar Swaminathan /* Write Buffer Length to the DMP File */ 991291a2b48SSukumar Swaminathan length = (uint32_t)(strlen(pString) + 1); 992291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN 993291a2b48SSukumar Swaminathan byte = (uint8_t)(length & 0x0000FF); 994291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 995291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8); 996291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 997291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16); 998291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 99982527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */ 100082527734SSukumar Swaminathan 100182527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 1002291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16); 1003291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 1004291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8); 1005291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 1006291a2b48SSukumar Swaminathan byte = (uint8_t)(length & 0x0000FF); 1007291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 100882527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 1009291a2b48SSukumar Swaminathan 1010291a2b48SSukumar Swaminathan /* Write Argument String to the DMP File, including a Null Byte */ 1011291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)pString, strlen(pString), 1, fpDmpFile); 1012291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 1013291a2b48SSukumar Swaminathan 1014291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile); 1015291a2b48SSukumar Swaminathan 1016291a2b48SSukumar Swaminathan #if CC_DUMP_ENABLE_PAD 1017291a2b48SSukumar Swaminathan /* check file size.. pad as necessary */ 1018291a2b48SSukumar Swaminathan pos = emlxs_ftell(fpDmpFile); 1019291a2b48SSukumar Swaminathan switch (pos & 0x03) { 1020291a2b48SSukumar Swaminathan case 0: 1021291a2b48SSukumar Swaminathan break; 1022291a2b48SSukumar Swaminathan case 1: 1023291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 1024291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 1025291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 1026291a2b48SSukumar Swaminathan break; 1027291a2b48SSukumar Swaminathan case 2: 1028291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 1029291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 1030291a2b48SSukumar Swaminathan break; 1031291a2b48SSukumar Swaminathan case 3: 1032291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 1033291a2b48SSukumar Swaminathan break; 1034291a2b48SSukumar Swaminathan } 1035291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile); 1036291a2b48SSukumar Swaminathan #endif 1037291a2b48SSukumar Swaminathan 1038291a2b48SSukumar Swaminathan return (0); 1039291a2b48SSukumar Swaminathan 104082527734SSukumar Swaminathan } /* emlxs_dump_string_dmpfile() */ 1041291a2b48SSukumar Swaminathan 1042291a2b48SSukumar Swaminathan 1043291a2b48SSukumar Swaminathan /* ************************************************************************** */ 1044291a2b48SSukumar Swaminathan /* emlxs_dump_word_dmpfile */ 1045291a2b48SSukumar Swaminathan /* If little endian, just write the buffer normally. */ 1046291a2b48SSukumar Swaminathan /* However, if Big Endian... Consider the following: */ 1047291a2b48SSukumar Swaminathan /* Automatic Dump, initiated by driver, Port Offline (FW WarmStart Mode), */ 1048291a2b48SSukumar Swaminathan /* Mailbox in SLIM. */ 1049291a2b48SSukumar Swaminathan /* On-Demand Dump, initiated by utility, Port Online (FW Normal Mode), */ 1050291a2b48SSukumar Swaminathan /* Mailbox in Host Memory. */ 1051291a2b48SSukumar Swaminathan /* We use the same IOCTL to get the DUMP Data, for both cases. */ 1052291a2b48SSukumar Swaminathan /* However, it normalizes the data before delivering it to us. */ 1053291a2b48SSukumar Swaminathan /* In the Dump File, we must always write the data in native mode. */ 1054291a2b48SSukumar Swaminathan /* So, if Big Endian, On-demand Dump, we must swap the words. */ 1055291a2b48SSukumar Swaminathan /* ************************************************************************* */ 1056291a2b48SSukumar Swaminathan /*ARGSUSED*/ 105782527734SSukumar Swaminathan extern uint32_t 1058291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile( 1059291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 1060291a2b48SSukumar Swaminathan uint8_t *pBuffer, 1061291a2b48SSukumar Swaminathan uint32_t bufferLen, 1062291a2b48SSukumar Swaminathan int fSwap) 1063291a2b48SSukumar Swaminathan { 1064291a2b48SSukumar Swaminathan uint32_t i; 1065291a2b48SSukumar Swaminathan uint32_t *wptr; 1066291a2b48SSukumar Swaminathan 1067291a2b48SSukumar Swaminathan if (!fpDmpFile) { 1068291a2b48SSukumar Swaminathan return (1); 1069291a2b48SSukumar Swaminathan } 1070291a2b48SSukumar Swaminathan 1071291a2b48SSukumar Swaminathan wptr = (uint32_t *)pBuffer; 1072291a2b48SSukumar Swaminathan for (i = 0; i < bufferLen / 4; i++, wptr++) { 1073291a2b48SSukumar Swaminathan if (fSwap) { 1074291a2b48SSukumar Swaminathan uint32_t w1; 1075291a2b48SSukumar Swaminathan w1 = *wptr; 107682527734SSukumar Swaminathan *wptr = BE_SWAP32(w1); 1077291a2b48SSukumar Swaminathan } 1078291a2b48SSukumar Swaminathan 1079291a2b48SSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)wptr, 4, 1, fpDmpFile); 1080291a2b48SSukumar Swaminathan } 1081291a2b48SSukumar Swaminathan 1082291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile); 1083291a2b48SSukumar Swaminathan 1084291a2b48SSukumar Swaminathan return (0); 1085291a2b48SSukumar Swaminathan 108682527734SSukumar Swaminathan } /* emlxs_dump_word_dmpfile() */ 1087291a2b48SSukumar Swaminathan 1088291a2b48SSukumar Swaminathan 1089291a2b48SSukumar Swaminathan static uint32_t 1090291a2b48SSukumar Swaminathan emlxs_dump_port_block( 1091291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 1092291a2b48SSukumar Swaminathan uint8_t *pBuffer, 1093291a2b48SSukumar Swaminathan uint32_t bufferLen, 1094291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry, 1095291a2b48SSukumar Swaminathan int fSwap) 1096291a2b48SSukumar Swaminathan { 1097291a2b48SSukumar Swaminathan uint32_t status; 1098291a2b48SSukumar Swaminathan uint32_t w; 1099291a2b48SSukumar Swaminathan uint8_t b; 1100291a2b48SSukumar Swaminathan 1101291a2b48SSukumar Swaminathan if (!fpDmpFile) { 1102291a2b48SSukumar Swaminathan return (1); 1103291a2b48SSukumar Swaminathan } 1104291a2b48SSukumar Swaminathan 1105291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */ 1106291a2b48SSukumar Swaminathan b = (uint8_t)entry.un.PortBlock.un.s.sid; 1107291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1108291a2b48SSukumar Swaminathan 1109291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN 1110291a2b48SSukumar Swaminathan /* Write Buffer Length to the DMP File */ 111182527734SSukumar Swaminathan w = entry.un.PortBlock.un.s.bc; 1112291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 1113291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1114291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 1115291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1116291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16); 1117291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1118291a2b48SSukumar Swaminathan 1119291a2b48SSukumar Swaminathan /* Write address to the DMP File */ 1120291a2b48SSukumar Swaminathan w = entry.un.PortBlock.un.s.addr; 1121291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 1122291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1123291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 1124291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1125291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16); 1126291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1127291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0xFF000000) >> 24); 1128291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 112982527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */ 113082527734SSukumar Swaminathan 113182527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 113282527734SSukumar Swaminathan /* Write Buffer Length to the DMP File */ 113382527734SSukumar Swaminathan w = entry.un.PortBlock.un.s.bc; 113482527734SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16); 113582527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 113682527734SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 113782527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 113882527734SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 113982527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 114082527734SSukumar Swaminathan 114182527734SSukumar Swaminathan /* Write address to the DMP File */ 114282527734SSukumar Swaminathan w = entry.un.PortBlock.un.s.addr; 1143291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0xFF000000) >> 24); 1144291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1145291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16); 1146291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1147291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 1148291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1149291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 1150291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 115182527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 1152291a2b48SSukumar Swaminathan 1153291a2b48SSukumar Swaminathan status = 1154291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap); 1155291a2b48SSukumar Swaminathan 1156291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile); 1157291a2b48SSukumar Swaminathan 1158291a2b48SSukumar Swaminathan return (status); 1159291a2b48SSukumar Swaminathan 116082527734SSukumar Swaminathan } /* emlxs_dump_port_block() */ 1161291a2b48SSukumar Swaminathan 1162291a2b48SSukumar Swaminathan 1163291a2b48SSukumar Swaminathan static uint32_t 1164291a2b48SSukumar Swaminathan emlxs_dump_port_struct( 1165291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 1166291a2b48SSukumar Swaminathan uint8_t *pBuffer, 1167291a2b48SSukumar Swaminathan uint32_t bufferLen, 1168291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry, 1169291a2b48SSukumar Swaminathan int fSwap) 1170291a2b48SSukumar Swaminathan { 1171291a2b48SSukumar Swaminathan uint32_t status; 1172291a2b48SSukumar Swaminathan uint32_t w; 1173291a2b48SSukumar Swaminathan uint8_t b; 1174291a2b48SSukumar Swaminathan 1175291a2b48SSukumar Swaminathan if (!fpDmpFile) { 1176291a2b48SSukumar Swaminathan return (1); 1177291a2b48SSukumar Swaminathan } 1178291a2b48SSukumar Swaminathan 1179291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */ 1180291a2b48SSukumar Swaminathan b = (uint8_t)entry.un.PortStruct.un.s.sid; 1181291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1182291a2b48SSukumar Swaminathan 1183291a2b48SSukumar Swaminathan /* Write Element Length to the DMP File */ 1184291a2b48SSukumar Swaminathan b = (uint8_t)entry.un.PortStruct.un.s.length; 1185291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1186291a2b48SSukumar Swaminathan 118782527734SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN 1188291a2b48SSukumar Swaminathan /* Write Element Count to the DMP File */ 1189291a2b48SSukumar Swaminathan w = entry.un.PortStruct.un.s.count; 1190291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 1191291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1192291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 1193291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1194291a2b48SSukumar Swaminathan 1195291a2b48SSukumar Swaminathan /* Write Address to the DMP File */ 1196291a2b48SSukumar Swaminathan w = entry.un.PortStruct.un.s.addr; 1197291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 1198291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1199291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 1200291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1201291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16); 1202291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1203291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0xFF000000) >> 24); 1204291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 120582527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */ 120682527734SSukumar Swaminathan 120782527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 120882527734SSukumar Swaminathan /* Write Element Count to the DMP File */ 120982527734SSukumar Swaminathan w = entry.un.PortStruct.un.s.count; 121082527734SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 121182527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 121282527734SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 121382527734SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 121482527734SSukumar Swaminathan 121582527734SSukumar Swaminathan /* Write Address to the DMP File */ 121682527734SSukumar Swaminathan w = entry.un.PortStruct.un.s.addr; 1217291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0xFF000000) >> 24); 1218291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1219291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x00FF0000) >> 16); 1220291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1221291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 1222291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1223291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 1224291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 122582527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 1226291a2b48SSukumar Swaminathan 1227291a2b48SSukumar Swaminathan status = 1228291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap); 1229291a2b48SSukumar Swaminathan 1230291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile); 1231291a2b48SSukumar Swaminathan 1232291a2b48SSukumar Swaminathan return (status); 1233291a2b48SSukumar Swaminathan 123482527734SSukumar Swaminathan } /* emlxs_dump_port_struct() */ 1235291a2b48SSukumar Swaminathan 1236291a2b48SSukumar Swaminathan 1237291a2b48SSukumar Swaminathan static uint32_t 1238291a2b48SSukumar Swaminathan emlxs_dump_host_block( 1239291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 1240291a2b48SSukumar Swaminathan uint8_t *pBuffer, 1241291a2b48SSukumar Swaminathan uint32_t bufferLen, 1242291a2b48SSukumar Swaminathan uint8_t sid, 1243291a2b48SSukumar Swaminathan char *pSidLegend, 1244291a2b48SSukumar Swaminathan char *pLidLegend, 1245291a2b48SSukumar Swaminathan int fSwap) 1246291a2b48SSukumar Swaminathan { 1247291a2b48SSukumar Swaminathan uint32_t status; 1248291a2b48SSukumar Swaminathan uint32_t length; 1249291a2b48SSukumar Swaminathan uint8_t byte; 1250291a2b48SSukumar Swaminathan 1251291a2b48SSukumar Swaminathan if (!fpDmpFile) { 1252291a2b48SSukumar Swaminathan return (1); 1253291a2b48SSukumar Swaminathan } 1254291a2b48SSukumar Swaminathan 1255291a2b48SSukumar Swaminathan /* Write Legend SID to the DMP File */ 1256291a2b48SSukumar Swaminathan emlxs_fputc(SID_LEGEND, fpDmpFile); 1257291a2b48SSukumar Swaminathan 1258291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */ 1259291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile); 1260291a2b48SSukumar Swaminathan 1261291a2b48SSukumar Swaminathan /* Write Legend String to the DMP File, including a Null Byte */ 1262291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpDmpFile, "%s: %s", pSidLegend, pLidLegend); 1263291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 1264291a2b48SSukumar Swaminathan 1265291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */ 1266291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile); 1267291a2b48SSukumar Swaminathan 1268291a2b48SSukumar Swaminathan /* Write Buffer Length to the DMP File */ 1269291a2b48SSukumar Swaminathan length = bufferLen; 1270291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN 1271291a2b48SSukumar Swaminathan byte = (uint8_t)(length & 0x0000FF); 1272291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 1273291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8); 1274291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 1275291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16); 1276291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 127782527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */ 127882527734SSukumar Swaminathan 127982527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 1280291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16); 1281291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 1282291a2b48SSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8); 1283291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 1284291a2b48SSukumar Swaminathan byte = (uint8_t)(length & 0x0000FF); 1285291a2b48SSukumar Swaminathan emlxs_fputc(byte, fpDmpFile); 128682527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 1287291a2b48SSukumar Swaminathan 1288291a2b48SSukumar Swaminathan status = 1289291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap); 1290291a2b48SSukumar Swaminathan 1291291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile); 1292291a2b48SSukumar Swaminathan 1293291a2b48SSukumar Swaminathan return (status); 1294291a2b48SSukumar Swaminathan 129582527734SSukumar Swaminathan } /* emlxs_dump_host_block() */ 1296291a2b48SSukumar Swaminathan 1297291a2b48SSukumar Swaminathan 1298291a2b48SSukumar Swaminathan static uint32_t 1299291a2b48SSukumar Swaminathan emlxs_dump_host_struct( 1300291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 1301291a2b48SSukumar Swaminathan uint8_t *pBuffer, 1302291a2b48SSukumar Swaminathan uint32_t bufferLen, 1303291a2b48SSukumar Swaminathan uint32_t elementLength, 1304291a2b48SSukumar Swaminathan uint32_t elementCount, 1305291a2b48SSukumar Swaminathan uint8_t sid, 1306291a2b48SSukumar Swaminathan char *pSidLegend, 1307291a2b48SSukumar Swaminathan char *pLidLegend, 1308291a2b48SSukumar Swaminathan int fSwap) 1309291a2b48SSukumar Swaminathan { 1310291a2b48SSukumar Swaminathan uint32_t status; 1311291a2b48SSukumar Swaminathan uint32_t w; 1312291a2b48SSukumar Swaminathan uint8_t b; 1313291a2b48SSukumar Swaminathan 1314291a2b48SSukumar Swaminathan if (!fpDmpFile) { 1315291a2b48SSukumar Swaminathan return (1); 1316291a2b48SSukumar Swaminathan } 1317291a2b48SSukumar Swaminathan 1318291a2b48SSukumar Swaminathan /* Write Legend SID to the DMP File */ 1319291a2b48SSukumar Swaminathan emlxs_fputc(SID_LEGEND, fpDmpFile); 1320291a2b48SSukumar Swaminathan 1321291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */ 1322291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile); 1323291a2b48SSukumar Swaminathan 1324291a2b48SSukumar Swaminathan /* Write Legend String to the DMP File, including a Null Byte */ 1325291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpDmpFile, "%s: %s", pSidLegend, pLidLegend); 1326291a2b48SSukumar Swaminathan emlxs_fputc(0, fpDmpFile); 1327291a2b48SSukumar Swaminathan 1328291a2b48SSukumar Swaminathan /* Write Argument SID to the DMP File */ 1329291a2b48SSukumar Swaminathan emlxs_fputc(sid, fpDmpFile); 1330291a2b48SSukumar Swaminathan 1331291a2b48SSukumar Swaminathan /* Write Element Length to the DMP File */ 1332291a2b48SSukumar Swaminathan b = (uint8_t)elementLength; 1333291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1334291a2b48SSukumar Swaminathan 1335291a2b48SSukumar Swaminathan /* Write Element Count to the DMP File */ 1336291a2b48SSukumar Swaminathan w = elementCount; 1337291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN 1338291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 1339291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1340291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 1341291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 134282527734SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */ 134382527734SSukumar Swaminathan 134482527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 1345291a2b48SSukumar Swaminathan b = (uint8_t)((w & 0x0000FF00) >> 8); 1346291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 1347291a2b48SSukumar Swaminathan b = (uint8_t)(w & 0x000000FF); 1348291a2b48SSukumar Swaminathan emlxs_fputc(b, fpDmpFile); 134982527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 1350291a2b48SSukumar Swaminathan 1351291a2b48SSukumar Swaminathan status = 1352291a2b48SSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap); 1353291a2b48SSukumar Swaminathan 1354291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile); 1355291a2b48SSukumar Swaminathan 1356291a2b48SSukumar Swaminathan return (status); 1357291a2b48SSukumar Swaminathan 135882527734SSukumar Swaminathan } /* emlxs_dump_host_struct() */ 1359291a2b48SSukumar Swaminathan 1360291a2b48SSukumar Swaminathan 1361291a2b48SSukumar Swaminathan /* ************************************************************************* */ 1362291a2b48SSukumar Swaminathan /* ************************************************************************* */ 1363291a2b48SSukumar Swaminathan /* Dump Generators, Mid-Level */ 1364291a2b48SSukumar Swaminathan /* ************************************************************************* */ 1365291a2b48SSukumar Swaminathan /* ************************************************************************* */ 1366291a2b48SSukumar Swaminathan 1367291a2b48SSukumar Swaminathan static uint32_t 1368291a2b48SSukumar Swaminathan emlxs_dump_parm_table( 1369291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1370291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1371291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 1372291a2b48SSukumar Swaminathan { 1373291a2b48SSukumar Swaminathan emlxs_config_t *cfg = &CFG; 1374291a2b48SSukumar Swaminathan uint32_t status; 1375291a2b48SSukumar Swaminathan uint32_t i; 1376291a2b48SSukumar Swaminathan 1377291a2b48SSukumar Swaminathan /* vars used to build the Dump String */ 1378291a2b48SSukumar Swaminathan char *buf1; 1379291a2b48SSukumar Swaminathan char *buf2; 1380291a2b48SSukumar Swaminathan 1381291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(8192, KM_SLEEP); 1382291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(8192, KM_SLEEP); 1383291a2b48SSukumar Swaminathan 1384291a2b48SSukumar Swaminathan /* Driver Parameters Heading */ 1385*8f23e9faSHans Rosenfeld (void) snprintf(buf1, 8192, 1386291a2b48SSukumar Swaminathan "IDX string Low "\ 1387291a2b48SSukumar Swaminathan "High Def Cur Exp Dyn"); 1388291a2b48SSukumar Swaminathan 1389291a2b48SSukumar Swaminathan /* Build the buffer containing all the Driver Params */ 1390291a2b48SSukumar Swaminathan for (i = 0; i < NUM_CFG_PARAM; i++) { 1391*8f23e9faSHans Rosenfeld (void) snprintf(buf2, 8192, 1392291a2b48SSukumar Swaminathan "\n %02x: %25s %8x %8x %8x %8x %4x %4x", i, 1393291a2b48SSukumar Swaminathan cfg[i].string, cfg[i].low, cfg[i].hi, cfg[i].def, 1394291a2b48SSukumar Swaminathan cfg[i].current, (cfg[i].flags & PARM_HIDDEN) ? 0 : 1, 1395291a2b48SSukumar Swaminathan (cfg[i].flags & PARM_DYNAMIC) ? 1 : 0); 1396291a2b48SSukumar Swaminathan 1397*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, 8192); 1398291a2b48SSukumar Swaminathan } 1399291a2b48SSukumar Swaminathan 1400291a2b48SSukumar Swaminathan status = 1401291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_DP_TABLE, 1402291a2b48SSukumar Swaminathan LEGEND_NULL, 0); 1403291a2b48SSukumar Swaminathan 1404291a2b48SSukumar Swaminathan status = 1405291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_DP_TABLE, 1406291a2b48SSukumar Swaminathan LEGEND_DP_TABLE, LEGEND_NULL); 1407291a2b48SSukumar Swaminathan 1408291a2b48SSukumar Swaminathan kmem_free(buf1, 8192); 1409291a2b48SSukumar Swaminathan kmem_free(buf2, 8192); 1410291a2b48SSukumar Swaminathan 1411291a2b48SSukumar Swaminathan return (status); 1412291a2b48SSukumar Swaminathan 141382527734SSukumar Swaminathan } /* emlxs_dump_parm_table() */ 1414291a2b48SSukumar Swaminathan 1415291a2b48SSukumar Swaminathan 1416291a2b48SSukumar Swaminathan static uint32_t 1417291a2b48SSukumar Swaminathan emlxs_dump_model( 1418291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1419291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1420291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 1421291a2b48SSukumar Swaminathan { 1422291a2b48SSukumar Swaminathan emlxs_vpd_t *vpd = &VPD; 1423291a2b48SSukumar Swaminathan uint32_t status; 1424291a2b48SSukumar Swaminathan 1425291a2b48SSukumar Swaminathan /* vars used to build the Dump String */ 1426291a2b48SSukumar Swaminathan char buf1[512]; 1427291a2b48SSukumar Swaminathan char buf2[512]; 1428291a2b48SSukumar Swaminathan 1429291a2b48SSukumar Swaminathan /* Write the Model into the buffer */ 1430*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%s", vpd->model); 1431*8f23e9faSHans Rosenfeld (void) strlcpy(buf1, "Model: ", sizeof (buf1)); 1432*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 1433291a2b48SSukumar Swaminathan 1434291a2b48SSukumar Swaminathan /* Write the Model Description into the buffer */ 1435*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%s", vpd->model_desc); 1436*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n Description: ", sizeof (buf1)); 1437*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 1438291a2b48SSukumar Swaminathan 1439291a2b48SSukumar Swaminathan status = 1440291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO, 1441291a2b48SSukumar Swaminathan LEGEND_HBA_MODEL, 0); 1442291a2b48SSukumar Swaminathan 1443291a2b48SSukumar Swaminathan status = 1444291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO, 1445291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_MODEL); 1446291a2b48SSukumar Swaminathan 1447291a2b48SSukumar Swaminathan return (status); 1448291a2b48SSukumar Swaminathan 144982527734SSukumar Swaminathan } /* emlxs_dump_model() */ 1450291a2b48SSukumar Swaminathan 1451291a2b48SSukumar Swaminathan 1452291a2b48SSukumar Swaminathan static uint32_t 1453291a2b48SSukumar Swaminathan emlxs_dump_wwn( 1454291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1455291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1456291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 1457291a2b48SSukumar Swaminathan { 1458291a2b48SSukumar Swaminathan uint32_t status; 1459291a2b48SSukumar Swaminathan 1460291a2b48SSukumar Swaminathan /* vars used to build the Dump String */ 1461291a2b48SSukumar Swaminathan char buf1[512]; 1462291a2b48SSukumar Swaminathan char buf2[512]; 1463291a2b48SSukumar Swaminathan int i; 1464291a2b48SSukumar Swaminathan uint8_t *p; 1465291a2b48SSukumar Swaminathan 1466291a2b48SSukumar Swaminathan /* Write the WWPN into the buffer */ 1467*8f23e9faSHans Rosenfeld (void) strlcpy(buf1, "Port WWN: ", sizeof (buf1)); 1468291a2b48SSukumar Swaminathan p = (uint8_t *)&hba->wwpn; 1469291a2b48SSukumar Swaminathan for (i = 0; i < 7; i++) { 1470*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x:", *p++); 1471*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 1472291a2b48SSukumar Swaminathan } 1473*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x", *p++); 1474*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 1475291a2b48SSukumar Swaminathan 1476291a2b48SSukumar Swaminathan /* Write the WWNN into the buffer */ 1477*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n Node WWN: ", sizeof (buf1)); 1478291a2b48SSukumar Swaminathan p = (uint8_t *)&hba->wwnn; 1479291a2b48SSukumar Swaminathan for (i = 0; i < 7; i++) { 1480*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x:", *p++); 1481*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 1482291a2b48SSukumar Swaminathan } 1483*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x", *p++); 1484*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 1485291a2b48SSukumar Swaminathan 1486291a2b48SSukumar Swaminathan status = 1487291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO, 1488291a2b48SSukumar Swaminathan LEGEND_HBA_WWN, 0); 1489291a2b48SSukumar Swaminathan 1490291a2b48SSukumar Swaminathan status = 1491291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO, 1492291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_WWN); 1493291a2b48SSukumar Swaminathan 1494291a2b48SSukumar Swaminathan return (status); 1495291a2b48SSukumar Swaminathan 149682527734SSukumar Swaminathan } /* emlxs_dump_wwn() */ 1497291a2b48SSukumar Swaminathan 1498291a2b48SSukumar Swaminathan 1499291a2b48SSukumar Swaminathan static uint32_t 1500291a2b48SSukumar Swaminathan emlxs_dump_serial_number( 1501291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1502291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1503291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 1504291a2b48SSukumar Swaminathan { 1505291a2b48SSukumar Swaminathan emlxs_vpd_t *vpd = &VPD; 1506291a2b48SSukumar Swaminathan uint32_t status; 1507291a2b48SSukumar Swaminathan 1508291a2b48SSukumar Swaminathan /* vars used to build the Dump String */ 1509291a2b48SSukumar Swaminathan char buf1[512]; 1510291a2b48SSukumar Swaminathan char buf2[512]; 1511291a2b48SSukumar Swaminathan 1512291a2b48SSukumar Swaminathan /* Write the Serial Number into the buffer */ 1513*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%s", vpd->serial_num); 1514*8f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_HBA_SN, sizeof (buf1)); 1515*8f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", sizeof (buf1)); 1516*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 1517291a2b48SSukumar Swaminathan 1518291a2b48SSukumar Swaminathan status = 1519291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO, 1520291a2b48SSukumar Swaminathan LEGEND_HBA_SN, 0); 1521291a2b48SSukumar Swaminathan 1522291a2b48SSukumar Swaminathan status = 1523291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO, 1524291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_SN); 1525291a2b48SSukumar Swaminathan 1526291a2b48SSukumar Swaminathan return (status); 1527291a2b48SSukumar Swaminathan 152882527734SSukumar Swaminathan } /* emlxs_dump_serial_number() */ 1529291a2b48SSukumar Swaminathan 1530291a2b48SSukumar Swaminathan 1531291a2b48SSukumar Swaminathan static uint32_t 1532291a2b48SSukumar Swaminathan emlxs_dump_fw_version( 1533291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1534291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1535291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 1536291a2b48SSukumar Swaminathan { 1537291a2b48SSukumar Swaminathan emlxs_vpd_t *vpd = &VPD; 1538291a2b48SSukumar Swaminathan uint32_t status; 1539291a2b48SSukumar Swaminathan 1540291a2b48SSukumar Swaminathan char *buf1; 1541291a2b48SSukumar Swaminathan char *buf2; 1542291a2b48SSukumar Swaminathan uint32_t buf1_size; 1543291a2b48SSukumar Swaminathan uint32_t buf2_size; 1544291a2b48SSukumar Swaminathan 1545291a2b48SSukumar Swaminathan buf1_size = 1024; 1546291a2b48SSukumar Swaminathan buf2_size = 1024; 1547291a2b48SSukumar Swaminathan 1548291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP); 1549291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP); 1550291a2b48SSukumar Swaminathan 1551291a2b48SSukumar Swaminathan /* Write the Firmware Version into the buffer */ 1552*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->fw_version); 1553*8f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_HBA_FW_VERSION, buf1_size); 1554*8f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size); 1555*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1556291a2b48SSukumar Swaminathan 1557291a2b48SSukumar Swaminathan /* Write the Operational FW Version into the buffer */ 1558*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->opFwName); 1559*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size); 1560*8f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_OPVERSION, buf1_size); 1561*8f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size); 1562*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1563291a2b48SSukumar Swaminathan 1564291a2b48SSukumar Swaminathan /* Write the SLI-1 FW Version into the buffer */ 1565*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->sli1FwName); 1566*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size); 1567*8f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_SLI1VERSION, buf1_size); 1568*8f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size); 1569*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1570291a2b48SSukumar Swaminathan 1571291a2b48SSukumar Swaminathan /* Write the SLI-2 FW Version into the buffer */ 1572*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->sli2FwName); 1573*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size); 1574*8f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_SLI2VERSION, buf1_size); 1575*8f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size); 1576*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1577291a2b48SSukumar Swaminathan 1578291a2b48SSukumar Swaminathan /* Write the SLI-3 FW Version into the buffer */ 1579*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->sli3FwName); 1580*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size); 1581*8f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_SLI3VERSION, buf1_size); 1582*8f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size); 1583*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1584291a2b48SSukumar Swaminathan 1585291a2b48SSukumar Swaminathan /* Write the Kernel FW Version into the buffer */ 1586*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->postKernName); 1587*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size); 1588*8f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_KERNELVERSION, buf1_size); 1589*8f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size); 1590*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1591291a2b48SSukumar Swaminathan 1592291a2b48SSukumar Swaminathan status = 1593291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO, 1594291a2b48SSukumar Swaminathan LEGEND_HBA_FW_VERSION, 0); 1595291a2b48SSukumar Swaminathan 1596291a2b48SSukumar Swaminathan status = 1597291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO, 1598291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_FW_VERSION); 1599291a2b48SSukumar Swaminathan 1600291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size); 1601291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size); 1602291a2b48SSukumar Swaminathan 1603291a2b48SSukumar Swaminathan return (status); 1604291a2b48SSukumar Swaminathan 160582527734SSukumar Swaminathan } /* emlxs_dump_fw_version() */ 1606291a2b48SSukumar Swaminathan 1607291a2b48SSukumar Swaminathan 1608291a2b48SSukumar Swaminathan static uint32_t 1609291a2b48SSukumar Swaminathan emlxs_dump_boot_version( 1610291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1611291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1612291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 1613291a2b48SSukumar Swaminathan { 1614291a2b48SSukumar Swaminathan emlxs_vpd_t *vpd = &VPD; 1615291a2b48SSukumar Swaminathan uint32_t status; 1616291a2b48SSukumar Swaminathan uint32_t state; 1617291a2b48SSukumar Swaminathan 1618291a2b48SSukumar Swaminathan char *buf1; 1619291a2b48SSukumar Swaminathan char *buf2; 1620291a2b48SSukumar Swaminathan uint32_t buf1_size; 1621291a2b48SSukumar Swaminathan uint32_t buf2_size; 1622291a2b48SSukumar Swaminathan 1623291a2b48SSukumar Swaminathan buf1_size = 1024; 1624291a2b48SSukumar Swaminathan buf2_size = 1024; 1625291a2b48SSukumar Swaminathan 1626291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP); 1627291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP); 1628291a2b48SSukumar Swaminathan 1629291a2b48SSukumar Swaminathan #ifdef EMLXS_SPARC 1630291a2b48SSukumar Swaminathan if (strcmp(vpd->fcode_version, "none") == 0) 1631291a2b48SSukumar Swaminathan #else 1632291a2b48SSukumar Swaminathan if (strcmp(vpd->boot_version, "none") == 0) 1633291a2b48SSukumar Swaminathan #endif /* EMLXS_SPARC */ 1634291a2b48SSukumar Swaminathan { 1635291a2b48SSukumar Swaminathan state = 2; /* BOOT_BIOS_NOT_PRESENT */ 1636291a2b48SSukumar Swaminathan } else { 1637291a2b48SSukumar Swaminathan state = emlxs_boot_code_state(hba); 1638291a2b48SSukumar Swaminathan } 1639291a2b48SSukumar Swaminathan 1640291a2b48SSukumar Swaminathan /* Write the Boot Bios State into the buffer */ 1641*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, " %d", state); 1642*8f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_HBA_BB_STATE, buf1_size); 1643*8f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size); 1644*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1645291a2b48SSukumar Swaminathan 1646291a2b48SSukumar Swaminathan /* Write the Boot Bios Version into the buffer */ 1647291a2b48SSukumar Swaminathan if (state == 2) { 1648*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", "unknown"); 1649291a2b48SSukumar Swaminathan } else { 1650291a2b48SSukumar Swaminathan #ifdef EMLXS_SPARC 1651*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s (FCode)", 1652*8f23e9faSHans Rosenfeld vpd->fcode_version); 1653291a2b48SSukumar Swaminathan #else 1654*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->boot_version); 1655291a2b48SSukumar Swaminathan #endif /* EMLXS_SPARC */ 1656291a2b48SSukumar Swaminathan } 1657291a2b48SSukumar Swaminathan 1658*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n ", buf1_size); 1659*8f23e9faSHans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_BB_VERSION, buf1_size); 1660*8f23e9faSHans Rosenfeld (void) strlcat(buf1, ": ", buf1_size); 1661*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1662291a2b48SSukumar Swaminathan 1663291a2b48SSukumar Swaminathan status = 1664291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO, 1665291a2b48SSukumar Swaminathan LEGEND_HBA_BB_VERSION, 0); 1666291a2b48SSukumar Swaminathan 1667291a2b48SSukumar Swaminathan status = 1668291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO, 1669291a2b48SSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_BB_VERSION); 1670291a2b48SSukumar Swaminathan 1671291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size); 1672291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size); 1673291a2b48SSukumar Swaminathan 1674291a2b48SSukumar Swaminathan return (status); 1675291a2b48SSukumar Swaminathan 167682527734SSukumar Swaminathan } /* emlxs_dump_boot_version() */ 1677291a2b48SSukumar Swaminathan 1678291a2b48SSukumar Swaminathan 1679291a2b48SSukumar Swaminathan /* ARGSUSED */ 1680291a2b48SSukumar Swaminathan static uint32_t 1681291a2b48SSukumar Swaminathan emlxs_dump_cfg_region4_decoded( 1682291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1683291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1684291a2b48SSukumar Swaminathan char *pLidLegend, 1685291a2b48SSukumar Swaminathan DUMP_WAKE_UP_PARAMS *pBuffer, 1686291a2b48SSukumar Swaminathan uint32_t ByteCount) 1687291a2b48SSukumar Swaminathan { 1688291a2b48SSukumar Swaminathan uint32_t status; 1689291a2b48SSukumar Swaminathan char *buf1; /* text buffer */ 1690291a2b48SSukumar Swaminathan char *buf2; /* text buffer */ 1691291a2b48SSukumar Swaminathan uint32_t buf1_size; 1692291a2b48SSukumar Swaminathan uint32_t buf2_size; 1693291a2b48SSukumar Swaminathan 1694291a2b48SSukumar Swaminathan buf1_size = 1024; 1695291a2b48SSukumar Swaminathan buf2_size = 1024; 1696291a2b48SSukumar Swaminathan 1697291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP); 1698291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP); 1699291a2b48SSukumar Swaminathan 1700291a2b48SSukumar Swaminathan /* Write the Initial ID into the buffer */ 1701*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s: %08x %08x", 1702*8f23e9faSHans Rosenfeld LEGEND_CR4_INITIAL_LOAD, 1703291a2b48SSukumar Swaminathan pBuffer->InitialId[0], pBuffer->InitialId[1]); 1704*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1705291a2b48SSukumar Swaminathan 1706291a2b48SSukumar Swaminathan /* Write the Flags Word into the buffer */ 1707*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x", LEGEND_CR4_FLAGS, 1708*8f23e9faSHans Rosenfeld pBuffer->Flags); 1709*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1710291a2b48SSukumar Swaminathan 1711291a2b48SSukumar Swaminathan /* Write the Boot Bios ID into the buffer */ 1712*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x", 1713*8f23e9faSHans Rosenfeld LEGEND_CR4_BOOT_BIOS_ID, 1714291a2b48SSukumar Swaminathan pBuffer->BootBiosId[0], pBuffer->BootBiosId[1]); 1715*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1716291a2b48SSukumar Swaminathan 1717291a2b48SSukumar Swaminathan /* Write the SLI1 ID into the buffer */ 1718*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x", 1719*8f23e9faSHans Rosenfeld LEGEND_CR4_SLI1_ID, 1720291a2b48SSukumar Swaminathan pBuffer->Sli1Id[0], pBuffer->Sli1Id[1]); 1721*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1722291a2b48SSukumar Swaminathan 1723291a2b48SSukumar Swaminathan /* Write the SLI2 ID into the buffer */ 1724*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x", 1725*8f23e9faSHans Rosenfeld LEGEND_CR4_SLI2_ID, 1726291a2b48SSukumar Swaminathan pBuffer->Sli2Id[0], pBuffer->Sli2Id[1]); 1727*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1728291a2b48SSukumar Swaminathan 1729291a2b48SSukumar Swaminathan /* Write the SLI3 ID into the buffer */ 1730*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x", 1731*8f23e9faSHans Rosenfeld LEGEND_CR4_SLI3_ID, 1732291a2b48SSukumar Swaminathan pBuffer->Sli3Id[0], pBuffer->Sli3Id[1]); 1733*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1734291a2b48SSukumar Swaminathan 1735291a2b48SSukumar Swaminathan /* Write the SLI4 ID into the buffer */ 1736*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x", 1737*8f23e9faSHans Rosenfeld LEGEND_CR4_SLI4_ID, 1738291a2b48SSukumar Swaminathan pBuffer->Sli4Id[0], pBuffer->Sli4Id[1]); 1739*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1740291a2b48SSukumar Swaminathan 1741291a2b48SSukumar Swaminathan /* Write the Erom ID into the buffer */ 1742*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x", 1743*8f23e9faSHans Rosenfeld LEGEND_CR4_EROM_ID, 1744291a2b48SSukumar Swaminathan pBuffer->EromId[0], pBuffer->EromId[1]); 1745*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1746291a2b48SSukumar Swaminathan 1747291a2b48SSukumar Swaminathan status = 1748291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_CONFIG_REGION, 1749291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_4, 0); 1750291a2b48SSukumar Swaminathan 1751291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size); 1752291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size); 1753291a2b48SSukumar Swaminathan 1754291a2b48SSukumar Swaminathan return (status); 1755291a2b48SSukumar Swaminathan 175682527734SSukumar Swaminathan } /* emlxs_dump_cfg_region4_decoded() */ 1757291a2b48SSukumar Swaminathan 1758291a2b48SSukumar Swaminathan 1759291a2b48SSukumar Swaminathan /* ARGSUSED */ 1760291a2b48SSukumar Swaminathan uint32_t 1761291a2b48SSukumar Swaminathan emlxs_dump_cfg_region14_decoded( 1762291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1763291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1764291a2b48SSukumar Swaminathan char *pLidLegend, 1765291a2b48SSukumar Swaminathan char *pBuffer, 1766291a2b48SSukumar Swaminathan uint32_t ByteCount) 1767291a2b48SSukumar Swaminathan { 1768291a2b48SSukumar Swaminathan uint32_t status; 1769291a2b48SSukumar Swaminathan char *buf1; /* text buffer */ 1770291a2b48SSukumar Swaminathan char *buf2; /* text buffer */ 1771291a2b48SSukumar Swaminathan uint32_t buf1_size; 1772291a2b48SSukumar Swaminathan uint32_t buf2_size; 1773291a2b48SSukumar Swaminathan int i; 1774291a2b48SSukumar Swaminathan uint8_t tag; 1775291a2b48SSukumar Swaminathan uint16_t length; 1776291a2b48SSukumar Swaminathan uint16_t length2; 1777291a2b48SSukumar Swaminathan char mnemonic[4]; 1778291a2b48SSukumar Swaminathan int fDone = FALSE; /* flag to exit VPD loop */ 1779291a2b48SSukumar Swaminathan 1780291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 1781291a2b48SSukumar Swaminathan uint32_t *wptr; 1782291a2b48SSukumar Swaminathan uint32_t w1; 1783291a2b48SSukumar Swaminathan #endif 1784291a2b48SSukumar Swaminathan 1785291a2b48SSukumar Swaminathan buf1_size = 1024; 1786291a2b48SSukumar Swaminathan buf2_size = 1024; 1787291a2b48SSukumar Swaminathan 1788291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP); 1789291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP); 1790291a2b48SSukumar Swaminathan 1791291a2b48SSukumar Swaminathan /* If Big Endian, swap the data in place, */ 1792291a2b48SSukumar Swaminathan /* because it's PCI Data (Little Endian) */ 1793291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 1794291a2b48SSukumar Swaminathan wptr = (uint32_t *)pBuffer; 1795291a2b48SSukumar Swaminathan for (i = 0; i < (int)ByteCount / 4; i++, wptr++) { 1796291a2b48SSukumar Swaminathan w1 = *wptr; 179782527734SSukumar Swaminathan *wptr = BE_SWAP32(w1); 1798291a2b48SSukumar Swaminathan } 1799291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 1800291a2b48SSukumar Swaminathan 1801291a2b48SSukumar Swaminathan /* Decode the VPD Data and write it into the buffer */ 1802291a2b48SSukumar Swaminathan 1803291a2b48SSukumar Swaminathan /* CR 26941 */ 1804291a2b48SSukumar Swaminathan /* NOTE: The following code is correct, */ 1805291a2b48SSukumar Swaminathan /* should work, and used to work. */ 1806291a2b48SSukumar Swaminathan /* pBuffer points to char, and the symbol VPD_TAG_82 is 0x82. */ 1807291a2b48SSukumar Swaminathan /* The test is an equality test, not a relational test. */ 1808291a2b48SSukumar Swaminathan /* The compiler should generate an 8 bit test, and */ 1809291a2b48SSukumar Swaminathan /* sign extension does not apply. */ 1810291a2b48SSukumar Swaminathan /* I don't know when or why it stopped working, */ 1811291a2b48SSukumar Swaminathan /* and don't have time to dig. */ 1812291a2b48SSukumar Swaminathan /* The cast fixes it. */ 1813291a2b48SSukumar Swaminathan 1814291a2b48SSukumar Swaminathan if (((unsigned char)pBuffer[0]) != VPD_TAG_82) { 1815*8f23e9faSHans Rosenfeld (void) snprintf(buf1, buf1_size, 1816*8f23e9faSHans Rosenfeld "Bad VPD Data: (w0=0x%08x)", *(uint32_t *)pBuffer); 1817291a2b48SSukumar Swaminathan } else { /* begin good data */ 1818291a2b48SSukumar Swaminathan i = 0; 1819291a2b48SSukumar Swaminathan while (!fDone) { 1820291a2b48SSukumar Swaminathan tag = pBuffer[i++]; 1821291a2b48SSukumar Swaminathan length = pBuffer[i++]; 1822291a2b48SSukumar Swaminathan length |= (pBuffer[i++] << 8); 1823291a2b48SSukumar Swaminathan 1824291a2b48SSukumar Swaminathan switch (tag) { 1825291a2b48SSukumar Swaminathan case VPD_TAG_82: 1826291a2b48SSukumar Swaminathan (void) strncpy(buf2, &pBuffer[i], 1827291a2b48SSukumar Swaminathan length > buf2_size ? buf2_size : length); 1828291a2b48SSukumar Swaminathan buf2[length > 1829291a2b48SSukumar Swaminathan (buf2_size - 1) ? (buf2_size - 1830291a2b48SSukumar Swaminathan 1) : length] = 0; 1831*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "Name: ", buf1_size); 1832*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 1833291a2b48SSukumar Swaminathan i += length; 1834291a2b48SSukumar Swaminathan break; 1835291a2b48SSukumar Swaminathan 1836291a2b48SSukumar Swaminathan case VPD_TAG_90: 1837291a2b48SSukumar Swaminathan for (;;) { 1838291a2b48SSukumar Swaminathan mnemonic[0] = pBuffer[i++]; 1839291a2b48SSukumar Swaminathan mnemonic[1] = pBuffer[i++]; 1840291a2b48SSukumar Swaminathan mnemonic[2] = 0; 1841291a2b48SSukumar Swaminathan 1842291a2b48SSukumar Swaminathan if (strcmp(mnemonic, "RV") == 0) { 1843291a2b48SSukumar Swaminathan fDone = TRUE; 1844291a2b48SSukumar Swaminathan break; 1845291a2b48SSukumar Swaminathan } 1846291a2b48SSukumar Swaminathan 1847291a2b48SSukumar Swaminathan if (mnemonic[0] == 0) { 1848291a2b48SSukumar Swaminathan fDone = TRUE; 1849291a2b48SSukumar Swaminathan break; 1850291a2b48SSukumar Swaminathan } 1851291a2b48SSukumar Swaminathan 1852291a2b48SSukumar Swaminathan length2 = pBuffer[i++]; 1853*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, 1854*8f23e9faSHans Rosenfeld "\n %s: ", mnemonic); 1855*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, 1856*8f23e9faSHans Rosenfeld buf1_size); 1857291a2b48SSukumar Swaminathan (void) strncpy(buf2, &pBuffer[i], 1858291a2b48SSukumar Swaminathan length2 > 1859291a2b48SSukumar Swaminathan buf2_size ? buf2_size : length2); 1860291a2b48SSukumar Swaminathan buf2[length2 > 1861291a2b48SSukumar Swaminathan (buf2_size - 1) ? (buf2_size - 1862291a2b48SSukumar Swaminathan 1) : length2] = 0; 1863*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, 1864*8f23e9faSHans Rosenfeld buf1_size); 1865291a2b48SSukumar Swaminathan i += length2; 1866291a2b48SSukumar Swaminathan } 1867291a2b48SSukumar Swaminathan break; 1868291a2b48SSukumar Swaminathan 1869291a2b48SSukumar Swaminathan default: 1870291a2b48SSukumar Swaminathan break; 1871291a2b48SSukumar Swaminathan 1872291a2b48SSukumar Swaminathan } /* end switch */ 1873291a2b48SSukumar Swaminathan 1874291a2b48SSukumar Swaminathan } /* end while */ 1875291a2b48SSukumar Swaminathan 1876291a2b48SSukumar Swaminathan } /* good data */ 1877291a2b48SSukumar Swaminathan 1878291a2b48SSukumar Swaminathan status = 1879291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_CONFIG_REGION, 1880291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_14, 0); 1881291a2b48SSukumar Swaminathan 1882291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size); 1883291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size); 1884291a2b48SSukumar Swaminathan 1885291a2b48SSukumar Swaminathan return (status); 1886291a2b48SSukumar Swaminathan 188782527734SSukumar Swaminathan } /* emlxs_dump_cfg_region14_decoded() */ 1888291a2b48SSukumar Swaminathan 1889291a2b48SSukumar Swaminathan 1890291a2b48SSukumar Swaminathan static uint32_t 1891291a2b48SSukumar Swaminathan emlxs_dump_cfg_region( 1892291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1893291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1894291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 1895291a2b48SSukumar Swaminathan uint8_t Region, 1896291a2b48SSukumar Swaminathan char *pLidLegend, 1897291a2b48SSukumar Swaminathan int fSwap) 1898291a2b48SSukumar Swaminathan { 1899291a2b48SSukumar Swaminathan uint32_t status; 1900291a2b48SSukumar Swaminathan uint32_t RetByteCount = 0; /* returned byte count */ 1901291a2b48SSukumar Swaminathan char *buf1; /* string ops buffer */ 1902291a2b48SSukumar Swaminathan char *buf2; /* string ops buffer */ 1903291a2b48SSukumar Swaminathan uint32_t buf1_size; 1904291a2b48SSukumar Swaminathan uint32_t buf2_size; 1905291a2b48SSukumar Swaminathan uint32_t *buffer; 1906291a2b48SSukumar Swaminathan int i; 1907291a2b48SSukumar Swaminathan 1908291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN 1909291a2b48SSukumar Swaminathan fSwap = FALSE; 1910291a2b48SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */ 1911291a2b48SSukumar Swaminathan 1912291a2b48SSukumar Swaminathan buf1_size = 4096; 1913291a2b48SSukumar Swaminathan buf2_size = 1024; 1914291a2b48SSukumar Swaminathan 1915291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP); 1916291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP); 1917291a2b48SSukumar Swaminathan 1918291a2b48SSukumar Swaminathan buffer = 1919291a2b48SSukumar Swaminathan (uint32_t *)kmem_zalloc(DUMP_MAX_CONFIG_REGION_LENGTH, KM_SLEEP); 1920291a2b48SSukumar Swaminathan 1921291a2b48SSukumar Swaminathan status = 1922291a2b48SSukumar Swaminathan emlxs_read_cfg_region(hba, Region, DUMP_MAX_CONFIG_REGION_LENGTH, 1923291a2b48SSukumar Swaminathan &RetByteCount, (uint8_t *)buffer); 1924291a2b48SSukumar Swaminathan 1925291a2b48SSukumar Swaminathan if (status != 0) { 1926291a2b48SSukumar Swaminathan kmem_free(buffer, DUMP_MAX_CONFIG_REGION_LENGTH); 1927291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size); 1928291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size); 1929291a2b48SSukumar Swaminathan return (status); 1930291a2b48SSukumar Swaminathan } 1931291a2b48SSukumar Swaminathan 1932291a2b48SSukumar Swaminathan /* Write the Data into the buffer */ 1933291a2b48SSukumar Swaminathan for (i = 0; i < (int)RetByteCount / 4; i++) { 1934291a2b48SSukumar Swaminathan if ((i % 8 == 0) && (i != 0)) { 1935*8f23e9faSHans Rosenfeld (void) strlcat((char *)buf1, "\n ", buf1_size); 1936291a2b48SSukumar Swaminathan } 1937291a2b48SSukumar Swaminathan 1938*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%08x, ", buffer[i]); 1939*8f23e9faSHans Rosenfeld (void) strlcat((char *)buf1, buf2, buf1_size); 1940291a2b48SSukumar Swaminathan } 1941291a2b48SSukumar Swaminathan 1942291a2b48SSukumar Swaminathan status = 1943291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_CONFIG_REGION, 1944291a2b48SSukumar Swaminathan pLidLegend, 0); 1945291a2b48SSukumar Swaminathan 1946291a2b48SSukumar Swaminathan status = emlxs_dump_host_block(fpDmpFile, 1947291a2b48SSukumar Swaminathan (uint8_t *)buffer, 1948291a2b48SSukumar Swaminathan RetByteCount, 1949291a2b48SSukumar Swaminathan SID_CONFIG_REGION, LEGEND_CONFIG_REGION, pLidLegend, fSwap); 1950291a2b48SSukumar Swaminathan 1951291a2b48SSukumar Swaminathan if (Region == 4) { 1952291a2b48SSukumar Swaminathan status = 1953291a2b48SSukumar Swaminathan emlxs_dump_cfg_region4_decoded(hba, fpTxtFile, pLidLegend, 1954291a2b48SSukumar Swaminathan (DUMP_WAKE_UP_PARAMS *)buffer, RetByteCount); 1955291a2b48SSukumar Swaminathan } 1956291a2b48SSukumar Swaminathan 1957291a2b48SSukumar Swaminathan if (Region == 14) { 1958291a2b48SSukumar Swaminathan status = 1959291a2b48SSukumar Swaminathan emlxs_dump_cfg_region14_decoded(hba, fpTxtFile, 1960291a2b48SSukumar Swaminathan pLidLegend, (char *)buffer, RetByteCount); 1961291a2b48SSukumar Swaminathan } 1962291a2b48SSukumar Swaminathan 1963291a2b48SSukumar Swaminathan kmem_free(buffer, DUMP_MAX_CONFIG_REGION_LENGTH); 1964291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size); 1965291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size); 1966291a2b48SSukumar Swaminathan 1967291a2b48SSukumar Swaminathan return (status); 1968291a2b48SSukumar Swaminathan 196982527734SSukumar Swaminathan } /* emlxs_dump_cfg_region() */ 1970291a2b48SSukumar Swaminathan 1971291a2b48SSukumar Swaminathan 1972291a2b48SSukumar Swaminathan static uint32_t 1973291a2b48SSukumar Swaminathan emlxs_dump_cfg_regions( 1974291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 1975291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 1976291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 1977291a2b48SSukumar Swaminathan { 1978291a2b48SSukumar Swaminathan uint32_t status; 1979291a2b48SSukumar Swaminathan 1980291a2b48SSukumar Swaminathan status = 1981291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 0, 1982291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_0, FALSE); 1983291a2b48SSukumar Swaminathan 1984291a2b48SSukumar Swaminathan status = 1985291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 1, 1986291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_1, FALSE); 1987291a2b48SSukumar Swaminathan 1988291a2b48SSukumar Swaminathan status = 1989291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 2, 1990291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_2, FALSE); 1991291a2b48SSukumar Swaminathan 1992291a2b48SSukumar Swaminathan status = 1993291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 3, 1994291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_3, FALSE); 1995291a2b48SSukumar Swaminathan 1996291a2b48SSukumar Swaminathan status = 1997291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 4, 1998291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_4, FALSE); 1999291a2b48SSukumar Swaminathan 2000291a2b48SSukumar Swaminathan status = 2001291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 5, 2002291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_5, FALSE); 2003291a2b48SSukumar Swaminathan 2004291a2b48SSukumar Swaminathan status = 2005291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 6, 2006291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_6, FALSE); 2007291a2b48SSukumar Swaminathan 2008291a2b48SSukumar Swaminathan status = 2009291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 7, 2010291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_7, FALSE); 2011291a2b48SSukumar Swaminathan 2012291a2b48SSukumar Swaminathan status = 2013291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 8, 2014291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_8, TRUE); 2015291a2b48SSukumar Swaminathan 2016291a2b48SSukumar Swaminathan status = 2017291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 9, 2018291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_9, TRUE); 2019291a2b48SSukumar Swaminathan 2020291a2b48SSukumar Swaminathan status = 2021291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 10, 2022291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_10, TRUE); 2023291a2b48SSukumar Swaminathan 2024291a2b48SSukumar Swaminathan status = 2025291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 11, 2026291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_11, FALSE); 2027291a2b48SSukumar Swaminathan 2028291a2b48SSukumar Swaminathan status = 2029291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 12, 2030291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_12, FALSE); 2031291a2b48SSukumar Swaminathan 2032291a2b48SSukumar Swaminathan status = 2033291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 13, 2034291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_13, FALSE); 2035291a2b48SSukumar Swaminathan 2036291a2b48SSukumar Swaminathan status = 2037291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 14, 2038291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_14, FALSE); 2039291a2b48SSukumar Swaminathan 2040291a2b48SSukumar Swaminathan status = 2041291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 15, 2042291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_15, FALSE); 2043291a2b48SSukumar Swaminathan 2044291a2b48SSukumar Swaminathan status = 2045291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 16, 2046291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_16, FALSE); 2047291a2b48SSukumar Swaminathan 2048291a2b48SSukumar Swaminathan status = 2049291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 17, 2050291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_17, FALSE); 2051291a2b48SSukumar Swaminathan 2052291a2b48SSukumar Swaminathan status = 2053291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 18, 2054291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_18, FALSE); 2055291a2b48SSukumar Swaminathan 2056291a2b48SSukumar Swaminathan status = 2057291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 19, 2058291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_19, FALSE); 2059291a2b48SSukumar Swaminathan 2060291a2b48SSukumar Swaminathan status = 2061291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 20, 2062291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_20, FALSE); 2063291a2b48SSukumar Swaminathan 2064291a2b48SSukumar Swaminathan status = 2065291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 21, 2066291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_21, FALSE); 2067291a2b48SSukumar Swaminathan 2068291a2b48SSukumar Swaminathan status = 2069291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 22, 2070291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_22, FALSE); 2071291a2b48SSukumar Swaminathan 2072291a2b48SSukumar Swaminathan status = 2073291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 23, 2074291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_23, FALSE); 2075291a2b48SSukumar Swaminathan 2076291a2b48SSukumar Swaminathan status = 2077291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 24, 2078291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_24, FALSE); 2079291a2b48SSukumar Swaminathan 2080291a2b48SSukumar Swaminathan status = 2081291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 25, 2082291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_25, FALSE); 2083291a2b48SSukumar Swaminathan 2084291a2b48SSukumar Swaminathan status = 2085291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 26, 2086291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_26, FALSE); 2087291a2b48SSukumar Swaminathan 2088291a2b48SSukumar Swaminathan status = 2089291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 27, 2090291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_27, FALSE); 2091291a2b48SSukumar Swaminathan 2092291a2b48SSukumar Swaminathan status = 2093291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 28, 2094291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_28, FALSE); 2095291a2b48SSukumar Swaminathan 2096291a2b48SSukumar Swaminathan status = 2097291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 29, 2098291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_29, FALSE); 2099291a2b48SSukumar Swaminathan 2100291a2b48SSukumar Swaminathan status = 2101291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 30, 2102291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_30, FALSE); 2103291a2b48SSukumar Swaminathan 2104291a2b48SSukumar Swaminathan status = 2105291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 31, 2106291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_31, FALSE); 2107291a2b48SSukumar Swaminathan 2108291a2b48SSukumar Swaminathan status = 2109291a2b48SSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 32, 2110291a2b48SSukumar Swaminathan LEGEND_CONFIG_REGION_32, FALSE); 2111291a2b48SSukumar Swaminathan 2112291a2b48SSukumar Swaminathan return (status); 2113291a2b48SSukumar Swaminathan 211482527734SSukumar Swaminathan } /* emlxs_dump_cfg_regions() */ 2115291a2b48SSukumar Swaminathan 2116291a2b48SSukumar Swaminathan 211782527734SSukumar Swaminathan /*ARGSUSED*/ 2118291a2b48SSukumar Swaminathan static uint32_t 2119291a2b48SSukumar Swaminathan emlxs_dump_os_version( 2120291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2121291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 2122291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 2123291a2b48SSukumar Swaminathan { 2124291a2b48SSukumar Swaminathan uint32_t status; 2125291a2b48SSukumar Swaminathan char *buf1; 2126291a2b48SSukumar Swaminathan char *buf2; 2127291a2b48SSukumar Swaminathan uint32_t buf1_size; 2128291a2b48SSukumar Swaminathan uint32_t buf2_size; 2129291a2b48SSukumar Swaminathan 2130291a2b48SSukumar Swaminathan buf1_size = 1024; 2131291a2b48SSukumar Swaminathan buf2_size = 1024; 2132291a2b48SSukumar Swaminathan 2133291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP); 2134291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP); 2135291a2b48SSukumar Swaminathan 2136291a2b48SSukumar Swaminathan /* First, write the OS Name string into the buffer */ 2137*8f23e9faSHans Rosenfeld (void) strlcpy(buf1, utsname.sysname, buf1_size); 2138291a2b48SSukumar Swaminathan 2139291a2b48SSukumar Swaminathan /* Second, write the Version Info into the buffer */ 2140*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, ", %s", utsname.release); 2141*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 2142291a2b48SSukumar Swaminathan 2143291a2b48SSukumar Swaminathan status = 2144291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_REV_INFO, 2145291a2b48SSukumar Swaminathan LEGEND_REV_OS_VERSION, 0); 2146291a2b48SSukumar Swaminathan 2147291a2b48SSukumar Swaminathan status = 2148291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_REV_INFO, 2149291a2b48SSukumar Swaminathan LEGEND_REV_INFO, LEGEND_REV_OS_VERSION); 2150291a2b48SSukumar Swaminathan 2151291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size); 2152291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size); 2153291a2b48SSukumar Swaminathan 2154291a2b48SSukumar Swaminathan return (status); 2155291a2b48SSukumar Swaminathan 215682527734SSukumar Swaminathan } /* emlxs_dump_os_version() */ 2157291a2b48SSukumar Swaminathan 2158291a2b48SSukumar Swaminathan 215982527734SSukumar Swaminathan /*ARGSUSED*/ 2160291a2b48SSukumar Swaminathan static uint32_t 2161291a2b48SSukumar Swaminathan emlxs_dump_drv_version( 2162291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2163291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 2164291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 2165291a2b48SSukumar Swaminathan { 2166291a2b48SSukumar Swaminathan uint32_t status; 2167291a2b48SSukumar Swaminathan char *buf1; 2168291a2b48SSukumar Swaminathan char *buf2; 2169291a2b48SSukumar Swaminathan uint32_t buf1_size; 2170291a2b48SSukumar Swaminathan uint32_t buf2_size; 2171291a2b48SSukumar Swaminathan 2172291a2b48SSukumar Swaminathan buf1_size = 1024; 2173291a2b48SSukumar Swaminathan buf2_size = 1024; 2174291a2b48SSukumar Swaminathan 2175291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP); 2176291a2b48SSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP); 2177291a2b48SSukumar Swaminathan 2178291a2b48SSukumar Swaminathan /* Write the Driver Type into the buffer */ 2179*8f23e9faSHans Rosenfeld (void) strlcpy(buf1, "Driver Type: ", buf1_size); 2180*8f23e9faSHans Rosenfeld (void) strlcat(buf1, DUMP_DRV_LEADVILLE, buf1_size); 2181291a2b48SSukumar Swaminathan 2182291a2b48SSukumar Swaminathan /* Write the Driver Name into the buffer */ 2183*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", DRIVER_NAME); 2184*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n Driver Name: ", buf1_size); 2185*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 2186291a2b48SSukumar Swaminathan 2187291a2b48SSukumar Swaminathan /* Write the Driver Version into the buffer */ 2188*8f23e9faSHans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", emlxs_version); 2189*8f23e9faSHans Rosenfeld (void) strlcat(buf1, "\n Driver Version: ", buf1_size); 2190*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, buf1_size); 2191291a2b48SSukumar Swaminathan 2192291a2b48SSukumar Swaminathan status = 2193291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_REV_INFO, 2194291a2b48SSukumar Swaminathan LEGEND_REV_DRV_VERSION, 0); 2195291a2b48SSukumar Swaminathan 2196291a2b48SSukumar Swaminathan status = 2197291a2b48SSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_REV_INFO, 2198291a2b48SSukumar Swaminathan LEGEND_REV_INFO, LEGEND_REV_DRV_VERSION); 2199291a2b48SSukumar Swaminathan 2200291a2b48SSukumar Swaminathan kmem_free(buf1, buf1_size); 2201291a2b48SSukumar Swaminathan kmem_free(buf2, buf2_size); 2202291a2b48SSukumar Swaminathan 2203291a2b48SSukumar Swaminathan return (status); 2204291a2b48SSukumar Swaminathan 220582527734SSukumar Swaminathan } /* emlxs_dump_drv_version() */ 2206291a2b48SSukumar Swaminathan 2207291a2b48SSukumar Swaminathan 2208291a2b48SSukumar Swaminathan static uint32_t 2209291a2b48SSukumar Swaminathan emlxs_dump_file_create( 2210291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2211291a2b48SSukumar Swaminathan emlxs_file_t ** fpTxtFile, 2212291a2b48SSukumar Swaminathan emlxs_file_t ** fpDmpFile, 2213291a2b48SSukumar Swaminathan emlxs_file_t ** fpCeeFile) 2214291a2b48SSukumar Swaminathan { 2215291a2b48SSukumar Swaminathan if (fpTxtFile) { 2216291a2b48SSukumar Swaminathan /* Create the Dump Files */ 2217291a2b48SSukumar Swaminathan if ((*fpTxtFile = emlxs_fopen(hba, EMLXS_TXT_FILE)) == NULL) { 2218291a2b48SSukumar Swaminathan return (1); 2219291a2b48SSukumar Swaminathan } 2220291a2b48SSukumar Swaminathan } 2221291a2b48SSukumar Swaminathan 2222291a2b48SSukumar Swaminathan if (fpCeeFile) { 2223291a2b48SSukumar Swaminathan *fpCeeFile = NULL; 2224291a2b48SSukumar Swaminathan 2225*8f23e9faSHans Rosenfeld if ((hba->model_info.device_id == PCI_DEVICE_ID_HORNET) || 2226a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE2_CHIP) || 2227a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE3_CHIP)) { 2228291a2b48SSukumar Swaminathan if ((*fpCeeFile = 2229291a2b48SSukumar Swaminathan emlxs_fopen(hba, EMLXS_CEE_FILE)) == NULL) { 2230291a2b48SSukumar Swaminathan emlxs_fdelete(*fpTxtFile); 2231291a2b48SSukumar Swaminathan return (1); 2232291a2b48SSukumar Swaminathan } 2233291a2b48SSukumar Swaminathan } 2234291a2b48SSukumar Swaminathan } 2235291a2b48SSukumar Swaminathan 2236291a2b48SSukumar Swaminathan if (fpDmpFile) { 2237291a2b48SSukumar Swaminathan if ((*fpDmpFile = emlxs_fopen(hba, EMLXS_DMP_FILE)) == NULL) { 2238291a2b48SSukumar Swaminathan emlxs_fdelete(*fpTxtFile); 2239291a2b48SSukumar Swaminathan emlxs_fdelete(*fpCeeFile); 2240291a2b48SSukumar Swaminathan return (1); 2241291a2b48SSukumar Swaminathan } 2242291a2b48SSukumar Swaminathan 2243291a2b48SSukumar Swaminathan /* Initialize the DMP File */ 2244291a2b48SSukumar Swaminathan /* Write the single-byte Dump Identification */ 2245291a2b48SSukumar Swaminathan /* SID to the DMP File */ 2246291a2b48SSukumar Swaminathan #ifdef EMLXS_LITTLE_ENDIAN 2247291a2b48SSukumar Swaminathan emlxs_fputc(SID_DUMP_ID_LE, *fpDmpFile); 2248291a2b48SSukumar Swaminathan #endif /* EMLXS_LITTLE_ENDIAN */ 224982527734SSukumar Swaminathan 225082527734SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 225182527734SSukumar Swaminathan emlxs_fputc(SID_DUMP_ID_BE, *fpDmpFile); 225282527734SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 225382527734SSukumar Swaminathan 2254291a2b48SSukumar Swaminathan emlxs_fputc(SID_NULL, *fpDmpFile); 2255291a2b48SSukumar Swaminathan emlxs_fputc(SID_NULL, *fpDmpFile); 2256291a2b48SSukumar Swaminathan emlxs_fputc(SID_NULL, *fpDmpFile); 2257291a2b48SSukumar Swaminathan emlxs_fflush(*fpDmpFile); 2258291a2b48SSukumar Swaminathan } 2259291a2b48SSukumar Swaminathan 2260291a2b48SSukumar Swaminathan return (0); 2261291a2b48SSukumar Swaminathan 226282527734SSukumar Swaminathan } /* emlxs_dump_file_create() */ 2263291a2b48SSukumar Swaminathan 2264291a2b48SSukumar Swaminathan 2265291a2b48SSukumar Swaminathan static uint32_t 2266291a2b48SSukumar Swaminathan emlxs_dump_file_terminate( 226782527734SSukumar Swaminathan emlxs_hba_t *hba, 2268291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 2269291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 2270291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile) 2271291a2b48SSukumar Swaminathan { 2272291a2b48SSukumar Swaminathan 2273291a2b48SSukumar Swaminathan if (fpTxtFile) { 2274291a2b48SSukumar Swaminathan /* Write a suitable string to the Dump TXT File */ 2275291a2b48SSukumar Swaminathan (void) emlxs_fprintf(fpTxtFile, "Dump File End\n"); 2276291a2b48SSukumar Swaminathan emlxs_fflush(fpTxtFile); 2277291a2b48SSukumar Swaminathan } 2278291a2b48SSukumar Swaminathan 2279291a2b48SSukumar Swaminathan if (fpCeeFile) { 2280*8f23e9faSHans Rosenfeld if (hba->model_info.device_id == PCI_DEVICE_ID_HORNET) { 228182527734SSukumar Swaminathan (void) emlxs_fprintf(fpCeeFile, "Dump File End\n"); 228282527734SSukumar Swaminathan } 228382527734SSukumar Swaminathan 2284291a2b48SSukumar Swaminathan emlxs_fflush(fpCeeFile); 2285291a2b48SSukumar Swaminathan } 2286291a2b48SSukumar Swaminathan 2287291a2b48SSukumar Swaminathan /* Write the single-byte Dump Termination SID to the DMP File */ 2288291a2b48SSukumar Swaminathan if (fpDmpFile) { 2289291a2b48SSukumar Swaminathan emlxs_fputc(SID_DUMP_TERM, fpDmpFile); 2290291a2b48SSukumar Swaminathan emlxs_fflush(fpDmpFile); 2291291a2b48SSukumar Swaminathan } 2292291a2b48SSukumar Swaminathan 2293291a2b48SSukumar Swaminathan 2294291a2b48SSukumar Swaminathan return (0); 2295291a2b48SSukumar Swaminathan 229682527734SSukumar Swaminathan } /* emlxs_dump_file_terminate() */ 2297291a2b48SSukumar Swaminathan 2298291a2b48SSukumar Swaminathan 2299291a2b48SSukumar Swaminathan static uint32_t 2300291a2b48SSukumar Swaminathan emlxs_dump_file_close( 2301291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 2302291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 2303291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile) 2304291a2b48SSukumar Swaminathan { 2305291a2b48SSukumar Swaminathan 2306291a2b48SSukumar Swaminathan if (fpTxtFile) { 2307291a2b48SSukumar Swaminathan (void) emlxs_fclose(fpTxtFile); 2308291a2b48SSukumar Swaminathan } 2309291a2b48SSukumar Swaminathan 2310291a2b48SSukumar Swaminathan if (fpCeeFile) { 2311291a2b48SSukumar Swaminathan (void) emlxs_fclose(fpCeeFile); 2312291a2b48SSukumar Swaminathan } 2313291a2b48SSukumar Swaminathan 2314291a2b48SSukumar Swaminathan if (fpDmpFile) { 2315291a2b48SSukumar Swaminathan (void) emlxs_fclose(fpDmpFile); 2316291a2b48SSukumar Swaminathan } 2317291a2b48SSukumar Swaminathan 2318291a2b48SSukumar Swaminathan return (0); 2319291a2b48SSukumar Swaminathan 232082527734SSukumar Swaminathan } /* emlxs_dump_file_close() */ 2321291a2b48SSukumar Swaminathan 2322291a2b48SSukumar Swaminathan 2323291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2324291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2325291a2b48SSukumar Swaminathan /* Dump Generators, High Level */ 2326291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2327291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2328291a2b48SSukumar Swaminathan 2329291a2b48SSukumar Swaminathan 2330291a2b48SSukumar Swaminathan static uint32_t 2331291a2b48SSukumar Swaminathan emlxs_dump_rev_info( 2332291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2333291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 2334291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 2335291a2b48SSukumar Swaminathan { 2336291a2b48SSukumar Swaminathan (void) emlxs_dump_os_version(hba, fpTxtFile, fpDmpFile); 2337291a2b48SSukumar Swaminathan (void) emlxs_dump_drv_version(hba, fpTxtFile, fpDmpFile); 2338291a2b48SSukumar Swaminathan return (0); 2339291a2b48SSukumar Swaminathan 234082527734SSukumar Swaminathan } /* emlxs_dump_rev_info() */ 2341291a2b48SSukumar Swaminathan 2342291a2b48SSukumar Swaminathan 2343291a2b48SSukumar Swaminathan /* ARGSUSED */ 2344291a2b48SSukumar Swaminathan static uint32_t 2345291a2b48SSukumar Swaminathan emlxs_dump_hba_info( 2346291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2347291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 2348291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 2349291a2b48SSukumar Swaminathan uint32_t dump_type) 2350291a2b48SSukumar Swaminathan { 2351291a2b48SSukumar Swaminathan (void) emlxs_dump_model(hba, fpTxtFile, fpDmpFile); 2352291a2b48SSukumar Swaminathan (void) emlxs_dump_wwn(hba, fpTxtFile, fpDmpFile); 2353291a2b48SSukumar Swaminathan (void) emlxs_dump_serial_number(hba, fpTxtFile, fpDmpFile); 2354291a2b48SSukumar Swaminathan (void) emlxs_dump_fw_version(hba, fpTxtFile, fpDmpFile); 2355291a2b48SSukumar Swaminathan (void) emlxs_dump_boot_version(hba, fpTxtFile, fpDmpFile); 2356291a2b48SSukumar Swaminathan 2357291a2b48SSukumar Swaminathan 2358291a2b48SSukumar Swaminathan return (0); 2359291a2b48SSukumar Swaminathan 236082527734SSukumar Swaminathan } /* emlxs_dump_hba_info() */ 2361291a2b48SSukumar Swaminathan 2362291a2b48SSukumar Swaminathan 2363291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2364291a2b48SSukumar Swaminathan /* emlxs_dump_table_check */ 2365291a2b48SSukumar Swaminathan /* Examine Dump Table, and determine its size. */ 2366291a2b48SSukumar Swaminathan /* Count and include ID SIDs, and the TERM SID, */ 2367291a2b48SSukumar Swaminathan /* but not the Pointer at Addr 654. */ 2368291a2b48SSukumar Swaminathan /* See comments for CC_DUMP_USE_ALL_TABLES for additional description. */ 2369291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2370291a2b48SSukumar Swaminathan static uint32_t 2371291a2b48SSukumar Swaminathan emlxs_dump_table_check( 2372291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2373291a2b48SSukumar Swaminathan uint32_t *pSize) 2374291a2b48SSukumar Swaminathan { 2375291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 2376291a2b48SSukumar Swaminathan int fDone = FALSE; /* loop control flag */ 2377291a2b48SSukumar Swaminathan uint32_t tableSize = 0; /* dump table size (word count) */ 2378291a2b48SSukumar Swaminathan MAILBOX *mb; 2379291a2b48SSukumar Swaminathan MAILBOXQ *mbq; 2380291a2b48SSukumar Swaminathan uint32_t DumpTableAddr; 2381291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry; 2382291a2b48SSukumar Swaminathan 2383291a2b48SSukumar Swaminathan *pSize = 0; 2384291a2b48SSukumar Swaminathan 2385291a2b48SSukumar Swaminathan /* Read 1 word from low memory at address 654; */ 2386291a2b48SSukumar Swaminathan /* save the returned Dump Table Base Address */ 2387291a2b48SSukumar Swaminathan 238882527734SSukumar Swaminathan mbq = 238982527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP); 2390291a2b48SSukumar Swaminathan mb = (MAILBOX *) mbq; 2391291a2b48SSukumar Swaminathan 2392291a2b48SSukumar Swaminathan /* Read the dump table address */ 239382527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, 0x654, 1); 239482527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) { 2395291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 2396291a2b48SSukumar Swaminathan "Unable to read dump table address. "\ 2397291a2b48SSukumar Swaminathan "offset=0x654 status=%x", 2398291a2b48SSukumar Swaminathan mb->mbxStatus); 2399291a2b48SSukumar Swaminathan 2400291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2401291a2b48SSukumar Swaminathan return (1); 2402291a2b48SSukumar Swaminathan } 2403291a2b48SSukumar Swaminathan 2404291a2b48SSukumar Swaminathan DumpTableAddr = mb->un.varDmp.resp_offset; 2405291a2b48SSukumar Swaminathan 2406291a2b48SSukumar Swaminathan if (DumpTableAddr == 0) { 2407291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2408291a2b48SSukumar Swaminathan return (1); 2409291a2b48SSukumar Swaminathan } 2410291a2b48SSukumar Swaminathan 2411291a2b48SSukumar Swaminathan /* Now loop reading Dump Table Entries.. */ 2412291a2b48SSukumar Swaminathan /* break out when we see a Terminator SID */ 2413291a2b48SSukumar Swaminathan while (!fDone) { 241482527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, DumpTableAddr, 2); 241582527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != 2416291a2b48SSukumar Swaminathan MBX_SUCCESS) { 2417291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 2418291a2b48SSukumar Swaminathan "Unable to read dump table entry. "\ 2419291a2b48SSukumar Swaminathan "offset=%x status=%x", 2420291a2b48SSukumar Swaminathan DumpTableAddr, mb->mbxStatus); 2421291a2b48SSukumar Swaminathan 2422291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2423291a2b48SSukumar Swaminathan return (1); 2424291a2b48SSukumar Swaminathan } 2425291a2b48SSukumar Swaminathan 2426291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0] = mb->un.varWords[4]; 2427291a2b48SSukumar Swaminathan 2428291a2b48SSukumar Swaminathan switch (entry.un.PortBlock.un.s.sid) { 2429291a2b48SSukumar Swaminathan /* New Dump Table */ 2430291a2b48SSukumar Swaminathan case SID_ID01: 2431291a2b48SSukumar Swaminathan tableSize++; 2432291a2b48SSukumar Swaminathan DumpTableAddr += 4; 2433291a2b48SSukumar Swaminathan break; 2434291a2b48SSukumar Swaminathan 2435291a2b48SSukumar Swaminathan #ifdef CC_DUMP_USE_ALL_TABLES 2436291a2b48SSukumar Swaminathan /* New Dump Table */ 2437291a2b48SSukumar Swaminathan case SID_ID02: 2438291a2b48SSukumar Swaminathan case SID_ID03: 2439291a2b48SSukumar Swaminathan tableSize++; 2440291a2b48SSukumar Swaminathan DumpTableAddr += 4; 2441291a2b48SSukumar Swaminathan break; 2442291a2b48SSukumar Swaminathan #else 2443291a2b48SSukumar Swaminathan /* New Dump Table */ 2444291a2b48SSukumar Swaminathan case SID_ID02: 2445291a2b48SSukumar Swaminathan case SID_ID03: 2446291a2b48SSukumar Swaminathan tableSize++; 2447291a2b48SSukumar Swaminathan fDone = TRUE; 2448291a2b48SSukumar Swaminathan break; 2449291a2b48SSukumar Swaminathan #endif /* CC_DUMP_USE_ALL_TABLES */ 2450291a2b48SSukumar Swaminathan 2451291a2b48SSukumar Swaminathan /* Dump Table(s) Termination - all done */ 2452291a2b48SSukumar Swaminathan case SID_TERM: 2453291a2b48SSukumar Swaminathan tableSize++; 2454291a2b48SSukumar Swaminathan fDone = TRUE; 2455291a2b48SSukumar Swaminathan break; 2456291a2b48SSukumar Swaminathan 2457291a2b48SSukumar Swaminathan /* Dump Table Entry */ 2458291a2b48SSukumar Swaminathan default: 2459291a2b48SSukumar Swaminathan tableSize += 2; 2460291a2b48SSukumar Swaminathan DumpTableAddr += 8; 2461291a2b48SSukumar Swaminathan break; 2462291a2b48SSukumar Swaminathan } 2463291a2b48SSukumar Swaminathan 2464291a2b48SSukumar Swaminathan } /* end while */ 2465291a2b48SSukumar Swaminathan 2466291a2b48SSukumar Swaminathan *pSize = (tableSize * 4); /* return the total Dump Table size */ 2467291a2b48SSukumar Swaminathan 2468291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2469291a2b48SSukumar Swaminathan return (0); 2470291a2b48SSukumar Swaminathan 247182527734SSukumar Swaminathan } /* emlxs_dump_table_check() */ 2472291a2b48SSukumar Swaminathan 2473291a2b48SSukumar Swaminathan 2474291a2b48SSukumar Swaminathan /* ************************************************************************ */ 2475291a2b48SSukumar Swaminathan /* emlxs_dump_table_read */ 2476291a2b48SSukumar Swaminathan /* Read the Dump Table and store it, for use */ 2477291a2b48SSukumar Swaminathan /* subsequently in emlxs_dump_hba_memory. */ 2478291a2b48SSukumar Swaminathan /* See comments for CC_DUMP_USE_ALL_TABLES for additional description. */ 2479291a2b48SSukumar Swaminathan /* ************************************************************************ */ 2480291a2b48SSukumar Swaminathan static uint32_t 2481291a2b48SSukumar Swaminathan emlxs_dump_table_read( 2482291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2483291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 2484291a2b48SSukumar Swaminathan uint32_t **ppDumpTable, 2485291a2b48SSukumar Swaminathan uint32_t *pDumpTableSize) 2486291a2b48SSukumar Swaminathan { 2487291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 2488291a2b48SSukumar Swaminathan uint32_t status = 0; 2489291a2b48SSukumar Swaminathan int fDone = FALSE; 2490291a2b48SSukumar Swaminathan MAILBOXQ *mbq; 2491291a2b48SSukumar Swaminathan MAILBOX *mb; 2492291a2b48SSukumar Swaminathan uint32_t *pDumpTableEntry; 2493291a2b48SSukumar Swaminathan uint32_t DumpTableAddr; 2494291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry; 2495291a2b48SSukumar Swaminathan 2496291a2b48SSukumar Swaminathan char buf2[256]; 2497291a2b48SSukumar Swaminathan char *buf1; 2498291a2b48SSukumar Swaminathan uint32_t size = (32 * 1024); 2499291a2b48SSukumar Swaminathan 2500291a2b48SSukumar Swaminathan /* First, check the dump table and if valid, get its size */ 2501291a2b48SSukumar Swaminathan status = emlxs_dump_table_check(hba, pDumpTableSize); 2502291a2b48SSukumar Swaminathan if (status != 0) { 2503291a2b48SSukumar Swaminathan return (status); 2504291a2b48SSukumar Swaminathan } 2505291a2b48SSukumar Swaminathan 2506291a2b48SSukumar Swaminathan buf1 = (char *)kmem_zalloc(size, KM_SLEEP); 2507291a2b48SSukumar Swaminathan 2508291a2b48SSukumar Swaminathan /* Allocate a buffer to hold the Dump Table */ 2509291a2b48SSukumar Swaminathan *ppDumpTable = (uint32_t *)kmem_zalloc(*pDumpTableSize, KM_SLEEP); 2510291a2b48SSukumar Swaminathan 2511291a2b48SSukumar Swaminathan pDumpTableEntry = *ppDumpTable; 2512291a2b48SSukumar Swaminathan 2513291a2b48SSukumar Swaminathan /* Read 1 word from low memory at address 654; */ 2514291a2b48SSukumar Swaminathan /* save the returned Dump Table Base Address */ 251582527734SSukumar Swaminathan mbq = 251682527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP); 2517291a2b48SSukumar Swaminathan 2518291a2b48SSukumar Swaminathan mb = (MAILBOX *) mbq; 2519291a2b48SSukumar Swaminathan 2520291a2b48SSukumar Swaminathan /* Read the dump table address */ 252182527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, 0x654, 1); 252282527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) { 2523291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 2524291a2b48SSukumar Swaminathan "Unable to read dump table address. "\ 2525291a2b48SSukumar Swaminathan "offset=0x654 status=%x", 2526291a2b48SSukumar Swaminathan mb->mbxStatus); 2527291a2b48SSukumar Swaminathan 2528291a2b48SSukumar Swaminathan kmem_free(buf1, size); 2529291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2530291a2b48SSukumar Swaminathan 2531291a2b48SSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize); 2532291a2b48SSukumar Swaminathan *pDumpTableSize = 0; 2533291a2b48SSukumar Swaminathan *ppDumpTable = NULL; 2534291a2b48SSukumar Swaminathan 2535291a2b48SSukumar Swaminathan return (1); 2536291a2b48SSukumar Swaminathan } 2537291a2b48SSukumar Swaminathan 2538291a2b48SSukumar Swaminathan DumpTableAddr = mb->un.varDmp.resp_offset; 2539291a2b48SSukumar Swaminathan 2540291a2b48SSukumar Swaminathan if (DumpTableAddr == 0) { 2541291a2b48SSukumar Swaminathan kmem_free(buf1, size); 2542291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2543291a2b48SSukumar Swaminathan 2544291a2b48SSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize); 2545291a2b48SSukumar Swaminathan *pDumpTableSize = 0; 2546291a2b48SSukumar Swaminathan *ppDumpTable = NULL; 2547291a2b48SSukumar Swaminathan 2548291a2b48SSukumar Swaminathan return (1); 2549291a2b48SSukumar Swaminathan } 2550291a2b48SSukumar Swaminathan 2551291a2b48SSukumar Swaminathan 2552291a2b48SSukumar Swaminathan /* Now loop reading Dump Table Entries.. */ 2553291a2b48SSukumar Swaminathan /* break out when we see a Terminator SID */ 2554291a2b48SSukumar Swaminathan while (!fDone) { 255582527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, DumpTableAddr, 2); 255682527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != 2557291a2b48SSukumar Swaminathan MBX_SUCCESS) { 2558291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 2559291a2b48SSukumar Swaminathan "Unable to read dump table entry. "\ 2560291a2b48SSukumar Swaminathan "offset=%x status=%x", 2561291a2b48SSukumar Swaminathan DumpTableAddr, mb->mbxStatus); 2562291a2b48SSukumar Swaminathan 2563291a2b48SSukumar Swaminathan kmem_free(buf1, size); 2564291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2565291a2b48SSukumar Swaminathan 2566291a2b48SSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize); 2567291a2b48SSukumar Swaminathan *pDumpTableSize = 0; 2568291a2b48SSukumar Swaminathan *ppDumpTable = NULL; 2569291a2b48SSukumar Swaminathan 2570291a2b48SSukumar Swaminathan return (1); 2571291a2b48SSukumar Swaminathan } 2572291a2b48SSukumar Swaminathan 2573*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n Addr=%08x: ", 2574*8f23e9faSHans Rosenfeld mb->un.varDmp.base_adr); 2575*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size); 2576291a2b48SSukumar Swaminathan 2577291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0] = mb->un.varWords[4]; 2578291a2b48SSukumar Swaminathan *pDumpTableEntry++ = mb->un.varWords[4]; 2579291a2b48SSukumar Swaminathan 2580291a2b48SSukumar Swaminathan switch (entry.un.PortBlock.un.s.sid) { 2581291a2b48SSukumar Swaminathan /* New Dump Table */ 2582291a2b48SSukumar Swaminathan case SID_ID01: 2583*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x", 2584291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0]); 2585*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size); 2586291a2b48SSukumar Swaminathan DumpTableAddr += 4; 2587291a2b48SSukumar Swaminathan break; 2588291a2b48SSukumar Swaminathan 2589291a2b48SSukumar Swaminathan #ifdef CC_DUMP_USE_ALL_TABLES 2590291a2b48SSukumar Swaminathan /* New Dump Table */ 2591291a2b48SSukumar Swaminathan case SID_ID02: 2592291a2b48SSukumar Swaminathan case SID_ID03: 2593*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x", 2594291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0]); 2595*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size); 2596291a2b48SSukumar Swaminathan DumpTableAddr += 4; 2597291a2b48SSukumar Swaminathan break; 2598291a2b48SSukumar Swaminathan #else 2599291a2b48SSukumar Swaminathan /* New Dump Table */ 2600291a2b48SSukumar Swaminathan case SID_ID02: 2601291a2b48SSukumar Swaminathan case SID_ID03: 2602*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x", 2603291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0]); 2604*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size); 2605291a2b48SSukumar Swaminathan fDone = TRUE; 2606291a2b48SSukumar Swaminathan break; 2607291a2b48SSukumar Swaminathan #endif /* CC_DUMP_USE_ALL_TABLES */ 2608291a2b48SSukumar Swaminathan 2609291a2b48SSukumar Swaminathan /* Dump Table(s) Termination - all done */ 2610291a2b48SSukumar Swaminathan case SID_TERM: 2611*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x", 2612291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0]); 2613*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size); 2614291a2b48SSukumar Swaminathan fDone = TRUE; 2615291a2b48SSukumar Swaminathan break; 2616291a2b48SSukumar Swaminathan 2617291a2b48SSukumar Swaminathan /* Dump Table Entry */ 2618291a2b48SSukumar Swaminathan default: 2619291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[1] = mb->un.varWords[5]; 2620291a2b48SSukumar Swaminathan *pDumpTableEntry++ = mb->un.varWords[5]; 2621291a2b48SSukumar Swaminathan 2622*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x, w1=%08x", 2623291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0], 2624291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[1]); 2625*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, size); 2626291a2b48SSukumar Swaminathan DumpTableAddr += 8; 2627291a2b48SSukumar Swaminathan break; 2628291a2b48SSukumar Swaminathan } 2629291a2b48SSukumar Swaminathan 2630291a2b48SSukumar Swaminathan } /* end while */ 2631291a2b48SSukumar Swaminathan 2632291a2b48SSukumar Swaminathan status = 2633291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_MEM_DUMP, 2634291a2b48SSukumar Swaminathan LEGEND_HBA_MEM_DUMP_TABLE, 0); 2635291a2b48SSukumar Swaminathan 2636291a2b48SSukumar Swaminathan kmem_free(buf1, size); 2637291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2638291a2b48SSukumar Swaminathan 2639291a2b48SSukumar Swaminathan if (status != 0) { 2640291a2b48SSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize); 2641291a2b48SSukumar Swaminathan *pDumpTableSize = 0; 2642291a2b48SSukumar Swaminathan *ppDumpTable = NULL; 2643291a2b48SSukumar Swaminathan 2644291a2b48SSukumar Swaminathan return (status); 2645291a2b48SSukumar Swaminathan } 2646291a2b48SSukumar Swaminathan 2647291a2b48SSukumar Swaminathan return (0); 2648291a2b48SSukumar Swaminathan 264982527734SSukumar Swaminathan } /* emlxs_dump_table_read() */ 2650291a2b48SSukumar Swaminathan 2651291a2b48SSukumar Swaminathan 2652291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2653291a2b48SSukumar Swaminathan /* emlxs_dump_hba_memory */ 2654291a2b48SSukumar Swaminathan /* Guided by the Dump Table previously read in, */ 2655291a2b48SSukumar Swaminathan /* generate the Port Memory Dump. */ 2656291a2b48SSukumar Swaminathan /* See comments for CC_DUMP_USE_ALL_TABLES for additional description. */ 2657291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2658291a2b48SSukumar Swaminathan static uint32_t 2659291a2b48SSukumar Swaminathan emlxs_dump_hba_memory( 2660291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2661291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 2662291a2b48SSukumar Swaminathan uint32_t *pDumpTable) 2663291a2b48SSukumar Swaminathan { 2664291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 2665291a2b48SSukumar Swaminathan uint32_t status = 0; 2666291a2b48SSukumar Swaminathan int fDone = FALSE; 2667291a2b48SSukumar Swaminathan DUMP_TABLE_ENTRY entry; 2668291a2b48SSukumar Swaminathan MAILBOXQ *mbq; 2669291a2b48SSukumar Swaminathan MAILBOX *mb; 2670291a2b48SSukumar Swaminathan uint32_t byteCount; 2671291a2b48SSukumar Swaminathan uint32_t byteCountRem; 2672291a2b48SSukumar Swaminathan uint8_t *pBuf; 2673291a2b48SSukumar Swaminathan uint8_t *p1; 2674291a2b48SSukumar Swaminathan uint32_t portAddr; 2675291a2b48SSukumar Swaminathan int fSwap = FALSE; 2676*8f23e9faSHans Rosenfeld uint32_t offset = 0; 2677291a2b48SSukumar Swaminathan uint32_t wcount; 2678291a2b48SSukumar Swaminathan uint32_t total = 0; 2679291a2b48SSukumar Swaminathan 2680291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 2681291a2b48SSukumar Swaminathan fSwap = TRUE; 2682291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 2683291a2b48SSukumar Swaminathan 2684291a2b48SSukumar Swaminathan if (!fpDmpFile) { 2685291a2b48SSukumar Swaminathan return (1); 2686291a2b48SSukumar Swaminathan } 2687291a2b48SSukumar Swaminathan 268882527734SSukumar Swaminathan mbq = 268982527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP); 2690291a2b48SSukumar Swaminathan 2691291a2b48SSukumar Swaminathan mb = (MAILBOX *) mbq; 2692291a2b48SSukumar Swaminathan 2693291a2b48SSukumar Swaminathan /* loop reading Dump Table Entries.. break out when */ 2694291a2b48SSukumar Swaminathan /* we see a Terminator SID */ 2695291a2b48SSukumar Swaminathan while (!fDone) { 2696291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[0] = *pDumpTable++; 2697291a2b48SSukumar Swaminathan 2698291a2b48SSukumar Swaminathan switch (entry.un.PortBlock.un.s.sid) { 2699291a2b48SSukumar Swaminathan 2700291a2b48SSukumar Swaminathan /* New Dump Table */ 2701291a2b48SSukumar Swaminathan case SID_ID01: 2702291a2b48SSukumar Swaminathan break; 2703291a2b48SSukumar Swaminathan 2704291a2b48SSukumar Swaminathan #ifdef CC_DUMP_USE_ALL_TABLES 2705291a2b48SSukumar Swaminathan /* New Dump Table */ 2706291a2b48SSukumar Swaminathan case SID_ID02: 2707291a2b48SSukumar Swaminathan case SID_ID03: 2708291a2b48SSukumar Swaminathan break; 2709291a2b48SSukumar Swaminathan #else 2710291a2b48SSukumar Swaminathan /* New Dump Table */ 2711291a2b48SSukumar Swaminathan case SID_ID02: 2712291a2b48SSukumar Swaminathan case SID_ID03: 2713291a2b48SSukumar Swaminathan fDone = TRUE; 2714291a2b48SSukumar Swaminathan break; 2715291a2b48SSukumar Swaminathan #endif /* CC_DUMP_USE_ALL_TABLES */ 2716291a2b48SSukumar Swaminathan 2717291a2b48SSukumar Swaminathan /* Dump Table(s) Termination - all done */ 2718291a2b48SSukumar Swaminathan case SID_TERM: 2719291a2b48SSukumar Swaminathan fDone = TRUE; 2720291a2b48SSukumar Swaminathan break; 2721291a2b48SSukumar Swaminathan 2722291a2b48SSukumar Swaminathan default: 2723291a2b48SSukumar Swaminathan /* Dump Table Entry */ 2724291a2b48SSukumar Swaminathan entry.un.PortBlock.un.w[1] = *pDumpTable++; 2725291a2b48SSukumar Swaminathan 2726291a2b48SSukumar Swaminathan #ifdef CC_DUMP_FW_BUG_1 2727291a2b48SSukumar Swaminathan if (entry.un.PortBlock.un.w[1] == 0x3E0000) { 2728291a2b48SSukumar Swaminathan break; 2729291a2b48SSukumar Swaminathan } 2730291a2b48SSukumar Swaminathan #endif /* CC_DUMP_FW_BUG_1 */ 2731291a2b48SSukumar Swaminathan 2732291a2b48SSukumar Swaminathan /* Check if indirect address, and */ 2733291a2b48SSukumar Swaminathan /* obtain the new address if so */ 2734291a2b48SSukumar Swaminathan if ((entry.un.PortBlock.un.s.addr & 0x80000000) != 0) { 2735291a2b48SSukumar Swaminathan offset = 2736291a2b48SSukumar Swaminathan (entry.un.PortBlock.un.s. 2737291a2b48SSukumar Swaminathan addr & 0x01FFFFFF); 273882527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, offset, 1); 273982527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 2740291a2b48SSukumar Swaminathan 0) != MBX_SUCCESS) { 2741291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, 2742291a2b48SSukumar Swaminathan &emlxs_init_debug_msg, 2743291a2b48SSukumar Swaminathan "Unable to read dump table entry. "\ 2744291a2b48SSukumar Swaminathan "offset=%x status=%x", 2745291a2b48SSukumar Swaminathan offset, mb->mbxStatus); 2746291a2b48SSukumar Swaminathan 2747291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2748291a2b48SSukumar Swaminathan return (1); 2749291a2b48SSukumar Swaminathan } 2750291a2b48SSukumar Swaminathan 2751291a2b48SSukumar Swaminathan /* replace the indirect address in the */ 2752291a2b48SSukumar Swaminathan /* Dump Table */ 2753291a2b48SSukumar Swaminathan entry.un.PortBlock.un.s.addr = 2754291a2b48SSukumar Swaminathan mb->un.varWords[4]; 2755291a2b48SSukumar Swaminathan } 2756291a2b48SSukumar Swaminathan 2757291a2b48SSukumar Swaminathan /* determine byte count to dump */ 2758291a2b48SSukumar Swaminathan byteCount = entry.un.PortBlock.un.s.bc; 2759291a2b48SSukumar Swaminathan if (entry.un.PortBlock.un.s.sid & SID_MULT_ELEM) { 2760291a2b48SSukumar Swaminathan if (entry.un.PortStruct.un.s.count == 0) { 2761291a2b48SSukumar Swaminathan byteCount = 2762291a2b48SSukumar Swaminathan 256 * 2763291a2b48SSukumar Swaminathan entry.un.PortStruct.un.s.length; 2764291a2b48SSukumar Swaminathan } else { 2765291a2b48SSukumar Swaminathan byteCount = 2766291a2b48SSukumar Swaminathan entry.un.PortStruct.un.s.count * 2767291a2b48SSukumar Swaminathan entry.un.PortStruct.un.s.length; 2768291a2b48SSukumar Swaminathan } 2769291a2b48SSukumar Swaminathan } 2770291a2b48SSukumar Swaminathan 2771291a2b48SSukumar Swaminathan total += byteCount; 2772291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 2773291a2b48SSukumar Swaminathan "Dump: addr=%x count=%d total=%d", offset, 2774291a2b48SSukumar Swaminathan byteCount, total); 2775291a2b48SSukumar Swaminathan 2776291a2b48SSukumar Swaminathan /* allocate a buffer to receive the dump data */ 2777291a2b48SSukumar Swaminathan pBuf = (uint8_t *)kmem_zalloc(byteCount, KM_SLEEP); 2778291a2b48SSukumar Swaminathan 2779291a2b48SSukumar Swaminathan /* loop issuing MBX commands, 18x measly words at */ 2780291a2b48SSukumar Swaminathan /* a time */ 2781291a2b48SSukumar Swaminathan 2782291a2b48SSukumar Swaminathan /* init vars */ 2783291a2b48SSukumar Swaminathan byteCountRem = byteCount; 2784291a2b48SSukumar Swaminathan p1 = pBuf; 2785291a2b48SSukumar Swaminathan portAddr = entry.un.PortBlock.un.s.addr; 2786291a2b48SSukumar Swaminathan 2787291a2b48SSukumar Swaminathan for (;;) { 2788291a2b48SSukumar Swaminathan if (byteCountRem == 0) { 2789291a2b48SSukumar Swaminathan break; 2790291a2b48SSukumar Swaminathan } 2791291a2b48SSukumar Swaminathan 2792291a2b48SSukumar Swaminathan wcount = 2793291a2b48SSukumar Swaminathan (byteCountRem / 4 >= 2794291a2b48SSukumar Swaminathan 0x18) ? 0x18 : (byteCountRem / 4); 279582527734SSukumar Swaminathan emlxs_mb_dump(hba, mbq, portAddr, wcount); 279682527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 2797291a2b48SSukumar Swaminathan 0) != MBX_SUCCESS) { 2798291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, 2799291a2b48SSukumar Swaminathan &emlxs_init_debug_msg, 2800291a2b48SSukumar Swaminathan "Unable to read dump table entry."\ 2801291a2b48SSukumar Swaminathan " offset=%x wc=%d status=%x", 2802291a2b48SSukumar Swaminathan portAddr, wcount, mb->mbxStatus); 2803291a2b48SSukumar Swaminathan break; 2804291a2b48SSukumar Swaminathan } 2805291a2b48SSukumar Swaminathan 2806291a2b48SSukumar Swaminathan bcopy((uint8_t *)&mb->un.varWords[4], p1, 2807291a2b48SSukumar Swaminathan (mb->un.varDmp.word_cnt * 4)); 2808291a2b48SSukumar Swaminathan 2809291a2b48SSukumar Swaminathan byteCountRem -= (mb->un.varDmp.word_cnt * 4); 2810291a2b48SSukumar Swaminathan p1 += (mb->un.varDmp.word_cnt * 4); 2811291a2b48SSukumar Swaminathan portAddr += (mb->un.varDmp.word_cnt * 4); 2812291a2b48SSukumar Swaminathan 2813291a2b48SSukumar Swaminathan } /* end for */ 2814291a2b48SSukumar Swaminathan 2815291a2b48SSukumar Swaminathan if (status == 0) { 2816291a2b48SSukumar Swaminathan if (entry.un.PortBlock.un.s. 2817291a2b48SSukumar Swaminathan sid & SID_MULT_ELEM) { 2818291a2b48SSukumar Swaminathan status = 2819291a2b48SSukumar Swaminathan emlxs_dump_port_struct(fpDmpFile, 2820291a2b48SSukumar Swaminathan pBuf, byteCount, entry, fSwap); 2821291a2b48SSukumar Swaminathan } else { 2822291a2b48SSukumar Swaminathan status = 2823291a2b48SSukumar Swaminathan emlxs_dump_port_block(fpDmpFile, 2824291a2b48SSukumar Swaminathan pBuf, byteCount, entry, fSwap); 2825291a2b48SSukumar Swaminathan } 2826291a2b48SSukumar Swaminathan } 2827291a2b48SSukumar Swaminathan 2828291a2b48SSukumar Swaminathan if (pBuf) { 2829291a2b48SSukumar Swaminathan kmem_free(pBuf, byteCount); 2830291a2b48SSukumar Swaminathan } 2831291a2b48SSukumar Swaminathan 2832291a2b48SSukumar Swaminathan break; 2833291a2b48SSukumar Swaminathan 2834291a2b48SSukumar Swaminathan } /* end switch */ 2835291a2b48SSukumar Swaminathan 2836291a2b48SSukumar Swaminathan } /* end while */ 2837291a2b48SSukumar Swaminathan 2838291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 2839291a2b48SSukumar Swaminathan 2840291a2b48SSukumar Swaminathan return (status); 2841291a2b48SSukumar Swaminathan 284282527734SSukumar Swaminathan } /* emlxs_dump_hba_memory() */ 2843291a2b48SSukumar Swaminathan 2844291a2b48SSukumar Swaminathan 2845291a2b48SSukumar Swaminathan static uint32_t 2846291a2b48SSukumar Swaminathan emlxs_dump_hba( 2847291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2848291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 2849291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 2850291a2b48SSukumar Swaminathan { 2851291a2b48SSukumar Swaminathan uint32_t status = 0; 2852291a2b48SSukumar Swaminathan uint32_t *pDumpTable = 0; 2853291a2b48SSukumar Swaminathan uint32_t DumpTableSize = 0; 2854291a2b48SSukumar Swaminathan 285582527734SSukumar Swaminathan if (hba->sli_mode >= EMLXS_HBA_SLI4_MODE) { 285682527734SSukumar Swaminathan return (1); 285782527734SSukumar Swaminathan } 285882527734SSukumar Swaminathan 285982527734SSukumar Swaminathan /* HBA should be in WARM state here */ 2860291a2b48SSukumar Swaminathan status = 2861291a2b48SSukumar Swaminathan emlxs_dump_table_read(hba, fpTxtFile, &pDumpTable, 2862291a2b48SSukumar Swaminathan &DumpTableSize); 2863291a2b48SSukumar Swaminathan if (status) { 2864291a2b48SSukumar Swaminathan return (status); 2865291a2b48SSukumar Swaminathan } 2866291a2b48SSukumar Swaminathan 2867291a2b48SSukumar Swaminathan status = emlxs_dump_hba_memory(hba, fpDmpFile, pDumpTable); 2868291a2b48SSukumar Swaminathan 2869291a2b48SSukumar Swaminathan if (pDumpTable != 0) { 2870291a2b48SSukumar Swaminathan kmem_free(pDumpTable, DumpTableSize); 2871291a2b48SSukumar Swaminathan } 2872291a2b48SSukumar Swaminathan 2873291a2b48SSukumar Swaminathan return (status); 2874291a2b48SSukumar Swaminathan 287582527734SSukumar Swaminathan } /* emlxs_dump_hba() */ 2876291a2b48SSukumar Swaminathan 2877291a2b48SSukumar Swaminathan 2878291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2879291a2b48SSukumar Swaminathan /* emlxs_dump_drv_region */ 2880291a2b48SSukumar Swaminathan /* Common subroutine for all the Dump_Sli"Structures" Routines */ 2881291a2b48SSukumar Swaminathan /* NOTE: This routine does not free pBuf. This is by design. */ 2882291a2b48SSukumar Swaminathan /* The caller does it. */ 2883291a2b48SSukumar Swaminathan /* ************************************************************************* */ 2884291a2b48SSukumar Swaminathan static uint32_t 2885291a2b48SSukumar Swaminathan emlxs_dump_drv_region( 2886291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2887291a2b48SSukumar Swaminathan uint32_t regionId, 2888291a2b48SSukumar Swaminathan uint8_t **pBuf, 2889291a2b48SSukumar Swaminathan uint32_t *pBufLen) 2890291a2b48SSukumar Swaminathan { /* ptr to length of buffer */ 2891291a2b48SSukumar Swaminathan uint32_t status; 2892291a2b48SSukumar Swaminathan uint32_t size; 2893291a2b48SSukumar Swaminathan 2894291a2b48SSukumar Swaminathan *pBuf = NULL; 2895291a2b48SSukumar Swaminathan *pBufLen = 0; 2896291a2b48SSukumar Swaminathan 2897291a2b48SSukumar Swaminathan size = 0; 2898291a2b48SSukumar Swaminathan status = emlxs_get_dump_region(hba, regionId, NULL, &size); 2899291a2b48SSukumar Swaminathan 2900291a2b48SSukumar Swaminathan if (status != 0) { 2901291a2b48SSukumar Swaminathan return (1); 2902291a2b48SSukumar Swaminathan } 2903291a2b48SSukumar Swaminathan 2904291a2b48SSukumar Swaminathan /* Now that we know the required length, request the actual data */ 2905291a2b48SSukumar Swaminathan *pBuf = (uint8_t *)kmem_zalloc(size, KM_SLEEP); 2906291a2b48SSukumar Swaminathan 2907291a2b48SSukumar Swaminathan status = emlxs_get_dump_region(hba, regionId, *pBuf, &size); 2908291a2b48SSukumar Swaminathan 2909291a2b48SSukumar Swaminathan if (status != 0) { 2910a9800bebSGarrett D'Amore kmem_free(*pBuf, size); 2911291a2b48SSukumar Swaminathan *pBuf = NULL; 2912291a2b48SSukumar Swaminathan 2913291a2b48SSukumar Swaminathan return (1); 2914291a2b48SSukumar Swaminathan } 2915291a2b48SSukumar Swaminathan 2916291a2b48SSukumar Swaminathan *pBufLen = size; 2917291a2b48SSukumar Swaminathan 2918291a2b48SSukumar Swaminathan return (status); 2919291a2b48SSukumar Swaminathan 292082527734SSukumar Swaminathan } /* emlxs_dump_drv_region() */ 2921291a2b48SSukumar Swaminathan 2922291a2b48SSukumar Swaminathan 2923291a2b48SSukumar Swaminathan static uint32_t 2924291a2b48SSukumar Swaminathan emlxs_dump_sli_regs( 2925291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2926291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 2927291a2b48SSukumar Swaminathan { 2928291a2b48SSukumar Swaminathan uint32_t status; 2929291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */ 2930291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */ 2931291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */ 2932291a2b48SSukumar Swaminathan 2933291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 2934291a2b48SSukumar Swaminathan fSwap = TRUE; 2935291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 2936291a2b48SSukumar Swaminathan 2937291a2b48SSukumar Swaminathan if (!fpDmpFile) { 2938291a2b48SSukumar Swaminathan return (1); 2939291a2b48SSukumar Swaminathan } 2940291a2b48SSukumar Swaminathan 2941291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_SLI_REGS, &pBuf, &bufLen); 2942291a2b48SSukumar Swaminathan 2943291a2b48SSukumar Swaminathan if (status != 0) { 2944291a2b48SSukumar Swaminathan return (status); 2945291a2b48SSukumar Swaminathan } 2946291a2b48SSukumar Swaminathan 2947291a2b48SSukumar Swaminathan status = 2948291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_SLI_REGS, 2949291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_SLI_REGS, fSwap); 2950291a2b48SSukumar Swaminathan 2951291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen); 2952291a2b48SSukumar Swaminathan 2953291a2b48SSukumar Swaminathan return (status); 2954291a2b48SSukumar Swaminathan 295582527734SSukumar Swaminathan } /* emlxs_dump_sli_regs() */ 2956291a2b48SSukumar Swaminathan 2957291a2b48SSukumar Swaminathan 2958291a2b48SSukumar Swaminathan static uint32_t 2959291a2b48SSukumar Swaminathan emlxs_dump_slim( 2960291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 2961291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 2962291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 2963291a2b48SSukumar Swaminathan uint32_t dump_type) 2964291a2b48SSukumar Swaminathan { 2965291a2b48SSukumar Swaminathan uint32_t status; 2966291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */ 2967291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */ 2968291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */ 2969291a2b48SSukumar Swaminathan 2970291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 2971291a2b48SSukumar Swaminathan fSwap = TRUE; 2972291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 2973291a2b48SSukumar Swaminathan 2974291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_SLIM, &pBuf, &bufLen); 2975291a2b48SSukumar Swaminathan 2976291a2b48SSukumar Swaminathan if (status != 0) { 2977291a2b48SSukumar Swaminathan return (status); 2978291a2b48SSukumar Swaminathan } 2979291a2b48SSukumar Swaminathan 2980291a2b48SSukumar Swaminathan /* The SLIM Dump is only useful if it's a */ 2981291a2b48SSukumar Swaminathan /* Driver-Initiated dump, say, after a HW Error */ 2982291a2b48SSukumar Swaminathan if (dump_type == DUMP_TYPE_DRIVER) { 2983291a2b48SSukumar Swaminathan status = 2984291a2b48SSukumar Swaminathan emlxs_dump_word_txtfile(fpTxtFile, (uint32_t *)pBuf, 2985291a2b48SSukumar Swaminathan 0x40, LEGEND_SLI_STRUCTURES, LEGEND_SLIM); 2986291a2b48SSukumar Swaminathan } 2987291a2b48SSukumar Swaminathan 2988291a2b48SSukumar Swaminathan status = 2989291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_SLIM, 2990291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_SLIM, fSwap); 2991291a2b48SSukumar Swaminathan 2992291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen); 2993291a2b48SSukumar Swaminathan 2994291a2b48SSukumar Swaminathan return (status); 2995291a2b48SSukumar Swaminathan 299682527734SSukumar Swaminathan } /* emlxs_dump_slim() */ 2997291a2b48SSukumar Swaminathan 2998291a2b48SSukumar Swaminathan 2999291a2b48SSukumar Swaminathan static uint32_t 3000291a2b48SSukumar Swaminathan emlxs_dump_pcb( 3001291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3002291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 3003291a2b48SSukumar Swaminathan { 3004291a2b48SSukumar Swaminathan uint32_t status; 3005291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */ 3006291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */ 3007291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */ 3008291a2b48SSukumar Swaminathan 3009291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 3010291a2b48SSukumar Swaminathan fSwap = TRUE; 3011291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 3012291a2b48SSukumar Swaminathan 3013291a2b48SSukumar Swaminathan if (!fpDmpFile) { 3014291a2b48SSukumar Swaminathan return (1); 3015291a2b48SSukumar Swaminathan } 3016291a2b48SSukumar Swaminathan 3017291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_PCB, &pBuf, &bufLen); 3018291a2b48SSukumar Swaminathan if (status != 0) { 3019291a2b48SSukumar Swaminathan return (status); 3020291a2b48SSukumar Swaminathan } 3021291a2b48SSukumar Swaminathan 3022291a2b48SSukumar Swaminathan status = 3023291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_PCB, 3024291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_PCB, fSwap); 3025291a2b48SSukumar Swaminathan 3026291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen); 3027291a2b48SSukumar Swaminathan 3028291a2b48SSukumar Swaminathan return (status); 3029291a2b48SSukumar Swaminathan 303082527734SSukumar Swaminathan } /* emlxs_dump_pcb() */ 3031291a2b48SSukumar Swaminathan 3032291a2b48SSukumar Swaminathan 3033291a2b48SSukumar Swaminathan static uint32_t 3034291a2b48SSukumar Swaminathan emlxs_dump_mbox( 3035291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3036291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 3037291a2b48SSukumar Swaminathan { 3038291a2b48SSukumar Swaminathan uint32_t status; 3039291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */ 3040291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */ 3041291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */ 3042291a2b48SSukumar Swaminathan 3043291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 3044291a2b48SSukumar Swaminathan fSwap = TRUE; 3045291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 3046291a2b48SSukumar Swaminathan 3047291a2b48SSukumar Swaminathan if (!fpDmpFile) { 3048291a2b48SSukumar Swaminathan return (1); 3049291a2b48SSukumar Swaminathan } 3050291a2b48SSukumar Swaminathan 3051291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_MBX, &pBuf, &bufLen); 3052291a2b48SSukumar Swaminathan if (status != 0) { 3053291a2b48SSukumar Swaminathan return (status); 3054291a2b48SSukumar Swaminathan } 3055291a2b48SSukumar Swaminathan 3056291a2b48SSukumar Swaminathan status = 3057291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_MBX, 3058291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_MBX, fSwap); 3059291a2b48SSukumar Swaminathan 3060291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen); 3061291a2b48SSukumar Swaminathan 3062291a2b48SSukumar Swaminathan return (status); 3063291a2b48SSukumar Swaminathan 306482527734SSukumar Swaminathan } /* emlxs_dump_mbox() */ 3065291a2b48SSukumar Swaminathan 3066291a2b48SSukumar Swaminathan 3067291a2b48SSukumar Swaminathan static uint32_t 3068291a2b48SSukumar Swaminathan emlxs_dump_host_pointers( 3069291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3070291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 3071291a2b48SSukumar Swaminathan { 3072291a2b48SSukumar Swaminathan uint32_t status; 3073291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */ 3074291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */ 3075291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */ 3076291a2b48SSukumar Swaminathan 3077291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 3078291a2b48SSukumar Swaminathan fSwap = TRUE; 3079291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 3080291a2b48SSukumar Swaminathan 3081291a2b48SSukumar Swaminathan if (!fpDmpFile) { 3082291a2b48SSukumar Swaminathan return (1); 3083291a2b48SSukumar Swaminathan } 3084291a2b48SSukumar Swaminathan 3085291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_HOST_PTRS, &pBuf, &bufLen); 3086291a2b48SSukumar Swaminathan if (status != 0) { 3087291a2b48SSukumar Swaminathan return (status); 3088291a2b48SSukumar Swaminathan } 3089291a2b48SSukumar Swaminathan 3090291a2b48SSukumar Swaminathan status = 3091291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_HOST_PTRS, 3092291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_HOST_PTRS, fSwap); 3093291a2b48SSukumar Swaminathan 3094291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen); 3095291a2b48SSukumar Swaminathan 3096291a2b48SSukumar Swaminathan return (status); 3097291a2b48SSukumar Swaminathan 309882527734SSukumar Swaminathan } /* emlxs_dump_host_pointers() */ 3099291a2b48SSukumar Swaminathan 3100291a2b48SSukumar Swaminathan 3101291a2b48SSukumar Swaminathan static uint32_t 3102291a2b48SSukumar Swaminathan emlxs_dump_port_pointers( 3103291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3104291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 3105291a2b48SSukumar Swaminathan { 3106291a2b48SSukumar Swaminathan uint32_t status; 3107291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */ 3108291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */ 3109291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */ 3110291a2b48SSukumar Swaminathan 3111291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 3112291a2b48SSukumar Swaminathan fSwap = TRUE; 3113291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 3114291a2b48SSukumar Swaminathan 3115291a2b48SSukumar Swaminathan if (!fpDmpFile) { 3116291a2b48SSukumar Swaminathan return (1); 3117291a2b48SSukumar Swaminathan } 3118291a2b48SSukumar Swaminathan 3119291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_PORT_PTRS, &pBuf, &bufLen); 3120291a2b48SSukumar Swaminathan if (status != 0) { 3121291a2b48SSukumar Swaminathan return (status); 3122291a2b48SSukumar Swaminathan } 3123291a2b48SSukumar Swaminathan 3124291a2b48SSukumar Swaminathan status = 3125291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_PORT_PTRS, 3126291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_PORT_PTRS, fSwap); 3127291a2b48SSukumar Swaminathan 3128291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen); 3129291a2b48SSukumar Swaminathan 3130291a2b48SSukumar Swaminathan return (status); 3131291a2b48SSukumar Swaminathan 313282527734SSukumar Swaminathan } /* emlxs_dump_port_pointers() */ 3133291a2b48SSukumar Swaminathan 3134291a2b48SSukumar Swaminathan 3135291a2b48SSukumar Swaminathan static uint32_t 3136291a2b48SSukumar Swaminathan emlxs_dump_rings( 3137291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3138291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 3139291a2b48SSukumar Swaminathan { 3140291a2b48SSukumar Swaminathan uint32_t status; 3141291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */ 3142291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */ 3143291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */ 3144291a2b48SSukumar Swaminathan 3145291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 3146291a2b48SSukumar Swaminathan fSwap = TRUE; 3147291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 3148291a2b48SSukumar Swaminathan 3149291a2b48SSukumar Swaminathan if (!fpDmpFile) { 3150291a2b48SSukumar Swaminathan return (1); 3151291a2b48SSukumar Swaminathan } 3152291a2b48SSukumar Swaminathan 3153291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_RINGS, &pBuf, &bufLen); 3154291a2b48SSukumar Swaminathan if (status != 0) { 3155291a2b48SSukumar Swaminathan return (status); 3156291a2b48SSukumar Swaminathan } 3157291a2b48SSukumar Swaminathan 3158291a2b48SSukumar Swaminathan status = 3159291a2b48SSukumar Swaminathan emlxs_dump_host_struct(fpDmpFile, pBuf, bufLen, sizeof (IOCB), 3160291a2b48SSukumar Swaminathan bufLen / sizeof (IOCB), SID_RINGS, LEGEND_SLI_STRUCTURES, 3161291a2b48SSukumar Swaminathan LEGEND_RINGS, fSwap); 3162291a2b48SSukumar Swaminathan 3163291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen); 3164291a2b48SSukumar Swaminathan 3165291a2b48SSukumar Swaminathan return (status); 3166291a2b48SSukumar Swaminathan 316782527734SSukumar Swaminathan } /* emlxs_dump_rings() */ 3168291a2b48SSukumar Swaminathan 3169291a2b48SSukumar Swaminathan 3170291a2b48SSukumar Swaminathan static uint32_t 3171291a2b48SSukumar Swaminathan emlxs_dump_drv_internals( 3172291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3173291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 3174291a2b48SSukumar Swaminathan { 3175291a2b48SSukumar Swaminathan uint32_t status; 3176291a2b48SSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */ 3177291a2b48SSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */ 3178291a2b48SSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */ 3179291a2b48SSukumar Swaminathan 3180291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 3181291a2b48SSukumar Swaminathan fSwap = TRUE; 3182291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 3183291a2b48SSukumar Swaminathan 3184291a2b48SSukumar Swaminathan if (!fpDmpFile) { 3185291a2b48SSukumar Swaminathan return (1); 3186291a2b48SSukumar Swaminathan } 3187291a2b48SSukumar Swaminathan 3188291a2b48SSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_INTERNAL, &pBuf, &bufLen); 3189291a2b48SSukumar Swaminathan if (status != 0) { 3190291a2b48SSukumar Swaminathan return (status); 3191291a2b48SSukumar Swaminathan } 3192291a2b48SSukumar Swaminathan 3193291a2b48SSukumar Swaminathan status = 3194291a2b48SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_INTERNAL_SOL, 3195291a2b48SSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_DRIVER_SPEC, fSwap); 3196291a2b48SSukumar Swaminathan 3197291a2b48SSukumar Swaminathan kmem_free(pBuf, bufLen); 3198291a2b48SSukumar Swaminathan 3199291a2b48SSukumar Swaminathan return (status); 3200291a2b48SSukumar Swaminathan 320182527734SSukumar Swaminathan } /* emlxs_dump_drv_internals() */ 3202291a2b48SSukumar Swaminathan 3203291a2b48SSukumar Swaminathan 3204291a2b48SSukumar Swaminathan static uint32_t 3205291a2b48SSukumar Swaminathan emlxs_dump_sli_interface( 3206291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3207291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 3208291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile, 3209291a2b48SSukumar Swaminathan uint32_t dump_type) 3210291a2b48SSukumar Swaminathan { 321182527734SSukumar Swaminathan 321282527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) { 321382527734SSukumar Swaminathan /* HBA should be in OFFLINE state here */ 321482527734SSukumar Swaminathan 321582527734SSukumar Swaminathan (void) emlxs_dump_sli_regs(hba, fpDmpFile); 321682527734SSukumar Swaminathan (void) emlxs_dump_slim(hba, fpTxtFile, fpDmpFile, dump_type); 321782527734SSukumar Swaminathan (void) emlxs_dump_pcb(hba, fpDmpFile); 321882527734SSukumar Swaminathan (void) emlxs_dump_mbox(hba, fpDmpFile); 321982527734SSukumar Swaminathan (void) emlxs_dump_host_pointers(hba, fpDmpFile); 322082527734SSukumar Swaminathan (void) emlxs_dump_port_pointers(hba, fpDmpFile); 322182527734SSukumar Swaminathan (void) emlxs_dump_rings(hba, fpDmpFile); 322282527734SSukumar Swaminathan } 322382527734SSukumar Swaminathan 3224291a2b48SSukumar Swaminathan (void) emlxs_dump_drv_internals(hba, fpDmpFile); 3225291a2b48SSukumar Swaminathan 3226291a2b48SSukumar Swaminathan return (0); 3227291a2b48SSukumar Swaminathan 322882527734SSukumar Swaminathan } /* emlxs_dump_sli_interface() */ 3229291a2b48SSukumar Swaminathan 3230291a2b48SSukumar Swaminathan 3231291a2b48SSukumar Swaminathan static uint32_t 323282527734SSukumar Swaminathan emlxs_dump_menlo_log( 3233291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3234291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile) 3235291a2b48SSukumar Swaminathan { 3236291a2b48SSukumar Swaminathan uint32_t RmStatus; 3237291a2b48SSukumar Swaminathan int i, j; 3238291a2b48SSukumar Swaminathan int isWrapped = FALSE; 3239291a2b48SSukumar Swaminathan char buf1[2048] = { 0 }; 3240291a2b48SSukumar Swaminathan char buf2[2048] = { 0 }; 3241291a2b48SSukumar Swaminathan 3242291a2b48SSukumar Swaminathan /* Get Config Command vars */ 3243291a2b48SSukumar Swaminathan menlo_get_config_rsp_t GcBuf; 3244291a2b48SSukumar Swaminathan menlo_get_config_rsp_t *pGcBuf = &GcBuf; 3245291a2b48SSukumar Swaminathan 3246291a2b48SSukumar Swaminathan /* Get Log Config Command vars */ 3247291a2b48SSukumar Swaminathan uint32_t LcBufSize; 3248291a2b48SSukumar Swaminathan menlo_rsp_t *pLcBuf = NULL; 3249291a2b48SSukumar Swaminathan uint32_t NumLogs; 3250291a2b48SSukumar Swaminathan menlo_log_t *pLcEntry; 3251291a2b48SSukumar Swaminathan 3252291a2b48SSukumar Swaminathan /* Get Log Data Command vars */ 3253291a2b48SSukumar Swaminathan uint32_t LdBufSize; 3254291a2b48SSukumar Swaminathan menlo_rsp_t *pLdBuf = NULL; 3255291a2b48SSukumar Swaminathan uint16_t Head; 3256291a2b48SSukumar Swaminathan uint8_t *pLogEntry; 3257291a2b48SSukumar Swaminathan char *pLogString; 3258291a2b48SSukumar Swaminathan 3259291a2b48SSukumar Swaminathan /* Get Panic Log Command vars */ 3260291a2b48SSukumar Swaminathan uint32_t PlBufSize; 3261291a2b48SSukumar Swaminathan menlo_rsp_t *pPlBuf = NULL; 3262291a2b48SSukumar Swaminathan uint32_t PanicLogEntryCount; 3263291a2b48SSukumar Swaminathan uint32_t PanicLogEntrySize; 3264291a2b48SSukumar Swaminathan 3265*8f23e9faSHans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) { 326682527734SSukumar Swaminathan return (DFC_INVALID_ADAPTER); 326782527734SSukumar Swaminathan } 326882527734SSukumar Swaminathan 3269291a2b48SSukumar Swaminathan /* First, issue a GetConfig command, which gives us */ 3270291a2b48SSukumar Swaminathan /* the Log Config and Panic Log sizes */ 3271291a2b48SSukumar Swaminathan 3272291a2b48SSukumar Swaminathan RmStatus = 3273291a2b48SSukumar Swaminathan emlxs_menlo_get_cfg(hba, pGcBuf, sizeof (menlo_get_config_rsp_t)); 3274291a2b48SSukumar Swaminathan 3275291a2b48SSukumar Swaminathan if (RmStatus != 0) { 3276291a2b48SSukumar Swaminathan goto done; 3277291a2b48SSukumar Swaminathan } 3278291a2b48SSukumar Swaminathan 3279291a2b48SSukumar Swaminathan LcBufSize = GcBuf.log_cfg_size + 8; 3280291a2b48SSukumar Swaminathan PlBufSize = GcBuf.panic_log_size; 3281291a2b48SSukumar Swaminathan 3282291a2b48SSukumar Swaminathan pLcBuf = (menlo_rsp_t *)kmem_zalloc(LcBufSize, KM_SLEEP); 3283291a2b48SSukumar Swaminathan 3284291a2b48SSukumar Swaminathan RmStatus = emlxs_menlo_get_logcfg(hba, pLcBuf, LcBufSize); 3285291a2b48SSukumar Swaminathan 3286291a2b48SSukumar Swaminathan if (RmStatus != 0) { 3287291a2b48SSukumar Swaminathan goto done; 3288291a2b48SSukumar Swaminathan } 3289291a2b48SSukumar Swaminathan 3290291a2b48SSukumar Swaminathan buf1[0] = 0; 3291291a2b48SSukumar Swaminathan RmStatus = 3292291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 3293291a2b48SSukumar Swaminathan LEGEND_MENLO_LOG_CONFIG, LEGEND_NULL, 0); 3294291a2b48SSukumar Swaminathan 3295291a2b48SSukumar Swaminathan NumLogs = pLcBuf->log_cfg.num_logs; 3296291a2b48SSukumar Swaminathan pLcEntry = (menlo_log_t *)&pLcBuf->log_cfg.data; 3297291a2b48SSukumar Swaminathan 3298291a2b48SSukumar Swaminathan buf1[0] = 0; 3299*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "LogId Entries Size Name"); 3300*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3301*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n----- ------- ---- ----"); 3302*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3303291a2b48SSukumar Swaminathan 3304291a2b48SSukumar Swaminathan RmStatus = emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1); 3305291a2b48SSukumar Swaminathan 3306291a2b48SSukumar Swaminathan for (i = 0; i < (int)NumLogs; i++) { 3307291a2b48SSukumar Swaminathan buf1[0] = 0; 3308*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), 3309*8f23e9faSHans Rosenfeld "\n %2d %4d %4d %s", 3310291a2b48SSukumar Swaminathan pLcEntry[i].id, 3311291a2b48SSukumar Swaminathan pLcEntry[i].num_entries, 3312291a2b48SSukumar Swaminathan pLcEntry[i].entry_size, pLcEntry[i].name); 3313*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3314291a2b48SSukumar Swaminathan RmStatus = 3315291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1); 3316291a2b48SSukumar Swaminathan } 3317291a2b48SSukumar Swaminathan 3318291a2b48SSukumar Swaminathan /* Now issue a series of GetLogData commands, */ 3319291a2b48SSukumar Swaminathan /* which gives us the actual Logs */ 3320291a2b48SSukumar Swaminathan 3321291a2b48SSukumar Swaminathan for (i = 0; i < (int)NumLogs; i++) { 3322291a2b48SSukumar Swaminathan LdBufSize = 3323291a2b48SSukumar Swaminathan (pLcEntry[i].num_entries *pLcEntry[i].entry_size) + 8; 3324291a2b48SSukumar Swaminathan 3325291a2b48SSukumar Swaminathan pLdBuf = (menlo_rsp_t *)kmem_zalloc(LdBufSize, KM_SLEEP); 3326291a2b48SSukumar Swaminathan 3327291a2b48SSukumar Swaminathan RmStatus = emlxs_menlo_get_log(hba, i, pLdBuf, LdBufSize); 3328291a2b48SSukumar Swaminathan 3329291a2b48SSukumar Swaminathan if (RmStatus != 0) { 3330291a2b48SSukumar Swaminathan goto done; 3331291a2b48SSukumar Swaminathan } 3332291a2b48SSukumar Swaminathan 3333291a2b48SSukumar Swaminathan /* print a caption for the current log */ 3334291a2b48SSukumar Swaminathan buf1[0] = 0; 3335*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n\nLog %d:", i); 3336*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3337*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), " %s", pLcEntry[i].name); 3338*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3339*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n"); 3340291a2b48SSukumar Swaminathan 3341291a2b48SSukumar Swaminathan for (j = 0; j < 75; j++) { 3342*8f23e9faSHans Rosenfeld (void) strlcat(buf2, "-", sizeof (buf2)); 3343291a2b48SSukumar Swaminathan } 3344291a2b48SSukumar Swaminathan 3345*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3346291a2b48SSukumar Swaminathan RmStatus = 3347291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1); 3348291a2b48SSukumar Swaminathan 3349291a2b48SSukumar Swaminathan /* check the head entry to determine whether */ 3350291a2b48SSukumar Swaminathan /* the log has wrapped or not */ 3351291a2b48SSukumar Swaminathan Head = pLdBuf->log.head; 3352291a2b48SSukumar Swaminathan pLogEntry = (uint8_t *)&pLdBuf->log.data; 3353291a2b48SSukumar Swaminathan pLogString = 3354291a2b48SSukumar Swaminathan (char *)&(pLogEntry[Head *pLcEntry[i].entry_size]); 3355291a2b48SSukumar Swaminathan 3356291a2b48SSukumar Swaminathan isWrapped = FALSE; 3357291a2b48SSukumar Swaminathan if (strlen(pLogString) != 0) { 3358291a2b48SSukumar Swaminathan isWrapped = TRUE; 3359291a2b48SSukumar Swaminathan } 3360291a2b48SSukumar Swaminathan 3361291a2b48SSukumar Swaminathan /* if log is wrapped, get entries from the */ 3362291a2b48SSukumar Swaminathan /* Head through the End */ 3363291a2b48SSukumar Swaminathan if (isWrapped) { 3364291a2b48SSukumar Swaminathan for (j = Head; j < (int)pLcEntry[i].num_entries; j++) { 3365291a2b48SSukumar Swaminathan pLogString = 3366291a2b48SSukumar Swaminathan (char *)&(pLogEntry[j * 3367291a2b48SSukumar Swaminathan pLcEntry[i].entry_size]); 3368291a2b48SSukumar Swaminathan buf1[0] = 0; 3369*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), 3370*8f23e9faSHans Rosenfeld "\n%3d: %s", j, pLogString); 3371*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3372291a2b48SSukumar Swaminathan RmStatus = 3373291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 3374291a2b48SSukumar Swaminathan 0, 0, 1); 3375291a2b48SSukumar Swaminathan } 3376291a2b48SSukumar Swaminathan } 3377291a2b48SSukumar Swaminathan 3378291a2b48SSukumar Swaminathan /* if wrapped or not, get entries from the Top */ 3379291a2b48SSukumar Swaminathan /* through the Head */ 3380291a2b48SSukumar Swaminathan for (j = 0; j < Head; j++) { 3381291a2b48SSukumar Swaminathan pLogString = 3382291a2b48SSukumar Swaminathan (char *)&(pLogEntry[j * pLcEntry[i].entry_size]); 3383291a2b48SSukumar Swaminathan buf1[0] = 0; 3384*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n%3d: %s", j, 3385*8f23e9faSHans Rosenfeld pLogString); 3386*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3387291a2b48SSukumar Swaminathan RmStatus = 3388291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 3389291a2b48SSukumar Swaminathan 1); 3390291a2b48SSukumar Swaminathan } 3391291a2b48SSukumar Swaminathan } /* end for i */ 3392291a2b48SSukumar Swaminathan 3393291a2b48SSukumar Swaminathan /* Now issue a GetPanicLog command, which gives us the Panic Log */ 3394291a2b48SSukumar Swaminathan 3395291a2b48SSukumar Swaminathan /* print a caption for the current log */ 3396*8f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_MENLO_LOG_PANIC_REGS, sizeof (buf1)); 3397291a2b48SSukumar Swaminathan buf2[0] = 0; 3398291a2b48SSukumar Swaminathan for (j = 0; j < 75; j++) { 3399*8f23e9faSHans Rosenfeld (void) strlcat(buf2, "-", sizeof (buf2)); 3400291a2b48SSukumar Swaminathan } 3401*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3402291a2b48SSukumar Swaminathan RmStatus = emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1); 3403291a2b48SSukumar Swaminathan 3404291a2b48SSukumar Swaminathan pPlBuf = (menlo_rsp_t *)kmem_zalloc(PlBufSize, KM_SLEEP); 3405291a2b48SSukumar Swaminathan 3406291a2b48SSukumar Swaminathan RmStatus = emlxs_menlo_get_paniclog(hba, pPlBuf, PlBufSize); 3407291a2b48SSukumar Swaminathan 3408291a2b48SSukumar Swaminathan if (RmStatus == 0) { 3409291a2b48SSukumar Swaminathan buf1[0] = 0; 3410*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nType = %x", 3411291a2b48SSukumar Swaminathan pPlBuf->panic_log.type); 3412*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3413*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nRegsEpc = %08x", 3414291a2b48SSukumar Swaminathan pPlBuf->panic_log.regs_epc); 3415*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3416*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nRegsCp0Cause = %08x", 3417291a2b48SSukumar Swaminathan pPlBuf->panic_log.regs_cp0_cause); 3418*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3419*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nRegsCp0Stat = %08x", 3420291a2b48SSukumar Swaminathan pPlBuf->panic_log.regs_cp0_status); 3421*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3422291a2b48SSukumar Swaminathan RmStatus = 3423291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1); 3424291a2b48SSukumar Swaminathan 3425291a2b48SSukumar Swaminathan buf1[0] = 0; 3426291a2b48SSukumar Swaminathan for (i = 0; i < MENLO_NUM_GP_REGS; i++) { 3427*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), 3428*8f23e9faSHans Rosenfeld "\nRegsGp[%02x] = %08x", i, 3429291a2b48SSukumar Swaminathan pPlBuf->panic_log.regs_gp[i]); 3430*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3431291a2b48SSukumar Swaminathan } 3432291a2b48SSukumar Swaminathan RmStatus = 3433291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1); 3434291a2b48SSukumar Swaminathan 3435291a2b48SSukumar Swaminathan buf1[0] = 0; 3436*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nLogPresent = %08x", 3437291a2b48SSukumar Swaminathan pPlBuf->panic_log.log_present); 3438*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3439291a2b48SSukumar Swaminathan PanicLogEntryCount = pPlBuf->panic_log.num_entries; 3440*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nNumEntries = %08x", 3441291a2b48SSukumar Swaminathan PanicLogEntryCount); 3442*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3443291a2b48SSukumar Swaminathan PanicLogEntrySize = pPlBuf->panic_log.entry_size; 3444*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nEntrySize = %d.", 3445291a2b48SSukumar Swaminathan PanicLogEntrySize); 3446*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3447*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nHead Entry = %d.", 3448291a2b48SSukumar Swaminathan pPlBuf->panic_log.head); 3449*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf1)); 3450291a2b48SSukumar Swaminathan RmStatus = 3451291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1); 3452291a2b48SSukumar Swaminathan 3453291a2b48SSukumar Swaminathan /* print a caption for the current log */ 3454*8f23e9faSHans Rosenfeld (void) strlcpy(buf1, LEGEND_MENLO_LOG_PANIC_LOGS, 3455*8f23e9faSHans Rosenfeld sizeof (buf1)); 3456291a2b48SSukumar Swaminathan buf2[0] = 0; 3457291a2b48SSukumar Swaminathan for (j = 0; j < 75; j++) { 3458*8f23e9faSHans Rosenfeld (void) strlcat(buf2, "-", sizeof (buf2)); 3459291a2b48SSukumar Swaminathan } 3460*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf2)); 3461291a2b48SSukumar Swaminathan RmStatus = 3462291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1); 3463291a2b48SSukumar Swaminathan 3464291a2b48SSukumar Swaminathan /* check the head entry to determine whether the */ 3465291a2b48SSukumar Swaminathan /* log has wrapped or not */ 3466291a2b48SSukumar Swaminathan Head = pPlBuf->panic_log.head; 3467291a2b48SSukumar Swaminathan pLogEntry = (uint8_t *)&pPlBuf->panic_log.data; 3468291a2b48SSukumar Swaminathan pLogString = (char *)&(pLogEntry[Head * PanicLogEntrySize]); 3469291a2b48SSukumar Swaminathan isWrapped = FALSE; 3470291a2b48SSukumar Swaminathan if (strlen(pLogString) != 0) { 3471291a2b48SSukumar Swaminathan isWrapped = TRUE; 3472291a2b48SSukumar Swaminathan } 3473291a2b48SSukumar Swaminathan 3474291a2b48SSukumar Swaminathan /* if log is wrapped, get entries from the */ 3475291a2b48SSukumar Swaminathan /* Head through the End */ 3476291a2b48SSukumar Swaminathan if (isWrapped) { 3477291a2b48SSukumar Swaminathan for (j = Head; j < (int)PanicLogEntryCount; j++) { 3478291a2b48SSukumar Swaminathan pLogString = 3479291a2b48SSukumar Swaminathan (char *)&(pLogEntry[j * 3480291a2b48SSukumar Swaminathan PanicLogEntrySize]); 3481291a2b48SSukumar Swaminathan buf1[0] = 0; 3482*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), 3483*8f23e9faSHans Rosenfeld "\n%3d: %s", j, pLogString); 3484*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf2)); 3485291a2b48SSukumar Swaminathan RmStatus = 3486291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 3487291a2b48SSukumar Swaminathan 0, 0, 1); 3488291a2b48SSukumar Swaminathan } 3489291a2b48SSukumar Swaminathan } 3490291a2b48SSukumar Swaminathan /* if wrapped or not, get entries from the Top */ 3491291a2b48SSukumar Swaminathan /* through the Head */ 3492291a2b48SSukumar Swaminathan for (j = 0; j < Head; j++) { 3493291a2b48SSukumar Swaminathan pLogString = 3494291a2b48SSukumar Swaminathan (char *)&(pLogEntry[j * PanicLogEntrySize]); 3495291a2b48SSukumar Swaminathan buf1[0] = 0; 3496*8f23e9faSHans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n%3d: %s", j, 3497*8f23e9faSHans Rosenfeld pLogString); 3498*8f23e9faSHans Rosenfeld (void) strlcat(buf1, buf2, sizeof (buf2)); 3499291a2b48SSukumar Swaminathan RmStatus = 3500291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 3501291a2b48SSukumar Swaminathan 1); 3502291a2b48SSukumar Swaminathan } 3503291a2b48SSukumar Swaminathan } 3504291a2b48SSukumar Swaminathan 3505291a2b48SSukumar Swaminathan RmStatus = emlxs_dump_string_txtfile(fpCeeFile, "\n\n", 0, 0, 1); 3506291a2b48SSukumar Swaminathan 3507291a2b48SSukumar Swaminathan done: 3508291a2b48SSukumar Swaminathan 3509291a2b48SSukumar Swaminathan if (pLdBuf != 0) { 3510291a2b48SSukumar Swaminathan kmem_free(pLdBuf, LdBufSize); 3511291a2b48SSukumar Swaminathan } 3512291a2b48SSukumar Swaminathan 3513291a2b48SSukumar Swaminathan if (pLcBuf != 0) { 3514291a2b48SSukumar Swaminathan kmem_free(pLcBuf, LcBufSize); 3515291a2b48SSukumar Swaminathan } 3516291a2b48SSukumar Swaminathan 3517291a2b48SSukumar Swaminathan if (pPlBuf != 0) { 3518291a2b48SSukumar Swaminathan kmem_free(pPlBuf, PlBufSize); 3519291a2b48SSukumar Swaminathan } 3520291a2b48SSukumar Swaminathan 3521291a2b48SSukumar Swaminathan return (RmStatus); 3522291a2b48SSukumar Swaminathan 352382527734SSukumar Swaminathan } /* emlxs_dump_menlo_log() */ 3524291a2b48SSukumar Swaminathan 3525291a2b48SSukumar Swaminathan 3526291a2b48SSukumar Swaminathan static uint32_t 352782527734SSukumar Swaminathan emlxs_dump_saturn_log( 3528291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3529291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile, 3530291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile) 3531291a2b48SSukumar Swaminathan { 3532291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 3533291a2b48SSukumar Swaminathan MAILBOXQ *mbq; 3534291a2b48SSukumar Swaminathan MAILBOX *mb; 353582527734SSukumar Swaminathan MATCHMAP *mp = NULL; 3536291a2b48SSukumar Swaminathan uint32_t status; 3537291a2b48SSukumar Swaminathan uint32_t logSize = 0; 3538291a2b48SSukumar Swaminathan uintptr_t tempAddress; 3539291a2b48SSukumar Swaminathan int fSwap = FALSE; 3540291a2b48SSukumar Swaminathan uint32_t i; 3541291a2b48SSukumar Swaminathan uint32_t block_size; 3542291a2b48SSukumar Swaminathan uint32_t offset; 3543291a2b48SSukumar Swaminathan 3544291a2b48SSukumar Swaminathan #ifdef EMLXS_BIG_ENDIAN 3545291a2b48SSukumar Swaminathan fSwap = TRUE; 3546291a2b48SSukumar Swaminathan #endif /* EMLXS_BIG_ENDIAN */ 3547291a2b48SSukumar Swaminathan 354882527734SSukumar Swaminathan if (hba->model_info.chip != EMLXS_SATURN_CHIP) { 3549291a2b48SSukumar Swaminathan return (1); 3550291a2b48SSukumar Swaminathan } 355182527734SSukumar Swaminathan 355282527734SSukumar Swaminathan mbq = 355382527734SSukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP); 355482527734SSukumar Swaminathan 3555291a2b48SSukumar Swaminathan mb = (MAILBOX *) mbq; 3556291a2b48SSukumar Swaminathan 3557291a2b48SSukumar Swaminathan /* Step 1: Call MBX_READ_EVENT_LOG_STATUS to get the log size. */ 3558291a2b48SSukumar Swaminathan for (i = 0; i < 10; i++) { 3559291a2b48SSukumar Swaminathan bzero((void *)mb, MAILBOX_CMD_BSIZE); 3560291a2b48SSukumar Swaminathan mb->mbxCommand = MBX_READ_EVENT_LOG_STATUS; 356182527734SSukumar Swaminathan mbq->mbox_cmpl = NULL; 3562291a2b48SSukumar Swaminathan 356382527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) == 3564291a2b48SSukumar Swaminathan MBX_SUCCESS) { 3565291a2b48SSukumar Swaminathan break; 3566291a2b48SSukumar Swaminathan } 3567291a2b48SSukumar Swaminathan 3568291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 3569291a2b48SSukumar Swaminathan "Unable to read event log status. status=%x", 3570291a2b48SSukumar Swaminathan mb->mbxStatus); 3571291a2b48SSukumar Swaminathan 3572291a2b48SSukumar Swaminathan if ((mb->mbxStatus & 0xFFFF) == MBXERR_NOT_SUPPORTED || 3573291a2b48SSukumar Swaminathan (mb->mbxStatus & 0xFFFF) == MBX_DRVR_ERROR) { 3574291a2b48SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile, 3575291a2b48SSukumar Swaminathan NV_LOG_NOT_INCLUDED_IN_DMP, 3576291a2b48SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG, 3577291a2b48SSukumar Swaminathan LEGEND_NV_LOG_DRIVER_NOT_SUPPORTED, 0); 3578291a2b48SSukumar Swaminathan 3579291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 3580291a2b48SSukumar Swaminathan return (1); 3581291a2b48SSukumar Swaminathan } 3582291a2b48SSukumar Swaminathan 3583291a2b48SSukumar Swaminathan /* The call to get the log size simply fails. */ 3584291a2b48SSukumar Swaminathan /* Retry up to 10 times. */ 3585291a2b48SSukumar Swaminathan if ((mb->mbxStatus & 0xFFFF) != MBX_BUSY) { 3586291a2b48SSukumar Swaminathan /* Mailbox fails for some unknown reason. */ 3587291a2b48SSukumar Swaminathan /* Put something in the txt to indicate this case. */ 3588291a2b48SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile, 3589291a2b48SSukumar Swaminathan NV_LOG_NOT_INCLUDED_IN_DMP, 3590291a2b48SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG, 3591291a2b48SSukumar Swaminathan LEGEND_NV_LOG_STATUS_ERROR, 0); 3592291a2b48SSukumar Swaminathan 3593291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 3594291a2b48SSukumar Swaminathan return (1); 3595291a2b48SSukumar Swaminathan } 3596291a2b48SSukumar Swaminathan } 3597291a2b48SSukumar Swaminathan 3598291a2b48SSukumar Swaminathan if (i >= 10) { 3599291a2b48SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile, 3600291a2b48SSukumar Swaminathan NV_LOG_NOT_INCLUDED_IN_DMP, LEGEND_NON_VOLATILE_LOG, 3601291a2b48SSukumar Swaminathan LEGEND_NV_LOG_STATUS_ERROR, 0); 3602291a2b48SSukumar Swaminathan 3603291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 3604291a2b48SSukumar Swaminathan return (1); 3605291a2b48SSukumar Swaminathan } 3606291a2b48SSukumar Swaminathan 3607291a2b48SSukumar Swaminathan /* Step 2: Use the log size from step 1 to call MBX_READ_EVENT_LOG */ 3608291a2b48SSukumar Swaminathan logSize = mb->un.varLogStat.size; 360982527734SSukumar Swaminathan 361082527734SSukumar Swaminathan if ((mp = emlxs_mem_buf_alloc(hba, logSize)) == 0) { 3611291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 361282527734SSukumar Swaminathan "Unable to allocate receive buffer. " 361382527734SSukumar Swaminathan "size=%d", 361482527734SSukumar Swaminathan logSize); 3615291a2b48SSukumar Swaminathan 3616291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 3617291a2b48SSukumar Swaminathan return (1); 3618291a2b48SSukumar Swaminathan } 3619291a2b48SSukumar Swaminathan 3620291a2b48SSukumar Swaminathan for (offset = 0; offset < logSize; offset = offset + 1024) { 3621291a2b48SSukumar Swaminathan if (logSize - offset < 1024) { 3622291a2b48SSukumar Swaminathan block_size = logSize - offset; 3623291a2b48SSukumar Swaminathan } else { 3624291a2b48SSukumar Swaminathan block_size = 1024; 3625291a2b48SSukumar Swaminathan } 3626291a2b48SSukumar Swaminathan 362782527734SSukumar Swaminathan tempAddress = (uintptr_t)(mp->phys + offset); 3628291a2b48SSukumar Swaminathan 3629291a2b48SSukumar Swaminathan bzero((void *)mb, MAILBOX_CMD_BSIZE); 3630291a2b48SSukumar Swaminathan mb->mbxCommand = MBX_READ_EVENT_LOG; /* 0x38 */ 3631291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.read_log = 1; /* read log */ 3632291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.mbox_rsp = 0; /* not using Mailbox */ 3633291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.offset = offset; 3634291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.tus.f.bdeFlags = 0x0; 3635291a2b48SSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.tus.f.bdeSize = block_size; 363682527734SSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.addrLow = PADDR_LO(tempAddress); 363782527734SSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.addrHigh = PADDR_HI(tempAddress); 363882527734SSukumar Swaminathan mbq->mbox_cmpl = NULL; 3639291a2b48SSukumar Swaminathan 364082527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != 3641291a2b48SSukumar Swaminathan MBX_SUCCESS) { 3642291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg, 3643291a2b48SSukumar Swaminathan "Unable to read event log. status=%x", 3644291a2b48SSukumar Swaminathan mb->mbxStatus); 3645291a2b48SSukumar Swaminathan 3646a9800bebSGarrett D'Amore emlxs_mem_buf_free(hba, mp); 3647291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 3648291a2b48SSukumar Swaminathan return (1); 3649291a2b48SSukumar Swaminathan } 3650291a2b48SSukumar Swaminathan } 3651291a2b48SSukumar Swaminathan 3652291a2b48SSukumar Swaminathan /* Step 3: Dump the log to the DMP file as raw data. */ 3653291a2b48SSukumar Swaminathan 3654291a2b48SSukumar Swaminathan /* Write a string to text file to direct the user to the DMP */ 3655291a2b48SSukumar Swaminathan /* file for the actual log. */ 3656291a2b48SSukumar Swaminathan status = 3657291a2b48SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, NV_LOG_INCLUDED_IN_DMP, 3658291a2b48SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG, LEGEND_NULL, 0); 3659291a2b48SSukumar Swaminathan 3660291a2b48SSukumar Swaminathan /* Write the real log to the DMP file. */ 366182527734SSukumar Swaminathan EMLXS_MPDATA_SYNC(mp->dma_handle, 0, logSize, DDI_DMA_SYNC_FORKERNEL); 366282527734SSukumar Swaminathan 3663291a2b48SSukumar Swaminathan status = 366482527734SSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, mp->virt, logSize, 3665291a2b48SSukumar Swaminathan SID_NON_VOLATILE_LOG, LEGEND_NON_VOLATILE_LOG, LEGEND_NULL, 3666291a2b48SSukumar Swaminathan fSwap); 3667291a2b48SSukumar Swaminathan 3668b3660a96SSukumar Swaminathan #ifdef FMA_SUPPORT 3669b3660a96SSukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, mp->dma_handle) 3670b3660a96SSukumar Swaminathan != DDI_FM_OK) { 3671b3660a96SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, 3672b3660a96SSukumar Swaminathan &emlxs_invalid_dma_handle_msg, 3673*8f23e9faSHans Rosenfeld "dump_saturn_log: hdl=%p", 3674b3660a96SSukumar Swaminathan mp->dma_handle); 3675b3660a96SSukumar Swaminathan status = 1; 3676b3660a96SSukumar Swaminathan } 3677b3660a96SSukumar Swaminathan #endif /* FMA_SUPPORT */ 3678b3660a96SSukumar Swaminathan 3679a9800bebSGarrett D'Amore emlxs_mem_buf_free(hba, mp); 3680291a2b48SSukumar Swaminathan kmem_free(mbq, sizeof (MAILBOXQ)); 3681291a2b48SSukumar Swaminathan return (status); 3682291a2b48SSukumar Swaminathan 368382527734SSukumar Swaminathan } /* emlxs_dump_saturn_log() */ 368482527734SSukumar Swaminathan 368582527734SSukumar Swaminathan 368682527734SSukumar Swaminathan static uint32_t 368782527734SSukumar Swaminathan emlxs_dump_tigershark_log( 368882527734SSukumar Swaminathan emlxs_hba_t *hba, 368982527734SSukumar Swaminathan emlxs_file_t *fpTxtFile, 369082527734SSukumar Swaminathan emlxs_file_t *fpCeeFile) 369182527734SSukumar Swaminathan { 369282527734SSukumar Swaminathan emlxs_port_t *port = &PPORT; 369382527734SSukumar Swaminathan uint32_t rval = 0; 369482527734SSukumar Swaminathan uint32_t offset; 369582527734SSukumar Swaminathan uint32_t log_size; 369682527734SSukumar Swaminathan uint32_t xfer_size; 369782527734SSukumar Swaminathan uint32_t buffer_size; 369882527734SSukumar Swaminathan uint8_t *buffer = NULL; 369982527734SSukumar Swaminathan uint8_t *bptr; 370082527734SSukumar Swaminathan uint8_t *payload; 370182527734SSukumar Swaminathan MAILBOXQ *mbq = NULL; 370282527734SSukumar Swaminathan MAILBOX4 *mb = NULL; 370382527734SSukumar Swaminathan MATCHMAP *mp = NULL; 370482527734SSukumar Swaminathan IOCTL_COMMON_MANAGE_FAT *fat; 370582527734SSukumar Swaminathan mbox_req_hdr_t *hdr_req; 370682527734SSukumar Swaminathan 3707a9800bebSGarrett D'Amore if ((hba->model_info.chip != EMLXS_BE2_CHIP) && 3708a9800bebSGarrett D'Amore (hba->model_info.chip != EMLXS_BE3_CHIP)) { 370982527734SSukumar Swaminathan return (1); 371082527734SSukumar Swaminathan } 371182527734SSukumar Swaminathan 371282527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 371382527734SSukumar Swaminathan "Querying FAT..."); 371482527734SSukumar Swaminathan 371582527734SSukumar Swaminathan mbq = (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), 371682527734SSukumar Swaminathan KM_SLEEP); 371782527734SSukumar Swaminathan 371882527734SSukumar Swaminathan mb = (MAILBOX4*)mbq; 371982527734SSukumar Swaminathan 372082527734SSukumar Swaminathan if ((mp = emlxs_mem_buf_alloc(hba, (sizeof (mbox_req_hdr_t) + 372182527734SSukumar Swaminathan sizeof (IOCTL_COMMON_MANAGE_FAT) + BE_MAX_XFER_SIZE))) == NULL) { 372282527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 372382527734SSukumar Swaminathan "Unable to allocate FAT buffer."); 372482527734SSukumar Swaminathan 372582527734SSukumar Swaminathan rval = 1; 372682527734SSukumar Swaminathan goto done; 372782527734SSukumar Swaminathan } 372882527734SSukumar Swaminathan 372982527734SSukumar Swaminathan /* Query FAT */ 373082527734SSukumar Swaminathan mb->un.varSLIConfig.be.embedded = 0; 3731a9800bebSGarrett D'Amore mbq->nonembed = (void *)mp; 373282527734SSukumar Swaminathan mbq->mbox_cmpl = NULL; 373382527734SSukumar Swaminathan 373482527734SSukumar Swaminathan mb->mbxCommand = MBX_SLI_CONFIG; 373582527734SSukumar Swaminathan mb->mbxOwner = OWN_HOST; 373682527734SSukumar Swaminathan 373782527734SSukumar Swaminathan hdr_req = (mbox_req_hdr_t *)mp->virt; 373882527734SSukumar Swaminathan hdr_req->subsystem = IOCTL_SUBSYSTEM_COMMON; 373982527734SSukumar Swaminathan hdr_req->opcode = COMMON_OPCODE_MANAGE_FAT; 374082527734SSukumar Swaminathan hdr_req->timeout = 0; 374182527734SSukumar Swaminathan hdr_req->req_length = sizeof (IOCTL_COMMON_MANAGE_FAT); 374282527734SSukumar Swaminathan 374382527734SSukumar Swaminathan fat = (IOCTL_COMMON_MANAGE_FAT *)(hdr_req + 1); 374482527734SSukumar Swaminathan fat->params.request.fat_operation = QUERY_FAT; 374582527734SSukumar Swaminathan fat->params.request.read_log_offset = 0; 374682527734SSukumar Swaminathan fat->params.request.read_log_length = 0; 374782527734SSukumar Swaminathan fat->params.request.data_buffer_size = BE_MAX_XFER_SIZE; 374882527734SSukumar Swaminathan 374982527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != 375082527734SSukumar Swaminathan MBX_SUCCESS) { 375182527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 375282527734SSukumar Swaminathan "FAT Query failed. status=%x", 375382527734SSukumar Swaminathan mb->mbxStatus); 375482527734SSukumar Swaminathan 375582527734SSukumar Swaminathan rval = 1; 375682527734SSukumar Swaminathan goto done; 375782527734SSukumar Swaminathan } 375882527734SSukumar Swaminathan 375982527734SSukumar Swaminathan log_size = fat->params.response.log_size; 376082527734SSukumar Swaminathan buffer_size = fat->params.response.log_size; 376182527734SSukumar Swaminathan 376282527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 376382527734SSukumar Swaminathan "FAT: log_size=%d", log_size); 376482527734SSukumar Swaminathan 3765a9800bebSGarrett D'Amore if (buffer_size == 0) { 3766a9800bebSGarrett D'Amore goto done; 3767a9800bebSGarrett D'Amore } 376882527734SSukumar Swaminathan 3769a9800bebSGarrett D'Amore if ((buffer = (uint8_t *)kmem_alloc( 3770a9800bebSGarrett D'Amore buffer_size, KM_NOSLEEP)) == NULL) { 3771a9800bebSGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 3772a9800bebSGarrett D'Amore "Unable to allocate log buffer."); 3773a9800bebSGarrett D'Amore 3774a9800bebSGarrett D'Amore rval = 1; 3775a9800bebSGarrett D'Amore goto done; 377682527734SSukumar Swaminathan } 3777a9800bebSGarrett D'Amore bzero(buffer, buffer_size); 377882527734SSukumar Swaminathan 377982527734SSukumar Swaminathan /* Upload Log */ 378082527734SSukumar Swaminathan bptr = buffer; 378182527734SSukumar Swaminathan offset = 0; 378282527734SSukumar Swaminathan 378382527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 378482527734SSukumar Swaminathan "Uploading log... (%d bytes)", log_size); 378582527734SSukumar Swaminathan 378682527734SSukumar Swaminathan while (log_size) { 378782527734SSukumar Swaminathan bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE); 378882527734SSukumar Swaminathan bzero((void *) mp->virt, mp->size); 378982527734SSukumar Swaminathan 379082527734SSukumar Swaminathan xfer_size = min(BE_MAX_XFER_SIZE, log_size); 379182527734SSukumar Swaminathan 379282527734SSukumar Swaminathan mb->un.varSLIConfig.be.embedded = 0; 3793a9800bebSGarrett D'Amore mbq->nonembed = (void *)mp; 379482527734SSukumar Swaminathan mbq->mbox_cmpl = NULL; 379582527734SSukumar Swaminathan 379682527734SSukumar Swaminathan mb->mbxCommand = MBX_SLI_CONFIG; 379782527734SSukumar Swaminathan mb->mbxOwner = OWN_HOST; 379882527734SSukumar Swaminathan 379982527734SSukumar Swaminathan hdr_req = (mbox_req_hdr_t *)mp->virt; 380082527734SSukumar Swaminathan hdr_req->subsystem = IOCTL_SUBSYSTEM_COMMON; 380182527734SSukumar Swaminathan hdr_req->opcode = COMMON_OPCODE_MANAGE_FAT; 380282527734SSukumar Swaminathan hdr_req->timeout = 0; 380382527734SSukumar Swaminathan hdr_req->req_length = 380482527734SSukumar Swaminathan sizeof (IOCTL_COMMON_MANAGE_FAT) + xfer_size; 380582527734SSukumar Swaminathan 380682527734SSukumar Swaminathan fat = (IOCTL_COMMON_MANAGE_FAT *)(hdr_req + 1); 380782527734SSukumar Swaminathan fat->params.request.fat_operation = RETRIEVE_FAT; 380882527734SSukumar Swaminathan fat->params.request.read_log_offset = offset; 380982527734SSukumar Swaminathan fat->params.request.read_log_length = xfer_size; 381082527734SSukumar Swaminathan fat->params.request.data_buffer_size = BE_MAX_XFER_SIZE; 381182527734SSukumar Swaminathan 381282527734SSukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != 381382527734SSukumar Swaminathan MBX_SUCCESS) { 381482527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 381582527734SSukumar Swaminathan "Failed to upload log. status=%x", 381682527734SSukumar Swaminathan mb->mbxStatus); 381782527734SSukumar Swaminathan 381882527734SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile, 381982527734SSukumar Swaminathan NV_LOG_NOT_INCLUDED_IN_FAT, 382082527734SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG, 382182527734SSukumar Swaminathan LEGEND_NV_LOG_STATUS_ERROR, 0); 382282527734SSukumar Swaminathan 382382527734SSukumar Swaminathan rval = 1; 382482527734SSukumar Swaminathan goto done; 382582527734SSukumar Swaminathan } 382682527734SSukumar Swaminathan 382782527734SSukumar Swaminathan payload = (uint8_t *)(&fat->params.response.data_buffer); 382882527734SSukumar Swaminathan 382982527734SSukumar Swaminathan BE_SWAP32_BCOPY(payload, bptr, xfer_size); 383082527734SSukumar Swaminathan 383182527734SSukumar Swaminathan log_size -= xfer_size; 383282527734SSukumar Swaminathan offset += xfer_size; 383382527734SSukumar Swaminathan bptr += xfer_size; 383482527734SSukumar Swaminathan } 383582527734SSukumar Swaminathan 383682527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 383782527734SSukumar Swaminathan "Log upload complete."); 383882527734SSukumar Swaminathan 383982527734SSukumar Swaminathan /* Write a string to text file to direct the user to the CEE */ 384082527734SSukumar Swaminathan /* file for the actual log. */ 384182527734SSukumar Swaminathan rval = 384282527734SSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, NV_LOG_INCLUDED_IN_FAT, 384382527734SSukumar Swaminathan LEGEND_NON_VOLATILE_LOG, LEGEND_NULL, 0); 384482527734SSukumar Swaminathan 384582527734SSukumar Swaminathan 384682527734SSukumar Swaminathan /* Write the log to the CEE file. */ 384782527734SSukumar Swaminathan /* First word is the log size */ 384882527734SSukumar Swaminathan bptr = buffer + sizeof (uint32_t); 384982527734SSukumar Swaminathan log_size = buffer_size - sizeof (uint32_t); 385082527734SSukumar Swaminathan rval = emlxs_dump_word_dmpfile(fpCeeFile, (uint8_t *)bptr, 385182527734SSukumar Swaminathan log_size, 0); 385282527734SSukumar Swaminathan 385382527734SSukumar Swaminathan done: 385482527734SSukumar Swaminathan 385582527734SSukumar Swaminathan if (mbq) { 3856a9800bebSGarrett D'Amore emlxs_mem_put(hba, MEM_MBOX, (void *)mbq); 385782527734SSukumar Swaminathan } 385882527734SSukumar Swaminathan 385982527734SSukumar Swaminathan if (mp) { 3860a9800bebSGarrett D'Amore emlxs_mem_buf_free(hba, mp); 386182527734SSukumar Swaminathan } 386282527734SSukumar Swaminathan 386382527734SSukumar Swaminathan if (buffer) { 386482527734SSukumar Swaminathan kmem_free(buffer, buffer_size); 386582527734SSukumar Swaminathan } 386682527734SSukumar Swaminathan 386782527734SSukumar Swaminathan if (rval == 0) { 386882527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 386982527734SSukumar Swaminathan "Dump complete."); 387082527734SSukumar Swaminathan } 387182527734SSukumar Swaminathan 387282527734SSukumar Swaminathan return (rval); 387382527734SSukumar Swaminathan 387482527734SSukumar Swaminathan } /* emlxs_dump_tigershark_log() */ 3875291a2b48SSukumar Swaminathan 3876291a2b48SSukumar Swaminathan 3877291a2b48SSukumar Swaminathan extern uint32_t 3878291a2b48SSukumar Swaminathan emlxs_dump_user_event( 3879291a2b48SSukumar Swaminathan emlxs_hba_t *hba) 3880291a2b48SSukumar Swaminathan { 3881291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 3882291a2b48SSukumar Swaminathan uint32_t status; 3883291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile; 3884291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile; 3885291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile; 3886291a2b48SSukumar Swaminathan 3887291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_DUMP_LOCK); 3888291a2b48SSukumar Swaminathan 3889291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 3890291a2b48SSukumar Swaminathan "User Event: Firmware core dump initiated..."); 3891291a2b48SSukumar Swaminathan 3892291a2b48SSukumar Swaminathan status = 3893291a2b48SSukumar Swaminathan emlxs_dump_file_create(hba, &fpTxtFile, &fpDmpFile, &fpCeeFile); 3894291a2b48SSukumar Swaminathan if (status != 0) { 3895291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK); 3896291a2b48SSukumar Swaminathan return (1); 3897291a2b48SSukumar Swaminathan } 3898291a2b48SSukumar Swaminathan 3899291a2b48SSukumar Swaminathan (void) emlxs_dump_rev_info(hba, fpTxtFile, fpDmpFile); 3900291a2b48SSukumar Swaminathan (void) emlxs_dump_hba_info(hba, fpTxtFile, fpDmpFile, DUMP_TYPE_USER); 3901291a2b48SSukumar Swaminathan (void) emlxs_dump_parm_table(hba, fpTxtFile, fpDmpFile); 3902291a2b48SSukumar Swaminathan (void) emlxs_dump_cfg_regions(hba, fpTxtFile, fpDmpFile); 3903291a2b48SSukumar Swaminathan 3904291a2b48SSukumar Swaminathan if (hba->model_info.chip == EMLXS_SATURN_CHIP) { 390582527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_ONDI); 390682527734SSukumar Swaminathan (void) emlxs_dump_saturn_log(hba, fpTxtFile, fpDmpFile); 3907291a2b48SSukumar Swaminathan } 3908291a2b48SSukumar Swaminathan 3909a9800bebSGarrett D'Amore if ((hba->model_info.chip == EMLXS_BE2_CHIP) || 3910a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE3_CHIP)) { 391182527734SSukumar Swaminathan (void) emlxs_dump_tigershark_log(hba, fpTxtFile, fpCeeFile); 391282527734SSukumar Swaminathan } 391382527734SSukumar Swaminathan 391482527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) { 391582527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_DIAGDI); 3916291a2b48SSukumar Swaminathan } 3917291a2b48SSukumar Swaminathan 3918291a2b48SSukumar Swaminathan (void) emlxs_dump_sli_interface(hba, fpTxtFile, fpDmpFile, 3919291a2b48SSukumar Swaminathan DUMP_TYPE_USER); 3920291a2b48SSukumar Swaminathan 392182527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) { 3922291a2b48SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_WARMDI); 3923291a2b48SSukumar Swaminathan } 3924291a2b48SSukumar Swaminathan 3925291a2b48SSukumar Swaminathan (void) emlxs_dump_hba(hba, fpTxtFile, fpDmpFile); 3926291a2b48SSukumar Swaminathan 392782527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_ONDI); 3928291a2b48SSukumar Swaminathan 392982527734SSukumar Swaminathan status = emlxs_menlo_set_mode(hba, MENLO_MAINTENANCE_MODE_ENABLE); 393082527734SSukumar Swaminathan if (status == 0) { 393182527734SSukumar Swaminathan (void) emlxs_dump_menlo_log(hba, fpCeeFile); 393282527734SSukumar Swaminathan (void) emlxs_menlo_set_mode(hba, 393382527734SSukumar Swaminathan MENLO_MAINTENANCE_MODE_DISABLE); 3934291a2b48SSukumar Swaminathan } 3935291a2b48SSukumar Swaminathan 393682527734SSukumar Swaminathan (void) emlxs_dump_file_terminate(hba, fpTxtFile, fpDmpFile, fpCeeFile); 3937291a2b48SSukumar Swaminathan (void) emlxs_dump_file_close(fpTxtFile, fpDmpFile, fpCeeFile); 3938291a2b48SSukumar Swaminathan 3939291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK); 3940291a2b48SSukumar Swaminathan return (0); 3941291a2b48SSukumar Swaminathan 394282527734SSukumar Swaminathan } /* emlxs_dump_user_event() */ 3943291a2b48SSukumar Swaminathan 3944291a2b48SSukumar Swaminathan 3945291a2b48SSukumar Swaminathan extern uint32_t 3946291a2b48SSukumar Swaminathan emlxs_dump_temp_event( 3947291a2b48SSukumar Swaminathan emlxs_hba_t *hba, 3948291a2b48SSukumar Swaminathan uint32_t tempType, 3949291a2b48SSukumar Swaminathan uint32_t temp) 3950291a2b48SSukumar Swaminathan { 3951291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 3952291a2b48SSukumar Swaminathan uint32_t status; 3953291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile; 3954291a2b48SSukumar Swaminathan 3955291a2b48SSukumar Swaminathan /* misc vars */ 3956291a2b48SSukumar Swaminathan char sBuf1[512]; /* general purpose string buffer */ 3957291a2b48SSukumar Swaminathan char sBuf2[256]; /* general purpose string buffer */ 3958291a2b48SSukumar Swaminathan char sBuf3[256]; /* general purpose string buffer */ 3959291a2b48SSukumar Swaminathan 396082527734SSukumar Swaminathan if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) { 396182527734SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 396282527734SSukumar Swaminathan "Temperature Event: type=%d temp=%d. "\ 396382527734SSukumar Swaminathan "Invalid SLI4 event.", 396482527734SSukumar Swaminathan tempType, temp); 396582527734SSukumar Swaminathan 396682527734SSukumar Swaminathan return (1); 396782527734SSukumar Swaminathan } 396882527734SSukumar Swaminathan 3969291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_DUMP_LOCK); 3970291a2b48SSukumar Swaminathan 3971291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 3972291a2b48SSukumar Swaminathan "Temperature Event: type=%d temp=%d. "\ 3973291a2b48SSukumar Swaminathan "Firmware core dump initiated...", 3974291a2b48SSukumar Swaminathan tempType, temp); 3975291a2b48SSukumar Swaminathan 3976291a2b48SSukumar Swaminathan status = emlxs_dump_file_create(hba, &fpTxtFile, 0, 0); 3977291a2b48SSukumar Swaminathan if (status != 0) { 3978291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK); 3979291a2b48SSukumar Swaminathan return (1); 3980291a2b48SSukumar Swaminathan } 3981291a2b48SSukumar Swaminathan 3982291a2b48SSukumar Swaminathan /* Now generate the Dump */ 398382527734SSukumar Swaminathan /* Note: ignore return (status); if one part fails, */ 3984291a2b48SSukumar Swaminathan /* keep trying to dump more stuff. */ 3985291a2b48SSukumar Swaminathan 3986291a2b48SSukumar Swaminathan /* Write a warning at the top of the file */ 3987*8f23e9faSHans Rosenfeld (void) strlcpy(sBuf1, "WARNING: HBA Temperature Event:\n", 3988*8f23e9faSHans Rosenfeld sizeof (sBuf1)); 3989291a2b48SSukumar Swaminathan switch (tempType) { 3990291a2b48SSukumar Swaminathan case TEMP_TYPE_CRITICAL: 3991*8f23e9faSHans Rosenfeld (void) snprintf(sBuf2, sizeof (sBuf2), 3992*8f23e9faSHans Rosenfeld " Event Type = %d (Critical)\n", tempType); 3993291a2b48SSukumar Swaminathan break; 3994291a2b48SSukumar Swaminathan case TEMP_TYPE_THRESHOLD: 3995*8f23e9faSHans Rosenfeld (void) snprintf(sBuf2, sizeof (sBuf2), 3996*8f23e9faSHans Rosenfeld " Event Type = %d (Threshold)\n", tempType); 3997291a2b48SSukumar Swaminathan break; 3998291a2b48SSukumar Swaminathan case TEMP_TYPE_NORMAL: 3999*8f23e9faSHans Rosenfeld (void) snprintf(sBuf2, sizeof (sBuf2), 4000*8f23e9faSHans Rosenfeld " Event Type = %d (Normal)\n", tempType); 4001291a2b48SSukumar Swaminathan break; 4002291a2b48SSukumar Swaminathan default: 4003*8f23e9faSHans Rosenfeld (void) snprintf(sBuf2, sizeof (sBuf2), 4004*8f23e9faSHans Rosenfeld " Unknown Event Type = %d\n", tempType); 4005291a2b48SSukumar Swaminathan break; 4006291a2b48SSukumar Swaminathan } 4007*8f23e9faSHans Rosenfeld (void) snprintf(sBuf3, sizeof (sBuf3), " Temperature = %d\n\n", temp); 4008*8f23e9faSHans Rosenfeld (void) strlcat(sBuf1, sBuf2, sizeof (sBuf1)); 4009*8f23e9faSHans Rosenfeld (void) strlcat(sBuf1, sBuf3, sizeof (sBuf1)); 4010291a2b48SSukumar Swaminathan 4011291a2b48SSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile, sBuf1, 0, 0, 0); 4012291a2b48SSukumar Swaminathan 4013291a2b48SSukumar Swaminathan (void) emlxs_dump_rev_info(hba, fpTxtFile, NULL); 4014291a2b48SSukumar Swaminathan (void) emlxs_dump_hba_info(hba, fpTxtFile, NULL, DUMP_TYPE_TEMP); 4015291a2b48SSukumar Swaminathan 401682527734SSukumar Swaminathan (void) emlxs_dump_file_terminate(hba, fpTxtFile, NULL, NULL); 4017291a2b48SSukumar Swaminathan (void) emlxs_dump_file_close(fpTxtFile, NULL, NULL); 4018291a2b48SSukumar Swaminathan 4019291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK); 4020291a2b48SSukumar Swaminathan return (0); 4021291a2b48SSukumar Swaminathan 402282527734SSukumar Swaminathan } /* emlxs_dump_temp_event() */ 4023291a2b48SSukumar Swaminathan 4024291a2b48SSukumar Swaminathan 4025291a2b48SSukumar Swaminathan extern uint32_t 4026291a2b48SSukumar Swaminathan emlxs_dump_drv_event( 4027291a2b48SSukumar Swaminathan emlxs_hba_t *hba) 4028291a2b48SSukumar Swaminathan { 4029291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 4030291a2b48SSukumar Swaminathan uint32_t status; 4031291a2b48SSukumar Swaminathan emlxs_file_t *fpTxtFile; 4032291a2b48SSukumar Swaminathan emlxs_file_t *fpDmpFile; 4033291a2b48SSukumar Swaminathan emlxs_file_t *fpCeeFile; 4034291a2b48SSukumar Swaminathan 4035291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_DUMP_LOCK); 4036291a2b48SSukumar Swaminathan 4037291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 4038291a2b48SSukumar Swaminathan "Dump Event: Firmware core dump initiated..."); 4039291a2b48SSukumar Swaminathan 4040291a2b48SSukumar Swaminathan status = 4041291a2b48SSukumar Swaminathan emlxs_dump_file_create(hba, &fpTxtFile, &fpDmpFile, &fpCeeFile); 4042291a2b48SSukumar Swaminathan if (status != 0) { 4043291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK); 4044291a2b48SSukumar Swaminathan return (1); 4045291a2b48SSukumar Swaminathan } 4046291a2b48SSukumar Swaminathan 4047291a2b48SSukumar Swaminathan if (hba->model_info.chip == EMLXS_SATURN_CHIP) { 404882527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_ONDI); 404982527734SSukumar Swaminathan (void) emlxs_dump_saturn_log(hba, fpTxtFile, fpDmpFile); 405082527734SSukumar Swaminathan } 4051291a2b48SSukumar Swaminathan 4052a9800bebSGarrett D'Amore if ((hba->model_info.chip == EMLXS_BE2_CHIP) || 4053a9800bebSGarrett D'Amore (hba->model_info.chip == EMLXS_BE3_CHIP)) { 405482527734SSukumar Swaminathan (void) emlxs_dump_tigershark_log(hba, fpTxtFile, fpCeeFile); 4055291a2b48SSukumar Swaminathan } 4056291a2b48SSukumar Swaminathan 405782527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) { 405882527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_DIAGDI); 4059291a2b48SSukumar Swaminathan } 4060291a2b48SSukumar Swaminathan 4061291a2b48SSukumar Swaminathan (void) emlxs_dump_sli_interface(hba, fpTxtFile, fpDmpFile, 4062291a2b48SSukumar Swaminathan DUMP_TYPE_DRIVER); 4063291a2b48SSukumar Swaminathan 406482527734SSukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) { 4065291a2b48SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_WARMDI); 4066291a2b48SSukumar Swaminathan } 4067291a2b48SSukumar Swaminathan 4068291a2b48SSukumar Swaminathan (void) emlxs_dump_hba(hba, fpTxtFile, fpDmpFile); 4069291a2b48SSukumar Swaminathan 4070*8f23e9faSHans Rosenfeld if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) { 4071*8f23e9faSHans Rosenfeld (void) emlxs_set_hba_mode(hba, DDI_ONDI); 4072*8f23e9faSHans Rosenfeld } 4073291a2b48SSukumar Swaminathan 407482527734SSukumar Swaminathan status = emlxs_menlo_set_mode(hba, MENLO_MAINTENANCE_MODE_ENABLE); 407582527734SSukumar Swaminathan if (status == 0) { 407682527734SSukumar Swaminathan (void) emlxs_dump_menlo_log(hba, fpCeeFile); 4077291a2b48SSukumar Swaminathan } 4078291a2b48SSukumar Swaminathan 4079291a2b48SSukumar Swaminathan /* Now generate the rest of the Dump */ 4080291a2b48SSukumar Swaminathan (void) emlxs_dump_rev_info(hba, fpTxtFile, fpDmpFile); 4081291a2b48SSukumar Swaminathan (void) emlxs_dump_hba_info(hba, fpTxtFile, fpDmpFile, DUMP_TYPE_DRIVER); 4082291a2b48SSukumar Swaminathan (void) emlxs_dump_parm_table(hba, fpTxtFile, fpDmpFile); 4083291a2b48SSukumar Swaminathan (void) emlxs_dump_cfg_regions(hba, fpTxtFile, fpDmpFile); 4084291a2b48SSukumar Swaminathan 408582527734SSukumar Swaminathan (void) emlxs_dump_file_terminate(hba, fpTxtFile, fpDmpFile, fpCeeFile); 4086291a2b48SSukumar Swaminathan (void) emlxs_dump_file_close(fpTxtFile, fpDmpFile, fpCeeFile); 4087291a2b48SSukumar Swaminathan 408882527734SSukumar Swaminathan /* The last step of the Menlo Dump. */ 408982527734SSukumar Swaminathan (void) emlxs_menlo_reset(hba, MENLO_FW_OPERATIONAL); 409082527734SSukumar Swaminathan 409182527734SSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_WARMDI); 4092291a2b48SSukumar Swaminathan 4093291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_DUMP_LOCK); 4094291a2b48SSukumar Swaminathan 409582527734SSukumar Swaminathan 4096291a2b48SSukumar Swaminathan return (0); 4097291a2b48SSukumar Swaminathan 409882527734SSukumar Swaminathan } /* emlxs_dump_drv_event() */ 4099291a2b48SSukumar Swaminathan 4100291a2b48SSukumar Swaminathan 4101bb63f56eSSukumar Swaminathan /* ARGSUSED */ 4102291a2b48SSukumar Swaminathan extern void 4103bb63f56eSSukumar Swaminathan emlxs_dump_drv_thread(emlxs_hba_t *hba, 4104bb63f56eSSukumar Swaminathan void *arg1, void *arg2) 4105291a2b48SSukumar Swaminathan { 4106291a2b48SSukumar Swaminathan (void) emlxs_dump_drv_event(hba); 4107291a2b48SSukumar Swaminathan 4108291a2b48SSukumar Swaminathan /* Clear the Dump flag */ 4109291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK); 4110291a2b48SSukumar Swaminathan hba->flag &= ~FC_DUMP_ACTIVE; 4111291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK); 4112291a2b48SSukumar Swaminathan 4113bb63f56eSSukumar Swaminathan return; 4114291a2b48SSukumar Swaminathan 411582527734SSukumar Swaminathan } /* emlxs_dump_drv_thread() */ 4116291a2b48SSukumar Swaminathan 4117291a2b48SSukumar Swaminathan 4118bb63f56eSSukumar Swaminathan /* ARGSUSED */ 4119291a2b48SSukumar Swaminathan extern void 4120bb63f56eSSukumar Swaminathan emlxs_dump_user_thread(emlxs_hba_t *hba, 4121bb63f56eSSukumar Swaminathan void *arg1, void *arg2) 4122291a2b48SSukumar Swaminathan { 4123291a2b48SSukumar Swaminathan (void) emlxs_dump_user_event(hba); 4124291a2b48SSukumar Swaminathan 4125291a2b48SSukumar Swaminathan /* Clear the Dump flag */ 4126291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK); 4127291a2b48SSukumar Swaminathan hba->flag &= ~FC_DUMP_ACTIVE; 4128291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK); 4129291a2b48SSukumar Swaminathan 4130bb63f56eSSukumar Swaminathan return; 4131291a2b48SSukumar Swaminathan 413282527734SSukumar Swaminathan } /* emlxs_dump_user_thread() */ 4133291a2b48SSukumar Swaminathan 4134291a2b48SSukumar Swaminathan 4135bb63f56eSSukumar Swaminathan /* ARGSUSED */ 4136291a2b48SSukumar Swaminathan extern void 4137bb63f56eSSukumar Swaminathan emlxs_dump_temp_thread(emlxs_hba_t *hba, 4138bb63f56eSSukumar Swaminathan void *arg1, void *arg2) 4139291a2b48SSukumar Swaminathan { 4140bb63f56eSSukumar Swaminathan dump_temp_event_t *temp_event = (dump_temp_event_t *)arg1; 4141291a2b48SSukumar Swaminathan 4142291a2b48SSukumar Swaminathan (void) emlxs_dump_temp_event(temp_event->hba, temp_event->type, 4143291a2b48SSukumar Swaminathan temp_event->temp); 4144291a2b48SSukumar Swaminathan 4145291a2b48SSukumar Swaminathan /* Free the temp event object */ 4146291a2b48SSukumar Swaminathan kmem_free(temp_event, sizeof (dump_temp_event_t)); 4147291a2b48SSukumar Swaminathan 4148291a2b48SSukumar Swaminathan /* Clear the Dump flag */ 4149291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK); 4150291a2b48SSukumar Swaminathan hba->flag &= ~FC_DUMP_ACTIVE; 4151291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK); 4152291a2b48SSukumar Swaminathan 4153bb63f56eSSukumar Swaminathan return; 4154291a2b48SSukumar Swaminathan 415582527734SSukumar Swaminathan } /* emlxs_dump_temp_thread() */ 4156291a2b48SSukumar Swaminathan 4157291a2b48SSukumar Swaminathan 4158291a2b48SSukumar Swaminathan /* Schedules a dump thread */ 4159291a2b48SSukumar Swaminathan /* temp_type and temp are only valid for type=EMLXS_TEMP_DUMP */ 4160291a2b48SSukumar Swaminathan extern void 4161291a2b48SSukumar Swaminathan emlxs_dump(emlxs_hba_t *hba, uint32_t type, uint32_t temp_type, uint32_t temp) 4162291a2b48SSukumar Swaminathan { 4163291a2b48SSukumar Swaminathan emlxs_port_t *port = &PPORT; 4164291a2b48SSukumar Swaminathan dump_temp_event_t *temp_event = NULL; 4165291a2b48SSukumar Swaminathan 4166291a2b48SSukumar Swaminathan mutex_enter(&EMLXS_PORT_LOCK); 4167291a2b48SSukumar Swaminathan 4168291a2b48SSukumar Swaminathan /* Check if it is safe to dump */ 4169291a2b48SSukumar Swaminathan if (!(hba->flag & FC_DUMP_SAFE)) { 4170291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK); 4171291a2b48SSukumar Swaminathan 4172291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 4173*8f23e9faSHans Rosenfeld "dump: Dump disabled."); 4174291a2b48SSukumar Swaminathan 4175291a2b48SSukumar Swaminathan return; 4176291a2b48SSukumar Swaminathan } 4177291a2b48SSukumar Swaminathan 4178291a2b48SSukumar Swaminathan /* Check if a dump is already in progess */ 4179291a2b48SSukumar Swaminathan if (hba->flag & FC_DUMP_ACTIVE) { 4180291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK); 4181291a2b48SSukumar Swaminathan 4182291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 4183*8f23e9faSHans Rosenfeld "dump: Dump already in progress."); 4184291a2b48SSukumar Swaminathan 4185291a2b48SSukumar Swaminathan return; 4186291a2b48SSukumar Swaminathan } 4187291a2b48SSukumar Swaminathan 4188291a2b48SSukumar Swaminathan /* Prepare to schedule dump */ 4189291a2b48SSukumar Swaminathan switch (type) { 4190291a2b48SSukumar Swaminathan case EMLXS_DRV_DUMP: 4191291a2b48SSukumar Swaminathan case EMLXS_USER_DUMP: 4192291a2b48SSukumar Swaminathan break; 4193291a2b48SSukumar Swaminathan 4194291a2b48SSukumar Swaminathan case EMLXS_TEMP_DUMP: 4195291a2b48SSukumar Swaminathan temp_event = (dump_temp_event_t *)kmem_alloc( 4196291a2b48SSukumar Swaminathan sizeof (dump_temp_event_t), KM_NOSLEEP); 4197291a2b48SSukumar Swaminathan 4198291a2b48SSukumar Swaminathan if (temp_event == NULL) { 4199291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK); 4200291a2b48SSukumar Swaminathan 4201291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 4202*8f23e9faSHans Rosenfeld "dump: Unable to allocate temp object."); 4203291a2b48SSukumar Swaminathan 4204291a2b48SSukumar Swaminathan return; 4205291a2b48SSukumar Swaminathan } 4206291a2b48SSukumar Swaminathan 4207291a2b48SSukumar Swaminathan temp_event->hba = hba; 4208291a2b48SSukumar Swaminathan temp_event->type = temp_type; 4209291a2b48SSukumar Swaminathan temp_event->temp = temp; 4210291a2b48SSukumar Swaminathan break; 4211291a2b48SSukumar Swaminathan 4212291a2b48SSukumar Swaminathan default: 4213291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK); 4214291a2b48SSukumar Swaminathan 4215291a2b48SSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg, 4216*8f23e9faSHans Rosenfeld "dump: Error: Unknown dump type. (%x)", 4217291a2b48SSukumar Swaminathan type); 4218291a2b48SSukumar Swaminathan 4219291a2b48SSukumar Swaminathan return; 4220291a2b48SSukumar Swaminathan } 4221291a2b48SSukumar Swaminathan 4222291a2b48SSukumar Swaminathan /* Set the Dump-in-progess flag */ 4223291a2b48SSukumar Swaminathan hba->flag |= FC_DUMP_ACTIVE; 4224291a2b48SSukumar Swaminathan mutex_exit(&EMLXS_PORT_LOCK); 4225291a2b48SSukumar Swaminathan 4226291a2b48SSukumar Swaminathan /* Create a separate thread to run the dump event */ 4227291a2b48SSukumar Swaminathan switch (type) { 4228291a2b48SSukumar Swaminathan case EMLXS_DRV_DUMP: 4229bb63f56eSSukumar Swaminathan emlxs_thread_spawn(hba, emlxs_dump_drv_thread, NULL, NULL); 4230291a2b48SSukumar Swaminathan break; 4231291a2b48SSukumar Swaminathan 4232291a2b48SSukumar Swaminathan case EMLXS_TEMP_DUMP: 4233bb63f56eSSukumar Swaminathan emlxs_thread_spawn(hba, emlxs_dump_temp_thread, 4234bb63f56eSSukumar Swaminathan (void *)temp_event, NULL); 4235291a2b48SSukumar Swaminathan break; 4236291a2b48SSukumar Swaminathan 4237291a2b48SSukumar Swaminathan case EMLXS_USER_DUMP: 4238bb63f56eSSukumar Swaminathan emlxs_thread_spawn(hba, emlxs_dump_user_thread, NULL, NULL); 4239291a2b48SSukumar Swaminathan break; 4240291a2b48SSukumar Swaminathan } 4241291a2b48SSukumar Swaminathan 4242291a2b48SSukumar Swaminathan return; 4243291a2b48SSukumar Swaminathan 4244291a2b48SSukumar Swaminathan } /* emlxs_dump() */ 4245291a2b48SSukumar Swaminathan 4246291a2b48SSukumar Swaminathan extern void 4247291a2b48SSukumar Swaminathan emlxs_dump_wait(emlxs_hba_t *hba) 4248291a2b48SSukumar Swaminathan { 4249291a2b48SSukumar Swaminathan /* Wait for the Dump flag to clear */ 4250291a2b48SSukumar Swaminathan while ((hba->flag & FC_DUMP_ACTIVE)) { 4251*8f23e9faSHans Rosenfeld BUSYWAIT_MS(1000); 4252291a2b48SSukumar Swaminathan } 4253291a2b48SSukumar Swaminathan 4254291a2b48SSukumar Swaminathan } /* emlxs_dump_wait() */ 4255291a2b48SSukumar Swaminathan 4256291a2b48SSukumar Swaminathan 4257291a2b48SSukumar Swaminathan #endif /* DUMP_SUPPORT */ 4258