Print this page
NEX-5733 cleanup qlt/qlc
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
NEX-5717 import QLogic 16G FC drivers
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
        
*** 17,48 ****
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
  
! /* Copyright 2010 QLogic Corporation */
  
  /*
   * ISP2xxx Solaris Fibre Channel Adapter (FCA) qlc mdb source file.
   *
   * ***********************************************************************
   * *                                                                    **
   * *                            NOTICE                                  **
!  * *            COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION              **
   * *                    ALL RIGHTS RESERVED                             **
   * *                                                                    **
   * ***********************************************************************
   *
   */
  
! #pragma ident   "Copyright 2010 QLogic Corporation; ql_mdb.c"
  
  #include <sys/mdb_modapi.h>
  #include <ql_apps.h>
  #include <ql_api.h>
  #include <ql_init.h>
- #include <ql_debug.h>
  
  /*
   * local prototypes
   */
  static int32_t ql_doprint(uintptr_t, int8_t *);
--- 17,47 ----
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
  
! /* Copyright 2015 QLogic Corporation */
  
  /*
   * ISP2xxx Solaris Fibre Channel Adapter (FCA) qlc mdb source file.
   *
   * ***********************************************************************
   * *                                                                    **
   * *                            NOTICE                                  **
!  * *            COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION              **
   * *                    ALL RIGHTS RESERVED                             **
   * *                                                                    **
   * ***********************************************************************
   *
   */
  
! #pragma ident   "Copyright 2015 QLogic Corporation; ql_mdb.c"
  
  #include <sys/mdb_modapi.h>
  #include <ql_apps.h>
  #include <ql_api.h>
  #include <ql_init.h>
  
  /*
   * local prototypes
   */
  static int32_t ql_doprint(uintptr_t, int8_t *);
*** 72,81 ****
--- 71,84 ----
      const mdb_arg_t *);
  static int ql_25xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
      const mdb_arg_t *);
  static int ql_81xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
      const mdb_arg_t *);
+ static int ql_8021_dump_dcmd(ql_adapter_state_t *, uint_t, int,
+     const mdb_arg_t *);
+ static int ql_8300_dump_dcmd(ql_adapter_state_t *, uint_t, int,
+     const mdb_arg_t *);
  static void ql_elog_common(ql_adapter_state_t *, boolean_t);
  
  /*
   * local adapter state flags strings
   */
*** 88,122 ****
          "POINT_TO_POINT",
          "IP_ENABLED",
          "IP_INITIALIZED",
          "MENLO_LOGIN_OPERATIONAL",
          "ADAPTER_SUSPENDED",
!         "ADAPTER_TIMER_BUSY",
          "PARITY_ERROR",
          "FLASH_ERRLOG_MARKER",
          "VP_ENABLED",
          "FDISC_ENABLED",
!         "FUNCTION_1",
          "MPI_RESET_NEEDED",
          NULL
  };
  
  int8_t *adapter_config_flags[] = {
!         "ENABLE_HARD_ADDRESS",
          "ENABLE_64BIT_ADDRESSING",
          "ENABLE_LIP_RESET",
          "ENABLE_FULL_LIP_LOGIN",
          "ENABLE_TARGET_RESET",
          "ENABLE_LINK_DOWN_REPORTING",
          "DISABLE_EXTENDED_LOGGING_TRACE",
          "ENABLE_FCP_2_SUPPORT",
!         "MULTI_CHIP_ADAPTER",
          "SBUS_CARD",
!         "CTRL_2300",
!         "CTRL_6322",
!         "CTRL_2200",
!         "CTRL_2422",
          "CTRL_25XX",
          "ENABLE_EXTENDED_LOGGING",
          "DISABLE_RISC_CODE_LOAD",
          "SET_CACHE_LINE_SIZE_1",
          "CTRL_MENLO",
--- 91,136 ----
          "POINT_TO_POINT",
          "IP_ENABLED",
          "IP_INITIALIZED",
          "MENLO_LOGIN_OPERATIONAL",
          "ADAPTER_SUSPENDED",
!         "FW_DUMP_NEEDED",
          "PARITY_ERROR",
          "FLASH_ERRLOG_MARKER",
          "VP_ENABLED",
          "FDISC_ENABLED",
!         "MULTI_QUEUE",
          "MPI_RESET_NEEDED",
+         "VP_ID_NOT_ACQUIRED",
+         "IDC_STALL_NEEDED",
+         "POLL_INTR",
+         "IDC_RESTART_NEEDED",
+         "IDC_ACK_NEEDED",
+         "LOOPBACK_ACTIVE",
+         "QUEUE_SHADOW_PTRS",
+         "NO_INTR_HANDSHAKE",
+         "COMP_THD_TERMINATE",
+         "DISABLE_NIC_FW_DMP",
+         "MULTI_CHIP_ADAPTER",
          NULL
  };
  
  int8_t *adapter_config_flags[] = {
!         "CTRL_27XX",
          "ENABLE_64BIT_ADDRESSING",
          "ENABLE_LIP_RESET",
          "ENABLE_FULL_LIP_LOGIN",
          "ENABLE_TARGET_RESET",
          "ENABLE_LINK_DOWN_REPORTING",
          "DISABLE_EXTENDED_LOGGING_TRACE",
          "ENABLE_FCP_2_SUPPORT",
!         "CTRL_83XX",
          "SBUS_CARD",
!         "CTRL_23XX",
!         "CTRL_63XX",
!         "CTRL_22XX",
!         "CTRL_24XX",
          "CTRL_25XX",
          "ENABLE_EXTENDED_LOGGING",
          "DISABLE_RISC_CODE_LOAD",
          "SET_CACHE_LINE_SIZE_1",
          "CTRL_MENLO",
*** 126,139 ****
          "DUMP_ISP_SYSTEM_ERROR",
          "DUMP_DRIVER_COMMAND_TIMEOUT",
          "DUMP_LOOP_OFFLINE_TIMEOUT",
          "ENABLE_FWEXTTRACE",
          "ENABLE_FWFCETRACE",
!         "FW_MISMATCH",
          "CTRL_81XX",
!         "CTRL_8021",
!         "ENABLE_FAST_TIMEOUT",
          "LR_SUPPORT",
          NULL
  };
  
  /*
--- 140,153 ----
          "DUMP_ISP_SYSTEM_ERROR",
          "DUMP_DRIVER_COMMAND_TIMEOUT",
          "DUMP_LOOP_OFFLINE_TIMEOUT",
          "ENABLE_FWEXTTRACE",
          "ENABLE_FWFCETRACE",
!         "CTRL_80XX",
          "CTRL_81XX",
!         "CTRL_82XX",
!         "FAST_TIMEOUT",
          "LR_SUPPORT",
          NULL
  };
  
  /*
*** 145,156 ****
          "TASK_DAEMON_ALIVE_FLG",
          "TASK_DAEMON_IDLE_CHK_FLG",
          "SUSPENDED_WAKEUP_FLG",
          "FC_STATE_CHANGE",
          "NEED_UNSOLICITED_BUFFERS",
!         "RESET_MARKER_NEEDED",
!         "RESET_ACTIVE",
          "ISP_ABORT_NEEDED",
          "ABORT_ISP_ACTIVE",
          "LOOP_RESYNC_NEEDED",
          "LOOP_RESYNC_ACTIVE",
          "LOOP_DOWN",
--- 159,170 ----
          "TASK_DAEMON_ALIVE_FLG",
          "TASK_DAEMON_IDLE_CHK_FLG",
          "SUSPENDED_WAKEUP_FLG",
          "FC_STATE_CHANGE",
          "NEED_UNSOLICITED_BUFFERS",
!         "MARKER_NEEDED",
!         "MARKER_ACTIVE",
          "ISP_ABORT_NEEDED",
          "ABORT_ISP_ACTIVE",
          "LOOP_RESYNC_NEEDED",
          "LOOP_RESYNC_ACTIVE",
          "LOOP_DOWN",
*** 158,178 ****
          "COMMAND_WAIT_NEEDED",
          "COMMAND_WAIT_ACTIVE",
          "STATE_ONLINE",
          "ABORT_QUEUES_NEEDED",
          "TASK_DAEMON_STALLED_FLG",
!         "TASK_THREAD_CALLED",
          "FIRMWARE_UP",
!         "LIP_RESET_PENDING",
          "FIRMWARE_LOADED",
          "RSCN_UPDATE_NEEDED",
          "HANDLE_PORT_BYPASS_CHANGE",
          "PORT_RETRY_NEEDED",
          "TASK_DAEMON_POWERING_DOWN",
          "TD_IIDMA_NEEDED",
!         "SEND_PLOGI",
!         "IDC_EVENT",
          NULL
  };
  
  /*
   * local interrupt aif flags
--- 172,192 ----
          "COMMAND_WAIT_NEEDED",
          "COMMAND_WAIT_ACTIVE",
          "STATE_ONLINE",
          "ABORT_QUEUES_NEEDED",
          "TASK_DAEMON_STALLED_FLG",
!         "SEND_PLOGI",
          "FIRMWARE_UP",
!         "IDC_POLL_NEEDED",
          "FIRMWARE_LOADED",
          "RSCN_UPDATE_NEEDED",
          "HANDLE_PORT_BYPASS_CHANGE",
          "PORT_RETRY_NEEDED",
          "TASK_DAEMON_POWERING_DOWN",
          "TD_IIDMA_NEEDED",
!         "WATCHDOG_NEEDED",
!         "LED_BLINK",
          NULL
  };
  
  /*
   * local interrupt aif flags
*** 207,216 ****
--- 221,231 ----
          "SRB_IN_DEVICE_QUEUE",
          "SRB_IN_TOKEN_ARRAY",
          "SRB_UB_FREE_REQUESTED",
          "SRB_UB_ACQUIRED",
          "SRB_MS_PKT",
+         "SRB_ELS_PKT",
          NULL
  };
  
  int8_t *qllun_flags[] = {
          "LQF_UNTAGGED_PENDING",
*** 224,233 ****
--- 239,249 ----
          "TQF_INITIATOR_DEVICE",
          "TQF_RSCN_RCVD",
          "TQF_NEED_AUTHENTICATION",
          "TQF_PLOGI_PROGRS",
          "TQF_IIDMA_NEEDED",
+         "TQF_LOGIN_NEEDED",
          NULL
  };
  
  int8_t *qldump_flags[] = {
          "QL_DUMPING",
*** 268,278 ****
          if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
                  mdb_warn("failed to read ql_hba structure");
                  return (DCMD_ERR);
          }
  
!         if (&ql_hba == NULL) {
                  mdb_warn("failed to read ql_hba structure -- is qlc loaded?");
                  return (DCMD_ERR);
          }
  
          mdb_printf("\nqlc adapter state linkages (f=0x%llx, l=0x%llx)\n\n",
--- 284,294 ----
          if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
                  mdb_warn("failed to read ql_hba structure");
                  return (DCMD_ERR);
          }
  
!         if (ql_hba.first == NULL) {
                  mdb_warn("failed to read ql_hba structure -- is qlc loaded?");
                  return (DCMD_ERR);
          }
  
          mdb_printf("\nqlc adapter state linkages (f=0x%llx, l=0x%llx)\n\n",
*** 443,453 ****
                                  return (DCMD_OK);
                          }
  
                          mdb_printf("%x\t%-11s", fwt->fw_class, fwverptr);
  
!                         if (&ql_hba == NULL) {
                                  mdb_warn("failed to read ql_hba structure");
                                  hbaptr = NULL;
                          } else {
                                  hbaptr = (uintptr_t)ql_hba.first;
                          }
--- 459,469 ----
                                  return (DCMD_OK);
                          }
  
                          mdb_printf("%x\t%-11s", fwt->fw_class, fwverptr);
  
!                         if (ql_hba.first == NULL) {
                                  mdb_warn("failed to read ql_hba structure");
                                  hbaptr = NULL;
                          } else {
                                  hbaptr = (uintptr_t)ql_hba.first;
                          }
*** 567,577 ****
          if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
                  mdb_warn("failed to read ql_hba structure");
                  return (DCMD_ERR);
          }
  
!         if (&ql_hba == NULL) {
                  mdb_warn("failed to read ql_hba structure - is qlc loaded?");
                  return (DCMD_ERR);
          }
  
          if ((qlstate = (ql_adapter_state_t *)mdb_alloc(qlsize,
--- 583,593 ----
          if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
                  mdb_warn("failed to read ql_hba structure");
                  return (DCMD_ERR);
          }
  
!         if (ql_hba.first == NULL) {
                  mdb_warn("failed to read ql_hba structure - is qlc loaded?");
                  return (DCMD_ERR);
          }
  
          if ((qlstate = (ql_adapter_state_t *)mdb_alloc(qlsize,
*** 751,761 ****
              NULL) {
                  mdb_free(qlstate, sizeof (ql_adapter_state_t));
                  mdb_warn("failed to allocate space for srb_t\n");
                  return (DCMD_OK);
          }
!         for (indx = 0; indx < MAX_OUTSTANDING_COMMANDS; indx++, qlosc += 8) {
                  if (mdb_vread(&ptr1, 8, qlosc) == -1) {
                          mdb_warn("failed to read ptr1, indx=%d", indx);
                          break;
                  }
                  if (ptr1 == 0) {
--- 767,777 ----
              NULL) {
                  mdb_free(qlstate, sizeof (ql_adapter_state_t));
                  mdb_warn("failed to allocate space for srb_t\n");
                  return (DCMD_OK);
          }
!         for (indx = 0; indx < qlstate->osc_max_cnt; indx++, qlosc += 8) {
                  if (mdb_vread(&ptr1, 8, qlosc) == -1) {
                          mdb_warn("failed to read ptr1, indx=%d", indx);
                          break;
                  }
                  if (ptr1 == 0) {
*** 1601,1611 ****
                  mdb_warn("Unable to allocate memory for ql_adapter_state\n");
                  return (DCMD_OK);
          }
  
          if (addr == NULL) {
-                 char            *tptr;
                  uint32_t        instance;
  
                  if (argc == 0) {
                          mdb_warn("must specify either the ha addr or "
                              "the instance number\n");
--- 1617,1626 ----
*** 1615,1631 ****
  
                  /*
                   * find the specified instance in the ha list
                   */
  
!                 instance = (uint32_t)strtol(argv[1].a_un.a_str, &tptr, 16);
!                 if (tptr == argv[1].a_un.a_str) {
!                         mdb_printf("instance # is illegal: '%s'\n",
!                             argv[1].a_un.a_str);
!                         mdb_free(qlstate, qlsize);
!                         return (DCMD_OK);
!                 }
  
                  if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
                          mdb_warn("failed to read ql_hba structure");
                          mdb_free(qlstate, qlsize);
                          return (DCMD_ERR);
--- 1630,1640 ----
  
                  /*
                   * find the specified instance in the ha list
                   */
  
!                 instance = (uint32_t)mdb_strtoull(argv[1].a_un.a_str);
  
                  if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
                          mdb_warn("failed to read ql_hba structure");
                          mdb_free(qlstate, qlsize);
                          return (DCMD_ERR);
*** 1759,1769 ****
           * show user which instances have valid f/w dumps available if
           * user has specified verbose option
           */
          if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
                  mdb_warn("failed to read ql_hba structure");
!         } else if (&ql_hba == NULL) {
                  mdb_warn("failed to read ql_hba structure -- is qlc loaded?");
          } else if (verbose) {
                  hbaptr = (uintptr_t)ql_hba.first;
                  while (hbaptr != NULL) {
  
--- 1768,1778 ----
           * show user which instances have valid f/w dumps available if
           * user has specified verbose option
           */
          if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
                  mdb_warn("failed to read ql_hba structure");
!         } else if (ql_hba.first == NULL) {
                  mdb_warn("failed to read ql_hba structure -- is qlc loaded?");
          } else if (verbose) {
                  hbaptr = (uintptr_t)ql_hba.first;
                  while (hbaptr != NULL) {
  
*** 1815,1840 ****
                      ha->instance, ha->ql_dump_state, ha->ql_dump_ptr);
                  mdb_free(ha, sizeof (ql_adapter_state_t));
                  return (DCMD_OK);
          }
  
!         if (CFG_IST(ha, CFG_CTRL_2422)) {
                  (void) ql_24xx_dump_dcmd(ha, flags, argc, argv);
          } else if (CFG_IST(ha, CFG_CTRL_25XX))  {
                  (void) ql_25xx_dump_dcmd(ha, flags, argc, argv);
          } else if (CFG_IST(ha, CFG_CTRL_81XX))  {
                  (void) ql_81xx_dump_dcmd(ha, flags, argc, argv);
!         } else if (!(CFG_IST(ha, CFG_CTRL_8021)))  {
                  (void) ql_23xx_dump_dcmd(ha, flags, argc, argv);
          }
  
          mdb_free(ha, sizeof (ql_adapter_state_t));
  
          return (DCMD_OK);
  }
  
  /*
   * ql_23xx_dump_dcmd
   *      prints out a firmware dump buffer
   *
   * Input:
   *      addr  = User supplied address. (NB: nust be an ha)
--- 1824,2401 ----
                      ha->instance, ha->ql_dump_state, ha->ql_dump_ptr);
                  mdb_free(ha, sizeof (ql_adapter_state_t));
                  return (DCMD_OK);
          }
  
!         if (CFG_IST(ha, CFG_CTRL_24XX)) {
                  (void) ql_24xx_dump_dcmd(ha, flags, argc, argv);
          } else if (CFG_IST(ha, CFG_CTRL_25XX)) {
                  (void) ql_25xx_dump_dcmd(ha, flags, argc, argv);
          } else if (CFG_IST(ha, CFG_CTRL_81XX)) {
                  (void) ql_81xx_dump_dcmd(ha, flags, argc, argv);
!         } else if (CFG_IST(ha, CFG_CTRL_82XX | CFG_CTRL_27XX)) {
!                 (void) ql_8021_dump_dcmd(ha, flags, argc, argv);
!         } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
!                 (void) ql_8300_dump_dcmd(ha, flags, argc, argv);
!         } else {
                  (void) ql_23xx_dump_dcmd(ha, flags, argc, argv);
          }
  
          mdb_free(ha, sizeof (ql_adapter_state_t));
  
          return (DCMD_OK);
  }
  
  /*
+  * ql_8021_dump_dcmd
+  *      prints out a firmware dump buffer
+  *
+  * Input:
+  *      addr  = User supplied address. (NB: nust be an ha)
+  *      flags = mdb flags.
+  *      argc  = Number of user supplied args.
+  *      argv  = Arg array.
+  *
+  * Returns:
+  *      DCMD_OK or DCMD_ERR
+  *
+  * Context:
+  *      User context.
+  *
+  */
+ /*ARGSUSED*/
+ static int
+ ql_8021_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
+     const mdb_arg_t *argv)
+ {
+         uint8_t         *fw, *bp;
+         uint32_t        cnt = 0;
+ 
+         bp = fw = (uint8_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
+ 
+         if (mdb_vread(fw, ha->ql_dump_size,
+             (uintptr_t)ha->ql_dump_ptr) == -1) {
+                 mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
+                 mdb_free(fw, ha->ql_dump_size);
+                 return (DCMD_OK);
+         }
+ 
+         while (cnt < ha->ql_dump_size) {
+                 mdb_printf("%02x ", *bp++);
+                 if (++cnt % 16 == 0) {
+                         mdb_printf("\n");
+                 }
+         }
+         if (cnt % 16 != 0) {
+                 mdb_printf("\n");
+         }
+ 
+         mdb_free(fw, ha->ql_dump_size);
+ 
+         return (DCMD_OK);
+ }
+ 
+ /*
+  * ql_83xx_dump_dcmd
+  *      prints out a firmware dump buffer
+  *
+  * Input:
+  *      addr  = User supplied address. (NB: must be an ha)
+  *      flags = mdb flags.
+  *      argc  = Number of user supplied args.
+  *      argv  = Arg array.
+  *
+  * Returns:
+  *      DCMD_OK or DCMD_ERR
+  *
+  * Context:
+  *      User context.
+  *
+  */
+ /*ARGSUSED*/
+ static int
+ ql_8300_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
+     const mdb_arg_t *argv)
+ {
+         ql_83xx_fw_dump_t       *fw;
+         ql_response_q_t         **rsp_queues, *rsp_q;
+         uint32_t                cnt, cnt1, *dp, *dp2;
+ 
+         fw = mdb_alloc(ha->ql_dump_size, UM_SLEEP);
+         rsp_queues = mdb_alloc(ha->rsp_queues_cnt *
+             sizeof (ql_response_q_t *), UM_SLEEP);
+         rsp_q = mdb_alloc(sizeof (ql_response_q_t), UM_SLEEP);
+ 
+         if (mdb_vread(fw, ha->ql_dump_size,
+             (uintptr_t)ha->ql_dump_ptr) == -1 ||
+             mdb_vread(rsp_queues, ha->rsp_queues_cnt *
+             sizeof (ql_response_q_t *), (uintptr_t)ha->rsp_queues) == -1) {
+                 mdb_warn("failed to read fw_dump_buffer (no f/w dump active?)");
+                 mdb_free(rsp_q, sizeof (ql_response_q_t));
+                 mdb_free(rsp_queues, ha->rsp_queues_cnt *
+                     sizeof (ql_response_q_t *));
+                 mdb_free(fw, ha->ql_dump_size);
+                 return (DCMD_OK);
+         }
+ 
+         mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
+             ha->fw_major_version, ha->fw_minor_version,
+             ha->fw_subminor_version, ha->fw_attributes);
+ 
+         mdb_printf("\nHCCR Register\n%08x\n", fw->hccr);
+ 
+         mdb_printf("\nR2H Status Register\n%08x\n", fw->r2h_status);
+ 
+         mdb_printf("\nAER Uncorrectable Error Status Register\n%08x\n",
+             fw->aer_ues);
+ 
+         mdb_printf("\nHostRisc Registers");
+         for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->hostrisc_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nPCIe Registers");
+         for (cnt = 0; cnt < sizeof (fw->pcie_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->pcie_reg[cnt]);
+         }
+ 
+         dp = fw->req_rsp_ext_mem;
+         for (cnt = 0; cnt < ha->rsp_queues_cnt; cnt++) {
+                 mdb_printf("\n\nQueue Pointers #%d:\n", cnt);
+                 for (cnt1 = 0; cnt1 < 4; cnt1++) {
+                         mdb_printf("%08x ", *dp++);
+                 }
+         }
+ 
+         mdb_printf("\n\nHost Interface Registers");
+         for (cnt = 0; cnt < sizeof (fw->host_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->host_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nShadow Registers");
+         for (cnt = 0; cnt < sizeof (fw->shadow_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->shadow_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRISC IO Register\n%08x", fw->risc_io);
+ 
+         mdb_printf("\n\nMailbox Registers");
+         for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
+                 if (cnt % 16 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%04x ", fw->mailbox_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXSEQ GP Registers");
+         for (cnt = 0; cnt < sizeof (fw->xseq_gp_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xseq_gp_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXSEQ-0 Registers");
+         for (cnt = 0; cnt < sizeof (fw->xseq_0_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xseq_0_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXSEQ-1 Registers");
+         for (cnt = 0; cnt < sizeof (fw->xseq_1_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xseq_1_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXSEQ-2 Registers");
+         for (cnt = 0; cnt < sizeof (fw->xseq_2_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xseq_2_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRSEQ GP Registers");
+         for (cnt = 0; cnt < sizeof (fw->rseq_gp_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rseq_gp_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRSEQ-0 Registers");
+         for (cnt = 0; cnt < sizeof (fw->rseq_0_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rseq_0_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRSEQ-1 Registers");
+         for (cnt = 0; cnt < sizeof (fw->rseq_1_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rseq_1_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRSEQ-2 Registers");
+         for (cnt = 0; cnt < sizeof (fw->rseq_2_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rseq_2_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRSEQ-3 Registers");
+         for (cnt = 0; cnt < sizeof (fw->rseq_3_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rseq_3_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nASEQ GP Registers");
+         for (cnt = 0; cnt < sizeof (fw->aseq_gp_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->aseq_gp_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nASEQ-0 Registers");
+         for (cnt = 0; cnt < sizeof (fw->aseq_0_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->aseq_0_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nASEQ-1 Registers");
+         for (cnt = 0; cnt < sizeof (fw->aseq_1_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->aseq_1_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nASEQ-2 Registers");
+         for (cnt = 0; cnt < sizeof (fw->aseq_2_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->aseq_2_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nASEQ-3 Registers");
+         for (cnt = 0; cnt < sizeof (fw->aseq_3_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->aseq_3_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nCommand DMA Registers");
+         for (cnt = 0; cnt < sizeof (fw->cmd_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->cmd_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRequest0 Queue DMA Channel Registers");
+         for (cnt = 0; cnt < sizeof (fw->req0_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->req0_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nResponse0 Queue DMA Channel Registers");
+         for (cnt = 0; cnt < sizeof (fw->resp0_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->resp0_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRequest1 Queue DMA Channel Registers");
+         for (cnt = 0; cnt < sizeof (fw->req1_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->req1_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXMT0 Data DMA Registers");
+         for (cnt = 0; cnt < sizeof (fw->xmt0_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xmt0_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXMT1 Data DMA Registers");
+         for (cnt = 0; cnt < sizeof (fw->xmt1_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xmt1_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXMT2 Data DMA Registers");
+         for (cnt = 0; cnt < sizeof (fw->xmt2_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xmt2_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXMT3 Data DMA Registers");
+         for (cnt = 0; cnt < sizeof (fw->xmt3_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xmt3_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXMT4 Data DMA Registers");
+         for (cnt = 0; cnt < sizeof (fw->xmt4_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xmt4_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nXMT Data DMA Common Registers");
+         for (cnt = 0; cnt < sizeof (fw->xmt_data_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->xmt_data_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRCV Thread 0 Data DMA Registers");
+         for (cnt = 0; cnt < sizeof (fw->rcvt0_data_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rcvt0_data_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRCV Thread 1 Data DMA Registers");
+         for (cnt = 0; cnt < sizeof (fw->rcvt1_data_dma_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rcvt1_data_dma_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRISC GP Registers");
+         for (cnt = 0; cnt < sizeof (fw->risc_gp_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->risc_gp_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nLMC Registers");
+         for (cnt = 0; cnt < sizeof (fw->lmc_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->lmc_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nFPM Hardware Registers");
+         for (cnt = 0; cnt < sizeof (fw->fpm_hdw_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->fpm_hdw_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRQ0 Array Registers");
+         for (cnt = 0; cnt < sizeof (fw->rq0_array_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rq0_array_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRQ1 Array Registers");
+         for (cnt = 0; cnt < sizeof (fw->rq1_array_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rq1_array_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRP0 Array Registers");
+         for (cnt = 0; cnt < sizeof (fw->rp0_array_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rp0_array_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nRP1 Array Registers");
+         for (cnt = 0; cnt < sizeof (fw->rp1_array_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->rp1_array_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nAT0 Array Registers");
+         for (cnt = 0; cnt < sizeof (fw->ato_array_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->ato_array_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nQueue Control Registers");
+         for (cnt = 0; cnt < sizeof (fw->queue_control_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->queue_control_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nFB Hardware Registers");
+         for (cnt = 0; cnt < sizeof (fw->fb_hdw_reg) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n");
+                 }
+                 mdb_printf("%08x ", fw->fb_hdw_reg[cnt]);
+         }
+ 
+         mdb_printf("\n\nCode RAM");
+         for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n%08x: ", cnt + 0x20000);
+                 }
+                 mdb_printf("%08x ", fw->code_ram[cnt]);
+         }
+ 
+         mdb_printf("\n\nExternal Memory");
+         dp = (uint32_t *)(void *)((caddr_t)fw->req_rsp_ext_mem +
+             fw->req_q_size[0] + fw->req_q_size[1] + fw->rsp_q_size +
+             (ha->rsp_queues_cnt * 16));
+         for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
+                 if (cnt % 8 == 0) {
+                         mdb_printf("\n%08x: ", cnt + 0x100000);
+                 }
+                 mdb_printf("%08x ", *dp++);
+         }
+ 
+         mdb_printf("\n\n[<==END] ISP Debug Dump");
+ 
+         dp = fw->req_rsp_ext_mem + (ha->rsp_queues_cnt * 4);
+         for (cnt = 0; cnt < 2 && fw->req_q_size[cnt]; cnt++) {
+                 dp2 = dp;
+                 for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
+                         if (*dp2++) {
+                                 break;
+                         }
+                 }
+                 if (cnt1 == fw->req_q_size[cnt] / 4) {
+                         dp = dp2;
+                         continue;
+                 }
+                 mdb_printf("\n\nRequest Queue\nQueue 0%d:", cnt);
+                 for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
+                         if (cnt1 % 8 == 0) {
+                                 mdb_printf("\n%08x: ", cnt1);
+                         }
+                         mdb_printf("%08x ", *dp++);
+                 }
+         }
+ 
+         for (cnt = 0; cnt < ha->rsp_queues_cnt; cnt++) {
+                 if (mdb_vread(rsp_q, sizeof (ql_response_q_t),
+                     (uintptr_t)rsp_queues[cnt]) == -1) {
+                         mdb_warn("failed to read ha->rsp_queues[%d]", cnt);
+                         break;
+                 }
+                 dp2 = dp;
+                 for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
+                         if (*dp2++) {
+                                 break;
+                         }
+                 }
+                 if (cnt1 == rsp_q->rsp_ring.size / 4) {
+                         dp = dp2;
+                         continue;
+                 }
+                 mdb_printf("\n\nResponse Queue\nQueue 0%d:", cnt);
+ 
+                 for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
+                         if (cnt1 % 8 == 0) {
+                                 mdb_printf("\n%08x: ", cnt1);
+                         }
+                         mdb_printf("%08x ", *dp++);
+                 }
+         }
+ 
+         if (ha->fwexttracebuf.dma_handle != NULL) {
+                 uint32_t        cnt_b;
+                 uint32_t        *w32 = ha->fwexttracebuf.bp;
+ 
+                 mdb_printf("\n\nExtended Trace Buffer Memory");
+                 /* show data address as a byte address, data as long words */
+                 for (cnt = 0; cnt < FWEXTSIZE / 4; cnt++) {
+                         cnt_b = cnt * 4;
+                         if (cnt_b % 32 == 0) {
+                                 mdb_printf("\n%08x: ", w32 + cnt_b);
+                         }
+                         mdb_printf("%08x ", fw->ext_trace_buf[cnt]);
+                 }
+         }
+ 
+         if (ha->fwfcetracebuf.dma_handle != NULL) {
+                 uint32_t        cnt_b;
+                 uint32_t        *w32 = ha->fwfcetracebuf.bp;
+ 
+                 mdb_printf("\n\nFC Event Trace Buffer Memory");
+                 /* show data address as a byte address, data as long words */
+                 for (cnt = 0; cnt < FWFCESIZE / 4; cnt++) {
+                         cnt_b = cnt * 4;
+                         if (cnt_b % 32 == 0) {
+                                 mdb_printf("\n%08x: ", w32 + cnt_b);
+                         }
+                         mdb_printf("%08x ", fw->fce_trace_buf[cnt]);
+                 }
+         }
+ 
+         mdb_free(rsp_q, sizeof (ql_response_q_t));
+         mdb_free(rsp_queues, ha->rsp_queues_cnt * sizeof (ql_response_q_t *));
+         mdb_free(fw, ha->ql_dump_size);
+ 
+         mdb_printf("\n\nreturn exit\n");
+ 
+         return (DCMD_OK);
+ }
+ 
+ /*
   * ql_23xx_dump_dcmd
   *      prints out a firmware dump buffer
   *
   * Input:
   *      addr  = User supplied address. (NB: nust be an ha)
*** 1865,1878 ****
                  mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
                  mdb_free(fw, ha->ql_dump_size);
                  return (DCMD_OK);
          }
  
!         if (ha->cfg_flags & CFG_CTRL_2300) {
                  mdb_printf("\nISP 2300IP ");
!         } else if (ha->cfg_flags & CFG_CTRL_6322) {
!                 mdb_printf("\nISP 6322FLX ");
          } else {
                  mdb_printf("\nISP 2200IP ");
          }
  
          mdb_printf("Firmware Version %d.%d.%d\n",
--- 2426,2439 ----
                  mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
                  mdb_free(fw, ha->ql_dump_size);
                  return (DCMD_OK);
          }
  
!         if (ha->cfg_flags & CFG_CTRL_23XX) {
                  mdb_printf("\nISP 2300IP ");
!         } else if (ha->cfg_flags & CFG_CTRL_63XX) {
!                 mdb_printf("\nISP 2322/6322FLX ");
          } else {
                  mdb_printf("\nISP 2200IP ");
          }
  
          mdb_printf("Firmware Version %d.%d.%d\n",
*** 1885,1895 ****
                          mdb_printf("\n");
                  }
                  mdb_printf("%04x  ", fw->pbiu_reg[cnt]);
          }
  
!         if (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) {
                  mdb_printf("\n\nReqQ-RspQ-Risc2Host Status registers:");
                  for (cnt = 0; cnt < sizeof (fw->risc_host_reg) / 2; cnt++) {
                          if (cnt % 8 == 0) {
                                  mdb_printf("\n");
                          }
--- 2446,2456 ----
                          mdb_printf("\n");
                  }
                  mdb_printf("%04x  ", fw->pbiu_reg[cnt]);
          }
  
!         if (ha->cfg_flags & CFG_CTRL_2363) {
                  mdb_printf("\n\nReqQ-RspQ-Risc2Host Status registers:");
                  for (cnt = 0; cnt < sizeof (fw->risc_host_reg) / 2; cnt++) {
                          if (cnt % 8 == 0) {
                                  mdb_printf("\n");
                          }
*** 1896,1914 ****
                          mdb_printf("%04x  ", fw->risc_host_reg[cnt]);
                  }
          }
  
          mdb_printf("\n\nMailbox Registers:");
!         mbox_cnt = (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) ? 16 : 8;
          for (cnt = 0; cnt < mbox_cnt; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n");
                  }
                  mdb_printf("%04x  ", fw->mailbox_reg[cnt]);
          }
  
!         if (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) {
                  mdb_printf("\n\nAuto Request Response DMA Registers:");
                  for (cnt = 0; cnt < sizeof (fw->resp_dma_reg) / 2; cnt++) {
                          if (cnt % 8 == 0) {
                                  mdb_printf("\n");
                          }
--- 2457,2475 ----
                          mdb_printf("%04x  ", fw->risc_host_reg[cnt]);
                  }
          }
  
          mdb_printf("\n\nMailbox Registers:");
!         mbox_cnt = ha->cfg_flags & CFG_CTRL_2363 ? 16 : 8;
          for (cnt = 0; cnt < mbox_cnt; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n");
                  }
                  mdb_printf("%04x  ", fw->mailbox_reg[cnt]);
          }
  
!         if (ha->cfg_flags & CFG_CTRL_2363) {
                  mdb_printf("\n\nAuto Request Response DMA Registers:");
                  for (cnt = 0; cnt < sizeof (fw->resp_dma_reg) / 2; cnt++) {
                          if (cnt % 8 == 0) {
                                  mdb_printf("\n");
                          }
*** 1997,2007 ****
          }
  
          mdb_printf("\n\nFrame Buffer Hardware Registers:");
          for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
                  if ((cnt == 16) &&
!                     ((ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) == 0)) {
                          break;
                  }
                  if (cnt % 8 == 0) {
                          mdb_printf("\n");
                  }
--- 2558,2568 ----
          }
  
          mdb_printf("\n\nFrame Buffer Hardware Registers:");
          for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
                  if ((cnt == 16) &&
!                     ((ha->cfg_flags & CFG_CTRL_2363) == 0)) {
                          break;
                  }
                  if (cnt % 8 == 0) {
                          mdb_printf("\n");
                  }
*** 2022,2032 ****
                          mdb_printf("\n");
                  }
                  mdb_printf("%04x  ", fw->fpm_b1_reg[cnt]);
          }
  
!         if (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) {
                  mdb_printf("\n\nCode RAM Dump:");
                  for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
                          if (cnt % 8 == 0) {
                                  mdb_printf("\n%05x: ", cnt + 0x0800);
                          }
--- 2583,2593 ----
                          mdb_printf("\n");
                  }
                  mdb_printf("%04x  ", fw->fpm_b1_reg[cnt]);
          }
  
!         if (ha->cfg_flags & CFG_CTRL_2363) {
                  mdb_printf("\n\nCode RAM Dump:");
                  for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
                          if (cnt % 8 == 0) {
                                  mdb_printf("\n%05x: ", cnt + 0x0800);
                          }
*** 2427,2452 ****
  static int
  ql_25xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
      const mdb_arg_t *argv)
  {
          ql_25xx_fw_dump_t       *fw;
!         uint32_t                cnt = 0;
  
          fw = (ql_25xx_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
  
          if (mdb_vread(fw, ha->ql_dump_size,
!             (uintptr_t)ha->ql_dump_ptr) == -1) {
                  mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
                  mdb_free(fw, ha->ql_dump_size);
                  return (DCMD_OK);
          }
  
          mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
              ha->fw_major_version, ha->fw_minor_version,
              ha->fw_subminor_version, ha->fw_attributes);
  
          mdb_printf("\nR2H Register\n%08x\n", fw->r2h_status);
  
          mdb_printf("\n\nHostRisc Registers");
          for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n");
--- 2988,3025 ----
  static int
  ql_25xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
      const mdb_arg_t *argv)
  {
          ql_25xx_fw_dump_t       *fw;
!         ql_response_q_t         **rsp_queues, *rsp_q;
!         uint32_t                cnt, cnt1, *dp, *dp2;
  
          fw = (ql_25xx_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
+         rsp_queues = mdb_alloc(ha->rsp_queues_cnt *
+             sizeof (ql_response_q_t *), UM_SLEEP);
+         rsp_q = mdb_alloc(sizeof (ql_response_q_t), UM_SLEEP);
  
          if (mdb_vread(fw, ha->ql_dump_size,
!             (uintptr_t)ha->ql_dump_ptr) == -1 ||
!             mdb_vread(rsp_queues, ha->rsp_queues_cnt *
!             sizeof (ql_response_q_t *), (uintptr_t)ha->rsp_queues) == -1) {
                  mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
+                 mdb_free(rsp_q, sizeof (ql_response_q_t));
+                 mdb_free(rsp_queues, ha->rsp_queues_cnt *
+                     sizeof (ql_response_q_t *));
                  mdb_free(fw, ha->ql_dump_size);
                  return (DCMD_OK);
          }
  
          mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
              ha->fw_major_version, ha->fw_minor_version,
              ha->fw_subminor_version, ha->fw_attributes);
  
+         mdb_printf("\nHCCR Register\n%08x\n", fw->hccr);
          mdb_printf("\nR2H Register\n%08x\n", fw->r2h_status);
+         mdb_printf("\nAER Uncorrectable Error Status Register\n%08x\n",
+             fw->aer_ues);
  
          mdb_printf("\n\nHostRisc Registers");
          for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n");
*** 2714,2749 ****
                  }
                  mdb_printf("%08x ", fw->code_ram[cnt]);
          }
  
          mdb_printf("\n\nExternal Memory");
          for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n%08x: ", cnt + 0x100000);
                  }
!                 mdb_printf("%08x ", fw->ext_mem[cnt]);
          }
  
          mdb_printf("\n[<==END] ISP Debug Dump");
  
          mdb_printf("\n\nRequest Queue");
  
!         for (cnt = 0; cnt < REQUEST_QUEUE_SIZE / 4; cnt++) {
!                 if (cnt % 8 == 0) {
!                         mdb_printf("\n%08x: ", cnt);
                  }
-                 mdb_printf("%08x ", fw->req_q[cnt]);
          }
  
!         mdb_printf("\n\nResponse Queue");
  
!         for (cnt = 0; cnt < RESPONSE_QUEUE_SIZE / 4; cnt++) {
!                 if (cnt % 8 == 0) {
!                         mdb_printf("\n%08x: ", cnt);
                  }
!                 mdb_printf("%08x ", fw->rsp_q[cnt]);
          }
  
          if ((ha->cfg_flags & CFG_ENABLE_FWEXTTRACE) &&
              (ha->fwexttracebuf.bp != NULL)) {
                  uint32_t cnt_b = 0;
                  uint32_t *w32 = ha->fwexttracebuf.bp;
--- 3287,3356 ----
                  }
                  mdb_printf("%08x ", fw->code_ram[cnt]);
          }
  
          mdb_printf("\n\nExternal Memory");
+         dp = (uint32_t *)(void *)((caddr_t)fw->req_rsp_ext_mem +
+             fw->req_q_size[0] + fw->req_q_size[1] + fw->rsp_q_size +
+             (ha->rsp_queues_cnt * 16));
          for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n%08x: ", cnt + 0x100000);
                  }
!                 mdb_printf("%08x ", *dp++);
          }
  
          mdb_printf("\n[<==END] ISP Debug Dump");
  
          mdb_printf("\n\nRequest Queue");
  
!         dp = fw->req_rsp_ext_mem + (ha->rsp_queues_cnt * 4);
!         for (cnt = 0; cnt < 2 && fw->req_q_size[cnt]; cnt++) {
!                 dp2 = dp;
!                 for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
!                         if (*dp2++) {
!                                 break;
                          }
                  }
+                 if (cnt1 == fw->req_q_size[cnt] / 4) {
+                         dp = dp2;
+                         continue;
+                 }
+                 mdb_printf("\n\nRequest Queue\nQueue 0%d:", cnt);
+                 for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
+                         if (cnt1 % 8 == 0) {
+                                 mdb_printf("\n%08x: ", cnt1);
+                         }
+                         mdb_printf("%08x ", *dp++);
+                 }
+         }
  
!         for (cnt = 0; cnt < ha->rsp_queues_cnt; cnt++) {
!                 if (mdb_vread(rsp_q, sizeof (ql_response_q_t),
!                     (uintptr_t)rsp_queues[cnt]) == -1) {
!                         mdb_warn("failed to read ha->rsp_queues[%d]", cnt);
!                         break;
!                 }
!                 dp2 = dp;
!                 for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
!                         if (*dp2++) {
!                                 break;
!                         }
!                 }
!                 if (cnt1 == rsp_q->rsp_ring.size / 4) {
!                         dp = dp2;
!                         continue;
!                 }
!                 mdb_printf("\n\nResponse Queue\nQueue 0%d:", cnt);
  
!                 for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
!                         if (cnt1 % 8 == 0) {
!                                 mdb_printf("\n%08x: ", cnt1);
                          }
!                         mdb_printf("%08x ", *dp++);
                  }
+         }
  
          if ((ha->cfg_flags & CFG_ENABLE_FWEXTTRACE) &&
              (ha->fwexttracebuf.bp != NULL)) {
                  uint32_t cnt_b = 0;
                  uint32_t *w32 = ha->fwexttracebuf.bp;
*** 2773,2782 ****
--- 3380,3391 ----
                          }
                          mdb_printf("%08x ", fw->fce_trace_buf[cnt]);
                  }
          }
  
+         mdb_free(rsp_q, sizeof (ql_response_q_t));
+         mdb_free(rsp_queues, ha->rsp_queues_cnt * sizeof (ql_response_q_t *));
          mdb_free(fw, ha->ql_dump_size);
  
          mdb_printf("\n\nreturn exit\n");
  
          return (DCMD_OK);
*** 2803,2829 ****
  static int
  ql_81xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
      const mdb_arg_t *argv)
  {
          ql_81xx_fw_dump_t       *fw;
!         uint32_t                cnt = 0;
  
          fw = (ql_81xx_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
  
          if (mdb_vread(fw, ha->ql_dump_size,
!             (uintptr_t)ha->ql_dump_ptr) == -1) {
                  mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
                  mdb_free(fw, ha->ql_dump_size);
                  return (DCMD_OK);
          }
  
          mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
              ha->fw_major_version, ha->fw_minor_version,
              ha->fw_subminor_version, ha->fw_attributes);
  
          mdb_printf("\nR2H Register\n%08x\n", fw->r2h_status);
  
          mdb_printf("\n\nHostRisc Registers");
          for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n");
                  }
--- 3412,3452 ----
  static int
  ql_81xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
      const mdb_arg_t *argv)
  {
          ql_81xx_fw_dump_t       *fw;
!         ql_response_q_t         **rsp_queues, *rsp_q;
!         uint32_t                cnt, cnt1, *dp, *dp2;
  
          fw = (ql_81xx_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
+         rsp_queues = mdb_alloc(ha->rsp_queues_cnt *
+             sizeof (ql_response_q_t *), UM_SLEEP);
+         rsp_q = mdb_alloc(sizeof (ql_response_q_t), UM_SLEEP);
  
          if (mdb_vread(fw, ha->ql_dump_size,
!             (uintptr_t)ha->ql_dump_ptr) == -1 ||
!             mdb_vread(rsp_queues, ha->rsp_queues_cnt *
!             sizeof (ql_response_q_t *), (uintptr_t)ha->rsp_queues) == -1) {
                  mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
+                 mdb_free(rsp_q, sizeof (ql_response_q_t));
+                 mdb_free(rsp_queues, ha->rsp_queues_cnt *
+                     sizeof (ql_response_q_t *));
                  mdb_free(fw, ha->ql_dump_size);
                  return (DCMD_OK);
          }
  
          mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
              ha->fw_major_version, ha->fw_minor_version,
              ha->fw_subminor_version, ha->fw_attributes);
  
+         mdb_printf("\nHCCR Register\n%08x\n", fw->hccr);
+ 
          mdb_printf("\nR2H Register\n%08x\n", fw->r2h_status);
  
+         mdb_printf("\nAER Uncorrectable Error Status Register\n%08x\n",
+             fw->aer_ues);
+ 
          mdb_printf("\n\nHostRisc Registers");
          for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n");
                  }
*** 3090,3125 ****
                  }
                  mdb_printf("%08x ", fw->code_ram[cnt]);
          }
  
          mdb_printf("\n\nExternal Memory");
          for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n%08x: ", cnt + 0x100000);
                  }
!                 mdb_printf("%08x ", fw->ext_mem[cnt]);
          }
  
          mdb_printf("\n[<==END] ISP Debug Dump");
  
          mdb_printf("\n\nRequest Queue");
  
!         for (cnt = 0; cnt < REQUEST_QUEUE_SIZE / 4; cnt++) {
!                 if (cnt % 8 == 0) {
!                         mdb_printf("\n%08x: ", cnt);
                  }
-                 mdb_printf("%08x ", fw->req_q[cnt]);
          }
  
!         mdb_printf("\n\nResponse Queue");
  
!         for (cnt = 0; cnt < RESPONSE_QUEUE_SIZE / 4; cnt++) {
!                 if (cnt % 8 == 0) {
!                         mdb_printf("\n%08x: ", cnt);
                  }
!                 mdb_printf("%08x ", fw->rsp_q[cnt]);
          }
  
          if ((ha->cfg_flags & CFG_ENABLE_FWEXTTRACE) &&
              (ha->fwexttracebuf.bp != NULL)) {
                  uint32_t cnt_b = 0;
                  uint32_t *w32 = ha->fwexttracebuf.bp;
--- 3713,3782 ----
                  }
                  mdb_printf("%08x ", fw->code_ram[cnt]);
          }
  
          mdb_printf("\n\nExternal Memory");
+         dp = (uint32_t *)(void *)((caddr_t)fw->req_rsp_ext_mem +
+             fw->req_q_size[0] + fw->req_q_size[1] + fw->rsp_q_size +
+             (ha->rsp_queues_cnt * 16));
          for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
                  if (cnt % 8 == 0) {
                          mdb_printf("\n%08x: ", cnt + 0x100000);
                  }
!                 mdb_printf("%08x ", *dp++);
          }
  
          mdb_printf("\n[<==END] ISP Debug Dump");
  
          mdb_printf("\n\nRequest Queue");
  
!         dp = fw->req_rsp_ext_mem + (ha->rsp_queues_cnt * 4);
!         for (cnt = 0; cnt < 2 && fw->req_q_size[cnt]; cnt++) {
!                 dp2 = dp;
!                 for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
!                         if (*dp2++) {
!                                 break;
                          }
                  }
+                 if (cnt1 == fw->req_q_size[cnt] / 4) {
+                         dp = dp2;
+                         continue;
+                 }
+                 mdb_printf("\n\nRequest Queue\nQueue 0%d:", cnt);
+                 for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
+                         if (cnt1 % 8 == 0) {
+                                 mdb_printf("\n%08x: ", cnt1);
+                         }
+                         mdb_printf("%08x ", *dp++);
+                 }
+         }
  
!         for (cnt = 0; cnt < ha->rsp_queues_cnt; cnt++) {
!                 if (mdb_vread(rsp_q, sizeof (ql_response_q_t),
!                     (uintptr_t)rsp_queues[cnt]) == -1) {
!                         mdb_warn("failed to read ha->rsp_queues[%d]", cnt);
!                         break;
!                 }
!                 dp2 = dp;
!                 for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
!                         if (*dp2++) {
!                                 break;
!                         }
!                 }
!                 if (cnt1 == rsp_q->rsp_ring.size / 4) {
!                         dp = dp2;
!                         continue;
!                 }
!                 mdb_printf("\n\nResponse Queue\nQueue 0%d:", cnt);
  
!                 for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
!                         if (cnt1 % 8 == 0) {
!                                 mdb_printf("\n%08x: ", cnt1);
                          }
!                         mdb_printf("%08x ", *dp++);
                  }
+         }
  
          if ((ha->cfg_flags & CFG_ENABLE_FWEXTTRACE) &&
              (ha->fwexttracebuf.bp != NULL)) {
                  uint32_t cnt_b = 0;
                  uint32_t *w32 = ha->fwexttracebuf.bp;
*** 3149,3158 ****
--- 3806,3817 ----
                          }
                          mdb_printf("%08x ", fw->fce_trace_buf[cnt]);
                  }
          }
  
+         mdb_free(rsp_q, sizeof (ql_response_q_t));
+         mdb_free(rsp_queues, ha->rsp_queues_cnt * sizeof (ql_response_q_t *));
          mdb_free(fw, ha->ql_dump_size);
  
          mdb_printf("\n\nreturn exit\n");
  
          return (DCMD_OK);
*** 3177,3205 ****
   */
  static int
  qlc_gettrace_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
  {
          ql_adapter_state_t      *ha;
!         int                     verbose = 0;
!         int                     wrapped = 0;
!         char                    *trace_start;
!         char                    *trace_end;
!         char                    *dump_start = 0;
!         char                    *trace_next  = 0;
!         char                    *dump_current  = 0;
!         el_trace_desc_t         *trace_desc;
  
          if ((!(flags & DCMD_ADDRSPEC)) || addr == NULL) {
                  mdb_warn("ql_adapter_state structure addr is required");
                  return (DCMD_USAGE);
          }
  
!         if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose) !=
!             argc) {
                  return (DCMD_USAGE);
          }
  
          /*
           * Get the adapter state struct which was passed
           */
          if ((ha = (ql_adapter_state_t *)mdb_alloc(sizeof (ql_adapter_state_t),
              UM_SLEEP)) == NULL) {
--- 3836,3863 ----
   */
  static int
  qlc_gettrace_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
  {
          ql_adapter_state_t      *ha;
!         ql_trace_desc_t         *trace_desc;
!         ql_trace_entry_t        entry;
!         uint32_t                i = 0;
!         char                    merge[1024];
  
          if ((!(flags & DCMD_ADDRSPEC)) || addr == NULL) {
                  mdb_warn("ql_adapter_state structure addr is required");
                  return (DCMD_USAGE);
          }
  
!         if (argc != 0) {
                  return (DCMD_USAGE);
          }
  
+         if (mdb_getopts(argc, argv) != argc) {
+                 return (DCMD_USAGE);
+         }
+ 
          /*
           * Get the adapter state struct which was passed
           */
          if ((ha = (ql_adapter_state_t *)mdb_alloc(sizeof (ql_adapter_state_t),
              UM_SLEEP)) == NULL) {
*** 3211,3319 ****
                  mdb_warn("failed to read ql_adapter_state at %p", addr);
                  mdb_free(ha, sizeof (ql_adapter_state_t));
                  return (DCMD_OK);
          }
  
!         /*
!          * If its not a valid trace descriptor then bail out
!          */
!         if (ha->el_trace_desc == NULL) {
                  mdb_warn("trace descriptor does not exist for instance %d\n",
                      ha->instance);
                  mdb_free(ha, sizeof (ql_adapter_state_t));
                  return (DCMD_OK);
          } else {
!                 trace_desc = (el_trace_desc_t *)
!                     mdb_alloc(sizeof (el_trace_desc_t), UM_SLEEP);
!                 if (mdb_vread(trace_desc, sizeof (el_trace_desc_t),
!                     (uintptr_t)ha->el_trace_desc) == -1) {
                          mdb_warn("failed to read ql_adapter_state at %p",
                              addr);
!                         mdb_free(trace_desc, sizeof (el_trace_desc_t));
                          mdb_free(ha, sizeof (ql_adapter_state_t));
                          return (DCMD_OK);
                  }
                  if (trace_desc->trace_buffer == NULL) {
                          mdb_warn("trace buffer does not exist for "
                              "instance %d\n", ha->instance);
!                         mdb_free(trace_desc, sizeof (el_trace_desc_t));
                          mdb_free(ha, sizeof (ql_adapter_state_t));
                          return (DCMD_OK);
                  }
          }
  
!         /* Get the trace buffer */
! 
!         trace_start = (char *)
!             mdb_zalloc(trace_desc->trace_buffer_size, UM_SLEEP);
! 
!         if (mdb_vread(trace_start, trace_desc->trace_buffer_size,
!             (uintptr_t)trace_desc->trace_buffer) == -1) {
!                 mdb_warn("failed to read trace buffer?)");
!                 mdb_free(trace_start, trace_desc->trace_buffer_size);
                  mdb_free(ha, sizeof (ql_adapter_state_t));
                  return (DCMD_OK);
          }
  
-         /* set the end of the trace buffer. */
-         trace_end = trace_start + trace_desc->trace_buffer_size;
- 
-         /* Find the start point of trace. */
-         trace_next = trace_start + trace_desc->next;
- 
          /*
!          * If the buffer has not wrapped next will point at a null so
!          * start is the begining of the buffer.  If next points at a char
!          * then we must traverse the buffer further until a null is detected.
!          * The location after the null will be the beginning of the oldest
!          * whole object in the buffer, which we use as the start.
           */
  
!         if ((trace_next + EL_BUFFER_RESERVE) >= trace_end) {
!                 dump_start = trace_start;
!         } else if (*trace_next != NULL) {
!                 dump_start = trace_next + (strlen(trace_next) + 1);
!         } else {
!                 dump_start = trace_start;
          }
  
!         dump_current = dump_start;
! 
!         mdb_printf("\nExtended Logging trace buffer @%x, start @%x, "
!             "size=%d\n\n", trace_start, dump_current,
!             trace_desc->trace_buffer_size);
! 
!         /* Don't run off the end, no matter what. */
!         while (((uintptr_t)dump_current - (uintptr_t)trace_start) <=
!             (uintptr_t)trace_desc->trace_buffer_size) {
!                 /* Show it... */
!                 mdb_printf("%s", dump_current);
!                 /* Calculate the next and make it the current */
!                 dump_current += (strlen(dump_current) + 1);
!                 /* check for wrap */
!                 if ((dump_current + EL_BUFFER_RESERVE) >= trace_end) {
!                         mdb_printf("Wraping %x\n", dump_current);
!                         dump_current = trace_start;
!                         wrapped = 1;
!                 } else if (wrapped) {
!                         /*   Don't go past next. */
!                         if ((trace_start + trace_desc->next) <= dump_current) {
!                                 mdb_printf("Done %x", dump_current);
!                                 break;
                          }
!                 } else if (*dump_current == NULL) {
!                         mdb_printf("Done %x(null)", dump_current);
!                         break;
                  }
          }
  
          mdb_free(ha, sizeof (ql_adapter_state_t));
-         mdb_free(trace_start, trace_desc->trace_buffer_size);
-         mdb_free(trace_desc, sizeof (el_trace_desc_t));
- 
          return (DCMD_OK);
  }
  /*
   * ql_doprint
   *      ql generic function to call the print dcmd
   *
   * Input:
--- 3869,3973 ----
                  mdb_warn("failed to read ql_adapter_state at %p", addr);
                  mdb_free(ha, sizeof (ql_adapter_state_t));
                  return (DCMD_OK);
          }
  
!         if (ha->ql_trace_desc == NULL) {
                  mdb_warn("trace descriptor does not exist for instance %d\n",
                      ha->instance);
                  mdb_free(ha, sizeof (ql_adapter_state_t));
                  return (DCMD_OK);
+ 
          } else {
!                 trace_desc = (ql_trace_desc_t *)
!                     mdb_alloc(sizeof (ql_trace_desc_t), UM_SLEEP);
! 
!                 if (mdb_vread(trace_desc, sizeof (ql_trace_desc_t),
!                     (uintptr_t)ha->ql_trace_desc) == -1) {
                          mdb_warn("failed to read ql_adapter_state at %p",
                              addr);
!                         mdb_free(trace_desc, sizeof (ql_trace_desc_t));
                          mdb_free(ha, sizeof (ql_adapter_state_t));
                          return (DCMD_OK);
                  }
+ 
                  if (trace_desc->trace_buffer == NULL) {
                          mdb_warn("trace buffer does not exist for "
                              "instance %d\n", ha->instance);
! 
!                         mdb_free(trace_desc, sizeof (ql_trace_desc_t));
                          mdb_free(ha, sizeof (ql_adapter_state_t));
                          return (DCMD_OK);
                  }
          }
  
!         /* Check if anything logged or not */
!         if (trace_desc->csize == 0) {
!                 mdb_warn("Extended log buffer is empty.\n");
!                 mdb_free(trace_desc, sizeof (ql_trace_desc_t));
                  mdb_free(ha, sizeof (ql_adapter_state_t));
                  return (DCMD_OK);
          }
  
          /*
!          * Locate the start and end point. If ever wrapped, then
!          * always print from start to end in the circular buffer
           */
  
!         /* always print from start to end */
!         for (i = trace_desc->start; i < trace_desc->csize; i++) {
!                 if (mdb_vread(&entry, sizeof (ql_trace_entry_t),
!                     (uintptr_t)&trace_desc->trace_buffer[i]) !=
!                     sizeof (ql_trace_entry_t)) {
!                         mdb_warn("Cannot read trace entry. %xh", i);
!                         mdb_free(trace_desc, sizeof (ql_trace_desc_t));
!                         mdb_free(ha, sizeof (ql_adapter_state_t));
!                         return (DCMD_ERR);
                  }
+                 if (entry.buf[0] != 0) {
+                         (void) mdb_snprintf(merge, sizeof (merge),
+                             "[%Y:%03d:%03d:%03d] "
+                             "%s",
+                             entry.hs_time.tv_sec,
+                             (int)entry.hs_time.tv_nsec / 1000000,
+                             (int)(entry.hs_time.tv_nsec / 1000) % 1000,
+                             (int)entry.hs_time.tv_nsec % 1000,
+                             entry.buf + 1);
+                 }
+                 mdb_printf("%s", merge);
+         }
  
!         if (trace_desc->start != 0) {
!                 for (i = 0; i < trace_desc->start; i++) {
!                         if (mdb_vread(&entry, sizeof (ql_trace_entry_t),
!                             (uintptr_t)&trace_desc->trace_buffer[i]) !=
!                             sizeof (ql_trace_entry_t)) {
!                                 mdb_warn("Cannot read trace entry. %xh", i);
!                                 mdb_free(trace_desc, sizeof (ql_trace_desc_t));
!                                 mdb_free(ha, sizeof (ql_adapter_state_t));
!                                 return (DCMD_ERR);
                          }
!                         if (entry.buf[0] != 0) {
!                                 (void) mdb_snprintf(merge, sizeof (merge),
!                                     "[%Y:%03d:%03d:%03d] "
!                                     "%s",
!                                     entry.hs_time.tv_sec,
!                                     (int)entry.hs_time.tv_nsec / 1000000,
!                                     (int)(entry.hs_time.tv_nsec / 1000) % 1000,
!                                     (int)entry.hs_time.tv_nsec % 1000,
!                                     entry.buf + 1);
                          }
+                         mdb_printf("%s", merge);
                  }
+         }
  
+         mdb_printf("\n");
+         mdb_free(trace_desc, sizeof (ql_trace_desc_t));
          mdb_free(ha, sizeof (ql_adapter_state_t));
          return (DCMD_OK);
  }
+ 
  /*
   * ql_doprint
   *      ql generic function to call the print dcmd
   *
   * Input:
*** 3407,3417 ****
              qlcstate_dcmd },
          { "qlctgtq", NULL, "Prints qlc target queues", qltgtq_dcmd },
          { "qlcwdog", NULL, "Prints out watchdog linked list", qlc_wdog_dcmd},
          { "qlcgetdump", ":[-v]", "Retrieves the ASCII f/w dump",
              qlc_getdump_dcmd },
!         { "qlcgettrace", ":[-v]", "Retrieves the ASCII Extended Logging trace",
              qlc_gettrace_dcmd },
          { NULL }
  };
  
  /*
--- 4061,4071 ----
              qlcstate_dcmd },
          { "qlctgtq", NULL, "Prints qlc target queues", qltgtq_dcmd },
          { "qlcwdog", NULL, "Prints out watchdog linked list", qlc_wdog_dcmd},
          { "qlcgetdump", ":[-v]", "Retrieves the ASCII f/w dump",
              qlc_getdump_dcmd },
!         { "qlcgettrace", ":", "Retrieves the ASCII Extended Logging trace",
              qlc_gettrace_dcmd },
          { NULL }
  };
  
  /*