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,30 ****
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
  
! /* Copyright 2010 QLogic Corporation */
  
  /*
!  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
   */
  
  #ifndef _QL_API_H
  #define _QL_API_H
  
--- 17,30 ----
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
  
! /* Copyright 2015 QLogic Corporation */
  
  /*
!  * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
   */
  
  #ifndef _QL_API_H
  #define _QL_API_H
  
*** 32,42 ****
   * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver header file.
   *
   * ***********************************************************************
   * *                                                                    **
   * *                            NOTICE                                  **
!  * *            COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION              **
   * *                    ALL RIGHTS RESERVED                             **
   * *                                                                    **
   * ***********************************************************************
   *
   */
--- 32,42 ----
   * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver header file.
   *
   * ***********************************************************************
   * *                                                                    **
   * *                            NOTICE                                  **
!  * *            COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION              **
   * *                    ALL RIGHTS RESERVED                             **
   * *                                                                    **
   * ***********************************************************************
   *
   */
*** 50,61 ****
--- 50,70 ----
  #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,83 ****
--- 83,107 ----
  #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,101 ****
--- 116,128 ----
  #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,144 ****
  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
--- 149,161 ----
*** 151,160 ****
--- 168,183 ----
  #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,196 ****
--- 210,251 ----
  #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,271 ****
--- 317,356 ----
  #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,327 ****
--- 403,416 ----
   */
  #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,358 ****
  /* 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)
  
  /* 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
--- 435,447 ----
  /* 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_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,373 ****
  #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
--- 452,461 ----
*** 378,406 ****
  #define RCVBUF_CONTAINER_CNT    64      /* Rcv buffer containers (8-1024) */
  
  /*
   * ISP request, response, mailbox and receive buffer queue sizes
   */
  #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
--- 466,486 ----
  #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 RCVBUF_CONTAINER_SIZE   12
  #define RCVBUF_QUEUE_SIZE       (RCVBUF_CONTAINER_SIZE * RCVBUF_CONTAINER_CNT)
  
  /*
   * 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,498 ****
--- 569,588 ----
          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,562 ****
--- 643,654 ----
   */
  #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,617 ****
--- 661,757 ----
  #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,654 ****
  #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 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
--- 784,794 ----
  #define ROM_MBX_ERR             0x02
  #define MBX_SUCCESS             0x10
  #define MBX_ERR                 0x11
  #define ASYNC_EVENT             0x12
  #define RESP_UPDATE             0x13
! #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,1056 ****
  
  /*
   * f/w module table
   */
  struct fw_table {
!         uint16_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
  } mem_alloc_type_t;
  
  /*
   * DMA memory alignment type.
   */
--- 1161,1184 ----
  
  /*
   * f/w module table
   */
  struct fw_table {
!         uint32_t        fw_class;
          int8_t          *fw_version;
  };
  
  /*
   * DMA memory type.
   */
  typedef enum mem_alloc_type {
          UNKNOWN_MEMORY,
          TASK_MEMORY,
          LITTLE_ENDIAN_DMA,
          BIG_ENDIAN_DMA,
          KERNEL_MEM,
!         NO_SWAP_DMA
  } mem_alloc_type_t;
  
  /*
   * DMA memory alignment type.
   */
*** 1067,1089 ****
          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                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];
--- 1195,1213 ----
          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;
  
  /*
   * 24 bit port ID type definition.
   */
  typedef union {
          struct {
                  uint8_t d_id[3];
*** 1125,1134 ****
--- 1249,1293 ----
          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,1203 ****
          /* Command state/status flags. */
          volatile uint32_t       flags;
  
          /* Command IOCB context. */
          void                    (*iocb)(struct ql_adapter_state *,
!             struct ql_srb *, void *);
          struct cmd_entry        *request_ring_ptr;
          uint32_t                handle;
          uint16_t                req_cnt;
          uint8_t                 retry_count;
          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_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.
--- 1321,1368 ----
          /* Command state/status flags. */
          volatile uint32_t       flags;
  
          /* Command IOCB context. */
          void                    (*iocb)(struct ql_adapter_state *,
!             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_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 */
  
  /*
   * 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,1256 ****
          uint32_t                flags;
  
          /* LUN execution throttle. */
          uint16_t                lun_outcnt;
  
          uint16_t                lun_no;
  
          ql_link_t               link;
  } ql_lun_t;
  
  /*
   * LUN Queue flags
   */
  #define LQF_UNTAGGED_PENDING    BIT_0
  
  /*
   * 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;
--- 1392,1435 ----
          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;
  
          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,1334 ****
--- 1486,1519 ----
  #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,1392 ****
  /* DUMP state flags. */
  #define QL_DUMPING              BIT_0
  #define QL_DUMP_VALID           BIT_1
  #define QL_DUMP_UPLOADED        BIT_2
  
  typedef struct el_trace_desc {
          kmutex_t        mutex;
!         uint16_t        next;
!         uint32_t        trace_buffer_size;
!         char            *trace_buffer;
! } el_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;
  
  /*
   * ql attach progress indication
   */
  #define QL_SOFT_STATE_ALLOCED           BIT_0
  #define QL_REGS_MAPPED                  BIT_1
  #define QL_HBA_BUFFER_SETUP             BIT_2
--- 1550,1598 ----
  /* 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;
!         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 {
          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,1408 ****
--- 1605,1618 ----
  #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,1498 ****
          uint32_t        tgt_status_reg;
          uint32_t        tgt_mask_reg;
          uint32_t        pci_int_reg;
  };
  
  /*
   * Adapter state structure.
   */
  typedef struct ql_adapter_state {
          ql_link_t               hba;
  
          kmutex_t                mutex;
!         volatile uint32_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;
          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;
          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;
  
          /* 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;
          volatile uint8_t        intr_claimed;
  
!         /*
!          * 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. */
          ql_head_t               pending_cmds;
          ql_srb_t                **outstanding_cmds;
          uint16_t                osc_index;
  
          /* 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;
  
          /* 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;
--- 1619,1727 ----
          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 uint64_t       flags;                  /* State flags. */
          uint32_t                state;
          port_id_t               d_id;
          uint16_t                loop_id;
          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;
  
          /* Task Daemon context. */
!         ql_head_t               unsol_callback_queue;
!         ddi_taskq_t             *driver_thread_taskq;
          kmutex_t                task_daemon_mutex;
          kcondvar_t              cv_task_daemon;
!         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. */
!         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;
  
!         /* 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. */
!         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;
          struct mbx_cmd          *mcp;
          kcondvar_t              cv_mbx_wait;
          kcondvar_t              cv_mbx_intr;
          volatile uint8_t        mailbox_flags;
  
          /* Unsolicited buffer data. */
          uint16_t                ub_outcnt;
          uint8_t                 ub_seq_id;
          uint8_t                 ub_command_count;
          uint8_t                 ub_notify_count;
*** 1506,1522 ****
  
          /* Kernel statistics. */
          kstat_t                 *k_stats;
          ql_adapter_stat_t       *adapter_stats;
  
!         /* Solaris adapter configuration data */
!         ddi_acc_handle_t        dev_handle;
          ddi_acc_handle_t        pci_handle;     /* config space */
          ddi_acc_handle_t        iomap_dev_handle;
          caddr_t                 iomap_iobase;
          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;
--- 1735,1764 ----
  
          /* Kernel statistics. */
          kstat_t                 *k_stats;
          ql_adapter_stat_t       *adapter_stats;
  
!         /* 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;
          fc_fca_tran_t           *tran;
          uint32_t                instance;
          int8_t                  *devpath;
          uint32_t                fru_hba_index;
          uint32_t                fru_port_index;
*** 1527,1579 ****
          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_ext_memory_size;
          uint32_t                parity_pause_errors;
          boolean_t               log_parity_pause;
          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 *);
          void                    (*ip_cmd)(struct ql_adapter_state *,
!                                     ql_srb_t *, void *);
          void                    (*ms_cmd)(struct ql_adapter_state *,
!                                     ql_srb_t *, void *);
          uint8_t                 cmd_segs;
          uint8_t                 cmd_cont_segs;
  
          /* NVRAM configuration data */
!         uint32_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                execution_throttle;
          uint16_t                port_down_retry_count;
          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;
          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;
--- 1769,1832 ----
          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;
!         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_request_q_t *, ql_srb_t *, void *);
          void                    (*ip_cmd)(struct ql_adapter_state *,
!                                 ql_request_q_t *, ql_srb_t *, void *);
          void                    (*ms_cmd)(struct ql_adapter_state *,
!                                 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 */
!         uint64_t                cfg_flags;
          ql_comb_init_cb_t       init_ctrl_blk;
          ql_comb_ip_init_cb_t    ip_init_ctrl_blk;
          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;
          uint8_t                 loop_reset_delay;
  
          /* Power management context. */
          kmutex_t                pm_mutex;
!         uint32_t                pm_busy;
          uint8_t                 power_level;
          uint8_t                 pm_capable;
          uint8_t                 config_saved;
          uint8_t                 lip_on_panic;
  
          /* sbus card data */
          caddr_t                 sbus_fpga_iobase;
          ddi_acc_handle_t        sbus_fpga_dev_handle;
          ddi_acc_handle_t        sbus_config_handle;
*** 1580,1608 ****
          caddr_t                 sbus_config_base;
  
          /* XIOCTL context pointer. */
          struct ql_xioctl        *xioctl;
  
-         kmutex_t                cache_mutex;
          struct ql_fcache        *fcache;
          int8_t                  *vcache;
  
-         /* 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;
--- 1833,1846 ----
          caddr_t                 sbus_config_base;
  
          /* XIOCTL context pointer. */
          struct ql_xioctl        *xioctl;
  
          struct ql_fcache        *fcache;
          int8_t                  *vcache;
+         nvram_cache_desc_t      *nvram_cache;
  
          /* f/w dump mutex */
          uint32_t                ql_dump_size;
          uint32_t                ql_dump_state;
          void                    *ql_dump_ptr;
          kmutex_t                dump_mutex;
*** 1609,1641 ****
  
          uint8_t                 fwwait;
  
          dma_mem_t               fwexttracebuf;          /* extended trace  */
          dma_mem_t               fwfcetracebuf;          /* event trace */
          uint32_t                fwfcetraceopt;
          uint32_t                flash_errlog_start;     /* 32bit word addr */
          uint32_t                flash_errlog_ptr;       /* 32bit word addr */
          uint8_t                 send_plogi_timer;
  
          /* Virtual port context. */
          fca_port_attrs_t        *pi_attrs;
          struct ql_adapter_state *pha;
          struct ql_adapter_state *vp_next;
          uint8_t                 vp_index;
  
          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;
  
          uint32_t                flash_data_addr;
          uint32_t                flash_fw_addr;
          uint32_t                flash_golden_fw_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;
--- 1847,1883 ----
  
          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;
  
!         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,1743 ****
          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;
          uint16_t                iidma_rate;
          uint8_t                 function_number;
          uint8_t                 timeout_cnt;
  } 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
  
  /*
   * 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
  
  /*
   * Mailbox flags
   */
  #define MBX_WANT_FLG                            BIT_0
  #define MBX_BUSY_FLG                            BIT_1
--- 1885,2024 ----
          uint8_t                 phy_fw_subminor_version;
          uint8_t                 mpi_fw_major_version;
          uint8_t                 mpi_fw_minor_version;
          uint8_t                 mpi_fw_subminor_version;
  
          uint16_t                idc_mb[8];
          uint8_t                 idc_restart_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;
  
          /* NetXen context */
          ddi_acc_handle_t        db_dev_handle;
          caddr_t                 db_iobase;
          caddr_t                 nx_pcibase;     /* BAR0 base I/O address */
          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                       (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            (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,1797 ****
  #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_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_IST(ha, cfgflags)   (ha->cfg_flags & cfgflags)
  
  /*
   * Interrupt configuration flags
   */
  #define IFLG_INTR_LEGACY                        BIT_0
  #define IFLG_INTR_FIXED                         BIT_1
--- 2026,2107 ----
  #define MBX_ABORT                               BIT_3
  
  /*
   * Configuration flags
   */
! #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_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_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,1819 ****
  #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 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. */
--- 2118,2131 ----
  #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 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,1948 ****
      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) ? \
          VALID_N_PORT_HDL(x) : VALID_LOOP_ID(x))
  
! #define VALID_TARGET_ID(ha, x)  (CFG_IST(ha, CFG_CTRL_24258081) ? \
          (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) ? \
          (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 | \
                                  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 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)
  
  #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 INTERRUPT_PENDING(ha)   (CFG_IST(ha, CFG_CTRL_8021) ? \
                                  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 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 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 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)
--- 2170,2252 ----
      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_ISP_FW_TYPE_2) ? \
          VALID_N_PORT_HDL(x) : VALID_LOOP_ID(x))
  
! #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_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      (MARKER_NEEDED | MARKER_ACTIVE | \
                                  ISP_ABORT_NEEDED | ABORT_ISP_ACTIVE | \
                                  LOOP_RESYNC_NEEDED | LOOP_RESYNC_ACTIVE | \
                                  COMMAND_WAIT_NEEDED | COMMAND_WAIT_ACTIVE)
  
  #define LOOP_RECONFIGURE(ha)    (ha->task_daemon_flags & (QL_LOOP_TRANSITION | \
                                  DRIVER_STALL))
  
! #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->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_ABORTED_SRB(ha)      ((ql_srb_t *)ha)
  
! #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)
  /*
   * 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)                   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 COMP_Q_LOCK(ha)                 mutex_enter(&ha->pha->comp_q_mutex)
! #define COMP_Q_UNLOCK(ha)               mutex_exit(&ha->pha->comp_q_mutex)
  
  #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,1966 ****
  #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
  
--- 2258,2267 ----
*** 1994,2005 ****
  #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
--- 2295,2304 ----
*** 2151,2160 ****
--- 2450,2464 ----
          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,2193 ****
  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);
  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 *);
  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 *);
--- 2483,2497 ----
  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 *, 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 *, 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,2204 ****
--- 2499,2509 ----
  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,2227 ****
  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);
  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);
--- 2519,2532 ----
  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 *);
  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,2245 ****
  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 *);
  int ql_nvram_cache_desc_ctor(ql_adapter_state_t *);
  int ql_nvram_cache_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 *);
  
  #ifdef  __cplusplus
  }
  #endif
  
--- 2535,2565 ----
  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);
! 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