291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * CDDL HEADER START
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * The contents of this file are subject to the terms of the
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * Common Development and Distribution License (the "License").
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * You may not use this file except in compliance with the License.
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * You can obtain a copy of the license at
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * http://www.opensource.org/licenses/cddl1.txt.
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * See the License for the specific language governing permissions
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * and limitations under the License.
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan * CDDL HEADER END
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Copyright (c) 2004-2012 Emulex. All rights reserved.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Use is subject to license terms.
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Utility functions */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rsp_buf = (menlo_rsp_t *)kmem_zalloc(rsp_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_set_mode: Unable to send command.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_set_mode: Menlo command error. code=%d.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_set_cmd_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_menlo_set_mode() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rsp_buf = (menlo_rsp_t *)kmem_zalloc(rsp_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_reset: Unable to send command.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_reset: Menlo command error. code=%d.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_reset_cmd_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_menlo_reset() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan rsp_size = sizeof (menlo_get_config_rsp_t);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_get_cfg: Unable to send command.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_get_cfg: Menlo command error. code=%d.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_menlo_get_cfg() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_LOG_CONFIG;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_get_logcfg: Unable to send command.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_get_logcfg: Menlo command error. code=%d.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_menlo_get_logcfg() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_get_log: Unable to send command.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_get_log: Menlo command error. code=%d.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_menlo_get_log() */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan cmd_buf = (menlo_cmd_t *)kmem_zalloc(cmd_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cmd_buf->code = MENLO_CMD_GET_PANIC_LOG;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)cmd_buf, cmd_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (rval = emlxs_send_menlo_cmd(hba, (uint8_t *)cmd_buf, cmd_size,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_get_paniclog: Unable to send command.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_swap32_buffer((uint8_t *)rsp_buf, rsp_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_sli_detail_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "menlo_get_paniclog: Menlo command error. code=%d.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(cmd_buf, sizeof (menlo_get_cmd_t));
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_menlo_get_paniclog() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fflush() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_ftell() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fputc() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fwrite() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan const char *fmt, ...)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) vsnprintf(va_str, sizeof (va_str), fmt, valist);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan length = emlxs_fwrite((uint8_t *)va_str, strlen(va_str), 1, fp);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fprintf() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Make sure it is word aligned */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (uint8_t *)kmem_zalloc(fp->size, KM_SLEEP);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fopen() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan offset = (uint32_t)((uintptr_t)fp->ptr - (uintptr_t)fp->buffer);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fclose() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_fdelete() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* This builds a single core buffer for the IOCTL interface */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "get_dump: Buffer length = 0");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "get_dump: Buffer length too small. %d < %d",
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((hba->model_info.chip == EMLXS_BE2_CHIP) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* printf("Done. buflen=%d \n", *buflen); */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_get_dump() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t ByteCountRem; /* remaining portion of original byte count */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t ByteCountReq; /* requested byte count for a particular dump */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t CopyCount; /* bytes to copy after each successful dump */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t Offset; /* Offset into Config Region, for each dump */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint8_t *pLocalBuf; /* ptr to buffer to receive each dump */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pLocalBuf = pBuffer; /* init local pointer to caller's buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan *pRetByteCount = 0; /* init returned byte count */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (ByteCountRem = ByteCount; ByteCountRem > 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (ByteCountRem < hba->sli.sli4.dump_region.size) ?
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan ByteCountRem : hba->sli.sli4.dump_region.size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Clear the local dump_region */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varDmp4.available_cnt = ByteCountReq;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PADDR_HI(hba->sli.sli4.dump_region.phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan PADDR_LO(hba->sli.sli4.dump_region.phys);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to read config region. id=%x "\
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "offset=%x status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* if no more data returned */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "read_cfg_region: " \
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Byte count too big. %d > %d\n",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)hba->sli.sli4.dump_region.virt,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (ByteCountRem < DUMP_BC_MAX) ? ByteCountRem :
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varDmp.word_cnt = ByteCountReq / 4;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to read config region. id=%x "\
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "offset=%x status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Note: for Type 2/3 Dumps, varDmp.word_cnt is */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* actually a byte count. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* if no more data returned */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "read_cfg_region: " \
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Byte count too big. %d > %d\n",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bcopy((uint8_t *)&mb->un.varDmp.resp_offset, pLocalBuf,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_read_cfg_region() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Dump Generators, Low-Level */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fprintf(fpTxtFile, "%s: %s\n", pSidLegend,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)pString, strlen(pString), 1,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)pString, strlen(pString), 1,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_string_txtfile() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Legend String to the TXT File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fprintf(fpTxtFile, "%s: %s\n", pSidLegend, pLidLegend);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the buffer to the TXT File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (j = 0; j < WordCount; j++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((j & 0x03) == 0) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf1, sizeof (buf1), "\n%04x:", j * 4);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld /* print 1 word */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf1, sizeof (buf1), " %08x", ptr[j]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)buf2, strlen(buf2), 1,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_word_txtfile() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Legend SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Argument SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Legend String to the DMP File, including a Null Byte */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fprintf(fpDmpFile, "%s: %s", pSidLegend, pLidLegend);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Argument SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Buffer Length to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan length = (uint32_t)(strlen(pString) + 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_LITTLE_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Argument String to the DMP File, including a Null Byte */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)pString, strlen(pString), 1, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* check file size.. pad as necessary */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_string_dmpfile() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************** */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* emlxs_dump_word_dmpfile */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* If little endian, just write the buffer normally. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* However, if Big Endian... Consider the following: */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Automatic Dump, initiated by driver, Port Offline (FW WarmStart Mode), */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Mailbox in SLIM. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* On-Demand Dump, initiated by utility, Port Online (FW Normal Mode), */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Mailbox in Host Memory. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* We use the same IOCTL to get the DUMP Data, for both cases. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* However, it normalizes the data before delivering it to us. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* In the Dump File, we must always write the data in native mode. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* So, if Big Endian, On-demand Dump, we must swap the words. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < bufferLen / 4; i++, wptr++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fwrite((uint8_t *)wptr, 4, 1, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_word_dmpfile() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Argument SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan b = (uint8_t)entry.un.PortBlock.un.s.sid;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Buffer Length to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write address to the DMP File */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_LITTLE_ENDIAN */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Write Buffer Length to the DMP File */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Write address to the DMP File */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_port_block() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Argument SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan b = (uint8_t)entry.un.PortStruct.un.s.sid;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Element Length to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan b = (uint8_t)entry.un.PortStruct.un.s.length;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Element Count to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Address to the DMP File */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_LITTLE_ENDIAN */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Write Element Count to the DMP File */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Write Address to the DMP File */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_port_struct() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Legend SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Argument SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Legend String to the DMP File, including a Null Byte */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fprintf(fpDmpFile, "%s: %s", pSidLegend, pLidLegend);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Argument SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Buffer Length to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_LITTLE_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan byte = (uint8_t)((length & 0xFF0000) >> 16);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan byte = (uint8_t)((length & 0x00FF00) >> 8);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_host_block() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Legend SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Argument SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Legend String to the DMP File, including a Null Byte */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fprintf(fpDmpFile, "%s: %s", pSidLegend, pLidLegend);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Argument SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Element Length to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write Element Count to the DMP File */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_LITTLE_ENDIAN */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_word_dmpfile(fpDmpFile, pBuffer, bufferLen, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_host_struct() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Dump Generators, Mid-Level */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* vars used to build the Dump String */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf1 = (char *)kmem_zalloc(8192, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf2 = (char *)kmem_zalloc(8192, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Driver Parameters Heading */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "IDX string Low "\
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "High Def Cur Exp Dyn");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Build the buffer containing all the Driver Params */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < NUM_CFG_PARAM; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "\n %02x: %25s %8x %8x %8x %8x %4x %4x", i,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cfg[i].string, cfg[i].low, cfg[i].hi, cfg[i].def,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan cfg[i].current, (cfg[i].flags & PARM_HIDDEN) ? 0 : 1,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_DP_TABLE,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_DP_TABLE,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_parm_table() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* vars used to build the Dump String */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Model into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%s", vpd->model);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf1, "Model: ", sizeof (buf1));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Model Description into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%s", vpd->model_desc);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, "\n Description: ", sizeof (buf1));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_model() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* vars used to build the Dump String */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the WWPN into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf1, "Port WWN: ", sizeof (buf1));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < 7; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x:", *p++);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x", *p++);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the WWNN into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, "\n Node WWN: ", sizeof (buf1));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < 7; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x:", *p++);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%02x", *p++);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_wwn() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* vars used to build the Dump String */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Serial Number into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "%s", vpd->serial_num);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf1, LEGEND_HBA_SN, sizeof (buf1));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_serial_number() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Firmware Version into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->fw_version);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf1, LEGEND_HBA_FW_VERSION, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Operational FW Version into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->opFwName);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_OPVERSION, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the SLI-1 FW Version into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->sli1FwName);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_SLI1VERSION, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the SLI-2 FW Version into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->sli2FwName);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_SLI2VERSION, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the SLI-3 FW Version into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->sli3FwName);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_SLI3VERSION, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Kernel FW Version into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->postKernName);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_FW_KERNELVERSION, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_FW_VERSION);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_fw_version() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (strcmp(vpd->fcode_version, "none") == 0)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (strcmp(vpd->boot_version, "none") == 0)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_SPARC */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Boot Bios State into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, " %d", state);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf1, LEGEND_HBA_BB_STATE, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Boot Bios Version into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", "unknown");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s (FCode)",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", vpd->boot_version);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_SPARC */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, LEGEND_HBA_BB_VERSION, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_HBA_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_HBA_INFO, LEGEND_HBA_BB_VERSION);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_boot_version() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Initial ID into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s: %08x %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pBuffer->InitialId[0], pBuffer->InitialId[1]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Flags Word into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x", LEGEND_CR4_FLAGS,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Boot Bios ID into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pBuffer->BootBiosId[0], pBuffer->BootBiosId[1]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the SLI1 ID into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pBuffer->Sli1Id[0], pBuffer->Sli1Id[1]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the SLI2 ID into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pBuffer->Sli2Id[0], pBuffer->Sli2Id[1]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the SLI3 ID into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pBuffer->Sli3Id[0], pBuffer->Sli3Id[1]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the SLI4 ID into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pBuffer->Sli4Id[0], pBuffer->Sli4Id[1]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Erom ID into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "\n %s: %08x %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pBuffer->EromId[0], pBuffer->EromId[1]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_CONFIG_REGION,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_cfg_region4_decoded() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fDone = FALSE; /* flag to exit VPD loop */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* If Big Endian, swap the data in place, */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* because it's PCI Data (Little Endian) */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < (int)ByteCount / 4; i++, wptr++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Decode the VPD Data and write it into the buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* CR 26941 */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* NOTE: The following code is correct, */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* should work, and used to work. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* pBuffer points to char, and the symbol VPD_TAG_82 is 0x82. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* The test is an equality test, not a relational test. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* The compiler should generate an 8 bit test, and */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* sign extension does not apply. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* I don't know when or why it stopped working, */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* and don't have time to dig. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* The cast fixes it. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (((unsigned char)pBuffer[0]) != VPD_TAG_82) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "Bad VPD Data: (w0=0x%08x)", *(uint32_t *)pBuffer);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } else { /* begin good data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan length > buf2_size ? buf2_size : length);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* end switch */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* end while */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* good data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_CONFIG_REGION,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_cfg_region14_decoded() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t RetByteCount = 0; /* returned byte count */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_LITTLE_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (uint32_t *)kmem_zalloc(DUMP_MAX_CONFIG_REGION_LENGTH, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_read_cfg_region(hba, Region, DUMP_MAX_CONFIG_REGION_LENGTH,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(buffer, DUMP_MAX_CONFIG_REGION_LENGTH);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Data into the buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < (int)RetByteCount / 4; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((i % 8 == 0) && (i != 0)) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat((char *)buf1, "\n ", buf1_size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%08x, ", buffer[i]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat((char *)buf1, buf2, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_CONFIG_REGION,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_host_block(fpDmpFile,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan SID_CONFIG_REGION, LEGEND_CONFIG_REGION, pLidLegend, fSwap);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region4_decoded(hba, fpTxtFile, pLidLegend,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (DUMP_WAKE_UP_PARAMS *)buffer, RetByteCount);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region14_decoded(hba, fpTxtFile,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pLidLegend, (char *)buffer, RetByteCount);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(buffer, DUMP_MAX_CONFIG_REGION_LENGTH);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_cfg_region() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 1,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 2,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 3,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 4,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 5,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 6,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 7,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 8,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 9,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 10,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 11,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 12,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 13,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 14,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 15,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 16,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 17,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 18,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 19,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 20,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 21,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 22,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 23,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 24,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 25,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 26,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 27,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 28,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 29,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 30,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 31,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_cfg_region(hba, fpTxtFile, fpDmpFile, 32,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_cfg_regions() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* First, write the OS Name string into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf1, utsname.sysname, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Second, write the Version Info into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, ", %s", utsname.release);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_REV_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_REV_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_REV_INFO, LEGEND_REV_OS_VERSION);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_os_version() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf1 = (char *)kmem_zalloc(buf1_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf2 = (char *)kmem_zalloc(buf2_size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Driver Type into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf1, "Driver Type: ", buf1_size);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, DUMP_DRV_LEADVILLE, buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Driver Name into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", DRIVER_NAME);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, "\n Driver Name: ", buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the Driver Version into the buffer */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, buf2_size, "%s", emlxs_version);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(buf1, "\n Driver Version: ", buf1_size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_REV_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_dmpfile(fpDmpFile, buf1, SID_REV_INFO,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_REV_INFO, LEGEND_REV_DRV_VERSION);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_drv_version() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Create the Dump Files */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((*fpTxtFile = emlxs_fopen(hba, EMLXS_TXT_FILE)) == NULL) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if ((hba->model_info.device_id == PCI_DEVICE_ID_HORNET) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_fopen(hba, EMLXS_CEE_FILE)) == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((*fpDmpFile = emlxs_fopen(hba, EMLXS_DMP_FILE)) == NULL) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Initialize the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the single-byte Dump Identification */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* SID to the DMP File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_fputc(SID_DUMP_ID_LE, *fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_LITTLE_ENDIAN */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_fputc(SID_DUMP_ID_BE, *fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_file_create() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write a suitable string to the Dump TXT File */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_fprintf(fpTxtFile, "Dump File End\n");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.device_id == PCI_DEVICE_ID_HORNET) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_fprintf(fpCeeFile, "Dump File End\n");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the single-byte Dump Termination SID to the DMP File */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_file_terminate() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_file_close() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Dump Generators, High Level */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_os_version(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_drv_version(hba, fpTxtFile, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_rev_info() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_model(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_wwn(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_serial_number(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_fw_version(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_boot_version(hba, fpTxtFile, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_hba_info() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* emlxs_dump_table_check */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Examine Dump Table, and determine its size. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Count and include ID SIDs, and the TERM SID, */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* but not the Pointer at Addr 654. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* See comments for CC_DUMP_USE_ALL_TABLES for additional description. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fDone = FALSE; /* loop control flag */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t tableSize = 0; /* dump table size (word count) */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Read 1 word from low memory at address 654; */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* save the returned Dump Table Base Address */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Read the dump table address */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to read dump table address. "\
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "offset=0x654 status=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan DumpTableAddr = mb->un.varDmp.resp_offset;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Now loop reading Dump Table Entries.. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* break out when we see a Terminator SID */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_dump(hba, mbq, DumpTableAddr, 2);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to read dump table entry. "\
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "offset=%x status=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan entry.un.PortBlock.un.w[0] = mb->un.varWords[4];
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New Dump Table */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New Dump Table */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New Dump Table */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* CC_DUMP_USE_ALL_TABLES */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Dump Table(s) Termination - all done */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Dump Table Entry */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* end while */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan *pSize = (tableSize * 4); /* return the total Dump Table size */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_table_check() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************ */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* emlxs_dump_table_read */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Read the Dump Table and store it, for use */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* subsequently in emlxs_dump_hba_memory. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* See comments for CC_DUMP_USE_ALL_TABLES for additional description. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************ */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* First, check the dump table and if valid, get its size */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_table_check(hba, pDumpTableSize);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan buf1 = (char *)kmem_zalloc(size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Allocate a buffer to hold the Dump Table */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan *ppDumpTable = (uint32_t *)kmem_zalloc(*pDumpTableSize, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Read 1 word from low memory at address 654; */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* save the returned Dump Table Base Address */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Read the dump table address */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) != MBX_SUCCESS) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to read dump table address. "\
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "offset=0x654 status=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan DumpTableAddr = mb->un.varDmp.resp_offset;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Now loop reading Dump Table Entries.. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* break out when we see a Terminator SID */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_dump(hba, mbq, DumpTableAddr, 2);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to read dump table entry. "\
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "offset=%x status=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n Addr=%08x: ",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan entry.un.PortBlock.un.w[0] = mb->un.varWords[4];
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan *pDumpTableEntry++ = mb->un.varWords[4];
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New Dump Table */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New Dump Table */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New Dump Table */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* CC_DUMP_USE_ALL_TABLES */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Dump Table(s) Termination - all done */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Dump Table Entry */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan entry.un.PortBlock.un.w[1] = mb->un.varWords[5];
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan *pDumpTableEntry++ = mb->un.varWords[5];
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "w0=%08x, w1=%08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* end while */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, buf1, LEGEND_HBA_MEM_DUMP,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(*ppDumpTable, *pDumpTableSize);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_table_read() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* emlxs_dump_hba_memory */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Guided by the Dump Table previously read in, */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* generate the Port Memory Dump. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* See comments for CC_DUMP_USE_ALL_TABLES for additional description. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* loop reading Dump Table Entries.. break out when */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* we see a Terminator SID */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan entry.un.PortBlock.un.w[0] = *pDumpTable++;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New Dump Table */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New Dump Table */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* New Dump Table */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* CC_DUMP_USE_ALL_TABLES */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Dump Table(s) Termination - all done */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Dump Table Entry */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan entry.un.PortBlock.un.w[1] = *pDumpTable++;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (entry.un.PortBlock.un.w[1] == 0x3E0000) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* CC_DUMP_FW_BUG_1 */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Check if indirect address, and */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* obtain the new address if so */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((entry.un.PortBlock.un.s.addr & 0x80000000) != 0) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to read dump table entry. "\
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "offset=%x status=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* replace the indirect address in the */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Dump Table */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* determine byte count to dump */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (entry.un.PortBlock.un.s.sid & SID_MULT_ELEM) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (entry.un.PortStruct.un.s.count == 0) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Dump: addr=%x count=%d total=%d", offset,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* allocate a buffer to receive the dump data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pBuf = (uint8_t *)kmem_zalloc(byteCount, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* loop issuing MBX commands, 18x measly words at */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* init vars */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan portAddr = entry.un.PortBlock.un.s.addr;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_mb_dump(hba, mbq, portAddr, wcount);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to read dump table entry."\
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan " offset=%x wc=%d status=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bcopy((uint8_t *)&mb->un.varWords[4], p1,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan byteCountRem -= (mb->un.varDmp.word_cnt * 4);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan portAddr += (mb->un.varDmp.word_cnt * 4);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* end for */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* end switch */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* end while */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_hba_memory() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode >= EMLXS_HBA_SLI4_MODE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* HBA should be in WARM state here */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_table_read(hba, fpTxtFile, &pDumpTable,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_hba_memory(hba, fpDmpFile, pDumpTable);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_hba() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* emlxs_dump_drv_region */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Common subroutine for all the Dump_Sli"Structures" Routines */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* NOTE: This routine does not free pBuf. This is by design. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* The caller does it. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* ************************************************************************* */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan{ /* ptr to length of buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_get_dump_region(hba, regionId, NULL, &size);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Now that we know the required length, request the actual data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan *pBuf = (uint8_t *)kmem_zalloc(size, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_get_dump_region(hba, regionId, *pBuf, &size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_drv_region() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_SLI_REGS, &pBuf, &bufLen);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_SLI_REGS,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_SLI_REGS, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_sli_regs() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_SLIM, &pBuf, &bufLen);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* The SLIM Dump is only useful if it's a */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Driver-Initiated dump, say, after a HW Error */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_word_txtfile(fpTxtFile, (uint32_t *)pBuf,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan 0x40, LEGEND_SLI_STRUCTURES, LEGEND_SLIM);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_SLIM,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_SLIM, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_slim() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_PCB, &pBuf, &bufLen);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_PCB,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_PCB, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_pcb() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_MBX, &pBuf, &bufLen);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_MBX,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_MBX, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_mbox() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_HOST_PTRS, &pBuf, &bufLen);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_HOST_PTRS,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_HOST_PTRS, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_host_pointers() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_PORT_PTRS, &pBuf, &bufLen);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_PORT_PTRS,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_PORT_PTRS, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_port_pointers() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_RINGS, &pBuf, &bufLen);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_host_struct(fpDmpFile, pBuf, bufLen, sizeof (IOCB),
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bufLen / sizeof (IOCB), SID_RINGS, LEGEND_SLI_STRUCTURES,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_rings() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint8_t *pBuf; /* ptr to data buffer to receive Dump Region Data */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan uint32_t bufLen = 0; /* length of buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan int fSwap = FALSE; /* flag to pass to emlxs_dump_word_dmpfile */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_drv_region(hba, DR_INTERNAL, &pBuf, &bufLen);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_host_block(fpDmpFile, pBuf, bufLen, SID_INTERNAL_SOL,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_SLI_STRUCTURES, LEGEND_DRIVER_SPEC, fSwap);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_drv_internals() */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* HBA should be in OFFLINE state here */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_sli_regs(hba, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_slim(hba, fpTxtFile, fpDmpFile, dump_type);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_host_pointers(hba, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_port_pointers(hba, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_rings(hba, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_drv_internals(hba, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_sli_interface() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Get Config Command vars */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan menlo_get_config_rsp_t *pGcBuf = &GcBuf;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Get Log Config Command vars */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Get Log Data Command vars */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Get Panic Log Command vars */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld if (hba->model_info.device_id != PCI_DEVICE_ID_HORNET) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* First, issue a GetConfig command, which gives us */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* the Log Config and Panic Log sizes */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_menlo_get_cfg(hba, pGcBuf, sizeof (menlo_get_config_rsp_t));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pLcBuf = (menlo_rsp_t *)kmem_zalloc(LcBufSize, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan RmStatus = emlxs_menlo_get_logcfg(hba, pLcBuf, LcBufSize);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_MENLO_LOG_CONFIG, LEGEND_NULL, 0);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pLcEntry = (menlo_log_t *)&pLcBuf->log_cfg.data;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "LogId Entries Size Name");
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n----- ------- ---- ----");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan RmStatus = emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < (int)NumLogs; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "\n %2d %4d %4d %s",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pLcEntry[i].entry_size, pLcEntry[i].name);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Now issue a series of GetLogData commands, */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* which gives us the actual Logs */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < (int)NumLogs; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (pLcEntry[i].num_entries *pLcEntry[i].entry_size) + 8;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pLdBuf = (menlo_rsp_t *)kmem_zalloc(LdBufSize, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan RmStatus = emlxs_menlo_get_log(hba, i, pLdBuf, LdBufSize);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* print a caption for the current log */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n\nLog %d:", i);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), " %s", pLcEntry[i].name);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (j = 0; j < 75; j++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* check the head entry to determine whether */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* the log has wrapped or not */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pLogEntry = (uint8_t *)&pLdBuf->log.data;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (char *)&(pLogEntry[Head *pLcEntry[i].entry_size]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* if log is wrapped, get entries from the */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Head through the End */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (j = Head; j < (int)pLcEntry[i].num_entries; j++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* if wrapped or not, get entries from the Top */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* through the Head */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (j = 0; j < Head; j++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (char *)&(pLogEntry[j * pLcEntry[i].entry_size]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n%3d: %s", j,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } /* end for i */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Now issue a GetPanicLog command, which gives us the Panic Log */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* print a caption for the current log */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf1, LEGEND_MENLO_LOG_PANIC_REGS, sizeof (buf1));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (j = 0; j < 75; j++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan RmStatus = emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pPlBuf = (menlo_rsp_t *)kmem_zalloc(PlBufSize, KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan RmStatus = emlxs_menlo_get_paniclog(hba, pPlBuf, PlBufSize);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nType = %x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nRegsEpc = %08x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nRegsCp0Cause = %08x",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nRegsCp0Stat = %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < MENLO_NUM_GP_REGS; i++) {
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "\nRegsGp[%02x] = %08x", i,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nLogPresent = %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan PanicLogEntryCount = pPlBuf->panic_log.num_entries;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nNumEntries = %08x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan PanicLogEntrySize = pPlBuf->panic_log.entry_size;
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nEntrySize = %d.",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\nHead Entry = %d.",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* print a caption for the current log */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(buf1, LEGEND_MENLO_LOG_PANIC_LOGS,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (j = 0; j < 75; j++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0, 1);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* check the head entry to determine whether the */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* log has wrapped or not */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pLogEntry = (uint8_t *)&pPlBuf->panic_log.data;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan pLogString = (char *)&(pLogEntry[Head * PanicLogEntrySize]);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* if log is wrapped, get entries from the */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Head through the End */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (j = Head; j < (int)PanicLogEntryCount; j++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* if wrapped or not, get entries from the Top */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* through the Head */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (j = 0; j < Head; j++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (char *)&(pLogEntry[j * PanicLogEntrySize]);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(buf2, sizeof (buf2), "\n%3d: %s", j,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpCeeFile, buf1, 0, 0,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan RmStatus = emlxs_dump_string_txtfile(fpCeeFile, "\n\n", 0, 0, 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_menlo_log() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* EMLXS_BIG_ENDIAN */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->model_info.chip != EMLXS_SATURN_CHIP) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ), KM_SLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Step 1: Call MBX_READ_EVENT_LOG_STATUS to get the log size. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < 10; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mb->mbxCommand = MBX_READ_EVENT_LOG_STATUS;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) ==
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to read event log status. status=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((mb->mbxStatus & 0xFFFF) == MBXERR_NOT_SUPPORTED ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (mb->mbxStatus & 0xFFFF) == MBX_DRVR_ERROR) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* The call to get the log size simply fails. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Retry up to 10 times. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((mb->mbxStatus & 0xFFFF) != MBX_BUSY) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Mailbox fails for some unknown reason. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Put something in the txt to indicate this case. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (i >= 10) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan NV_LOG_NOT_INCLUDED_IN_DMP, LEGEND_NON_VOLATILE_LOG,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Step 2: Use the log size from step 1 to call MBX_READ_EVENT_LOG */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((mp = emlxs_mem_buf_alloc(hba, logSize)) == 0) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to allocate receive buffer. "
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (offset = 0; offset < logSize; offset = offset + 1024) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan tempAddress = (uintptr_t)(mp->phys + offset);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mb->mbxCommand = MBX_READ_EVENT_LOG; /* 0x38 */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mb->un.varRdEvtLog.read_log = 1; /* read log */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mb->un.varRdEvtLog.mbox_rsp = 0; /* not using Mailbox */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.tus.f.bdeFlags = 0x0;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mb->un.varRdEvtLog.un.sp64.tus.f.bdeSize = block_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdEvtLog.un.sp64.addrLow = PADDR_LO(tempAddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mb->un.varRdEvtLog.un.sp64.addrHigh = PADDR_HI(tempAddress);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_init_debug_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Unable to read event log. status=%x",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Step 3: Dump the log to the DMP file as raw data. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write a string to text file to direct the user to the DMP */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* file for the actual log. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, NV_LOG_INCLUDED_IN_DMP,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan LEGEND_NON_VOLATILE_LOG, LEGEND_NULL, 0);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write the real log to the DMP file. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MPDATA_SYNC(mp->dma_handle, 0, logSize, DDI_DMA_SYNC_FORKERNEL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_dump_host_block(fpDmpFile, mp->virt, logSize,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan SID_NON_VOLATILE_LOG, LEGEND_NON_VOLATILE_LOG, LEGEND_NULL,
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan if (emlxs_fm_check_dma_handle(hba, mp->dma_handle)
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "dump_saturn_log: hdl=%p",
b3660a963b4e1d5319365d4d7c34beb66fb5abc7Sukumar Swaminathan#endif /* FMA_SUPPORT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_saturn_log() */
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((hba->model_info.chip != EMLXS_BE2_CHIP) &&
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Querying FAT...");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan mbq = (MAILBOXQ *)kmem_zalloc(sizeof (MAILBOXQ),
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if ((mp = emlxs_mem_buf_alloc(hba, (sizeof (mbox_req_hdr_t) +
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (IOCTL_COMMON_MANAGE_FAT) + BE_MAX_XFER_SIZE))) == NULL) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Unable to allocate FAT buffer.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Query FAT */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_req->subsystem = IOCTL_SUBSYSTEM_COMMON;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_req->opcode = COMMON_OPCODE_MANAGE_FAT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_req->req_length = sizeof (IOCTL_COMMON_MANAGE_FAT);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat = (IOCTL_COMMON_MANAGE_FAT *)(hdr_req + 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat->params.request.fat_operation = QUERY_FAT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat->params.request.read_log_offset = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat->params.request.read_log_length = 0;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat->params.request.data_buffer_size = BE_MAX_XFER_SIZE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "FAT Query failed. status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan log_size = fat->params.response.log_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan buffer_size = fat->params.response.log_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore "Unable to allocate log buffer.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Upload Log */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Uploading log... (%d bytes)", log_size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan bzero((void *) mb, MAILBOX_CMD_SLI4_BSIZE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan xfer_size = min(BE_MAX_XFER_SIZE, log_size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_req->subsystem = IOCTL_SUBSYSTEM_COMMON;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan hdr_req->opcode = COMMON_OPCODE_MANAGE_FAT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan sizeof (IOCTL_COMMON_MANAGE_FAT) + xfer_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat = (IOCTL_COMMON_MANAGE_FAT *)(hdr_req + 1);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat->params.request.fat_operation = RETRIEVE_FAT;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat->params.request.read_log_offset = offset;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat->params.request.read_log_length = xfer_size;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan fat->params.request.data_buffer_size = BE_MAX_XFER_SIZE;
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0) !=
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Failed to upload log. status=%x",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan payload = (uint8_t *)(&fat->params.response.data_buffer);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan BE_SWAP32_BCOPY(payload, bptr, xfer_size);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Log upload complete.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Write a string to text file to direct the user to the CEE */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* file for the actual log. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan emlxs_dump_string_txtfile(fpTxtFile, NV_LOG_INCLUDED_IN_FAT,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan LEGEND_NON_VOLATILE_LOG, LEGEND_NULL, 0);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Write the log to the CEE file. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* First word is the log size */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan log_size = buffer_size - sizeof (uint32_t);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan rval = emlxs_dump_word_dmpfile(fpCeeFile, (uint8_t *)bptr,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Dump complete.");
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_tigershark_log() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "User Event: Firmware core dump initiated...");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_file_create(hba, &fpTxtFile, &fpDmpFile, &fpCeeFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_rev_info(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_hba_info(hba, fpTxtFile, fpDmpFile, DUMP_TYPE_USER);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_parm_table(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_cfg_regions(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (hba->model_info.chip == EMLXS_SATURN_CHIP) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_ONDI);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_saturn_log(hba, fpTxtFile, fpDmpFile);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((hba->model_info.chip == EMLXS_BE2_CHIP) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_tigershark_log(hba, fpTxtFile, fpCeeFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_DIAGDI);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_sli_interface(hba, fpTxtFile, fpDmpFile,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_WARMDI);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_hba(hba, fpTxtFile, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_ONDI);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan status = emlxs_menlo_set_mode(hba, MENLO_MAINTENANCE_MODE_ENABLE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_menlo_log(hba, fpCeeFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_file_terminate(hba, fpTxtFile, fpDmpFile, fpCeeFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_file_close(fpTxtFile, fpDmpFile, fpCeeFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_user_event() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* misc vars */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan char sBuf1[512]; /* general purpose string buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan char sBuf2[256]; /* general purpose string buffer */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan char sBuf3[256]; /* general purpose string buffer */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Temperature Event: type=%d temp=%d. "\
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "Invalid SLI4 event.",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Temperature Event: type=%d temp=%d. "\
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Firmware core dump initiated...",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan status = emlxs_dump_file_create(hba, &fpTxtFile, 0, 0);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Now generate the Dump */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* Note: ignore return (status); if one part fails, */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* keep trying to dump more stuff. */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Write a warning at the top of the file */
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcpy(sBuf1, "WARNING: HBA Temperature Event:\n",
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) snprintf(sBuf3, sizeof (sBuf3), " Temperature = %d\n\n", temp);
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(sBuf1, sBuf2, sizeof (sBuf1));
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld (void) strlcat(sBuf1, sBuf3, sizeof (sBuf1));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_string_txtfile(fpTxtFile, sBuf1, 0, 0, 0);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_rev_info(hba, fpTxtFile, NULL);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_hba_info(hba, fpTxtFile, NULL, DUMP_TYPE_TEMP);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_file_terminate(hba, fpTxtFile, NULL, NULL);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_file_close(fpTxtFile, NULL, NULL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_temp_event() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Dump Event: Firmware core dump initiated...");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan emlxs_dump_file_create(hba, &fpTxtFile, &fpDmpFile, &fpCeeFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (hba->model_info.chip == EMLXS_SATURN_CHIP) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_ONDI);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_saturn_log(hba, fpTxtFile, fpDmpFile);
a9800beb32c1006bb21c8da39e0180ea440b7badGarrett D'Amore if ((hba->model_info.chip == EMLXS_BE2_CHIP) ||
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_tigershark_log(hba, fpTxtFile, fpCeeFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_DIAGDI);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_sli_interface(hba, fpTxtFile, fpDmpFile,
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan if (hba->sli_mode <= EMLXS_HBA_SLI3_MODE) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_WARMDI);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_hba(hba, fpTxtFile, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan status = emlxs_menlo_set_mode(hba, MENLO_MAINTENANCE_MODE_ENABLE);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_menlo_log(hba, fpCeeFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Now generate the rest of the Dump */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_rev_info(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_hba_info(hba, fpTxtFile, fpDmpFile, DUMP_TYPE_DRIVER);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_parm_table(hba, fpTxtFile, fpDmpFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_cfg_regions(hba, fpTxtFile, fpDmpFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_dump_file_terminate(hba, fpTxtFile, fpDmpFile, fpCeeFile);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_file_close(fpTxtFile, fpDmpFile, fpCeeFile);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan /* The last step of the Menlo Dump. */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_menlo_reset(hba, MENLO_FW_OPERATIONAL);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan (void) emlxs_set_hba_mode(hba, DDI_WARMDI);
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_drv_event() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Clear the Dump flag */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_drv_thread() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Clear the Dump flag */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_user_thread() */
bb63f56ebeb244bd34f5e8d50900e3420f01b394Sukumar Swaminathan dump_temp_event_t *temp_event = (dump_temp_event_t *)arg1;
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (void) emlxs_dump_temp_event(temp_event->hba, temp_event->type,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Free the temp event object */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan kmem_free(temp_event, sizeof (dump_temp_event_t));
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Clear the Dump flag */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan} /* emlxs_dump_temp_thread() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* Schedules a dump thread */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan/* temp_type and temp are only valid for type=EMLXS_TEMP_DUMP */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_dump(emlxs_hba_t *hba, uint32_t type, uint32_t temp_type, uint32_t temp)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Check if it is safe to dump */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "dump: Dump disabled.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Check if a dump is already in progess */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "dump: Dump already in progress.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Prepare to schedule dump */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan temp_event = (dump_temp_event_t *)kmem_alloc(
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan sizeof (dump_temp_event_t), KM_NOSLEEP);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "dump: Unable to allocate temp object.");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_fw_dump_msg,
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "dump: Error: Unknown dump type. (%x)",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Set the Dump-in-progess flag */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Create a separate thread to run the dump event */
bb63f56ebeb244bd34f5e8d50900e3420f01b394Sukumar Swaminathan emlxs_thread_spawn(hba, emlxs_dump_drv_thread, NULL, NULL);
bb63f56ebeb244bd34f5e8d50900e3420f01b394Sukumar Swaminathan emlxs_thread_spawn(hba, emlxs_dump_temp_thread,
bb63f56ebeb244bd34f5e8d50900e3420f01b394Sukumar Swaminathan emlxs_thread_spawn(hba, emlxs_dump_user_thread, NULL, NULL);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan} /* emlxs_dump() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Wait for the Dump flag to clear */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan} /* emlxs_dump_wait() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan#endif /* DUMP_SUPPORT */