/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2010 QLogic Corporation. All rights reserved.
*/
#ifndef _QLGE_HW_H
#define _QLGE_HW_H
#ifdef __cplusplus
extern "C" {
#endif
#define ISP_SCHULTZ 0x8000
#define MB_REG_COUNT 8
#define MB_DATA_REG_COUNT (MB_REG_COUNT-1)
#define QLA_SCHULTZ(qlge) ((qlge)->device_id == ISP_SCHULTZ)
/*
* Data bit definitions.
*/
#define BIT_0 0x1
#define BIT_1 0x2
#define BIT_2 0x4
#define BIT_3 0x8
#define BIT_4 0x10
#define BIT_5 0x20
#define BIT_6 0x40
#define BIT_7 0x80
#define BIT_8 0x100
#define BIT_9 0x200
#define BIT_10 0x400
#define BIT_11 0x800
#define BIT_12 0x1000
#define BIT_13 0x2000
#define BIT_14 0x4000
#define BIT_15 0x8000
#define BIT_16 0x10000
#define BIT_17 0x20000
#define BIT_18 0x40000
#define BIT_19 0x80000
#define BIT_20 0x100000
#define BIT_21 0x200000
#define BIT_22 0x400000
#define BIT_23 0x800000
#define BIT_24 0x1000000
#define BIT_25 0x2000000
#define BIT_26 0x4000000
#define BIT_27 0x8000000
#define BIT_28 0x10000000
#define BIT_29 0x20000000
#define BIT_30 0x40000000
#define BIT_31 0x80000000
typedef struct ql_stats
{
uint32_t intr_type;
/* software statics */
uint32_t intr;
uint64_t speed;
uint32_t duplex;
uint32_t media;
/* TX */
uint64_t obytes;
uint64_t opackets;
uint32_t nocarrier;
uint32_t defer;
/* RX */
uint64_t rbytes;
uint64_t rpackets;
uint32_t norcvbuf;
uint32_t frame_too_long;
uint32_t crc;
ulong_t multircv;
ulong_t brdcstrcv;
uint32_t errrcv;
uint32_t frame_too_short;
/* statics by hw */
uint32_t errxmt;
uint32_t frame_err;
ulong_t multixmt;
ulong_t brdcstxmt;
uint32_t phy_addr;
uint32_t jabber_err;
}ql_stats_t;
#define ETHERNET_CRC_SIZE 4
/*
* Register Definitions...
*/
#define MAILBOX_COUNT 16
/* System Register 0x00 */
#define PROC_ADDR_RDY BIT_31
#define PROC_ADDR_R BIT_30
#define PROC_ADDR_ERR BIT_29
#define PROC_ADDR_DA BIT_28
#define PROC_ADDR_FUNC0_MBI 0x00001180
#define PROC_ADDR_FUNC0_MBO (PROC_ADDR_FUNC0_MBI + MAILBOX_COUNT)
#define PROC_ADDR_FUNC0_CTL 0x000011a1
#define PROC_ADDR_FUNC2_MBI 0x00001280
#define PROC_ADDR_FUNC2_MBO (PROC_ADDR_FUNC2_MBI + MAILBOX_COUNT)
#define PROC_ADDR_FUNC2_CTL 0x000012a1
#define PROC_ADDR_MPI_RISC 0x00000000
#define PROC_ADDR_MDE 0x00010000
#define PROC_ADDR_REGBLOCK 0x00020000
#define PROC_ADDR_RISC_REG 0x00030000
/* System Register 0x08 */
#define SYSTEM_EFE_FAE 0x3u
#define SYSTEM_EFE_FAE_MASK (SYSTEM_EFE_FAE<<16)
enum {
SYS_EFE = (1 << 0),
SYS_FAE = (1 << 1),
SYS_MDC = (1 << 2),
SYS_DST = (1 << 3),
SYS_DWC = (1 << 4),
SYS_EVW = (1 << 5),
SYS_OMP_DLY_MASK = 0x3f000000,
/*
* There are no values defined as of edit #15.
*/
SYS_ODI = (1 << 14)
};
/*
* Reset/Failover Register (RST_FO) bit definitions.
*/
#define RST_FO_TFO (1 << 0)
#define RST_FO_RR_MASK 0x00060000
#define RST_FO_RR_CQ_CAM 0x00000000
#define RST_FO_RR_DROP 0x00000001
#define RST_FO_RR_DQ 0x00000002
#define RST_FO_RR_RCV_FUNC_CQ 0x00000003
#define RST_FO_FRB BIT_12
#define RST_FO_MOP BIT_13
#define RST_FO_REG BIT_14
#define RST_FO_FR 0x8000u
/*
* Function Specific Control Register (FSC) bit definitions.
*/
enum {
FSC_DBRST_MASK = 0x00070000,
FSC_DBRST_256 = 0x00000000,
FSC_DBRST_512 = 0x00000001,
FSC_DBRST_768 = 0x00000002,
FSC_DBRST_1024 = 0x00000003,
FSC_DBL_MASK = 0x00180000,
FSC_DBL_DBRST = 0x00000000,
FSC_DBL_MAX_PLD = 0x00000008,
FSC_DBL_MAX_BRST = 0x00000010,
FSC_DBL_128_BYTES = 0x00000018,
FSC_EC = (1 << 5),
FSC_EPC_MASK = 0x00c00000,
FSC_EPC_INBOUND = (1 << 6),
FSC_EPC_OUTBOUND = (1 << 7),
FSC_VM_PAGESIZE_MASK = 0x07000000,
FSC_VM_PAGE_2K = 0x00000100,
FSC_VM_PAGE_4K = 0x00000200,
FSC_VM_PAGE_8K = 0x00000300,
FSC_VM_PAGE_64K = 0x00000600,
FSC_SH = (1 << 11),
FSC_DSB = (1 << 12),
FSC_STE = (1 << 13),
FSC_FE = (1 << 15)
};
/*
* Host Command Status Register (CSR) bit definitions.
*/
#define CSR_ERR_STS_MASK 0x0000003f
/*
* There are no valued defined as of edit #15.
*/
#define CSR_RR BIT_8
#define CSR_HRI BIT_9
#define CSR_RP BIT_10
#define CSR_CMD_PARM_SHIFT 22
#define CSR_CMD_NOP 0x00000000
#define CSR_CMD_SET_RST 0x1000000
#define CSR_CMD_CLR_RST 0x20000000
#define CSR_CMD_SET_PAUSE 0x30000000
#define CSR_CMD_CLR_PAUSE 0x40000000
#define CSR_CMD_SET_H2R_INT 0x50000000
#define CSR_CMD_CLR_H2R_INT 0x60000000
#define CSR_CMD_PAR_EN 0x70000000
#define CSR_CMD_SET_BAD_PAR 0x80000000u
#define CSR_CMD_CLR_BAD_PAR 0x90000000u
#define CSR_CMD_CLR_R2PCI_INT 0xa0000000u
/*
* Configuration Register (CFG) bit definitions.
*/
enum {
CFG_LRQ = (1 << 0),
CFG_DRQ = (1 << 1),
CFG_LR = (1 << 2),
CFG_DR = (1 << 3),
CFG_LE = (1 << 5),
CFG_LCQ = (1 << 6),
CFG_DCQ = (1 << 7),
CFG_Q_SHIFT = 8,
CFG_Q_MASK = 0x7f000000
};
/*
* Status Register (STS) bit definitions.
*/
enum {
STS_FE = (1 << 0),
STS_PI = (1 << 1),
STS_PL0 = (1 << 2),
STS_PL1 = (1 << 3),
STS_PI0 = (1 << 4),
STS_PI1 = (1 << 5),
STS_FUNC_ID_MASK = 0x000000c0,
STS_FUNC_ID_SHIFT = 6,
STS_F0E = (1 << 8),
STS_F1E = (1 << 9),
STS_F2E = (1 << 10),
STS_F3E = (1 << 11),
STS_NFE = (1 << 12)
};
/*
* Register (REV_ID) bit definitions.
*/
enum {
REV_ID_MASK = 0x0000000f,
REV_ID_NICROLL_SHIFT = 0,
REV_ID_NICREV_SHIFT = 4,
REV_ID_XGROLL_SHIFT = 8,
REV_ID_XGREV_SHIFT = 12,
REV_ID_CHIPREV_SHIFT = 28
};
/*
* Force ECC Error Register (FRC_ECC_ERR) bit definitions.
*/
enum {
FRC_ECC_ERR_VW = (1 << 12),
FRC_ECC_ERR_VB = (1 << 13),
FRC_ECC_ERR_NI = (1 << 14),
FRC_ECC_ERR_NO = (1 << 15),
FRC_ECC_PFE_SHIFT = 16,
FRC_ECC_ERR_DO = (1 << 18),
FRC_ECC_P14 = (1 << 19)
};
/*
* Error Status Register (ERR_STS) bit definitions.
*/
enum {
ERR_STS_NOF = (1 << 0),
ERR_STS_NIF = (1 << 1),
ERR_STS_DRP = (1 << 2),
ERR_STS_XGP = (1 << 3),
ERR_STS_FOU = (1 << 4),
ERR_STS_FOC = (1 << 5),
ERR_STS_FOF = (1 << 6),
ERR_STS_FIU = (1 << 7),
ERR_STS_FIC = (1 << 8),
ERR_STS_FIF = (1 << 9),
ERR_STS_MOF = (1 << 10),
ERR_STS_TA = (1 << 11),
ERR_STS_MA = (1 << 12),
ERR_STS_MPE = (1 << 13),
ERR_STS_SCE = (1 << 14),
ERR_STS_STE = (1 << 15),
ERR_STS_FOW = (1 << 16),
ERR_STS_UE = (1 << 17),
ERR_STS_MCH = (1 << 26),
ERR_STS_LOC_SHIFT = 27
};
/*
* Semaphore Register (SEM) bit definitions.
*/
/*
* Example:
* reg = SEM_XGMAC0_MASK | (SEM_SET << SEM_XGMAC0_SHIFT)
*/
#define SEM_CLEAR 0
#define SEM_SET 1
#define SEM_FORCE 3
#define SEM_XGMAC0_SHIFT 0
#define SEM_XGMAC1_SHIFT 2
#define SEM_ICB_SHIFT 4
#define SEM_MAC_ADDR_SHIFT 6
#define SEM_FLASH_SHIFT 8
#define SEM_PROBE_SHIFT 10
#define SEM_RT_IDX_SHIFT 12
#define SEM_PROC_REG_SHIFT 14
#define SEM_XGMAC0_MASK 0x00030000
#define SEM_XGMAC1_MASK 0x000c0000
#define SEM_ICB_MASK 0x00300000
#define SEM_MAC_ADDR_MASK 0x00c00000
#define SEM_FLASH_MASK 0x03000000
#define SEM_PROBE_MASK 0x0c000000
#define SEM_RT_IDX_MASK 0x30000000
#define SEM_PROC_REG_MASK 0xc0000000
/*
* Stop CQ Processing Register (CQ_STOP) bit definitions.
*/
enum {
CQ_STOP_QUEUE_MASK = (0x007f0000),
CQ_STOP_TYPE_MASK = (0x03000000),
CQ_STOP_TYPE_START = 0x00000100,
CQ_STOP_TYPE_STOP = 0x00000200,
CQ_STOP_TYPE_READ = 0x00000300,
CQ_STOP_EN = (1 << 15)
};
/*
* MAC Protocol Address Index Register (MAC_ADDR_IDX) bit definitions.
*/
#define MAC_ADDR_IDX_SHIFT 4
#define MAC_ADDR_TYPE_SHIFT 16
#define MAC_ADDR_TYPE_MASK 0x000f0000
#define MAC_ADDR_TYPE_CAM_MAC 0x00000000
#define MAC_ADDR_TYPE_MULTI_MAC 0x00010000
#define MAC_ADDR_TYPE_VLAN 0x00020000
#define MAC_ADDR_TYPE_MULTI_FLTR 0x00030000
#define MAC_ADDR_TYPE_FC_MAC 0x00040000
#define MAC_ADDR_TYPE_MGMT_MAC 0x00050000
#define MAC_ADDR_TYPE_MGMT_VLAN 0x00060000
#define MAC_ADDR_TYPE_MGMT_V4 0x00070000
#define MAC_ADDR_TYPE_MGMT_V6 0x00080000
#define MAC_ADDR_TYPE_MGMT_TU_DP 0x00090000
#define MAC_ADDR_ADR BIT_25
#define MAC_ADDR_RS BIT_26
#define MAC_ADDR_E BIT_27
#define MAC_ADDR_MR BIT_30
#define MAC_ADDR_MW BIT_31
#define MAX_MULTICAST_HW_SIZE 32
/*
* MAC Protocol Address Index Register (SPLT_HDR, 0xC0) bit definitions.
*/
#define SPLT_HDR_EP BIT_31
/*
* NIC Receive Configuration Register (NIC_RCV_CFG) bit definitions.
*/
enum {
NIC_RCV_CFG_PPE = (1 << 0),
NIC_RCV_CFG_VLAN_MASK = 0x00060000,
NIC_RCV_CFG_VLAN_ALL = 0x00000000,
NIC_RCV_CFG_VLAN_MATCH_ONLY = 0x00000002,
NIC_RCV_CFG_VLAN_MATCH_AND_NON = 0x00000004,
NIC_RCV_CFG_VLAN_NONE_AND_NON = 0x00000006,
NIC_RCV_CFG_RV = (1 << 3),
NIC_RCV_CFG_DFQ_MASK = (0x7f000000),
NIC_RCV_CFG_DFQ_SHIFT = 8,
NIC_RCV_CFG_DFQ = 0 /* HARDCODE default queue to 0. */
};
/*
* Routing Index Register (RT_IDX) bit definitions.
*/
#define RT_IDX_IDX_SHIFT 8
#define RT_IDX_TYPE_MASK 0x000f0000
#define RT_IDX_TYPE_RT 0x00000000
#define RT_IDX_TYPE_RT_INV 0x00010000
#define RT_IDX_TYPE_NICQ 0x00020000
#define RT_IDX_TYPE_NICQ_INV 0x00030000
#define RT_IDX_DST_MASK 0x00700000
#define RT_IDX_DST_RSS 0x00000000
#define RT_IDX_DST_CAM_Q 0x00100000
#define RT_IDX_DST_COS_Q 0x00200000
#define RT_IDX_DST_DFLT_Q 0x00300000
#define RT_IDX_DST_DEST_Q 0x00400000
#define RT_IDX_RS BIT_26
#define RT_IDX_E BIT_27
#define RT_IDX_MR BIT_30
#define RT_IDX_MW BIT_31
/* Nic Queue format - type 2 bits */
#define RT_IDX_BCAST 1
#define RT_IDX_MCAST BIT_1
#define RT_IDX_MCAST_MATCH BIT_2
#define RT_IDX_MCAST_REG_MATCH BIT_3
#define RT_IDX_MCAST_HASH_MATCH BIT_4
#define RT_IDX_FC_MACH BIT_5
#define RT_IDX_ETH_FCOE BIT_6
#define RT_IDX_CAM_HIT BIT_7
#define RT_IDX_CAM_BIT0 BIT_8
#define RT_IDX_CAM_BIT1 BIT_9
#define RT_IDX_VLAN_TAG BIT_10
#define RT_IDX_VLAN_MATCH BIT_11
#define RT_IDX_VLAN_FILTER BIT_12
#define RT_IDX_ETH_SKIP1 BIT_13
#define RT_IDX_ETH_SKIP2 BIT_14
#define RT_IDX_BCAST_MCAST_MATCH BIT_15
#define RT_IDX_802_3 BIT_16
#define RT_IDX_LLDP BIT_17
#define RT_IDX_UNUSED018 BIT_18
#define RT_IDX_UNUSED019 BIT_19
#define RT_IDX_UNUSED20 BIT_20
#define RT_IDX_UNUSED21 BIT_21
#define RT_IDX_ERR BIT_22
#define RT_IDX_VALID BIT_23
#define RT_IDX_TU_CSUM_ERR BIT_24
#define RT_IDX_IP_CSUM_ERR BIT_25
#define RT_IDX_MAC_ERR BIT_26
#define RT_IDX_RSS_TCP6 BIT_27
#define RT_IDX_RSS_TCP4 BIT_28
#define RT_IDX_RSS_IPV6 BIT_29
#define RT_IDX_RSS_IPV4 BIT_30
#define RT_IDX_RSS_MATCH BIT_31
/* Hierarchy for the NIC Queue Mask */
enum {
RT_IDX_ALL_ERR_SLOT = 0,
RT_IDX_MAC_ERR_SLOT = 0,
RT_IDX_IP_CSUM_ERR_SLOT = 1,
RT_IDX_TCP_UDP_CSUM_ERR_SLOT = 2,
RT_IDX_BCAST_SLOT = 3,
RT_IDX_MCAST_MATCH_SLOT = 4,
RT_IDX_ALLMULTI_SLOT = 5,
RT_IDX_UNUSED6_SLOT = 6,
RT_IDX_UNUSED7_SLOT = 7,
RT_IDX_RSS_MATCH_SLOT = 8,
RT_IDX_RSS_IPV4_SLOT = 8,
RT_IDX_RSS_IPV6_SLOT = 9,
RT_IDX_RSS_TCP4_SLOT = 10,
RT_IDX_RSS_TCP6_SLOT = 11,
RT_IDX_CAM_HIT_SLOT = 12,
RT_IDX_UNUSED013 = 13,
RT_IDX_UNUSED014 = 14,
RT_IDX_PROMISCUOUS_SLOT = 15,
RT_IDX_MAX_SLOTS = 16
};
enum {
CAM_OUT_ROUTE_FC = 0,
CAM_OUT_ROUTE_NIC = 1,
CAM_OUT_FUNC_SHIFT = 2,
CAM_OUT_RV = (1 << 4),
CAM_OUT_SH = (1 << 15),
CAM_OUT_CQ_ID_SHIFT = 5
};
/* Reset/Failover Register 0C */
#define FUNCTION_RESET 0x8000u
#define FUNCTION_RESET_MASK (FUNCTION_RESET<<16)
/* Function Specific Control Register 0x10 */
#define FSC_MASK (0x97ffu << 16)
#define FSC_FE 0x8000
/* Configuration Register 0x28 */
#define LOAD_LCQ 0x40
#define LOAD_LCQ_MASK (0x7F40u << 16)
#define LOAD_ICB_ERR 0x20
#define LOAD_LRQ 0x01
#define LOAD_LRQ_MASK (0x7F01u << 16)
#define FN0_NET 0
#define FN1_NET 1
#define FN0_FC 2
#define FN1_FC 3
/*
* Semaphore Register (SEM) bit definitions.
*/
#define SEM_CLEAR 0
#define SEM_SET 1
#define SEM_FORCE 3
#define SEM_XGMAC0_SHIFT 0
#define SEM_XGMAC1_SHIFT 2
#define SEM_ICB_SHIFT 4
#define SEM_MAC_ADDR_SHIFT 6
#define SEM_FLASH_SHIFT 8
#define SEM_PROBE_SHIFT 10
#define SEM_RT_IDX_SHIFT 12
#define SEM_PROC_REG_SHIFT 14
#define SEM_XGMAC0_MASK 0x00030000
#define SEM_XGMAC1_MASK 0x000c0000
#define SEM_ICB_MASK 0x00300000
#define SEM_MAC_ADDR_MASK 0x00c00000
#define SEM_FLASH_MASK 0x03000000
#define SEM_PROBE_MASK 0x0c000000
#define SEM_RT_IDX_MASK 0x30000000
#define SEM_PROC_REG_MASK 0xc0000000
/* System Register 0x08 */
#define SYSTEM_EFE_FAE 0x3u
#define SYSTEM_EFE_FAE_MASK (SYSTEM_EFE_FAE<<16)
/* Interrupt Status Register-1 0x3C */
#define CQ_0_NOT_EMPTY BIT_0
#define CQ_1_NOT_EMPTY BIT_1
#define CQ_2_NOT_EMPTY BIT_2
#define CQ_3_NOT_EMPTY BIT_3
#define CQ_4_NOT_EMPTY BIT_4
#define CQ_5_NOT_EMPTY BIT_5
#define CQ_6_NOT_EMPTY BIT_6
#define CQ_7_NOT_EMPTY BIT_7
#define CQ_8_NOT_EMPTY BIT_8
#define CQ_9_NOT_EMPTY BIT_9
#define CQ_10_NOT_EMPTY BIT_10
#define CQ_11_NOT_EMPTY BIT_11
#define CQ_12_NOT_EMPTY BIT_12
#define CQ_13_NOT_EMPTY BIT_13
#define CQ_14_NOT_EMPTY BIT_14
#define CQ_15_NOT_EMPTY BIT_15
#define CQ_16_NOT_EMPTY BIT_16
/* Processor Address Register 0x00 */
#define PROCESSOR_ADDRESS_RDY (0x8000u<<16)
#define PROCESSOR_ADDRESS_READ (0x4000u<<16)
/* Host Command/Status Register 0x14 */
#define HOST_CMD_SET_RISC_RESET 0x10000000u
#define HOST_CMD_CLEAR_RISC_RESET 0x20000000u
#define HOST_CMD_SET_RISC_PAUSE 0x30000000u
#define HOST_CMD_RELEASE_RISC_PAUSE 0x40000000u
#define HOST_CMD_SET_RISC_INTR 0x50000000u
#define HOST_CMD_CLEAR_RISC_INTR 0x60000000u
#define HOST_CMD_SET_PARITY_ENABLE 0x70000000u
#define HOST_CMD_FORCE_BAD_PARITY 0x80000000u
#define HOST_CMD_RELEASE_BAD_PARITY 0x90000000u
#define HOST_CMD_CLEAR_RISC_TO_HOST_INTR 0xA0000000u
#define HOST_TO_MPI_INTR_NOT_DONE 0x200
#define RISC_RESET BIT_8
#define RISC_PAUSED BIT_10
/* Semaphor Register 0x64 */
#define QL_SEM_BITS_BASE_CODE 0x1u
#define QL_PORT0_XGMAC_SEM_BITS (QL_SEM_BITS_BASE_CODE)
#define QL_PORT1_XGMAC_SEM_BITS (QL_SEM_BITS_BASE_CODE << 2)
#define QL_ICB_ACCESS_ADDRESS_SEM_BITS (QL_SEM_BITS_BASE_CODE << 4)
#define QL_MAC_PROTOCOL_SEM_BITS (QL_SEM_BITS_BASE_CODE << 6)
#define QL_FLASH_SEM_BITS (QL_SEM_BITS_BASE_CODE << 8)
#define QL_PROBE_MUX_SEM_BITS (QL_SEM_BITS_BASE_CODE << 10)
#define QL_ROUTING_INDEX_SEM_BITS (QL_SEM_BITS_BASE_CODE << 12)
#define QL_PROCESSOR_SEM_BITS (QL_SEM_BITS_BASE_CODE << 14)
#define QL_NIC_RECV_CONFIG_SEM_BITS (QL_SEM_BITS_BASE_CODE << 14)
#define QL_SEM_MASK_BASE_CODE 0x30000u
#define QL_PORT0_XGMAC_SEM_MASK (QL_SEM_MASK_BASE_CODE)
#define QL_PORT1_XGMAC_SEM_MASK (QL_SEM_MASK_BASE_CODE << 2)
#define QL_ICB_ACCESS_ADDRESS_SEM_MASK (QL_SEM_MASK_BASE_CODE << 4)
#define QL_MAC_PROTOCOL_SEM_MASK (QL_SEM_MASK_BASE_CODE << 6)
#define QL_FLASH_SEM_MASK (QL_SEM_MASK_BASE_CODE << 8)
#define QL_PROBE_MUX_SEM_MASK (QL_SEM_MASK_BASE_CODE << 10)
#define QL_ROUTING_INDEX_SEM_MASK (QL_SEM_MASK_BASE_CODE << 12)
#define QL_PROCESSOR_SEM_MASK (QL_SEM_MASK_BASE_CODE << 14)
#define QL_NIC_RECV_CONFIG_SEM_MASK (QL_SEM_MASK_BASE_CODE << 14)
/* XGMAC Address Register 0x78 */
#define XGMAC_ADDRESS_RDY (0x8000u<<16)
#define XGMAC_ADDRESS_READ_TRANSACT (0x4000u<<16)
#define XGMAC_ADDRESS_ACCESS_ERROR (0x2000u<<16)
/* XGMAC Register Set */
#define REG_XGMAC_GLOBAL_CONFIGURATION 0x108
#define GLOBAL_CONFIG_JUMBO_MODE 0x40
#define REG_XGMAC_MAC_TX_CONFIGURATION 0x10C
#define XGMAC_MAC_TX_ENABLE 0x02
#define REG_XGMAC_MAC_RX_CONFIGURATION 0x110
#define XGMAC_MAC_RX_ENABLE 0x02
#define REG_XGMAC_FLOW_CONTROL 0x11C
#define REG_XGMAC_MAC_TX_PARAM 0x134
#define REG_XGMAC_MAC_RX_PARAM 0x138
#define REG_XGMAC_MAC_TX_PKTS 0x200
#define REG_XGMAC_MAC_TX_OCTETS 0x208
#define REG_XGMAC_MAC_TX_MULTCAST_PKTS 0x210
#define REG_XGMAC_MAC_TX_BROADCAST_PKTS 0x218
#define REG_XGMAC_MAC_TX_PAUSE_PKTS 0x230
#define REG_XGMAC_MAC_RX_OCTETS 0x300
#define REG_XGMAC_MAC_RX_OCTETS_OK 0x308
#define REG_XGMAC_MAC_RX_PKTS 0x310
#define REG_XGMAC_MAC_RX_PKTS_OK 0x318
#define REG_XGMAC_MAC_RX_BROADCAST_PKTS 0x320
#define REG_XGMAC_MAC_RX_MULTCAST_PKTS 0x328
#define REG_XGMAC_MAC_RX_JABBER_PKTS 0x348
#define REG_XGMAC_MAC_FCS_ERR 0x360
#define REG_XGMAC_MAC_ALIGN_ERR 0x368
#define REG_XGMAC_MAC_RX_SYM_ERR 0x370
#define REG_XGMAC_MAC_RX_INT_ERR 0x378
#define REG_XGMAC_MAC_RX_PAUSE_PKTS 0x388
#define REG_XGMAC_MAC_PHY_ADDR 0x430
#define REG_XGMAC_MAC_RX_FIFO_DROPS 0x5B8
/* MAC Protocol Address Index Register Set 0xA8 */
#define MAC_PROTOCOL_ADDRESS_INDEX_MW (0x8000u<<16)
#define MAC_PROTOCOL_ADDRESS_ENABLE (1 << 27)
#define MAC_PROTOCOL_TYPE_CAM_MAC (0x0)
#define MAC_PROTOCOL_TYPE_MULTICAST (0x10000u)
/* NIC Receive Configuration Register 0xD4 */
#define RECV_CONFIG_DEFAULT_Q_MASK (0x7F000000u)
#define RECV_CONFIG_VTAG_REMOVAL_MASK (0x80000u)
#define RECV_CONFIG_VTAG_RV 0x08
/*
* 10G MAC Address Register (XGMAC_ADDR) bit definitions.
*/
#define XGMAC_ADDR_RDY (1 << 31)
#define XGMAC_ADDR_R (1 << 30)
#define XGMAC_ADDR_XME (1 << 29)
#define PAUSE_SRC_LO 0x00000100
#define PAUSE_SRC_HI 0x00000104
#define GLOBAL_CFG 0x00000108
#define GLOBAL_CFG_RESET (1 << 0)
#define GLOBAL_CFG_JUMBO (1 << 6)
#define GLOBAL_CFG_TX_STAT_EN (1 << 10)
#define GLOBAL_CFG_RX_STAT_EN (1 << 11)
#define TX_CFG 0x0000010c
#define TX_CFG_RESET (1 << 0)
#define TX_CFG_EN (1 << 1)
#define TX_CFG_PREAM (1 << 2)
#define RX_CFG 0x00000110
#define RX_CFG_RESET (1 << 0)
#define RX_CFG_EN (1 << 1)
#define RX_CFG_PREAM (1 << 2)
#define FLOW_CTL 0x0000011c
#define PAUSE_OPCODE 0x00000120
#define PAUSE_TIMER 0x00000124
#define PAUSE_FRM_DEST_LO 0x00000128
#define PAUSE_FRM_DEST_HI 0x0000012c
#define MAC_TX_PARAMS 0x00000134
#define MAC_TX_PARAMS_JUMBO (1 << 31)
#define MAC_TX_PARAMS_SIZE_SHIFT 16
#define MAC_RX_PARAMS 0x00000138
#define MAC_SYS_INT 0x00000144
#define MAC_SYS_INT_MASK 0x00000148
#define MAC_MGMT_INT 0x0000014c
#define MAC_MGMT_IN_MASK 0x00000150
#define EXT_ARB_MODE 0x000001fc
#define TX_PKTS 0x00000200
#define TX_PKTS_LO 0x00000204
#define TX_BYTES 0x00000208
#define TX_BYTES_LO 0x0000020C
#define TX_MCAST_PKTS 0x00000210
#define TX_MCAST_PKTS_LO 0x00000214
#define TX_BCAST_PKTS 0x00000218
#define TX_BCAST_PKTS_LO 0x0000021C
#define TX_UCAST_PKTS 0x00000220
#define TX_UCAST_PKTS_LO 0x00000224
#define TX_CTL_PKTS 0x00000228
#define TX_CTL_PKTS_LO 0x0000022c
#define TX_PAUSE_PKTS 0x00000230
#define TX_PAUSE_PKTS_LO 0x00000234
#define TX_64_PKT 0x00000238
#define TX_64_PKT_LO 0x0000023c
#define TX_65_TO_127_PKT 0x00000240
#define TX_65_TO_127_PKT_LO 0x00000244
#define TX_128_TO_255_PKT 0x00000248
#define TX_128_TO_255_PKT_LO 0x0000024c
#define TX_256_511_PKT 0x00000250
#define TX_256_511_PKT_LO 0x00000254
#define TX_512_TO_1023_PKT 0x00000258
#define TX_512_TO_1023_PKT_LO 0x0000025c
#define TX_1024_TO_1518_PKT 0x00000260
#define TX_1024_TO_1518_PKT_LO 0x00000264
#define TX_1519_TO_MAX_PKT 0x00000268
#define TX_1519_TO_MAX_PKT_LO 0x0000026c
#define TX_UNDERSIZE_PKT 0x00000270
#define TX_UNDERSIZE_PKT_LO 0x00000274
#define TX_OVERSIZE_PKT 0x00000278
#define TX_OVERSIZE_PKT_LO 0x0000027c
#define RX_HALF_FULL_DET 0x000002a0
#define TX_HALF_FULL_DET_LO 0x000002a4
#define RX_OVERFLOW_DET 0x000002a8
#define TX_OVERFLOW_DET_LO 0x000002ac
#define RX_HALF_FULL_MASK 0x000002b0
#define TX_HALF_FULL_MASK_LO 0x000002b4
#define RX_OVERFLOW_MASK 0x000002b8
#define TX_OVERFLOW_MASK_LO 0x000002bc
#define STAT_CNT_CTL 0x000002c0
#define STAT_CNT_CTL_CLEAR_TX (1 << 0) /* Control */
#define STAT_CNT_CTL_CLEAR_RX (1 << 1) /* Control */
#define AUX_RX_HALF_FULL_DET 0x000002d0
#define AUX_TX_HALF_FULL_DET 0x000002d4
#define AUX_RX_OVERFLOW_DET 0x000002d8
#define AUX_TX_OVERFLOW_DET 0x000002dc
#define AUX_RX_HALF_FULL_MASK 0x000002f0
#define AUX_TX_HALF_FULL_MASK 0x000002f4
#define AUX_RX_OVERFLOW_MASK 0x000002f8
#define AUX_TX_OVERFLOW_MASK 0x000002fc
#define RX_BYTES 0x00000300
#define RX_BYTES_LO 0x00000304
#define RX_BYTES_OK 0x00000308
#define RX_BYTES_OK_LO 0x0000030c
#define RX_PKTS 0x00000310
#define RX_PKTS_LO 0x00000314
#define RX_PKTS_OK 0x00000318
#define RX_PKTS_OK_LO 0x0000031c
#define RX_BCAST_PKTS 0x00000320
#define RX_BCAST_PKTS_LO 0x00000324
#define RX_MCAST_PKTS 0x00000328
#define RX_MCAST_PKTS_LO 0x0000032c
#define RX_UCAST_PKTS 0x00000330
#define RX_UCAST_PKTS_LO 0x00000334
#define RX_UNDERSIZE_PKTS 0x00000338
#define RX_UNDERSIZE_PKTS_LO 0x0000033c
#define RX_OVERSIZE_PKTS 0x00000340
#define RX_OVERSIZE_PKTS_LO 0x00000344
#define RX_JABBER_PKTS 0x00000348
#define RX_JABBER_PKTS_LO 0x0000034c
#define RX_UNDERSIZE_FCERR_PKTS 0x00000350
#define RX_UNDERSIZE_FCERR_PKTS_LO 0x00000354
#define RX_DROP_EVENTS 0x00000358
#define RX_DROP_EVENTS_LO 0x0000035c
#define RX_FCERR_PKTS 0x00000360
#define RX_FCERR_PKTS_LO 0x00000364
#define RX_ALIGN_ERR 0x00000368
#define RX_ALIGN_ERR_LO 0x0000036c
#define RX_SYMBOL_ERR 0x00000370
#define RX_SYMBOL_ERR_LO 0x00000374
#define RX_MAC_ERR 0x00000378
#define RX_MAC_ERR_LO 0x0000037c
#define RX_CTL_PKTS 0x00000380
#define RX_CTL_PKTS_LO 0x00000384
#define RX_PAUSE_PKTS 0x00000388
#define RX_PAUSE_PKTS_LO 0x0000038c
#define RX_64_PKTS 0x00000390
#define RX_64_PKTS_LO 0x00000394
#define RX_65_TO_127_PKTS 0x00000398
#define RX_65_TO_127_PKTS_LO 0x0000039c
#define RX_128_255_PKTS 0x000003a0
#define RX_128_255_PKTS_LO 0x000003a4
#define RX_256_511_PKTS 0x000003a8
#define RX_256_511_PKTS_LO 0x000003ac
#define RX_512_TO_1023_PKTS 0x000003b0
#define RX_512_TO_1023_PKTS_LO 0x000003b4
#define RX_1024_TO_1518_PKTS 0x000003b8
#define RX_1024_TO_1518_PKTS_LO 0x000003bc
#define RX_1519_TO_MAX_PKTS 0x000003c0
#define RX_1519_TO_MAX_PKTS_LO 0x000003c4
#define RX_LEN_ERR_PKTS 0x000003c8
#define RX_LEN_ERR_PKTS_LO 0x000003cc
#define MDIO_TX_DATA 0x00000400
#define MDIO_RX_DATA 0x00000410
#define MDIO_CMD 0x00000420
#define MDIO_PHY_ADDR 0x00000430
#define MDIO_PORT 0x00000440
#define MDIO_STATUS 0x00000450
#define TX_CBFC_PAUSE_FRAMES0 0x00000500
#define TX_CBFC_PAUSE_FRAMES0_LO 0x00000504
#define TX_CBFC_PAUSE_FRAMES1 0x00000508
#define TX_CBFC_PAUSE_FRAMES1_LO 0x0000050C
#define TX_CBFC_PAUSE_FRAMES2 0x00000510
#define TX_CBFC_PAUSE_FRAMES2_LO 0x00000514
#define TX_CBFC_PAUSE_FRAMES3 0x00000518
#define TX_CBFC_PAUSE_FRAMES3_LO 0x0000051C
#define TX_CBFC_PAUSE_FRAMES4 0x00000520
#define TX_CBFC_PAUSE_FRAMES4_LO 0x00000524
#define TX_CBFC_PAUSE_FRAMES5 0x00000528
#define TX_CBFC_PAUSE_FRAMES5_LO 0x0000052C
#define TX_CBFC_PAUSE_FRAMES6 0x00000530
#define TX_CBFC_PAUSE_FRAMES6_LO 0x00000534
#define TX_CBFC_PAUSE_FRAMES7 0x00000538
#define TX_CBFC_PAUSE_FRAMES7_LO 0x0000053C
#define TX_FCOE_PKTS 0x00000540
#define TX_FCOE_PKTS_LO 0x00000544
#define TX_MGMT_PKTS 0x00000548
#define TX_MGMT_PKTS_LO 0x0000054C
#define RX_CBFC_PAUSE_FRAMES0 0x00000568
#define RX_CBFC_PAUSE_FRAMES0_LO 0x0000056C
#define RX_CBFC_PAUSE_FRAMES1 0x00000570
#define RX_CBFC_PAUSE_FRAMES1_LO 0x00000574
#define RX_CBFC_PAUSE_FRAMES2 0x00000578
#define RX_CBFC_PAUSE_FRAMES2_LO 0x0000057C
#define RX_CBFC_PAUSE_FRAMES3 0x00000580
#define RX_CBFC_PAUSE_FRAMES3_LO 0x00000584
#define RX_CBFC_PAUSE_FRAMES4 0x00000588
#define RX_CBFC_PAUSE_FRAMES4_LO 0x0000058C
#define RX_CBFC_PAUSE_FRAMES5 0x00000590
#define RX_CBFC_PAUSE_FRAMES5_LO 0x00000594
#define RX_CBFC_PAUSE_FRAMES6 0x00000598
#define RX_CBFC_PAUSE_FRAMES6_LO 0x0000059C
#define RX_CBFC_PAUSE_FRAMES7 0x000005A0
#define RX_CBFC_PAUSE_FRAMES7_LO 0x000005A4
#define RX_FCOE_PKTS 0x000005A8
#define RX_FCOE_PKTS_LO 0x000005AC
#define RX_MGMT_PKTS 0x000005B0
#define RX_MGMT_PKTS_LO 0x000005B4
#define RX_NIC_FIFO_DROP 0x000005B8
#define RX_NIC_FIFO_DROP_LO 0x000005BC
#define RX_FCOE_FIFO_DROP 0x000005C0
#define RX_FCOE_FIFO_DROP_LO 0x000005C4
#define RX_MGMT_FIFO_DROP 0x000005C8
#define RX_MGMT_FIFO_DROP_LO 0x000005CC
#define RX_PKTS_PRIORITY0 0x00000600
#define RX_PKTS_PRIORITY0_LO 0x00000604
#define RX_PKTS_PRIORITY1 0x00000608
#define RX_PKTS_PRIORITY1_LO 0x0000060C
#define RX_PKTS_PRIORITY2 0x00000610
#define RX_PKTS_PRIORITY2_LO 0x00000614
#define RX_PKTS_PRIORITY3 0x00000618
#define RX_PKTS_PRIORITY3_LO 0x0000061C
#define RX_PKTS_PRIORITY4 0x00000620
#define RX_PKTS_PRIORITY4_LO 0x00000624
#define RX_PKTS_PRIORITY5 0x00000628
#define RX_PKTS_PRIORITY5_LO 0x0000062C
#define RX_PKTS_PRIORITY6 0x00000630
#define RX_PKTS_PRIORITY6_LO 0x00000634
#define RX_PKTS_PRIORITY7 0x00000638
#define RX_PKTS_PRIORITY7_LO 0x0000063C
#define RX_OCTETS_PRIORITY0 0x00000640
#define RX_OCTETS_PRIORITY0_LO 0x00000644
#define RX_OCTETS_PRIORITY1 0x00000648
#define RX_OCTETS_PRIORITY1_LO 0x0000064C
#define RX_OCTETS_PRIORITY2 0x00000650
#define RX_OCTETS_PRIORITY2_LO 0x00000654
#define RX_OCTETS_PRIORITY3 0x00000658
#define RX_OCTETS_PRIORITY3_LO 0x0000065C
#define RX_OCTETS_PRIORITY4 0x00000660
#define RX_OCTETS_PRIORITY4_LO 0x00000664
#define RX_OCTETS_PRIORITY5 0x00000668
#define RX_OCTETS_PRIORITY5_LO 0x0000066C
#define RX_OCTETS_PRIORITY6 0x00000670
#define RX_OCTETS_PRIORITY6_LO 0x00000674
#define RX_OCTETS_PRIORITY7 0x00000678
#define RX_OCTETS_PRIORITY7_LO 0x0000067C
#define TX_PKTS_PRIORITY0 0x00000680
#define TX_PKTS_PRIORITY0_LO 0x00000684
#define TX_PKTS_PRIORITY1 0x00000688
#define TX_PKTS_PRIORITY1_LO 0x0000068C
#define TX_PKTS_PRIORITY2 0x00000690
#define TX_PKTS_PRIORITY2_LO 0x00000694
#define TX_PKTS_PRIORITY3 0x00000698
#define TX_PKTS_PRIORITY3_LO 0x0000069C
#define TX_PKTS_PRIORITY4 0x000006A0
#define TX_PKTS_PRIORITY4_LO 0x000006A4
#define TX_PKTS_PRIORITY5 0x000006A8
#define TX_PKTS_PRIORITY5_LO 0x000006AC
#define TX_PKTS_PRIORITY6 0x000006B0
#define TX_PKTS_PRIORITY6_LO 0x000006B4
#define TX_PKTS_PRIORITY7 0x000006B8
#define TX_PKTS_PRIORITY7_LO 0x000006BC
#define TX_OCTETS_PRIORITY0 0x000006C0
#define TX_OCTETS_PRIORITY0_LO 0x000006C4
#define TX_OCTETS_PRIORITY1 0x000006C8
#define TX_OCTETS_PRIORITY1_LO 0x000006CC
#define TX_OCTETS_PRIORITY2 0x000006D0
#define TX_OCTETS_PRIORITY2_LO 0x000006D4
#define TX_OCTETS_PRIORITY3 0x000006D8
#define TX_OCTETS_PRIORITY3_LO 0x000006DC
#define TX_OCTETS_PRIORITY4 0x000006E0
#define TX_OCTETS_PRIORITY4_LO 0x000006E4
#define TX_OCTETS_PRIORITY5 0x000006E8
#define TX_OCTETS_PRIORITY5_LO 0x000006EC
#define TX_OCTETS_PRIORITY6 0x000006F0
#define TX_OCTETS_PRIORITY6_LO 0x000006F4
#define TX_OCTETS_PRIORITY7 0x000006F8
#define TX_OCTETS_PRIORITY7_LO 0x000006FC
#define RX_DISCARD_PRIORITY0 0x00000700
#define RX_DISCARD_PRIORITY0_LO 0x00000704
#define RX_DISCARD_PRIORITY1 0x00000708
#define RX_DISCARD_PRIORITY1_LO 0x0000070C
#define RX_DISCARD_PRIORITY2 0x00000710
#define RX_DISCARD_PRIORITY2_LO 0x00000714
#define RX_DISCARD_PRIORITY3 0x00000718
#define RX_DISCARD_PRIORITY3_LO 0x0000071C
#define RX_DISCARD_PRIORITY4 0x00000720
#define RX_DISCARD_PRIORITY4_LO 0x00000724
#define RX_DISCARD_PRIORITY5 0x00000728
#define RX_DISCARD_PRIORITY5_LO 0x0000072C
#define RX_DISCARD_PRIORITY6 0x00000730
#define RX_DISCARD_PRIORITY6_LO 0x00000734
#define RX_DISCARD_PRIORITY7 0x00000738
#define RX_DISCARD_PRIORITY7_LO 0x0000073C
#define CQ0_ID 0x0
#define NIC_CORE 0x1
/* Routing Index Register 0xE4 */
#define ROUTING_INDEX_MW BIT_31
#define ROUTING_INDEX_DEFAULT_ENABLE_MASK (0x8320000u)
#define ROUTING_INDEX_DEFAULT_DISABLE_MASK (0x0320000u)
/* Routing Data Register 0xE8 */
#define ROUTE_AS_CAM_HIT 0x80
#define ROUTE_AS_BCAST_MCAST_MATCH 0x8000u
#define ROUTE_AS_VALID_PKT 0x800000u /* promiscuous mode? */
enum {
ROUTING_MASK_INDEX_CAM_HIT,
ROUTING_MASK_INDEX_BCAST_MCAST_MATCH,
ROUTING_MASK_INDEX_VALID_PKT,
ROUTING_MASK_INDEX_TOTAL
};
#define ROUTING_MASK_INDEX_MAX 16
/*
* General definitions...
*/
/*
* Below are a number compiler switches for controlling driver behavior.
* Some are not supported under certain conditions and are notated as such.
*/
/* MTU & Frame Size stuff */
#define JUMBO_MTU 9000
#define NORMAL_FRAME_SIZE 2500 /* ETHERMTU,1500 */
#define JUMBO_FRAME_SIZE 9600
#define LRG_BUF_NORMAL_SIZE NORMAL_FRAME_SIZE
#define LRG_BUF_JUMBO_SIZE JUMBO_FRAME_SIZE
#define VLAN_ID_LEN 2
#define VLAN_HEADER_LEN sizeof (struct ether_vlan_header) /* 18 */
#define ETHER_HEADER_LEN sizeof (struct ether_header) /* 14 */
#define NUM_TX_RING_ENTRIES (1024)
#define NUM_RX_RING_ENTRIES (1024)
#define NUM_SMALL_BUFFERS (1024)
#define NUM_LARGE_BUFFERS (1024)
#define RX_TX_RING_SHADOW_SPACE 2 /* 1st one is wqicb and 2nd for cqicb */
#define BUF_Q_PTR_SPACE ((((NUM_SMALL_BUFFERS * sizeof (uint64_t)) \
/ VM_PAGE_SIZE) + 1) + \
(((NUM_LARGE_BUFFERS * sizeof (uint64_t)) \
/ VM_PAGE_SIZE) + 1))
#define MAX_CQ 128
#define DFLT_RX_COALESCE_WAIT 90 /* usec wait for coalescing */
#define DFLT_RX_INTER_FRAME_WAIT 30 /* max interframe-wait for */
/* coalescing */
#define DFLT_TX_COALESCE_WAIT 90 /* usec wait for coalescing */
#define DFLT_TX_INTER_FRAME_WAIT 30 /* max interframe-wait for */
/* coalescing */
#define DFLT_RX_COALESCE_WAIT_JUMBO 40 /* usec wait for coalescing */
#define DFLT_RX_INTER_FRAME_WAIT_JUMBO 10 /* max interframe-wait for */
/* coalescing */
#define DFLT_TX_COALESCE_WAIT_JUMBO 40 /* usec wait for coalescing */
#define DFLT_TX_INTER_FRAME_WAIT_JUMBO 10 /* max interframe-wait for */
/* coalescing */
#define DFLT_PAYLOAD_COPY_THRESH 6 /* must be at least 6 usec */
#define UDELAY_COUNT 3
#define UDELAY_DELAY 10
#define MAX_RX_RINGS 128
#define MAX_TX_RINGS 16
/*
* Large & Small Buffers for Receives
*/
struct lrg_buf_q_entry {
uint32_t addr0_lower;
#define IAL_LAST_ENTRY 0x00000001
#define IAL_CONT_ENTRY 0x00000002
#define IAL_FLAG_MASK 0x00000003
uint32_t addr0_upper;
};
struct bufq_addr_element {
uint32_t addr_low;
uint32_t addr_high;
};
#define QL_NO_RESET 0
#define QL_DO_RESET 1
/* Link must be in one of these states */
enum link_state_t {
LS_DOWN,
LS_UP
};
/* qlge->flags definitions. */
#define INTERRUPTS_ENABLED BIT_0
#define ADAPTER_ERROR BIT_1
#define ADAPTER_SUSPENDED BIT_8
/*
* ISP PCI Configuration Register Set structure definitions.
*/
typedef volatile struct
{
volatile uint16_t vendor_id;
volatile uint16_t device_id;
volatile uint16_t command;
volatile uint16_t status;
volatile uint8_t revision;
volatile uint8_t prog_class;
volatile uint8_t sub_class;
volatile uint8_t base_class;
volatile uint8_t cache_line_size;
volatile uint8_t latency_timer;
volatile uint8_t header_type;
volatile uint32_t io_base_address;
volatile uint32_t pci_cntl_reg_set_mem_base_address_lower;
volatile uint32_t pci_cntl_reg_set_mem_base_address_upper;
volatile uint32_t pci_doorbell_mem_base_address_lower;
volatile uint32_t pci_doorbell_mem_base_address_upper;
volatile uint16_t sub_vendor_id;
volatile uint16_t sub_device_id;
volatile uint32_t expansion_rom;
volatile uint8_t intr_line;
volatile uint8_t intr_pin;
volatile uint8_t min_grant;
volatile uint8_t max_latency;
volatile uint16_t pcie_device_control;
volatile uint16_t link_status;
volatile uint16_t msi_msg_control;
volatile uint16_t msi_x_msg_control;
} pci_cfg_t;
/*
*
* Schultz Control Registers Index
*
*/
#define REG_PROCESSOR_ADDR 0x00
#define REG_PROCESSOR_DATA 0x04
#define REG_SYSTEM 0x08
#define REG_RESET_FAILOVER 0x0C
#define REG_FUNCTION_SPECIFIC_CONTROL 0x10
#define REG_HOST_CMD_STATUS 0x14
#define REG_ICB_RID 0x1C
#define REG_ICB_ACCESS_ADDRESS_LOWER 0x20
#define REG_ICB_ACCESS_ADDRESS_UPPER 0x24
#define REG_CONFIGURATION 0x28
#define INTR_EN_INTR_MASK 0x007f0000
#define INTR_EN_TYPE_MASK 0x03000000
#define INTR_EN_TYPE_ENABLE 0x00000100
#define INTR_EN_TYPE_DISABLE 0x00000200
#define INTR_EN_TYPE_READ 0x00000300
#define INTR_EN_IHD 0x00002000
#define INTR_EN_IHD_MASK (INTR_EN_IHD << 16)
#define INTR_EN_EI 0x00004000
#define INTR_EN_EN 0x00008000
#define REG_STATUS 0x30
#define REG_INTERRUPT_ENABLE 0x34
#define REG_INTERRUPT_MASK 0x38
#define REG_INTERRUPT_STATUS_1 0x3C
#define REG_ERROR_STATUS 0x54
#define REG_SEMAPHORE 0x64
#define REG_XGMAC_ADDRESS 0x78
#define REG_XGMAC_DATA 0x7C
#define REG_NIC_ENHANCED_TX_SCHEDULE 0x80
#define REG_CNA_ENHANCED_TX_SCHEDULE 0x84
#define REG_FLASH_ADDRESS 0x88
#define REG_FLASH_DATA 0x8C
#define REG_STOP_CQ_PROCESSING 0x90
#define REG_PAGE_TABLE_RID 0x94
#define REG_WQ_PAGE_TABLE_BASE_ADDR_LOWER 0x98
#define REG_WQ_PAGE_TABLE_BASE_ADDR_UPPER 0x9C
#define REG_CQ_PAGE_TABLE_BASE_ADDR_LOWER 0xA0
#define REG_CQ_PAGE_TABLE_BASE_ADDR_UPPER 0xA4
#define REG_MAC_PROTOCOL_ADDRESS_INDEX 0xA8
#define REG_MAC_PROTOCOL_DATA 0xAC
#define REG_SPLIT_HEADER 0xC0
#define REG_NIC_RECEIVE_CONFIGURATION 0xD4
#define REG_MGMT_RCV_CFG 0xE0
#define REG_ROUTING_INDEX 0xE4
#define REG_ROUTING_DATA 0xE8
#define REG_RSVD7 0xEC
#define REG_XG_SERDES_ADDR 0xF0
#define REG_XG_SERDES_DATA 0xF4
#define REG_PRB_MX_ADDR 0xF8
#define REG_PRB_MX_DATA 0xFC
#define INTR_MASK_PI 0x00000001
#define INTR_MASK_HL0 0x00000002
#define INTR_MASK_LH0 0x00000004
#define INTR_MASK_HL1 0x00000008
#define INTR_MASK_LH1 0x00000010
#define INTR_MASK_SE 0x00000020
#define INTR_MASK_LSC 0x00000040
#define INTR_MASK_MC 0x00000080
#define INTR_MASK_LINK_IRQS = (INTR_MASK_LSC | INTR_MASK_SE | INTR_MASK_MC)
/* Interrupt Enable Register 0x34 */
#define INTR_ENABLED 0x8000
#define GLOBAL_ENABLE_INTR 0x4000
#define ENABLE_MSI_MULTI_INTR 0x2000
#define ONE_INTR_MASK 0x3FF0000u
#define ENABLE_INTR 0x0100
#define DISABLE_INTR 0x0200
#define VERIFY_INTR_ENABLED 0x0300
#define ISP_ENABLE_INTR(qlge) ql_put32(qlge, \
REG_INTERRUPT_ENABLE,\
(ONE_INTR_MASK | ENABLE_INTR))
#define ISP_DISABLE_INTR(qlge) ql_put32(qlge, \
REG_INTERRUPT_ENABLE, \
(ONE_INTR_MASK | DISABLE_INTR))
#define ISP_ENABLE_PI_INTR(qlge) ql_put32(qlge, \
REG_INTERRUPT_MASK, (BIT_16|1))
#define ISP_DISABLE_PI_INTR(qlge) ql_put32(qlge, \
REG_INTERRUPT_MASK, BIT_16)
#define ISP_ENABLE_GLOBAL_INTRS(qlge) { \
ql_put32(qlge, REG_INTERRUPT_ENABLE, \
(0x40000000u | GLOBAL_ENABLE_INTR)); \
qlge->flags |= INTERRUPTS_ENABLED; \
}
#define ISP_DISABLE_GLOBAL_INTRS(qlge) { \
ql_put32(qlge, \
REG_INTERRUPT_ENABLE, (0x40000000u)); \
qlge->flags &= ~INTERRUPTS_ENABLED; \
}
#define REQ_Q_VALID 0x10
#define RSP_Q_VALID 0x10
/*
* Mailbox Registers
*/
#define MPI_REG 0x1002
#define NUM_MAILBOX_REGS 16
#define FUNC_0_IN_MAILBOX_0_REG_OFFSET 0x1180
#define FUNC_0_OUT_MAILBOX_0_REG_OFFSET 0x1190
#define FUNC_1_IN_MAILBOX_0_REG_OFFSET 0x1280
#define FUNC_1_OUT_MAILBOX_0_REG_OFFSET 0x1290
/*
* Control Register Set definitions.
*/
typedef volatile struct
{
volatile uint32_t processor_address; /* 0x00 */
volatile uint32_t processor_data; /* 0x04 */
volatile uint32_t system_data; /* 0x08 */
volatile uint32_t reset_failover; /* 0x0C */
volatile uint32_t function_specific_control; /* 0x10 */
volatile uint32_t host_command_status; /* 0x14 */
volatile uint32_t led; /* 0x18 */
volatile uint32_t icb_rid; /* 0x1c */
volatile uint32_t idb_access_address_low; /* 0x20 */
volatile uint32_t idb_access_address_high; /* 0x24 */
volatile uint32_t configuration; /* 0x28 */
volatile uint32_t bios_base; /* 0x2C */
volatile uint32_t status; /* 0x30 */
volatile uint32_t interrupt_enable; /* 0x34 */
volatile uint32_t interrupt_mask; /* 0x38 */
volatile uint32_t interrupt_status_1; /* 0x3c */
volatile uint32_t interrupt_status_2; /* 0x40 */
volatile uint32_t interrupt_status_3; /* 0x44 */
volatile uint32_t interrupt_status_4; /* 0x48 */
volatile uint32_t rev_id; /* 0x4c */
volatile uint32_t force_ecc_error; /* 0x50 */
volatile uint32_t error_status; /* 0x54 */
volatile uint32_t internal_ram_debug_address; /* 0x58 */
volatile uint32_t internal_ram_data; /* 0x5c */
volatile uint32_t correctable_ecc_error; /* 0x60 */
volatile uint32_t semaphore; /* 0x64 */
volatile uint32_t gpio1; /* 0x68 */
volatile uint32_t gpio2; /* 0x6c */
volatile uint32_t gpio3; /* 0x70 */
volatile uint32_t reserved1; /* 0x74 */
volatile uint32_t xgmac_address; /* 0x78 */
volatile uint32_t xgmac_data; /* 0x7c */
volatile uint32_t nic_enhanced_tx_schedule; /* 0x80 */
volatile uint32_t cna_enhanced_tx_schedule; /* 0x84 */
volatile uint32_t flash_address; /* 0x88 */
volatile uint32_t flash_data; /* 0x8c */
volatile uint32_t stop_cq; /* 0x90 */
volatile uint32_t page_table_rid; /* 0x94 */
volatile uint32_t wq_page_table_base_address_lower; /* 0x98 */
volatile uint32_t wq_page_table_base_address_upper; /* 0x9c */
volatile uint32_t cq_page_table_base_address_lower; /* 0xA0 */
volatile uint32_t cq_page_table_base_address_upper; /* 0xA4 */
volatile uint32_t mac_protocol_address_index; /* 0xA8 */
volatile uint32_t mac_protocol_data; /* 0xAc */
volatile uint32_t cos_default_cq_reg1; /* 0xB0 */
volatile uint32_t cos_default_cq_reg2; /* 0xB4 */
volatile uint32_t ethertype_skip_reg1; /* 0xB8 */
volatile uint32_t ethertype_skip_reg2; /* 0xBC */
volatile uint32_t split_header; /* 0xC0 */
volatile uint32_t fcoe_pause_threshold; /* 0xC4 */
volatile uint32_t nic_pause_threshold; /* 0xC8 */
volatile uint32_t fc_ethertype; /* 0xCC */
volatile uint32_t fcoe_recv_configuration; /* 0xD0 */
volatile uint32_t nic_recv_configuration; /* 0xD4 */
volatile uint32_t cos_tags_in_fcoe_fifo; /* 0xD8 */
volatile uint32_t cos_tags_in_nic_fifo; /* 0xDc */
volatile uint32_t mgmt_recv_configuration; /* 0xE0 */
volatile uint32_t routing_index; /* 0xE4 */
volatile uint32_t routing_data; /* 0xE8 */
volatile uint32_t reserved2; /* 0xEc */
volatile uint32_t xg_serdes_address; /* 0xF0 */
volatile uint32_t xg_serdes_data; /* 0xF4 */
volatile uint32_t probe_mux_address; /* 0xF8 */
volatile uint32_t probe_mux_read_data; /* 0xFc */
#define INTR_PENDING (uint32_t)(CSR_COMPLETION_INTR)
} dev_reg_t;
typedef volatile struct
{
volatile uint32_t doorbell_reg_address[256]; /* 0x00 */
} dev_doorbell_reg_t;
#define SET_RMASK(val) ((val & 0xffff) | (val << 16))
#define CLR_RMASK(val) (0 | (val << 16))
/*
* DMA registers read only
*/
typedef volatile struct
{
volatile uint32_t req_q_out;
volatile uint32_t rsp_q_in;
} iop_dmaregs_t;
#define DMAREGS_SIZE (sizeof (iop_dmaregs_t))
#define DUMMY_SIZE (32*1024)
#ifdef QL_DEBUG
typedef struct crash_record {
uint16_t fw_major_version; /* 00 - 01 */
uint16_t fw_minor_version; /* 02 - 03 */
uint16_t fw_patch_version; /* 04 - 05 */
uint16_t fw_build_version; /* 06 - 07 */
uint8_t build_date[16]; /* 08 - 17 */
uint8_t build_time[16]; /* 18 - 27 */
uint8_t build_user[16]; /* 28 - 37 */
uint8_t card_serial_num[16]; /* 38 - 47 */
uint32_t time_of_crash_in_secs; /* 48 - 4B */
uint32_t time_of_crash_in_ms; /* 4C - 4F */
uint16_t outb_risc_sd_num_frames; /* 50 - 51 */
uint16_t oap_sd_length; /* 52 - 53 */
uint16_t iap_sd_num_frames; /* 54 - 55 */
uint16_t inb_risc_sd_length; /* 56 - 57 */
uint8_t reserved[28]; /* 58 - 7F */
uint8_t outb_risc_reg_dump[256]; /* 80 -17F */
uint8_t inb_risc_reg_dump[256]; /* 180 -27F */
uint8_t inb_outb_risc_stack_dump[1]; /* 280 - ??? */
} crash_record_t;
#endif
/*
* I/O register access macros
* #if QL_DEBUG & 1
*/
#define RD_REG_BYTE(qlge, addr) \
ddi_get8(qlge->dev_handle, (uint8_t *)addr)
#define RD_REG_DWORD(qlge, addr) \
ddi_get32(qlge->dev_handle, (uint32_t *)addr)
#define WRT_REG_BYTE(qlge, addr, data) \
ddi_put8(qlge->dev_handle, (uint8_t *)addr, data)
#define WRT_REG_WORD(qlge, addr, data) \
ddi_put16(qlge->dev_handle, (uint16_t *)addr, data)
#define WRT_REG_DWORD(qlge, addr, data) \
ddi_put32(qlge->dev_handle, (uint32_t *)addr, data)
/*
* QLGE-specific ioctls ...
*/
#define QLA_IOC ((((('Q' << 8) + 'L') << 8) + 'A') << 8)
/*
* Definition of ioctls commands
*/
#define QLA_PCI_STATUS (QLA_IOC|1) /* Read all PCI registers */
#define QLA_WRITE_REG (QLA_IOC|3)
#define QLA_READ_PCI_REG (QLA_IOC|4)
#define QLA_WRITE_PCI_REG (QLA_IOC|5)
#define QLA_GET_DBGLEAVEL (QLA_IOC|6)
#define QLA_SET_DBGLEAVEL (QLA_IOC|7)
#define QLA_READ_CONTRL_REGISTERS (QLA_IOC|8)
#define QLA_MANUAL_READ_FLASH (QLA_IOC|9)
#define QLA_MANUAL_WRITE_FLASH (QLA_IOC|10)
#define QLA_SUPPORTED_DUMP_TYPES (QLA_IOC|11)
#define QLA_GET_BINARY_CORE_DUMP (QLA_IOC|12)
#define QLA_TRIGGER_SYS_ERROR_EVENT (QLA_IOC|13)
#define QLA_READ_FLASH (QLA_IOC|15)
#define QLA_WRITE_FLASH (QLA_IOC|16)
#define QLA_READ_VPD (QLA_IOC|17)
#define QLA_GET_PROP (QLA_IOC|18)
#define QLA_SHOW_REGION (QLA_IOC|19)
#define QLA_LIST_ADAPTER_INFO (QLA_IOC|20)
#define QLA_READ_FW_IMAGE (QLA_IOC|21)
#define QLA_WRITE_FW_IMAGE_HEADERS (QLA_IOC|22)
#define QLA_CONTINUE_COPY_IN (QLA_IOC|29)
#define QLA_CONTINUE_COPY_OUT (QLA_IOC|30)
#define QLA_SOFT_RESET (QLA_IOC|31)
#define QLA_IOCTL_CMD_FIRST QLA_PCI_STATUS
#define QLA_IOCTL_CMD_LAST QLA_SOFT_RESET
/* Solaris IOCTL can copy in&out up to 1024 bytes each time */
#define IOCTL_BUFFER_SIZE 1024
#define IOCTL_MAX_BUF_SIZE (IOCTL_BUFFER_SIZE*512) /* 512k */
typedef struct ioctl_header_info {
uint8_t version;
uint8_t reserved;
uint8_t option[2];
uint16_t expected_trans_times;
uint16_t payload_length;
uint32_t total_length;
} ioctl_header_info_t;
#define IOCTL_HEADER_LEN sizeof (ioctl_header_info_t)
#define IOCTL_MAX_DATA_LEN (IOCTL_BUFFER_SIZE - IOCTL_HEADER_LEN)
struct ql_pci_reg {
uint16_t addr; /* register number [0..ff] */
uint16_t value; /* data to write/data read */
};
struct ql_device_reg {
uint32_t addr; /* address to write/data read */
uint32_t value; /* data to write/data read */
};
struct ql_flash_io_info {
uint32_t addr; /* register number [0..ff] */
uint32_t size; /* number of data to write/data read */
};
struct qlnic_mpi_version_info {
uint32_t fw_version;
uint32_t phy_version;
};
struct qlnic_link_status_info {
uint32_t link_status_info;
uint32_t additional_info;
uint32_t network_hw_info;
uint32_t dcbx_frame_counters_info;
uint32_t change_counters_info;
};
struct qlnic_prop_info {
struct qlnic_mpi_version_info mpi_version; /* MPI Version */
uint32_t fw_state; /* MPI state */
struct qlnic_link_status_info link_status; /* Link Status */
};
typedef struct ql_adapter_info {
uint32_t pci_binding; /* /bus/dev/func number per IEEE 1277 format */
uint16_t vendor_id;
uint16_t device_id;
uint16_t sub_vendor_id;
uint16_t sub_device_id;
struct ether_addr cur_addr;
} ql_adapter_info_t;
#define DUMP_DESCRIPTION_HEADER_SIGNATURE 0x42535451 /* "QTSB" */
typedef struct ql_dump_header {
uint32_t signature; /* QTSB */
uint8_t version;
uint8_t length;
uint8_t num_dumps;
uint8_t reserved;
uint32_t time_stamp_lo;
uint32_t time_stamp_hi;
} ql_dump_header_t;
#define DUMP_IMAGE_HEADER_SIGNATURE 0x504D4451 /* "QDMP" */
typedef struct ql_dump_image_header {
uint32_t signature; /* QDMP */
uint8_t version;
uint8_t header_length;
uint16_t checksum;
uint32_t data_type;
#define DUMP_TYPE_CORE_DUMP 1
#define DUMP_TYPE_REGISTER_DUMP 2
#define DUMP_TYPE_DRIVER_DUMP 3
uint32_t data_length;
} ql_dump_image_header_t;
/* utility request */
#define DUMP_REQUEST_CORE BIT_1
#define DUMP_REQUEST_REGISTER BIT_2
#define DUMP_REQUEST_DRIVER BIT_3
#define DUMP_REQUEST_ALL BIT_7
#define DUMP_DESCRIPTION_FOOTER_SIGNATURE 0x45535451 /* "QTSE" */
typedef struct ql_dump_footer {
uint32_t signature; /* QTSE */
uint8_t version;
uint8_t length;
uint16_t reserved;
uint32_t time_stamp_lo;
uint32_t time_stamp_hi;
} ql_dump_footer_t;
/*
* Solaris qlnic exit status.
*/
#define QN_ERR_BASE 0x30000000
#define QN_ERR_OK QN_ERR_BASE | 0 /* Success */
#define QN_ERR_NOT_SUPPORTED QN_ERR_BASE | 1 /* Command not supported */
#define QN_ERR_INVALID_PARAM QN_ERR_BASE | 2 /* Invalid parameter */
#define QN_ERR_WRONG_NO_PARAM QN_ERR_BASE | 3 /* Wrong number of parameters */
#define QN_ERR_FILE_NOT_FOUND QN_ERR_BASE | 4 /* File not found */
#define QN_ERR_FILE_READ_ERR QN_ERR_BASE | 5 /* File read err */
#define QN_ERR_FILE_WRITE_ERR QN_ERR_BASE | 6 /* File write err */
#define QN_ERR_NO_MEMORY QN_ERR_BASE | 7 /* No Memory */
#define FLT_REGION_FDT 0x1A
#define ISP_8100_FDT_ADDR 0x360000
#define ISP_8100_FDT_SIZE 0x80
#define FLT_REGION_FLT 0x1C
#define ISP_8100_FLT_ADDR 0x361000
#define ISP_8100_FLT_SIZE 0x1000
#define FLT_REGION_NIC_BOOT_CODE 0x2E
#define ISP_8100_NIC_BOOT_CODE_ADDR 0x0
#define ISP_8100_NIC_BOOT_CODE_SIZE 0x80000
#define FLT_REGION_MPI_FW_USE 0x42
#define ISP_8100_MPI_FW_USE_ADDR 0xF0000
#define ISP_8100_MPI_FW_USE_SIZE 0x10000
#define FLT_REGION_MPI_RISC_FW 0x40
#define ISP_8100_MPI_RISC_FW_ADDR 0x100000
#define ISP_8100_MPI_RISC_FW_SIZE 0x10000
#define FLT_REGION_VPD0 0x2C
#define ISP_8100_VPD0_ADDR 0x140000
#define ISP_8100_VPD0_SIZE 0x200
#define FLT_REGION_NIC_PARAM0 0x46
#define ISP_8100_NIC_PARAM0_ADDR 0x140200
#define ISP_8100_NIC_PARAM0_SIZE 0x200
#define FLT_REGION_VPD1 0x2D
#define ISP_8100_VPD1_ADDR 0x140400
#define ISP_8100_VPD1_SIZE 0x200
#define FLT_REGION_NIC_PARAM1 0x47
#define ISP_8100_NIC_PARAM1_ADDR 0x140600
#define ISP_8100_NIC_PARAM1_SIZE 0x200
#define FLT_REGION_MPI_CFG 0x41
#define ISP_8100_MPI_CFG_ADDR 0x150000
#define ISP_8100_MPI_CFG_SIZE 0x10000
#define FLT_REGION_EDC_PHY_FW 0x45
#define ISP_8100_EDC_PHY_FW_ADDR 0x170000
#define ISP_8100_EDC_PHY_FW_SIZE 0x20000
#define FLT_REGION_FC_BOOT_CODE 0x07
#define ISP_8100_FC_BOOT_CODE_ADDR 0x200000
#define ISP_8100_FC_BOOT_CODE_SIZE 0x80000
#define FLT_REGION_FC_FW 0x01
#define ISP_8100_FC_FW_ADDR 0x280000
#define ISP_8100_FC_FW_SIZE 0x80000
#define FLT_REGION_FC_VPD0 0x14
#define ISP_8100_FC_VPD0_ADDR 0x340000
#define ISP_8100_FC_VPD0_SIZE 0x200
#define FLT_REGION_FC_NVRAM0 0x15
#define ISP_8100_FC_NVRAM0_ADDR 0x340200
#define ISP_8100_FC_NVRAM0_SIZE 0x200
#define FLT_REGION_FC_VPD1 0x16
#define ISP_8100_FC_VPD1_ADDR 0x340400
#define ISP_8100_FC_VPD1_SIZE 0x200
#define FLT_REGION_FC_NVRAM1 0x17
#define ISP_8100_FC_NVRAM1_ADDR 0x340600
#define ISP_8100_FC_NVRAM1_SIZE 0x200
#define FLT_REGION_FC_BOOT_CODE 0x07
#define ISP_8100_FC_BOOT_CODE_ADDR 0x200000
#define ISP_8100_FC_BOOT_CODE_SIZE 0x80000
#define FLT_REGION_FC_FW 0x01
#define ISP_8100_FC_FW_ADDR 0x280000
#define ISP_8100_FC_FW_SIZE 0x80000
#define FLT_REGION_TIME_STAMP 0x60
/* flash region for testing */
#define FLT_REGION_WIN_FW_DUMP0 0x48
#define ISP_8100_WIN_FW_DUMP0_ADDR 0x190000
#define ISP_8100_WIN_FW_DUMP0_SIZE 0x30000
#define ISP_8100_FLASH_TEST_REGION_ADDR ISP_8100_WIN_FW_DUMP0_ADDR
#define ISP_8100_FLASH_TEST_REGION_SIZE 0x10000
/* mailbox */
#define QL_8XXX_SFP_SIZE 256
#define MAILBOX_TOV 30 /* Default Timeout value. */
/*
* ISP mailbox commands from Host
*/
#define MBC_NO_OPERATION 0 /* No Operation. */
#define MBC_LOAD_RAM 1 /* Load RAM. */
#define MBC_EXECUTE_FIRMWARE 2 /* Execute firmware. */
#define MBC_MAILBOX_REGISTER_TEST 6 /* Mailbox echo test */
#define MBC_VERIFY_CHECKSUM 7 /* Verify checksum. */
#define MBC_ABOUT_FIRMWARE 8 /* About Firmware. */
#define MBC_RISC_MEMORY_COPY 0xA /* Copy RISC memory. */
#define MBC_LOAD_RISC_RAM 0xB /* Load RISC RAM command. */
#define MBC_DUMP_RISC_RAM 0xC /* Dump RISC RAM command. */
#define MBC_INIT_RISC_RAM 0xE
#define MBC_READ_RAM_WORD 0xF /* Read RAM */
#define MBC_STOP_FIRMWARE 0x14 /* Stop firmware */
#define MBC_GENERATE_SYS_ERROR 0x2A /* Generate System Error */
#define MBC_WRITE_SFP 0x30 /* Write SFP. */
#define MBC_READ_SFP 0x31 /* Read SFP. */
#define MBC_INITIALIZE_FIRMWARE 0x60 /* Initialize firmware */
#define MBC_GET_INIT_CTRL_BLOCK 0x61 /* Get Initialization CBLK */
#define MBC_GET_FIRMWARE_STATE 0x69 /* Get firmware state. */
#define MBC_IDC_REQUEST 0x100 /* IDC Request. */
#define IDC_REQ_ALL_DEST_FUNC_MASK BIT_4 /* Mailbox 1 */
#define IDC_REQ_DEST_FUNC_0_MASK BIT_0 /* Mailbox 2 */
#define IDC_REQ_DEST_FUNC_1_MASK BIT_1
#define IDC_REQ_DEST_FUNC_2_MASK BIT_2
#define IDC_REQ_DEST_FUNC_3_MASK BIT_3
enum IDC_REQ_DEST_FUNC {
IDC_REQ_DEST_FUNC_0,
IDC_REQ_DEST_FUNC_1,
IDC_REQ_DEST_FUNC_2,
IDC_REQ_DEST_FUNC_3,
IDC_REQ_DEST_FUNC_ALL = 0x0F
};
#define IDC_REQ_TIMEOUT_MASK 0x01
#define MBC_IDC_ACK 0x101 /* IDC Acknowledge. */
#define MBC_IDC_TIME_EXTENDED 0x102 /* IDC Time Extended. */
#define MBC_SET_WAKE_ON_LANE_MODE 0x110
#define MBC_SET_WAKE_ON_LANE_FILTER 0x111
#define MBC_CLEAR_WAKE_ON_LANE_FILTER 0x112
#define MBC_SET_WAKE_ON_LANE_MAGIC_PKT 0x113
#define MBC_CLEAR_WAKE_ON_LANE_MAGIC_PKT 0x114
#define MBC_PORT_RESET 0x120
#define MBC_SET_PORT_CONFIG 0x122
#define MBC_GET_PORT_CONFIG 0x123
#define ENABLE_JUMBO_FRAME_SIZE_MASK BIT_16
#define MBC_GET_LINK_STATUS 0x124
#define MBC_SET_LED_CONFIG 0x125
#define MBC_GET_LED_CONFIG 0x126
/*
* ISP mailbox command complete status codes
*/
#define MBS_COMMAND_COMPLETE 0x4000
#define MBS_INVALID_COMMAND 0x4001
#define MBS_HOST_INTERFACE_ERROR 0x4002
#define MBS_TEST_FAILED 0x4003
#define MBS_POST_ERROR 0x4004
#define MBS_COMMAND_ERROR 0x4005
#define MBS_COMMAND_PARAMETER_ERROR 0x4006
#define MBS_PORT_ID_USED 0x4007
#define MBS_LOOP_ID_USED 0x4008
#define MBS_ALL_IDS_IN_USE 0x4009
#define MBS_NOT_LOGGED_IN 0x400A
#define MBS_LOOP_DOWN 0x400B
#define MBS_LOOP_BACK_ERROR 0x400C
#define MBS_CHECKSUM_ERROR 0x4010
/* Async Event Status */
#define MBA_IDC_INTERMEDIATE_COMPLETE 0x1000
#define MBA_ASYNC_EVENT 0x8000 /* Asynchronous event. */
#define MBA_SYSTEM_ERR 0x8002
#define MBA_LINK_UP 0x8011
enum {
XFI_NETWORK_INTERFACE = 1,
XAUI_NETWORK_INTERFACE,
XFI_BACKPLANE_INTERFACE,
XAUI_BACKPLANE_INTERFACE,
EXT_10GBASE_T_PHY,
EXT_EXT_EDC_PHY
};
#define MBA_LINK_DOWN 0x8012
#define MBA_IDC_COMPLETE 0x8100
#define MBA_IDC_REQUEST_NOTIFICATION 0x8101
#define MBA_IDC_TIME_EXTENDED 0x8102
#define MBA_DCBX_CONFIG_CHANGE 0x8110
#define MBA_NOTIFICATION_LOST 0x8120
#define MBA_SFT_TRANSCEIVER_INSERTION 0x8130
#define MBA_SFT_TRANSCEIVER_REMOVAL 0x8131
#define MBA_FIRMWARE_INIT_COMPLETE 0x8400
#define MBA_FIRMWARE_INIT_FAILED 0x8401
typedef struct firmware_version_info {
uint8_t reserved;
uint8_t major_version;
uint8_t minor_version;
uint8_t sub_minor_version;
} firmware_version_info_t;
typedef struct phy_firmware_version_info {
uint8_t reserved;
uint8_t major_version;
uint8_t minor_version;
uint8_t sub_minor_version;
} phy_firmware_version_info_t;
#define ENABLE_JUMBO BIT_16
#define STD_PAUSE 0x20
#define PP_PAUSE 0x40
#define DCBX_ENABLE 0x10
#define LOOP_INTERNAL_PARALLEL 0x02
#define LOOP_INTERNAL_SERIAL 0x04
#define LOOP_EXTERNAL_PHY 0x06
typedef struct port_cfg_info {
uint32_t link_cfg;
uint32_t max_frame_size;
} port_cfg_info_t;
enum {
PAUSE_MODE_DISABLED,
PAUSE_MODE_STANDARD, /* Standard Ethernet Pause */
PAUSE_MODE_PER_PRIORITY /* Class Based Pause */
};
/* Mailbox command parameter structure definition. */
typedef struct mbx_cmd {
uint32_t from_mpi; /* number of Incomming from MPI to driver */
uint32_t mb[NUM_MAILBOX_REGS];
clock_t timeout; /* Timeout in seconds. */
} mbx_cmd_t;
/* Returned Mailbox registers. */
typedef struct mbx_data {
uint32_t from_mpi; /* number of Incomming from MPI to driver */
uint32_t mb[NUM_MAILBOX_REGS];
} mbx_data_t;
/* Address/Length pairs for the coredump. */
#define MPI_CORE_REGS_ADDR 0x00030000
#define MPI_CORE_REGS_CNT 127
#define MPI_CORE_SH_REGS_CNT 16
#define TEST_REGS_ADDR 0x00001000
#define TEST_REGS_CNT 23
#define RMII_REGS_ADDR 0x00001040
#define RMII_REGS_CNT 64
#define FCMAC1_REGS_ADDR 0x00001080
#define FCMAC2_REGS_ADDR 0x000010c0
#define FCMAC_REGS_CNT 64
#define FC1_MBX_REGS_ADDR 0x00001100
#define FC2_MBX_REGS_ADDR 0x00001240
#define FC_MBX_REGS_CNT 64
#define IDE_REGS_ADDR 0x00001140
#define IDE_REGS_CNT 64
#define NIC1_MBX_REGS_ADDR 0x00001180
#define NIC2_MBX_REGS_ADDR 0x00001280
#define NIC_MBX_REGS_CNT 64
#define SMBUS_REGS_ADDR 0x00001200
#define SMBUS_REGS_CNT 64
#define I2C_REGS_ADDR 0x00001fc0
#define I2C_REGS_CNT 64
#define MEMC_REGS_ADDR 0x00003000
#define MEMC_REGS_CNT 256
#define PBUS_REGS_ADDR 0x00007c00
#define PBUS_REGS_CNT 256
#define MDE_REGS_ADDR 0x00010000
#define MDE_REGS_CNT 6
#define CODE_RAM_ADDR 0x00020000
#define CODE_RAM_CNT 0x2000
#define MEMC_RAM_ADDR 0x00100000
#define MEMC_RAM_CNT 0x2000
/* 64 probes, 8 bytes per probe + 4 bytes to list the probe ID */
#define PROBE_DATA_LENGTH_WORDS ((64 * 2) + 1)
#define NUMBER_OF_PROBES 34
#define NUMBER_ROUTING_REG_ENTRIES 48
#define WORDS_PER_ROUTING_REG_ENTRY 4
#define MAC_PROTOCOL_REGISTER_WORDS ((512 * 3) + (32 * 2) + (4096 * 1) + \
(4096 * 1) + (4 * 2) + (8 * 2) + \
(16 * 1) + (4 * 1) + (4 * 4) + \
(4 * 1))
/* Save both the address and data register */
#define WORDS_PER_MAC_PROT_ENTRY 2
#define MPI_COREDUMP_COOKIE 0x5555aaaa
typedef struct mpi_coredump_global_header {
uint32_t cookie;
char id_string[16];
uint32_t time_lo;
uint32_t time_hi;
uint32_t total_image_size;
uint32_t global_header_size;
char driver_info[0xE0];
}mpi_coredump_global_header_t;
typedef struct mpi_coredump_segment_header {
uint32_t cookie;
uint32_t seg_number;
uint32_t seg_size;
uint32_t extra;
char description[16];
}mpi_coredump_segment_header_t;
typedef struct ql_mpi_coredump {
mpi_coredump_global_header_t mpi_global_header;
mpi_coredump_segment_header_t core_regs_seg_hdr;
uint32_t mpi_core_regs[MPI_CORE_REGS_CNT];
uint32_t mpi_core_sh_regs[MPI_CORE_SH_REGS_CNT];
mpi_coredump_segment_header_t test_logic_regs_seg_hdr;
uint32_t test_logic_regs[TEST_REGS_CNT];
mpi_coredump_segment_header_t rmii_regs_seg_hdr;
uint32_t rmii_regs[RMII_REGS_CNT];
mpi_coredump_segment_header_t fcmac1_regs_seg_hdr;
uint32_t fcmac1_regs[FCMAC_REGS_CNT];
mpi_coredump_segment_header_t fcmac2_regs_seg_hdr;
uint32_t fcmac2_regs[FCMAC_REGS_CNT];
mpi_coredump_segment_header_t fc1_mbx_regs_seg_hdr;
uint32_t fc1_mbx_regs[FC_MBX_REGS_CNT];
mpi_coredump_segment_header_t ide_regs_seg_hdr;
uint32_t ide_regs[IDE_REGS_CNT];
mpi_coredump_segment_header_t nic1_mbx_regs_seg_hdr;
uint32_t nic1_mbx_regs[NIC_MBX_REGS_CNT];
mpi_coredump_segment_header_t smbus_regs_seg_hdr;
uint32_t smbus_regs[SMBUS_REGS_CNT];
mpi_coredump_segment_header_t fc2_mbx_regs_seg_hdr;
uint32_t fc2_mbx_regs[FC_MBX_REGS_CNT];
mpi_coredump_segment_header_t nic2_mbx_regs_seg_hdr;
uint32_t nic2_mbx_regs[NIC_MBX_REGS_CNT];
mpi_coredump_segment_header_t i2c_regs_seg_hdr;
uint32_t i2c_regs[I2C_REGS_CNT];
mpi_coredump_segment_header_t memc_regs_seg_hdr;
uint32_t memc_regs[MEMC_REGS_CNT];
mpi_coredump_segment_header_t pbus_regs_seg_hdr;
uint32_t pbus_regs[PBUS_REGS_CNT];
mpi_coredump_segment_header_t mde_regs_seg_hdr;
uint32_t mde_regs[MDE_REGS_CNT];
mpi_coredump_segment_header_t xaui_an_hdr;
uint32_t serdes_xaui_an[14];
mpi_coredump_segment_header_t xaui_hss_pcs_hdr;
uint32_t serdes_xaui_hss_pcs[33];
mpi_coredump_segment_header_t xfi_an_hdr;
uint32_t serdes_xfi_an[14];
mpi_coredump_segment_header_t xfi_train_hdr;
uint32_t serdes_xfi_train[12];
mpi_coredump_segment_header_t xfi_hss_pcs_hdr;
uint32_t serdes_xfi_hss_pcs[15];
mpi_coredump_segment_header_t xfi_hss_tx_hdr;
uint32_t serdes_xfi_hss_tx[32];
mpi_coredump_segment_header_t xfi_hss_rx_hdr;
uint32_t serdes_xfi_hss_rx[32];
mpi_coredump_segment_header_t xfi_hss_pll_hdr;
uint32_t serdes_xfi_hss_pll[32];
mpi_coredump_segment_header_t nic_regs_seg_hdr;
uint32_t nic_regs[64];
/* one interrupt state for each CQ */
mpi_coredump_segment_header_t intr_states_seg_hdr;
uint32_t intr_states[MAX_RX_RINGS];
mpi_coredump_segment_header_t xgmac_seg_hdr;
#define XGMAC_REGISTER_END 0x740
uint32_t xgmac[XGMAC_REGISTER_END];
mpi_coredump_segment_header_t probe_dump_seg_hdr;
uint32_t probe_dump[PROBE_DATA_LENGTH_WORDS * NUMBER_OF_PROBES];
mpi_coredump_segment_header_t routing_reg_seg_hdr;
uint32_t routing_regs[NUMBER_ROUTING_REG_ENTRIES * WORDS_PER_ROUTING_REG_ENTRY];
mpi_coredump_segment_header_t mac_prot_reg_seg_hdr;
uint32_t mac_prot_regs[MAC_PROTOCOL_REGISTER_WORDS * WORDS_PER_MAC_PROT_ENTRY];
mpi_coredump_segment_header_t ets_seg_hdr;
uint32_t ets[8+2];
mpi_coredump_segment_header_t code_ram_seg_hdr;
uint32_t code_ram[CODE_RAM_CNT];
mpi_coredump_segment_header_t memc_ram_seg_hdr;
uint32_t memc_ram[MEMC_RAM_CNT];
} ql_mpi_coredump_t;
#define WCS_MPI_CODE_RAM_LENGTH (0x2000*4)
#define MEMC_MPI_RAM_LENGTH (0x2000*4)
#define XG_SERDES_ADDR_RDY BIT_31
#define XG_SERDES_ADDR_R BIT_30
#define CORE_SEG_NUM 1
#define TEST_LOGIC_SEG_NUM 2
#define RMII_SEG_NUM 3
#define FCMAC1_SEG_NUM 4
#define FCMAC2_SEG_NUM 5
#define FC1_MBOX_SEG_NUM 6
#define IDE_SEG_NUM 7
#define NIC1_MBOX_SEG_NUM 8
#define SMBUS_SEG_NUM 9
#define FC2_MBOX_SEG_NUM 10
#define NIC2_MBOX_SEG_NUM 11
#define I2C_SEG_NUM 12
#define MEMC_SEG_NUM 13
#define PBUS_SEG_NUM 14
#define MDE_SEG_NUM 15
#define NIC1_CONTROL_SEG_NUM 16
#define NIC2_CONTROL_SEG_NUM 17
#define NIC1_XGMAC_SEG_NUM 18
#define NIC2_XGMAC_SEG_NUM 19
#define WCS_RAM_SEG_NUM 20
#define MEMC_RAM_SEG_NUM 21
#define XAUI_AN_SEG_NUM 22
#define XAUI_HSS_PCS_SEG_NUM 23
#define XFI_AN_SEG_NUM 24
#define XFI_TRAIN_SEG_NUM 25
#define XFI_HSS_PCS_SEG_NUM 26
#define XFI_HSS_TX_SEG_NUM 27
#define XFI_HSS_RX_SEG_NUM 28
#define XFI_HSS_PLL_SEG_NUM 29
#define INTR_STATES_SEG_NUM 31
#define ETS_SEG_NUM 34
#define PROBE_DUMP_SEG_NUM 35
#define ROUTING_INDEX_SEG_NUM 36
#define MAC_PROTOCOL_SEG_NUM 37
/* Force byte packing for the following structures */
#pragma pack(1)
/*
* Work Queue (Request Queue) Initialization Control Block (WQICB)
*/
struct wqicb_t {
uint16_t len;
#define Q_LEN_V (1 << 4)
#define Q_LEN_CPP_CONT 0x0000
#define Q_LEN_CPP_16 0x0001
#define Q_LEN_CPP_32 0x0002
#define Q_LEN_CPP_64 0x0003
#define Q_LEN_CPP_512 0x0006
uint16_t flags;
#define Q_PRI_SHIFT 1
#define Q_FLAGS_LC 0x1000
#define Q_FLAGS_LB 0x2000
#define Q_FLAGS_LI 0x4000
#define Q_FLAGS_LO 0x8000
uint16_t cq_id_rss;
#define Q_CQ_ID_RSS_RV 0x8000
uint16_t rid;
uint32_t wq_addr_lo;
uint32_t wq_addr_hi;
uint32_t cnsmr_idx_addr_lo;
uint32_t cnsmr_idx_addr_hi;
};
/*
* Completion Queue (Response Queue) Initialization Control Block (CQICB)
*/
struct cqicb_t {
uint8_t msix_vect;
uint8_t reserved1;
uint8_t reserved2;
uint8_t flags;
#define FLAGS_LV 0x08
#define FLAGS_LS 0x10
#define FLAGS_LL 0x20
#define FLAGS_LI 0x40
#define FLAGS_LC 0x80
uint16_t len;
#define LEN_V (1 << 4)
#define LEN_CPP_CONT 0x0000
#define LEN_CPP_32 0x0001
#define LEN_CPP_64 0x0002
#define LEN_CPP_128 0x0003
uint16_t rid;
uint32_t cq_base_addr_lo; /* completion queue base address */
uint32_t cq_base_addr_hi;
uint32_t prod_idx_addr_lo; /* completion queue host copy */
/* producer index host shadow */
uint32_t prod_idx_addr_hi;
uint16_t pkt_delay;
uint16_t irq_delay;
uint32_t lbq_addr_lo;
uint32_t lbq_addr_hi;
uint16_t lbq_buf_size;
uint16_t lbq_len; /* entry count */
uint32_t sbq_addr_lo;
uint32_t sbq_addr_hi;
uint16_t sbq_buf_size;
uint16_t sbq_len; /* entry count */
};
struct ricb {
uint8_t base_cq;
#define RSS_L4K 0x80
uint8_t flags;
#define RSS_L6K 0x01
#define RSS_LI 0x02
#define RSS_LB 0x04
#define RSS_LM 0x08
#define RSS_RI4 0x10
#define RSS_RT4 0x20
#define RSS_RI6 0x40
#define RSS_RT6 0x80
uint16_t mask;
#define RSS_HASH_CQ_ID_MAX 1024
uint8_t hash_cq_id[RSS_HASH_CQ_ID_MAX];
uint32_t ipv6_hash_key[10];
uint32_t ipv4_hash_key[4];
};
/*
* Host Command IOCB Formats
*/
#define OPCODE_OB_MAC_IOCB 0x01
#define OPCODE_OB_MAC_OFFLOAD_IOCB 0x02
#define OPCODE_IB_MAC_IOCB 0x20
#define OPCODE_IB_SYS_EVENT_IOCB 0x3f
/*
* The following constants define control bits for buffer
* length fields for all IOCB's.
*/
#define OAL_LAST_ENTRY 0x80000000 /* Last valid buffer in list. */
#define OAL_CONT_ENTRY 0x40000000 /* points to an OAL. (continuation) */
struct oal_entry {
uint32_t buf_addr_low;
uint32_t buf_addr_high;
uint32_t buf_len;
};
/* 32 words, 128 bytes */
#define TX_DESC_PER_IOCB 8 /* Number of descs in one TX IOCB */
struct ob_mac_iocb_req {
uint8_t opcode;
uint8_t flag0;
#define OB_MAC_IOCB_REQ_IPv6 0x80
#define OB_MAC_IOCB_REQ_IPv4 0x40
#define OB_MAC_IOCB_REQ_D 0x08 /* disable generation of comp. msg */
#define OB_MAC_IOCB_REQ_I 0x02 /* disable generation of intr at comp */
uint8_t flag1;
#define OB_MAC_IOCB_REQ_TC 0x80 /* enable TCP checksum offload */
#define OB_MAC_IOCB_REQ_UC 0x40 /* enable UDP checksum offload */
#define OB_MAC_IOCB_REQ_LSO 0x20 /* enable LSO offload */
uint8_t flag2;
#define OB_MAC_IOCB_REQ_VLAN_OFFSET_MASK 0xF8 /* VLAN TCI insert */
#define OB_MAC_IOCB_REQ_V 0x04 /* insert VLAN TCI */
#define OB_MAC_IOCB_REQ_DFP 0x02 /* Drop for Failover port */
#define OB_MAC_IOCB_REQ_IC 0x01 /* enable IP checksum offload */
uint32_t unused;
uint32_t reserved_cq_tag;
uint32_t frame_len; /* max 9000,for none LSO, 16M for LSO */
uint32_t tid;
uint32_t txq_idx;
uint16_t protocol_hdr_len;
uint16_t hdr_off; /* tcp/udp hdr offset */
uint16_t vlan_tci;
uint16_t mss;
struct oal_entry oal_entry[TX_DESC_PER_IOCB]; /* max FFFFF 1M bytes */
};
/* 16 words, 64 bytes */
struct ob_mac_iocb_rsp {
uint8_t opcode;
uint8_t flags1;
#define OB_MAC_IOCB_RSP_OI 0x01 /* */
#define OB_MAC_IOCB_RSP_I 0x02 /* */
#define OB_MAC_IOCB_RSP_E 0x08 /* */
#define OB_MAC_IOCB_RSP_S 0x10 /* too Short */
#define OB_MAC_IOCB_RSP_L 0x20 /* too Large */
#define OB_MAC_IOCB_RSP_P 0x40 /* Padded */
uint8_t flags2;
uint8_t flags3;
#define OB_MAC_IOCB_RSP_B 0x80
uint32_t tid;
uint32_t txq_idx;
uint32_t reserved[13];
};
#define IB_MAC_IOCB_RSP_VLAN_MASK 0x0ffff
struct ib_mac_iocb_rsp {
uint8_t opcode; /* 0x20 */
uint8_t flags1;
#define IB_MAC_IOCB_RSP_OI 0x01 /* Overide intr delay */
#define IB_MAC_IOCB_RSP_I 0x02 /* Disble Intr Generation */
#define IB_MAC_IOCB_RSP_TE 0x04 /* Checksum error */
#define IB_MAC_IOCB_RSP_NU 0x08 /* No checksum rcvd */
#define IB_MAC_IOCB_RSP_IE 0x10 /* IPv4 checksum error */
#define IB_MAC_IOCB_RSP_M_MASK 0x60 /* Multicast info */
#define IB_MAC_IOCB_RSP_M_NONE 0x00 /* Not mcast frame */
#define IB_MAC_IOCB_RSP_M_HASH 0x20 /* HASH mcast frame */
#define IB_MAC_IOCB_RSP_M_REG 0x40 /* Registered mcast frame */
#define IB_MAC_IOCB_RSP_M_PROM 0x60 /* Promiscuous mcast frame */
#define IB_MAC_IOCB_RSP_B 0x80 /* Broadcast frame */
uint8_t flags2;
#define IB_MAC_IOCB_RSP_P 0x01 /* Promiscuous frame */
#define IB_MAC_IOCB_RSP_V 0x02 /* Vlan tag present */
#define IB_MAC_IOCB_RSP_ERR_MASK 0x1c /* */
#define IB_MAC_IOCB_RSP_ERR_CODE_ERR 0x04
#define IB_MAC_IOCB_RSP_ERR_OVERSIZE 0x08
#define IB_MAC_IOCB_RSP_ERR_UNDERSIZE 0x10
#define IB_MAC_IOCB_RSP_ERR_PREAMBLE 0x14
#define IB_MAC_IOCB_RSP_ERR_FRAME_LEN 0x18
#define IB_MAC_IOCB_RSP_ERR_CRC 0x1c
#define IB_MAC_IOCB_RSP_U 0x20 /* UDP packet */
#define IB_MAC_IOCB_RSP_T 0x40 /* TCP packet */
#define IB_MAC_IOCB_RSP_FO 0x80 /* Failover port */
uint8_t flags3;
#define IB_MAC_IOCB_RSP_RSS_MASK 0x07 /* RSS mask */
#define IB_MAC_IOCB_RSP_M_NONE 0x00 /* No RSS match */
#define IB_MAC_IOCB_RSP_M_IPV4 0x04 /* IPv4 RSS match */
#define IB_MAC_IOCB_RSP_M_IPV6 0x02 /* IPv6 RSS match */
#define IB_MAC_IOCB_RSP_M_TCP_V4 0x05 /* TCP with IPv4 */
#define IB_MAC_IOCB_RSP_M_TCP_V6 0x03 /* TCP with IPv6 */
#define IB_MAC_IOCB_RSP_V4 0x08 /* IPV4 */
#define IB_MAC_IOCB_RSP_V6 0x10 /* IPV6 */
#define IB_MAC_IOCB_RSP_IH 0x20 /* Split after IP header */
#define IB_MAC_IOCB_RSP_DS 0x40 /* data is in small buffer */
#define IB_MAC_IOCB_RSP_DL 0x80 /* data is in large buffer */
uint32_t data_len;
uint64_t data_addr;
uint32_t rss;
uint16_t vlan_id; /* 12 bits */
#define IB_MAC_IOCB_RSP_VLAN_ID_MASK 0xFFF
#define IB_MAC_IOCB_RSP_C 0x1000 /* VLAN CFI bit */
#define IB_MAC_IOCB_RSP_COS_SHIFT 12 /* class of service value */
uint16_t reserved1;
uint32_t reserved2[6];
uint8_t reserved3[3];
uint8_t flags4;
#define IB_MAC_IOCB_RSP_HV 0x20
#define IB_MAC_IOCB_RSP_HS 0x40
#define IB_MAC_IOCB_RSP_HL 0x80
uint32_t hdr_len;
uint64_t hdr_addr;
};
/* 16 words, 64 bytes */
struct ib_sys_event_iocb_rsp {
uint8_t opcode;
uint8_t flag0;
uint8_t event_type;
uint8_t q_id;
uint32_t reserved[15];
};
#define SYS_EVENT_PORT_LINK_UP 0x0
#define SYS_EVENT_PORT_LINK_DOWN 0x1
#define SYS_EVENT_MULTIPLE_CAM_HITS 0x6
#define SYS_EVENT_SOFT_ECC_ERR 0x7
#define SYS_EVENT_MGMT_FATAL_ERR 0x8 /* MPI_PROCESSOR */
#define SYS_EVENT_MAC_INTERRUPT 0x9
#define SYS_EVENT_PCI_ERR_READING_SML_LRG_BUF 0x40
/*
* Status Register (#define STATUS) bit definitions.
*/
#define STATUS_FE (1 << 0)
#define STATUS_PI (1 << 1)
#define STATUS_PL0 (1 << 2),
#define STATUS_PL1 (1 << 3)
#define STATUS_PI0 (1 << 4)
#define STATUS_PI1 (1 << 5)
#define STATUS_FUNC_ID_MASK 0x000000c0
#define STATUS_FUNC_ID_SHIFT 6
#define STATUS_F0E (1 << 8)
#define STATUS_F1E (1 << 9)
#define STATUS_F2E (1 << 10)
#define STATUS_F3E (1 << 11)
#define STATUS_NFE (1 << 12)
/*
* Generic Response Queue IOCB Format which abstracts the difference between
* IB_MAC, OB_MAC IOCBs
*/
struct net_rsp_iocb {
uint8_t opcode;
uint8_t flag0;
uint8_t flag1;
uint8_t flag2;
uint32_t reserved[15];
};
/* Restore original packing rules */
#pragma pack()
#define RESPONSE_ENTRY_SIZE (sizeof (struct net_rsp_iocb))
#define REQUEST_ENTRY_SIZE (sizeof (struct ob_mac_iocb_req))
/* flash */
/* Little endian machine correction defines. */
#ifdef _LITTLE_ENDIAN
#define LITTLE_ENDIAN_16(x)
#define LITTLE_ENDIAN_24(x)
#define LITTLE_ENDIAN_32(x)
#define LITTLE_ENDIAN_64(x)
#define LITTLE_ENDIAN(bp, bytes)
#define BIG_ENDIAN_16(x) ql_change_endian((uint8_t *)x, 2)
#define BIG_ENDIAN_24(x) ql_change_endian((uint8_t *)x, 3)
#define BIG_ENDIAN_32(x) ql_change_endian((uint8_t *)x, 4)
#define BIG_ENDIAN_64(x) ql_change_endian((uint8_t *)x, 8)
#define BIG_ENDIAN(bp, bytes) ql_change_endian((uint8_t *)bp, bytes)
#endif /* _LITTLE_ENDIAN */
/* Big endian machine correction defines. */
#ifdef _BIG_ENDIAN
#define LITTLE_ENDIAN_16(x) ql_change_endian((uint8_t *)x, 2)
#define LITTLE_ENDIAN_24(x) ql_change_endian((uint8_t *)x, 3)
#define LITTLE_ENDIAN_32(x) ql_change_endian((uint8_t *)x, 4)
#define LITTLE_ENDIAN_64(x) ql_change_endian((uint8_t *)x, 8)
#define LITTLE_ENDIAN(bp, bytes) ql_change_endian((uint8_t *)bp, bytes)
#define BIG_ENDIAN_16(x)
#define BIG_ENDIAN_24(x)
#define BIG_ENDIAN_32(x)
#define BIG_ENDIAN_64(x)
#define BIG_ENDIAN(bp, bytes)
#endif /* _BIG_ENDIAN */
void ql_change_endian(uint8_t *, size_t);
/* Flash Address Register 0x88 */
#define FLASH_RDY_FLAG BIT_31
#define FLASH_R_FLAG BIT_30
#define FLASH_ERR_FLAG BIT_29
#define FLASH_CONF_ADDR 0x7D0000u
#define FLASH_ADDR_MASK 0x7F0000
#define FLASH_WRSR_CMD 0x01
#define FLASH_PP_CMD 0x02
#define FLASH_READ_CMD 0x03
#define FLASH_WRDI_CMD 0x04
#define FLASH_RDSR_CMD 0x05
#define FLASH_WREN_CMD 0x06
#define FLASH_RDID_CMD 0x9F
#define FLASH_RES_CMD 0xAB
/*
* Flash definitions.
*/
typedef struct ql_flash_info {
uint32_t type; /* flash type */
uint32_t flash_size; /* length in bytes of flash */
uint32_t sec_mask; /* sector number mask */
uint8_t flash_manuf; /* flash chip manufacturer id */
uint8_t flash_id; /* flash chip id */
uint8_t flash_cap; /* flash chip capacity */
} ql_flash_info_t;
/*
* Flash Description Table
*/
#define FLASH_DESC_VERSION 1
#define FLASH_DESC_VAILD 0x44494C51 /* "QLID" */
typedef struct flash_desc {
uint32_t flash_valid;
uint16_t flash_version;
uint16_t flash_len; /* flash description table length */
uint16_t flash_checksum;
uint16_t flash_unused;
uint8_t flash_model[16];
uint16_t flash_manuf;
uint16_t flash_id;
uint8_t flash_flag;
uint8_t erase_cmd;
uint8_t alt_erase_cmd;
uint8_t write_enable_cmd;
uint8_t write_enable_bits;
uint8_t write_statusreg_cmd;
uint8_t unprotect_sector_cmd;
uint8_t read_manuf_cmd;
uint32_t block_size;
uint32_t alt_block_size;
uint32_t flash_size;
uint32_t write_enable_data;
uint8_t readid_address_len;
uint8_t write_disable_bits;
uint8_t read_device_id_len;
uint8_t chip_erase_cmd;
uint16_t read_timeout;
uint8_t protect_sector_cmd;
uint8_t exp_reserved[65];
} flash_desc_t;
/* flash manufacturer id's */
#define AMD_FLASH 0x01 /* AMD / Spansion */
#define ST_FLASH 0x20 /* ST Electronics */
#define SST_FLASH 0xbf /* SST Electronics */
#define MXIC_FLASH 0xc2 /* Macronix (MXIC) */
#define ATMEL_FLASH 0x1f /* Atmel (AT26DF081A) */
#define WINBOND_FLASH 0xef /* Winbond (W25X16,W25X32) */
#define INTEL_FLASH 0x89 /* Intel (QB25F016S33B8) */
/* flash id defines */
#define AMD_FLASHID_128K 0x6e /* 128k AMD flash chip */
#define AMD_FLASHID_512K 0x4f /* 512k AMD flash chip */
#define AMD_FLASHID_512Kt 0xb9 /* 512k AMD flash chip - top boot blk */
#define AMD_FLASHID_512Kb 0xba /* 512k AMD flash chip - btm boot blk */
#define AMD_FLASHID_1024K 0x38 /* 1 MB AMD flash chip */
#define ST_FLASHID_128K 0x23 /* 128k ST flash chip */
#define ST_FLASHID_512K 0xe3 /* 512k ST flash chip */
#define ST_FLASHID_M25PXX 0x20 /* M25Pxx ST flash chip */
#define SST_FLASHID_128K 0xd5 /* 128k SST flash chip */
#define SST_FLASHID_1024K 0xd8 /* 1 MB SST flash chip */
#define SST_FLASHID_1024K_A 0x80 /* 1 MB SST 25LF080A flash chip */
#define SST_FLASHID_1024K_B 0x8e /* 1 MB SST 25VF080B flash chip */
#define SST_FLASHID_2048K 0x25 /* 2 MB SST 25VF016B flash chip */
#define MXIC_FLASHID_512K 0x4f /* 512k MXIC flash chip */
#define MXIC_FLASHID_1024K 0x38 /* 1 MB MXIC flash chip */
#define MXIC_FLASHID_25LXX 0x20 /* 25Lxx MXIC flash chip */
#define ATMEL_FLASHID_1024K 0x45 /* 1 MB ATMEL flash chip */
#define SPAN_FLASHID_2048K 0x02 /* 2 MB Spansion flash chip */
#define WINBOND_FLASHID 0x30 /* Winbond W25Xxx flash chip */
#define INTEL_FLASHID 0x89 /* Intel QB25F016S33B8 flash chip */
/* flash type defines */
#define FLASH128 BIT_0
#define FLASH512 BIT_1
#define FLASH512S BIT_2
#define FLASH1024 BIT_3
#define FLASH2048 BIT_4
#define FLASH4096 BIT_5
#define FLASH8192 BIT_6
#define FLASH_PAGE BIT_31
#define FLASH_LEGACY (FLASH128 | FLASH512S)
#define FLASH_FIRMWARE_IMAGE_ADDR 0x100000 /* 1M */
typedef struct {
uint8_t signature[2];
uint8_t reserved[0x16];
uint8_t dataoffset[2];
uint8_t pad[6];
} pci_header_t;
typedef struct {
uint8_t signature[4];
uint8_t vid[2];
uint8_t did[2];
uint8_t reserved0[2];
uint8_t pcidatalen[2];
uint8_t pcidatarev;
uint8_t classcode[3];
uint8_t imagelength[2]; /* In sectors */
uint8_t revisionlevel[2];
uint8_t codetype;
uint8_t indicator;
uint8_t reserved1[2];
uint8_t pad[8];
} pci_data_t;
#define PCI_HEADER0 0x55
#define PCI_HEADER1 0xAA
#define PCI_DATASIG "PCIR"
#define PCI_SECTOR_SIZE 0x200
#define PCI_CODE_X86PC 0
#define PCI_CODE_FCODE 1
#define PCI_CODE_HPPA 2
#define PCI_CODE_EFI 3
#define PCI_CODE_FW 0xfe
#define PCI_IND_LAST_IMAGE 0x80
#define SBUS_CODE_FCODE 0xf1
#define FBUFSIZE 100
/* Flash Layout Table Data Structure(FLTDS) */
#define FLASH_FLTDS_SIGNATURE 0x544C4651 /* "QFLT" */
typedef struct ql_fltds {
uint32_t signature;
uint16_t flt_addr_lo;
uint16_t flt_addr_hi;
uint8_t version;
uint8_t reserved;
uint16_t checksum;
} ql_fltds_t;
/* Image Layout Table Data Structure(ILTDS) */
#define FLASH_ILTDS_SIGNATURE 0x4D494651 /* "QFIM" */
typedef struct ql_iltds_header {
uint32_t signature;
uint16_t table_version; /* version of this structure */
uint16_t length; /* length of the table */
uint16_t checksum;
uint16_t number_entries; /* Number of type/len/size entries */
uint16_t reserved;
uint16_t version; /* version of the image */
} ql_iltds_header_t;
#define IMAGE_TABLE_HEADER_LEN sizeof (ql_iltds_header_t)
#define ILTDS_REGION_VERSION_LEN_NA 0 /* version not applicable */
typedef struct ql_iltds_img_entry {
uint16_t region_type;
uint8_t region_version_len;
uint8_t region_version[3];
uint16_t offset_lo;
uint16_t offset_hi;
uint16_t size_lo;
uint16_t size_hi;
uint8_t swap_mode;
#define ILTDS_IMG_SWAP_NONE 0 /* no swap needed */
#define ILTDS_IMG_SWAP_WORD 1
uint8_t card_type;
#define ILTDS_IMG_CARD_TYPE_ALL 0 /* apply to all types */
#define ILTDS_IMG_CARD_TYPE_SR 1 /* apply to SR/fc cards */
#define ILTDS_IMG_CARD_TYPE_COPPER 2 /* apply to Copper cards */
#define ILTDS_IMG_CARD_TYPE_MEZZ 4 /* apply to Mezz cards */
} ql_iltds_img_entry_t;
#define IMAGE_TABLE_ENTRY_LEN sizeof (ql_iltds_img_entry_t)
typedef struct ql_iltds_time_stamp {
uint16_t region_type;
uint8_t region_version_len;
uint8_t region_version[3];
uint8_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t min;
uint8_t sec;
uint32_t reserved;
} ql_iltds_time_stamp_t;
#define IMAGE_TABLE_TIME_STAMP_LEN sizeof (ql_iltds_time_stamp_t)
#define IMAGE_TABLE_IMAGE_DEFAULT_ENTRIES 5
typedef struct ql_iltds_description_header {
ql_iltds_header_t iltds_table_header;
ql_iltds_img_entry_t img_entry[IMAGE_TABLE_IMAGE_DEFAULT_ENTRIES];
ql_iltds_time_stamp_t time_stamp;
}ql_iltds_description_header_t;
#define ILTDS_DESCRIPTION_HEADERS_LEN sizeof (ql_iltds_description_header_t)
/* flash layout table definition */
/* header */
typedef struct ql_flt_header {
uint16_t version;
uint16_t length; /* length of the flt table,no table header */
uint16_t checksum;
uint16_t reserved;
} ql_flt_header_t;
/* table entry */
typedef struct ql_flt_entry {
uint8_t region;
uint8_t reserved0;
uint8_t attr;
#define FLT_ATTR_READ_ONLY BIT_0
#define FLT_ATTR_NEED_FW_RESTART BIT_1
#define FLT_ATTR_NEED_DATA_REALOAD BIT_2
uint8_t reserved1;
uint32_t size;
uint32_t begin_addr;
uint32_t end_addr;
} ql_flt_entry_t;
/* flt table */
typedef struct ql_flt {
ql_flt_header_t header;
uint16_t num_entries;
ql_flt_entry_t *ql_flt_entry_ptr;
} ql_flt_t;
/* Nic Configuration Table */
#define FLASH_NIC_CONFIG_SIGNATURE 0x30303038 /* "8000" */
enum {
DATA_TYPE_NONE,
DATA_TYPE_FACTORY_MAC_ADDR,
DATA_TYPE_CLP_MAC_ADDR,
DATA_TYPE_CLP_VLAN_MAC_ADDR,
DATA_TYPE_RESERVED,
DATA_TYPE_LAST_ENTRY
};
typedef struct ql_nic_config {
uint32_t signature;
uint16_t version;
uint16_t size;
uint16_t checksum;
uint16_t reserved0;
uint16_t total_data_size;
uint16_t num_of_entries;
uint8_t factory_data_type;
uint8_t factory_data_type_size;
uint8_t factory_MAC[6];
uint8_t clp_data_type;
uint8_t clp_data_type_size;
uint8_t clp_MAC[6];
uint8_t clp_vlan_data_type;
uint8_t clp_vlan_data_type_size;
uint16_t vlan_id;
uint8_t last_data_type;
uint8_t last_data_type_size;
uint16_t last_entry;
uint8_t reserved1[464];
uint16_t subsys_vendor_id;
uint16_t subsys_device_id;
uint8_t reserved2[4];
} ql_nic_config_t;
#ifdef __cplusplus
}
#endif
#endif /* _QLGE_HW_H */