xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/qlogic/qla3xxx.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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