1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * QLogic QLA3xxx NIC HBA Driver 4*4882a593Smuzhiyun * Copyright (c) 2003-2006 QLogic Corporation 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #ifndef _QLA3XXX_H_ 7*4882a593Smuzhiyun #define _QLA3XXX_H_ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* 10*4882a593Smuzhiyun * IOCB Definitions... 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun #pragma pack(1) 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define OPCODE_OB_MAC_IOCB_FN0 0x01 15*4882a593Smuzhiyun #define OPCODE_OB_MAC_IOCB_FN2 0x21 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define OPCODE_IB_MAC_IOCB 0xF9 18*4882a593Smuzhiyun #define OPCODE_IB_3032_MAC_IOCB 0x09 19*4882a593Smuzhiyun #define OPCODE_IB_IP_IOCB 0xFA 20*4882a593Smuzhiyun #define OPCODE_IB_3032_IP_IOCB 0x0A 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define OPCODE_FUNC_ID_MASK 0x30 23*4882a593Smuzhiyun #define OUTBOUND_MAC_IOCB 0x01 /* plus function bits */ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define FN0_MA_BITS_MASK 0x00 26*4882a593Smuzhiyun #define FN1_MA_BITS_MASK 0x80 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct ob_mac_iocb_req { 29*4882a593Smuzhiyun u8 opcode; 30*4882a593Smuzhiyun u8 flags; 31*4882a593Smuzhiyun #define OB_MAC_IOCB_REQ_MA 0xe0 32*4882a593Smuzhiyun #define OB_MAC_IOCB_REQ_F 0x10 33*4882a593Smuzhiyun #define OB_MAC_IOCB_REQ_X 0x08 34*4882a593Smuzhiyun #define OB_MAC_IOCB_REQ_D 0x02 35*4882a593Smuzhiyun #define OB_MAC_IOCB_REQ_I 0x01 36*4882a593Smuzhiyun u8 flags1; 37*4882a593Smuzhiyun #define OB_3032MAC_IOCB_REQ_IC 0x04 38*4882a593Smuzhiyun #define OB_3032MAC_IOCB_REQ_TC 0x02 39*4882a593Smuzhiyun #define OB_3032MAC_IOCB_REQ_UC 0x01 40*4882a593Smuzhiyun u8 reserved0; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun u32 transaction_id; /* opaque for hardware */ 43*4882a593Smuzhiyun __le16 data_len; 44*4882a593Smuzhiyun u8 ip_hdr_off; 45*4882a593Smuzhiyun u8 ip_hdr_len; 46*4882a593Smuzhiyun __le32 reserved1; 47*4882a593Smuzhiyun __le32 reserved2; 48*4882a593Smuzhiyun __le32 buf_addr0_low; 49*4882a593Smuzhiyun __le32 buf_addr0_high; 50*4882a593Smuzhiyun __le32 buf_0_len; 51*4882a593Smuzhiyun __le32 buf_addr1_low; 52*4882a593Smuzhiyun __le32 buf_addr1_high; 53*4882a593Smuzhiyun __le32 buf_1_len; 54*4882a593Smuzhiyun __le32 buf_addr2_low; 55*4882a593Smuzhiyun __le32 buf_addr2_high; 56*4882a593Smuzhiyun __le32 buf_2_len; 57*4882a593Smuzhiyun __le32 reserved3; 58*4882a593Smuzhiyun __le32 reserved4; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun /* 61*4882a593Smuzhiyun * The following constants define control bits for buffer 62*4882a593Smuzhiyun * length fields for all IOCB's. 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun #define OB_MAC_IOCB_REQ_E 0x80000000 /* Last valid buffer in list. */ 65*4882a593Smuzhiyun #define OB_MAC_IOCB_REQ_C 0x40000000 /* points to an OAL. (continuation) */ 66*4882a593Smuzhiyun #define OB_MAC_IOCB_REQ_L 0x20000000 /* Auburn local address pointer. */ 67*4882a593Smuzhiyun #define OB_MAC_IOCB_REQ_R 0x10000000 /* 32-bit address pointer. */ 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct ob_mac_iocb_rsp { 70*4882a593Smuzhiyun u8 opcode; 71*4882a593Smuzhiyun u8 flags; 72*4882a593Smuzhiyun #define OB_MAC_IOCB_RSP_P 0x08 73*4882a593Smuzhiyun #define OB_MAC_IOCB_RSP_L 0x04 74*4882a593Smuzhiyun #define OB_MAC_IOCB_RSP_S 0x02 75*4882a593Smuzhiyun #define OB_MAC_IOCB_RSP_I 0x01 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun __le16 reserved0; 78*4882a593Smuzhiyun u32 transaction_id; /* opaque for hardware */ 79*4882a593Smuzhiyun __le32 reserved1; 80*4882a593Smuzhiyun __le32 reserved2; 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun struct ib_mac_iocb_rsp { 84*4882a593Smuzhiyun u8 opcode; 85*4882a593Smuzhiyun #define IB_MAC_IOCB_RSP_V 0x80 86*4882a593Smuzhiyun u8 flags; 87*4882a593Smuzhiyun #define IB_MAC_IOCB_RSP_S 0x80 88*4882a593Smuzhiyun #define IB_MAC_IOCB_RSP_H1 0x40 89*4882a593Smuzhiyun #define IB_MAC_IOCB_RSP_H0 0x20 90*4882a593Smuzhiyun #define IB_MAC_IOCB_RSP_B 0x10 91*4882a593Smuzhiyun #define IB_MAC_IOCB_RSP_M 0x08 92*4882a593Smuzhiyun #define IB_MAC_IOCB_RSP_MA 0x07 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun __le16 length; 95*4882a593Smuzhiyun __le32 reserved; 96*4882a593Smuzhiyun __le32 ial_low; 97*4882a593Smuzhiyun __le32 ial_high; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun struct ob_ip_iocb_req { 102*4882a593Smuzhiyun u8 opcode; 103*4882a593Smuzhiyun __le16 flags; 104*4882a593Smuzhiyun #define OB_IP_IOCB_REQ_O 0x100 105*4882a593Smuzhiyun #define OB_IP_IOCB_REQ_H 0x008 106*4882a593Smuzhiyun #define OB_IP_IOCB_REQ_U 0x004 107*4882a593Smuzhiyun #define OB_IP_IOCB_REQ_D 0x002 108*4882a593Smuzhiyun #define OB_IP_IOCB_REQ_I 0x001 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun u8 reserved0; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun __le32 transaction_id; 113*4882a593Smuzhiyun __le16 data_len; 114*4882a593Smuzhiyun __le16 reserved1; 115*4882a593Smuzhiyun __le32 hncb_ptr_low; 116*4882a593Smuzhiyun __le32 hncb_ptr_high; 117*4882a593Smuzhiyun __le32 buf_addr0_low; 118*4882a593Smuzhiyun __le32 buf_addr0_high; 119*4882a593Smuzhiyun __le32 buf_0_len; 120*4882a593Smuzhiyun __le32 buf_addr1_low; 121*4882a593Smuzhiyun __le32 buf_addr1_high; 122*4882a593Smuzhiyun __le32 buf_1_len; 123*4882a593Smuzhiyun __le32 buf_addr2_low; 124*4882a593Smuzhiyun __le32 buf_addr2_high; 125*4882a593Smuzhiyun __le32 buf_2_len; 126*4882a593Smuzhiyun __le32 reserved2; 127*4882a593Smuzhiyun __le32 reserved3; 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* defines for BufferLength fields above */ 131*4882a593Smuzhiyun #define OB_IP_IOCB_REQ_E 0x80000000 132*4882a593Smuzhiyun #define OB_IP_IOCB_REQ_C 0x40000000 133*4882a593Smuzhiyun #define OB_IP_IOCB_REQ_L 0x20000000 134*4882a593Smuzhiyun #define OB_IP_IOCB_REQ_R 0x10000000 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun struct ob_ip_iocb_rsp { 137*4882a593Smuzhiyun u8 opcode; 138*4882a593Smuzhiyun u8 flags; 139*4882a593Smuzhiyun #define OB_MAC_IOCB_RSP_H 0x10 140*4882a593Smuzhiyun #define OB_MAC_IOCB_RSP_E 0x08 141*4882a593Smuzhiyun #define OB_MAC_IOCB_RSP_L 0x04 142*4882a593Smuzhiyun #define OB_MAC_IOCB_RSP_S 0x02 143*4882a593Smuzhiyun #define OB_MAC_IOCB_RSP_I 0x01 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun __le16 reserved0; 146*4882a593Smuzhiyun __le32 transaction_id; 147*4882a593Smuzhiyun __le32 reserved1; 148*4882a593Smuzhiyun __le32 reserved2; 149*4882a593Smuzhiyun }; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun struct ib_ip_iocb_rsp { 152*4882a593Smuzhiyun u8 opcode; 153*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_V 0x80 154*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_O 0x40 155*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_I 0x20 156*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_R 0x10 157*4882a593Smuzhiyun u8 flags; 158*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_S 0x80 159*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_H1 0x40 160*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_H0 0x20 161*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_B 0x10 162*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_M 0x08 163*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_MA 0x07 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun __le16 length; 166*4882a593Smuzhiyun __le16 checksum; 167*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_ICE 0x01 168*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_CE 0x02 169*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_NUC 0x04 170*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_UDP 0x08 171*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_TCP 0x10 172*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_3032_IPE 0x20 173*4882a593Smuzhiyun __le16 reserved; 174*4882a593Smuzhiyun #define IB_IP_IOCB_RSP_R 0x01 175*4882a593Smuzhiyun __le32 ial_low; 176*4882a593Smuzhiyun __le32 ial_high; 177*4882a593Smuzhiyun }; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun struct net_rsp_iocb { 180*4882a593Smuzhiyun u8 opcode; 181*4882a593Smuzhiyun u8 flags; 182*4882a593Smuzhiyun __le16 reserved0; 183*4882a593Smuzhiyun __le32 reserved[3]; 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun #pragma pack() 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /* 188*4882a593Smuzhiyun * Register Definitions... 189*4882a593Smuzhiyun */ 190*4882a593Smuzhiyun #define PORT0_PHY_ADDRESS 0x1e00 191*4882a593Smuzhiyun #define PORT1_PHY_ADDRESS 0x1f00 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun #define ETHERNET_CRC_SIZE 4 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define MII_SCAN_REGISTER 0x00000001 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #define PHY_ID_0_REG 2 198*4882a593Smuzhiyun #define PHY_ID_1_REG 3 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #define PHY_OUI_1_MASK 0xfc00 201*4882a593Smuzhiyun #define PHY_MODEL_MASK 0x03f0 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun /* Address for the Agere Phy */ 204*4882a593Smuzhiyun #define MII_AGERE_ADDR_1 0x00001000 205*4882a593Smuzhiyun #define MII_AGERE_ADDR_2 0x00001100 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /* 32-bit ispControlStatus */ 208*4882a593Smuzhiyun enum { 209*4882a593Smuzhiyun ISP_CONTROL_NP_MASK = 0x0003, 210*4882a593Smuzhiyun ISP_CONTROL_NP_PCSR = 0x0000, 211*4882a593Smuzhiyun ISP_CONTROL_NP_HMCR = 0x0001, 212*4882a593Smuzhiyun ISP_CONTROL_NP_LRAMCR = 0x0002, 213*4882a593Smuzhiyun ISP_CONTROL_NP_PSR = 0x0003, 214*4882a593Smuzhiyun ISP_CONTROL_RI = 0x0008, 215*4882a593Smuzhiyun ISP_CONTROL_CI = 0x0010, 216*4882a593Smuzhiyun ISP_CONTROL_PI = 0x0020, 217*4882a593Smuzhiyun ISP_CONTROL_IN = 0x0040, 218*4882a593Smuzhiyun ISP_CONTROL_BE = 0x0080, 219*4882a593Smuzhiyun ISP_CONTROL_FN_MASK = 0x0700, 220*4882a593Smuzhiyun ISP_CONTROL_FN0_NET = 0x0400, 221*4882a593Smuzhiyun ISP_CONTROL_FN0_SCSI = 0x0500, 222*4882a593Smuzhiyun ISP_CONTROL_FN1_NET = 0x0600, 223*4882a593Smuzhiyun ISP_CONTROL_FN1_SCSI = 0x0700, 224*4882a593Smuzhiyun ISP_CONTROL_LINK_DN_0 = 0x0800, 225*4882a593Smuzhiyun ISP_CONTROL_LINK_DN_1 = 0x1000, 226*4882a593Smuzhiyun ISP_CONTROL_FSR = 0x2000, 227*4882a593Smuzhiyun ISP_CONTROL_FE = 0x4000, 228*4882a593Smuzhiyun ISP_CONTROL_SR = 0x8000, 229*4882a593Smuzhiyun }; 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* 32-bit ispInterruptMaskReg */ 232*4882a593Smuzhiyun enum { 233*4882a593Smuzhiyun ISP_IMR_ENABLE_INT = 0x0004, 234*4882a593Smuzhiyun ISP_IMR_DISABLE_RESET_INT = 0x0008, 235*4882a593Smuzhiyun ISP_IMR_DISABLE_CMPL_INT = 0x0010, 236*4882a593Smuzhiyun ISP_IMR_DISABLE_PROC_INT = 0x0020, 237*4882a593Smuzhiyun }; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* 32-bit serialPortInterfaceReg */ 240*4882a593Smuzhiyun enum { 241*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_CLK = 0x0001, 242*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_CS = 0x0002, 243*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_D0 = 0x0004, 244*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_DI = 0x0008, 245*4882a593Smuzhiyun ISP_NVRAM_MASK = (0x000F << 16), 246*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_WE = 0x0010, 247*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_NVR_MASK = 0x001F, 248*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_SCI = 0x0400, 249*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_SC0 = 0x0800, 250*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_SCE = 0x1000, 251*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_SDI = 0x2000, 252*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_SDO = 0x4000, 253*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_SDE = 0x8000, 254*4882a593Smuzhiyun ISP_SERIAL_PORT_IF_I2C_MASK = 0xFC00, 255*4882a593Smuzhiyun }; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun /* semaphoreReg */ 258*4882a593Smuzhiyun enum { 259*4882a593Smuzhiyun QL_RESOURCE_MASK_BASE_CODE = 0x7, 260*4882a593Smuzhiyun QL_RESOURCE_BITS_BASE_CODE = 0x4, 261*4882a593Smuzhiyun QL_DRVR_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 1), 262*4882a593Smuzhiyun QL_DDR_RAM_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 4), 263*4882a593Smuzhiyun QL_PHY_GIO_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 7), 264*4882a593Smuzhiyun QL_NVRAM_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 10), 265*4882a593Smuzhiyun QL_FLASH_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 13), 266*4882a593Smuzhiyun QL_DRVR_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (1 + 16)), 267*4882a593Smuzhiyun QL_DDR_RAM_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (4 + 16)), 268*4882a593Smuzhiyun QL_PHY_GIO_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (7 + 16)), 269*4882a593Smuzhiyun QL_NVRAM_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (10 + 16)), 270*4882a593Smuzhiyun QL_FLASH_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (13 + 16)), 271*4882a593Smuzhiyun }; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun /* 274*4882a593Smuzhiyun * QL3XXX memory-mapped registers 275*4882a593Smuzhiyun * QL3XXX has 4 "pages" of registers, each page occupying 276*4882a593Smuzhiyun * 256 bytes. Each page has a "common" area at the start and then 277*4882a593Smuzhiyun * page-specific registers after that. 278*4882a593Smuzhiyun */ 279*4882a593Smuzhiyun struct ql3xxx_common_registers { 280*4882a593Smuzhiyun u32 MB0; /* Offset 0x00 */ 281*4882a593Smuzhiyun u32 MB1; /* Offset 0x04 */ 282*4882a593Smuzhiyun u32 MB2; /* Offset 0x08 */ 283*4882a593Smuzhiyun u32 MB3; /* Offset 0x0c */ 284*4882a593Smuzhiyun u32 MB4; /* Offset 0x10 */ 285*4882a593Smuzhiyun u32 MB5; /* Offset 0x14 */ 286*4882a593Smuzhiyun u32 MB6; /* Offset 0x18 */ 287*4882a593Smuzhiyun u32 MB7; /* Offset 0x1c */ 288*4882a593Smuzhiyun u32 flashBiosAddr; 289*4882a593Smuzhiyun u32 flashBiosData; 290*4882a593Smuzhiyun u32 ispControlStatus; 291*4882a593Smuzhiyun u32 ispInterruptMaskReg; 292*4882a593Smuzhiyun u32 serialPortInterfaceReg; 293*4882a593Smuzhiyun u32 semaphoreReg; 294*4882a593Smuzhiyun u32 reqQProducerIndex; 295*4882a593Smuzhiyun u32 rspQConsumerIndex; 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun u32 rxLargeQProducerIndex; 298*4882a593Smuzhiyun u32 rxSmallQProducerIndex; 299*4882a593Smuzhiyun u32 arcMadiCommand; 300*4882a593Smuzhiyun u32 arcMadiData; 301*4882a593Smuzhiyun }; 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun enum { 304*4882a593Smuzhiyun EXT_HW_CONFIG_SP_MASK = 0x0006, 305*4882a593Smuzhiyun EXT_HW_CONFIG_SP_NONE = 0x0000, 306*4882a593Smuzhiyun EXT_HW_CONFIG_SP_BYTE_PARITY = 0x0002, 307*4882a593Smuzhiyun EXT_HW_CONFIG_SP_ECC = 0x0004, 308*4882a593Smuzhiyun EXT_HW_CONFIG_SP_ECCx = 0x0006, 309*4882a593Smuzhiyun EXT_HW_CONFIG_SIZE_MASK = 0x0060, 310*4882a593Smuzhiyun EXT_HW_CONFIG_SIZE_128M = 0x0000, 311*4882a593Smuzhiyun EXT_HW_CONFIG_SIZE_256M = 0x0020, 312*4882a593Smuzhiyun EXT_HW_CONFIG_SIZE_512M = 0x0040, 313*4882a593Smuzhiyun EXT_HW_CONFIG_SIZE_INVALID = 0x0060, 314*4882a593Smuzhiyun EXT_HW_CONFIG_PD = 0x0080, 315*4882a593Smuzhiyun EXT_HW_CONFIG_FW = 0x0200, 316*4882a593Smuzhiyun EXT_HW_CONFIG_US = 0x0400, 317*4882a593Smuzhiyun EXT_HW_CONFIG_DCS_MASK = 0x1800, 318*4882a593Smuzhiyun EXT_HW_CONFIG_DCS_9MA = 0x0000, 319*4882a593Smuzhiyun EXT_HW_CONFIG_DCS_15MA = 0x0800, 320*4882a593Smuzhiyun EXT_HW_CONFIG_DCS_18MA = 0x1000, 321*4882a593Smuzhiyun EXT_HW_CONFIG_DCS_24MA = 0x1800, 322*4882a593Smuzhiyun EXT_HW_CONFIG_DDS_MASK = 0x6000, 323*4882a593Smuzhiyun EXT_HW_CONFIG_DDS_9MA = 0x0000, 324*4882a593Smuzhiyun EXT_HW_CONFIG_DDS_15MA = 0x2000, 325*4882a593Smuzhiyun EXT_HW_CONFIG_DDS_18MA = 0x4000, 326*4882a593Smuzhiyun EXT_HW_CONFIG_DDS_24MA = 0x6000, 327*4882a593Smuzhiyun }; 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun /* InternalChipConfig */ 330*4882a593Smuzhiyun enum { 331*4882a593Smuzhiyun INTERNAL_CHIP_DM = 0x0001, 332*4882a593Smuzhiyun INTERNAL_CHIP_SD = 0x0002, 333*4882a593Smuzhiyun INTERNAL_CHIP_RAP_MASK = 0x000C, 334*4882a593Smuzhiyun INTERNAL_CHIP_RAP_RR = 0x0000, 335*4882a593Smuzhiyun INTERNAL_CHIP_RAP_NRM = 0x0004, 336*4882a593Smuzhiyun INTERNAL_CHIP_RAP_ERM = 0x0008, 337*4882a593Smuzhiyun INTERNAL_CHIP_RAP_ERMx = 0x000C, 338*4882a593Smuzhiyun INTERNAL_CHIP_WE = 0x0010, 339*4882a593Smuzhiyun INTERNAL_CHIP_EF = 0x0020, 340*4882a593Smuzhiyun INTERNAL_CHIP_FR = 0x0040, 341*4882a593Smuzhiyun INTERNAL_CHIP_FW = 0x0080, 342*4882a593Smuzhiyun INTERNAL_CHIP_FI = 0x0100, 343*4882a593Smuzhiyun INTERNAL_CHIP_FT = 0x0200, 344*4882a593Smuzhiyun }; 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun /* portControl */ 347*4882a593Smuzhiyun enum { 348*4882a593Smuzhiyun PORT_CONTROL_DS = 0x0001, 349*4882a593Smuzhiyun PORT_CONTROL_HH = 0x0002, 350*4882a593Smuzhiyun PORT_CONTROL_EI = 0x0004, 351*4882a593Smuzhiyun PORT_CONTROL_ET = 0x0008, 352*4882a593Smuzhiyun PORT_CONTROL_EF = 0x0010, 353*4882a593Smuzhiyun PORT_CONTROL_DRM = 0x0020, 354*4882a593Smuzhiyun PORT_CONTROL_RLB = 0x0040, 355*4882a593Smuzhiyun PORT_CONTROL_RCB = 0x0080, 356*4882a593Smuzhiyun PORT_CONTROL_MAC = 0x0100, 357*4882a593Smuzhiyun PORT_CONTROL_IPV = 0x0200, 358*4882a593Smuzhiyun PORT_CONTROL_IFP = 0x0400, 359*4882a593Smuzhiyun PORT_CONTROL_ITP = 0x0800, 360*4882a593Smuzhiyun PORT_CONTROL_FI = 0x1000, 361*4882a593Smuzhiyun PORT_CONTROL_DFP = 0x2000, 362*4882a593Smuzhiyun PORT_CONTROL_OI = 0x4000, 363*4882a593Smuzhiyun PORT_CONTROL_CC = 0x8000, 364*4882a593Smuzhiyun }; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun /* portStatus */ 367*4882a593Smuzhiyun enum { 368*4882a593Smuzhiyun PORT_STATUS_SM0 = 0x0001, 369*4882a593Smuzhiyun PORT_STATUS_SM1 = 0x0002, 370*4882a593Smuzhiyun PORT_STATUS_X = 0x0008, 371*4882a593Smuzhiyun PORT_STATUS_DL = 0x0080, 372*4882a593Smuzhiyun PORT_STATUS_IC = 0x0200, 373*4882a593Smuzhiyun PORT_STATUS_MRC = 0x0400, 374*4882a593Smuzhiyun PORT_STATUS_NL = 0x0800, 375*4882a593Smuzhiyun PORT_STATUS_REV_ID_MASK = 0x7000, 376*4882a593Smuzhiyun PORT_STATUS_REV_ID_1 = 0x1000, 377*4882a593Smuzhiyun PORT_STATUS_REV_ID_2 = 0x2000, 378*4882a593Smuzhiyun PORT_STATUS_REV_ID_3 = 0x3000, 379*4882a593Smuzhiyun PORT_STATUS_64 = 0x8000, 380*4882a593Smuzhiyun PORT_STATUS_UP0 = 0x10000, 381*4882a593Smuzhiyun PORT_STATUS_AC0 = 0x20000, 382*4882a593Smuzhiyun PORT_STATUS_AE0 = 0x40000, 383*4882a593Smuzhiyun PORT_STATUS_UP1 = 0x100000, 384*4882a593Smuzhiyun PORT_STATUS_AC1 = 0x200000, 385*4882a593Smuzhiyun PORT_STATUS_AE1 = 0x400000, 386*4882a593Smuzhiyun PORT_STATUS_F0_ENABLED = 0x1000000, 387*4882a593Smuzhiyun PORT_STATUS_F1_ENABLED = 0x2000000, 388*4882a593Smuzhiyun PORT_STATUS_F2_ENABLED = 0x4000000, 389*4882a593Smuzhiyun PORT_STATUS_F3_ENABLED = 0x8000000, 390*4882a593Smuzhiyun }; 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun /* macMIIMgmtControlReg */ 393*4882a593Smuzhiyun enum { 394*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_RP_MASK = 0x0003, 395*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_RP_PRI_LWR = 0x0000, 396*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_RP_PRI_UPR = 0x0001, 397*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_RP_SEC_LWR = 0x0002, 398*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_RP_SEC_UPR = 0x0003, 399*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_PR = 0x0008, 400*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_SS = 0x0010, 401*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_SE = 0x0020, 402*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_SP = 0x0040, 403*4882a593Smuzhiyun MAC_ADDR_INDIRECT_PTR_REG_PE = 0x0080, 404*4882a593Smuzhiyun }; 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun /* macMIIMgmtControlReg */ 407*4882a593Smuzhiyun enum { 408*4882a593Smuzhiyun MAC_MII_CONTROL_RC = 0x0001, 409*4882a593Smuzhiyun MAC_MII_CONTROL_SC = 0x0002, 410*4882a593Smuzhiyun MAC_MII_CONTROL_AS = 0x0004, 411*4882a593Smuzhiyun MAC_MII_CONTROL_NP = 0x0008, 412*4882a593Smuzhiyun MAC_MII_CONTROL_CLK_SEL_MASK = 0x0070, 413*4882a593Smuzhiyun MAC_MII_CONTROL_CLK_SEL_DIV2 = 0x0000, 414*4882a593Smuzhiyun MAC_MII_CONTROL_CLK_SEL_DIV4 = 0x0010, 415*4882a593Smuzhiyun MAC_MII_CONTROL_CLK_SEL_DIV6 = 0x0020, 416*4882a593Smuzhiyun MAC_MII_CONTROL_CLK_SEL_DIV8 = 0x0030, 417*4882a593Smuzhiyun MAC_MII_CONTROL_CLK_SEL_DIV10 = 0x0040, 418*4882a593Smuzhiyun MAC_MII_CONTROL_CLK_SEL_DIV14 = 0x0050, 419*4882a593Smuzhiyun MAC_MII_CONTROL_CLK_SEL_DIV20 = 0x0060, 420*4882a593Smuzhiyun MAC_MII_CONTROL_CLK_SEL_DIV28 = 0x0070, 421*4882a593Smuzhiyun MAC_MII_CONTROL_RM = 0x8000, 422*4882a593Smuzhiyun }; 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun /* macMIIStatusReg */ 425*4882a593Smuzhiyun enum { 426*4882a593Smuzhiyun MAC_MII_STATUS_BSY = 0x0001, 427*4882a593Smuzhiyun MAC_MII_STATUS_SC = 0x0002, 428*4882a593Smuzhiyun MAC_MII_STATUS_NV = 0x0004, 429*4882a593Smuzhiyun }; 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun enum { 432*4882a593Smuzhiyun MAC_CONFIG_REG_PE = 0x0001, 433*4882a593Smuzhiyun MAC_CONFIG_REG_TF = 0x0002, 434*4882a593Smuzhiyun MAC_CONFIG_REG_RF = 0x0004, 435*4882a593Smuzhiyun MAC_CONFIG_REG_FD = 0x0008, 436*4882a593Smuzhiyun MAC_CONFIG_REG_GM = 0x0010, 437*4882a593Smuzhiyun MAC_CONFIG_REG_LB = 0x0020, 438*4882a593Smuzhiyun MAC_CONFIG_REG_SR = 0x8000, 439*4882a593Smuzhiyun }; 440*4882a593Smuzhiyun 441*4882a593Smuzhiyun enum { 442*4882a593Smuzhiyun MAC_HALF_DUPLEX_REG_ED = 0x10000, 443*4882a593Smuzhiyun MAC_HALF_DUPLEX_REG_NB = 0x20000, 444*4882a593Smuzhiyun MAC_HALF_DUPLEX_REG_BNB = 0x40000, 445*4882a593Smuzhiyun MAC_HALF_DUPLEX_REG_ALT = 0x80000, 446*4882a593Smuzhiyun }; 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun enum { 449*4882a593Smuzhiyun IP_ADDR_INDEX_REG_MASK = 0x000f, 450*4882a593Smuzhiyun IP_ADDR_INDEX_REG_FUNC_0_PRI = 0x0000, 451*4882a593Smuzhiyun IP_ADDR_INDEX_REG_FUNC_0_SEC = 0x0001, 452*4882a593Smuzhiyun IP_ADDR_INDEX_REG_FUNC_1_PRI = 0x0002, 453*4882a593Smuzhiyun IP_ADDR_INDEX_REG_FUNC_1_SEC = 0x0003, 454*4882a593Smuzhiyun IP_ADDR_INDEX_REG_FUNC_2_PRI = 0x0004, 455*4882a593Smuzhiyun IP_ADDR_INDEX_REG_FUNC_2_SEC = 0x0005, 456*4882a593Smuzhiyun IP_ADDR_INDEX_REG_FUNC_3_PRI = 0x0006, 457*4882a593Smuzhiyun IP_ADDR_INDEX_REG_FUNC_3_SEC = 0x0007, 458*4882a593Smuzhiyun IP_ADDR_INDEX_REG_6 = 0x0008, 459*4882a593Smuzhiyun IP_ADDR_INDEX_REG_OFFSET_MASK = 0x0030, 460*4882a593Smuzhiyun IP_ADDR_INDEX_REG_E = 0x0040, 461*4882a593Smuzhiyun }; 462*4882a593Smuzhiyun enum { 463*4882a593Smuzhiyun QL3032_PORT_CONTROL_DS = 0x0001, 464*4882a593Smuzhiyun QL3032_PORT_CONTROL_HH = 0x0002, 465*4882a593Smuzhiyun QL3032_PORT_CONTROL_EIv6 = 0x0004, 466*4882a593Smuzhiyun QL3032_PORT_CONTROL_EIv4 = 0x0008, 467*4882a593Smuzhiyun QL3032_PORT_CONTROL_ET = 0x0010, 468*4882a593Smuzhiyun QL3032_PORT_CONTROL_EF = 0x0020, 469*4882a593Smuzhiyun QL3032_PORT_CONTROL_DRM = 0x0040, 470*4882a593Smuzhiyun QL3032_PORT_CONTROL_RLB = 0x0080, 471*4882a593Smuzhiyun QL3032_PORT_CONTROL_RCB = 0x0100, 472*4882a593Smuzhiyun QL3032_PORT_CONTROL_KIE = 0x0200, 473*4882a593Smuzhiyun }; 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun enum { 476*4882a593Smuzhiyun PROBE_MUX_ADDR_REG_MUX_SEL_MASK = 0x003f, 477*4882a593Smuzhiyun PROBE_MUX_ADDR_REG_SYSCLK = 0x0000, 478*4882a593Smuzhiyun PROBE_MUX_ADDR_REG_PCICLK = 0x0040, 479*4882a593Smuzhiyun PROBE_MUX_ADDR_REG_NRXCLK = 0x0080, 480*4882a593Smuzhiyun PROBE_MUX_ADDR_REG_CPUCLK = 0x00C0, 481*4882a593Smuzhiyun PROBE_MUX_ADDR_REG_MODULE_SEL_MASK = 0x3f00, 482*4882a593Smuzhiyun PROBE_MUX_ADDR_REG_UP = 0x4000, 483*4882a593Smuzhiyun PROBE_MUX_ADDR_REG_RE = 0x8000, 484*4882a593Smuzhiyun }; 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun enum { 487*4882a593Smuzhiyun STATISTICS_INDEX_REG_MASK = 0x01ff, 488*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_TX_FRAME = 0x0000, 489*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_TX_BYTES = 0x0001, 490*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_TX_STAT1 = 0x0002, 491*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_TX_STAT2 = 0x0003, 492*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_TX_STAT3 = 0x0004, 493*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_TX_STAT4 = 0x0005, 494*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_TX_STAT5 = 0x0006, 495*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_RX_FRAME = 0x0007, 496*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_RX_BYTES = 0x0008, 497*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_RX_STAT1 = 0x0009, 498*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_RX_STAT2 = 0x000a, 499*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_RX_STAT3 = 0x000b, 500*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_RX_ERR_CRC = 0x000c, 501*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_RX_ERR_ENC = 0x000d, 502*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_RX_ERR_LEN = 0x000e, 503*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC0_RX_STAT4 = 0x000f, 504*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_TX_FRAME = 0x0010, 505*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_TX_BYTES = 0x0011, 506*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_TX_STAT1 = 0x0012, 507*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_TX_STAT2 = 0x0013, 508*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_TX_STAT3 = 0x0014, 509*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_TX_STAT4 = 0x0015, 510*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_TX_STAT5 = 0x0016, 511*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_RX_FRAME = 0x0017, 512*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_RX_BYTES = 0x0018, 513*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_RX_STAT1 = 0x0019, 514*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_RX_STAT2 = 0x001a, 515*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_RX_STAT3 = 0x001b, 516*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_RX_ERR_CRC = 0x001c, 517*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_RX_ERR_ENC = 0x001d, 518*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_RX_ERR_LEN = 0x001e, 519*4882a593Smuzhiyun STATISTICS_INDEX_REG_MAC1_RX_STAT4 = 0x001f, 520*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_TX_PKTS = 0x0020, 521*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_TX_BYTES = 0x0021, 522*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_TX_FRAG = 0x0022, 523*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_RX_PKTS = 0x0023, 524*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_RX_BYTES = 0x0024, 525*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_RX_FRAG = 0x0025, 526*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_DGRM_REASSEMBLY = 0x0026, 527*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_V6_RX_PKTS = 0x0027, 528*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_RX_PKTERR = 0x0028, 529*4882a593Smuzhiyun STATISTICS_INDEX_REG_IP_REASSEMBLY_ERR = 0x0029, 530*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_TX_SEG = 0x0030, 531*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_TX_BYTES = 0x0031, 532*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_RX_SEG = 0x0032, 533*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_RX_BYTES = 0x0033, 534*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_TIMER_EXP = 0x0034, 535*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_RX_ACK = 0x0035, 536*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_TX_ACK = 0x0036, 537*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_RX_ERR = 0x0037, 538*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_RX_WIN_PROBE = 0x0038, 539*4882a593Smuzhiyun STATISTICS_INDEX_REG_TCP_ECC_ERR_CORR = 0x003f, 540*4882a593Smuzhiyun }; 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun enum { 543*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_OFB_RE_MAC0 = 0x00000001, 544*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_OFB_RE_MAC1 = 0x00000002, 545*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_OFB_WE = 0x00000004, 546*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_IFB_RE = 0x00000008, 547*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_IFB_WE_MAC0 = 0x00000010, 548*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_IFB_WE_MAC1 = 0x00000020, 549*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_ODE_RE = 0x00000040, 550*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_ODE_WE = 0x00000080, 551*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_IDE_RE = 0x00000100, 552*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_IDE_WE = 0x00000200, 553*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_SDE_RE = 0x00000400, 554*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_SDE_WE = 0x00000800, 555*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_BLE = 0x00001000, 556*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_SPE = 0x00002000, 557*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_EP0 = 0x00004000, 558*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_EP1 = 0x00008000, 559*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_ICE = 0x00010000, 560*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_ILE = 0x00020000, 561*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_OPE = 0x00040000, 562*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_TA = 0x00080000, 563*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_MA = 0x00100000, 564*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_SCE = 0x00200000, 565*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_RPE = 0x00400000, 566*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_MPE = 0x00800000, 567*4882a593Smuzhiyun PORT_FATAL_ERROR_STATUS_OCE = 0x01000000, 568*4882a593Smuzhiyun }; 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun /* 571*4882a593Smuzhiyun * port control and status page - page 0 572*4882a593Smuzhiyun */ 573*4882a593Smuzhiyun 574*4882a593Smuzhiyun struct ql3xxx_port_registers { 575*4882a593Smuzhiyun struct ql3xxx_common_registers CommonRegs; 576*4882a593Smuzhiyun 577*4882a593Smuzhiyun u32 ExternalHWConfig; 578*4882a593Smuzhiyun u32 InternalChipConfig; 579*4882a593Smuzhiyun u32 portControl; 580*4882a593Smuzhiyun u32 portStatus; 581*4882a593Smuzhiyun u32 macAddrIndirectPtrReg; 582*4882a593Smuzhiyun u32 macAddrDataReg; 583*4882a593Smuzhiyun u32 macMIIMgmtControlReg; 584*4882a593Smuzhiyun u32 macMIIMgmtAddrReg; 585*4882a593Smuzhiyun u32 macMIIMgmtDataReg; 586*4882a593Smuzhiyun u32 macMIIStatusReg; 587*4882a593Smuzhiyun u32 mac0ConfigReg; 588*4882a593Smuzhiyun u32 mac0IpgIfgReg; 589*4882a593Smuzhiyun u32 mac0HalfDuplexReg; 590*4882a593Smuzhiyun u32 mac0MaxFrameLengthReg; 591*4882a593Smuzhiyun u32 mac0PauseThresholdReg; 592*4882a593Smuzhiyun u32 mac1ConfigReg; 593*4882a593Smuzhiyun u32 mac1IpgIfgReg; 594*4882a593Smuzhiyun u32 mac1HalfDuplexReg; 595*4882a593Smuzhiyun u32 mac1MaxFrameLengthReg; 596*4882a593Smuzhiyun u32 mac1PauseThresholdReg; 597*4882a593Smuzhiyun u32 ipAddrIndexReg; 598*4882a593Smuzhiyun u32 ipAddrDataReg; 599*4882a593Smuzhiyun u32 ipReassemblyTimeout; 600*4882a593Smuzhiyun u32 tcpMaxWindow; 601*4882a593Smuzhiyun u32 currentTcpTimestamp[2]; 602*4882a593Smuzhiyun u32 internalRamRWAddrReg; 603*4882a593Smuzhiyun u32 internalRamWDataReg; 604*4882a593Smuzhiyun u32 reclaimedBufferAddrRegLow; 605*4882a593Smuzhiyun u32 reclaimedBufferAddrRegHigh; 606*4882a593Smuzhiyun u32 tcpConfiguration; 607*4882a593Smuzhiyun u32 functionControl; 608*4882a593Smuzhiyun u32 fpgaRevID; 609*4882a593Smuzhiyun u32 localRamAddr; 610*4882a593Smuzhiyun u32 localRamDataAutoIncr; 611*4882a593Smuzhiyun u32 localRamDataNonIncr; 612*4882a593Smuzhiyun u32 gpOutput; 613*4882a593Smuzhiyun u32 gpInput; 614*4882a593Smuzhiyun u32 probeMuxAddr; 615*4882a593Smuzhiyun u32 probeMuxData; 616*4882a593Smuzhiyun u32 statisticsIndexReg; 617*4882a593Smuzhiyun u32 statisticsReadDataRegAutoIncr; 618*4882a593Smuzhiyun u32 statisticsReadDataRegNoIncr; 619*4882a593Smuzhiyun u32 PortFatalErrStatus; 620*4882a593Smuzhiyun }; 621*4882a593Smuzhiyun 622*4882a593Smuzhiyun /* 623*4882a593Smuzhiyun * port host memory config page - page 1 624*4882a593Smuzhiyun */ 625*4882a593Smuzhiyun struct ql3xxx_host_memory_registers { 626*4882a593Smuzhiyun struct ql3xxx_common_registers CommonRegs; 627*4882a593Smuzhiyun 628*4882a593Smuzhiyun u32 reserved[12]; 629*4882a593Smuzhiyun 630*4882a593Smuzhiyun /* Network Request Queue */ 631*4882a593Smuzhiyun u32 reqConsumerIndex; 632*4882a593Smuzhiyun u32 reqConsumerIndexAddrLow; 633*4882a593Smuzhiyun u32 reqConsumerIndexAddrHigh; 634*4882a593Smuzhiyun u32 reqBaseAddrLow; 635*4882a593Smuzhiyun u32 reqBaseAddrHigh; 636*4882a593Smuzhiyun u32 reqLength; 637*4882a593Smuzhiyun 638*4882a593Smuzhiyun /* Network Completion Queue */ 639*4882a593Smuzhiyun u32 rspProducerIndex; 640*4882a593Smuzhiyun u32 rspProducerIndexAddrLow; 641*4882a593Smuzhiyun u32 rspProducerIndexAddrHigh; 642*4882a593Smuzhiyun u32 rspBaseAddrLow; 643*4882a593Smuzhiyun u32 rspBaseAddrHigh; 644*4882a593Smuzhiyun u32 rspLength; 645*4882a593Smuzhiyun 646*4882a593Smuzhiyun /* RX Large Buffer Queue */ 647*4882a593Smuzhiyun u32 rxLargeQConsumerIndex; 648*4882a593Smuzhiyun u32 rxLargeQBaseAddrLow; 649*4882a593Smuzhiyun u32 rxLargeQBaseAddrHigh; 650*4882a593Smuzhiyun u32 rxLargeQLength; 651*4882a593Smuzhiyun u32 rxLargeBufferLength; 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun /* RX Small Buffer Queue */ 654*4882a593Smuzhiyun u32 rxSmallQConsumerIndex; 655*4882a593Smuzhiyun u32 rxSmallQBaseAddrLow; 656*4882a593Smuzhiyun u32 rxSmallQBaseAddrHigh; 657*4882a593Smuzhiyun u32 rxSmallQLength; 658*4882a593Smuzhiyun u32 rxSmallBufferLength; 659*4882a593Smuzhiyun 660*4882a593Smuzhiyun }; 661*4882a593Smuzhiyun 662*4882a593Smuzhiyun /* 663*4882a593Smuzhiyun * port local RAM page - page 2 664*4882a593Smuzhiyun */ 665*4882a593Smuzhiyun struct ql3xxx_local_ram_registers { 666*4882a593Smuzhiyun struct ql3xxx_common_registers CommonRegs; 667*4882a593Smuzhiyun u32 bufletSize; 668*4882a593Smuzhiyun u32 maxBufletCount; 669*4882a593Smuzhiyun u32 currentBufletCount; 670*4882a593Smuzhiyun u32 reserved; 671*4882a593Smuzhiyun u32 freeBufletThresholdLow; 672*4882a593Smuzhiyun u32 freeBufletThresholdHigh; 673*4882a593Smuzhiyun u32 ipHashTableBase; 674*4882a593Smuzhiyun u32 ipHashTableCount; 675*4882a593Smuzhiyun u32 tcpHashTableBase; 676*4882a593Smuzhiyun u32 tcpHashTableCount; 677*4882a593Smuzhiyun u32 ncbBase; 678*4882a593Smuzhiyun u32 maxNcbCount; 679*4882a593Smuzhiyun u32 currentNcbCount; 680*4882a593Smuzhiyun u32 drbBase; 681*4882a593Smuzhiyun u32 maxDrbCount; 682*4882a593Smuzhiyun u32 currentDrbCount; 683*4882a593Smuzhiyun }; 684*4882a593Smuzhiyun 685*4882a593Smuzhiyun /* 686*4882a593Smuzhiyun * definitions for Semaphore bits in Semaphore/Serial NVRAM interface register 687*4882a593Smuzhiyun */ 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun #define LS_64BITS(x) (u32)(0xffffffff & ((u64)x)) 690*4882a593Smuzhiyun #define MS_64BITS(x) (u32)(0xffffffff & (((u64)x)>>16>>16) ) 691*4882a593Smuzhiyun 692*4882a593Smuzhiyun /* 693*4882a593Smuzhiyun * I/O register 694*4882a593Smuzhiyun */ 695*4882a593Smuzhiyun 696*4882a593Smuzhiyun enum { 697*4882a593Smuzhiyun CONTROL_REG = 0, 698*4882a593Smuzhiyun STATUS_REG = 1, 699*4882a593Smuzhiyun PHY_STAT_LINK_UP = 0x0004, 700*4882a593Smuzhiyun PHY_CTRL_LOOPBACK = 0x4000, 701*4882a593Smuzhiyun 702*4882a593Smuzhiyun PETBI_CONTROL_REG = 0x00, 703*4882a593Smuzhiyun PETBI_CTRL_ALL_PARAMS = 0x7140, 704*4882a593Smuzhiyun PETBI_CTRL_SOFT_RESET = 0x8000, 705*4882a593Smuzhiyun PETBI_CTRL_AUTO_NEG = 0x1000, 706*4882a593Smuzhiyun PETBI_CTRL_RESTART_NEG = 0x0200, 707*4882a593Smuzhiyun PETBI_CTRL_FULL_DUPLEX = 0x0100, 708*4882a593Smuzhiyun PETBI_CTRL_SPEED_1000 = 0x0040, 709*4882a593Smuzhiyun 710*4882a593Smuzhiyun PETBI_STATUS_REG = 0x01, 711*4882a593Smuzhiyun PETBI_STAT_NEG_DONE = 0x0020, 712*4882a593Smuzhiyun PETBI_STAT_LINK_UP = 0x0004, 713*4882a593Smuzhiyun 714*4882a593Smuzhiyun PETBI_NEG_ADVER = 0x04, 715*4882a593Smuzhiyun PETBI_NEG_PAUSE = 0x0080, 716*4882a593Smuzhiyun PETBI_NEG_PAUSE_MASK = 0x0180, 717*4882a593Smuzhiyun PETBI_NEG_DUPLEX = 0x0020, 718*4882a593Smuzhiyun PETBI_NEG_DUPLEX_MASK = 0x0060, 719*4882a593Smuzhiyun 720*4882a593Smuzhiyun PETBI_NEG_PARTNER = 0x05, 721*4882a593Smuzhiyun PETBI_NEG_ERROR_MASK = 0x3000, 722*4882a593Smuzhiyun 723*4882a593Smuzhiyun PETBI_EXPANSION_REG = 0x06, 724*4882a593Smuzhiyun PETBI_EXP_PAGE_RX = 0x0002, 725*4882a593Smuzhiyun 726*4882a593Smuzhiyun PHY_GIG_CONTROL = 9, 727*4882a593Smuzhiyun PHY_GIG_ENABLE_MAN = 0x1000, /* Enable Master/Slave Manual Config*/ 728*4882a593Smuzhiyun PHY_GIG_SET_MASTER = 0x0800, /* Set Master (slave if clear)*/ 729*4882a593Smuzhiyun PHY_GIG_ALL_PARAMS = 0x0300, 730*4882a593Smuzhiyun PHY_GIG_ADV_1000F = 0x0200, 731*4882a593Smuzhiyun PHY_GIG_ADV_1000H = 0x0100, 732*4882a593Smuzhiyun 733*4882a593Smuzhiyun PHY_NEG_ADVER = 4, 734*4882a593Smuzhiyun PHY_NEG_ALL_PARAMS = 0x0fe0, 735*4882a593Smuzhiyun PHY_NEG_ASY_PAUSE = 0x0800, 736*4882a593Smuzhiyun PHY_NEG_SYM_PAUSE = 0x0400, 737*4882a593Smuzhiyun PHY_NEG_ADV_SPEED = 0x01e0, 738*4882a593Smuzhiyun PHY_NEG_ADV_100F = 0x0100, 739*4882a593Smuzhiyun PHY_NEG_ADV_100H = 0x0080, 740*4882a593Smuzhiyun PHY_NEG_ADV_10F = 0x0040, 741*4882a593Smuzhiyun PHY_NEG_ADV_10H = 0x0020, 742*4882a593Smuzhiyun 743*4882a593Smuzhiyun PETBI_TBI_CTRL = 0x11, 744*4882a593Smuzhiyun PETBI_TBI_RESET = 0x8000, 745*4882a593Smuzhiyun PETBI_TBI_AUTO_SENSE = 0x0100, 746*4882a593Smuzhiyun PETBI_TBI_SERDES_MODE = 0x0010, 747*4882a593Smuzhiyun PETBI_TBI_SERDES_WRAP = 0x0002, 748*4882a593Smuzhiyun 749*4882a593Smuzhiyun AUX_CONTROL_STATUS = 0x1c, 750*4882a593Smuzhiyun PHY_AUX_NEG_DONE = 0x8000, 751*4882a593Smuzhiyun PHY_NEG_PARTNER = 5, 752*4882a593Smuzhiyun PHY_AUX_DUPLEX_STAT = 0x0020, 753*4882a593Smuzhiyun PHY_AUX_SPEED_STAT = 0x0018, 754*4882a593Smuzhiyun PHY_AUX_NO_HW_STRAP = 0x0004, 755*4882a593Smuzhiyun PHY_AUX_RESET_STICK = 0x0002, 756*4882a593Smuzhiyun PHY_NEG_PAUSE = 0x0400, 757*4882a593Smuzhiyun PHY_CTRL_SOFT_RESET = 0x8000, 758*4882a593Smuzhiyun PHY_CTRL_AUTO_NEG = 0x1000, 759*4882a593Smuzhiyun PHY_CTRL_RESTART_NEG = 0x0200, 760*4882a593Smuzhiyun }; 761*4882a593Smuzhiyun enum { 762*4882a593Smuzhiyun /* AM29LV Flash definitions */ 763*4882a593Smuzhiyun FM93C56A_START = 0x1, 764*4882a593Smuzhiyun /* Commands */ 765*4882a593Smuzhiyun FM93C56A_READ = 0x2, 766*4882a593Smuzhiyun FM93C56A_WEN = 0x0, 767*4882a593Smuzhiyun FM93C56A_WRITE = 0x1, 768*4882a593Smuzhiyun FM93C56A_WRITE_ALL = 0x0, 769*4882a593Smuzhiyun FM93C56A_WDS = 0x0, 770*4882a593Smuzhiyun FM93C56A_ERASE = 0x3, 771*4882a593Smuzhiyun FM93C56A_ERASE_ALL = 0x0, 772*4882a593Smuzhiyun /* Command Extensions */ 773*4882a593Smuzhiyun FM93C56A_WEN_EXT = 0x3, 774*4882a593Smuzhiyun FM93C56A_WRITE_ALL_EXT = 0x1, 775*4882a593Smuzhiyun FM93C56A_WDS_EXT = 0x0, 776*4882a593Smuzhiyun FM93C56A_ERASE_ALL_EXT = 0x2, 777*4882a593Smuzhiyun /* Special Bits */ 778*4882a593Smuzhiyun FM93C56A_READ_DUMMY_BITS = 1, 779*4882a593Smuzhiyun FM93C56A_READY = 0, 780*4882a593Smuzhiyun FM93C56A_BUSY = 1, 781*4882a593Smuzhiyun FM93C56A_CMD_BITS = 2, 782*4882a593Smuzhiyun /* AM29LV Flash definitions */ 783*4882a593Smuzhiyun FM93C56A_SIZE_8 = 0x100, 784*4882a593Smuzhiyun FM93C56A_SIZE_16 = 0x80, 785*4882a593Smuzhiyun FM93C66A_SIZE_8 = 0x200, 786*4882a593Smuzhiyun FM93C66A_SIZE_16 = 0x100, 787*4882a593Smuzhiyun FM93C86A_SIZE_16 = 0x400, 788*4882a593Smuzhiyun /* Address Bits */ 789*4882a593Smuzhiyun FM93C56A_NO_ADDR_BITS_16 = 8, 790*4882a593Smuzhiyun FM93C56A_NO_ADDR_BITS_8 = 9, 791*4882a593Smuzhiyun FM93C86A_NO_ADDR_BITS_16 = 10, 792*4882a593Smuzhiyun /* Data Bits */ 793*4882a593Smuzhiyun FM93C56A_DATA_BITS_16 = 16, 794*4882a593Smuzhiyun FM93C56A_DATA_BITS_8 = 8, 795*4882a593Smuzhiyun }; 796*4882a593Smuzhiyun enum { 797*4882a593Smuzhiyun /* Auburn Bits */ 798*4882a593Smuzhiyun AUBURN_EEPROM_DI = 0x8, 799*4882a593Smuzhiyun AUBURN_EEPROM_DI_0 = 0x0, 800*4882a593Smuzhiyun AUBURN_EEPROM_DI_1 = 0x8, 801*4882a593Smuzhiyun AUBURN_EEPROM_DO = 0x4, 802*4882a593Smuzhiyun AUBURN_EEPROM_DO_0 = 0x0, 803*4882a593Smuzhiyun AUBURN_EEPROM_DO_1 = 0x4, 804*4882a593Smuzhiyun AUBURN_EEPROM_CS = 0x2, 805*4882a593Smuzhiyun AUBURN_EEPROM_CS_0 = 0x0, 806*4882a593Smuzhiyun AUBURN_EEPROM_CS_1 = 0x2, 807*4882a593Smuzhiyun AUBURN_EEPROM_CLK_RISE = 0x1, 808*4882a593Smuzhiyun AUBURN_EEPROM_CLK_FALL = 0x0, 809*4882a593Smuzhiyun }; 810*4882a593Smuzhiyun enum {EEPROM_SIZE = FM93C86A_SIZE_16, 811*4882a593Smuzhiyun EEPROM_NO_ADDR_BITS = FM93C86A_NO_ADDR_BITS_16, 812*4882a593Smuzhiyun EEPROM_NO_DATA_BITS = FM93C56A_DATA_BITS_16, 813*4882a593Smuzhiyun }; 814*4882a593Smuzhiyun 815*4882a593Smuzhiyun /* 816*4882a593Smuzhiyun * MAC Config data structure 817*4882a593Smuzhiyun */ 818*4882a593Smuzhiyun struct eeprom_port_cfg { 819*4882a593Smuzhiyun u16 etherMtu_mac; 820*4882a593Smuzhiyun u16 pauseThreshold_mac; 821*4882a593Smuzhiyun u16 resumeThreshold_mac; 822*4882a593Smuzhiyun u16 portConfiguration; 823*4882a593Smuzhiyun #define PORT_CONFIG_DEFAULT 0xf700 824*4882a593Smuzhiyun #define PORT_CONFIG_AUTO_NEG_ENABLED 0x8000 825*4882a593Smuzhiyun #define PORT_CONFIG_SYM_PAUSE_ENABLED 0x4000 826*4882a593Smuzhiyun #define PORT_CONFIG_FULL_DUPLEX_ENABLED 0x2000 827*4882a593Smuzhiyun #define PORT_CONFIG_HALF_DUPLEX_ENABLED 0x1000 828*4882a593Smuzhiyun #define PORT_CONFIG_1000MB_SPEED 0x0400 829*4882a593Smuzhiyun #define PORT_CONFIG_100MB_SPEED 0x0200 830*4882a593Smuzhiyun #define PORT_CONFIG_10MB_SPEED 0x0100 831*4882a593Smuzhiyun #define PORT_CONFIG_LINK_SPEED_MASK 0x0F00 832*4882a593Smuzhiyun u16 reserved[12]; 833*4882a593Smuzhiyun 834*4882a593Smuzhiyun }; 835*4882a593Smuzhiyun 836*4882a593Smuzhiyun /* 837*4882a593Smuzhiyun * BIOS data structure 838*4882a593Smuzhiyun */ 839*4882a593Smuzhiyun struct eeprom_bios_cfg { 840*4882a593Smuzhiyun u16 SpinDlyEn:1, disBios:1, EnMemMap:1, EnSelectBoot:1, Reserved:12; 841*4882a593Smuzhiyun 842*4882a593Smuzhiyun u8 bootID0:7, boodID0Valid:1; 843*4882a593Smuzhiyun u8 bootLun0[8]; 844*4882a593Smuzhiyun 845*4882a593Smuzhiyun u8 bootID1:7, boodID1Valid:1; 846*4882a593Smuzhiyun u8 bootLun1[8]; 847*4882a593Smuzhiyun 848*4882a593Smuzhiyun u16 MaxLunsTrgt; 849*4882a593Smuzhiyun u8 reserved[10]; 850*4882a593Smuzhiyun }; 851*4882a593Smuzhiyun 852*4882a593Smuzhiyun /* 853*4882a593Smuzhiyun * Function Specific Data structure 854*4882a593Smuzhiyun */ 855*4882a593Smuzhiyun struct eeprom_function_cfg { 856*4882a593Smuzhiyun u8 reserved[30]; 857*4882a593Smuzhiyun u16 macAddress[3]; 858*4882a593Smuzhiyun u16 macAddressSecondary[3]; 859*4882a593Smuzhiyun 860*4882a593Smuzhiyun u16 subsysVendorId; 861*4882a593Smuzhiyun u16 subsysDeviceId; 862*4882a593Smuzhiyun }; 863*4882a593Smuzhiyun 864*4882a593Smuzhiyun /* 865*4882a593Smuzhiyun * EEPROM format 866*4882a593Smuzhiyun */ 867*4882a593Smuzhiyun struct eeprom_data { 868*4882a593Smuzhiyun u8 asicId[4]; 869*4882a593Smuzhiyun u16 version_and_numPorts; /* together to avoid endianness crap */ 870*4882a593Smuzhiyun u16 boardId; 871*4882a593Smuzhiyun 872*4882a593Smuzhiyun #define EEPROM_BOARDID_STR_SIZE 16 873*4882a593Smuzhiyun #define EEPROM_SERIAL_NUM_SIZE 16 874*4882a593Smuzhiyun 875*4882a593Smuzhiyun u8 boardIdStr[16]; 876*4882a593Smuzhiyun u8 serialNumber[16]; 877*4882a593Smuzhiyun u16 extHwConfig; 878*4882a593Smuzhiyun struct eeprom_port_cfg macCfg_port0; 879*4882a593Smuzhiyun struct eeprom_port_cfg macCfg_port1; 880*4882a593Smuzhiyun u16 bufletSize; 881*4882a593Smuzhiyun u16 bufletCount; 882*4882a593Smuzhiyun u16 tcpWindowThreshold50; 883*4882a593Smuzhiyun u16 tcpWindowThreshold25; 884*4882a593Smuzhiyun u16 tcpWindowThreshold0; 885*4882a593Smuzhiyun u16 ipHashTableBaseHi; 886*4882a593Smuzhiyun u16 ipHashTableBaseLo; 887*4882a593Smuzhiyun u16 ipHashTableSize; 888*4882a593Smuzhiyun u16 tcpHashTableBaseHi; 889*4882a593Smuzhiyun u16 tcpHashTableBaseLo; 890*4882a593Smuzhiyun u16 tcpHashTableSize; 891*4882a593Smuzhiyun u16 ncbTableBaseHi; 892*4882a593Smuzhiyun u16 ncbTableBaseLo; 893*4882a593Smuzhiyun u16 ncbTableSize; 894*4882a593Smuzhiyun u16 drbTableBaseHi; 895*4882a593Smuzhiyun u16 drbTableBaseLo; 896*4882a593Smuzhiyun u16 drbTableSize; 897*4882a593Smuzhiyun u16 reserved_142[4]; 898*4882a593Smuzhiyun u16 ipReassemblyTimeout; 899*4882a593Smuzhiyun u16 tcpMaxWindowSize; 900*4882a593Smuzhiyun u16 ipSecurity; 901*4882a593Smuzhiyun #define IPSEC_CONFIG_PRESENT 0x0001 902*4882a593Smuzhiyun u8 reserved_156[294]; 903*4882a593Smuzhiyun u16 qDebug[8]; 904*4882a593Smuzhiyun struct eeprom_function_cfg funcCfg_fn0; 905*4882a593Smuzhiyun u16 reserved_510; 906*4882a593Smuzhiyun u8 oemSpace[432]; 907*4882a593Smuzhiyun struct eeprom_bios_cfg biosCfg_fn1; 908*4882a593Smuzhiyun struct eeprom_function_cfg funcCfg_fn1; 909*4882a593Smuzhiyun u16 reserved_1022; 910*4882a593Smuzhiyun u8 reserved_1024[464]; 911*4882a593Smuzhiyun struct eeprom_function_cfg funcCfg_fn2; 912*4882a593Smuzhiyun u16 reserved_1534; 913*4882a593Smuzhiyun u8 reserved_1536[432]; 914*4882a593Smuzhiyun struct eeprom_bios_cfg biosCfg_fn3; 915*4882a593Smuzhiyun struct eeprom_function_cfg funcCfg_fn3; 916*4882a593Smuzhiyun u16 checksum; 917*4882a593Smuzhiyun }; 918*4882a593Smuzhiyun 919*4882a593Smuzhiyun /* 920*4882a593Smuzhiyun * General definitions... 921*4882a593Smuzhiyun */ 922*4882a593Smuzhiyun 923*4882a593Smuzhiyun /* 924*4882a593Smuzhiyun * Below are a number compiler switches for controlling driver behavior. 925*4882a593Smuzhiyun * Some are not supported under certain conditions and are notated as such. 926*4882a593Smuzhiyun */ 927*4882a593Smuzhiyun 928*4882a593Smuzhiyun #define QL3XXX_VENDOR_ID 0x1077 929*4882a593Smuzhiyun #define QL3022_DEVICE_ID 0x3022 930*4882a593Smuzhiyun #define QL3032_DEVICE_ID 0x3032 931*4882a593Smuzhiyun 932*4882a593Smuzhiyun /* MTU & Frame Size stuff */ 933*4882a593Smuzhiyun #define NORMAL_MTU_SIZE ETH_DATA_LEN 934*4882a593Smuzhiyun #define JUMBO_MTU_SIZE 9000 935*4882a593Smuzhiyun #define VLAN_ID_LEN 2 936*4882a593Smuzhiyun 937*4882a593Smuzhiyun /* Request Queue Related Definitions */ 938*4882a593Smuzhiyun #define NUM_REQ_Q_ENTRIES 256 /* so that 64 * 64 = 4096 (1 page) */ 939*4882a593Smuzhiyun 940*4882a593Smuzhiyun /* Response Queue Related Definitions */ 941*4882a593Smuzhiyun #define NUM_RSP_Q_ENTRIES 256 /* so that 256 * 16 = 4096 (1 page) */ 942*4882a593Smuzhiyun 943*4882a593Smuzhiyun /* Transmit and Receive Buffers */ 944*4882a593Smuzhiyun #define NUM_LBUFQ_ENTRIES 128 945*4882a593Smuzhiyun #define JUMBO_NUM_LBUFQ_ENTRIES 32 946*4882a593Smuzhiyun #define NUM_SBUFQ_ENTRIES 64 947*4882a593Smuzhiyun #define QL_SMALL_BUFFER_SIZE 32 948*4882a593Smuzhiyun #define QL_ADDR_ELE_PER_BUFQ_ENTRY \ 949*4882a593Smuzhiyun (sizeof(struct lrg_buf_q_entry) / sizeof(struct bufq_addr_element)) 950*4882a593Smuzhiyun /* Each send has at least control block. This is how many we keep. */ 951*4882a593Smuzhiyun #define NUM_SMALL_BUFFERS NUM_SBUFQ_ENTRIES * QL_ADDR_ELE_PER_BUFQ_ENTRY 952*4882a593Smuzhiyun 953*4882a593Smuzhiyun #define QL_HEADER_SPACE 32 /* make header space at top of skb. */ 954*4882a593Smuzhiyun /* 955*4882a593Smuzhiyun * Large & Small Buffers for Receives 956*4882a593Smuzhiyun */ 957*4882a593Smuzhiyun struct lrg_buf_q_entry { 958*4882a593Smuzhiyun 959*4882a593Smuzhiyun __le32 addr0_lower; 960*4882a593Smuzhiyun #define IAL_LAST_ENTRY 0x00000001 961*4882a593Smuzhiyun #define IAL_CONT_ENTRY 0x00000002 962*4882a593Smuzhiyun #define IAL_FLAG_MASK 0x00000003 963*4882a593Smuzhiyun __le32 addr0_upper; 964*4882a593Smuzhiyun __le32 addr1_lower; 965*4882a593Smuzhiyun __le32 addr1_upper; 966*4882a593Smuzhiyun __le32 addr2_lower; 967*4882a593Smuzhiyun __le32 addr2_upper; 968*4882a593Smuzhiyun __le32 addr3_lower; 969*4882a593Smuzhiyun __le32 addr3_upper; 970*4882a593Smuzhiyun __le32 addr4_lower; 971*4882a593Smuzhiyun __le32 addr4_upper; 972*4882a593Smuzhiyun __le32 addr5_lower; 973*4882a593Smuzhiyun __le32 addr5_upper; 974*4882a593Smuzhiyun __le32 addr6_lower; 975*4882a593Smuzhiyun __le32 addr6_upper; 976*4882a593Smuzhiyun __le32 addr7_lower; 977*4882a593Smuzhiyun __le32 addr7_upper; 978*4882a593Smuzhiyun 979*4882a593Smuzhiyun }; 980*4882a593Smuzhiyun 981*4882a593Smuzhiyun struct bufq_addr_element { 982*4882a593Smuzhiyun __le32 addr_low; 983*4882a593Smuzhiyun __le32 addr_high; 984*4882a593Smuzhiyun }; 985*4882a593Smuzhiyun 986*4882a593Smuzhiyun #define QL_NO_RESET 0 987*4882a593Smuzhiyun #define QL_DO_RESET 1 988*4882a593Smuzhiyun 989*4882a593Smuzhiyun enum link_state_t { 990*4882a593Smuzhiyun LS_UNKNOWN = 0, 991*4882a593Smuzhiyun LS_DOWN, 992*4882a593Smuzhiyun LS_DEGRADE, 993*4882a593Smuzhiyun LS_RECOVER, 994*4882a593Smuzhiyun LS_UP, 995*4882a593Smuzhiyun }; 996*4882a593Smuzhiyun 997*4882a593Smuzhiyun struct ql_rcv_buf_cb { 998*4882a593Smuzhiyun struct ql_rcv_buf_cb *next; 999*4882a593Smuzhiyun struct sk_buff *skb; 1000*4882a593Smuzhiyun DEFINE_DMA_UNMAP_ADDR(mapaddr); 1001*4882a593Smuzhiyun DEFINE_DMA_UNMAP_LEN(maplen); 1002*4882a593Smuzhiyun __le32 buf_phy_addr_low; 1003*4882a593Smuzhiyun __le32 buf_phy_addr_high; 1004*4882a593Smuzhiyun int index; 1005*4882a593Smuzhiyun }; 1006*4882a593Smuzhiyun 1007*4882a593Smuzhiyun /* 1008*4882a593Smuzhiyun * Original IOCB has 3 sg entries: 1009*4882a593Smuzhiyun * first points to skb-data area 1010*4882a593Smuzhiyun * second points to first frag 1011*4882a593Smuzhiyun * third points to next oal. 1012*4882a593Smuzhiyun * OAL has 5 entries: 1013*4882a593Smuzhiyun * 1 thru 4 point to frags 1014*4882a593Smuzhiyun * fifth points to next oal. 1015*4882a593Smuzhiyun */ 1016*4882a593Smuzhiyun #define MAX_OAL_CNT ((MAX_SKB_FRAGS-1)/4 + 1) 1017*4882a593Smuzhiyun 1018*4882a593Smuzhiyun struct oal_entry { 1019*4882a593Smuzhiyun __le32 dma_lo; 1020*4882a593Smuzhiyun __le32 dma_hi; 1021*4882a593Smuzhiyun __le32 len; 1022*4882a593Smuzhiyun #define OAL_LAST_ENTRY 0x80000000 /* Last valid buffer in list. */ 1023*4882a593Smuzhiyun #define OAL_CONT_ENTRY 0x40000000 /* points to an OAL. (continuation) */ 1024*4882a593Smuzhiyun }; 1025*4882a593Smuzhiyun 1026*4882a593Smuzhiyun struct oal { 1027*4882a593Smuzhiyun struct oal_entry oal_entry[5]; 1028*4882a593Smuzhiyun }; 1029*4882a593Smuzhiyun 1030*4882a593Smuzhiyun struct map_list { 1031*4882a593Smuzhiyun DEFINE_DMA_UNMAP_ADDR(mapaddr); 1032*4882a593Smuzhiyun DEFINE_DMA_UNMAP_LEN(maplen); 1033*4882a593Smuzhiyun }; 1034*4882a593Smuzhiyun 1035*4882a593Smuzhiyun struct ql_tx_buf_cb { 1036*4882a593Smuzhiyun struct sk_buff *skb; 1037*4882a593Smuzhiyun struct ob_mac_iocb_req *queue_entry ; 1038*4882a593Smuzhiyun int seg_count; 1039*4882a593Smuzhiyun struct oal *oal; 1040*4882a593Smuzhiyun struct map_list map[MAX_SKB_FRAGS+1]; 1041*4882a593Smuzhiyun }; 1042*4882a593Smuzhiyun 1043*4882a593Smuzhiyun /* definitions for type field */ 1044*4882a593Smuzhiyun #define QL_BUF_TYPE_MACIOCB 0x01 1045*4882a593Smuzhiyun #define QL_BUF_TYPE_IPIOCB 0x02 1046*4882a593Smuzhiyun #define QL_BUF_TYPE_TCPIOCB 0x03 1047*4882a593Smuzhiyun 1048*4882a593Smuzhiyun /* qdev->flags definitions. */ 1049*4882a593Smuzhiyun enum { QL_RESET_DONE = 1, /* Reset finished. */ 1050*4882a593Smuzhiyun QL_RESET_ACTIVE = 2, /* Waiting for reset to finish. */ 1051*4882a593Smuzhiyun QL_RESET_START = 3, /* Please reset the chip. */ 1052*4882a593Smuzhiyun QL_RESET_PER_SCSI = 4, /* SCSI driver requests reset. */ 1053*4882a593Smuzhiyun QL_TX_TIMEOUT = 5, /* Timeout in progress. */ 1054*4882a593Smuzhiyun QL_LINK_MASTER = 6, /* This driver controls the link. */ 1055*4882a593Smuzhiyun QL_ADAPTER_UP = 7, /* Adapter has been brought up. */ 1056*4882a593Smuzhiyun QL_THREAD_UP = 8, /* This flag is available. */ 1057*4882a593Smuzhiyun QL_LINK_UP = 9, /* Link Status. */ 1058*4882a593Smuzhiyun QL_ALLOC_REQ_RSP_Q_DONE = 10, 1059*4882a593Smuzhiyun QL_ALLOC_BUFQS_DONE = 11, 1060*4882a593Smuzhiyun QL_ALLOC_SMALL_BUF_DONE = 12, 1061*4882a593Smuzhiyun QL_LINK_OPTICAL = 13, 1062*4882a593Smuzhiyun QL_MSI_ENABLED = 14, 1063*4882a593Smuzhiyun }; 1064*4882a593Smuzhiyun 1065*4882a593Smuzhiyun /* 1066*4882a593Smuzhiyun * ql3_adapter - The main Adapter structure definition. 1067*4882a593Smuzhiyun * This structure has all fields relevant to the hardware. 1068*4882a593Smuzhiyun */ 1069*4882a593Smuzhiyun 1070*4882a593Smuzhiyun struct ql3_adapter { 1071*4882a593Smuzhiyun u32 reserved_00; 1072*4882a593Smuzhiyun unsigned long flags; 1073*4882a593Smuzhiyun 1074*4882a593Smuzhiyun /* PCI Configuration information for this device */ 1075*4882a593Smuzhiyun struct pci_dev *pdev; 1076*4882a593Smuzhiyun struct net_device *ndev; /* Parent NET device */ 1077*4882a593Smuzhiyun 1078*4882a593Smuzhiyun struct napi_struct napi; 1079*4882a593Smuzhiyun 1080*4882a593Smuzhiyun /* Hardware information */ 1081*4882a593Smuzhiyun u8 chip_rev_id; 1082*4882a593Smuzhiyun u8 pci_slot; 1083*4882a593Smuzhiyun u8 pci_width; 1084*4882a593Smuzhiyun u8 pci_x; 1085*4882a593Smuzhiyun u32 msi; 1086*4882a593Smuzhiyun int index; 1087*4882a593Smuzhiyun struct timer_list adapter_timer; /* timer used for various functions */ 1088*4882a593Smuzhiyun 1089*4882a593Smuzhiyun spinlock_t adapter_lock; 1090*4882a593Smuzhiyun spinlock_t hw_lock; 1091*4882a593Smuzhiyun 1092*4882a593Smuzhiyun /* PCI Bus Relative Register Addresses */ 1093*4882a593Smuzhiyun u8 __iomem *mmap_virt_base; /* stores return value from ioremap() */ 1094*4882a593Smuzhiyun struct ql3xxx_port_registers __iomem *mem_map_registers; 1095*4882a593Smuzhiyun u32 current_page; /* tracks current register page */ 1096*4882a593Smuzhiyun 1097*4882a593Smuzhiyun u32 msg_enable; 1098*4882a593Smuzhiyun u8 reserved_01[2]; 1099*4882a593Smuzhiyun u8 reserved_02[2]; 1100*4882a593Smuzhiyun 1101*4882a593Smuzhiyun /* Page for Shadow Registers */ 1102*4882a593Smuzhiyun void *shadow_reg_virt_addr; 1103*4882a593Smuzhiyun dma_addr_t shadow_reg_phy_addr; 1104*4882a593Smuzhiyun 1105*4882a593Smuzhiyun /* Net Request Queue */ 1106*4882a593Smuzhiyun u32 req_q_size; 1107*4882a593Smuzhiyun u32 reserved_03; 1108*4882a593Smuzhiyun struct ob_mac_iocb_req *req_q_virt_addr; 1109*4882a593Smuzhiyun dma_addr_t req_q_phy_addr; 1110*4882a593Smuzhiyun u16 req_producer_index; 1111*4882a593Smuzhiyun u16 reserved_04; 1112*4882a593Smuzhiyun u16 *preq_consumer_index; 1113*4882a593Smuzhiyun u32 req_consumer_index_phy_addr_high; 1114*4882a593Smuzhiyun u32 req_consumer_index_phy_addr_low; 1115*4882a593Smuzhiyun atomic_t tx_count; 1116*4882a593Smuzhiyun struct ql_tx_buf_cb tx_buf[NUM_REQ_Q_ENTRIES]; 1117*4882a593Smuzhiyun 1118*4882a593Smuzhiyun /* Net Response Queue */ 1119*4882a593Smuzhiyun u32 rsp_q_size; 1120*4882a593Smuzhiyun u32 eeprom_cmd_data; 1121*4882a593Smuzhiyun struct net_rsp_iocb *rsp_q_virt_addr; 1122*4882a593Smuzhiyun dma_addr_t rsp_q_phy_addr; 1123*4882a593Smuzhiyun struct net_rsp_iocb *rsp_current; 1124*4882a593Smuzhiyun u16 rsp_consumer_index; 1125*4882a593Smuzhiyun u16 reserved_06; 1126*4882a593Smuzhiyun volatile __le32 *prsp_producer_index; 1127*4882a593Smuzhiyun u32 rsp_producer_index_phy_addr_high; 1128*4882a593Smuzhiyun u32 rsp_producer_index_phy_addr_low; 1129*4882a593Smuzhiyun 1130*4882a593Smuzhiyun /* Large Buffer Queue */ 1131*4882a593Smuzhiyun u32 lrg_buf_q_alloc_size; 1132*4882a593Smuzhiyun u32 lrg_buf_q_size; 1133*4882a593Smuzhiyun void *lrg_buf_q_alloc_virt_addr; 1134*4882a593Smuzhiyun void *lrg_buf_q_virt_addr; 1135*4882a593Smuzhiyun dma_addr_t lrg_buf_q_alloc_phy_addr; 1136*4882a593Smuzhiyun dma_addr_t lrg_buf_q_phy_addr; 1137*4882a593Smuzhiyun u32 lrg_buf_q_producer_index; 1138*4882a593Smuzhiyun u32 lrg_buf_release_cnt; 1139*4882a593Smuzhiyun struct bufq_addr_element *lrg_buf_next_free; 1140*4882a593Smuzhiyun u32 num_large_buffers; 1141*4882a593Smuzhiyun u32 num_lbufq_entries; 1142*4882a593Smuzhiyun 1143*4882a593Smuzhiyun /* Large (Receive) Buffers */ 1144*4882a593Smuzhiyun struct ql_rcv_buf_cb *lrg_buf; 1145*4882a593Smuzhiyun struct ql_rcv_buf_cb *lrg_buf_free_head; 1146*4882a593Smuzhiyun struct ql_rcv_buf_cb *lrg_buf_free_tail; 1147*4882a593Smuzhiyun u32 lrg_buf_free_count; 1148*4882a593Smuzhiyun u32 lrg_buffer_len; 1149*4882a593Smuzhiyun u32 lrg_buf_index; 1150*4882a593Smuzhiyun u32 lrg_buf_skb_check; 1151*4882a593Smuzhiyun 1152*4882a593Smuzhiyun /* Small Buffer Queue */ 1153*4882a593Smuzhiyun u32 small_buf_q_alloc_size; 1154*4882a593Smuzhiyun u32 small_buf_q_size; 1155*4882a593Smuzhiyun u32 small_buf_q_producer_index; 1156*4882a593Smuzhiyun void *small_buf_q_alloc_virt_addr; 1157*4882a593Smuzhiyun void *small_buf_q_virt_addr; 1158*4882a593Smuzhiyun dma_addr_t small_buf_q_alloc_phy_addr; 1159*4882a593Smuzhiyun dma_addr_t small_buf_q_phy_addr; 1160*4882a593Smuzhiyun u32 small_buf_index; 1161*4882a593Smuzhiyun 1162*4882a593Smuzhiyun /* Small (Receive) Buffers */ 1163*4882a593Smuzhiyun void *small_buf_virt_addr; 1164*4882a593Smuzhiyun dma_addr_t small_buf_phy_addr; 1165*4882a593Smuzhiyun u32 small_buf_phy_addr_low; 1166*4882a593Smuzhiyun u32 small_buf_phy_addr_high; 1167*4882a593Smuzhiyun u32 small_buf_release_cnt; 1168*4882a593Smuzhiyun u32 small_buf_total_size; 1169*4882a593Smuzhiyun 1170*4882a593Smuzhiyun struct eeprom_data nvram_data; 1171*4882a593Smuzhiyun u32 port_link_state; 1172*4882a593Smuzhiyun 1173*4882a593Smuzhiyun /* 4022 specific */ 1174*4882a593Smuzhiyun u32 mac_index; /* Driver's MAC number can be 0 or 1 for first and second networking functions respectively */ 1175*4882a593Smuzhiyun u32 PHYAddr; /* Address of PHY 0x1e00 Port 0 and 0x1f00 Port 1 */ 1176*4882a593Smuzhiyun u32 mac_ob_opcode; /* Opcode to use on mac transmission */ 1177*4882a593Smuzhiyun u32 mb_bit_mask; /* MA Bits mask to use on transmission */ 1178*4882a593Smuzhiyun u32 numPorts; 1179*4882a593Smuzhiyun struct workqueue_struct *workqueue; 1180*4882a593Smuzhiyun struct delayed_work reset_work; 1181*4882a593Smuzhiyun struct delayed_work tx_timeout_work; 1182*4882a593Smuzhiyun struct delayed_work link_state_work; 1183*4882a593Smuzhiyun u32 max_frame_size; 1184*4882a593Smuzhiyun u32 device_id; 1185*4882a593Smuzhiyun u16 phyType; 1186*4882a593Smuzhiyun }; 1187*4882a593Smuzhiyun 1188*4882a593Smuzhiyun #endif /* _QLA3XXX_H_ */ 1189