/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* QLogic QLA3xxx NIC HBA Driver
* Copyright (c) 2003-2006 QLogic Corporation
*/
#ifndef _QLA3XXX_H_
#define _QLA3XXX_H_
/*
* IOCB Definitions...
*/
#pragma pack (1 )
#define OPCODE_OB_MAC_IOCB_FN0 0 x01
#define OPCODE_OB_MAC_IOCB_FN2 0 x21
#define OPCODE_IB_MAC_IOCB 0 xF9
#define OPCODE_IB_3032_MAC_IOCB 0 x09
#define OPCODE_IB_IP_IOCB 0 xFA
#define OPCODE_IB_3032_IP_IOCB 0 x0A
#define OPCODE_FUNC_ID_MASK 0 x30
#define OUTBOUND_MAC_IOCB 0 x01 /* plus function bits */
#define FN0_MA_BITS_MASK 0 x00
#define FN1_MA_BITS_MASK 0 x80
struct ob_mac_iocb_req {
u8 opcode;
u8 flags;
#define OB_MAC_IOCB_REQ_MA 0 xe0
#define OB_MAC_IOCB_REQ_F 0 x10
#define OB_MAC_IOCB_REQ_X 0 x08
#define OB_MAC_IOCB_REQ_D 0 x02
#define OB_MAC_IOCB_REQ_I 0 x01
u8 flags1;
#define OB_3032MAC_IOCB_REQ_IC 0 x04
#define OB_3032MAC_IOCB_REQ_TC 0 x02
#define OB_3032MAC_IOCB_REQ_UC 0 x01
u8 reserved0;
u32 transaction_id; /* opaque for hardware */
__le16 data_len;
u8 ip_hdr_off;
u8 ip_hdr_len;
__le32 reserved1;
__le32 reserved2;
__le32 buf_addr0_low;
__le32 buf_addr0_high;
__le32 buf_0_len;
__le32 buf_addr1_low;
__le32 buf_addr1_high;
__le32 buf_1_len;
__le32 buf_addr2_low;
__le32 buf_addr2_high;
__le32 buf_2_len;
__le32 reserved3;
__le32 reserved4;
};
/*
* The following constants define control bits for buffer
* length fields for all IOCB's.
*/
#define OB_MAC_IOCB_REQ_E 0 x80000000 /* Last valid buffer in list. */
#define OB_MAC_IOCB_REQ_C 0 x40000000 /* points to an OAL. (continuation) */
#define OB_MAC_IOCB_REQ_L 0 x20000000 /* Auburn local address pointer. */
#define OB_MAC_IOCB_REQ_R 0 x10000000 /* 32-bit address pointer. */
struct ob_mac_iocb_rsp {
u8 opcode;
u8 flags;
#define OB_MAC_IOCB_RSP_P 0 x08
#define OB_MAC_IOCB_RSP_L 0 x04
#define OB_MAC_IOCB_RSP_S 0 x02
#define OB_MAC_IOCB_RSP_I 0 x01
__le16 reserved0;
u32 transaction_id; /* opaque for hardware */
__le32 reserved1;
__le32 reserved2;
};
struct ib_mac_iocb_rsp {
u8 opcode;
#define IB_MAC_IOCB_RSP_V 0 x80
u8 flags;
#define IB_MAC_IOCB_RSP_S 0 x80
#define IB_MAC_IOCB_RSP_H1 0 x40
#define IB_MAC_IOCB_RSP_H0 0 x20
#define IB_MAC_IOCB_RSP_B 0 x10
#define IB_MAC_IOCB_RSP_M 0 x08
#define IB_MAC_IOCB_RSP_MA 0 x07
__le16 length;
__le32 reserved;
__le32 ial_low;
__le32 ial_high;
};
struct ob_ip_iocb_req {
u8 opcode;
__le16 flags;
#define OB_IP_IOCB_REQ_O 0 x100
#define OB_IP_IOCB_REQ_H 0 x008
#define OB_IP_IOCB_REQ_U 0 x004
#define OB_IP_IOCB_REQ_D 0 x002
#define OB_IP_IOCB_REQ_I 0 x001
u8 reserved0;
__le32 transaction_id;
__le16 data_len;
__le16 reserved1;
__le32 hncb_ptr_low;
__le32 hncb_ptr_high;
__le32 buf_addr0_low;
__le32 buf_addr0_high;
__le32 buf_0_len;
__le32 buf_addr1_low;
__le32 buf_addr1_high;
__le32 buf_1_len;
__le32 buf_addr2_low;
__le32 buf_addr2_high;
__le32 buf_2_len;
__le32 reserved2;
__le32 reserved3;
};
/* defines for BufferLength fields above */
#define OB_IP_IOCB_REQ_E 0 x80000000
#define OB_IP_IOCB_REQ_C 0 x40000000
#define OB_IP_IOCB_REQ_L 0 x20000000
#define OB_IP_IOCB_REQ_R 0 x10000000
struct ob_ip_iocb_rsp {
u8 opcode;
u8 flags;
#define OB_MAC_IOCB_RSP_H 0 x10
#define OB_MAC_IOCB_RSP_E 0 x08
#define OB_MAC_IOCB_RSP_L 0 x04
#define OB_MAC_IOCB_RSP_S 0 x02
#define OB_MAC_IOCB_RSP_I 0 x01
__le16 reserved0;
__le32 transaction_id;
__le32 reserved1;
__le32 reserved2;
};
struct ib_ip_iocb_rsp {
u8 opcode;
#define IB_IP_IOCB_RSP_3032_V 0 x80
#define IB_IP_IOCB_RSP_3032_O 0 x40
#define IB_IP_IOCB_RSP_3032_I 0 x20
#define IB_IP_IOCB_RSP_3032_R 0 x10
u8 flags;
#define IB_IP_IOCB_RSP_S 0 x80
#define IB_IP_IOCB_RSP_H1 0 x40
#define IB_IP_IOCB_RSP_H0 0 x20
#define IB_IP_IOCB_RSP_B 0 x10
#define IB_IP_IOCB_RSP_M 0 x08
#define IB_IP_IOCB_RSP_MA 0 x07
__le16 length;
__le16 checksum;
#define IB_IP_IOCB_RSP_3032_ICE 0 x01
#define IB_IP_IOCB_RSP_3032_CE 0 x02
#define IB_IP_IOCB_RSP_3032_NUC 0 x04
#define IB_IP_IOCB_RSP_3032_UDP 0 x08
#define IB_IP_IOCB_RSP_3032_TCP 0 x10
#define IB_IP_IOCB_RSP_3032_IPE 0 x20
__le16 reserved;
#define IB_IP_IOCB_RSP_R 0 x01
__le32 ial_low;
__le32 ial_high;
};
struct net_rsp_iocb {
u8 opcode;
u8 flags;
__le16 reserved0;
__le32 reserved[3 ];
};
#pragma pack ()
/*
* Register Definitions...
*/
#define PORT0_PHY_ADDRESS 0 x1e00
#define PORT1_PHY_ADDRESS 0 x1f00
#define ETHERNET_CRC_SIZE 4
#define MII_SCAN_REGISTER 0 x00000001
#define PHY_ID_0_REG 2
#define PHY_ID_1_REG 3
#define PHY_OUI_1_MASK 0 xfc00
#define PHY_MODEL_MASK 0 x03f0
/* Address for the Agere Phy */
#define MII_AGERE_ADDR_1 0 x00001000
#define MII_AGERE_ADDR_2 0 x00001100
/* 32-bit ispControlStatus */
enum {
ISP_CONTROL_NP_MASK = 0 x0003,
ISP_CONTROL_NP_PCSR = 0 x0000,
ISP_CONTROL_NP_HMCR = 0 x0001,
ISP_CONTROL_NP_LRAMCR = 0 x0002,
ISP_CONTROL_NP_PSR = 0 x0003,
ISP_CONTROL_RI = 0 x0008,
ISP_CONTROL_CI = 0 x0010,
ISP_CONTROL_PI = 0 x0020,
ISP_CONTROL_IN = 0 x0040,
ISP_CONTROL_BE = 0 x0080,
ISP_CONTROL_FN_MASK = 0 x0700,
ISP_CONTROL_FN0_NET = 0 x0400,
ISP_CONTROL_FN0_SCSI = 0 x0500,
ISP_CONTROL_FN1_NET = 0 x0600,
ISP_CONTROL_FN1_SCSI = 0 x0700,
ISP_CONTROL_LINK_DN_0 = 0 x0800,
ISP_CONTROL_LINK_DN_1 = 0 x1000,
ISP_CONTROL_FSR = 0 x2000,
ISP_CONTROL_FE = 0 x4000,
ISP_CONTROL_SR = 0 x8000,
};
/* 32-bit ispInterruptMaskReg */
enum {
ISP_IMR_ENABLE_INT = 0 x0004,
ISP_IMR_DISABLE_RESET_INT = 0 x0008,
ISP_IMR_DISABLE_CMPL_INT = 0 x0010,
ISP_IMR_DISABLE_PROC_INT = 0 x0020,
};
/* 32-bit serialPortInterfaceReg */
enum {
ISP_SERIAL_PORT_IF_CLK = 0 x0001,
ISP_SERIAL_PORT_IF_CS = 0 x0002,
ISP_SERIAL_PORT_IF_D0 = 0 x0004,
ISP_SERIAL_PORT_IF_DI = 0 x0008,
ISP_NVRAM_MASK = (0 x000F << 16 ),
ISP_SERIAL_PORT_IF_WE = 0 x0010,
ISP_SERIAL_PORT_IF_NVR_MASK = 0 x001F,
ISP_SERIAL_PORT_IF_SCI = 0 x0400,
ISP_SERIAL_PORT_IF_SC0 = 0 x0800,
ISP_SERIAL_PORT_IF_SCE = 0 x1000,
ISP_SERIAL_PORT_IF_SDI = 0 x2000,
ISP_SERIAL_PORT_IF_SDO = 0 x4000,
ISP_SERIAL_PORT_IF_SDE = 0 x8000,
ISP_SERIAL_PORT_IF_I2C_MASK = 0 xFC00,
};
/* semaphoreReg */
enum {
QL_RESOURCE_MASK_BASE_CODE = 0 x7,
QL_RESOURCE_BITS_BASE_CODE = 0 x4,
QL_DRVR_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 1 ),
QL_DDR_RAM_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 4 ),
QL_PHY_GIO_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 7 ),
QL_NVRAM_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 10 ),
QL_FLASH_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 13 ),
QL_DRVR_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (1 + 16 )),
QL_DDR_RAM_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (4 + 16 )),
QL_PHY_GIO_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (7 + 16 )),
QL_NVRAM_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (10 + 16 )),
QL_FLASH_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (13 + 16 )),
};
/*
* QL3XXX memory-mapped registers
* QL3XXX has 4 "pages" of registers, each page occupying
* 256 bytes. Each page has a "common" area at the start and then
* page-specific registers after that.
*/
struct ql3xxx_common_registers {
u32 MB0; /* Offset 0x00 */
u32 MB1; /* Offset 0x04 */
u32 MB2; /* Offset 0x08 */
u32 MB3; /* Offset 0x0c */
u32 MB4; /* Offset 0x10 */
u32 MB5; /* Offset 0x14 */
u32 MB6; /* Offset 0x18 */
u32 MB7; /* Offset 0x1c */
u32 flashBiosAddr;
u32 flashBiosData;
u32 ispControlStatus;
u32 ispInterruptMaskReg;
u32 serialPortInterfaceReg;
u32 semaphoreReg;
u32 reqQProducerIndex;
u32 rspQConsumerIndex;
u32 rxLargeQProducerIndex;
u32 rxSmallQProducerIndex;
u32 arcMadiCommand;
u32 arcMadiData;
};
enum {
EXT_HW_CONFIG_SP_MASK = 0 x0006,
EXT_HW_CONFIG_SP_NONE = 0 x0000,
EXT_HW_CONFIG_SP_BYTE_PARITY = 0 x0002,
EXT_HW_CONFIG_SP_ECC = 0 x0004,
EXT_HW_CONFIG_SP_ECCx = 0 x0006,
EXT_HW_CONFIG_SIZE_MASK = 0 x0060,
EXT_HW_CONFIG_SIZE_128M = 0 x0000,
EXT_HW_CONFIG_SIZE_256M = 0 x0020,
EXT_HW_CONFIG_SIZE_512M = 0 x0040,
EXT_HW_CONFIG_SIZE_INVALID = 0 x0060,
EXT_HW_CONFIG_PD = 0 x0080,
EXT_HW_CONFIG_FW = 0 x0200,
EXT_HW_CONFIG_US = 0 x0400,
EXT_HW_CONFIG_DCS_MASK = 0 x1800,
EXT_HW_CONFIG_DCS_9MA = 0 x0000,
EXT_HW_CONFIG_DCS_15MA = 0 x0800,
EXT_HW_CONFIG_DCS_18MA = 0 x1000,
EXT_HW_CONFIG_DCS_24MA = 0 x1800,
EXT_HW_CONFIG_DDS_MASK = 0 x6000,
EXT_HW_CONFIG_DDS_9MA = 0 x0000,
EXT_HW_CONFIG_DDS_15MA = 0 x2000,
EXT_HW_CONFIG_DDS_18MA = 0 x4000,
EXT_HW_CONFIG_DDS_24MA = 0 x6000,
};
/* InternalChipConfig */
enum {
INTERNAL_CHIP_DM = 0 x0001,
INTERNAL_CHIP_SD = 0 x0002,
INTERNAL_CHIP_RAP_MASK = 0 x000C,
INTERNAL_CHIP_RAP_RR = 0 x0000,
INTERNAL_CHIP_RAP_NRM = 0 x0004,
INTERNAL_CHIP_RAP_ERM = 0 x0008,
INTERNAL_CHIP_RAP_ERMx = 0 x000C,
INTERNAL_CHIP_WE = 0 x0010,
INTERNAL_CHIP_EF = 0 x0020,
INTERNAL_CHIP_FR = 0 x0040,
INTERNAL_CHIP_FW = 0 x0080,
INTERNAL_CHIP_FI = 0 x0100,
INTERNAL_CHIP_FT = 0 x0200,
};
/* portControl */
enum {
PORT_CONTROL_DS = 0 x0001,
PORT_CONTROL_HH = 0 x0002,
PORT_CONTROL_EI = 0 x0004,
PORT_CONTROL_ET = 0 x0008,
PORT_CONTROL_EF = 0 x0010,
PORT_CONTROL_DRM = 0 x0020,
PORT_CONTROL_RLB = 0 x0040,
PORT_CONTROL_RCB = 0 x0080,
PORT_CONTROL_MAC = 0 x0100,
PORT_CONTROL_IPV = 0 x0200,
PORT_CONTROL_IFP = 0 x0400,
PORT_CONTROL_ITP = 0 x0800,
PORT_CONTROL_FI = 0 x1000,
PORT_CONTROL_DFP = 0 x2000,
PORT_CONTROL_OI = 0 x4000,
PORT_CONTROL_CC = 0 x8000,
};
/* portStatus */
enum {
PORT_STATUS_SM0 = 0 x0001,
PORT_STATUS_SM1 = 0 x0002,
PORT_STATUS_X = 0 x0008,
PORT_STATUS_DL = 0 x0080,
PORT_STATUS_IC = 0 x0200,
PORT_STATUS_MRC = 0 x0400,
PORT_STATUS_NL = 0 x0800,
PORT_STATUS_REV_ID_MASK = 0 x7000,
PORT_STATUS_REV_ID_1 = 0 x1000,
PORT_STATUS_REV_ID_2 = 0 x2000,
PORT_STATUS_REV_ID_3 = 0 x3000,
PORT_STATUS_64 = 0 x8000,
PORT_STATUS_UP0 = 0 x10000,
PORT_STATUS_AC0 = 0 x20000,
PORT_STATUS_AE0 = 0 x40000,
PORT_STATUS_UP1 = 0 x100000,
PORT_STATUS_AC1 = 0 x200000,
PORT_STATUS_AE1 = 0 x400000,
PORT_STATUS_F0_ENABLED = 0 x1000000,
PORT_STATUS_F1_ENABLED = 0 x2000000,
PORT_STATUS_F2_ENABLED = 0 x4000000,
PORT_STATUS_F3_ENABLED = 0 x8000000,
};
/* macMIIMgmtControlReg */
enum {
MAC_ADDR_INDIRECT_PTR_REG_RP_MASK = 0 x0003,
MAC_ADDR_INDIRECT_PTR_REG_RP_PRI_LWR = 0 x0000,
MAC_ADDR_INDIRECT_PTR_REG_RP_PRI_UPR = 0 x0001,
MAC_ADDR_INDIRECT_PTR_REG_RP_SEC_LWR = 0 x0002,
MAC_ADDR_INDIRECT_PTR_REG_RP_SEC_UPR = 0 x0003,
MAC_ADDR_INDIRECT_PTR_REG_PR = 0 x0008,
MAC_ADDR_INDIRECT_PTR_REG_SS = 0 x0010,
MAC_ADDR_INDIRECT_PTR_REG_SE = 0 x0020,
MAC_ADDR_INDIRECT_PTR_REG_SP = 0 x0040,
MAC_ADDR_INDIRECT_PTR_REG_PE = 0 x0080,
};
/* macMIIMgmtControlReg */
enum {
MAC_MII_CONTROL_RC = 0 x0001,
MAC_MII_CONTROL_SC = 0 x0002,
MAC_MII_CONTROL_AS = 0 x0004,
MAC_MII_CONTROL_NP = 0 x0008,
MAC_MII_CONTROL_CLK_SEL_MASK = 0 x0070,
MAC_MII_CONTROL_CLK_SEL_DIV2 = 0 x0000,
MAC_MII_CONTROL_CLK_SEL_DIV4 = 0 x0010,
MAC_MII_CONTROL_CLK_SEL_DIV6 = 0 x0020,
MAC_MII_CONTROL_CLK_SEL_DIV8 = 0 x0030,
MAC_MII_CONTROL_CLK_SEL_DIV10 = 0 x0040,
MAC_MII_CONTROL_CLK_SEL_DIV14 = 0 x0050,
MAC_MII_CONTROL_CLK_SEL_DIV20 = 0 x0060,
MAC_MII_CONTROL_CLK_SEL_DIV28 = 0 x0070,
MAC_MII_CONTROL_RM = 0 x8000,
};
/* macMIIStatusReg */
enum {
MAC_MII_STATUS_BSY = 0 x0001,
MAC_MII_STATUS_SC = 0 x0002,
MAC_MII_STATUS_NV = 0 x0004,
};
enum {
MAC_CONFIG_REG_PE = 0 x0001,
MAC_CONFIG_REG_TF = 0 x0002,
MAC_CONFIG_REG_RF = 0 x0004,
MAC_CONFIG_REG_FD = 0 x0008,
MAC_CONFIG_REG_GM = 0 x0010,
MAC_CONFIG_REG_LB = 0 x0020,
MAC_CONFIG_REG_SR = 0 x8000,
};
enum {
MAC_HALF_DUPLEX_REG_ED = 0 x10000,
MAC_HALF_DUPLEX_REG_NB = 0 x20000,
MAC_HALF_DUPLEX_REG_BNB = 0 x40000,
MAC_HALF_DUPLEX_REG_ALT = 0 x80000,
};
enum {
IP_ADDR_INDEX_REG_MASK = 0 x000f,
IP_ADDR_INDEX_REG_FUNC_0_PRI = 0 x0000,
IP_ADDR_INDEX_REG_FUNC_0_SEC = 0 x0001,
IP_ADDR_INDEX_REG_FUNC_1_PRI = 0 x0002,
IP_ADDR_INDEX_REG_FUNC_1_SEC = 0 x0003,
IP_ADDR_INDEX_REG_FUNC_2_PRI = 0 x0004,
IP_ADDR_INDEX_REG_FUNC_2_SEC = 0 x0005,
IP_ADDR_INDEX_REG_FUNC_3_PRI = 0 x0006,
IP_ADDR_INDEX_REG_FUNC_3_SEC = 0 x0007,
IP_ADDR_INDEX_REG_6 = 0 x0008,
IP_ADDR_INDEX_REG_OFFSET_MASK = 0 x0030,
IP_ADDR_INDEX_REG_E = 0 x0040,
};
enum {
QL3032_PORT_CONTROL_DS = 0 x0001,
QL3032_PORT_CONTROL_HH = 0 x0002,
QL3032_PORT_CONTROL_EIv6 = 0 x0004,
QL3032_PORT_CONTROL_EIv4 = 0 x0008,
QL3032_PORT_CONTROL_ET = 0 x0010,
QL3032_PORT_CONTROL_EF = 0 x0020,
QL3032_PORT_CONTROL_DRM = 0 x0040,
QL3032_PORT_CONTROL_RLB = 0 x0080,
QL3032_PORT_CONTROL_RCB = 0 x0100,
QL3032_PORT_CONTROL_KIE = 0 x0200,
};
enum {
PROBE_MUX_ADDR_REG_MUX_SEL_MASK = 0 x003f,
PROBE_MUX_ADDR_REG_SYSCLK = 0 x0000,
PROBE_MUX_ADDR_REG_PCICLK = 0 x0040,
PROBE_MUX_ADDR_REG_NRXCLK = 0 x0080,
PROBE_MUX_ADDR_REG_CPUCLK = 0 x00C0,
PROBE_MUX_ADDR_REG_MODULE_SEL_MASK = 0 x3f00,
PROBE_MUX_ADDR_REG_UP = 0 x4000,
PROBE_MUX_ADDR_REG_RE = 0 x8000,
};
enum {
STATISTICS_INDEX_REG_MASK = 0 x01ff,
STATISTICS_INDEX_REG_MAC0_TX_FRAME = 0 x0000,
STATISTICS_INDEX_REG_MAC0_TX_BYTES = 0 x0001,
STATISTICS_INDEX_REG_MAC0_TX_STAT1 = 0 x0002,
STATISTICS_INDEX_REG_MAC0_TX_STAT2 = 0 x0003,
STATISTICS_INDEX_REG_MAC0_TX_STAT3 = 0 x0004,
STATISTICS_INDEX_REG_MAC0_TX_STAT4 = 0 x0005,
STATISTICS_INDEX_REG_MAC0_TX_STAT5 = 0 x0006,
STATISTICS_INDEX_REG_MAC0_RX_FRAME = 0 x0007,
STATISTICS_INDEX_REG_MAC0_RX_BYTES = 0 x0008,
STATISTICS_INDEX_REG_MAC0_RX_STAT1 = 0 x0009,
STATISTICS_INDEX_REG_MAC0_RX_STAT2 = 0 x000a,
STATISTICS_INDEX_REG_MAC0_RX_STAT3 = 0 x000b,
STATISTICS_INDEX_REG_MAC0_RX_ERR_CRC = 0 x000c,
STATISTICS_INDEX_REG_MAC0_RX_ERR_ENC = 0 x000d,
STATISTICS_INDEX_REG_MAC0_RX_ERR_LEN = 0 x000e,
STATISTICS_INDEX_REG_MAC0_RX_STAT4 = 0 x000f,
STATISTICS_INDEX_REG_MAC1_TX_FRAME = 0 x0010,
STATISTICS_INDEX_REG_MAC1_TX_BYTES = 0 x0011,
STATISTICS_INDEX_REG_MAC1_TX_STAT1 = 0 x0012,
STATISTICS_INDEX_REG_MAC1_TX_STAT2 = 0 x0013,
STATISTICS_INDEX_REG_MAC1_TX_STAT3 = 0 x0014,
STATISTICS_INDEX_REG_MAC1_TX_STAT4 = 0 x0015,
STATISTICS_INDEX_REG_MAC1_TX_STAT5 = 0 x0016,
STATISTICS_INDEX_REG_MAC1_RX_FRAME = 0 x0017,
STATISTICS_INDEX_REG_MAC1_RX_BYTES = 0 x0018,
STATISTICS_INDEX_REG_MAC1_RX_STAT1 = 0 x0019,
STATISTICS_INDEX_REG_MAC1_RX_STAT2 = 0 x001a,
STATISTICS_INDEX_REG_MAC1_RX_STAT3 = 0 x001b,
STATISTICS_INDEX_REG_MAC1_RX_ERR_CRC = 0 x001c,
STATISTICS_INDEX_REG_MAC1_RX_ERR_ENC = 0 x001d,
STATISTICS_INDEX_REG_MAC1_RX_ERR_LEN = 0 x001e,
STATISTICS_INDEX_REG_MAC1_RX_STAT4 = 0 x001f,
STATISTICS_INDEX_REG_IP_TX_PKTS = 0 x0020,
STATISTICS_INDEX_REG_IP_TX_BYTES = 0 x0021,
STATISTICS_INDEX_REG_IP_TX_FRAG = 0 x0022,
STATISTICS_INDEX_REG_IP_RX_PKTS = 0 x0023,
STATISTICS_INDEX_REG_IP_RX_BYTES = 0 x0024,
STATISTICS_INDEX_REG_IP_RX_FRAG = 0 x0025,
STATISTICS_INDEX_REG_IP_DGRM_REASSEMBLY = 0 x0026,
STATISTICS_INDEX_REG_IP_V6_RX_PKTS = 0 x0027,
STATISTICS_INDEX_REG_IP_RX_PKTERR = 0 x0028,
STATISTICS_INDEX_REG_IP_REASSEMBLY_ERR = 0 x0029,
STATISTICS_INDEX_REG_TCP_TX_SEG = 0 x0030,
STATISTICS_INDEX_REG_TCP_TX_BYTES = 0 x0031,
STATISTICS_INDEX_REG_TCP_RX_SEG = 0 x0032,
STATISTICS_INDEX_REG_TCP_RX_BYTES = 0 x0033,
STATISTICS_INDEX_REG_TCP_TIMER_EXP = 0 x0034,
STATISTICS_INDEX_REG_TCP_RX_ACK = 0 x0035,
STATISTICS_INDEX_REG_TCP_TX_ACK = 0 x0036,
STATISTICS_INDEX_REG_TCP_RX_ERR = 0 x0037,
STATISTICS_INDEX_REG_TCP_RX_WIN_PROBE = 0 x0038,
STATISTICS_INDEX_REG_TCP_ECC_ERR_CORR = 0 x003f,
};
enum {
PORT_FATAL_ERROR_STATUS_OFB_RE_MAC0 = 0 x00000001,
PORT_FATAL_ERROR_STATUS_OFB_RE_MAC1 = 0 x00000002,
PORT_FATAL_ERROR_STATUS_OFB_WE = 0 x00000004,
PORT_FATAL_ERROR_STATUS_IFB_RE = 0 x00000008,
PORT_FATAL_ERROR_STATUS_IFB_WE_MAC0 = 0 x00000010,
PORT_FATAL_ERROR_STATUS_IFB_WE_MAC1 = 0 x00000020,
PORT_FATAL_ERROR_STATUS_ODE_RE = 0 x00000040,
PORT_FATAL_ERROR_STATUS_ODE_WE = 0 x00000080,
PORT_FATAL_ERROR_STATUS_IDE_RE = 0 x00000100,
PORT_FATAL_ERROR_STATUS_IDE_WE = 0 x00000200,
PORT_FATAL_ERROR_STATUS_SDE_RE = 0 x00000400,
PORT_FATAL_ERROR_STATUS_SDE_WE = 0 x00000800,
PORT_FATAL_ERROR_STATUS_BLE = 0 x00001000,
PORT_FATAL_ERROR_STATUS_SPE = 0 x00002000,
PORT_FATAL_ERROR_STATUS_EP0 = 0 x00004000,
PORT_FATAL_ERROR_STATUS_EP1 = 0 x00008000,
PORT_FATAL_ERROR_STATUS_ICE = 0 x00010000,
PORT_FATAL_ERROR_STATUS_ILE = 0 x00020000,
PORT_FATAL_ERROR_STATUS_OPE = 0 x00040000,
PORT_FATAL_ERROR_STATUS_TA = 0 x00080000,
PORT_FATAL_ERROR_STATUS_MA = 0 x00100000,
PORT_FATAL_ERROR_STATUS_SCE = 0 x00200000,
PORT_FATAL_ERROR_STATUS_RPE = 0 x00400000,
PORT_FATAL_ERROR_STATUS_MPE = 0 x00800000,
PORT_FATAL_ERROR_STATUS_OCE = 0 x01000000,
};
/*
* port control and status page - page 0
*/
struct ql3xxx_port_registers {
struct ql3xxx_common_registers CommonRegs;
u32 ExternalHWConfig;
u32 InternalChipConfig;
u32 portControl;
u32 portStatus;
u32 macAddrIndirectPtrReg;
u32 macAddrDataReg;
u32 macMIIMgmtControlReg;
u32 macMIIMgmtAddrReg;
u32 macMIIMgmtDataReg;
u32 macMIIStatusReg;
u32 mac0ConfigReg;
u32 mac0IpgIfgReg;
u32 mac0HalfDuplexReg;
u32 mac0MaxFrameLengthReg;
u32 mac0PauseThresholdReg;
u32 mac1ConfigReg;
u32 mac1IpgIfgReg;
u32 mac1HalfDuplexReg;
u32 mac1MaxFrameLengthReg;
u32 mac1PauseThresholdReg;
u32 ipAddrIndexReg;
u32 ipAddrDataReg;
u32 ipReassemblyTimeout;
u32 tcpMaxWindow;
u32 currentTcpTimestamp[2 ];
u32 internalRamRWAddrReg;
u32 internalRamWDataReg;
u32 reclaimedBufferAddrRegLow;
u32 reclaimedBufferAddrRegHigh;
u32 tcpConfiguration;
u32 functionControl;
u32 fpgaRevID;
u32 localRamAddr;
u32 localRamDataAutoIncr;
u32 localRamDataNonIncr;
u32 gpOutput;
u32 gpInput;
u32 probeMuxAddr;
u32 probeMuxData;
u32 statisticsIndexReg;
u32 statisticsReadDataRegAutoIncr;
u32 statisticsReadDataRegNoIncr;
u32 PortFatalErrStatus;
};
/*
* port host memory config page - page 1
*/
struct ql3xxx_host_memory_registers {
struct ql3xxx_common_registers CommonRegs;
u32 reserved[12 ];
/* Network Request Queue */
u32 reqConsumerIndex;
u32 reqConsumerIndexAddrLow;
u32 reqConsumerIndexAddrHigh;
u32 reqBaseAddrLow;
u32 reqBaseAddrHigh;
u32 reqLength;
/* Network Completion Queue */
u32 rspProducerIndex;
u32 rspProducerIndexAddrLow;
u32 rspProducerIndexAddrHigh;
u32 rspBaseAddrLow;
u32 rspBaseAddrHigh;
u32 rspLength;
/* RX Large Buffer Queue */
u32 rxLargeQConsumerIndex;
u32 rxLargeQBaseAddrLow;
u32 rxLargeQBaseAddrHigh;
u32 rxLargeQLength;
u32 rxLargeBufferLength;
/* RX Small Buffer Queue */
u32 rxSmallQConsumerIndex;
u32 rxSmallQBaseAddrLow;
u32 rxSmallQBaseAddrHigh;
u32 rxSmallQLength;
u32 rxSmallBufferLength;
};
/*
* port local RAM page - page 2
*/
struct ql3xxx_local_ram_registers {
struct ql3xxx_common_registers CommonRegs;
u32 bufletSize;
u32 maxBufletCount;
u32 currentBufletCount;
u32 reserved;
u32 freeBufletThresholdLow;
u32 freeBufletThresholdHigh;
u32 ipHashTableBase;
u32 ipHashTableCount;
u32 tcpHashTableBase;
u32 tcpHashTableCount;
u32 ncbBase;
u32 maxNcbCount;
u32 currentNcbCount;
u32 drbBase;
u32 maxDrbCount;
u32 currentDrbCount;
};
/*
* definitions for Semaphore bits in Semaphore/Serial NVRAM interface register
*/
#define LS_64BITS(x) (u32)(0 xffffffff & ((u64)x))
#define MS_64BITS(x) (u32)(0 xffffffff & (((u64)x)>>16 >>16 ) )
/*
* I/O register
*/
enum {
CONTROL_REG = 0 ,
STATUS_REG = 1 ,
PHY_STAT_LINK_UP = 0 x0004,
PHY_CTRL_LOOPBACK = 0 x4000,
PETBI_CONTROL_REG = 0 x00,
PETBI_CTRL_ALL_PARAMS = 0 x7140,
PETBI_CTRL_SOFT_RESET = 0 x8000,
PETBI_CTRL_AUTO_NEG = 0 x1000,
PETBI_CTRL_RESTART_NEG = 0 x0200,
PETBI_CTRL_FULL_DUPLEX = 0 x0100,
PETBI_CTRL_SPEED_1000 = 0 x0040,
PETBI_STATUS_REG = 0 x01,
PETBI_STAT_NEG_DONE = 0 x0020,
PETBI_STAT_LINK_UP = 0 x0004,
PETBI_NEG_ADVER = 0 x04,
PETBI_NEG_PAUSE = 0 x0080,
PETBI_NEG_PAUSE_MASK = 0 x0180,
PETBI_NEG_DUPLEX = 0 x0020,
PETBI_NEG_DUPLEX_MASK = 0 x0060,
PETBI_NEG_PARTNER = 0 x05,
PETBI_NEG_ERROR_MASK = 0 x3000,
PETBI_EXPANSION_REG = 0 x06,
PETBI_EXP_PAGE_RX = 0 x0002,
PHY_GIG_CONTROL = 9 ,
PHY_GIG_ENABLE_MAN = 0 x1000, /* Enable Master/Slave Manual Config*/
PHY_GIG_SET_MASTER = 0 x0800, /* Set Master (slave if clear)*/
PHY_GIG_ALL_PARAMS = 0 x0300,
PHY_GIG_ADV_1000F = 0 x0200,
PHY_GIG_ADV_1000H = 0 x0100,
PHY_NEG_ADVER = 4 ,
PHY_NEG_ALL_PARAMS = 0 x0fe0,
PHY_NEG_ASY_PAUSE = 0 x0800,
PHY_NEG_SYM_PAUSE = 0 x0400,
PHY_NEG_ADV_SPEED = 0 x01e0,
PHY_NEG_ADV_100F = 0 x0100,
PHY_NEG_ADV_100H = 0 x0080,
PHY_NEG_ADV_10F = 0 x0040,
PHY_NEG_ADV_10H = 0 x0020,
PETBI_TBI_CTRL = 0 x11,
PETBI_TBI_RESET = 0 x8000,
PETBI_TBI_AUTO_SENSE = 0 x0100,
PETBI_TBI_SERDES_MODE = 0 x0010,
PETBI_TBI_SERDES_WRAP = 0 x0002,
AUX_CONTROL_STATUS = 0 x1c,
PHY_AUX_NEG_DONE = 0 x8000,
PHY_NEG_PARTNER = 5 ,
PHY_AUX_DUPLEX_STAT = 0 x0020,
PHY_AUX_SPEED_STAT = 0 x0018,
PHY_AUX_NO_HW_STRAP = 0 x0004,
PHY_AUX_RESET_STICK = 0 x0002,
PHY_NEG_PAUSE = 0 x0400,
PHY_CTRL_SOFT_RESET = 0 x8000,
PHY_CTRL_AUTO_NEG = 0 x1000,
PHY_CTRL_RESTART_NEG = 0 x0200,
};
enum {
/* AM29LV Flash definitions */
FM93C56A_START = 0 x1,
/* Commands */
FM93C56A_READ = 0 x2,
FM93C56A_WEN = 0 x0,
FM93C56A_WRITE = 0 x1,
FM93C56A_WRITE_ALL = 0 x0,
FM93C56A_WDS = 0 x0,
FM93C56A_ERASE = 0 x3,
FM93C56A_ERASE_ALL = 0 x0,
/* Command Extensions */
FM93C56A_WEN_EXT = 0 x3,
FM93C56A_WRITE_ALL_EXT = 0 x1,
FM93C56A_WDS_EXT = 0 x0,
FM93C56A_ERASE_ALL_EXT = 0 x2,
/* Special Bits */
FM93C56A_READ_DUMMY_BITS = 1 ,
FM93C56A_READY = 0 ,
FM93C56A_BUSY = 1 ,
FM93C56A_CMD_BITS = 2 ,
/* AM29LV Flash definitions */
FM93C56A_SIZE_8 = 0 x100,
FM93C56A_SIZE_16 = 0 x80,
FM93C66A_SIZE_8 = 0 x200,
FM93C66A_SIZE_16 = 0 x100,
FM93C86A_SIZE_16 = 0 x400,
/* Address Bits */
FM93C56A_NO_ADDR_BITS_16 = 8 ,
FM93C56A_NO_ADDR_BITS_8 = 9 ,
FM93C86A_NO_ADDR_BITS_16 = 10 ,
/* Data Bits */
FM93C56A_DATA_BITS_16 = 16 ,
FM93C56A_DATA_BITS_8 = 8 ,
};
enum {
/* Auburn Bits */
AUBURN_EEPROM_DI = 0 x8,
AUBURN_EEPROM_DI_0 = 0 x0,
AUBURN_EEPROM_DI_1 = 0 x8,
AUBURN_EEPROM_DO = 0 x4,
AUBURN_EEPROM_DO_0 = 0 x0,
AUBURN_EEPROM_DO_1 = 0 x4,
AUBURN_EEPROM_CS = 0 x2,
AUBURN_EEPROM_CS_0 = 0 x0,
AUBURN_EEPROM_CS_1 = 0 x2,
AUBURN_EEPROM_CLK_RISE = 0 x1,
AUBURN_EEPROM_CLK_FALL = 0 x0,
};
enum {EEPROM_SIZE = FM93C86A_SIZE_16,
EEPROM_NO_ADDR_BITS = FM93C86A_NO_ADDR_BITS_16,
EEPROM_NO_DATA_BITS = FM93C56A_DATA_BITS_16,
};
/*
* MAC Config data structure
*/
struct eeprom_port_cfg {
u16 etherMtu_mac;
u16 pauseThreshold_mac;
u16 resumeThreshold_mac;
u16 portConfiguration;
#define PORT_CONFIG_DEFAULT 0 xf700
#define PORT_CONFIG_AUTO_NEG_ENABLED 0 x8000
#define PORT_CONFIG_SYM_PAUSE_ENABLED 0 x4000
#define PORT_CONFIG_FULL_DUPLEX_ENABLED 0 x2000
#define PORT_CONFIG_HALF_DUPLEX_ENABLED 0 x1000
#define PORT_CONFIG_1000MB_SPEED 0 x0400
#define PORT_CONFIG_100MB_SPEED 0 x0200
#define PORT_CONFIG_10MB_SPEED 0 x0100
#define PORT_CONFIG_LINK_SPEED_MASK 0 x0F00
u16 reserved[12 ];
};
/*
* BIOS data structure
*/
struct eeprom_bios_cfg {
u16 SpinDlyEn:1 , disBios:1 , EnMemMap:1 , EnSelectBoot:1 , Reserved:12 ;
u8 bootID0:7 , boodID0Valid:1 ;
u8 bootLun0[8 ];
u8 bootID1:7 , boodID1Valid:1 ;
u8 bootLun1[8 ];
u16 MaxLunsTrgt;
u8 reserved[10 ];
};
/*
* Function Specific Data structure
*/
struct eeprom_function_cfg {
u8 reserved[30 ];
u16 macAddress[3 ];
u16 macAddressSecondary[3 ];
u16 subsysVendorId;
u16 subsysDeviceId;
};
/*
* EEPROM format
*/
struct eeprom_data {
u8 asicId[4 ];
u16 version_and_numPorts; /* together to avoid endianness crap */
u16 boardId;
#define EEPROM_BOARDID_STR_SIZE 16
#define EEPROM_SERIAL_NUM_SIZE 16
u8 boardIdStr[16 ];
u8 serialNumber[16 ];
u16 extHwConfig;
struct eeprom_port_cfg macCfg_port0;
struct eeprom_port_cfg macCfg_port1;
u16 bufletSize;
u16 bufletCount;
u16 tcpWindowThreshold50;
u16 tcpWindowThreshold25;
u16 tcpWindowThreshold0;
u16 ipHashTableBaseHi;
u16 ipHashTableBaseLo;
u16 ipHashTableSize;
u16 tcpHashTableBaseHi;
u16 tcpHashTableBaseLo;
u16 tcpHashTableSize;
u16 ncbTableBaseHi;
u16 ncbTableBaseLo;
u16 ncbTableSize;
u16 drbTableBaseHi;
u16 drbTableBaseLo;
u16 drbTableSize;
u16 reserved_142[4 ];
u16 ipReassemblyTimeout;
u16 tcpMaxWindowSize;
u16 ipSecurity;
#define IPSEC_CONFIG_PRESENT 0 x0001
u8 reserved_156[294 ];
u16 qDebug[8 ];
struct eeprom_function_cfg funcCfg_fn0;
u16 reserved_510;
u8 oemSpace[432 ];
struct eeprom_bios_cfg biosCfg_fn1;
struct eeprom_function_cfg funcCfg_fn1;
u16 reserved_1022;
u8 reserved_1024[464 ];
struct eeprom_function_cfg funcCfg_fn2;
u16 reserved_1534;
u8 reserved_1536[432 ];
struct eeprom_bios_cfg biosCfg_fn3;
struct eeprom_function_cfg funcCfg_fn3;
u16 checksum;
};
/*
* General definitions...
*/
/*
* Below are a number compiler switches for controlling driver behavior.
* Some are not supported under certain conditions and are notated as such.
*/
#define QL3XXX_VENDOR_ID 0 x1077
#define QL3022_DEVICE_ID 0 x3022
#define QL3032_DEVICE_ID 0 x3032
/* MTU & Frame Size stuff */
#define NORMAL_MTU_SIZE ETH_DATA_LEN
#define JUMBO_MTU_SIZE 9000
#define VLAN_ID_LEN 2
/* Request Queue Related Definitions */
#define NUM_REQ_Q_ENTRIES 256 /* so that 64 * 64 = 4096 (1 page) */
/* Response Queue Related Definitions */
#define NUM_RSP_Q_ENTRIES 256 /* so that 256 * 16 = 4096 (1 page) */
/* Transmit and Receive Buffers */
#define NUM_LBUFQ_ENTRIES 128
#define JUMBO_NUM_LBUFQ_ENTRIES 32
#define NUM_SBUFQ_ENTRIES 64
#define QL_SMALL_BUFFER_SIZE 32
#define QL_ADDR_ELE_PER_BUFQ_ENTRY \
(sizeof (struct lrg_buf_q_entry) / sizeof (struct bufq_addr_element))
/* Each send has at least control block. This is how many we keep. */
#define NUM_SMALL_BUFFERS NUM_SBUFQ_ENTRIES * QL_ADDR_ELE_PER_BUFQ_ENTRY
#define QL_HEADER_SPACE 32 /* make header space at top of skb. */
/*
* Large & Small Buffers for Receives
*/
struct lrg_buf_q_entry {
__le32 addr0_lower;
#define IAL_LAST_ENTRY 0 x00000001
#define IAL_CONT_ENTRY 0 x00000002
#define IAL_FLAG_MASK 0 x00000003
__le32 addr0_upper;
__le32 addr1_lower;
__le32 addr1_upper;
__le32 addr2_lower;
__le32 addr2_upper;
__le32 addr3_lower;
__le32 addr3_upper;
__le32 addr4_lower;
__le32 addr4_upper;
__le32 addr5_lower;
__le32 addr5_upper;
__le32 addr6_lower;
__le32 addr6_upper;
__le32 addr7_lower;
__le32 addr7_upper;
};
struct bufq_addr_element {
__le32 addr_low;
__le32 addr_high;
};
#define QL_NO_RESET 0
#define QL_DO_RESET 1
enum link_state_t {
LS_UNKNOWN = 0 ,
LS_DOWN,
LS_DEGRADE,
LS_RECOVER,
LS_UP,
};
struct ql_rcv_buf_cb {
struct ql_rcv_buf_cb *next;
struct sk_buff *skb;
DEFINE_DMA_UNMAP_ADDR(mapaddr);
DEFINE_DMA_UNMAP_LEN(maplen);
__le32 buf_phy_addr_low;
__le32 buf_phy_addr_high;
int index;
};
/*
* Original IOCB has 3 sg entries:
* first points to skb-data area
* second points to first frag
* third points to next oal.
* OAL has 5 entries:
* 1 thru 4 point to frags
* fifth points to next oal.
*/
#define MAX_OAL_CNT ((MAX_SKB_FRAGS-1 )/4 + 1 )
struct oal_entry {
__le32 dma_lo;
__le32 dma_hi;
__le32 len;
#define OAL_LAST_ENTRY 0 x80000000 /* Last valid buffer in list. */
#define OAL_CONT_ENTRY 0 x40000000 /* points to an OAL. (continuation) */
};
struct oal {
struct oal_entry oal_entry[5 ];
};
struct map_list {
DEFINE_DMA_UNMAP_ADDR(mapaddr);
DEFINE_DMA_UNMAP_LEN(maplen);
};
struct ql_tx_buf_cb {
struct sk_buff *skb;
struct ob_mac_iocb_req *queue_entry ;
int seg_count;
struct oal *oal;
struct map_list map[MAX_SKB_FRAGS+1 ];
};
/* definitions for type field */
#define QL_BUF_TYPE_MACIOCB 0 x01
#define QL_BUF_TYPE_IPIOCB 0 x02
#define QL_BUF_TYPE_TCPIOCB 0 x03
/* qdev->flags definitions. */
enum { QL_RESET_DONE = 1 , /* Reset finished. */
QL_RESET_ACTIVE = 2 , /* Waiting for reset to finish. */
QL_RESET_START = 3 , /* Please reset the chip. */
QL_RESET_PER_SCSI = 4 , /* SCSI driver requests reset. */
QL_TX_TIMEOUT = 5 , /* Timeout in progress. */
QL_LINK_MASTER = 6 , /* This driver controls the link. */
QL_ADAPTER_UP = 7 , /* Adapter has been brought up. */
QL_THREAD_UP = 8 , /* This flag is available. */
QL_LINK_UP = 9 , /* Link Status. */
QL_ALLOC_REQ_RSP_Q_DONE = 10 ,
QL_ALLOC_BUFQS_DONE = 11 ,
QL_ALLOC_SMALL_BUF_DONE = 12 ,
QL_LINK_OPTICAL = 13 ,
QL_MSI_ENABLED = 14 ,
};
/*
* ql3_adapter - The main Adapter structure definition.
* This structure has all fields relevant to the hardware.
*/
struct ql3_adapter {
u32 reserved_00;
unsigned long flags;
/* PCI Configuration information for this device */
struct pci_dev *pdev;
struct net_device *ndev; /* Parent NET device */
struct napi_struct napi;
/* Hardware information */
u8 chip_rev_id;
u8 pci_slot;
u8 pci_width;
u8 pci_x;
u32 msi;
int index;
struct timer_list adapter_timer; /* timer used for various functions */
spinlock_t adapter_lock;
spinlock_t hw_lock;
/* PCI Bus Relative Register Addresses */
u8 __iomem *mmap_virt_base; /* stores return value from ioremap() */
struct ql3xxx_port_registers __iomem *mem_map_registers;
u32 current_page; /* tracks current register page */
u32 msg_enable;
u8 reserved_01[2 ];
u8 reserved_02[2 ];
/* Page for Shadow Registers */
void *shadow_reg_virt_addr;
dma_addr_t shadow_reg_phy_addr;
/* Net Request Queue */
u32 req_q_size;
u32 reserved_03;
struct ob_mac_iocb_req *req_q_virt_addr;
dma_addr_t req_q_phy_addr;
u16 req_producer_index;
u16 reserved_04;
u16 *preq_consumer_index;
u32 req_consumer_index_phy_addr_high;
u32 req_consumer_index_phy_addr_low;
atomic_t tx_count;
struct ql_tx_buf_cb tx_buf[NUM_REQ_Q_ENTRIES];
/* Net Response Queue */
u32 rsp_q_size;
u32 eeprom_cmd_data;
struct net_rsp_iocb *rsp_q_virt_addr;
dma_addr_t rsp_q_phy_addr;
struct net_rsp_iocb *rsp_current;
u16 rsp_consumer_index;
u16 reserved_06;
volatile __le32 *prsp_producer_index;
u32 rsp_producer_index_phy_addr_high;
u32 rsp_producer_index_phy_addr_low;
/* Large Buffer Queue */
u32 lrg_buf_q_alloc_size;
u32 lrg_buf_q_size;
void *lrg_buf_q_alloc_virt_addr;
void *lrg_buf_q_virt_addr;
dma_addr_t lrg_buf_q_alloc_phy_addr;
dma_addr_t lrg_buf_q_phy_addr;
u32 lrg_buf_q_producer_index;
u32 lrg_buf_release_cnt;
struct bufq_addr_element *lrg_buf_next_free;
u32 num_large_buffers;
u32 num_lbufq_entries;
/* Large (Receive) Buffers */
struct ql_rcv_buf_cb *lrg_buf;
struct ql_rcv_buf_cb *lrg_buf_free_head;
struct ql_rcv_buf_cb *lrg_buf_free_tail;
u32 lrg_buf_free_count;
u32 lrg_buffer_len;
u32 lrg_buf_index;
u32 lrg_buf_skb_check;
/* Small Buffer Queue */
u32 small_buf_q_alloc_size;
u32 small_buf_q_size;
u32 small_buf_q_producer_index;
void *small_buf_q_alloc_virt_addr;
void *small_buf_q_virt_addr;
dma_addr_t small_buf_q_alloc_phy_addr;
dma_addr_t small_buf_q_phy_addr;
u32 small_buf_index;
/* Small (Receive) Buffers */
void *small_buf_virt_addr;
dma_addr_t small_buf_phy_addr;
u32 small_buf_phy_addr_low;
u32 small_buf_phy_addr_high;
u32 small_buf_release_cnt;
u32 small_buf_total_size;
struct eeprom_data nvram_data;
u32 port_link_state;
/* 4022 specific */
u32 mac_index; /* Driver's MAC number can be 0 or 1 for first and second networking functions respectively */
u32 PHYAddr; /* Address of PHY 0x1e00 Port 0 and 0x1f00 Port 1 */
u32 mac_ob_opcode; /* Opcode to use on mac transmission */
u32 mb_bit_mask; /* MA Bits mask to use on transmission */
u32 numPorts;
struct workqueue_struct *workqueue;
struct delayed_work reset_work;
struct delayed_work tx_timeout_work;
struct delayed_work link_state_work;
u32 max_frame_size;
u32 device_id;
u16 phyType;
};
#endif /* _QLA3XXX_H_ */
Messung V0.5 in Prozent C=95 H=93 G=93
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet am 2026-06-07)
¤
*© Formatika GbR, Deutschland