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>
        
*** 17,31 ****
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
  
! /* Copyright 2009 QLogic Corporation */
  
  /*
!  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
!  * Use is subject to license terms.
   */
  
  #ifndef _QL_INIT_H
  #define _QL_INIT_H
  
--- 17,30 ----
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
  
! /* Copyright 2015 QLogic Corporation */
  
  /*
!  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
   */
  
  #ifndef _QL_INIT_H
  #define _QL_INIT_H
  
*** 33,43 ****
   * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver header file.
   *
   * ***********************************************************************
   * *                                                                    **
   * *                            NOTICE                                  **
!  * *            COPYRIGHT (C) 1996-2009 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                             **
   * *                                                                    **
   * ***********************************************************************
   *
   */
*** 44,53 ****
--- 43,54 ----
  
  #ifdef  __cplusplus
  extern "C" {
  #endif
  
+ extern  uint32_t ql_task_cb_dly;
+ 
  /*
   * ISP2200 NVRAM structure definition.
   * Little endian except where noted.
   */
  typedef struct nvram {
*** 515,526 ****
           * BIT 3-7 = Reserved
           */
          uint8_t oem_specific;
          uint8_t reserved_4[15];
  
!         /* Offset 112 (70h). */
!         uint8_t reserved_5[16];
  
          /*
           * Offset 128 (80h).
           * PCIe table entries.
           * Firmware Extended Initialization Control Block.
--- 516,533 ----
           * BIT 3-7 = Reserved
           */
          uint8_t oem_specific;
          uint8_t reserved_4[15];
  
!         /*
!          * Offset 112 (70h).
!          * BIT 0   = additional receive credits
!          * BIT 1   = additional receive credits
!          * BIT 2-15 = Reserved
!          */
!         uint8_t execute_fw_options[2];
!         uint8_t reserved_5[14];
  
          /*
           * Offset 128 (80h).
           * PCIe table entries.
           * Firmware Extended Initialization Control Block.
*** 707,721 ****
  } nvram_24xx_t;
  
  /*
   * Firmware Dump structure definition
   */
! #define QL_2200_FW_DUMP_SIZE    0x68000         /* bytes */
! #define QL_2300_FW_DUMP_SIZE    0xE2000         /* bytes */
! #define QL_6322_FW_DUMP_SIZE    0xE2000         /* bytes */
! #define QL_24XX_FW_DUMP_SIZE    0x0330000       /* bytes */
! #define QL_25XX_FW_DUMP_SIZE    0x0330000       /* bytes */
  
  #define QL_24XX_VPD_SIZE        0x200           /* bytes */
  #define QL_24XX_SFP_SIZE        0x200           /* bytes */
  
  /*
--- 714,731 ----
  } nvram_24xx_t;
  
  /*
   * Firmware Dump structure definition
   */
! #define QL_2200_FW_DUMP_SIZE    0x100000        /* 86e15 bytes */
! #define QL_2300_FW_DUMP_SIZE    0x100000        /* fc6d3 bytes */
! #define QL_6322_FW_DUMP_SIZE    0x100000        /* fc6d8 bytes */
! #define QL_24XX_FW_DUMP_SIZE    0x300000        /* 2cef71 bytes */
! #define QL_25XX_FW_DUMP_SIZE    0x400000        /* 356c97 bytes */
! #define QL_81XX_FW_DUMP_SIZE    0x400000        /* 356c97 bytes */
! #define QL_27XX_FW_DUMP_SIZE    0x600000        /* 5c3e69 bytes */
! #define QL_83XX_FW_DUMP_SIZE    0x400000        /* 372792 bytes */
  
  #define QL_24XX_VPD_SIZE        0x200           /* bytes */
  #define QL_24XX_SFP_SIZE        0x200           /* bytes */
  
  /*
*** 783,793 ****
--- 793,805 ----
          uint32_t fce_trace_buf[FWFCESIZE / 4];
          uint32_t ext_mem[1];
  } ql_24xx_fw_dump_t;
  
  typedef struct ql_25xx_fw_dump {
+         uint32_t hccr;
          uint32_t r2h_status;
+         uint32_t aer_ues;
          uint32_t hostrisc_reg[32];
          uint32_t pcie_reg[4];
          uint32_t host_reg[32];
          uint16_t mailbox_reg[32];
          uint32_t xseq_gp_reg[128];
*** 818,836 ****
          uint32_t risc_io;
          uint32_t lmc_reg[128];
          uint32_t fpm_hdw_reg[192];
          uint32_t fb_hdw_reg[192];
          uint32_t code_ram[0x2000];
-         uint32_t req_q[REQUEST_QUEUE_SIZE / 4];
-         uint32_t rsp_q[RESPONSE_QUEUE_SIZE / 4];
          uint32_t ext_trace_buf[FWEXTSIZE / 4];
          uint32_t fce_trace_buf[FWFCESIZE / 4];
!         uint32_t ext_mem[1];
  } ql_25xx_fw_dump_t;
  
  typedef struct ql_81xx_fw_dump {
          uint32_t r2h_status;
          uint32_t hostrisc_reg[32];
          uint32_t pcie_reg[4];
          uint32_t host_reg[32];
          uint16_t mailbox_reg[32];
          uint32_t xseq_gp_reg[128];
--- 830,850 ----
          uint32_t risc_io;
          uint32_t lmc_reg[128];
          uint32_t fpm_hdw_reg[192];
          uint32_t fb_hdw_reg[192];
          uint32_t code_ram[0x2000];
          uint32_t ext_trace_buf[FWEXTSIZE / 4];
          uint32_t fce_trace_buf[FWFCESIZE / 4];
!         uint32_t req_q_size[2];
!         uint32_t rsp_q_size;
!         uint32_t req_rsp_ext_mem[1];
  } ql_25xx_fw_dump_t;
  
  typedef struct ql_81xx_fw_dump {
+         uint32_t hccr;
          uint32_t r2h_status;
+         uint32_t aer_ues;
          uint32_t hostrisc_reg[32];
          uint32_t pcie_reg[4];
          uint32_t host_reg[32];
          uint16_t mailbox_reg[32];
          uint32_t xseq_gp_reg[128];
*** 861,880 ****
          uint32_t risc_io;
          uint32_t lmc_reg[128];
          uint32_t fpm_hdw_reg[224];
          uint32_t fb_hdw_reg[208];
          uint32_t code_ram[0x2000];
-         uint32_t req_q[REQUEST_QUEUE_SIZE / 4];
-         uint32_t rsp_q[RESPONSE_QUEUE_SIZE / 4];
          uint32_t ext_trace_buf[FWEXTSIZE / 4];
          uint32_t fce_trace_buf[FWFCESIZE / 4];
!         uint32_t ext_mem[1];
  } ql_81xx_fw_dump_t;
  
  #ifdef _KERNEL
  
  /*
   * ql_lock_nvram() flags
   */
  #define LNF_NVRAM_DATA  BIT_0           /* get nvram */
  #define LNF_VPD_DATA    BIT_1           /* get vpd data (24xx only) */
  
--- 875,1213 ----
          uint32_t risc_io;
          uint32_t lmc_reg[128];
          uint32_t fpm_hdw_reg[224];
          uint32_t fb_hdw_reg[208];
          uint32_t code_ram[0x2000];
          uint32_t ext_trace_buf[FWEXTSIZE / 4];
          uint32_t fce_trace_buf[FWFCESIZE / 4];
!         uint32_t req_q_size[2];
!         uint32_t rsp_q_size;
!         uint32_t req_rsp_ext_mem[1];
  } ql_81xx_fw_dump_t;
  
+ typedef struct ql_83xx_fw_dump {
+         uint32_t        hccr;
+         uint32_t        r2h_status;
+         uint32_t        aer_ues;
+         uint32_t        hostrisc_reg[48];
+         uint32_t        pcie_reg[4];
+         uint32_t        host_reg[32];
+         uint16_t        mailbox_reg[32];
+         uint32_t        xseq_gp_reg[256];
+         uint32_t        xseq_0_reg[48];
+         uint32_t        xseq_1_reg[16];
+         uint32_t        xseq_2_reg[16];
+         uint32_t        rseq_gp_reg[256];
+         uint32_t        rseq_0_reg[32];
+         uint32_t        rseq_1_reg[16];
+         uint32_t        rseq_2_reg[16];
+         uint32_t        rseq_3_reg[16];
+         uint32_t        aseq_gp_reg[256];
+         uint32_t        aseq_0_reg[32];
+         uint32_t        aseq_1_reg[16];
+         uint32_t        aseq_2_reg[16];
+         uint32_t        aseq_3_reg[16];
+         uint32_t        cmd_dma_reg[64];
+         uint32_t        req0_dma_reg[15];
+         uint32_t        resp0_dma_reg[15];
+         uint32_t        req1_dma_reg[15];
+         uint32_t        xmt0_dma_reg[32];
+         uint32_t        xmt1_dma_reg[32];
+         uint32_t        xmt2_dma_reg[32];
+         uint32_t        xmt3_dma_reg[32];
+         uint32_t        xmt4_dma_reg[32];
+         uint32_t        xmt_data_dma_reg[16];
+         uint32_t        rcvt0_data_dma_reg[32];
+         uint32_t        rcvt1_data_dma_reg[32];
+         uint32_t        risc_gp_reg[128];
+         uint32_t        shadow_reg[11];
+         uint32_t        risc_io;
+         uint32_t        lmc_reg[128];
+         uint32_t        fpm_hdw_reg[256];
+         uint32_t        rq0_array_reg[256];
+         uint32_t        rq1_array_reg[256];
+         uint32_t        rp0_array_reg[256];
+         uint32_t        rp1_array_reg[256];
+         uint32_t        ato_array_reg[128];
+         uint32_t        queue_control_reg[16];
+         uint32_t        fb_hdw_reg[432];
+         uint32_t        code_ram[0x2400];
+         uint32_t        ext_trace_buf[FWEXTSIZE / 4];
+         uint32_t        fce_trace_buf[FWFCESIZE / 4];
+         uint32_t        req_q_size[2];
+         uint32_t        rsp_q_size;
+         uint32_t        req_rsp_ext_mem[1];
+ } ql_83xx_fw_dump_t;
+ 
  #ifdef _KERNEL
  
  /*
+  * firmware dump Entry Types
+  */
+ #define DT_NOP           0
+ #define DT_THDR         99
+ #define DT_TEND         255
+ #define DT_RIOB1        256
+ #define DT_WIOB1        257
+ #define DT_RIOB2        258
+ #define DT_WIOB2        259
+ #define DT_RPCI         260
+ #define DT_WPCI         261
+ #define DT_RRAM         262
+ #define DT_GQUE         263
+ #define DT_GFCE         264
+ #define DT_PRISC        265
+ #define DT_RRISC        266
+ #define DT_DINT         267
+ #define DT_GHBD         268
+ #define DT_SCRA         269
+ #define DT_RRREG        270
+ #define DT_WRREG        271
+ #define DT_RRRAM        272
+ #define DT_RPCIC        273
+ #define DT_GQUES        274
+ #define DT_WDMP         275
+ 
+ /*
+  * firmware dump Template Header (Entry Type 99)
+  */
+ typedef struct ql_dt_hdr {
+         uint32_t        type;
+         uint32_t        first_entry_offset;
+         uint32_t        size_of_template;
+         uint32_t        rsv;
+         uint32_t        num_of_entries;
+         uint32_t        version;
+         uint32_t        driver_timestamp;
+         uint32_t        checksum;
+         uint32_t        rsv_1;
+         uint32_t        driver_info[3];
+         uint32_t        saved_state_area[16];
+         uint32_t        rsv_2[8];
+         uint32_t        ver_attr[5];
+ } ql_dt_hdr_t;
+ 
+ /*
+  * firmware dump Common Entry Header
+  */
+ typedef struct ql_dt_entry_hdr {
+         uint32_t        type;
+         uint32_t        size;
+         uint32_t        rsv;
+ #ifdef _BIG_ENDIAN
+         uint8_t         driver_flags;
+         uint8_t         rsv_2;
+         uint8_t         rsv_1;
+         uint8_t         capture_flags;
+ #else
+         uint8_t         capture_flags;
+         uint8_t         rsv_1;
+         uint8_t         rsv_2;
+         uint8_t         driver_flags;
+ #endif
+ } ql_dt_entry_hdr_t;
+ 
+ /*
+  * Capture Flags
+  */
+ #define PF_ONLY_FLAG    BIT_0   /* Physical Function Only */
+ #define PF_VF_FLAG      BIT_1   /* Physical and Virtual Functions */
+ 
+ /*
+  * Driver Flags
+  */
+ #define SKIPPED_FLAG    BIT_7   /* driver skipped this entry  */
+ 
+ /*
+  * firmware dump Entry Including Header
+  */
+ typedef struct ql_dt_entry {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                data[1];
+ } ql_dt_entry_t;
+ 
+ /*
+  * firmware dump Template image
+  */
+ typedef struct ql_dmp_template {
+         uint32_t        rsv[2];
+         uint32_t        len;
+         uint32_t        major_ver;
+         uint32_t        minor_ver;
+         uint32_t        subminor_ver;
+         uint32_t        attribute;
+         ql_dt_hdr_t     hdr;
+         ql_dt_entry_t   entries[1];
+ } ql_dmp_template_t;
+ 
+ typedef struct ql_dt_riob1 {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                addr;
+ #ifdef _BIG_ENDIAN
+         uint8_t                 pci_offset;
+         uint8_t                 reg_count_h;
+         uint8_t                 reg_count_l;
+         uint8_t                 reg_size;
+ #else
+         uint8_t                 reg_size;
+         uint8_t                 reg_count_l;
+         uint8_t                 reg_count_h;
+         uint8_t                 pci_offset;
+ #endif
+ } ql_dt_riob1_t;
+ 
+ typedef struct ql_dt_wiob1 {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                addr;
+         uint32_t                data;
+ #ifdef _BIG_ENDIAN
+         uint8_t                 rsv[3];
+         uint8_t                 pci_offset;
+ #else
+         uint8_t                 pci_offset;
+         uint8_t                 rsv[3];
+ #endif
+ } ql_dt_wiob1_t;
+ 
+ typedef struct ql_dt_riob2 {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                addr;
+ #ifdef _BIG_ENDIAN
+         uint8_t                 pci_offset;
+         uint8_t                 reg_count_h;
+         uint8_t                 reg_count_l;
+         uint8_t                 reg_size;
+         uint8_t                 rsv[3];
+         uint8_t                 bank_sel_offset;
+ #else
+         uint8_t                 reg_size;
+         uint8_t                 reg_count_l;
+         uint8_t                 reg_count_h;
+         uint8_t                 pci_offset;
+         uint8_t                 bank_sel_offset;
+         uint8_t                 rsv[3];
+ #endif
+         uint32_t                reg_bank;
+ } ql_dt_riob2_t;
+ 
+ typedef struct ql_dt_wiob2 {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                addr;
+ #ifdef _BIG_ENDIAN
+         uint8_t                 rsv[2];
+         uint8_t                 data_h;
+         uint8_t                 data_l;
+         uint8_t                 bank_sel_offset;
+         uint8_t                 pci_offset;
+         uint8_t                 rsv1[2];
+ #else
+         uint8_t                 data_l;
+         uint8_t                 data_h;
+         uint8_t                 rsv[2];
+         uint8_t                 rsv1[2];
+         uint8_t                 pci_offset;
+         uint8_t                 bank_sel_offset;
+ #endif
+         uint32_t                reg_bank;
+ } ql_dt_wiob2_t;
+ 
+ typedef struct ql_dt_rpci {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                addr;
+ } ql_dt_rpci_t;
+ 
+ typedef struct ql_dt_wpci {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                addr;
+         uint32_t                data;
+ } ql_dt_wpci_t, ql_dt_wrreg_t;
+ 
+ typedef struct ql_dt_rram {
+         ql_dt_entry_hdr_t       h;
+ #ifdef _BIG_ENDIAN
+         uint8_t                 rsv[3];
+         uint8_t                 ram_area;
+ #else
+         uint8_t                 ram_area;
+         uint8_t                 rsv[3];
+ #endif
+         uint32_t                start_addr;
+         uint32_t                end_addr;
+ } ql_dt_rram_t;
+ 
+ typedef struct ql_dt_gque {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                num_queues;
+ #ifdef _BIG_ENDIAN
+         uint8_t                 rsv[3];
+         uint8_t                 queue_type;
+ #else
+         uint8_t                 queue_type;
+         uint8_t                 rsv[3];
+ #endif
+ } ql_dt_gque_t, ql_dt_gques_t;
+ 
+ typedef struct ql_dt_gfce {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                fce_trace_size;
+         uint32_t                write_pointer[2];
+         uint32_t                base_pointer[2];
+         uint32_t                fce_enable_mb0;
+         uint32_t                fce_enable_mb2;
+         uint32_t                fce_enable_mb3;
+         uint32_t                fce_enable_mb4;
+         uint32_t                fce_enable_mb5;
+         uint32_t                fce_enable_mb6;
+ } ql_dt_gfce_t;
+ 
+ typedef struct ql_dt_prisc {
+         ql_dt_entry_hdr_t       h;
+ } ql_dt_prisc_t, ql_dt_rrisc_t;
+ 
+ typedef struct ql_dt_dint {
+         ql_dt_entry_hdr_t       h;
+ #ifdef _BIG_ENDIAN
+         uint8_t                 rsv[3];
+         uint8_t                 pci_offset;
+ #else
+         uint8_t                 pci_offset;
+         uint8_t                 rsv[3];
+ #endif
+         uint32_t                data;
+ } ql_dt_dint_t;
+ 
+ typedef struct ql_dt_ghbd {
+         ql_dt_entry_hdr_t       h;
+ #ifdef _BIG_ENDIAN
+         uint8_t                 rsv[3];
+         uint8_t                 host_buf_type;
+ #else
+         uint8_t                 host_buf_type;
+         uint8_t                 rsv[3];
+ #endif
+         uint32_t                buf_size;
+         uint32_t                start_addr;
+ } ql_dt_ghbd_t;
+ 
+ typedef struct ql_dt_scra {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                scratch_size;
+ } ql_dt_scra_t;
+ 
+ typedef struct ql_dt_rrreg {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                addr;
+         uint32_t                count;
+ } ql_dt_rrreg_t, ql_dt_rrram_t, ql_dt_rpcic_t;
+ 
+ typedef struct ql_dt_wdmp {
+         ql_dt_entry_hdr_t       h;
+         uint32_t                length;
+         uint32_t                data[1];
+ } ql_dt_wdmp_t;
+ 
+ /*
   * ql_lock_nvram() flags
   */
  #define LNF_NVRAM_DATA  BIT_0           /* get nvram */
  #define LNF_VPD_DATA    BIT_1           /* get vpd data (24xx only) */
  
*** 888,901 ****
  
  /*
   * NVRAM Command values.
   */
  #define NV_START_BIT    BIT_2
! #define NV_WRITE_OP     (BIT_26+BIT_24)
! #define NV_READ_OP      (BIT_26+BIT_25)
! #define NV_ERASE_OP     (BIT_26+BIT_25+BIT_24)
! #define NV_MASK_OP      (BIT_26+BIT_25+BIT_24)
  #define NV_DELAY_COUNT  10
  
  /*
   * Deivce ID list definitions.
   */
--- 1221,1234 ----
  
  /*
   * NVRAM Command values.
   */
  #define NV_START_BIT    BIT_2
! #define NV_WRITE_OP     (BIT_26 + BIT_24)
! #define NV_READ_OP      (BIT_26 + BIT_25)
! #define NV_ERASE_OP     (BIT_26 + BIT_25 + BIT_24)
! #define NV_MASK_OP      (BIT_26 + BIT_25 + BIT_24)
  #define NV_DELAY_COUNT  10
  
  /*
   * Deivce ID list definitions.
   */
*** 957,968 ****
  int ql_init_rings(ql_adapter_state_t *);
  int ql_fw_ready(ql_adapter_state_t *, uint8_t);
  void ql_dev_list(ql_adapter_state_t *, ql_dev_id_list_t *, uint32_t,
      port_id_t *, uint16_t *);
  void ql_reset_chip(ql_adapter_state_t *);
- void ql_reset_24xx_chip(ql_adapter_state_t *);
  int ql_abort_isp(ql_adapter_state_t *);
  int ql_vport_control(ql_adapter_state_t *, uint8_t);
  int ql_vport_modify(ql_adapter_state_t *, uint8_t, uint8_t);
  int ql_vport_enable(ql_adapter_state_t *);
  ql_adapter_state_t *ql_vport_create(ql_adapter_state_t *, uint8_t);
  void ql_vport_destroy(ql_adapter_state_t *);
--- 1290,1301 ----
  int ql_init_rings(ql_adapter_state_t *);
  int ql_fw_ready(ql_adapter_state_t *, uint8_t);
  void ql_dev_list(ql_adapter_state_t *, ql_dev_id_list_t *, uint32_t,
      port_id_t *, uint16_t *);
  void ql_reset_chip(ql_adapter_state_t *);
  int ql_abort_isp(ql_adapter_state_t *);
+ void ql_requeue_all_cmds(ql_adapter_state_t *);
  int ql_vport_control(ql_adapter_state_t *, uint8_t);
  int ql_vport_modify(ql_adapter_state_t *, uint8_t, uint8_t);
  int ql_vport_enable(ql_adapter_state_t *);
  ql_adapter_state_t *ql_vport_create(ql_adapter_state_t *, uint8_t);
  void ql_vport_destroy(ql_adapter_state_t *);