fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * CDDL HEADER START
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * The contents of this file are subject to the terms of the
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * Common Development and Distribution License (the "License").
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * 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.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * See the License for the specific language governing permissions
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * and limitations under the License.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * When distributing Covered Code, include this CDDL HEADER in each
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * If applicable, add the following below this CDDL HEADER, with the
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * fields enclosed by brackets "[]" replaced with your own identifying
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * information: Portions Copyright [yyyy] [name of copyright owner]
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * CDDL HEADER END
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld * Copyright (c) 2004-2011 Emulex. All rights reserved.
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan * Use is subject to license terms.
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * MDB module linkage information:
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld { DRIVER_NAME"_msgbuf", "<instance>", "dumps the "DRIVER_NAME
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld " driver internal message buffer", emlxs_msgbuf, emlxs_msgbuf_help},
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld { DRIVER_NAME"_dump", "<type> <instance>", "dumps the "DRIVER_NAME
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld " driver firmware core", emlxs_dump, emlxs_dump_help},
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte * emlxs_msgbuf library
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf("Usage: ::%s_msgbuf <instance(hex)>\n\n", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" <instance> This is the %s driver instance " \
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte} /* emlxs_msgbuf_help() */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forteint emlxs_msgbuf(uintptr_t base_addr, uint_t flags, int argc,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf("Usage: ::%s_msgbuf <instance(hex)>\n",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mdb_printf("mdb: try \"::help %s_msgbuf\" for more information",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Get the device address */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mdb_snprintf(buffer, sizeof (buffer), "%s_device", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Get the device instance table */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mdb_snprintf(buffer, sizeof (buffer), "%s_instance", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mdb_snprintf(buffer2, sizeof (buffer2), "%s not found.\n",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Get the device instance count */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mdb_snprintf(buffer, sizeof (buffer), "%s_instance_count", DRIVER_NAME);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (mdb_readvar(&instance_count, buffer) == -1) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mdb_snprintf(buffer2, sizeof (buffer2), "%s not found.\n",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte ddiinst = (uint32_t)mdb_strtoull(argv[0].a_un.a_str);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte for (brd_no = 0; brd_no < instance_count; brd_no++) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mdb_warn("Device instance not found. ddinst=%d\n", ddiinst);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if buffer is null */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mdb_warn("Device instance not found. ddinst=%d\n", ddiinst);
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (mdb_vread(&log, sizeof (emlxs_msg_log_t), addr) !=
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if buffer is empty */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Get last entry id saved */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Check if buffer has already been filled once */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Buffer not yet filled */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Get the total number of messages available for return */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Print the messages */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte for (i = 0; i < count; i++) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte if (mdb_vread(&entry, sizeof (emlxs_msg_entry_t),
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte (uintptr_t)&log.entry[idx]) != sizeof (emlxs_msg_entry_t)) {
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte mdb_warn("Cannot read log entry. index=%d count=%d\n",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Generate the message string */
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "[%Y:%03d:%03d:%03d] "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%6d:[%1X.%04X]%s:%7s:%4d:\n%s\n(%s)\n",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "[%Y:%03d:%03d:%03d] "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%6d:[%1X.%04X]%s:%7s:%4d:\n%s\n",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "[%Y:%03d:%03d:%03d] "
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte "%6d:[%1X.%04X]%s:%7s:%4d:\n(%s)\n",
825277341c15b6b0d2c4b8b622ae7b1d2bdc0390Sukumar Swaminathan "[%Y:%03d:%03d:%03d] "
8f23e9fa8abcb5857661066b954e63400d589b65Hans Rosenfeld "%6d:[%1X.%04X]%s:%7s:%4d:\n%s\n",
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte /* Increment index */
fcf3ce441efd61da9bb2884968af01cb7c1452ccJohn Forte} /* emlxs_msgbuf() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf("Usage: ::%s_dump all <instance(hex)>\n", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" ::%s_dump txt <instance(hex)>\n", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" ::%s_dump dmp <instance(hex)>\n", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" ::%s_dump cee <instance(hex)>\n", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" txt Display firmware text summary " \
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" dmp Display firmware dmp binary file.\n");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" cee Display firmware cee binary file. " \
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "(FCOE adapters only)\n");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" all Display all firmware core files.\n");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" <instance> This is the %s driver instance " \
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf(" (e.g. 0, 1,..., e, f, etc.)\n");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan} /* emlxs_dump_help() */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathanemlxs_dump(uintptr_t base_addr, uint_t flags, int argc,
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if ((strcmp(argv[0].a_un.a_str, "all") == 0) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (strcmp(argv[0].a_un.a_str, "ALL") == 0) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (strcmp(argv[0].a_un.a_str, "All") == 0)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } else if ((strcmp(argv[0].a_un.a_str, "txt") == 0) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (strcmp(argv[0].a_un.a_str, "TXT") == 0) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (strcmp(argv[0].a_un.a_str, "Txt") == 0)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } else if ((strcmp(argv[0].a_un.a_str, "dmp") == 0) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (strcmp(argv[0].a_un.a_str, "DMP") == 0) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (strcmp(argv[0].a_un.a_str, "Dmp") == 0)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan } else if ((strcmp(argv[0].a_un.a_str, "cee") == 0) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (strcmp(argv[0].a_un.a_str, "CEE") == 0) ||
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan (strcmp(argv[0].a_un.a_str, "Cee") == 0)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Get the device address */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_snprintf(buffer, sizeof (buffer), "%s_device", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (mdb_readvar(&device, buffer) == -1) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Is the %s driver loaded ?\n", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Get the device instance table */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_snprintf(buffer, sizeof (buffer), "%s_instance", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (mdb_readvar(&instance, buffer) == -1) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_snprintf(buffer2, sizeof (buffer2), "%s not found.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Is the %s driver loaded ?\n", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan /* Get the device instance count */
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_snprintf(buffer, sizeof (buffer), "%s_instance_count", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (mdb_readvar(&instance_count, buffer) == -1) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_snprintf(buffer2, sizeof (buffer2), "%s not found.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan "Is the %s driver loaded ?\n", DRIVER_NAME);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan ddiinst = (uint32_t)mdb_strtoull(argv[1].a_un.a_str);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (brd_no = 0; brd_no < instance_count; brd_no++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("Device instance not found. ddinst=%d\n", ddiinst);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan addr = (uintptr_t)device.dump_txtfile[brd_no];
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("TXT file: Device instance not found. " \
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (mdb_vread(&dump_txtfile, sizeof (dump_txtfile), addr)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("TXT file: Unable to read %d bytes @ %llx.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf("TXT file: Not available.\n");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bptr = (uint8_t *)mdb_zalloc(size, UM_SLEEP|UM_GC);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("TXT file: Unable to allocate file buffer. " \
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (mdb_vread(bptr, size, (uintptr_t)dump_txtfile.buffer)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("TXT file: Unable to read %d bytes @ %llx.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan addr = (uintptr_t)device.dump_dmpfile[brd_no];
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("DMP file: Device instance not found. " \
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (mdb_vread(&dump_dmpfile, sizeof (dump_dmpfile), addr)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("DMP file: Unable to read %d bytes @ %llx.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf("DMP file: Not available.\n");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bptr = (uint8_t *)mdb_zalloc(size, UM_SLEEP|UM_GC);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("DMP file: Unable to allocate file buffer. " \
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (mdb_vread(bptr, size, (uintptr_t)dump_dmpfile.buffer)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("DMP file: Unable to read %d bytes @ %llx.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < size; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (i && !(i % 16)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(i % 16)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(i % 4)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; size < 16 && i < size; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(i % 4)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan addr = (uintptr_t)device.dump_ceefile[brd_no];
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("CEE file: Device instance not found. " \
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (mdb_vread(&dump_ceefile, sizeof (dump_ceefile), addr)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("CEE file: Unable to read %d bytes @ %llx.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf("CEE file: Not available.\n");
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan bptr = (uint8_t *)mdb_zalloc(size, UM_SLEEP|UM_GC);
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("CEE file: Unable to allocate file buffer. " \
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (mdb_vread(bptr, size, (uintptr_t)dump_ceefile.buffer)
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_warn("CEE file: Unable to read %d bytes @ %llx.\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; i < size; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (i && !(i % 16)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(i % 16)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(i % 4)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan for (i = 0; size < 16 && i < size; i++) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan if (!(i % 4)) {
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf("Usage: ::%s_dump <file> <instance (hex)>\n",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan mdb_printf("mdb: try \"::help %s_dump\" for more information",
291a2b48b9adcd7b3666c34e80ba6411929afe7fSukumar Swaminathan} /* emlxs_dump() */