Print this page
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>
NEX-4957 Panic in qlc with QLE2460 in PCI passthrough mode on ESXi
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>

@@ -17,14 +17,14 @@
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  */
 
-/* Copyright 2010 QLogic Corporation */
+/* Copyright 2015 QLogic Corporation */
 
 /*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
  */
 
 #ifndef _QL_API_H
 #define _QL_API_H
 

@@ -32,11 +32,11 @@
  * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver header file.
  *
  * ***********************************************************************
  * *                                                                    **
  * *                            NOTICE                                  **
- * *            COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION              **
+ * *            COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION              **
  * *                    ALL RIGHTS RESERVED                             **
  * *                                                                    **
  * ***********************************************************************
  *
  */

@@ -50,12 +50,21 @@
 #include <sys/byteorder.h>
 #include <sys/pci.h>
 #include <sys/utsname.h>
 #include <sys/file.h>
 #include <sys/param.h>
+#include <sys/time.h>
+#include <sys/ddifm.h>
+#include <sys/sunddi.h>
+#include <sys/fm/protocol.h>
+#include <sys/fm/io/ddi.h>
 #include <ql_open.h>
 
+#ifdef __x86
+#include <sys/x86_archext.h>
+#endif
+
 #include <sys/fibre-channel/fc.h>
 #include <sys/fibre-channel/impl/fc_fcaif.h>
 
 #ifndef DDI_INTR_TYPE_FIXED
 #define DDI_INTR_TYPE_FIXED     0x1

@@ -74,10 +83,25 @@
 #endif
 #ifndef DDI_INTR_ALLOC_STRICT
 #define DDI_INTR_ALLOC_STRICT   1
 #endif
 
+#define PCI_PCIE_DEVICE_CONTROL         0x8     /* Device control reg offset */
+#define PCI_MSI_CONTROL                 0x2     /* MSI Control reg offset */
+#define PCI_MSI_MSG_ADDR                0x4     /* MSI Msg Addr reg offset */
+#define PCI_MSI_MSG_UPPER_ADDR          0x8     /* MSI MSI Msg Upper Addr reg */
+/* offset */
+#define PCI_MSI_MSG_DATA                0xc     /* MSI Msg Data reg offset */
+#define PCI_MSI_X_CONTROL               0x2     /* MSI-X Control reg offset */
+#define MSI_X_TABLE_SIZE_MASK           0x7ff   /* MSI-X Table Size mask */
+
+#define PCIE_EXT_CAP_PTR                0x100
+#define PCIE_EXT_CAP_NEXT_SHIFT         20
+#define PCIE_EXT_CAP_ID_SRIOV           0x0010  /* SRIOV capabilities offset */
+#define PCIE_EXT_CAP_SRIOV_TOTAL_VFS    0xe
+#define PCIE_SRIOV_PAGE_SIZE_MULTIPLIER 4096
+
 /*
  * NPIV defines
  */
 #ifndef FC_NPIV_FDISC_FAILED
 #define FC_NPIV_FDISC_FAILED    0x45

@@ -92,10 +116,13 @@
 #define FC_NPIV_WRONG_TOPOLOGY  0x48
 #endif
 #ifndef FC_NPIV_NPIV_BOUND
 #define FC_NPIV_NPIV_BOUND      0x49
 #endif
+#ifndef FC_HBA_PORTSPEED_32GBIT
+#define FC_HBA_PORTSPEED_32GBIT 64
+#endif
 
 #pragma weak ddi_intr_get_supported_types
 #pragma weak ddi_intr_get_nintrs
 #pragma weak ddi_intr_alloc
 #pragma weak ddi_intr_free

@@ -122,23 +149,13 @@
 extern int ddi_intr_disable();
 extern int ddi_intr_enable();
 extern int ddi_intr_get_cap();
 extern int ddi_intr_remove_handler();
 
-#ifndef QL_DRV_HARDENING
-#define ddi_devstate_t                  int
-#define DDI_DEVSTATE_UP                 0
-#define ddi_get_devstate(a)             DDI_DEVSTATE_UP
-#define ddi_dev_report_fault(a, b, c, d)
-#define ddi_check_dma_handle(a)         DDI_SUCCESS
-#define ddi_check_acc_handle(a)         DDI_SUCCESS
-#define QL_CLEAR_DMA_HANDLE(x)
-#else
 #define QL_CLEAR_DMA_HANDLE(x)  ((ddi_dma_impl_t *)x)->dmai_fault_notify = 0; \
                                 ((ddi_dma_impl_t *)x)->dmai_fault_check  = 0; \
                                 ((ddi_dma_impl_t *)x)->dmai_fault        = 0
-#endif
 
 #ifndef FC_STATE_1GBIT_SPEED
 #define FC_STATE_1GBIT_SPEED    0x0100  /* 1 Gbit/sec */
 #endif
 #ifndef FC_STATE_2GBIT_SPEED

@@ -151,10 +168,16 @@
 #define FC_STATE_8GBIT_SPEED    0x0700  /* 8 Gbit/sec */
 #endif
 #ifndef FC_STATE_10GBIT_SPEED
 #define FC_STATE_10GBIT_SPEED   0x0600  /* 10 Gbit/sec */
 #endif
+#ifndef FC_STATE_16GBIT_SPEED
+#define FC_STATE_16GBIT_SPEED   0x0800  /* 16 Gbit/sec */
+#endif
+#ifndef FC_STATE_32GBIT_SPEED
+#define FC_STATE_32GBIT_SPEED   0x1000  /* 32 Gbit/sec */
+#endif
 
 /*
  * Data bit definitions.
  */
 #define BIT_0   0x1

@@ -187,10 +210,42 @@
 #define BIT_27  0x8000000
 #define BIT_28  0x10000000
 #define BIT_29  0x20000000
 #define BIT_30  0x40000000
 #define BIT_31  0x80000000
+#define BIT_32  0x100000000
+#define BIT_33  0x200000000
+#define BIT_34  0x400000000
+#define BIT_35  0x800000000
+#define BIT_36  0x1000000000
+#define BIT_37  0x2000000000
+#define BIT_38  0x4000000000
+#define BIT_39  0x8000000000
+#define BIT_40  0x10000000000
+#define BIT_41  0x20000000000
+#define BIT_42  0x40000000000
+#define BIT_43  0x80000000000
+#define BIT_44  0x100000000000
+#define BIT_45  0x200000000000
+#define BIT_46  0x400000000000
+#define BIT_47  0x800000000000
+#define BIT_48  0x1000000000000
+#define BIT_49  0x2000000000000
+#define BIT_50  0x4000000000000
+#define BIT_51  0x8000000000000
+#define BIT_52  0x10000000000000
+#define BIT_53  0x20000000000000
+#define BIT_54  0x40000000000000
+#define BIT_55  0x80000000000000
+#define BIT_56  0x100000000000000
+#define BIT_57  0x200000000000000
+#define BIT_58  0x400000000000000
+#define BIT_59  0x800000000000000
+#define BIT_60  0x1000000000000000
+#define BIT_61  0x2000000000000000
+#define BIT_62  0x4000000000000000
+#define BIT_63  0x8000000000000000
 
 /*
  *  Local Macro Definitions.
  */
 #ifndef TRUE

@@ -262,10 +317,40 @@
 #define WRT16_IOMAP_REG(ha, regname, data) \
         WRT_IOREG_WORD(ha, (ha->iomap_iobase + ha->reg_off->regname), (data))
 #define WRT32_IOMAP_REG(ha, regname, data) \
         WRT_IOREG_DWORD(ha, (ha->iomap_iobase + ha->reg_off->regname), (data))
 
+#define RD8_MBAR_REG(ha, ofst) \
+        (uint8_t)ddi_get8(ha->mbar_dev_handle, \
+        (uint8_t *)(ha->mbar + (ofst)))
+#define RD16_MBAR_REG(ha, ofst) \
+        (uint16_t)ddi_get16(ha->mbar_dev_handle, \
+        (uint16_t *)(ha->mbar + (ofst)))
+#define RD32_MBAR_REG(ha, ofst) \
+        (uint32_t)ddi_get32(ha->mbar_dev_handle, \
+        (uint32_t *)(ha->mbar + (ofst)))
+#define RD64_MBAR_REG(ha, ofst) \
+        (uint64_t)ddi_get64(ha->mbar_dev_handle, \
+        (uint64_t *)(ha->mbar + (ofst)))
+
+#define WR8_MBAR_REG(ha, ofst, data) \
+        ddi_put8(ha->mbar_dev_handle, \
+        (uint8_t *)(ha->mbar + (ofst)), \
+        (uint8_t)(data))
+#define WR16_MBAR_REG(ha, ofst, data) \
+        ddi_put16(ha->mbar_dev_handle, \
+        (uint16_t *)(ha->mbar + (ofst)), \
+        (uint16_t)(data))
+#define WR32_MBAR_REG(ha, ofst, data) \
+        ddi_put32(ha->mbar_dev_handle, \
+        (uint32_t *)(ha->mbar + (ofst)), \
+        (uint32_t)(data))
+#define WR64_MBAR_REG(ha, ofst, data) \
+        ddi_put64(ha->mbar_dev_handle, \
+        (uint64_t *)(ha->mbar + (ofst)), \
+        (uint64_t)(data))
+
 /*
  * FCA definitions
  */
 #define MAX_LUNS        16384
 #define QL_FCA_BRAND    0x0fca2200

@@ -318,10 +403,14 @@
  */
 #define MAX_22_FIBRE_DEVICES    256
 #define MAX_24_FIBRE_DEVICES    2048
 #define MAX_24_VIRTUAL_PORTS    127
 #define MAX_25_VIRTUAL_PORTS    254
+#define MAX_27_VIRTUAL_PORTS    252
+#define MAX_8021_VIRTUAL_PORTS  63
+#define MAX_81XX_VIRTUAL_PORTS  254
+#define MAX_83_VIRTUAL_PORTS    254
 
 #define LAST_LOCAL_LOOP_ID               0x7d
 #define FL_PORT_LOOP_ID                  0x7e /* FFFFFE Fabric F_Port */
 #define SWITCH_FABRIC_CONTROLLER_LOOP_ID 0x7f /* FFFFFD Fabric Controller */
 #define SIMPLE_NAME_SERVER_LOOP_ID       0x80 /* FFFFFC Directory Server */

@@ -346,13 +435,13 @@
 /* Fibre Channel Topoploy. */
 #define QL_N_PORT               BIT_0
 #define QL_NL_PORT              BIT_1
 #define QL_F_PORT               BIT_2
 #define QL_FL_PORT              BIT_3
-#define QL_SNS_CONNECTION       BIT_4
 #define QL_LOOP_CONNECTION      (QL_NL_PORT | QL_FL_PORT)
 #define QL_P2P_CONNECTION       (QL_F_PORT | QL_N_PORT)
+#define QL_FABRIC_CONNECTION    (QL_F_PORT | QL_FL_PORT)
 
 /* Timeout timer counts in seconds (must greater than 1 second). */
 #define WATCHDOG_TIME           5                       /* 0 - 255 */
 #define PORT_RETRY_TIME         2                       /* 0 - 255 */
 #define LOOP_DOWN_TIMER_OFF     0

@@ -363,11 +452,10 @@
 #define IDLE_CHECK_TIMER        300                     /* 0 - 65535 */
 #define MAX_DEVICE_LOST_RETRY   16                      /* 0 - 255 */
 #define TIMEOUT_THRESHOLD       16                      /* 0 - 255 */
 
 /* Maximum outstanding commands in ISP queues (1-4095) */
-#define MAX_OUTSTANDING_COMMANDS        0x400
 #define OSC_INDEX_MASK                  0xfff
 #define OSC_INDEX_SHIFT                 12
 
 /* Maximum unsolicited buffers (1-65535) */
 #define QL_UB_LIMIT     256

@@ -378,29 +466,21 @@
 #define RCVBUF_CONTAINER_CNT    64      /* Rcv buffer containers (8-1024) */
 
 /*
  * ISP request, response, mailbox and receive buffer queue sizes
  */
+#define SHADOW_ENTRY_SIZE       4
 #define REQUEST_ENTRY_SIZE      64
 #define REQUEST_QUEUE_SIZE      (REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT)
 
 #define RESPONSE_ENTRY_SIZE     64
 #define RESPONSE_QUEUE_SIZE     (RESPONSE_ENTRY_SIZE * RESPONSE_ENTRY_CNT)
 
-#define MAILBOX_BUFFER_SIZE     0x4000
-
 #define RCVBUF_CONTAINER_SIZE   12
 #define RCVBUF_QUEUE_SIZE       (RCVBUF_CONTAINER_SIZE * RCVBUF_CONTAINER_CNT)
 
 /*
- * ISP DMA buffer definitions
- */
-#define REQUEST_Q_BUFFER_OFFSET  0
-#define RESPONSE_Q_BUFFER_OFFSET (REQUEST_Q_BUFFER_OFFSET + REQUEST_QUEUE_SIZE)
-#define RCVBUF_Q_BUFFER_OFFSET  (RESPONSE_Q_BUFFER_OFFSET + RESPONSE_QUEUE_SIZE)
-
-/*
  * DMA attributes definitions.
  */
 #define QL_DMA_LOW_ADDRESS              (uint64_t)0
 #define QL_DMA_HIGH_64BIT_ADDRESS       (uint64_t)0xffffffffffffffff
 #define QL_DMA_HIGH_32BIT_ADDRESS       (uint64_t)0xffffffff

@@ -489,10 +569,20 @@
         uint16_t nx_host_int;   /* NetXen */
         uint16_t nx_risc_int;   /* NetXen */
 } reg_off_t;
 
 /*
+ * Multi-Queue, Mem BAR 2 definition.
+ */
+#define MBAR2_REQ_IN            0x0
+#define MBAR2_REQ_OUT           0x4
+#define MBAR2_RESP_IN           0x8
+#define MBAR2_RESP_OUT          0xc
+#define MBAR2_MULTI_Q_MAX       256
+#define MBAR2_REG_OFFSET        4096
+
+/*
  * Mbox-8 read maximum debounce count.
  * Reading Mbox-8 could be debouncing, before getting stable value.
  * This is the recommended driver fix from Qlogic along with firmware fix.
  * During testing, maximum count did not cross 3.
  */

@@ -553,10 +643,12 @@
  */
 #define FLASH_DATA_FLAG         BIT_31
 #define FLASH_CONF_ADDR         0x7FFD0000
 #define FLASH_24_25_DATA_ADDR   0x7FF00000
 #define FLASH_8100_DATA_ADDR    0x7F800000
+#define FLASH_8300_DATA_ADDR    0x7F800000
+#define FLASH_2700_DATA_ADDR    0x7F800000
 #define FLASH_ADDR_MASK         0x7FFF0000
 
 #define NVRAM_CONF_ADDR         0x7FFF0000
 #define NVRAM_DATA_ADDR         0x7FFE0000
 

@@ -569,49 +661,97 @@
 #define NVRAM_2500_FUNC1_ADDR           0x48180
 #define NVRAM_8100_FUNC0_ADDR           0xD0080
 #define NVRAM_8100_FUNC1_ADDR           0xD0180
 #define NVRAM_8021_FUNC0_ADDR           0xF0080
 #define NVRAM_8021_FUNC1_ADDR           0xF0180
+#define NVRAM_8300_FC_FUNC0_ADDR        0x270080
+#define NVRAM_8300_FC_FUNC1_ADDR        0x270180
+#define NVRAM_8300_FCOE_FUNC0_ADDR      0x274080
+#define NVRAM_8300_FCOE_FUNC1_ADDR      0x274180
+#define NVRAM_2700_FUNC0_ADDR           0x270080
+#define NVRAM_2700_FUNC1_ADDR           0x270180
+#define NVRAM_2700_FUNC2_ADDR           0x270280
+#define NVRAM_2700_FUNC3_ADDR           0x270380
 
 #define VPD_2400_FUNC0_ADDR             0
 #define VPD_2400_FUNC1_ADDR             0x100
 #define VPD_2500_FUNC0_ADDR             0x48000
 #define VPD_2500_FUNC1_ADDR             0x48100
 #define VPD_8100_FUNC0_ADDR             0xD0000
 #define VPD_8100_FUNC1_ADDR             0xD0400
 #define VPD_8021_FUNC0_ADDR             0xFA300
 #define VPD_8021_FUNC1_ADDR             0xFA300
+#define VPD_8300_FC_FUNC0_ADDR          0x270000
+#define VPD_8300_FC_FUNC1_ADDR          0x270100
+#define VPD_8300_FCOE_FUNC0_ADDR        0xFA300
+#define VPD_8300_FCOE_FUNC1_ADDR        0xFA300
+#define VPD_2700_FUNC0_ADDR             0x270000
+#define VPD_2700_FUNC1_ADDR             0x270100
+#define VPD_2700_FUNC2_ADDR             0x270200
+#define VPD_2700_FUNC3_ADDR             0x270300
 #define VPD_SIZE                        0x80
 
 #define FLASH_2200_FIRMWARE_ADDR        0x20000
 #define FLASH_2300_FIRMWARE_ADDR        0x20000
 #define FLASH_2400_FIRMWARE_ADDR        0x20000
 #define FLASH_2500_FIRMWARE_ADDR        0x20000
 #define FLASH_8100_FIRMWARE_ADDR        0xA0000
 #define FLASH_8021_FIRMWARE_ADDR        0x40000
 #define FLASH_8021_FIRMWARE_SIZE        0x80000
+#define FLASH_8300_FC_FIRMWARE_ADDR     0x240000
+#define FLASH_8300_FCOE_FIRMWARE_ADDR   0x220000
+#define FLASH_8300_FIRMWARE_SIZE        0x20000
+#define FLASH_2700_FIRMWARE_ADDR        0x240000
+#define FLASH_2700_FIRMWARE_SIZE        0x20000
+
 #define FLASH_8021_BOOTLOADER_ADDR      0x4000
 #define FLASH_8021_BOOTLOADER_SIZE      0x8000
+#define FLASH_8300_BOOTLOADER_ADDR      0x4000
+#define FLASH_8300_BOOTLOADER_SIZE      0x8000
 
+#define FLASH_2200_BOOT_CODE_ADDR       0
+#define FLASH_2300_BOOT_CODE_ADDR       0
+#define FLASH_2400_BOOT_CODE_ADDR       0
+#define FLASH_2500_BOOT_CODE_ADDR       0
+#define FLASH_2700_BOOT_CODE_ADDR       0x200000
+#define FLASH_8100_BOOT_CODE_ADDR       0x80000
+#define FLASH_8021_BOOT_CODE_ADDR       0x20000
+#define FLASH_8300_BOOT_CODE_ADDR       0x200000
+
+#define BEACON_8300_FC_FUNC0_ADDR       0x00201320
+#define BEACON_8300_FC_FUNC1_ADDR       0x00201328
+#define BEACON_8300_FCOE_FUNC0_ADDR     0x00201324
+#define BEACON_8300_FCOE_FUNC1_ADDR     0x0020132c
+#define BEACON_2700_FUNC0_ADDR          0x00201320
+#define BEACON_2700_FUNC1_ADDR          0x00201328
+#define BEACON_2700_FUNC2_ADDR          0x00201330
+#define BEACON_2700_FUNC3_ADDR          0x00201338
+
 #define FLASH_2400_ERRLOG_START_ADDR_0  0
 #define FLASH_2400_ERRLOG_START_ADDR_1  0
 #define FLASH_2500_ERRLOG_START_ADDR_0  0x54000
 #define FLASH_2500_ERRLOG_START_ADDR_1  0x54400
 #define FLASH_8100_ERRLOG_START_ADDR_0  0xDC000
 #define FLASH_8100_ERRLOG_START_ADDR_1  0xDC400
+#define FLASH_8300_ERRLOG_START_ADDR_0  0x280000
+#define FLASH_8300_ERRLOG_START_ADDR_1  0x280400
 #define FLASH_ERRLOG_SIZE               0x200
 #define FLASH_ERRLOG_ENTRY_SIZE         4
 
 #define FLASH_2400_DESCRIPTOR_TABLE     0
 #define FLASH_2500_DESCRIPTOR_TABLE     0x50000
 #define FLASH_8100_DESCRIPTOR_TABLE     0xD8000
 #define FLASH_8021_DESCRIPTOR_TABLE     0
+#define FLASH_8300_DESCRIPTOR_TABLE     0xFC000
+#define FLASH_2700_DESCRIPTOR_TABLE     0xFC000
 
 #define FLASH_2400_LAYOUT_TABLE         0x11400
 #define FLASH_2500_LAYOUT_TABLE         0x50400
 #define FLASH_8100_LAYOUT_TABLE         0xD8400
 #define FLASH_8021_LAYOUT_TABLE         0xFC400
+#define FLASH_8300_LAYOUT_TABLE         0xFC400
+#define FLASH_2700_LAYOUT_TABLE         0xFC400
 
 /*
  * Flash Error Log Event Codes.
  */
 #define FLASH_ERRLOG_AEN_8002           0x8002

@@ -644,11 +784,11 @@
 #define ROM_MBX_ERR             0x02
 #define MBX_SUCCESS             0x10
 #define MBX_ERR                 0x11
 #define ASYNC_EVENT             0x12
 #define RESP_UPDATE             0x13
-#define REQ_UPDATE              0x14
+#define MULTI_Q_RSP_UPDATE      0x14
 #define SCSI_FAST_POST_16       0x15
 #define SCSI_FAST_POST_32       0x16
 #define CTIO_FAST_POST          0x17
 #define IP_FAST_POST_XMT        0x18
 #define IP_FAST_POST_RCV        0x19

@@ -1021,36 +1161,24 @@
 
 /*
  * f/w module table
  */
 struct fw_table {
-        uint16_t        fw_class;
+        uint32_t        fw_class;
         int8_t          *fw_version;
 };
 
 /*
- * aif function table
- */
-typedef struct ql_ifunc {
-        uint_t          (*ifunc)();
-} ql_ifunc_t;
-
-#define QL_MSIX_AIF             0x0
-#define QL_MSIX_RSPQ            0x1
-#define QL_MSIX_MAXAIF          QL_MSIX_RSPQ + 1
-
-/*
  * DMA memory type.
  */
 typedef enum mem_alloc_type {
         UNKNOWN_MEMORY,
         TASK_MEMORY,
         LITTLE_ENDIAN_DMA,
         BIG_ENDIAN_DMA,
         KERNEL_MEM,
-        NO_SWAP_DMA,
-        STRUCT_BUF_MEMORY
+        NO_SWAP_DMA
 } mem_alloc_type_t;
 
 /*
  * DMA memory alignment type.
  */

@@ -1067,23 +1195,19 @@
         void                    *bp;
         ddi_dma_cookie_t        *cookies;
         ddi_acc_handle_t        acc_handle;
         ddi_dma_handle_t        dma_handle;
         ddi_dma_cookie_t        cookie;
+        uint32_t                max_cookie_count;
         uint32_t                cookie_count;
         uint32_t                size;
         uint32_t                memflags;
         mem_alloc_type_t        type;
         uint32_t                flags;          /* Solaris DMA flags. */
 } dma_mem_t;
 
 /*
- * dma_mem_t memflags defines
- */
-#define MFLG_32BIT_ONLY         BIT_0
-
-/*
  * 24 bit port ID type definition.
  */
 typedef union {
         struct {
                 uint8_t d_id[3];

@@ -1125,10 +1249,45 @@
         ql_link_t  *first;
         ql_link_t  *last;
 } ql_head_t;
 
 /*
+ * ISP request queue context
+ */
+typedef struct ql_request_q {
+        struct cmd_entry        *req_ring_ptr;
+        dma_mem_t               req_ring;
+        uint32_t                *req_out_shadow_ptr;
+        uint32_t                req_out_shadow_ofst;
+        uint32_t                mbar_req_in;
+        uint32_t                mbar_req_out;
+        uint16_t                req_ring_index;
+        uint16_t                req_entry_cnt;
+        uint16_t                req_q_cnt;      /* # of available entries. */
+        uint16_t                req_q_number;
+} ql_request_q_t;
+
+/*
+ * ISP response queue context
+ */
+typedef struct ql_response_q {
+        struct ql_srb           *status_srb;
+        struct sts_entry        *rsp_ring_ptr;
+        dma_mem_t               rsp_ring;
+        kmutex_t                intr_mutex;
+        uint32_t                *rsp_in_shadow_ptr;
+        uint32_t                rsp_in_shadow_ofst;
+        uint32_t                mbar_rsp_in;
+        uint32_t                mbar_rsp_out;
+        uint16_t                rsp_ring_index;
+        uint16_t                rsp_entry_cnt;
+        uint16_t                isp_rsp_index;
+        uint16_t                rsp_q_number;
+        uint16_t                msi_x_vector;
+} ql_response_q_t;
+
+/*
  * This is the per-command structure
  */
 typedef struct ql_srb {
         /* Command link. */
         ql_link_t               cmd;

@@ -1162,42 +1321,48 @@
         /* Command state/status flags. */
         volatile uint32_t       flags;
 
         /* Command IOCB context. */
         void                    (*iocb)(struct ql_adapter_state *,
-            struct ql_srb *, void *);
+            ql_request_q_t *, struct ql_srb *, void *);
         struct cmd_entry        *request_ring_ptr;
         uint32_t                handle;
+        uint16_t                req_q_number;
         uint16_t                req_cnt;
         uint8_t                 retry_count;
+        uint8_t                 rsp_q_number;
         dma_mem_t               sg_dma;
 } ql_srb_t;
 
 #define SRB_ISP_STARTED           BIT_0   /* Command sent to ISP. */
 #define SRB_ISP_COMPLETED         BIT_1   /* ISP finished with command. */
 #define SRB_RETRY                 BIT_2   /* Driver retrying command. */
 #define SRB_POLL                  BIT_3   /* Poll for completion. */
+
 #define SRB_WATCHDOG_ENABLED      BIT_4   /* Command on watchdog list. */
-#define SRB_ABORT                 BIT_5   /* SRB to be aborted. */
+#define SRB_ELS_PKT             BIT_5 /* Extended Link Services pkt */
 #define SRB_UB_IN_FCA             BIT_6   /* FCA holds unsolicited buffer */
 #define SRB_UB_IN_ISP             BIT_7   /* ISP holds unsolicited buffer */
+
 #define SRB_UB_CALLBACK           BIT_8   /* Unsolicited callback needed. */
 #define SRB_UB_RSCN               BIT_9   /* Unsolicited RSCN callback. */
 #define SRB_UB_FCP                BIT_10  /* Unsolicited RSCN callback. */
 #define SRB_FCP_CMD_PKT           BIT_11  /* FCP command type packet. */
+
 #define SRB_FCP_DATA_PKT          BIT_12  /* FCP data type packet. */
 #define SRB_FCP_RSP_PKT           BIT_13  /* FCP response type packet. */
 #define SRB_IP_PKT                BIT_14  /* IP type packet. */
 #define SRB_GENERIC_SERVICES_PKT  BIT_15  /* Generic services type packet */
+
 #define SRB_COMMAND_TIMEOUT       BIT_16  /* Command timed out. */
 #define SRB_ABORTING              BIT_17  /* SRB aborting. */
 #define SRB_IN_DEVICE_QUEUE       BIT_18  /* In Device Queue */
 #define SRB_IN_TOKEN_ARRAY        BIT_19  /* In Token Array */
+
 #define SRB_UB_FREE_REQUESTED     BIT_20  /* UB Free requested */
 #define SRB_UB_ACQUIRED           BIT_21  /* UB selected for upcall */
 #define SRB_MS_PKT                BIT_22  /* Management Service pkt */
-#define SRB_ELS_PKT               BIT_23  /* Extended Link Services pkt */
 
 /*
  * This byte will be used to define flags for the LUN on the target.
  * Presently, we have untagged-command as one flag. Others can be
  * added later, if needed.

@@ -1227,30 +1392,44 @@
         uint32_t                flags;
 
         /* LUN execution throttle. */
         uint16_t                lun_outcnt;
 
+        /* LUN number as reported by REPORT LUNS */
         uint16_t                lun_no;
 
+        /*
+         * Logical unit number in SCSI3 format, also
+         * referred to as FCP lun or FCP entity address.
+         */
+        uint64_t                lun_addr;
+
         ql_link_t               link;
 } ql_lun_t;
 
 /*
  * LUN Queue flags
  */
 #define LQF_UNTAGGED_PENDING    BIT_0
 
 /*
+ * SCSI standard defined lun addressing methods.
+ */
+#define QL_LUN_AM_MASK          0xC0    /* Address Method Mask */
+#define QL_LUN_AM_PDEV          0x00    /* Peripheral device AM */
+#define QL_LUN_AM_FLAT          0x40    /* Flat space AM */
+#define QL_LUN_AM_LUN           0x80    /* Logical unit AM */
+#define QL_LUN_AM_EFLAT         0xC0    /* Extended flat space AM */
+#define QL_LUN_AM_ELUN          0xC0    /* Extended logical unit AM */
+
+/*
  * Fibre Channel Device Queue structure
  */
 typedef struct ql_target {
         /* Device queue lock. */
         kmutex_t                mutex;
 
-        /* Head target command link. */
-        ql_head_t               tgt_cmd;
-
         volatile uint32_t       flags;
         port_id_t               d_id;
         uint16_t                loop_id;
         volatile uint16_t       outcnt;         /* # of cmds running in ISP */
         uint32_t                iidma_rate;

@@ -1307,28 +1486,34 @@
 #define TQF_INITIATOR_DEVICE    BIT_3
 #define TQF_RSCN_RCVD           BIT_4
 #define TQF_NEED_AUTHENTICATION BIT_5
 #define TQF_PLOGI_PROGRS        BIT_6
 #define TQF_IIDMA_NEEDED        BIT_7
+#define TQF_LOGIN_NEEDED        BIT_8
+
 /*
  * Tempoary N_Port information
  */
 typedef struct ql_n_port_info {
         uint16_t        n_port_handle;
         uint8_t         port_name[8];   /* Big endian. */
         uint8_t         node_name[8];   /* Big endian. */
+        port_id_t       d_id;
 } ql_n_port_info_t;
 
 /*
  * iiDMA
  */
 #define IIDMA_RATE_INIT         0xffffffff      /* init state */
 #define IIDMA_RATE_NDEF         0xfffffffe      /* not defined in conf file */
 #define IIDMA_RATE_1GB          0x0
 #define IIDMA_RATE_2GB          0x1
+#define IIDMA_RATE_AUTO         0x2
 #define IIDMA_RATE_4GB          0x3
 #define IIDMA_RATE_8GB          0x4
+#define IIDMA_RATE_16GB         0x5
+#define IIDMA_RATE_32GB         0x6
 #define IIDMA_RATE_10GB         0x13
 #define IIDMA_RATE_MAX          IIDMA_RATE_10GB
 
 /*
  * Kernel statistic structure definitions.

@@ -1365,28 +1550,49 @@
 /* DUMP state flags. */
 #define QL_DUMPING              BIT_0
 #define QL_DUMP_VALID           BIT_1
 #define QL_DUMP_UPLOADED        BIT_2
 
+#define QL_LOG_ENTRIES  256             /* max # of EL entries */
+#define QL_LOG_LENGTH   128             /* max # of bytes in each EL entry */
+
+typedef struct ql_trace_entry {
+        timespec_t      hs_time;        /* high resolution timestamp */
+        char            buf[QL_LOG_LENGTH];
+} ql_trace_entry_t;
+
+/* per instance based extended logging trace descriptor */
 typedef struct el_trace_desc {
         kmutex_t        mutex;
-        uint16_t        next;
-        uint32_t        trace_buffer_size;
-        char            *trace_buffer;
-} el_trace_desc_t;
+        uint32_t        nentries; /* max number of entries */
+        uint16_t        nindex; /* next index to fill */
+        uint32_t        start;  /* starting point */
+        uint32_t        end;    /* ending point */
+        uint32_t        csize;  /* current filled queue size */
+        uint32_t        count;  /* sequence number */
+        size_t          trace_buffer_size;
+        ql_trace_entry_t *trace_buffer;
+} ql_trace_desc_t;
 
 /*
  * NVRAM cache descriptor.
  */
 typedef struct nvram_cache_desc {
-        kmutex_t        mutex;
         uint32_t        valid;
         uint32_t        size;
         void            *cache;
 } nvram_cache_desc_t;
 
 /*
+ * Plogi retry parameters
+ */
+typedef struct plogi_params_desc {
+        uint32_t        retry_cnt;
+        uint32_t        retry_dly_usec;
+} plogi_params_desc_t;
+
+/*
  * ql attach progress indication
  */
 #define QL_SOFT_STATE_ALLOCED           BIT_0
 #define QL_REGS_MAPPED                  BIT_1
 #define QL_HBA_BUFFER_SETUP             BIT_2

@@ -1399,10 +1605,14 @@
 #define QL_FCA_TRAN_ALLOCED             BIT_9
 #define QL_FCA_ATTACH_DONE              BIT_10
 #define QL_IOMAP_IOBASE_MAPPED          BIT_11
 #define QL_N_PORT_INFO_CREATED          BIT_12
 #define QL_DB_IOBASE_MAPPED             BIT_13
+#define QL_FCA_INIT_FM                  BIT_14
+#define QL_NVRAM_CACHE_CREATED          BIT_15
+#define QL_PLOGI_PARAMS_CREATED         BIT_16
+
 /* Device queue head list size (based on AL_PA address). */
 #define DEVICE_HEAD_LIST_SIZE   0x81
 
 struct legacy_intr_set {
         uint32_t        int_vec_bit;

@@ -1409,90 +1619,109 @@
         uint32_t        tgt_status_reg;
         uint32_t        tgt_mask_reg;
         uint32_t        pci_int_reg;
 };
 
+/* Returned Mailbox registers. */
+typedef struct ql_mbx_data {
+        uint16_t        mb[MAX_MBOX_COUNT];
+} ql_mbx_data_t;
+
+typedef struct ql_ledstate {
+        uint32_t        BeaconState;
+        uint32_t        LEDflags;
+        uint32_t        flags;
+        uint32_t        led_blink_on;
+        uint32_t        select;
+        ql_mbx_data_t   cfg;
+} ql_ledstate_t;
+
 /*
  * Adapter state structure.
  */
 typedef struct ql_adapter_state {
         ql_link_t               hba;
 
         kmutex_t                mutex;
-        volatile uint32_t       flags;                  /* State flags. */
+        volatile uint64_t       flags;                  /* State flags. */
         uint32_t                state;
         port_id_t               d_id;
         uint16_t                loop_id;
-        uint8_t                 topology;
         uint16_t                sfp_stat;
-
         uint16_t                idle_timer;
+        uint16_t                r_a_tov;            /* 2 * R_A_TOV + 5 */
+        uint8_t                 topology;
+        uint8_t                 bbcr_runtime;
+        uint8_t                 bbcr_initial;
         uint8_t                 loop_down_abort_time;
         uint8_t                 port_retry_timer;
         uint8_t                 loop_down_timer;
         uint8_t                 watchdog_timer;
-        uint16_t                r_a_tov;            /* 2 * R_A_TOV + 5 */
 
         /* Task Daemon context. */
-        callb_cpr_t             cprinfo;
+        ql_head_t               unsol_callback_queue;
+        ddi_taskq_t             *driver_thread_taskq;
         kmutex_t                task_daemon_mutex;
-        kcondvar_t              cv_dr_suspended;
         kcondvar_t              cv_task_daemon;
-        volatile uint32_t       task_daemon_flags;
-        ql_head_t               callback_queue;
+        kcondvar_t              cv_dr_suspended;
+        volatile uint64_t       task_daemon_flags;
+        uint32_t                driver_thread_awake;
+        uint64_t                df;
+        uint64_t                sf;
+        uint64_t                cf;
 
+        /* Completion thread context */
+        ddi_taskq_t             *completion_taskq;
+        ql_head_t               comp_q;
+        kmutex_t                comp_q_mutex;
+        kcondvar_t              cv_comp_thread;
+        uint8_t                 comp_thds_active;
+        uint8_t                 comp_thds_awake;
+        uint8_t                 completion_thds;
+
         /* Interrupt context. */
-        kmutex_t                intr_mutex;
-        caddr_t                 iobase;
-        uint8_t                 rev_id;
-        uint16_t                device_id;
-        uint16_t                subsys_id;
-        uint16_t                subven_id;
-        uint16_t                ven_id;
-        uint16_t                fw_class;
-        ql_srb_t                *status_srb;
+        ddi_iblock_cookie_t     iblock_cookie;
+        ddi_intr_handle_t       *htable;
+        uint32_t                hsize;
+        int32_t                 intr_cnt;
+        void                    *intr_pri;
+        int32_t                 intr_cap;
+        uint32_t                iflags;
         volatile uint8_t        intr_claimed;
+        uint8_t                 mq_msix_vectors;
+        uint8_t                 interrupt_count;
 
-        /*
-         * ISP request queue, response queue, mailbox buffer and
-         * IP receive queue buffer.
-         */
-        dma_mem_t               hba_buf;
-
-        /* ISP request queue context. */
-        kmutex_t                req_ring_mutex;
-        struct cmd_entry        *request_ring_bp;
-        struct cmd_entry        *request_ring_ptr;
-        uint64_t                request_dvma;
-        uint16_t                req_ring_index;
-        uint16_t                req_q_cnt;      /* # of available entries. */
+        /* Outstanding ISP commands. */
         ql_head_t               pending_cmds;
         ql_srb_t                **outstanding_cmds;
         uint16_t                osc_index;
+        uint16_t                osc_max_cnt;
 
+        /* ISP request queue context. */
+        kmutex_t                req_ring_mutex;
+        ql_request_q_t          *req_q[2];
+
         /* ISP response queue context. */
-        struct sts_entry        *response_ring_bp;
-        struct sts_entry        *response_ring_ptr;
-        uint64_t                response_dvma;
-        uint16_t                rsp_ring_index;
-        uint16_t                isp_rsp_index;
+        ql_response_q_t         **rsp_queues;
+        uint32_t                rsp_queues_size;
+        uint8_t                 rsp_queues_cnt;
+        uint8_t                 rsp_q_number;
+        uint8_t                 io_min_rsp_q_number;
 
+        /* IP receive buffer queue context. */
+        ql_tgt_t                *rcv_dev_q;
+        dma_mem_t               rcv_ring;
+        struct rcvbuf           *rcvbuf_ring_ptr;
+        uint16_t                rcvbuf_ring_index;
+
         /* Mailbox context. */
         kmutex_t                mbx_mutex;
-        caddr_t                 mbx_bp;
         struct mbx_cmd          *mcp;
         kcondvar_t              cv_mbx_wait;
         kcondvar_t              cv_mbx_intr;
         volatile uint8_t        mailbox_flags;
 
-        /* ISP receive buffer queue context. */
-        ql_tgt_t                *rcv_dev_q;
-        struct rcvbuf           *rcvbuf_ring_bp;
-        struct rcvbuf           *rcvbuf_ring_ptr;
-        uint64_t                rcvbuf_dvma;
-        uint16_t                rcvbuf_ring_index;
-
         /* Unsolicited buffer data. */
         uint16_t                ub_outcnt;
         uint8_t                 ub_seq_id;
         uint8_t                 ub_command_count;
         uint8_t                 ub_notify_count;

@@ -1506,17 +1735,30 @@
 
         /* Kernel statistics. */
         kstat_t                 *k_stats;
         ql_adapter_stat_t       *adapter_stats;
 
-        /* Solaris adapter configuration data */
-        ddi_acc_handle_t        dev_handle;
+        /* PCI context */
         ddi_acc_handle_t        pci_handle;     /* config space */
+        ddi_acc_handle_t        dev_handle;
+        caddr_t                 iobase;
         ddi_acc_handle_t        iomap_dev_handle;
         caddr_t                 iomap_iobase;
+        ddi_acc_handle_t        mbar_dev_handle;
+        caddr_t                 mbar;
+        uint32_t                mbar_size;
+        uint32_t                mbar_queue_offset;
+        uint16_t                device_id;
+        uint16_t                subsys_id;
+        uint16_t                subven_id;
+        uint16_t                ven_id;
+        uint16_t                pci_max_read_req;
+        uint8_t                 rev_id;
+        uint8_t                 pci_function_number;
+
+        /* Solaris adapter configuration data */
         dev_info_t              *dip;
-        ddi_iblock_cookie_t     iblock_cookie;
         fc_fca_tran_t           *tran;
         uint32_t                instance;
         int8_t                  *devpath;
         uint32_t                fru_hba_index;
         uint32_t                fru_port_index;

@@ -1527,53 +1769,64 @@
         fc_fca_bind_info_t      bind_info;
         ddi_modhandle_t         fw_module;
         uint32_t                fw_major_version;
         uint32_t                fw_minor_version;
         uint32_t                fw_subminor_version;
-        uint16_t                fw_attributes;
+        uint32_t                fw_attributes;
+        uint32_t                fw_ext_attributes;
+        uint32_t                fw_ext_memory_end;
         uint32_t                fw_ext_memory_size;
+        uint32_t                fw_shared_ram_start;
+        uint32_t                fw_shared_ram_end;
+        uint32_t                fw_ddr_ram_start;
+        uint32_t                fw_ddr_ram_end;
         uint32_t                parity_pause_errors;
         boolean_t               log_parity_pause;
+        uint32_t                fw_class;
+        uint16_t                fw_state[7];
+        uint16_t                rom_status;
+        ql_ledstate_t           ledstate;
         uint16_t                parity_hccr_err;
         uint32_t                parity_stat_err;
         reg_off_t               *reg_off;
         caddr_t                 risc_code;
         uint32_t                risc_code_size;
         ql_fw_code_t            risc_fw[MAX_RISC_CODE_SEGMENTS];
         uint32_t                risc_dump_size;
         void                    (*fcp_cmd)(struct ql_adapter_state *,
-                                    ql_srb_t *, void *);
+                                ql_request_q_t *, ql_srb_t *, void *);
         void                    (*ip_cmd)(struct ql_adapter_state *,
-                                    ql_srb_t *, void *);
+                                ql_request_q_t *, ql_srb_t *, void *);
         void                    (*ms_cmd)(struct ql_adapter_state *,
-                                    ql_srb_t *, void *);
+                                ql_request_q_t *, ql_srb_t *, void *);
+        void                    (*els_cmd)(struct ql_adapter_state *,
+                                ql_request_q_t *, ql_srb_t *, void *);
         uint8_t                 cmd_segs;
         uint8_t                 cmd_cont_segs;
 
         /* NVRAM configuration data */
-        uint32_t                cfg_flags;
+        uint64_t                cfg_flags;
         ql_comb_init_cb_t       init_ctrl_blk;
         ql_comb_ip_init_cb_t    ip_init_ctrl_blk;
-        uint16_t                nvram_version;
-        uint16_t                adapter_features;
         uint32_t                fw_transfer_size;
+        uint16_t                adapter_features;
         uint16_t                execution_throttle;
         uint16_t                port_down_retry_count;
+        uint16_t                serdes_param[4];
+        uint16_t                maximum_luns_per_target;
         uint8_t                 port_down_retry_delay;
         uint8_t                 qfull_retry_count;
         uint8_t                 qfull_retry_delay;
-        uint16_t                serdes_param[4];
         uint8_t                 loop_reset_delay;
 
         /* Power management context. */
         kmutex_t                pm_mutex;
-        uint32_t                busy;
+        uint32_t                pm_busy;
         uint8_t                 power_level;
         uint8_t                 pm_capable;
         uint8_t                 config_saved;
         uint8_t                 lip_on_panic;
-        port_id_t               port_hard_address;
 
         /* sbus card data */
         caddr_t                 sbus_fpga_iobase;
         ddi_acc_handle_t        sbus_fpga_dev_handle;
         ddi_acc_handle_t        sbus_config_handle;

@@ -1580,29 +1833,14 @@
         caddr_t                 sbus_config_base;
 
         /* XIOCTL context pointer. */
         struct ql_xioctl        *xioctl;
 
-        kmutex_t                cache_mutex;
         struct ql_fcache        *fcache;
         int8_t                  *vcache;
+        nvram_cache_desc_t      *nvram_cache;
 
-        /* AIF (Advanced Interrupt Framework) support */
-        ddi_intr_handle_t       *htable;
-        uint32_t                hsize;
-        int32_t                 intr_cnt;
-        uint32_t                intr_pri;
-        int32_t                 intr_cap;
-        uint32_t                iflags;
-
-        /* PCI maximum read request override */
-        uint16_t                pci_max_read_req;
-
-        /* port manage mutex */
-        kmutex_t                portmutex;
-        uint16_t                maximum_luns_per_target;
-
         /* f/w dump mutex */
         uint32_t                ql_dump_size;
         uint32_t                ql_dump_state;
         void                    *ql_dump_ptr;
         kmutex_t                dump_mutex;

@@ -1609,33 +1847,37 @@
 
         uint8_t                 fwwait;
 
         dma_mem_t               fwexttracebuf;          /* extended trace  */
         dma_mem_t               fwfcetracebuf;          /* event trace */
+        ql_mbx_data_t           fw_fce_trace_enable;
         uint32_t                fwfcetraceopt;
         uint32_t                flash_errlog_start;     /* 32bit word addr */
         uint32_t                flash_errlog_ptr;       /* 32bit word addr */
         uint8_t                 send_plogi_timer;
 
+        /* Plogi retry parameters */
+        plogi_params_desc_t     *plogi_params;
+
         /* Virtual port context. */
         fca_port_attrs_t        *pi_attrs;
         struct ql_adapter_state *pha;
         struct ql_adapter_state *vp_next;
         uint8_t                 vp_index;
+        uint8_t                 max_vports;
 
         uint16_t                free_loop_id;
 
         /* Tempoary N_Port information */
         struct ql_n_port_info   *n_port;
 
-        void                    (*els_cmd)(struct ql_adapter_state *,
-                                    ql_srb_t *, void *);
-        el_trace_desc_t         *el_trace_desc;
+        ql_trace_desc_t         *ql_trace_desc;
 
         uint32_t                flash_data_addr;
         uint32_t                flash_fw_addr;
         uint32_t                flash_golden_fw_addr;
+        uint32_t                boot_code_addr;
         uint32_t                flash_vpd_addr;
         uint32_t                flash_nvram_addr;
         uint32_t                flash_desc_addr;
         uint32_t                mpi_capability_list;
         uint8_t                 phy_fw_major_version;

@@ -1643,101 +1885,140 @@
         uint8_t                 phy_fw_subminor_version;
         uint8_t                 mpi_fw_major_version;
         uint8_t                 mpi_fw_minor_version;
         uint8_t                 mpi_fw_subminor_version;
 
-        uint8_t                 idc_flash_acc;
-        uint8_t                 idc_restart_cnt;
         uint16_t                idc_mb[8];
         uint8_t                 idc_restart_timer;
-        uint8_t                 idc_flash_acc_timer;
 
         /* VLAN ID and MAC address */
         uint8_t                 fcoe_vnport_mac[6];
         uint16_t                fabric_params;
         uint16_t                fcoe_vlan_id;
         uint16_t                fcoe_fcf_idx;
-        nvram_cache_desc_t      *nvram_cache;
 
         /* NetXen context */
         ddi_acc_handle_t        db_dev_handle;
         caddr_t                 db_iobase;
-        uint64_t                first_page_group_start;
-        uint64_t                first_page_group_end;
-        uint64_t                mn_win_crb;
         caddr_t                 nx_pcibase;     /* BAR0 base I/O address */
-        uint32_t                crb_win;
-        uint32_t                ddr_mn_window;
         uint32_t                qdr_sn_window;
         uint32_t                *nx_req_in;
         caddr_t                 db_read;
         uint32_t                pci_bus_addr;
         struct legacy_intr_set  nx_legacy_intr;
         uint32_t                bootloader_size;
         uint32_t                bootloader_addr;
         uint32_t                flash_fw_size;
+        uint32_t                dev_state;
+        uint32_t                fw_heartbeat_counter;
+        dma_mem_t               dmp_template;
+        uint32_t                md_capture_mask;
+        uint32_t                md_capture_size;
         uint16_t                iidma_rate;
         uint8_t                 function_number;
         uint8_t                 timeout_cnt;
+        uint8_t                 seconds_since_last_heartbeat;
+
+        /* default dma attributes */
+        ddi_dma_attr_t          bit32_io_dma_attr;
+        ddi_dma_attr_t          bit64_io_dma_attr;
+
+        ddi_dma_attr_t          io_dma_attr;
+        ddi_dma_attr_t          fcsm_cmd_dma_attr;
+        ddi_dma_attr_t          fcsm_rsp_dma_attr;
+        ddi_dma_attr_t          fcip_cmd_dma_attr;
+        ddi_dma_attr_t          fcip_rsp_dma_attr;
+        ddi_dma_attr_t          fcp_cmd_dma_attr;
+        ddi_dma_attr_t          fcp_rsp_dma_attr;
+        ddi_dma_attr_t          fcp_data_dma_attr;
+
+        int                     fm_capabilities;
+        uint16_t                errlog[4];
 } ql_adapter_state_t;
 
 /*
  * adapter state flags
  */
-#define FCA_BOUND                       BIT_0
-#define QL_OPENED                       BIT_1
-#define ONLINE                          BIT_2
-#define INTERRUPTS_ENABLED              BIT_3
-#define ABORT_CMDS_LOOP_DOWN_TMO        BIT_4
-#define POINT_TO_POINT                  BIT_5
-#define IP_ENABLED                      BIT_6
-#define IP_INITIALIZED                  BIT_7
-#define MENLO_LOGIN_OPERATIONAL         BIT_8
-#define ADAPTER_SUSPENDED               BIT_9
-#define ADAPTER_TIMER_BUSY              BIT_10
-#define PARITY_ERROR                    BIT_11
-#define FLASH_ERRLOG_MARKER             BIT_12
-#define VP_ENABLED                      BIT_13
-#define FDISC_ENABLED                   BIT_14
-#define FUNCTION_1                      BIT_15
-#define MPI_RESET_NEEDED                BIT_16
+#define FCA_BOUND                       (uint64_t)BIT_0
+#define QL_OPENED                       (uint64_t)BIT_1
+#define ONLINE                          (uint64_t)BIT_2
+#define INTERRUPTS_ENABLED              (uint64_t)BIT_3
 
+#define ABORT_CMDS_LOOP_DOWN_TMO        (uint64_t)BIT_4
+#define POINT_TO_POINT                  (uint64_t)BIT_5
+#define IP_ENABLED                      (uint64_t)BIT_6
+#define IP_INITIALIZED                  (uint64_t)BIT_7
+
+#define MENLO_LOGIN_OPERATIONAL         (uint64_t)BIT_8
+#define ADAPTER_SUSPENDED               (uint64_t)BIT_9
+#define FW_DUMP_NEEDED                  (uint64_t)BIT_10
+#define PARITY_ERROR                    (uint64_t)BIT_11
+
+#define FLASH_ERRLOG_MARKER             (uint64_t)BIT_12
+#define VP_ENABLED                      (uint64_t)BIT_13
+#define FDISC_ENABLED                   (uint64_t)BIT_14
+#define MULTI_QUEUE                     (uint64_t)BIT_15
+
+#define MPI_RESET_NEEDED                (uint64_t)BIT_16
+#define VP_ID_NOT_ACQUIRED              (uint64_t)BIT_17
+#define IDC_STALL_NEEDED                (uint64_t)BIT_18
+#define POLL_INTR                       (uint64_t)BIT_19
+
+#define IDC_RESTART_NEEDED              (uint64_t)BIT_20
+#define IDC_ACK_NEEDED                  (uint64_t)BIT_21
+#define LOOPBACK_ACTIVE                 (uint64_t)BIT_22
+#define QUEUE_SHADOW_PTRS               (uint64_t)BIT_23
+
+#define NO_INTR_HANDSHAKE               (uint64_t)BIT_24
+#define COMP_THD_TERMINATE              (uint64_t)BIT_25
+#define DISABLE_NIC_FW_DMP              (uint64_t)BIT_26
+#define MULTI_CHIP_ADAPTER              (uint64_t)BIT_27
+
 /*
  * task daemon flags
  */
-#define TASK_DAEMON_STOP_FLG            BIT_0
-#define TASK_DAEMON_SLEEPING_FLG        BIT_1
-#define TASK_DAEMON_ALIVE_FLG           BIT_2
-#define TASK_DAEMON_IDLE_CHK_FLG        BIT_3
-#define SUSPENDED_WAKEUP_FLG            BIT_4
-#define FC_STATE_CHANGE                 BIT_5
-#define NEED_UNSOLICITED_BUFFERS        BIT_6
-#define RESET_MARKER_NEEDED             BIT_7
-#define RESET_ACTIVE                    BIT_8
-#define ISP_ABORT_NEEDED                BIT_9
-#define ABORT_ISP_ACTIVE                BIT_10
-#define LOOP_RESYNC_NEEDED              BIT_11
-#define LOOP_RESYNC_ACTIVE              BIT_12
-#define LOOP_DOWN                       BIT_13
-#define DRIVER_STALL                    BIT_14
-#define COMMAND_WAIT_NEEDED             BIT_15
-#define COMMAND_WAIT_ACTIVE             BIT_16
-#define STATE_ONLINE                    BIT_17
-#define ABORT_QUEUES_NEEDED             BIT_18
-#define TASK_DAEMON_STALLED_FLG         BIT_19
-#define TASK_THREAD_CALLED              BIT_20
-#define FIRMWARE_UP                     BIT_21
-#define LIP_RESET_PENDING               BIT_22
-#define FIRMWARE_LOADED                 BIT_23
-#define RSCN_UPDATE_NEEDED              BIT_24
-#define HANDLE_PORT_BYPASS_CHANGE       BIT_25
-#define PORT_RETRY_NEEDED               BIT_26
-#define TASK_DAEMON_POWERING_DOWN       BIT_27
-#define TD_IIDMA_NEEDED                 BIT_28
-#define SEND_PLOGI                      BIT_29
-#define IDC_EVENT                       BIT_30
+#define TASK_DAEMON_STOP_FLG            (uint64_t)BIT_0
+#define TASK_DAEMON_SLEEPING_FLG        (uint64_t)BIT_1
+#define TASK_DAEMON_ALIVE_FLG           (uint64_t)BIT_2
+#define TASK_DAEMON_IDLE_CHK_FLG        (uint64_t)BIT_3
 
+#define SUSPENDED_WAKEUP_FLG            (uint64_t)BIT_4
+#define FC_STATE_CHANGE                 (uint64_t)BIT_5
+#define NEED_UNSOLICITED_BUFFERS        (uint64_t)BIT_6
+#define MARKER_NEEDED                   (uint64_t)BIT_7
+
+#define MARKER_ACTIVE                   (uint64_t)BIT_8
+#define ISP_ABORT_NEEDED                (uint64_t)BIT_9
+#define ABORT_ISP_ACTIVE                (uint64_t)BIT_10
+#define LOOP_RESYNC_NEEDED              (uint64_t)BIT_11
+
+#define LOOP_RESYNC_ACTIVE              (uint64_t)BIT_12
+#define LOOP_DOWN                       (uint64_t)BIT_13
+#define DRIVER_STALL                    (uint64_t)BIT_14
+#define COMMAND_WAIT_NEEDED             (uint64_t)BIT_15
+
+#define COMMAND_WAIT_ACTIVE             (uint64_t)BIT_16
+#define STATE_ONLINE                    (uint64_t)BIT_17
+#define ABORT_QUEUES_NEEDED             (uint64_t)BIT_18
+#define TASK_DAEMON_STALLED_FLG         (uint64_t)BIT_19
+
+#define SEND_PLOGI                      (uint64_t)BIT_20
+#define FIRMWARE_UP                     (uint64_t)BIT_21
+#define IDC_POLL_NEEDED                 (uint64_t)BIT_22
+#define FIRMWARE_LOADED                 (uint64_t)BIT_23
+
+#define RSCN_UPDATE_NEEDED              (uint64_t)BIT_24
+#define HANDLE_PORT_BYPASS_CHANGE       (uint64_t)BIT_25
+#define PORT_RETRY_NEEDED               (uint64_t)BIT_26
+#define TASK_DAEMON_POWERING_DOWN       (uint64_t)BIT_27
+
+#define TD_IIDMA_NEEDED                 (uint64_t)BIT_28
+#define WATCHDOG_NEEDED                 (uint64_t)BIT_29
+#define LED_BLINK                       (uint64_t)BIT_30
+
+#define DTF_EL_MSG_SKIP_FLGS    (IDC_POLL_NEEDED | WATCHDOG_NEEDED | \
+    TASK_DAEMON_IDLE_CHK_FLG | LED_BLINK)
 /*
  * Mailbox flags
  */
 #define MBX_WANT_FLG                            BIT_0
 #define MBX_BUSY_FLG                            BIT_1

@@ -1745,53 +2026,82 @@
 #define MBX_ABORT                               BIT_3
 
 /*
  * Configuration flags
  */
-#define CFG_ENABLE_HARD_ADDRESS                 BIT_0
-#define CFG_ENABLE_64BIT_ADDRESSING             BIT_1
-#define CFG_ENABLE_LIP_RESET                    BIT_2
-#define CFG_ENABLE_FULL_LIP_LOGIN               BIT_3
-#define CFG_ENABLE_TARGET_RESET                 BIT_4
-#define CFG_ENABLE_LINK_DOWN_REPORTING          BIT_5
-#define CFG_DISABLE_EXTENDED_LOGGING_TRACE      BIT_6
-#define CFG_ENABLE_FCP_2_SUPPORT                BIT_7
-#define CFG_MULTI_CHIP_ADAPTER                  BIT_8
-#define CFG_SBUS_CARD                           BIT_9
-#define CFG_CTRL_2300                           BIT_10
-#define CFG_CTRL_6322                           BIT_11
-#define CFG_CTRL_2200                           BIT_12
-#define CFG_CTRL_2422                           BIT_13
-#define CFG_CTRL_25XX                           BIT_14
-#define CFG_ENABLE_EXTENDED_LOGGING             BIT_15
-#define CFG_DISABLE_RISC_CODE_LOAD              BIT_16
-#define CFG_SET_CACHE_LINE_SIZE_1               BIT_17
-#define CFG_CTRL_MENLO                          BIT_18
-#define CFG_EXT_FW_INTERFACE                    BIT_19
-#define CFG_LOAD_FLASH_FW                       BIT_20
-#define CFG_DUMP_MAILBOX_TIMEOUT                BIT_21
-#define CFG_DUMP_ISP_SYSTEM_ERROR               BIT_22
-#define CFG_DUMP_DRIVER_COMMAND_TIMEOUT         BIT_23
-#define CFG_DUMP_LOOP_OFFLINE_TIMEOUT           BIT_24
-#define CFG_ENABLE_FWEXTTRACE                   BIT_25
-#define CFG_ENABLE_FWFCETRACE                   BIT_26
-#define CFG_FW_MISMATCH                         BIT_27
-#define CFG_CTRL_81XX                           BIT_28
-#define CFG_CTRL_8021                           BIT_29
-#define CFG_FAST_TIMEOUT                        BIT_30
-#define CFG_LR_SUPPORT                          BIT_31
+#define CFG_CTRL_27XX                           (uint64_t)BIT_0
+#define CFG_ENABLE_64BIT_ADDRESSING             (uint64_t)BIT_1
+#define CFG_ENABLE_LIP_RESET                    (uint64_t)BIT_2
+#define CFG_ENABLE_FULL_LIP_LOGIN               (uint64_t)BIT_3
 
-#define CFG_CTRL_2425           (CFG_CTRL_2422 | CFG_CTRL_25XX)
-#define CFG_CTRL_8081           (CFG_CTRL_8021 | CFG_CTRL_81XX)
-#define CFG_CTRL_2581           (CFG_CTRL_25XX | CFG_CTRL_81XX)
-#define CFG_CTRL_242581         (CFG_CTRL_2422 | CFG_CTRL_25XX | CFG_CTRL_81XX)
-#define CFG_CTRL_24258081       (CFG_CTRL_2425 | CFG_CTRL_8081)
-#define CFG_CTRL_258081         (CFG_CTRL_25XX | CFG_CTRL_8081)
-#define CFG_CTRL_2480           (CFG_CTRL_2422 | CFG_CTRL_8021)
+#define CFG_ENABLE_TARGET_RESET                 (uint64_t)BIT_4
+#define CFG_ENABLE_LINK_DOWN_REPORTING          (uint64_t)BIT_5
+#define CFG_LR_SUPPORT                          (uint64_t)BIT_6
+#define CFG_ENABLE_FCP_2_SUPPORT                (uint64_t)BIT_7
 
-#define CFG_IST(ha, cfgflags)   (ha->cfg_flags & cfgflags)
+#define CFG_CTRL_83XX                           (uint64_t)BIT_8
+#define CFG_SBUS_CARD                           (uint64_t)BIT_9
+#define CFG_CTRL_23XX                           (uint64_t)BIT_10
+#define CFG_CTRL_63XX                           (uint64_t)BIT_11
 
+#define CFG_CTRL_22XX                           (uint64_t)BIT_12
+#define CFG_CTRL_24XX                           (uint64_t)BIT_13
+#define CFG_CTRL_25XX                           (uint64_t)BIT_14
+#define CFG_ENABLE_EXTENDED_LOGGING             (uint64_t)BIT_15
+
+#define CFG_DISABLE_RISC_CODE_LOAD              (uint64_t)BIT_16
+#define CFG_SET_CACHE_LINE_SIZE_1               (uint64_t)BIT_17
+#define CFG_CTRL_MENLO                          (uint64_t)BIT_18
+#define CFG_EXT_FW_INTERFACE                    (uint64_t)BIT_19
+
+#define CFG_LOAD_FLASH_FW                       (uint64_t)BIT_20
+#define CFG_DUMP_MAILBOX_TIMEOUT                (uint64_t)BIT_21
+#define CFG_DUMP_ISP_SYSTEM_ERROR               (uint64_t)BIT_22
+#define CFG_DUMP_DRIVER_COMMAND_TIMEOUT         (uint64_t)BIT_23
+
+#define CFG_DUMP_LOOP_OFFLINE_TIMEOUT           (uint64_t)BIT_24
+#define CFG_ENABLE_FWEXTTRACE                   (uint64_t)BIT_25
+#define CFG_ENABLE_FWFCETRACE                   (uint64_t)BIT_26
+#define CFG_CTRL_80XX                           (uint64_t)BIT_27
+
+#define CFG_CTRL_81XX                           (uint64_t)BIT_28
+#define CFG_CTRL_82XX                           (uint64_t)BIT_29
+#define CFG_FAST_TIMEOUT                        (uint64_t)BIT_30
+
+#define CFG_CTRL_2363           (CFG_CTRL_23XX | CFG_CTRL_63XX)
+#define CFG_CTRL_2425           (CFG_CTRL_24XX | CFG_CTRL_25XX)
+#define CFG_CTRL_2783           (CFG_CTRL_27XX | CFG_CTRL_83XX)
+#define CFG_CTRL_8081           (CFG_CTRL_80XX | CFG_CTRL_81XX)
+#define CFG_CTRL_278083         (CFG_CTRL_80XX | CFG_CTRL_2783)
+#define CFG_CTRL_27808183       (CFG_CTRL_8081 | CFG_CTRL_2783)
+#define CFG_CTRL_2527808183     (CFG_CTRL_25XX | CFG_CTRL_27808183)
+#define CFG_CTRL_252780818283   (CFG_CTRL_82XX | CFG_CTRL_2527808183)
+
+#define CFG_ISP_FW_TYPE_1       (CFG_CTRL_22XX | CFG_CTRL_2363)
+#define CFG_ISP_FW_TYPE_2       (CFG_CTRL_24XX | CFG_CTRL_252780818283)
+#define CFG_FCIP_TYPE_1         (CFG_CTRL_22XX | CFG_CTRL_23XX)
+#define CFG_FCIP_SUPPORT        (CFG_FCIP_TYPE_1 | CFG_CTRL_24XX)
+#define CFG_FCOE_SUPPORT        (CFG_CTRL_82XX | CFG_CTRL_8081)
+#define CFG_N2N_SUPPORT         (CFG_CTRL_2425 | CFG_CTRL_2783)
+#define CFG_FC_TYPE_1           (CFG_CTRL_22XX | CFG_CTRL_2363)
+#define CFG_FC_TYPE_2           (CFG_CTRL_2425 | CFG_CTRL_2783)
+#define CFG_FC_TYPE             (CFG_FC_TYPE_1 | CFG_FC_TYPE_2)
+#define CFG_NO_INTR_HSHAKE_SUP  (CFG_CTRL_27808183)
+#define CFG_MWB_4096_SUPPORT    (CFG_CTRL_2425 | CFG_CTRL_81XX)
+#define CFG_IIDMA_SUPPORT       (CFG_CTRL_8081 | CFG_FC_TYPE_2)
+#define CFG_FLASH_ACC_SUPPORT   (CFG_CTRL_27808183)
+#define CFG_FLASH_DMA_SUPPORT   (CFG_CTRL_2527808183)
+#define CFG_LOOP_POINT_SUPPORT  (CFG_CTRL_8081)
+#define CFG_LB_ECHO_SUPPORT     (CFG_CTRL_2363 | CFG_ISP_FW_TYPE_2)
+#define CFG_SET_LEDS_SUPPORT    (CFG_CTRL_2363 | CFG_ISP_FW_TYPE_2)
+#define CFG_SERDES_SUPPORT      (CFG_CTRL_2783)
+#define CFG_BBCR_SUPPORT        (CFG_CTRL_2783)
+#define CFG_MSI_SUPPORT         (CFG_CTRL_2425 | CFG_CTRL_81XX | CFG_CTRL_82XX)
+
+
+#define CFG_IST(ha, cfgflags)   (ha->cfg_flags & (cfgflags))
+
 /*
  * Interrupt configuration flags
  */
 #define IFLG_INTR_LEGACY                        BIT_0
 #define IFLG_INTR_FIXED                         BIT_1

@@ -1808,12 +2118,14 @@
 #define MSW(x)          (uint16_t)((uint32_t)(x) >> 16)
 #define LSW(x)          (uint16_t)(x)
 #define LSD(x)          (uint32_t)(x)
 #define MSD(x)          (uint32_t)((uint64_t)(x) >> 32)
 
-#define SHORT_TO_LONG(lsw, msw) (uint32_t)((uint16_t)msw << 16 | (uint16_t)lsw)
-#define CHAR_TO_SHORT(lsb, msb) (uint16_t)((uint8_t)msb << 8 | (uint8_t)lsb)
+#define LONG_TO_LLONG(lsl, msl) (uint64_t)((uint64_t)(msl) << 32 | \
+        (uint32_t)(lsl))
+#define SHORT_TO_LONG(lsw, msw) (uint32_t)((uint32_t)msw << 16 | (uint16_t)lsw)
+#define CHAR_TO_SHORT(lsb, msb) (uint16_t)((uint16_t)msb << 8 | (uint8_t)lsb)
 #define CHAR_TO_LONG(lsb, b1, b2, msb) \
         (uint32_t)(SHORT_TO_LONG(CHAR_TO_SHORT(lsb, b1), \
         CHAR_TO_SHORT(b2, msb)))
 
 /* Little endian machine correction defines. */

@@ -1858,91 +2170,83 @@
     FABRIC_LOOP_ID(x) || BROADCAST_LOOP_ID(x))
 
 #define VALID_N_PORT_HDL(x)     (x <= LAST_N_PORT_HDL || \
         (x >= SNS_24XX_HDL && x <= BROADCAST_24XX_HDL))
 
-#define VALID_DEVICE_ID(ha, x)  (CFG_IST(ha, CFG_CTRL_24258081) ? \
+#define VALID_DEVICE_ID(ha, x)  (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ? \
         VALID_N_PORT_HDL(x) : VALID_LOOP_ID(x))
 
-#define VALID_TARGET_ID(ha, x)  (CFG_IST(ha, CFG_CTRL_24258081) ? \
+#define VALID_TARGET_ID(ha, x)  (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ? \
         (x <= LAST_N_PORT_HDL) : (LOCAL_LOOP_ID(x) || SNS_LOOP_ID(x)))
 
-#define RESERVED_LOOP_ID(ha, x) (CFG_IST(ha, CFG_CTRL_24258081) ? \
+#define RESERVED_LOOP_ID(ha, x) (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ? \
         (x > LAST_N_PORT_HDL && x <= FL_PORT_24XX_HDL) : \
         (x >= FL_PORT_LOOP_ID && x <= SIMPLE_NAME_SERVER_LOOP_ID))
 
-#define QL_LOOP_TRANSITION      (RESET_MARKER_NEEDED | RESET_ACTIVE | \
+#define QL_LOOP_TRANSITION      (MARKER_NEEDED | MARKER_ACTIVE | \
                                 ISP_ABORT_NEEDED | ABORT_ISP_ACTIVE | \
                                 LOOP_RESYNC_NEEDED | LOOP_RESYNC_ACTIVE | \
                                 COMMAND_WAIT_NEEDED | COMMAND_WAIT_ACTIVE)
 
-#define QL_SUSPENDED            (QL_LOOP_TRANSITION | LOOP_DOWN | DRIVER_STALL)
-
 #define LOOP_RECONFIGURE(ha)    (ha->task_daemon_flags & (QL_LOOP_TRANSITION | \
                                 DRIVER_STALL))
 
-#define DRIVER_SUSPENDED(ha)    (ha->task_daemon_flags & QL_SUSPENDED)
+#define DRIVER_SUSPENDED(ha)    (ha->task_daemon_flags & (LOOP_DOWN | \
+                                QL_LOOP_TRANSITION | DRIVER_STALL))
 
 #define LOOP_NOT_READY(ha)      (ha->task_daemon_flags & (QL_LOOP_TRANSITION | \
                                 LOOP_DOWN))
 
 #define LOOP_READY(ha)          (LOOP_NOT_READY(ha) == 0)
 
 #define QL_TASK_PENDING(ha)     ( \
     ha->task_daemon_flags & (QL_LOOP_TRANSITION | ABORT_QUEUES_NEEDED | \
-    PORT_RETRY_NEEDED) || ha->callback_queue.first != NULL)
+    PORT_RETRY_NEEDED) || ha->unsol_callback_queue.first != NULL)
 
 #define QL_DAEMON_NOT_ACTIVE(ha)        ( \
         !(ha->task_daemon_flags & TASK_DAEMON_ALIVE_FLG) || \
         ha->task_daemon_flags & (TASK_DAEMON_SLEEPING_FLG | \
         TASK_DAEMON_STOP_FLG))
 
-#define QL_DAEMON_SUSPENDED(ha) (\
-        (((ha)->cprinfo.cc_events & CALLB_CPR_START) ||\
-        ((ha)->flags & ADAPTER_SUSPENDED)))
+#define QL_ABORTED_SRB(ha)      ((ql_srb_t *)ha)
 
-#define INTERRUPT_PENDING(ha)   (CFG_IST(ha, CFG_CTRL_8021) ? \
+#define INTERRUPT_PENDING(ha)   (CFG_IST(ha, CFG_CTRL_82XX) ? \
                                 RD32_IO_REG(ha, nx_risc_int) & NX_RISC_INT : \
                                 RD16_IO_REG(ha, istatus) & RISC_INT)
-
-#define QL_MAX_FRAME_SIZE(ha) \
-            (uint16_t)(CFG_IST(ha, CFG_CTRL_24258081) ? CHAR_TO_SHORT( \
-            ha->init_ctrl_blk.cb24.max_frame_length[0], \
-            ha->init_ctrl_blk.cb24.max_frame_length[1]) : CHAR_TO_SHORT( \
-            ha->init_ctrl_blk.cb.max_frame_length[0], \
-            ha->init_ctrl_blk.cb.max_frame_length[1]))
-
 /*
  * Locking Macro Definitions
  */
 #define GLOBAL_STATE_LOCK()             mutex_enter(&ql_global_mutex)
 #define GLOBAL_STATE_UNLOCK()           mutex_exit(&ql_global_mutex)
 
+#define GLOBAL_TIMER_LOCK()             mutex_enter(&ql_global_timer_mutex)
+#define GLOBAL_TIMER_UNLOCK()           mutex_exit(&ql_global_timer_mutex)
+
 #define TRY_DEVICE_QUEUE_LOCK(q)        mutex_tryenter(&q->mutex)
 #define DEVICE_QUEUE_LOCK(q)            mutex_enter(&q->mutex)
 #define DEVICE_QUEUE_UNLOCK(q)          mutex_exit(&q->mutex)
 
 #define TRY_MBX_REGISTER_LOCK(ha)       mutex_tryenter(&ha->pha->mbx_mutex)
 #define MBX_REGISTER_LOCK_OWNER(ha)     mutex_owner(&ha->pha->mbx_mutex)
 #define MBX_REGISTER_LOCK(ha)           mutex_enter(&ha->pha->mbx_mutex)
 #define MBX_REGISTER_UNLOCK(ha)         mutex_exit(&ha->pha->mbx_mutex)
 
-#define INTR_LOCK(ha)                   mutex_enter(&ha->pha->intr_mutex)
-#define INTR_UNLOCK(ha)                 mutex_exit(&ha->pha->intr_mutex)
+#define INTR_LOCK(ha)                   ql_intr_lock(ha->pha)
+#define INTR_UNLOCK(ha)                 ql_intr_unlock(ha->pha)
 
+#define INDX_INTR_LOCK(ha, i)   mutex_enter(&ha->pha->rsp_queues[i]->intr_mutex)
+#define INDX_INTR_UNLOCK(ha, i) mutex_exit(&ha->pha->rsp_queues[i]->intr_mutex)
+
 #define TASK_DAEMON_LOCK(ha)            mutex_enter(&ha->pha->task_daemon_mutex)
 #define TASK_DAEMON_UNLOCK(ha)          mutex_exit(&ha->pha->task_daemon_mutex)
 
 #define REQUEST_RING_LOCK(ha)           mutex_enter(&ha->pha->req_ring_mutex)
 #define REQUEST_RING_UNLOCK(ha)         mutex_exit(&ha->pha->req_ring_mutex)
 
-#define CACHE_LOCK(ha)                  mutex_enter(&ha->pha->cache_mutex);
-#define CACHE_UNLOCK(ha)                mutex_exit(&ha->pha->cache_mutex);
+#define COMP_Q_LOCK(ha)                 mutex_enter(&ha->pha->comp_q_mutex)
+#define COMP_Q_UNLOCK(ha)               mutex_exit(&ha->pha->comp_q_mutex)
 
-#define PORTMANAGE_LOCK(ha)             mutex_enter(&ha->pha->portmutex);
-#define PORTMANAGE_UNLOCK(ha)           mutex_exit(&ha->pha->portmutex);
-
 #define ADAPTER_STATE_LOCK(ha)          mutex_enter(&ha->pha->mutex)
 #define ADAPTER_STATE_UNLOCK(ha)        mutex_exit(&ha->pha->mutex)
 
 #define QL_DUMP_LOCK(ha)                mutex_enter(&ha->pha->dump_mutex)
 #define QL_DUMP_UNLOCK(ha)              mutex_exit(&ha->pha->dump_mutex)

@@ -1954,13 +2258,10 @@
 #define QL_UB_UNLOCK(ha)                mutex_exit(&ha->pha->ub_mutex)
 
 #define GLOBAL_HW_LOCK()                mutex_enter(&ql_global_hw_mutex)
 #define GLOBAL_HW_UNLOCK()              mutex_exit(&ql_global_hw_mutex)
 
-#define NVRAM_CACHE_LOCK(ha)            mutex_enter(&ha->nvram_cache->mutex);
-#define NVRAM_CACHE_UNLOCK(ha)          mutex_exit(&ha->nvram_cache->mutex);
-
 /*
  * PCI power management control/status register location
  */
 #define QL_PM_CS_REG                    0x48
 

@@ -1994,12 +2295,10 @@
 #define QL_SAVE_CONFIG_REGS(dip)                ql_save_config_regs(dip)
 #define QL_RESTORE_CONFIG_REGS(dip)             ql_restore_config_regs(dip)
 
 #endif /* USE_DDI_INTERFACES */
 
-#define QL_IS_SET(x, y) (((x) & (y)) == (y))
-
 /*
  * QL local function return status codes
  */
 #define QL_SUCCESS                      0x4000
 #define QL_INVALID_COMMAND              0x4001

@@ -2151,10 +2450,15 @@
         struct prli_svc_pram_resp_page  svc_params;
 } prli_acc_resp_t;
 
 #define EL_TRACE_BUF_SIZE       8192
 
+#define QL_PORT_ID_MASK                 0xffffff
+
+#define QL_PLOGI_RETRY_CNT              (5)
+#define QL_PLOGI_RETRY_DLY_USEC         (10 * MILLISEC)
+
 /*
  * Global Data in ql_api.c source file.
  */
 extern void             *ql_state;              /* for soft state routine */
 extern uint32_t         ql_os_release_level;

@@ -2179,15 +2483,15 @@
 uint16_t ql_pci_config_get16(ql_adapter_state_t *, off_t);
 uint32_t ql_pci_config_get32(ql_adapter_state_t *, off_t);
 void ql_pci_config_put8(ql_adapter_state_t *, off_t, uint8_t);
 void ql_pci_config_put16(ql_adapter_state_t *, off_t, uint16_t);
 void ql_delay(ql_adapter_state_t *, clock_t);
-void ql_awaken_task_daemon(ql_adapter_state_t *, ql_srb_t *, uint32_t,
-    uint32_t);
+void ql_awaken_task_daemon(ql_adapter_state_t *, ql_srb_t *, uint64_t,
+    uint64_t);
 int ql_abort_device(ql_adapter_state_t *, ql_tgt_t *, int);
 int ql_binary_fw_dump(ql_adapter_state_t *, int);
-void ql_done(ql_link_t *);
+void ql_done(ql_link_t *, boolean_t);
 int ql_24xx_flash_id(ql_adapter_state_t *);
 int ql_24xx_load_flash(ql_adapter_state_t *, uint8_t *, uint32_t, uint32_t);
 int ql_poll_flash(ql_adapter_state_t *, uint32_t, uint8_t);
 void ql_flash_disable(ql_adapter_state_t *);
 void ql_flash_enable(ql_adapter_state_t *);

@@ -2195,10 +2499,11 @@
 void ql_write_flash_byte(ql_adapter_state_t *, uint32_t, uint8_t);
 uint8_t ql_read_flash_byte(ql_adapter_state_t *, uint32_t);
 int ql_24xx_read_flash(ql_adapter_state_t *, uint32_t, uint32_t *);
 int ql_24xx_write_flash(ql_adapter_state_t *, uint32_t, uint32_t);
 fc_unsol_buf_t *ql_get_unsolicited_buffer(ql_adapter_state_t *, uint32_t);
+int ql_dump_firmware(ql_adapter_state_t *);
 size_t ql_ascii_fw_dump(ql_adapter_state_t *, caddr_t);
 void ql_add_link_b(ql_head_t *, ql_link_t *);
 void ql_add_link_t(ql_head_t *, ql_link_t *);
 void ql_remove_link(ql_head_t *, ql_link_t *);
 void ql_next(ql_adapter_state_t *, ql_lun_t *);

@@ -2214,14 +2519,14 @@
 int ql_stall_driver(ql_adapter_state_t *, uint32_t);
 void ql_restart_driver(ql_adapter_state_t *);
 int ql_load_flash(ql_adapter_state_t *, uint8_t *, uint32_t);
 int ql_get_dma_mem(ql_adapter_state_t *, dma_mem_t *, uint32_t,
     mem_alloc_type_t, mem_alignment_t);
+void ql_free_dma_resource(ql_adapter_state_t *, dma_mem_t *);
 int ql_alloc_phys(ql_adapter_state_t *, dma_mem_t *, int);
 void ql_free_phys(ql_adapter_state_t *, dma_mem_t *);
 void ql_24xx_protect_flash(ql_adapter_state_t *);
-void ql_free_dma_resource(ql_adapter_state_t *, dma_mem_t *);
 uint8_t ql_pci_config_get8(ql_adapter_state_t *, off_t);
 void ql_pci_config_put32(ql_adapter_state_t *, off_t, uint32_t);
 int ql_24xx_unprotect_flash(ql_adapter_state_t *);
 char *els_cmd_text(int);
 char *mbx_cmd_text(int);

@@ -2230,16 +2535,31 @@
 void ql_port_state(ql_adapter_state_t *, uint32_t, uint32_t);
 void ql_isp_els_handle_cmd_endian(ql_adapter_state_t *ha, ql_srb_t *srb);
 void ql_isp_els_handle_rsp_endian(ql_adapter_state_t *ha, ql_srb_t *srb);
 void ql_isp_els_handle_endian(ql_adapter_state_t *ha, uint8_t *ptr,
     uint8_t ls_code);
-int ql_el_trace_desc_ctor(ql_adapter_state_t *);
-int ql_el_trace_desc_dtor(ql_adapter_state_t *);
+void ql_el_trace_alloc(ql_adapter_state_t *);
+void ql_el_trace_dealloc(ql_adapter_state_t *);
 int ql_nvram_cache_desc_ctor(ql_adapter_state_t *);
 int ql_nvram_cache_desc_dtor(ql_adapter_state_t *);
+int ql_plogi_params_desc_ctor(ql_adapter_state_t *);
+int ql_plogi_params_desc_dtor(ql_adapter_state_t *);
 int ql_wwn_cmp(ql_adapter_state_t *, la_wwn_t *, la_wwn_t *);
 void ql_dev_free(ql_adapter_state_t *, ql_tgt_t *);
+void ql_restart_queues(ql_adapter_state_t *);
+void ql_abort_queues(ql_adapter_state_t *);
+void ql_requeue_pending_cmds(ql_adapter_state_t *, ql_tgt_t *);
+void ql_toggle_loop_state(ql_adapter_state_t *);
+void ql_els_24xx_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
+    void *);
+int ql_get_cap_ofst(ql_adapter_state_t *, uint8_t);
+void ql_intr_lock(ql_adapter_state_t *);
+void ql_intr_unlock(ql_adapter_state_t *);
+void ql_io_comp(ql_srb_t *sp);
+uint64_t ql_get_lun_addr(ql_tgt_t *, uint16_t);
+int ql_2700_get_flash_dmp_template(ql_adapter_state_t *);
+int ql_2700_get_module_dmp_template(ql_adapter_state_t *);
 
 #ifdef  __cplusplus
 }
 #endif