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