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>

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/common/modules/qlc/qlc.c
          +++ new/usr/src/cmd/mdb/common/modules/qlc/qlc.c
↓ open down ↓ 11 lines elided ↑ open up ↑
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22      -/* Copyright 2010 QLogic Corporation */
       22 +/* Copyright 2015 QLogic Corporation */
  23   23  
  24   24  /*
  25   25   * ISP2xxx Solaris Fibre Channel Adapter (FCA) qlc mdb source file.
  26   26   *
  27   27   * ***********************************************************************
  28   28   * *                                                                    **
  29   29   * *                            NOTICE                                  **
  30      - * *            COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION              **
       30 + * *            COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION              **
  31   31   * *                    ALL RIGHTS RESERVED                             **
  32   32   * *                                                                    **
  33   33   * ***********************************************************************
  34   34   *
  35   35   */
  36   36  
  37      -#pragma ident   "Copyright 2010 QLogic Corporation; ql_mdb.c"
       37 +#pragma ident   "Copyright 2015 QLogic Corporation; ql_mdb.c"
  38   38  
  39   39  #include <sys/mdb_modapi.h>
  40   40  #include <ql_apps.h>
  41   41  #include <ql_api.h>
  42   42  #include <ql_init.h>
  43      -#include <ql_debug.h>
  44   43  
  45   44  /*
  46   45   * local prototypes
  47   46   */
  48   47  static int32_t ql_doprint(uintptr_t, int8_t *);
  49   48  static void ql_dump_flags(uint64_t, int8_t **);
  50   49  static int qlclinks_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
  51   50  static int qlcstate_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
  52   51  static int qlc_osc_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
  53   52  static int qlc_wdog_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
↓ open down ↓ 13 lines elided ↑ open up ↑
  67   66  static int get_first_link(ql_head_t *, ql_link_t *);
  68   67  
  69   68  static int ql_24xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
  70   69      const mdb_arg_t *);
  71   70  static int ql_23xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
  72   71      const mdb_arg_t *);
  73   72  static int ql_25xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
  74   73      const mdb_arg_t *);
  75   74  static int ql_81xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
  76   75      const mdb_arg_t *);
       76 +static int ql_8021_dump_dcmd(ql_adapter_state_t *, uint_t, int,
       77 +    const mdb_arg_t *);
       78 +static int ql_8300_dump_dcmd(ql_adapter_state_t *, uint_t, int,
       79 +    const mdb_arg_t *);
  77   80  static void ql_elog_common(ql_adapter_state_t *, boolean_t);
  78   81  
  79   82  /*
  80   83   * local adapter state flags strings
  81   84   */
  82   85  int8_t *adapter_state_flags[] = {
  83   86          "FCA_BOUND",
  84   87          "QL_OPENED",
  85   88          "ONLINE",
  86   89          "INTERRUPTS_ENABLED",
  87   90          "ABORT_CMDS_LOOP_DOWN_TMO",
  88   91          "POINT_TO_POINT",
  89   92          "IP_ENABLED",
  90   93          "IP_INITIALIZED",
  91   94          "MENLO_LOGIN_OPERATIONAL",
  92   95          "ADAPTER_SUSPENDED",
  93      -        "ADAPTER_TIMER_BUSY",
       96 +        "FW_DUMP_NEEDED",
  94   97          "PARITY_ERROR",
  95   98          "FLASH_ERRLOG_MARKER",
  96   99          "VP_ENABLED",
  97  100          "FDISC_ENABLED",
  98      -        "FUNCTION_1",
      101 +        "MULTI_QUEUE",
  99  102          "MPI_RESET_NEEDED",
      103 +        "VP_ID_NOT_ACQUIRED",
      104 +        "IDC_STALL_NEEDED",
      105 +        "POLL_INTR",
      106 +        "IDC_RESTART_NEEDED",
      107 +        "IDC_ACK_NEEDED",
      108 +        "LOOPBACK_ACTIVE",
      109 +        "QUEUE_SHADOW_PTRS",
      110 +        "NO_INTR_HANDSHAKE",
      111 +        "COMP_THD_TERMINATE",
      112 +        "DISABLE_NIC_FW_DMP",
      113 +        "MULTI_CHIP_ADAPTER",
 100  114          NULL
 101  115  };
 102  116  
 103  117  int8_t *adapter_config_flags[] = {
 104      -        "ENABLE_HARD_ADDRESS",
      118 +        "CTRL_27XX",
 105  119          "ENABLE_64BIT_ADDRESSING",
 106  120          "ENABLE_LIP_RESET",
 107  121          "ENABLE_FULL_LIP_LOGIN",
 108  122          "ENABLE_TARGET_RESET",
 109  123          "ENABLE_LINK_DOWN_REPORTING",
 110  124          "DISABLE_EXTENDED_LOGGING_TRACE",
 111  125          "ENABLE_FCP_2_SUPPORT",
 112      -        "MULTI_CHIP_ADAPTER",
      126 +        "CTRL_83XX",
 113  127          "SBUS_CARD",
 114      -        "CTRL_2300",
 115      -        "CTRL_6322",
 116      -        "CTRL_2200",
 117      -        "CTRL_2422",
      128 +        "CTRL_23XX",
      129 +        "CTRL_63XX",
      130 +        "CTRL_22XX",
      131 +        "CTRL_24XX",
 118  132          "CTRL_25XX",
 119  133          "ENABLE_EXTENDED_LOGGING",
 120  134          "DISABLE_RISC_CODE_LOAD",
 121  135          "SET_CACHE_LINE_SIZE_1",
 122  136          "CTRL_MENLO",
 123  137          "EXT_FW_INTERFACE",
 124  138          "LOAD_FLASH_FW",
 125  139          "DUMP_MAILBOX_TIMEOUT",
 126  140          "DUMP_ISP_SYSTEM_ERROR",
 127  141          "DUMP_DRIVER_COMMAND_TIMEOUT",
 128  142          "DUMP_LOOP_OFFLINE_TIMEOUT",
 129  143          "ENABLE_FWEXTTRACE",
 130  144          "ENABLE_FWFCETRACE",
 131      -        "FW_MISMATCH",
      145 +        "CTRL_80XX",
 132  146          "CTRL_81XX",
 133      -        "CTRL_8021",
 134      -        "ENABLE_FAST_TIMEOUT",
      147 +        "CTRL_82XX",
      148 +        "FAST_TIMEOUT",
 135  149          "LR_SUPPORT",
 136  150          NULL
 137  151  };
 138  152  
 139  153  /*
 140  154   * local task daemon flags strings
 141  155   */
 142  156  int8_t *task_daemon_flags[] = {
 143  157          "TASK_DAEMON_STOP_FLG",
 144  158          "TASK_DAEMON_SLEEPING_FLG",
 145  159          "TASK_DAEMON_ALIVE_FLG",
 146  160          "TASK_DAEMON_IDLE_CHK_FLG",
 147  161          "SUSPENDED_WAKEUP_FLG",
 148  162          "FC_STATE_CHANGE",
 149  163          "NEED_UNSOLICITED_BUFFERS",
 150      -        "RESET_MARKER_NEEDED",
 151      -        "RESET_ACTIVE",
      164 +        "MARKER_NEEDED",
      165 +        "MARKER_ACTIVE",
 152  166          "ISP_ABORT_NEEDED",
 153  167          "ABORT_ISP_ACTIVE",
 154  168          "LOOP_RESYNC_NEEDED",
 155  169          "LOOP_RESYNC_ACTIVE",
 156  170          "LOOP_DOWN",
 157  171          "DRIVER_STALL",
 158  172          "COMMAND_WAIT_NEEDED",
 159  173          "COMMAND_WAIT_ACTIVE",
 160  174          "STATE_ONLINE",
 161  175          "ABORT_QUEUES_NEEDED",
 162  176          "TASK_DAEMON_STALLED_FLG",
 163      -        "TASK_THREAD_CALLED",
      177 +        "SEND_PLOGI",
 164  178          "FIRMWARE_UP",
 165      -        "LIP_RESET_PENDING",
      179 +        "IDC_POLL_NEEDED",
 166  180          "FIRMWARE_LOADED",
 167  181          "RSCN_UPDATE_NEEDED",
 168  182          "HANDLE_PORT_BYPASS_CHANGE",
 169  183          "PORT_RETRY_NEEDED",
 170  184          "TASK_DAEMON_POWERING_DOWN",
 171  185          "TD_IIDMA_NEEDED",
 172      -        "SEND_PLOGI",
 173      -        "IDC_EVENT",
      186 +        "WATCHDOG_NEEDED",
      187 +        "LED_BLINK",
 174  188          NULL
 175  189  };
 176  190  
 177  191  /*
 178  192   * local interrupt aif flags
 179  193   */
 180  194  int8_t *aif_flags[] = {
 181  195          "IFLG_INTR_LEGACY",
 182  196          "IFLG_INTR_FIXED",
 183  197          "IFLG_INTR_MSI",
↓ open down ↓ 18 lines elided ↑ open up ↑
 202  216          "SRB_FCP_RSP_PKT",
 203  217          "SRB_IP_PKT",
 204  218          "SRB_GENERIC_SERVICES_PKT",
 205  219          "SRB_COMMAND_TIMEOUT",
 206  220          "SRB_ABORTING",
 207  221          "SRB_IN_DEVICE_QUEUE",
 208  222          "SRB_IN_TOKEN_ARRAY",
 209  223          "SRB_UB_FREE_REQUESTED",
 210  224          "SRB_UB_ACQUIRED",
 211  225          "SRB_MS_PKT",
      226 +        "SRB_ELS_PKT",
 212  227          NULL
 213  228  };
 214  229  
 215  230  int8_t *qllun_flags[] = {
 216  231          "LQF_UNTAGGED_PENDING",
 217  232          NULL
 218  233  };
 219  234  
 220  235  int8_t *qltgt_flags[] = {
 221  236          "TQF_TAPE_DEVICE",
 222  237          "TQF_QUEUE_SUSPENDED",
 223  238          "TQF_FABRIC_DEVICE",
 224  239          "TQF_INITIATOR_DEVICE",
 225  240          "TQF_RSCN_RCVD",
 226  241          "TQF_NEED_AUTHENTICATION",
 227  242          "TQF_PLOGI_PROGRS",
 228  243          "TQF_IIDMA_NEEDED",
      244 +        "TQF_LOGIN_NEEDED",
 229  245          NULL
 230  246  };
 231  247  
 232  248  int8_t *qldump_flags[] = {
 233  249          "QL_DUMPING",
 234  250          "QL_DUMP_VALID",
 235  251          "QL_DUMP_UPLOADED",
 236  252          NULL
 237  253  };
 238  254  
↓ open down ↓ 24 lines elided ↑ open up ↑
 263  279  
 264  280          if ((flags & DCMD_ADDRSPEC) || argc != 0) {
 265  281                  return (DCMD_USAGE);
 266  282          }
 267  283  
 268  284          if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
 269  285                  mdb_warn("failed to read ql_hba structure");
 270  286                  return (DCMD_ERR);
 271  287          }
 272  288  
 273      -        if (&ql_hba == NULL) {
      289 +        if (ql_hba.first == NULL) {
 274  290                  mdb_warn("failed to read ql_hba structure -- is qlc loaded?");
 275  291                  return (DCMD_ERR);
 276  292          }
 277  293  
 278  294          mdb_printf("\nqlc adapter state linkages (f=0x%llx, l=0x%llx)\n\n",
 279  295              ql_hba.first, ql_hba.last);
 280  296  
 281  297          if ((qlstate = (ql_adapter_state_t *)mdb_alloc(
 282  298              sizeof (ql_adapter_state_t), UM_SLEEP)) == NULL) {
 283  299                  mdb_warn("Unable to allocate memory for ql_adapter_state\n");
↓ open down ↓ 154 lines elided ↑ open up ↑
 438  454                          if (mdb_vread(fwverptr, sizeof (void *),
 439  455                              (uintptr_t)fwt->fw_version) == -1) {
 440  456                                  mdb_warn("unable to read fwverptr\n");
 441  457                                  mdb_free(fwverptr, sizeof (void *));
 442  458                                  mdb_free(qlstate, sizeof (ql_adapter_state_t));
 443  459                                  return (DCMD_OK);
 444  460                          }
 445  461  
 446  462                          mdb_printf("%x\t%-11s", fwt->fw_class, fwverptr);
 447  463  
 448      -                        if (&ql_hba == NULL) {
      464 +                        if (ql_hba.first == NULL) {
 449  465                                  mdb_warn("failed to read ql_hba structure");
 450  466                                  hbaptr = NULL;
 451  467                          } else {
 452  468                                  hbaptr = (uintptr_t)ql_hba.first;
 453  469                          }
 454  470  
 455  471                          found = 0;
 456  472                          while (hbaptr != NULL) {
 457  473  
 458  474                                  if (mdb_vread(qlstate,
↓ open down ↓ 103 lines elided ↑ open up ↑
 562  578                  elswitch = FALSE;
 563  579          } else {
 564  580                  return (DCMD_USAGE);
 565  581          }
 566  582  
 567  583          if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
 568  584                  mdb_warn("failed to read ql_hba structure");
 569  585                  return (DCMD_ERR);
 570  586          }
 571  587  
 572      -        if (&ql_hba == NULL) {
      588 +        if (ql_hba.first == NULL) {
 573  589                  mdb_warn("failed to read ql_hba structure - is qlc loaded?");
 574  590                  return (DCMD_ERR);
 575  591          }
 576  592  
 577  593          if ((qlstate = (ql_adapter_state_t *)mdb_alloc(qlsize,
 578  594              UM_SLEEP)) == NULL) {
 579  595                  mdb_warn("Unable to allocate memory for "
 580  596                      "ql_adapter_state\n");
 581  597                  return (DCMD_OK);
 582  598          }
↓ open down ↓ 163 lines elided ↑ open up ↑
 746  762          qlosc = (uintptr_t)qlstate->outstanding_cmds;
 747  763          mdb_printf("qlc instance: %d, base addr = %llx, osc base = %p\n",
 748  764              qlstate->instance, qlstate->hba.base_address, qlosc);
 749  765  
 750  766          if ((qlsrb = (ql_srb_t *)mdb_alloc(sizeof (ql_srb_t), UM_SLEEP)) ==
 751  767              NULL) {
 752  768                  mdb_free(qlstate, sizeof (ql_adapter_state_t));
 753  769                  mdb_warn("failed to allocate space for srb_t\n");
 754  770                  return (DCMD_OK);
 755  771          }
 756      -        for (indx = 0; indx < MAX_OUTSTANDING_COMMANDS; indx++, qlosc += 8) {
      772 +        for (indx = 0; indx < qlstate->osc_max_cnt; indx++, qlosc += 8) {
 757  773                  if (mdb_vread(&ptr1, 8, qlosc) == -1) {
 758  774                          mdb_warn("failed to read ptr1, indx=%d", indx);
 759  775                          break;
 760  776                  }
 761  777                  if (ptr1 == 0) {
 762  778                          continue;
 763  779                  }
 764  780  
 765  781                  mdb_printf("osc ptr = %p, indx = %xh\n", ptr1, indx);
 766  782  
↓ open down ↓ 829 lines elided ↑ open up ↑
1596 1612                  return (DCMD_OK);
1597 1613          }
1598 1614  
1599 1615          if ((qlstate = (ql_adapter_state_t *)mdb_alloc(qlsize,
1600 1616              UM_SLEEP)) == NULL) {
1601 1617                  mdb_warn("Unable to allocate memory for ql_adapter_state\n");
1602 1618                  return (DCMD_OK);
1603 1619          }
1604 1620  
1605 1621          if (addr == NULL) {
1606      -                char            *tptr;
1607 1622                  uint32_t        instance;
1608 1623  
1609 1624                  if (argc == 0) {
1610 1625                          mdb_warn("must specify either the ha addr or "
1611 1626                              "the instance number\n");
1612 1627                          mdb_free(qlstate, qlsize);
1613 1628                          return (DCMD_OK);
1614 1629                  }
1615 1630  
1616 1631                  /*
1617 1632                   * find the specified instance in the ha list
1618 1633                   */
1619 1634  
1620      -                instance = (uint32_t)strtol(argv[1].a_un.a_str, &tptr, 16);
1621      -                if (tptr == argv[1].a_un.a_str) {
1622      -                        mdb_printf("instance # is illegal: '%s'\n",
1623      -                            argv[1].a_un.a_str);
1624      -                        mdb_free(qlstate, qlsize);
1625      -                        return (DCMD_OK);
1626      -                }
     1635 +                instance = (uint32_t)mdb_strtoull(argv[1].a_un.a_str);
1627 1636  
1628 1637                  if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
1629 1638                          mdb_warn("failed to read ql_hba structure");
1630 1639                          mdb_free(qlstate, qlsize);
1631 1640                          return (DCMD_ERR);
1632 1641                  }
1633 1642  
1634 1643                  if (&ql_hba == NULL) {
1635 1644                          mdb_warn("failed to read ql_hba structure - "
1636 1645                              "is qlc loaded?");
↓ open down ↓ 117 lines elided ↑ open up ↑
1754 1763                  mdb_warn("failed to allocate memory for ql_adapter_state\n");
1755 1764                  return (DCMD_OK);
1756 1765          }
1757 1766  
1758 1767          /*
1759 1768           * show user which instances have valid f/w dumps available if
1760 1769           * user has specified verbose option
1761 1770           */
1762 1771          if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
1763 1772                  mdb_warn("failed to read ql_hba structure");
1764      -        } else if (&ql_hba == NULL) {
     1773 +        } else if (ql_hba.first == NULL) {
1765 1774                  mdb_warn("failed to read ql_hba structure -- is qlc loaded?");
1766 1775          } else if (verbose) {
1767 1776                  hbaptr = (uintptr_t)ql_hba.first;
1768 1777                  while (hbaptr != NULL) {
1769 1778  
1770 1779                          if (mdb_vread(ha, sizeof (ql_adapter_state_t),
1771 1780                              hbaptr) == -1) {
1772 1781                                  mdb_free(ha, sizeof (ql_adapter_state_t));
1773 1782                                  mdb_warn("failed read ql_adapter_state at %p",
1774 1783                                      hbaptr);
↓ open down ↓ 35 lines elided ↑ open up ↑
1810 1819           * then bail out
1811 1820           */
1812 1821          if (((ha->ql_dump_state & QL_DUMP_VALID) == 0) ||
1813 1822              (ha->ql_dump_ptr == NULL)) {
1814 1823                  mdb_warn("dump does not exist for instance %d (%x, %p)\n",
1815 1824                      ha->instance, ha->ql_dump_state, ha->ql_dump_ptr);
1816 1825                  mdb_free(ha, sizeof (ql_adapter_state_t));
1817 1826                  return (DCMD_OK);
1818 1827          }
1819 1828  
1820      -        if (CFG_IST(ha, CFG_CTRL_2422)) {
     1829 +        if (CFG_IST(ha, CFG_CTRL_24XX)) {
1821 1830                  (void) ql_24xx_dump_dcmd(ha, flags, argc, argv);
1822      -        } else if (CFG_IST(ha, CFG_CTRL_25XX))  {
     1831 +        } else if (CFG_IST(ha, CFG_CTRL_25XX)) {
1823 1832                  (void) ql_25xx_dump_dcmd(ha, flags, argc, argv);
1824      -        } else if (CFG_IST(ha, CFG_CTRL_81XX))  {
     1833 +        } else if (CFG_IST(ha, CFG_CTRL_81XX)) {
1825 1834                  (void) ql_81xx_dump_dcmd(ha, flags, argc, argv);
1826      -        } else if (!(CFG_IST(ha, CFG_CTRL_8021)))  {
     1835 +        } else if (CFG_IST(ha, CFG_CTRL_82XX | CFG_CTRL_27XX)) {
     1836 +                (void) ql_8021_dump_dcmd(ha, flags, argc, argv);
     1837 +        } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
     1838 +                (void) ql_8300_dump_dcmd(ha, flags, argc, argv);
     1839 +        } else {
1827 1840                  (void) ql_23xx_dump_dcmd(ha, flags, argc, argv);
1828 1841          }
1829 1842  
1830 1843          mdb_free(ha, sizeof (ql_adapter_state_t));
1831 1844  
1832 1845          return (DCMD_OK);
1833 1846  }
1834 1847  
1835 1848  /*
     1849 + * ql_8021_dump_dcmd
     1850 + *      prints out a firmware dump buffer
     1851 + *
     1852 + * Input:
     1853 + *      addr  = User supplied address. (NB: nust be an ha)
     1854 + *      flags = mdb flags.
     1855 + *      argc  = Number of user supplied args.
     1856 + *      argv  = Arg array.
     1857 + *
     1858 + * Returns:
     1859 + *      DCMD_OK or DCMD_ERR
     1860 + *
     1861 + * Context:
     1862 + *      User context.
     1863 + *
     1864 + */
     1865 +/*ARGSUSED*/
     1866 +static int
     1867 +ql_8021_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
     1868 +    const mdb_arg_t *argv)
     1869 +{
     1870 +        uint8_t         *fw, *bp;
     1871 +        uint32_t        cnt = 0;
     1872 +
     1873 +        bp = fw = (uint8_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
     1874 +
     1875 +        if (mdb_vread(fw, ha->ql_dump_size,
     1876 +            (uintptr_t)ha->ql_dump_ptr) == -1) {
     1877 +                mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
     1878 +                mdb_free(fw, ha->ql_dump_size);
     1879 +                return (DCMD_OK);
     1880 +        }
     1881 +
     1882 +        while (cnt < ha->ql_dump_size) {
     1883 +                mdb_printf("%02x ", *bp++);
     1884 +                if (++cnt % 16 == 0) {
     1885 +                        mdb_printf("\n");
     1886 +                }
     1887 +        }
     1888 +        if (cnt % 16 != 0) {
     1889 +                mdb_printf("\n");
     1890 +        }
     1891 +
     1892 +        mdb_free(fw, ha->ql_dump_size);
     1893 +
     1894 +        return (DCMD_OK);
     1895 +}
     1896 +
     1897 +/*
     1898 + * ql_83xx_dump_dcmd
     1899 + *      prints out a firmware dump buffer
     1900 + *
     1901 + * Input:
     1902 + *      addr  = User supplied address. (NB: must be an ha)
     1903 + *      flags = mdb flags.
     1904 + *      argc  = Number of user supplied args.
     1905 + *      argv  = Arg array.
     1906 + *
     1907 + * Returns:
     1908 + *      DCMD_OK or DCMD_ERR
     1909 + *
     1910 + * Context:
     1911 + *      User context.
     1912 + *
     1913 + */
     1914 +/*ARGSUSED*/
     1915 +static int
     1916 +ql_8300_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
     1917 +    const mdb_arg_t *argv)
     1918 +{
     1919 +        ql_83xx_fw_dump_t       *fw;
     1920 +        ql_response_q_t         **rsp_queues, *rsp_q;
     1921 +        uint32_t                cnt, cnt1, *dp, *dp2;
     1922 +
     1923 +        fw = mdb_alloc(ha->ql_dump_size, UM_SLEEP);
     1924 +        rsp_queues = mdb_alloc(ha->rsp_queues_cnt *
     1925 +            sizeof (ql_response_q_t *), UM_SLEEP);
     1926 +        rsp_q = mdb_alloc(sizeof (ql_response_q_t), UM_SLEEP);
     1927 +
     1928 +        if (mdb_vread(fw, ha->ql_dump_size,
     1929 +            (uintptr_t)ha->ql_dump_ptr) == -1 ||
     1930 +            mdb_vread(rsp_queues, ha->rsp_queues_cnt *
     1931 +            sizeof (ql_response_q_t *), (uintptr_t)ha->rsp_queues) == -1) {
     1932 +                mdb_warn("failed to read fw_dump_buffer (no f/w dump active?)");
     1933 +                mdb_free(rsp_q, sizeof (ql_response_q_t));
     1934 +                mdb_free(rsp_queues, ha->rsp_queues_cnt *
     1935 +                    sizeof (ql_response_q_t *));
     1936 +                mdb_free(fw, ha->ql_dump_size);
     1937 +                return (DCMD_OK);
     1938 +        }
     1939 +
     1940 +        mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
     1941 +            ha->fw_major_version, ha->fw_minor_version,
     1942 +            ha->fw_subminor_version, ha->fw_attributes);
     1943 +
     1944 +        mdb_printf("\nHCCR Register\n%08x\n", fw->hccr);
     1945 +
     1946 +        mdb_printf("\nR2H Status Register\n%08x\n", fw->r2h_status);
     1947 +
     1948 +        mdb_printf("\nAER Uncorrectable Error Status Register\n%08x\n",
     1949 +            fw->aer_ues);
     1950 +
     1951 +        mdb_printf("\nHostRisc Registers");
     1952 +        for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
     1953 +                if (cnt % 8 == 0) {
     1954 +                        mdb_printf("\n");
     1955 +                }
     1956 +                mdb_printf("%08x ", fw->hostrisc_reg[cnt]);
     1957 +        }
     1958 +
     1959 +        mdb_printf("\n\nPCIe Registers");
     1960 +        for (cnt = 0; cnt < sizeof (fw->pcie_reg) / 4; cnt++) {
     1961 +                if (cnt % 8 == 0) {
     1962 +                        mdb_printf("\n");
     1963 +                }
     1964 +                mdb_printf("%08x ", fw->pcie_reg[cnt]);
     1965 +        }
     1966 +
     1967 +        dp = fw->req_rsp_ext_mem;
     1968 +        for (cnt = 0; cnt < ha->rsp_queues_cnt; cnt++) {
     1969 +                mdb_printf("\n\nQueue Pointers #%d:\n", cnt);
     1970 +                for (cnt1 = 0; cnt1 < 4; cnt1++) {
     1971 +                        mdb_printf("%08x ", *dp++);
     1972 +                }
     1973 +        }
     1974 +
     1975 +        mdb_printf("\n\nHost Interface Registers");
     1976 +        for (cnt = 0; cnt < sizeof (fw->host_reg) / 4; cnt++) {
     1977 +                if (cnt % 8 == 0) {
     1978 +                        mdb_printf("\n");
     1979 +                }
     1980 +                mdb_printf("%08x ", fw->host_reg[cnt]);
     1981 +        }
     1982 +
     1983 +        mdb_printf("\n\nShadow Registers");
     1984 +        for (cnt = 0; cnt < sizeof (fw->shadow_reg) / 4; cnt++) {
     1985 +                if (cnt % 8 == 0) {
     1986 +                        mdb_printf("\n");
     1987 +                }
     1988 +                mdb_printf("%08x ", fw->shadow_reg[cnt]);
     1989 +        }
     1990 +
     1991 +        mdb_printf("\n\nRISC IO Register\n%08x", fw->risc_io);
     1992 +
     1993 +        mdb_printf("\n\nMailbox Registers");
     1994 +        for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
     1995 +                if (cnt % 16 == 0) {
     1996 +                        mdb_printf("\n");
     1997 +                }
     1998 +                mdb_printf("%04x ", fw->mailbox_reg[cnt]);
     1999 +        }
     2000 +
     2001 +        mdb_printf("\n\nXSEQ GP Registers");
     2002 +        for (cnt = 0; cnt < sizeof (fw->xseq_gp_reg) / 4; cnt++) {
     2003 +                if (cnt % 8 == 0) {
     2004 +                        mdb_printf("\n");
     2005 +                }
     2006 +                mdb_printf("%08x ", fw->xseq_gp_reg[cnt]);
     2007 +        }
     2008 +
     2009 +        mdb_printf("\n\nXSEQ-0 Registers");
     2010 +        for (cnt = 0; cnt < sizeof (fw->xseq_0_reg) / 4; cnt++) {
     2011 +                if (cnt % 8 == 0) {
     2012 +                        mdb_printf("\n");
     2013 +                }
     2014 +                mdb_printf("%08x ", fw->xseq_0_reg[cnt]);
     2015 +        }
     2016 +
     2017 +        mdb_printf("\n\nXSEQ-1 Registers");
     2018 +        for (cnt = 0; cnt < sizeof (fw->xseq_1_reg) / 4; cnt++) {
     2019 +                if (cnt % 8 == 0) {
     2020 +                        mdb_printf("\n");
     2021 +                }
     2022 +                mdb_printf("%08x ", fw->xseq_1_reg[cnt]);
     2023 +        }
     2024 +
     2025 +        mdb_printf("\n\nXSEQ-2 Registers");
     2026 +        for (cnt = 0; cnt < sizeof (fw->xseq_2_reg) / 4; cnt++) {
     2027 +                if (cnt % 8 == 0) {
     2028 +                        mdb_printf("\n");
     2029 +                }
     2030 +                mdb_printf("%08x ", fw->xseq_2_reg[cnt]);
     2031 +        }
     2032 +
     2033 +        mdb_printf("\n\nRSEQ GP Registers");
     2034 +        for (cnt = 0; cnt < sizeof (fw->rseq_gp_reg) / 4; cnt++) {
     2035 +                if (cnt % 8 == 0) {
     2036 +                        mdb_printf("\n");
     2037 +                }
     2038 +                mdb_printf("%08x ", fw->rseq_gp_reg[cnt]);
     2039 +        }
     2040 +
     2041 +        mdb_printf("\n\nRSEQ-0 Registers");
     2042 +        for (cnt = 0; cnt < sizeof (fw->rseq_0_reg) / 4; cnt++) {
     2043 +                if (cnt % 8 == 0) {
     2044 +                        mdb_printf("\n");
     2045 +                }
     2046 +                mdb_printf("%08x ", fw->rseq_0_reg[cnt]);
     2047 +        }
     2048 +
     2049 +        mdb_printf("\n\nRSEQ-1 Registers");
     2050 +        for (cnt = 0; cnt < sizeof (fw->rseq_1_reg) / 4; cnt++) {
     2051 +                if (cnt % 8 == 0) {
     2052 +                        mdb_printf("\n");
     2053 +                }
     2054 +                mdb_printf("%08x ", fw->rseq_1_reg[cnt]);
     2055 +        }
     2056 +
     2057 +        mdb_printf("\n\nRSEQ-2 Registers");
     2058 +        for (cnt = 0; cnt < sizeof (fw->rseq_2_reg) / 4; cnt++) {
     2059 +                if (cnt % 8 == 0) {
     2060 +                        mdb_printf("\n");
     2061 +                }
     2062 +                mdb_printf("%08x ", fw->rseq_2_reg[cnt]);
     2063 +        }
     2064 +
     2065 +        mdb_printf("\n\nRSEQ-3 Registers");
     2066 +        for (cnt = 0; cnt < sizeof (fw->rseq_3_reg) / 4; cnt++) {
     2067 +                if (cnt % 8 == 0) {
     2068 +                        mdb_printf("\n");
     2069 +                }
     2070 +                mdb_printf("%08x ", fw->rseq_3_reg[cnt]);
     2071 +        }
     2072 +
     2073 +        mdb_printf("\n\nASEQ GP Registers");
     2074 +        for (cnt = 0; cnt < sizeof (fw->aseq_gp_reg) / 4; cnt++) {
     2075 +                if (cnt % 8 == 0) {
     2076 +                        mdb_printf("\n");
     2077 +                }
     2078 +                mdb_printf("%08x ", fw->aseq_gp_reg[cnt]);
     2079 +        }
     2080 +
     2081 +        mdb_printf("\n\nASEQ-0 Registers");
     2082 +        for (cnt = 0; cnt < sizeof (fw->aseq_0_reg) / 4; cnt++) {
     2083 +                if (cnt % 8 == 0) {
     2084 +                        mdb_printf("\n");
     2085 +                }
     2086 +                mdb_printf("%08x ", fw->aseq_0_reg[cnt]);
     2087 +        }
     2088 +
     2089 +        mdb_printf("\n\nASEQ-1 Registers");
     2090 +        for (cnt = 0; cnt < sizeof (fw->aseq_1_reg) / 4; cnt++) {
     2091 +                if (cnt % 8 == 0) {
     2092 +                        mdb_printf("\n");
     2093 +                }
     2094 +                mdb_printf("%08x ", fw->aseq_1_reg[cnt]);
     2095 +        }
     2096 +
     2097 +        mdb_printf("\n\nASEQ-2 Registers");
     2098 +        for (cnt = 0; cnt < sizeof (fw->aseq_2_reg) / 4; cnt++) {
     2099 +                if (cnt % 8 == 0) {
     2100 +                        mdb_printf("\n");
     2101 +                }
     2102 +                mdb_printf("%08x ", fw->aseq_2_reg[cnt]);
     2103 +        }
     2104 +
     2105 +        mdb_printf("\n\nASEQ-3 Registers");
     2106 +        for (cnt = 0; cnt < sizeof (fw->aseq_3_reg) / 4; cnt++) {
     2107 +                if (cnt % 8 == 0) {
     2108 +                        mdb_printf("\n");
     2109 +                }
     2110 +                mdb_printf("%08x ", fw->aseq_3_reg[cnt]);
     2111 +        }
     2112 +
     2113 +        mdb_printf("\n\nCommand DMA Registers");
     2114 +        for (cnt = 0; cnt < sizeof (fw->cmd_dma_reg) / 4; cnt++) {
     2115 +                if (cnt % 8 == 0) {
     2116 +                        mdb_printf("\n");
     2117 +                }
     2118 +                mdb_printf("%08x ", fw->cmd_dma_reg[cnt]);
     2119 +        }
     2120 +
     2121 +        mdb_printf("\n\nRequest0 Queue DMA Channel Registers");
     2122 +        for (cnt = 0; cnt < sizeof (fw->req0_dma_reg) / 4; cnt++) {
     2123 +                if (cnt % 8 == 0) {
     2124 +                        mdb_printf("\n");
     2125 +                }
     2126 +                mdb_printf("%08x ", fw->req0_dma_reg[cnt]);
     2127 +        }
     2128 +
     2129 +        mdb_printf("\n\nResponse0 Queue DMA Channel Registers");
     2130 +        for (cnt = 0; cnt < sizeof (fw->resp0_dma_reg) / 4; cnt++) {
     2131 +                if (cnt % 8 == 0) {
     2132 +                        mdb_printf("\n");
     2133 +                }
     2134 +                mdb_printf("%08x ", fw->resp0_dma_reg[cnt]);
     2135 +        }
     2136 +
     2137 +        mdb_printf("\n\nRequest1 Queue DMA Channel Registers");
     2138 +        for (cnt = 0; cnt < sizeof (fw->req1_dma_reg) / 4; cnt++) {
     2139 +                if (cnt % 8 == 0) {
     2140 +                        mdb_printf("\n");
     2141 +                }
     2142 +                mdb_printf("%08x ", fw->req1_dma_reg[cnt]);
     2143 +        }
     2144 +
     2145 +        mdb_printf("\n\nXMT0 Data DMA Registers");
     2146 +        for (cnt = 0; cnt < sizeof (fw->xmt0_dma_reg) / 4; cnt++) {
     2147 +                if (cnt % 8 == 0) {
     2148 +                        mdb_printf("\n");
     2149 +                }
     2150 +                mdb_printf("%08x ", fw->xmt0_dma_reg[cnt]);
     2151 +        }
     2152 +
     2153 +        mdb_printf("\n\nXMT1 Data DMA Registers");
     2154 +        for (cnt = 0; cnt < sizeof (fw->xmt1_dma_reg) / 4; cnt++) {
     2155 +                if (cnt % 8 == 0) {
     2156 +                        mdb_printf("\n");
     2157 +                }
     2158 +                mdb_printf("%08x ", fw->xmt1_dma_reg[cnt]);
     2159 +        }
     2160 +
     2161 +        mdb_printf("\n\nXMT2 Data DMA Registers");
     2162 +        for (cnt = 0; cnt < sizeof (fw->xmt2_dma_reg) / 4; cnt++) {
     2163 +                if (cnt % 8 == 0) {
     2164 +                        mdb_printf("\n");
     2165 +                }
     2166 +                mdb_printf("%08x ", fw->xmt2_dma_reg[cnt]);
     2167 +        }
     2168 +
     2169 +        mdb_printf("\n\nXMT3 Data DMA Registers");
     2170 +        for (cnt = 0; cnt < sizeof (fw->xmt3_dma_reg) / 4; cnt++) {
     2171 +                if (cnt % 8 == 0) {
     2172 +                        mdb_printf("\n");
     2173 +                }
     2174 +                mdb_printf("%08x ", fw->xmt3_dma_reg[cnt]);
     2175 +        }
     2176 +
     2177 +        mdb_printf("\n\nXMT4 Data DMA Registers");
     2178 +        for (cnt = 0; cnt < sizeof (fw->xmt4_dma_reg) / 4; cnt++) {
     2179 +                if (cnt % 8 == 0) {
     2180 +                        mdb_printf("\n");
     2181 +                }
     2182 +                mdb_printf("%08x ", fw->xmt4_dma_reg[cnt]);
     2183 +        }
     2184 +
     2185 +        mdb_printf("\n\nXMT Data DMA Common Registers");
     2186 +        for (cnt = 0; cnt < sizeof (fw->xmt_data_dma_reg) / 4; cnt++) {
     2187 +                if (cnt % 8 == 0) {
     2188 +                        mdb_printf("\n");
     2189 +                }
     2190 +                mdb_printf("%08x ", fw->xmt_data_dma_reg[cnt]);
     2191 +        }
     2192 +
     2193 +        mdb_printf("\n\nRCV Thread 0 Data DMA Registers");
     2194 +        for (cnt = 0; cnt < sizeof (fw->rcvt0_data_dma_reg) / 4; cnt++) {
     2195 +                if (cnt % 8 == 0) {
     2196 +                        mdb_printf("\n");
     2197 +                }
     2198 +                mdb_printf("%08x ", fw->rcvt0_data_dma_reg[cnt]);
     2199 +        }
     2200 +
     2201 +        mdb_printf("\n\nRCV Thread 1 Data DMA Registers");
     2202 +        for (cnt = 0; cnt < sizeof (fw->rcvt1_data_dma_reg) / 4; cnt++) {
     2203 +                if (cnt % 8 == 0) {
     2204 +                        mdb_printf("\n");
     2205 +                }
     2206 +                mdb_printf("%08x ", fw->rcvt1_data_dma_reg[cnt]);
     2207 +        }
     2208 +
     2209 +        mdb_printf("\n\nRISC GP Registers");
     2210 +        for (cnt = 0; cnt < sizeof (fw->risc_gp_reg) / 4; cnt++) {
     2211 +                if (cnt % 8 == 0) {
     2212 +                        mdb_printf("\n");
     2213 +                }
     2214 +                mdb_printf("%08x ", fw->risc_gp_reg[cnt]);
     2215 +        }
     2216 +
     2217 +        mdb_printf("\n\nLMC Registers");
     2218 +        for (cnt = 0; cnt < sizeof (fw->lmc_reg) / 4; cnt++) {
     2219 +                if (cnt % 8 == 0) {
     2220 +                        mdb_printf("\n");
     2221 +                }
     2222 +                mdb_printf("%08x ", fw->lmc_reg[cnt]);
     2223 +        }
     2224 +
     2225 +        mdb_printf("\n\nFPM Hardware Registers");
     2226 +        for (cnt = 0; cnt < sizeof (fw->fpm_hdw_reg) / 4; cnt++) {
     2227 +                if (cnt % 8 == 0) {
     2228 +                        mdb_printf("\n");
     2229 +                }
     2230 +                mdb_printf("%08x ", fw->fpm_hdw_reg[cnt]);
     2231 +        }
     2232 +
     2233 +        mdb_printf("\n\nRQ0 Array Registers");
     2234 +        for (cnt = 0; cnt < sizeof (fw->rq0_array_reg) / 4; cnt++) {
     2235 +                if (cnt % 8 == 0) {
     2236 +                        mdb_printf("\n");
     2237 +                }
     2238 +                mdb_printf("%08x ", fw->rq0_array_reg[cnt]);
     2239 +        }
     2240 +
     2241 +        mdb_printf("\n\nRQ1 Array Registers");
     2242 +        for (cnt = 0; cnt < sizeof (fw->rq1_array_reg) / 4; cnt++) {
     2243 +                if (cnt % 8 == 0) {
     2244 +                        mdb_printf("\n");
     2245 +                }
     2246 +                mdb_printf("%08x ", fw->rq1_array_reg[cnt]);
     2247 +        }
     2248 +
     2249 +        mdb_printf("\n\nRP0 Array Registers");
     2250 +        for (cnt = 0; cnt < sizeof (fw->rp0_array_reg) / 4; cnt++) {
     2251 +                if (cnt % 8 == 0) {
     2252 +                        mdb_printf("\n");
     2253 +                }
     2254 +                mdb_printf("%08x ", fw->rp0_array_reg[cnt]);
     2255 +        }
     2256 +
     2257 +        mdb_printf("\n\nRP1 Array Registers");
     2258 +        for (cnt = 0; cnt < sizeof (fw->rp1_array_reg) / 4; cnt++) {
     2259 +                if (cnt % 8 == 0) {
     2260 +                        mdb_printf("\n");
     2261 +                }
     2262 +                mdb_printf("%08x ", fw->rp1_array_reg[cnt]);
     2263 +        }
     2264 +
     2265 +        mdb_printf("\n\nAT0 Array Registers");
     2266 +        for (cnt = 0; cnt < sizeof (fw->ato_array_reg) / 4; cnt++) {
     2267 +                if (cnt % 8 == 0) {
     2268 +                        mdb_printf("\n");
     2269 +                }
     2270 +                mdb_printf("%08x ", fw->ato_array_reg[cnt]);
     2271 +        }
     2272 +
     2273 +        mdb_printf("\n\nQueue Control Registers");
     2274 +        for (cnt = 0; cnt < sizeof (fw->queue_control_reg) / 4; cnt++) {
     2275 +                if (cnt % 8 == 0) {
     2276 +                        mdb_printf("\n");
     2277 +                }
     2278 +                mdb_printf("%08x ", fw->queue_control_reg[cnt]);
     2279 +        }
     2280 +
     2281 +        mdb_printf("\n\nFB Hardware Registers");
     2282 +        for (cnt = 0; cnt < sizeof (fw->fb_hdw_reg) / 4; cnt++) {
     2283 +                if (cnt % 8 == 0) {
     2284 +                        mdb_printf("\n");
     2285 +                }
     2286 +                mdb_printf("%08x ", fw->fb_hdw_reg[cnt]);
     2287 +        }
     2288 +
     2289 +        mdb_printf("\n\nCode RAM");
     2290 +        for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) {
     2291 +                if (cnt % 8 == 0) {
     2292 +                        mdb_printf("\n%08x: ", cnt + 0x20000);
     2293 +                }
     2294 +                mdb_printf("%08x ", fw->code_ram[cnt]);
     2295 +        }
     2296 +
     2297 +        mdb_printf("\n\nExternal Memory");
     2298 +        dp = (uint32_t *)(void *)((caddr_t)fw->req_rsp_ext_mem +
     2299 +            fw->req_q_size[0] + fw->req_q_size[1] + fw->rsp_q_size +
     2300 +            (ha->rsp_queues_cnt * 16));
     2301 +        for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
     2302 +                if (cnt % 8 == 0) {
     2303 +                        mdb_printf("\n%08x: ", cnt + 0x100000);
     2304 +                }
     2305 +                mdb_printf("%08x ", *dp++);
     2306 +        }
     2307 +
     2308 +        mdb_printf("\n\n[<==END] ISP Debug Dump");
     2309 +
     2310 +        dp = fw->req_rsp_ext_mem + (ha->rsp_queues_cnt * 4);
     2311 +        for (cnt = 0; cnt < 2 && fw->req_q_size[cnt]; cnt++) {
     2312 +                dp2 = dp;
     2313 +                for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
     2314 +                        if (*dp2++) {
     2315 +                                break;
     2316 +                        }
     2317 +                }
     2318 +                if (cnt1 == fw->req_q_size[cnt] / 4) {
     2319 +                        dp = dp2;
     2320 +                        continue;
     2321 +                }
     2322 +                mdb_printf("\n\nRequest Queue\nQueue 0%d:", cnt);
     2323 +                for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
     2324 +                        if (cnt1 % 8 == 0) {
     2325 +                                mdb_printf("\n%08x: ", cnt1);
     2326 +                        }
     2327 +                        mdb_printf("%08x ", *dp++);
     2328 +                }
     2329 +        }
     2330 +
     2331 +        for (cnt = 0; cnt < ha->rsp_queues_cnt; cnt++) {
     2332 +                if (mdb_vread(rsp_q, sizeof (ql_response_q_t),
     2333 +                    (uintptr_t)rsp_queues[cnt]) == -1) {
     2334 +                        mdb_warn("failed to read ha->rsp_queues[%d]", cnt);
     2335 +                        break;
     2336 +                }
     2337 +                dp2 = dp;
     2338 +                for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
     2339 +                        if (*dp2++) {
     2340 +                                break;
     2341 +                        }
     2342 +                }
     2343 +                if (cnt1 == rsp_q->rsp_ring.size / 4) {
     2344 +                        dp = dp2;
     2345 +                        continue;
     2346 +                }
     2347 +                mdb_printf("\n\nResponse Queue\nQueue 0%d:", cnt);
     2348 +
     2349 +                for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
     2350 +                        if (cnt1 % 8 == 0) {
     2351 +                                mdb_printf("\n%08x: ", cnt1);
     2352 +                        }
     2353 +                        mdb_printf("%08x ", *dp++);
     2354 +                }
     2355 +        }
     2356 +
     2357 +        if (ha->fwexttracebuf.dma_handle != NULL) {
     2358 +                uint32_t        cnt_b;
     2359 +                uint32_t        *w32 = ha->fwexttracebuf.bp;
     2360 +
     2361 +                mdb_printf("\n\nExtended Trace Buffer Memory");
     2362 +                /* show data address as a byte address, data as long words */
     2363 +                for (cnt = 0; cnt < FWEXTSIZE / 4; cnt++) {
     2364 +                        cnt_b = cnt * 4;
     2365 +                        if (cnt_b % 32 == 0) {
     2366 +                                mdb_printf("\n%08x: ", w32 + cnt_b);
     2367 +                        }
     2368 +                        mdb_printf("%08x ", fw->ext_trace_buf[cnt]);
     2369 +                }
     2370 +        }
     2371 +
     2372 +        if (ha->fwfcetracebuf.dma_handle != NULL) {
     2373 +                uint32_t        cnt_b;
     2374 +                uint32_t        *w32 = ha->fwfcetracebuf.bp;
     2375 +
     2376 +                mdb_printf("\n\nFC Event Trace Buffer Memory");
     2377 +                /* show data address as a byte address, data as long words */
     2378 +                for (cnt = 0; cnt < FWFCESIZE / 4; cnt++) {
     2379 +                        cnt_b = cnt * 4;
     2380 +                        if (cnt_b % 32 == 0) {
     2381 +                                mdb_printf("\n%08x: ", w32 + cnt_b);
     2382 +                        }
     2383 +                        mdb_printf("%08x ", fw->fce_trace_buf[cnt]);
     2384 +                }
     2385 +        }
     2386 +
     2387 +        mdb_free(rsp_q, sizeof (ql_response_q_t));
     2388 +        mdb_free(rsp_queues, ha->rsp_queues_cnt * sizeof (ql_response_q_t *));
     2389 +        mdb_free(fw, ha->ql_dump_size);
     2390 +
     2391 +        mdb_printf("\n\nreturn exit\n");
     2392 +
     2393 +        return (DCMD_OK);
     2394 +}
     2395 +
     2396 +/*
1836 2397   * ql_23xx_dump_dcmd
1837 2398   *      prints out a firmware dump buffer
1838 2399   *
1839 2400   * Input:
1840 2401   *      addr  = User supplied address. (NB: nust be an ha)
1841 2402   *      flags = mdb flags.
1842 2403   *      argc  = Number of user supplied args.
1843 2404   *      argv  = Arg array.
1844 2405   *
1845 2406   * Returns:
↓ open down ↓ 14 lines elided ↑ open up ↑
1860 2421  
1861 2422          fw = (ql_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
1862 2423  
1863 2424          if (mdb_vread(fw, ha->ql_dump_size,
1864 2425              (uintptr_t)ha->ql_dump_ptr) == -1) {
1865 2426                  mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
1866 2427                  mdb_free(fw, ha->ql_dump_size);
1867 2428                  return (DCMD_OK);
1868 2429          }
1869 2430  
1870      -        if (ha->cfg_flags & CFG_CTRL_2300) {
     2431 +        if (ha->cfg_flags & CFG_CTRL_23XX) {
1871 2432                  mdb_printf("\nISP 2300IP ");
1872      -        } else if (ha->cfg_flags & CFG_CTRL_6322) {
1873      -                mdb_printf("\nISP 6322FLX ");
     2433 +        } else if (ha->cfg_flags & CFG_CTRL_63XX) {
     2434 +                mdb_printf("\nISP 2322/6322FLX ");
1874 2435          } else {
1875 2436                  mdb_printf("\nISP 2200IP ");
1876 2437          }
1877 2438  
1878 2439          mdb_printf("Firmware Version %d.%d.%d\n",
1879 2440              ha->fw_major_version, ha->fw_minor_version,
1880 2441              ha->fw_subminor_version);
1881 2442  
1882 2443          mdb_printf("\nPBIU Registers:");
1883 2444          for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) {
1884 2445                  if (cnt % 8 == 0) {
1885 2446                          mdb_printf("\n");
1886 2447                  }
1887 2448                  mdb_printf("%04x  ", fw->pbiu_reg[cnt]);
1888 2449          }
1889 2450  
1890      -        if (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) {
     2451 +        if (ha->cfg_flags & CFG_CTRL_2363) {
1891 2452                  mdb_printf("\n\nReqQ-RspQ-Risc2Host Status registers:");
1892 2453                  for (cnt = 0; cnt < sizeof (fw->risc_host_reg) / 2; cnt++) {
1893 2454                          if (cnt % 8 == 0) {
1894 2455                                  mdb_printf("\n");
1895 2456                          }
1896 2457                          mdb_printf("%04x  ", fw->risc_host_reg[cnt]);
1897 2458                  }
1898 2459          }
1899 2460  
1900 2461          mdb_printf("\n\nMailbox Registers:");
1901      -        mbox_cnt = (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) ? 16 : 8;
     2462 +        mbox_cnt = ha->cfg_flags & CFG_CTRL_2363 ? 16 : 8;
1902 2463          for (cnt = 0; cnt < mbox_cnt; cnt++) {
1903 2464                  if (cnt % 8 == 0) {
1904 2465                          mdb_printf("\n");
1905 2466                  }
1906 2467                  mdb_printf("%04x  ", fw->mailbox_reg[cnt]);
1907 2468          }
1908 2469  
1909      -        if (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) {
     2470 +        if (ha->cfg_flags & CFG_CTRL_2363) {
1910 2471                  mdb_printf("\n\nAuto Request Response DMA Registers:");
1911 2472                  for (cnt = 0; cnt < sizeof (fw->resp_dma_reg) / 2; cnt++) {
1912 2473                          if (cnt % 8 == 0) {
1913 2474                                  mdb_printf("\n");
1914 2475                          }
1915 2476                          mdb_printf("%04x  ", fw->resp_dma_reg[cnt]);
1916 2477                  }
1917 2478          }
1918 2479  
1919 2480          mdb_printf("\n\nDMA Registers:");
↓ open down ↓ 72 lines elided ↑ open up ↑
1992 2553          for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) {
1993 2554                  if (cnt % 8 == 0) {
1994 2555                          mdb_printf("\n");
1995 2556                  }
1996 2557                  mdb_printf("%04x  ", fw->risc_gp7_reg[cnt]);
1997 2558          }
1998 2559  
1999 2560          mdb_printf("\n\nFrame Buffer Hardware Registers:");
2000 2561          for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
2001 2562                  if ((cnt == 16) &&
2002      -                    ((ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) == 0)) {
     2563 +                    ((ha->cfg_flags & CFG_CTRL_2363) == 0)) {
2003 2564                          break;
2004 2565                  }
2005 2566                  if (cnt % 8 == 0) {
2006 2567                          mdb_printf("\n");
2007 2568                  }
2008 2569                  mdb_printf("%04x  ", fw->frame_buf_hdw_reg[cnt]);
2009 2570          }
2010 2571  
2011 2572          mdb_printf("\n\nFPM B0 Registers:");
2012 2573          for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) {
↓ open down ↓ 4 lines elided ↑ open up ↑
2017 2578          }
2018 2579  
2019 2580          mdb_printf("\n\nFPM B1 Registers:");
2020 2581          for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) {
2021 2582                  if (cnt % 8 == 0) {
2022 2583                          mdb_printf("\n");
2023 2584                  }
2024 2585                  mdb_printf("%04x  ", fw->fpm_b1_reg[cnt]);
2025 2586          }
2026 2587  
2027      -        if (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) {
     2588 +        if (ha->cfg_flags & CFG_CTRL_2363) {
2028 2589                  mdb_printf("\n\nCode RAM Dump:");
2029 2590                  for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
2030 2591                          if (cnt % 8 == 0) {
2031 2592                                  mdb_printf("\n%05x: ", cnt + 0x0800);
2032 2593                          }
2033 2594                          mdb_printf("%04x  ", fw->risc_ram[cnt]);
2034 2595                  }
2035 2596  
2036 2597                  mdb_printf("\n\nStack RAM Dump:");
2037 2598                  for (cnt = 0; cnt < sizeof (fw->stack_ram) / 2; cnt++) {
↓ open down ↓ 384 lines elided ↑ open up ↑
2422 2983   * Context:
2423 2984   *      User context.
2424 2985   *
2425 2986   */
2426 2987  /*ARGSUSED*/
2427 2988  static int
2428 2989  ql_25xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
2429 2990      const mdb_arg_t *argv)
2430 2991  {
2431 2992          ql_25xx_fw_dump_t       *fw;
2432      -        uint32_t                cnt = 0;
     2993 +        ql_response_q_t         **rsp_queues, *rsp_q;
     2994 +        uint32_t                cnt, cnt1, *dp, *dp2;
2433 2995  
2434 2996          fw = (ql_25xx_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
     2997 +        rsp_queues = mdb_alloc(ha->rsp_queues_cnt *
     2998 +            sizeof (ql_response_q_t *), UM_SLEEP);
     2999 +        rsp_q = mdb_alloc(sizeof (ql_response_q_t), UM_SLEEP);
2435 3000  
2436 3001          if (mdb_vread(fw, ha->ql_dump_size,
2437      -            (uintptr_t)ha->ql_dump_ptr) == -1) {
     3002 +            (uintptr_t)ha->ql_dump_ptr) == -1 ||
     3003 +            mdb_vread(rsp_queues, ha->rsp_queues_cnt *
     3004 +            sizeof (ql_response_q_t *), (uintptr_t)ha->rsp_queues) == -1) {
2438 3005                  mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
     3006 +                mdb_free(rsp_q, sizeof (ql_response_q_t));
     3007 +                mdb_free(rsp_queues, ha->rsp_queues_cnt *
     3008 +                    sizeof (ql_response_q_t *));
2439 3009                  mdb_free(fw, ha->ql_dump_size);
2440 3010                  return (DCMD_OK);
2441 3011          }
2442 3012  
2443 3013          mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
2444 3014              ha->fw_major_version, ha->fw_minor_version,
2445 3015              ha->fw_subminor_version, ha->fw_attributes);
2446 3016  
     3017 +        mdb_printf("\nHCCR Register\n%08x\n", fw->hccr);
2447 3018          mdb_printf("\nR2H Register\n%08x\n", fw->r2h_status);
     3019 +        mdb_printf("\nAER Uncorrectable Error Status Register\n%08x\n",
     3020 +            fw->aer_ues);
2448 3021  
2449 3022          mdb_printf("\n\nHostRisc Registers");
2450 3023          for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
2451 3024                  if (cnt % 8 == 0) {
2452 3025                          mdb_printf("\n");
2453 3026                  }
2454 3027                  mdb_printf("%08x ", fw->hostrisc_reg[cnt]);
2455 3028          }
2456 3029  
2457 3030          mdb_printf("\n\nPCIe Registers");
↓ open down ↓ 251 lines elided ↑ open up ↑
2709 3282  
2710 3283          mdb_printf("\n\nCode RAM");
2711 3284          for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) {
2712 3285                  if (cnt % 8 == 0) {
2713 3286                          mdb_printf("\n%08x: ", cnt + 0x20000);
2714 3287                  }
2715 3288                  mdb_printf("%08x ", fw->code_ram[cnt]);
2716 3289          }
2717 3290  
2718 3291          mdb_printf("\n\nExternal Memory");
     3292 +        dp = (uint32_t *)(void *)((caddr_t)fw->req_rsp_ext_mem +
     3293 +            fw->req_q_size[0] + fw->req_q_size[1] + fw->rsp_q_size +
     3294 +            (ha->rsp_queues_cnt * 16));
2719 3295          for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
2720 3296                  if (cnt % 8 == 0) {
2721 3297                          mdb_printf("\n%08x: ", cnt + 0x100000);
2722 3298                  }
2723      -                mdb_printf("%08x ", fw->ext_mem[cnt]);
     3299 +                mdb_printf("%08x ", *dp++);
2724 3300          }
2725 3301  
2726 3302          mdb_printf("\n[<==END] ISP Debug Dump");
2727 3303  
2728 3304          mdb_printf("\n\nRequest Queue");
2729 3305  
2730      -        for (cnt = 0; cnt < REQUEST_QUEUE_SIZE / 4; cnt++) {
2731      -                if (cnt % 8 == 0) {
2732      -                        mdb_printf("\n%08x: ", cnt);
     3306 +        dp = fw->req_rsp_ext_mem + (ha->rsp_queues_cnt * 4);
     3307 +        for (cnt = 0; cnt < 2 && fw->req_q_size[cnt]; cnt++) {
     3308 +                dp2 = dp;
     3309 +                for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
     3310 +                        if (*dp2++) {
     3311 +                                break;
     3312 +                        }
2733 3313                  }
2734      -                mdb_printf("%08x ", fw->req_q[cnt]);
     3314 +                if (cnt1 == fw->req_q_size[cnt] / 4) {
     3315 +                        dp = dp2;
     3316 +                        continue;
     3317 +                }
     3318 +                mdb_printf("\n\nRequest Queue\nQueue 0%d:", cnt);
     3319 +                for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
     3320 +                        if (cnt1 % 8 == 0) {
     3321 +                                mdb_printf("\n%08x: ", cnt1);
     3322 +                        }
     3323 +                        mdb_printf("%08x ", *dp++);
     3324 +                }
2735 3325          }
2736 3326  
2737      -        mdb_printf("\n\nResponse Queue");
     3327 +        for (cnt = 0; cnt < ha->rsp_queues_cnt; cnt++) {
     3328 +                if (mdb_vread(rsp_q, sizeof (ql_response_q_t),
     3329 +                    (uintptr_t)rsp_queues[cnt]) == -1) {
     3330 +                        mdb_warn("failed to read ha->rsp_queues[%d]", cnt);
     3331 +                        break;
     3332 +                }
     3333 +                dp2 = dp;
     3334 +                for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
     3335 +                        if (*dp2++) {
     3336 +                                break;
     3337 +                        }
     3338 +                }
     3339 +                if (cnt1 == rsp_q->rsp_ring.size / 4) {
     3340 +                        dp = dp2;
     3341 +                        continue;
     3342 +                }
     3343 +                mdb_printf("\n\nResponse Queue\nQueue 0%d:", cnt);
2738 3344  
2739      -        for (cnt = 0; cnt < RESPONSE_QUEUE_SIZE / 4; cnt++) {
2740      -                if (cnt % 8 == 0) {
2741      -                        mdb_printf("\n%08x: ", cnt);
     3345 +                for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
     3346 +                        if (cnt1 % 8 == 0) {
     3347 +                                mdb_printf("\n%08x: ", cnt1);
     3348 +                        }
     3349 +                        mdb_printf("%08x ", *dp++);
2742 3350                  }
2743      -                mdb_printf("%08x ", fw->rsp_q[cnt]);
2744 3351          }
2745 3352  
2746 3353          if ((ha->cfg_flags & CFG_ENABLE_FWEXTTRACE) &&
2747 3354              (ha->fwexttracebuf.bp != NULL)) {
2748 3355                  uint32_t cnt_b = 0;
2749 3356                  uint32_t *w32 = ha->fwexttracebuf.bp;
2750 3357  
2751 3358                  mdb_printf("\n\nExtended Trace Buffer Memory");
2752 3359                  /* show data address as a byte address, data as long words */
2753 3360                  for (cnt = 0; cnt < FWEXTSIZE / 4; cnt++) {
↓ open down ↓ 14 lines elided ↑ open up ↑
2768 3375                  /* show data address as a byte address, data as long words */
2769 3376                  for (cnt = 0; cnt < FWFCESIZE / 4; cnt++) {
2770 3377                          cnt_b = cnt * 4;
2771 3378                          if (cnt_b % 32 == 0) {
2772 3379                                  mdb_printf("\n%08x: ", w32 + cnt_b);
2773 3380                          }
2774 3381                          mdb_printf("%08x ", fw->fce_trace_buf[cnt]);
2775 3382                  }
2776 3383          }
2777 3384  
     3385 +        mdb_free(rsp_q, sizeof (ql_response_q_t));
     3386 +        mdb_free(rsp_queues, ha->rsp_queues_cnt * sizeof (ql_response_q_t *));
2778 3387          mdb_free(fw, ha->ql_dump_size);
2779 3388  
2780 3389          mdb_printf("\n\nreturn exit\n");
2781 3390  
2782 3391          return (DCMD_OK);
2783 3392  }
2784 3393  
2785 3394  /*
2786 3395   * ql_81xx_dump_dcmd
2787 3396   *      prints out a firmware dump buffer
↓ open down ↓ 10 lines elided ↑ open up ↑
2798 3407   * Context:
2799 3408   *      User context.
2800 3409   *
2801 3410   */
2802 3411  /*ARGSUSED*/
2803 3412  static int
2804 3413  ql_81xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
2805 3414      const mdb_arg_t *argv)
2806 3415  {
2807 3416          ql_81xx_fw_dump_t       *fw;
2808      -        uint32_t                cnt = 0;
     3417 +        ql_response_q_t         **rsp_queues, *rsp_q;
     3418 +        uint32_t                cnt, cnt1, *dp, *dp2;
2809 3419  
2810 3420          fw = (ql_81xx_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
     3421 +        rsp_queues = mdb_alloc(ha->rsp_queues_cnt *
     3422 +            sizeof (ql_response_q_t *), UM_SLEEP);
     3423 +        rsp_q = mdb_alloc(sizeof (ql_response_q_t), UM_SLEEP);
2811 3424  
2812 3425          if (mdb_vread(fw, ha->ql_dump_size,
2813      -            (uintptr_t)ha->ql_dump_ptr) == -1) {
     3426 +            (uintptr_t)ha->ql_dump_ptr) == -1 ||
     3427 +            mdb_vread(rsp_queues, ha->rsp_queues_cnt *
     3428 +            sizeof (ql_response_q_t *), (uintptr_t)ha->rsp_queues) == -1) {
2814 3429                  mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
     3430 +                mdb_free(rsp_q, sizeof (ql_response_q_t));
     3431 +                mdb_free(rsp_queues, ha->rsp_queues_cnt *
     3432 +                    sizeof (ql_response_q_t *));
2815 3433                  mdb_free(fw, ha->ql_dump_size);
2816 3434                  return (DCMD_OK);
2817 3435          }
2818 3436  
2819 3437          mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
2820 3438              ha->fw_major_version, ha->fw_minor_version,
2821 3439              ha->fw_subminor_version, ha->fw_attributes);
2822 3440  
     3441 +        mdb_printf("\nHCCR Register\n%08x\n", fw->hccr);
     3442 +
2823 3443          mdb_printf("\nR2H Register\n%08x\n", fw->r2h_status);
2824 3444  
     3445 +        mdb_printf("\nAER Uncorrectable Error Status Register\n%08x\n",
     3446 +            fw->aer_ues);
     3447 +
2825 3448          mdb_printf("\n\nHostRisc Registers");
2826 3449          for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
2827 3450                  if (cnt % 8 == 0) {
2828 3451                          mdb_printf("\n");
2829 3452                  }
2830 3453                  mdb_printf("%08x ", fw->hostrisc_reg[cnt]);
2831 3454          }
2832 3455  
2833 3456          mdb_printf("\n\nPCIe Registers");
2834 3457          for (cnt = 0; cnt < sizeof (fw->pcie_reg) / 4; cnt++) {
↓ open down ↓ 250 lines elided ↑ open up ↑
3085 3708  
3086 3709          mdb_printf("\n\nCode RAM");
3087 3710          for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) {
3088 3711                  if (cnt % 8 == 0) {
3089 3712                          mdb_printf("\n%08x: ", cnt + 0x20000);
3090 3713                  }
3091 3714                  mdb_printf("%08x ", fw->code_ram[cnt]);
3092 3715          }
3093 3716  
3094 3717          mdb_printf("\n\nExternal Memory");
     3718 +        dp = (uint32_t *)(void *)((caddr_t)fw->req_rsp_ext_mem +
     3719 +            fw->req_q_size[0] + fw->req_q_size[1] + fw->rsp_q_size +
     3720 +            (ha->rsp_queues_cnt * 16));
3095 3721          for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
3096 3722                  if (cnt % 8 == 0) {
3097 3723                          mdb_printf("\n%08x: ", cnt + 0x100000);
3098 3724                  }
3099      -                mdb_printf("%08x ", fw->ext_mem[cnt]);
     3725 +                mdb_printf("%08x ", *dp++);
3100 3726          }
3101 3727  
3102 3728          mdb_printf("\n[<==END] ISP Debug Dump");
3103 3729  
3104 3730          mdb_printf("\n\nRequest Queue");
3105 3731  
3106      -        for (cnt = 0; cnt < REQUEST_QUEUE_SIZE / 4; cnt++) {
3107      -                if (cnt % 8 == 0) {
3108      -                        mdb_printf("\n%08x: ", cnt);
     3732 +        dp = fw->req_rsp_ext_mem + (ha->rsp_queues_cnt * 4);
     3733 +        for (cnt = 0; cnt < 2 && fw->req_q_size[cnt]; cnt++) {
     3734 +                dp2 = dp;
     3735 +                for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
     3736 +                        if (*dp2++) {
     3737 +                                break;
     3738 +                        }
3109 3739                  }
3110      -                mdb_printf("%08x ", fw->req_q[cnt]);
     3740 +                if (cnt1 == fw->req_q_size[cnt] / 4) {
     3741 +                        dp = dp2;
     3742 +                        continue;
     3743 +                }
     3744 +                mdb_printf("\n\nRequest Queue\nQueue 0%d:", cnt);
     3745 +                for (cnt1 = 0; cnt1 < fw->req_q_size[cnt] / 4; cnt1++) {
     3746 +                        if (cnt1 % 8 == 0) {
     3747 +                                mdb_printf("\n%08x: ", cnt1);
     3748 +                        }
     3749 +                        mdb_printf("%08x ", *dp++);
     3750 +                }
3111 3751          }
3112 3752  
3113      -        mdb_printf("\n\nResponse Queue");
     3753 +        for (cnt = 0; cnt < ha->rsp_queues_cnt; cnt++) {
     3754 +                if (mdb_vread(rsp_q, sizeof (ql_response_q_t),
     3755 +                    (uintptr_t)rsp_queues[cnt]) == -1) {
     3756 +                        mdb_warn("failed to read ha->rsp_queues[%d]", cnt);
     3757 +                        break;
     3758 +                }
     3759 +                dp2 = dp;
     3760 +                for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
     3761 +                        if (*dp2++) {
     3762 +                                break;
     3763 +                        }
     3764 +                }
     3765 +                if (cnt1 == rsp_q->rsp_ring.size / 4) {
     3766 +                        dp = dp2;
     3767 +                        continue;
     3768 +                }
     3769 +                mdb_printf("\n\nResponse Queue\nQueue 0%d:", cnt);
3114 3770  
3115      -        for (cnt = 0; cnt < RESPONSE_QUEUE_SIZE / 4; cnt++) {
3116      -                if (cnt % 8 == 0) {
3117      -                        mdb_printf("\n%08x: ", cnt);
     3771 +                for (cnt1 = 0; cnt1 < rsp_q->rsp_ring.size / 4; cnt1++) {
     3772 +                        if (cnt1 % 8 == 0) {
     3773 +                                mdb_printf("\n%08x: ", cnt1);
     3774 +                        }
     3775 +                        mdb_printf("%08x ", *dp++);
3118 3776                  }
3119      -                mdb_printf("%08x ", fw->rsp_q[cnt]);
3120 3777          }
3121 3778  
3122 3779          if ((ha->cfg_flags & CFG_ENABLE_FWEXTTRACE) &&
3123 3780              (ha->fwexttracebuf.bp != NULL)) {
3124 3781                  uint32_t cnt_b = 0;
3125 3782                  uint32_t *w32 = ha->fwexttracebuf.bp;
3126 3783  
3127 3784                  mdb_printf("\n\nExtended Trace Buffer Memory");
3128 3785                  /* show data address as a byte address, data as long words */
3129 3786                  for (cnt = 0; cnt < FWEXTSIZE / 4; cnt++) {
↓ open down ↓ 14 lines elided ↑ open up ↑
3144 3801                  /* show data address as a byte address, data as long words */
3145 3802                  for (cnt = 0; cnt < FWFCESIZE / 4; cnt++) {
3146 3803                          cnt_b = cnt * 4;
3147 3804                          if (cnt_b % 32 == 0) {
3148 3805                                  mdb_printf("\n%08x: ", w32 + cnt_b);
3149 3806                          }
3150 3807                          mdb_printf("%08x ", fw->fce_trace_buf[cnt]);
3151 3808                  }
3152 3809          }
3153 3810  
     3811 +        mdb_free(rsp_q, sizeof (ql_response_q_t));
     3812 +        mdb_free(rsp_queues, ha->rsp_queues_cnt * sizeof (ql_response_q_t *));
3154 3813          mdb_free(fw, ha->ql_dump_size);
3155 3814  
3156 3815          mdb_printf("\n\nreturn exit\n");
3157 3816  
3158 3817          return (DCMD_OK);
3159 3818  }
3160 3819  
3161 3820  /*
3162 3821   * ql_gettrace_dcmd
3163 3822   *      prints out the Extended Logging trace buffer
↓ open down ↓ 8 lines elided ↑ open up ↑
3172 3831   *      DCMD_OK or DCMD_ERR
3173 3832   *
3174 3833   * Context:
3175 3834   *      User context.
3176 3835   *
3177 3836   */
3178 3837  static int
3179 3838  qlc_gettrace_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3180 3839  {
3181 3840          ql_adapter_state_t      *ha;
3182      -        int                     verbose = 0;
3183      -        int                     wrapped = 0;
3184      -        char                    *trace_start;
3185      -        char                    *trace_end;
3186      -        char                    *dump_start = 0;
3187      -        char                    *trace_next  = 0;
3188      -        char                    *dump_current  = 0;
3189      -        el_trace_desc_t         *trace_desc;
     3841 +        ql_trace_desc_t         *trace_desc;
     3842 +        ql_trace_entry_t        entry;
     3843 +        uint32_t                i = 0;
     3844 +        char                    merge[1024];
3190 3845  
3191 3846          if ((!(flags & DCMD_ADDRSPEC)) || addr == NULL) {
3192 3847                  mdb_warn("ql_adapter_state structure addr is required");
3193 3848                  return (DCMD_USAGE);
3194 3849          }
3195 3850  
3196      -        if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose) !=
3197      -            argc) {
     3851 +        if (argc != 0) {
3198 3852                  return (DCMD_USAGE);
3199 3853          }
3200 3854  
     3855 +        if (mdb_getopts(argc, argv) != argc) {
     3856 +                return (DCMD_USAGE);
     3857 +        }
     3858 +
3201 3859          /*
3202 3860           * Get the adapter state struct which was passed
3203 3861           */
3204 3862          if ((ha = (ql_adapter_state_t *)mdb_alloc(sizeof (ql_adapter_state_t),
3205 3863              UM_SLEEP)) == NULL) {
3206 3864                  mdb_warn("failed to allocate memory for ql_adapter_state\n");
3207 3865                  return (DCMD_OK);
3208 3866          }
3209 3867  
3210 3868          if (mdb_vread(ha, sizeof (ql_adapter_state_t), addr) == -1) {
3211 3869                  mdb_warn("failed to read ql_adapter_state at %p", addr);
3212 3870                  mdb_free(ha, sizeof (ql_adapter_state_t));
3213 3871                  return (DCMD_OK);
3214 3872          }
3215 3873  
3216      -        /*
3217      -         * If its not a valid trace descriptor then bail out
3218      -         */
3219      -        if (ha->el_trace_desc == NULL) {
     3874 +        if (ha->ql_trace_desc == NULL) {
3220 3875                  mdb_warn("trace descriptor does not exist for instance %d\n",
3221 3876                      ha->instance);
3222 3877                  mdb_free(ha, sizeof (ql_adapter_state_t));
3223 3878                  return (DCMD_OK);
     3879 +
3224 3880          } else {
3225      -                trace_desc = (el_trace_desc_t *)
3226      -                    mdb_alloc(sizeof (el_trace_desc_t), UM_SLEEP);
3227      -                if (mdb_vread(trace_desc, sizeof (el_trace_desc_t),
3228      -                    (uintptr_t)ha->el_trace_desc) == -1) {
     3881 +                trace_desc = (ql_trace_desc_t *)
     3882 +                    mdb_alloc(sizeof (ql_trace_desc_t), UM_SLEEP);
     3883 +
     3884 +                if (mdb_vread(trace_desc, sizeof (ql_trace_desc_t),
     3885 +                    (uintptr_t)ha->ql_trace_desc) == -1) {
3229 3886                          mdb_warn("failed to read ql_adapter_state at %p",
3230 3887                              addr);
3231      -                        mdb_free(trace_desc, sizeof (el_trace_desc_t));
     3888 +                        mdb_free(trace_desc, sizeof (ql_trace_desc_t));
3232 3889                          mdb_free(ha, sizeof (ql_adapter_state_t));
3233 3890                          return (DCMD_OK);
3234 3891                  }
     3892 +
3235 3893                  if (trace_desc->trace_buffer == NULL) {
3236 3894                          mdb_warn("trace buffer does not exist for "
3237 3895                              "instance %d\n", ha->instance);
3238      -                        mdb_free(trace_desc, sizeof (el_trace_desc_t));
     3896 +
     3897 +                        mdb_free(trace_desc, sizeof (ql_trace_desc_t));
3239 3898                          mdb_free(ha, sizeof (ql_adapter_state_t));
3240 3899                          return (DCMD_OK);
3241 3900                  }
3242 3901          }
3243 3902  
3244      -        /* Get the trace buffer */
3245      -
3246      -        trace_start = (char *)
3247      -            mdb_zalloc(trace_desc->trace_buffer_size, UM_SLEEP);
3248      -
3249      -        if (mdb_vread(trace_start, trace_desc->trace_buffer_size,
3250      -            (uintptr_t)trace_desc->trace_buffer) == -1) {
3251      -                mdb_warn("failed to read trace buffer?)");
3252      -                mdb_free(trace_start, trace_desc->trace_buffer_size);
     3903 +        /* Check if anything logged or not */
     3904 +        if (trace_desc->csize == 0) {
     3905 +                mdb_warn("Extended log buffer is empty.\n");
     3906 +                mdb_free(trace_desc, sizeof (ql_trace_desc_t));
3253 3907                  mdb_free(ha, sizeof (ql_adapter_state_t));
3254 3908                  return (DCMD_OK);
3255 3909          }
3256 3910  
3257      -        /* set the end of the trace buffer. */
3258      -        trace_end = trace_start + trace_desc->trace_buffer_size;
3259      -
3260      -        /* Find the start point of trace. */
3261      -        trace_next = trace_start + trace_desc->next;
3262      -
3263 3911          /*
3264      -         * If the buffer has not wrapped next will point at a null so
3265      -         * start is the begining of the buffer.  If next points at a char
3266      -         * then we must traverse the buffer further until a null is detected.
3267      -         * The location after the null will be the beginning of the oldest
3268      -         * whole object in the buffer, which we use as the start.
     3912 +         * Locate the start and end point. If ever wrapped, then
     3913 +         * always print from start to end in the circular buffer
3269 3914           */
3270 3915  
3271      -        if ((trace_next + EL_BUFFER_RESERVE) >= trace_end) {
3272      -                dump_start = trace_start;
3273      -        } else if (*trace_next != NULL) {
3274      -                dump_start = trace_next + (strlen(trace_next) + 1);
3275      -        } else {
3276      -                dump_start = trace_start;
     3916 +        /* always print from start to end */
     3917 +        for (i = trace_desc->start; i < trace_desc->csize; i++) {
     3918 +                if (mdb_vread(&entry, sizeof (ql_trace_entry_t),
     3919 +                    (uintptr_t)&trace_desc->trace_buffer[i]) !=
     3920 +                    sizeof (ql_trace_entry_t)) {
     3921 +                        mdb_warn("Cannot read trace entry. %xh", i);
     3922 +                        mdb_free(trace_desc, sizeof (ql_trace_desc_t));
     3923 +                        mdb_free(ha, sizeof (ql_adapter_state_t));
     3924 +                        return (DCMD_ERR);
     3925 +                }
     3926 +                if (entry.buf[0] != 0) {
     3927 +                        (void) mdb_snprintf(merge, sizeof (merge),
     3928 +                            "[%Y:%03d:%03d:%03d] "
     3929 +                            "%s",
     3930 +                            entry.hs_time.tv_sec,
     3931 +                            (int)entry.hs_time.tv_nsec / 1000000,
     3932 +                            (int)(entry.hs_time.tv_nsec / 1000) % 1000,
     3933 +                            (int)entry.hs_time.tv_nsec % 1000,
     3934 +                            entry.buf + 1);
     3935 +                }
     3936 +                mdb_printf("%s", merge);
3277 3937          }
3278 3938  
3279      -        dump_current = dump_start;
3280      -
3281      -        mdb_printf("\nExtended Logging trace buffer @%x, start @%x, "
3282      -            "size=%d\n\n", trace_start, dump_current,
3283      -            trace_desc->trace_buffer_size);
3284      -
3285      -        /* Don't run off the end, no matter what. */
3286      -        while (((uintptr_t)dump_current - (uintptr_t)trace_start) <=
3287      -            (uintptr_t)trace_desc->trace_buffer_size) {
3288      -                /* Show it... */
3289      -                mdb_printf("%s", dump_current);
3290      -                /* Calculate the next and make it the current */
3291      -                dump_current += (strlen(dump_current) + 1);
3292      -                /* check for wrap */
3293      -                if ((dump_current + EL_BUFFER_RESERVE) >= trace_end) {
3294      -                        mdb_printf("Wraping %x\n", dump_current);
3295      -                        dump_current = trace_start;
3296      -                        wrapped = 1;
3297      -                } else if (wrapped) {
3298      -                        /*   Don't go past next. */
3299      -                        if ((trace_start + trace_desc->next) <= dump_current) {
3300      -                                mdb_printf("Done %x", dump_current);
3301      -                                break;
     3939 +        if (trace_desc->start != 0) {
     3940 +                for (i = 0; i < trace_desc->start; i++) {
     3941 +                        if (mdb_vread(&entry, sizeof (ql_trace_entry_t),
     3942 +                            (uintptr_t)&trace_desc->trace_buffer[i]) !=
     3943 +                            sizeof (ql_trace_entry_t)) {
     3944 +                                mdb_warn("Cannot read trace entry. %xh", i);
     3945 +                                mdb_free(trace_desc, sizeof (ql_trace_desc_t));
     3946 +                                mdb_free(ha, sizeof (ql_adapter_state_t));
     3947 +                                return (DCMD_ERR);
3302 3948                          }
3303      -                } else if (*dump_current == NULL) {
3304      -                        mdb_printf("Done %x(null)", dump_current);
3305      -                        break;
     3949 +                        if (entry.buf[0] != 0) {
     3950 +                                (void) mdb_snprintf(merge, sizeof (merge),
     3951 +                                    "[%Y:%03d:%03d:%03d] "
     3952 +                                    "%s",
     3953 +                                    entry.hs_time.tv_sec,
     3954 +                                    (int)entry.hs_time.tv_nsec / 1000000,
     3955 +                                    (int)(entry.hs_time.tv_nsec / 1000) % 1000,
     3956 +                                    (int)entry.hs_time.tv_nsec % 1000,
     3957 +                                    entry.buf + 1);
     3958 +                        }
     3959 +                        mdb_printf("%s", merge);
3306 3960                  }
3307 3961          }
3308 3962  
     3963 +        mdb_printf("\n");
     3964 +        mdb_free(trace_desc, sizeof (ql_trace_desc_t));
3309 3965          mdb_free(ha, sizeof (ql_adapter_state_t));
3310      -        mdb_free(trace_start, trace_desc->trace_buffer_size);
3311      -        mdb_free(trace_desc, sizeof (el_trace_desc_t));
3312      -
3313 3966          return (DCMD_OK);
3314 3967  }
     3968 +
3315 3969  /*
3316 3970   * ql_doprint
3317 3971   *      ql generic function to call the print dcmd
3318 3972   *
3319 3973   * Input:
3320 3974   *      addr - address to struct
3321 3975   *      prtsting - address to string
3322 3976   *
3323 3977   * Returns:
3324 3978   *      WALK_DONE
↓ open down ↓ 77 lines elided ↑ open up ↑
3402 4056          { "qlcosc", NULL, "Prints outstanding cmd info", qlc_osc_dcmd },
3403 4057          { "qlcver", NULL, "Prints driver/mdb version", qlcver_dcmd },
3404 4058          { "qlc_elog", "[on|off] [<inst #>|all]", "Turns qlc extended logging "
3405 4059              "on / off", qlc_el_dcmd },
3406 4060          { "qlcstate", ":[-v]", "Prints qlc adapter state information",
3407 4061              qlcstate_dcmd },
3408 4062          { "qlctgtq", NULL, "Prints qlc target queues", qltgtq_dcmd },
3409 4063          { "qlcwdog", NULL, "Prints out watchdog linked list", qlc_wdog_dcmd},
3410 4064          { "qlcgetdump", ":[-v]", "Retrieves the ASCII f/w dump",
3411 4065              qlc_getdump_dcmd },
3412      -        { "qlcgettrace", ":[-v]", "Retrieves the ASCII Extended Logging trace",
     4066 +        { "qlcgettrace", ":", "Retrieves the ASCII Extended Logging trace",
3413 4067              qlc_gettrace_dcmd },
3414 4068          { NULL }
3415 4069  };
3416 4070  
3417 4071  /*
3418 4072   * walker structures for the _mdb_init function
3419 4073   */
3420 4074  static const mdb_walker_t walkers[] = {
3421 4075          { "qlcstates", "walk list of qlc ql_state_t structures",
3422 4076              qlstates_walk_init, qlstates_walk_step, qlstates_walk_fini },
↓ open down ↓ 19 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX