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>

@@ -18,12 +18,11 @@
  *
  * CDDL HEADER END
  */
 
 /*
- * Copyright 2010 QLogic Corporation.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2015 QLogic Corporation.  All rights reserved.
  */
 
 #ifndef _QL_NX_H
 #define _QL_NX_H
 

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

@@ -52,10 +51,11 @@
 #define NX_P3P_A0       0x50
 #define NX_P3P_B0       0x54
 
 #define NX_IS_REVISION_P3(REVISION)     (REVISION >= NX_P3_A0)
 #define NX_IS_REVISION_P3PLUS(REVISION) (REVISION >= NX_P3P_A0)
+#define NX_IS_REVISION_P3PLUS_B0(REVISION)      (REVISION >= NX_P3P_B0)
 
 /*
  * Following are the states of the Phantom. Phantom will set them and
  * Host will read to check if the fields are correct.
  */

@@ -80,21 +80,23 @@
 #define CRB_DEV_STATE           (UNM_CAM_RAM(0x140))
 #define CRB_DRV_IDC_VERSION     (UNM_CAM_RAM(0x174))
 #define CRB_DRV_ACTIVE          (UNM_CAM_RAM(0x138))
 #define CRB_DRV_STATE           (UNM_CAM_RAM(0x144))
 #define CRB_DRV_SCRATCH         (UNM_CAM_RAM(0x148))
-#define CRB_FCOE_PORT_0_REQIN   (UNM_CAM_RAM(0x1b8))
-#define CRB_FCOE_PORT_1_REQIN   (UNM_CAM_RAM(0x1bc))
+#define CRB_PORT_0_REQIN        (UNM_CAM_RAM(0x1b8))
+#define CRB_PORT_1_REQIN        (UNM_CAM_RAM(0x1bc))
 
 /* Every driver should use these Device State */
+#define NX_DEV_POLL             0
 #define NX_DEV_COLD             1
 #define NX_DEV_INITIALIZING     2
 #define NX_DEV_READY            3
 #define NX_DEV_NEED_RESET       4
 #define NX_DEV_NEED_QUIESCENT   5
 #define NX_DEV_FAILED           6
 #define NX_DEV_QUIESCENT        7
+#define NX_DEV_BADOBADO         0xbad0bad0
 
 #define NX_IDC_VERSION          0x1
 
 #define CRB_CMD_PRODUCER_OFFSET (UNM_NIC_REG(0x08))
 #define CRB_CMD_CONSUMER_OFFSET (UNM_NIC_REG(0x0c))

@@ -1168,32 +1170,415 @@
 #define CRB_INDIRECT_2M         (0x1e0000UL)
 /* #define      ADDR_ERROR ((unsigned long ) 0xffffffff) */
 
 /* PCI Windowing for DDR regions.  */
 #define QL_8021_ADDR_IN_RANGE(addr, low, high)  \
-        (((addr) <= (high)) && ((addr) >= (low)))
+        (((addr) <= (high)) && ((int64_t)(addr) >= (low)))
 
 #define CRB_WIN_LOCK_TIMEOUT    100000000
 #define ROM_LOCK_TIMEOUT        100
 #define ROM_MAX_TIMEOUT         100
 #define IDC_LOCK_TIMEOUT        100000000
 
 /*
- * IDC parameters are defined in “user area” in the flash
+ * IDC parameters are defined in "user area" in the flash
  */
 #define ROM_DEV_INIT_TIMEOUT            0x3e885c
 #define ROM_DRV_RESET_ACK_TIMEOUT       0x3e8860
 
+/* ****************************************************************** */
+/* ******************* NetXen MiniDump Defines ********************** */
+/* ****************************************************************** */
+
 /*
+ * Get MBC_GET_DUMP_TEMPLATE Command Options
+ */
+#define GTO_TEMPLATE_SIZE       0
+#define GTO_TEMPLATE            1
+
+/*
+ * Entry Type Defines
+ */
+#define RDNOP            0
+#define RDCRB            1
+#define RDMUX            2
+#define QUEUE            3
+#define BOARD            4
+#define RDSRE            5
+#define RDOCM            6
+#define PREGS            7
+#define L1DTG            8
+#define L1ITG            9
+#define CACHE           10
+#define L1DAT           11
+#define L1INS           12
+#define RDSTK           13
+#define RDCON           14
+#define L2DTG           21
+#define L2ITG           22
+#define L2DAT           23
+#define L2INS           24
+#define RDOC3           25
+#define MEMBK           32
+#define RDROM           71
+#define RDMEM           72
+#define INFOR           81
+#define CNTRL           98
+#define TLHDR           99
+#define RDEND           255
+#define PRIMQ           103
+#define SQG2Q           104
+#define SQG3Q           105
+#define ISCSI_EVENT_LOG 201
+
+/*
+ * Minidump Template Header
+ * Parts of the template header can be modified by the driver.
+ * These include the saved_state_array, capture_debug_level, driver_timestamp
+ * The driver_info_wordX is used to add info about the drivers environment.
+ * It is important that drivers add identication and system info in these
+ * fields.
+ */
+
+#define QL_DBG_STATE_ARRAY_LEN          16
+#define QL_DBG_CAP_SIZE_ARRAY_LEN       8
+#define QL_DBG_RSVD_ARRAY_LEN           8
+
+typedef struct md_template_hdr {
+        uint32_t        entry_type;
+        uint32_t        first_entry_offset;
+        uint32_t        size_of_template;
+        uint32_t        capture_debug_level;
+        uint32_t        num_of_entries;
+        uint32_t        version;
+        uint32_t        driver_timestamp;
+        uint32_t        checksum;
+        uint32_t        driver_capture_mask;
+        uint32_t        driver_info_word1;
+        uint32_t        driver_info_word2;
+        uint32_t        driver_info_word3;
+        uint32_t        saved_state_array[QL_DBG_STATE_ARRAY_LEN];
+        uint32_t        capture_size_array[QL_DBG_CAP_SIZE_ARRAY_LEN];
+
+        /* markers_array used to capture some special locations on board */
+        uint32_t        markers_array[QL_DBG_RSVD_ARRAY_LEN];
+        uint32_t        num_of_free_entries;    /* For internal use */
+        uint32_t        free_entry_offset;      /* For internal use */
+        uint32_t        total_table_size;       /* For internal use */
+        uint32_t        bkup_table_offset;      /* For internal use */
+} md_template_hdr_t;
+
+/*
+ * Driver Flags
+ */
+#define QL_DBG_SKIPPED_FLAG     0x80    /* driver skipped this entry  */
+#define QL_DBG_SIZE_ERR_FLAG    0x40    /* entry siz vs capture siz mismatch */
+
+/*
+ * Minidump Entry Header
+ */
+typedef struct md_entry_hdr {
+        uint32_t        entry_type;
+        uint32_t        entry_size;
+        uint32_t        entry_capture_size;
+        union {
+                struct {
+#ifdef _BIG_ENDIAN
+                        uint8_t driver_flags;
+                        uint8_t driver_code;
+                        uint8_t entry_code;
+                        uint8_t entry_capture_mask;
+#else
+                        uint8_t entry_capture_mask;
+                        uint8_t entry_code;
+                        uint8_t driver_code;
+                        uint8_t driver_flags;
+#endif
+                } ecw;
+                uint32_t        entry_ctrl_word;
+        } a;
+} md_entry_hdr_t;
+
+/*
+ * Minidump Entry Including Header
+ */
+typedef struct md_entry {
+        md_entry_hdr_t  h;
+        uint32_t        entry_data00;
+        uint32_t        entry_data01;
+        uint32_t        entry_data02;
+        uint32_t        entry_data03;
+        uint32_t        entry_data04;
+        uint32_t        entry_data05;
+        uint32_t        entry_data06;
+        uint32_t        entry_data07;
+} md_entry_t;
+
+/*
+ *  Minidump Read CRB Entry Header
+ */
+typedef struct md_entry_rdcrb {
+        md_entry_hdr_t  h;
+        uint32_t        addr;
+        union {
+                struct {
+#ifdef _BIG_ENDIAN
+                        uint8_t rsvd_1[2];
+                        uint8_t rsvd_0;
+                        uint8_t addr_stride;
+#else
+                        uint8_t addr_stride;
+                        uint8_t rsvd_0;
+                        uint8_t rsvd_1[2];
+#endif
+                } ac;
+                uint32_t        addr_cntrl;
+        } a;
+        uint32_t        data_size;
+        uint32_t        op_count;
+        uint32_t        rsvd_2;
+        uint32_t        rsvd_3;
+        uint32_t        rsvd_4;
+        uint32_t        rsvd_5;
+} md_entry_rdcrb_t;
+
+/*
+ * Minidump Cache Entry Header
+ */
+typedef struct ql_md_entry_cache {
+        md_entry_hdr_t  h;
+        uint32_t        tag_reg_addr;
+        union {
+                struct {
+#ifdef _BIG_ENDIAN
+                        uint8_t init_tag_value[2];
+                        uint8_t tag_value_stride[2];
+#else
+                        uint8_t tag_value_stride[2];
+                        uint8_t init_tag_value[2];
+#endif
+                } sac;
+                uint32_t        select_addr_cntrl;
+        } a;
+        uint32_t        data_size;
+        uint32_t        op_count;
+        uint32_t        control_addr;
+        union {
+                struct {
+#ifdef _BIG_ENDIAN
+                        uint8_t poll_wait;
+                        uint8_t poll_mask;
+                        uint8_t write_value[2];
+#else
+                        uint8_t write_value[2];
+                        uint8_t poll_mask;
+                        uint8_t poll_wait;
+#endif
+                } cv;
+                uint32_t        control_value;
+        } b;
+        uint32_t        read_addr;
+        union {
+                struct {
+#ifdef _BIG_ENDIAN
+                        uint8_t rsvd_1[2];
+                        uint8_t read_addr_cnt;
+                        uint8_t read_addr_stride;
+#else
+                        uint8_t read_addr_stride;
+                        uint8_t read_addr_cnt;
+                        uint8_t rsvd_1[2];
+#endif
+                } rac;
+                uint32_t        read_addr_cntrl;
+        } c;
+} md_entry_cache_t;
+
+/*
+ * Minidump Read OCM Entry Header
+ */
+typedef struct md_entry_rdocm {
+        md_entry_hdr_t  h;
+        uint32_t        rsvd_0;
+        uint32_t        rsvd_1;
+        uint32_t        data_size;
+        uint32_t        op_count;
+        uint32_t        rsvd_2;
+        uint32_t        rsvd_3;
+        uint32_t        read_addr;
+        uint32_t        read_addr_stride;
+} md_entry_rdocm_t;
+
+/*
+ * Minidump Read MEM Entry Header
+ */
+typedef struct md_entry_rdmem {
+        md_entry_hdr_t  h;
+        uint32_t        rsvd_0[6];
+        uint32_t        read_addr;
+        uint32_t        read_data_size;
+} md_entry_rdmem_t;
+/*
+ * Minidump MIU AGENT ADDRESSES.
+ */
+#define MD_TA_CTL_ENABLE                0x2
+#define MD_TA_CTL_START                 0x1
+#define MD_TA_CTL_BUSY                  0x8
+#define MD_TA_CTL_CHECK                 1000
+#define MD_MIU_TEST_AGT_CTRL            0x41000090
+#define MD_MIU_TEST_AGT_ADDR_LO         0x41000094
+#define MD_MIU_TEST_AGT_ADDR_HI         0x41000098
+#define MD_MIU_TEST_AGT_RDDATA_0_31     0x410000A8
+#define MD_MIU_TEST_AGT_RDDATA_32_63    0x410000AC
+#define MD_MIU_TEST_AGT_RDDATA_64_95    0x410000B8
+#define MD_MIU_TEST_AGT_RDDATA_96_127   0x410000BC
+#define MD_MIU_TEST_AGT_WRDATA_0_31     0x410000A0
+#define MD_MIU_TEST_AGT_WRDATA_32_63    0x410000A4
+#define MD_MIU_TEST_AGT_WRDATA_64_95    0x410000B0
+#define MD_MIU_TEST_AGT_WRDATA_96_127   0x410000B4
+
+/*
+ * Minidump Read ROM Entry Header
+ */
+typedef struct md_entry_rdrom {
+        md_entry_hdr_t  h;
+        uint32_t        rsvd_0[6];
+        uint32_t        read_addr;
+        uint32_t        read_data_size;
+} md_entry_rdrom_t;
+/*
+ *  Minidump ROM Read Address
+ */
+#define MD_DIRECT_ROM_WINDOW    0x42110030
+#define MD_DIRECT_ROM_READ_BASE 0x42150000
+
+/*
+ * Minidump Read MUX Entry Header
+ */
+typedef struct md_entry_mux {
+        md_entry_hdr_t  h;
+        uint32_t        select_addr;
+        union {
+                struct {
+                        uint32_t        rsvd_0;
+                } sac;
+                uint32_t        select_addr_cntrl;
+        } a;
+        uint32_t        data_size;
+        uint32_t        op_count;
+        uint32_t        select_value;
+        uint32_t        select_value_stride;
+        uint32_t        read_addr;
+        uint32_t        rsvd_1;
+} md_entry_mux_t;
+
+/*
+ * Minidump Read QUEUE Entry Header
+ */
+typedef struct md_entry_queue {
+        md_entry_hdr_t  h;
+        uint32_t        select_addr;
+        union {
+                struct {
+#ifdef _BIG_ENDIAN
+                        uint8_t rsvd_0[2];
+                        uint8_t queue_id_stride[2];
+#else
+                        uint8_t queue_id_stride[2];
+                        uint8_t rsvd_0[2];
+#endif
+                } sac;
+                uint32_t        select_addr_cntrl;
+        } a;
+        uint32_t        data_size;
+        uint32_t        op_count;
+        uint32_t        rsvd_1;
+        uint32_t        rsvd_2;
+        uint32_t        read_addr;
+        union {
+                struct {
+#ifdef _BIG_ENDIAN
+                        uint8_t rsvd_3[2];
+                        uint8_t read_addr_cnt;
+                        uint8_t read_addr_stride;
+#else
+                        uint8_t read_addr_stride;
+                        uint8_t read_addr_cnt;
+                        uint8_t rsvd_3[2];
+#endif
+                } rac;
+                uint32_t        read_addr_cntrl;
+        } b;
+} md_entry_queue_t;
+
+/*
+ * Minidump Control Entry Header
+ */
+typedef struct md_entry_cntrl {
+        md_entry_hdr_t  h;
+        uint32_t        addr;
+        union {
+                struct {
+#ifdef _BIG_ENDIAN
+                        uint8_t poll_timeout[2];
+                        uint8_t state_index_a;
+                        uint8_t addr_stride;
+#else
+                        uint8_t addr_stride;
+                        uint8_t state_index_a;
+                        uint8_t poll_timeout[2];
+#endif
+                } ac;
+                uint32_t        addr_cntrl;
+        } a;
+        uint32_t        data_size;
+        uint32_t        op_count;
+        union {
+                struct {
+#ifdef _BIG_ENDIAN
+                        uint8_t shr;
+                        uint8_t shl;
+                        uint8_t state_index_v;
+                        uint8_t opcode;
+#else
+                        uint8_t opcode;
+                        uint8_t state_index_v;
+                        uint8_t shl;
+                        uint8_t shr;
+#endif
+                } cv;
+                uint32_t        control_value;
+        } b;
+        uint32_t        value_1;
+        uint32_t        value_2;
+        uint32_t        value_3;
+} md_entry_cntrl_t;
+
+/*
+ * Opcodes for Control Entries.
+ * These Flags are bit fields.
+ */
+#define QL_DBG_OPCODE_WR        0x01
+#define QL_DBG_OPCODE_RW        0x02
+#define QL_DBG_OPCODE_AND       0x04
+#define QL_DBG_OPCODE_OR        0x08
+#define QL_DBG_OPCODE_POLL      0x10
+#define QL_DBG_OPCODE_RDSTATE   0x20
+#define QL_DBG_OPCODE_WRSTATE   0x40
+#define QL_DBG_OPCODE_MDSTATE   0x80
+
+/*
  * Global Data in ql_nx.c source file.
  */
 
 /*
  * Global Function Prototypes in ql_nx.c source file.
  */
+void ql_8021_wr_32(ql_adapter_state_t *, uint64_t, uint32_t);
+void ql_8021_rd_32(ql_adapter_state_t *, uint64_t, uint32_t *);
 void ql_8021_reset_chip(ql_adapter_state_t *);
-int ql_8021_load_risc(ql_adapter_state_t *);
+int ql_8021_fw_reload(ql_adapter_state_t *);
 void ql_8021_clr_hw_intr(ql_adapter_state_t *);
 void ql_8021_clr_fw_intr(ql_adapter_state_t *);
 void ql_8021_enable_intrs(ql_adapter_state_t *);
 void ql_8021_disable_intrs(ql_adapter_state_t *);
 void ql_8021_update_crb_int_ptr(ql_adapter_state_t *);

@@ -1201,11 +1586,16 @@
 int ql_8021_rom_write(ql_adapter_state_t *, uint32_t, uint32_t);
 int ql_8021_rom_erase(ql_adapter_state_t *, uint32_t);
 int ql_8021_rom_wrsr(ql_adapter_state_t *, uint32_t);
 void ql_8021_set_drv_active(ql_adapter_state_t *);
 void ql_8021_clr_drv_active(ql_adapter_state_t *);
-uint32_t ql_8021_idc_handler(ql_adapter_state_t *);
+int ql_8021_idc_handler(ql_adapter_state_t *, uint32_t);
+void ql_8021_wr_req_in(ql_adapter_state_t *, uint32_t);
+void ql_8021_idc_poll(ql_adapter_state_t *);
+int ql_8021_reset_fw(ql_adapter_state_t *);
+int ql_8021_fw_chk(ql_adapter_state_t *);
+int ql_8021_get_md_template(ql_adapter_state_t *);
 
 #ifdef __cplusplus
 }
 #endif