xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/atheros/atlx/atl2.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /* atl2.h -- atl2 driver definitions
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright(c) 2007 Atheros Corporation. All rights reserved.
5*4882a593Smuzhiyun  * Copyright(c) 2006 xiong huang <xiong.huang@atheros.com>
6*4882a593Smuzhiyun  * Copyright(c) 2007 Chris Snook <csnook@redhat.com>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Derived from Intel e1000 driver
9*4882a593Smuzhiyun  * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef _ATL2_H_
13*4882a593Smuzhiyun #define _ATL2_H_
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <linux/atomic.h>
16*4882a593Smuzhiyun #include <linux/netdevice.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #ifndef _ATL2_HW_H_
19*4882a593Smuzhiyun #define _ATL2_HW_H_
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #ifndef _ATL2_OSDEP_H_
22*4882a593Smuzhiyun #define _ATL2_OSDEP_H_
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #include <linux/pci.h>
25*4882a593Smuzhiyun #include <linux/delay.h>
26*4882a593Smuzhiyun #include <linux/interrupt.h>
27*4882a593Smuzhiyun #include <linux/if_ether.h>
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #include "atlx.h"
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #ifdef ETHTOOL_OPS_COMPAT
32*4882a593Smuzhiyun int ethtool_ioctl(struct ifreq *ifr);
33*4882a593Smuzhiyun #endif
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define PCI_COMMAND_REGISTER	PCI_COMMAND
36*4882a593Smuzhiyun #define CMD_MEM_WRT_INVALIDATE	PCI_COMMAND_INVALIDATE
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define ATL2_WRITE_REG(a, reg, value) (iowrite32((value), \
39*4882a593Smuzhiyun 	((a)->hw_addr + (reg))))
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #define ATL2_WRITE_FLUSH(a) (ioread32((a)->hw_addr))
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define ATL2_READ_REG(a, reg) (ioread32((a)->hw_addr + (reg)))
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define ATL2_WRITE_REGB(a, reg, value) (iowrite8((value), \
46*4882a593Smuzhiyun 	((a)->hw_addr + (reg))))
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define ATL2_READ_REGB(a, reg) (ioread8((a)->hw_addr + (reg)))
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define ATL2_WRITE_REGW(a, reg, value) (iowrite16((value), \
51*4882a593Smuzhiyun 	((a)->hw_addr + (reg))))
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define ATL2_READ_REGW(a, reg) (ioread16((a)->hw_addr + (reg)))
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define ATL2_WRITE_REG_ARRAY(a, reg, offset, value) \
56*4882a593Smuzhiyun 	(iowrite32((value), (((a)->hw_addr + (reg)) + ((offset) << 2))))
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define ATL2_READ_REG_ARRAY(a, reg, offset) \
59*4882a593Smuzhiyun 	(ioread32(((a)->hw_addr + (reg)) + ((offset) << 2)))
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #endif /* _ATL2_OSDEP_H_ */
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun struct atl2_adapter;
64*4882a593Smuzhiyun struct atl2_hw;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /* function prototype */
67*4882a593Smuzhiyun static s32 atl2_reset_hw(struct atl2_hw *hw);
68*4882a593Smuzhiyun static s32 atl2_read_mac_addr(struct atl2_hw *hw);
69*4882a593Smuzhiyun static s32 atl2_init_hw(struct atl2_hw *hw);
70*4882a593Smuzhiyun static s32 atl2_get_speed_and_duplex(struct atl2_hw *hw, u16 *speed,
71*4882a593Smuzhiyun 	u16 *duplex);
72*4882a593Smuzhiyun static u32 atl2_hash_mc_addr(struct atl2_hw *hw, u8 *mc_addr);
73*4882a593Smuzhiyun static void atl2_hash_set(struct atl2_hw *hw, u32 hash_value);
74*4882a593Smuzhiyun static s32 atl2_read_phy_reg(struct atl2_hw *hw, u16 reg_addr, u16 *phy_data);
75*4882a593Smuzhiyun static s32 atl2_write_phy_reg(struct atl2_hw *hw, u32 reg_addr, u16 phy_data);
76*4882a593Smuzhiyun static void atl2_read_pci_cfg(struct atl2_hw *hw, u32 reg, u16 *value);
77*4882a593Smuzhiyun static void atl2_write_pci_cfg(struct atl2_hw *hw, u32 reg, u16 *value);
78*4882a593Smuzhiyun static void atl2_set_mac_addr(struct atl2_hw *hw);
79*4882a593Smuzhiyun static bool atl2_read_eeprom(struct atl2_hw *hw, u32 Offset, u32 *pValue);
80*4882a593Smuzhiyun static bool atl2_write_eeprom(struct atl2_hw *hw, u32 offset, u32 value);
81*4882a593Smuzhiyun static s32 atl2_phy_init(struct atl2_hw *hw);
82*4882a593Smuzhiyun static int atl2_check_eeprom_exist(struct atl2_hw *hw);
83*4882a593Smuzhiyun static void atl2_force_ps(struct atl2_hw *hw);
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* register definition */
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /* Block IDLE Status Register */
88*4882a593Smuzhiyun #define IDLE_STATUS_RXMAC	1	/* 1: RXMAC is non-IDLE */
89*4882a593Smuzhiyun #define IDLE_STATUS_TXMAC	2	/* 1: TXMAC is non-IDLE */
90*4882a593Smuzhiyun #define IDLE_STATUS_DMAR	8	/* 1: DMAR is non-IDLE */
91*4882a593Smuzhiyun #define IDLE_STATUS_DMAW	4	/* 1: DMAW is non-IDLE */
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun /* MDIO Control Register */
94*4882a593Smuzhiyun #define MDIO_WAIT_TIMES		10
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /* MAC Control Register */
97*4882a593Smuzhiyun #define MAC_CTRL_DBG_TX_BKPRESURE	0x100000	/* 1: TX max backoff */
98*4882a593Smuzhiyun #define MAC_CTRL_MACLP_CLK_PHY		0x8000000	/* 1: 25MHz from phy */
99*4882a593Smuzhiyun #define MAC_CTRL_HALF_LEFT_BUF_SHIFT	28
100*4882a593Smuzhiyun #define MAC_CTRL_HALF_LEFT_BUF_MASK	0xF		/* MAC retry buf x32B */
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /* Internal SRAM Partition Register */
103*4882a593Smuzhiyun #define REG_SRAM_TXRAM_END	0x1500	/* Internal tail address of TXRAM
104*4882a593Smuzhiyun 					 * default: 2byte*1024 */
105*4882a593Smuzhiyun #define REG_SRAM_RXRAM_END	0x1502	/* Internal tail address of RXRAM
106*4882a593Smuzhiyun 					 * default: 2byte*1024 */
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun /* Descriptor Control register */
109*4882a593Smuzhiyun #define REG_TXD_BASE_ADDR_LO	0x1544	/* The base address of the Transmit
110*4882a593Smuzhiyun 					 * Data Mem low 32-bit(dword align) */
111*4882a593Smuzhiyun #define REG_TXD_MEM_SIZE	0x1548	/* Transmit Data Memory size(by
112*4882a593Smuzhiyun 					 * double word , max 256KB) */
113*4882a593Smuzhiyun #define REG_TXS_BASE_ADDR_LO	0x154C	/* The base address of the Transmit
114*4882a593Smuzhiyun 					 * Status Memory low 32-bit(dword word
115*4882a593Smuzhiyun 					 * align) */
116*4882a593Smuzhiyun #define REG_TXS_MEM_SIZE	0x1550	/* double word unit, max 4*2047
117*4882a593Smuzhiyun 					 * bytes. */
118*4882a593Smuzhiyun #define REG_RXD_BASE_ADDR_LO	0x1554	/* The base address of the Transmit
119*4882a593Smuzhiyun 					 * Status Memory low 32-bit(unit 8
120*4882a593Smuzhiyun 					 * bytes) */
121*4882a593Smuzhiyun #define REG_RXD_BUF_NUM		0x1558	/* Receive Data & Status Memory buffer
122*4882a593Smuzhiyun 					 * number (unit 1536bytes, max
123*4882a593Smuzhiyun 					 * 1536*2047) */
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun /* DMAR Control Register */
126*4882a593Smuzhiyun #define REG_DMAR	0x1580
127*4882a593Smuzhiyun #define     DMAR_EN	0x1	/* 1: Enable DMAR */
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /* TX Cur-Through (early tx threshold) Control Register */
130*4882a593Smuzhiyun #define REG_TX_CUT_THRESH	0x1590	/* TxMac begin transmit packet
131*4882a593Smuzhiyun 					 * threshold(unit word) */
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun /* DMAW Control Register */
134*4882a593Smuzhiyun #define REG_DMAW	0x15A0
135*4882a593Smuzhiyun #define     DMAW_EN	0x1
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /* Flow control register */
138*4882a593Smuzhiyun #define REG_PAUSE_ON_TH		0x15A8	/* RXD high watermark of overflow
139*4882a593Smuzhiyun 					 * threshold configuration register */
140*4882a593Smuzhiyun #define REG_PAUSE_OFF_TH	0x15AA	/* RXD lower watermark of overflow
141*4882a593Smuzhiyun 					 * threshold configuration register */
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* Mailbox Register */
144*4882a593Smuzhiyun #define REG_MB_TXD_WR_IDX	0x15f0	/* double word align */
145*4882a593Smuzhiyun #define REG_MB_RXD_RD_IDX	0x15F4	/* RXD Read index (unit: 1536byets) */
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun /* Interrupt Status Register */
148*4882a593Smuzhiyun #define ISR_TIMER	1	/* Interrupt when Timer counts down to zero */
149*4882a593Smuzhiyun #define ISR_MANUAL	2	/* Software manual interrupt, for debug. Set
150*4882a593Smuzhiyun 				 * when SW_MAN_INT_EN is set in Table 51
151*4882a593Smuzhiyun 				 * Selene Master Control Register
152*4882a593Smuzhiyun 				 * (Offset 0x1400). */
153*4882a593Smuzhiyun #define ISR_RXF_OV	4	/* RXF overflow interrupt */
154*4882a593Smuzhiyun #define ISR_TXF_UR	8	/* TXF underrun interrupt */
155*4882a593Smuzhiyun #define ISR_TXS_OV	0x10	/* Internal transmit status buffer full
156*4882a593Smuzhiyun 				 * interrupt */
157*4882a593Smuzhiyun #define ISR_RXS_OV	0x20	/* Internal receive status buffer full
158*4882a593Smuzhiyun 				 * interrupt */
159*4882a593Smuzhiyun #define ISR_LINK_CHG	0x40	/* Link Status Change Interrupt */
160*4882a593Smuzhiyun #define ISR_HOST_TXD_UR	0x80
161*4882a593Smuzhiyun #define ISR_HOST_RXD_OV	0x100	/* Host rx data memory full , one pulse */
162*4882a593Smuzhiyun #define ISR_DMAR_TO_RST	0x200	/* DMAR op timeout interrupt. SW should
163*4882a593Smuzhiyun 				 * do Reset */
164*4882a593Smuzhiyun #define ISR_DMAW_TO_RST	0x400
165*4882a593Smuzhiyun #define ISR_PHY		0x800	/* phy interrupt */
166*4882a593Smuzhiyun #define ISR_TS_UPDATE	0x10000	/* interrupt after new tx pkt status written
167*4882a593Smuzhiyun 				 * to host */
168*4882a593Smuzhiyun #define ISR_RS_UPDATE	0x20000	/* interrupt ater new rx pkt status written
169*4882a593Smuzhiyun 				 * to host. */
170*4882a593Smuzhiyun #define ISR_TX_EARLY	0x40000	/* interrupt when txmac begin transmit one
171*4882a593Smuzhiyun 				 * packet */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun #define ISR_TX_EVENT (ISR_TXF_UR | ISR_TXS_OV | ISR_HOST_TXD_UR |\
174*4882a593Smuzhiyun 	ISR_TS_UPDATE | ISR_TX_EARLY)
175*4882a593Smuzhiyun #define ISR_RX_EVENT (ISR_RXF_OV | ISR_RXS_OV | ISR_HOST_RXD_OV |\
176*4882a593Smuzhiyun 	 ISR_RS_UPDATE)
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun #define IMR_NORMAL_MASK		(\
179*4882a593Smuzhiyun 	/*ISR_LINK_CHG		|*/\
180*4882a593Smuzhiyun 	ISR_MANUAL		|\
181*4882a593Smuzhiyun 	ISR_DMAR_TO_RST		|\
182*4882a593Smuzhiyun 	ISR_DMAW_TO_RST		|\
183*4882a593Smuzhiyun 	ISR_PHY			|\
184*4882a593Smuzhiyun 	ISR_PHY_LINKDOWN	|\
185*4882a593Smuzhiyun 	ISR_TS_UPDATE		|\
186*4882a593Smuzhiyun 	ISR_RS_UPDATE)
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun /* Receive MAC Statistics Registers */
189*4882a593Smuzhiyun #define REG_STS_RX_PAUSE	0x1700	/* Num pause packets received */
190*4882a593Smuzhiyun #define REG_STS_RXD_OV		0x1704	/* Num frames dropped due to RX
191*4882a593Smuzhiyun 					 * FIFO overflow */
192*4882a593Smuzhiyun #define REG_STS_RXS_OV		0x1708	/* Num frames dropped due to RX
193*4882a593Smuzhiyun 					 * Status Buffer Overflow */
194*4882a593Smuzhiyun #define REG_STS_RX_FILTER	0x170C	/* Num packets dropped due to
195*4882a593Smuzhiyun 					 * address filtering */
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun /* MII definitions */
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun /* PHY Common Register */
200*4882a593Smuzhiyun #define MII_SMARTSPEED	0x14
201*4882a593Smuzhiyun #define MII_DBG_ADDR	0x1D
202*4882a593Smuzhiyun #define MII_DBG_DATA	0x1E
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun /* PCI Command Register Bit Definitions */
205*4882a593Smuzhiyun #define PCI_REG_COMMAND		0x04
206*4882a593Smuzhiyun #define CMD_IO_SPACE		0x0001
207*4882a593Smuzhiyun #define CMD_MEMORY_SPACE	0x0002
208*4882a593Smuzhiyun #define CMD_BUS_MASTER		0x0004
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun #define MEDIA_TYPE_100M_FULL	1
211*4882a593Smuzhiyun #define MEDIA_TYPE_100M_HALF	2
212*4882a593Smuzhiyun #define MEDIA_TYPE_10M_FULL	3
213*4882a593Smuzhiyun #define MEDIA_TYPE_10M_HALF	4
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun #define AUTONEG_ADVERTISE_SPEED_DEFAULT	0x000F	/* Everything */
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun /* The size (in bytes) of a ethernet packet */
218*4882a593Smuzhiyun #define MAXIMUM_ETHERNET_FRAME_SIZE	1518	/* with FCS */
219*4882a593Smuzhiyun #define MINIMUM_ETHERNET_FRAME_SIZE	64	/* with FCS */
220*4882a593Smuzhiyun #define MAX_JUMBO_FRAME_SIZE		0x2000
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun struct tx_pkt_header {
223*4882a593Smuzhiyun 	unsigned pkt_size:11;
224*4882a593Smuzhiyun 	unsigned:4;			/* reserved */
225*4882a593Smuzhiyun 	unsigned ins_vlan:1;		/* txmac should insert vlan */
226*4882a593Smuzhiyun 	unsigned short vlan;		/* vlan tag */
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun /* FIXME: replace above bitfields with MASK/SHIFT defines below */
229*4882a593Smuzhiyun #define TX_PKT_HEADER_SIZE_MASK		0x7FF
230*4882a593Smuzhiyun #define TX_PKT_HEADER_SIZE_SHIFT	0
231*4882a593Smuzhiyun #define TX_PKT_HEADER_INS_VLAN_MASK	0x1
232*4882a593Smuzhiyun #define TX_PKT_HEADER_INS_VLAN_SHIFT	15
233*4882a593Smuzhiyun #define TX_PKT_HEADER_VLAN_TAG_MASK	0xFFFF
234*4882a593Smuzhiyun #define TX_PKT_HEADER_VLAN_TAG_SHIFT	16
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun struct tx_pkt_status {
237*4882a593Smuzhiyun 	unsigned pkt_size:11;
238*4882a593Smuzhiyun 	unsigned:5;		/* reserved */
239*4882a593Smuzhiyun 	unsigned ok:1;		/* current packet transmitted without error */
240*4882a593Smuzhiyun 	unsigned bcast:1;	/* broadcast packet */
241*4882a593Smuzhiyun 	unsigned mcast:1;	/* multicast packet */
242*4882a593Smuzhiyun 	unsigned pause:1;	/* transmiited a pause frame */
243*4882a593Smuzhiyun 	unsigned ctrl:1;
244*4882a593Smuzhiyun 	unsigned defer:1;    	/* current packet is xmitted with defer */
245*4882a593Smuzhiyun 	unsigned exc_defer:1;
246*4882a593Smuzhiyun 	unsigned single_col:1;
247*4882a593Smuzhiyun 	unsigned multi_col:1;
248*4882a593Smuzhiyun 	unsigned late_col:1;
249*4882a593Smuzhiyun 	unsigned abort_col:1;
250*4882a593Smuzhiyun 	unsigned underrun:1;	/* current packet is aborted
251*4882a593Smuzhiyun 				 * due to txram underrun */
252*4882a593Smuzhiyun 	unsigned:3;		/* reserved */
253*4882a593Smuzhiyun 	unsigned update:1;	/* always 1'b1 in tx_status_buf */
254*4882a593Smuzhiyun };
255*4882a593Smuzhiyun /* FIXME: replace above bitfields with MASK/SHIFT defines below */
256*4882a593Smuzhiyun #define TX_PKT_STATUS_SIZE_MASK		0x7FF
257*4882a593Smuzhiyun #define TX_PKT_STATUS_SIZE_SHIFT	0
258*4882a593Smuzhiyun #define TX_PKT_STATUS_OK_MASK		0x1
259*4882a593Smuzhiyun #define TX_PKT_STATUS_OK_SHIFT		16
260*4882a593Smuzhiyun #define TX_PKT_STATUS_BCAST_MASK	0x1
261*4882a593Smuzhiyun #define TX_PKT_STATUS_BCAST_SHIFT	17
262*4882a593Smuzhiyun #define TX_PKT_STATUS_MCAST_MASK	0x1
263*4882a593Smuzhiyun #define TX_PKT_STATUS_MCAST_SHIFT	18
264*4882a593Smuzhiyun #define TX_PKT_STATUS_PAUSE_MASK	0x1
265*4882a593Smuzhiyun #define TX_PKT_STATUS_PAUSE_SHIFT	19
266*4882a593Smuzhiyun #define TX_PKT_STATUS_CTRL_MASK		0x1
267*4882a593Smuzhiyun #define TX_PKT_STATUS_CTRL_SHIFT	20
268*4882a593Smuzhiyun #define TX_PKT_STATUS_DEFER_MASK	0x1
269*4882a593Smuzhiyun #define TX_PKT_STATUS_DEFER_SHIFT	21
270*4882a593Smuzhiyun #define TX_PKT_STATUS_EXC_DEFER_MASK	0x1
271*4882a593Smuzhiyun #define TX_PKT_STATUS_EXC_DEFER_SHIFT	22
272*4882a593Smuzhiyun #define TX_PKT_STATUS_SINGLE_COL_MASK	0x1
273*4882a593Smuzhiyun #define TX_PKT_STATUS_SINGLE_COL_SHIFT	23
274*4882a593Smuzhiyun #define TX_PKT_STATUS_MULTI_COL_MASK	0x1
275*4882a593Smuzhiyun #define TX_PKT_STATUS_MULTI_COL_SHIFT	24
276*4882a593Smuzhiyun #define TX_PKT_STATUS_LATE_COL_MASK	0x1
277*4882a593Smuzhiyun #define TX_PKT_STATUS_LATE_COL_SHIFT	25
278*4882a593Smuzhiyun #define TX_PKT_STATUS_ABORT_COL_MASK	0x1
279*4882a593Smuzhiyun #define TX_PKT_STATUS_ABORT_COL_SHIFT	26
280*4882a593Smuzhiyun #define TX_PKT_STATUS_UNDERRUN_MASK	0x1
281*4882a593Smuzhiyun #define TX_PKT_STATUS_UNDERRUN_SHIFT	27
282*4882a593Smuzhiyun #define TX_PKT_STATUS_UPDATE_MASK	0x1
283*4882a593Smuzhiyun #define TX_PKT_STATUS_UPDATE_SHIFT	31
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun struct rx_pkt_status {
286*4882a593Smuzhiyun 	unsigned pkt_size:11;	/* packet size, max 2047 bytes */
287*4882a593Smuzhiyun 	unsigned:5;		/* reserved */
288*4882a593Smuzhiyun 	unsigned ok:1;		/* current packet received ok without error */
289*4882a593Smuzhiyun 	unsigned bcast:1;	/* current packet is broadcast */
290*4882a593Smuzhiyun 	unsigned mcast:1;	/* current packet is multicast */
291*4882a593Smuzhiyun 	unsigned pause:1;
292*4882a593Smuzhiyun 	unsigned ctrl:1;
293*4882a593Smuzhiyun 	unsigned crc:1;		/* received a packet with crc error */
294*4882a593Smuzhiyun 	unsigned code:1;	/* received a packet with code error */
295*4882a593Smuzhiyun 	unsigned runt:1;	/* received a packet less than 64 bytes
296*4882a593Smuzhiyun 				 * with good crc */
297*4882a593Smuzhiyun 	unsigned frag:1;	/* received a packet less than 64 bytes
298*4882a593Smuzhiyun 				 * with bad crc */
299*4882a593Smuzhiyun 	unsigned trunc:1;	/* current frame truncated due to rxram full */
300*4882a593Smuzhiyun 	unsigned align:1;	/* this packet is alignment error */
301*4882a593Smuzhiyun 	unsigned vlan:1;	/* this packet has vlan */
302*4882a593Smuzhiyun 	unsigned:3;		/* reserved */
303*4882a593Smuzhiyun 	unsigned update:1;
304*4882a593Smuzhiyun 	unsigned short vtag;	/* vlan tag */
305*4882a593Smuzhiyun 	unsigned:16;
306*4882a593Smuzhiyun };
307*4882a593Smuzhiyun /* FIXME: replace above bitfields with MASK/SHIFT defines below */
308*4882a593Smuzhiyun #define RX_PKT_STATUS_SIZE_MASK		0x7FF
309*4882a593Smuzhiyun #define RX_PKT_STATUS_SIZE_SHIFT	0
310*4882a593Smuzhiyun #define RX_PKT_STATUS_OK_MASK		0x1
311*4882a593Smuzhiyun #define RX_PKT_STATUS_OK_SHIFT		16
312*4882a593Smuzhiyun #define RX_PKT_STATUS_BCAST_MASK	0x1
313*4882a593Smuzhiyun #define RX_PKT_STATUS_BCAST_SHIFT	17
314*4882a593Smuzhiyun #define RX_PKT_STATUS_MCAST_MASK	0x1
315*4882a593Smuzhiyun #define RX_PKT_STATUS_MCAST_SHIFT	18
316*4882a593Smuzhiyun #define RX_PKT_STATUS_PAUSE_MASK	0x1
317*4882a593Smuzhiyun #define RX_PKT_STATUS_PAUSE_SHIFT	19
318*4882a593Smuzhiyun #define RX_PKT_STATUS_CTRL_MASK		0x1
319*4882a593Smuzhiyun #define RX_PKT_STATUS_CTRL_SHIFT	20
320*4882a593Smuzhiyun #define RX_PKT_STATUS_CRC_MASK		0x1
321*4882a593Smuzhiyun #define RX_PKT_STATUS_CRC_SHIFT		21
322*4882a593Smuzhiyun #define RX_PKT_STATUS_CODE_MASK		0x1
323*4882a593Smuzhiyun #define RX_PKT_STATUS_CODE_SHIFT	22
324*4882a593Smuzhiyun #define RX_PKT_STATUS_RUNT_MASK		0x1
325*4882a593Smuzhiyun #define RX_PKT_STATUS_RUNT_SHIFT	23
326*4882a593Smuzhiyun #define RX_PKT_STATUS_FRAG_MASK		0x1
327*4882a593Smuzhiyun #define RX_PKT_STATUS_FRAG_SHIFT	24
328*4882a593Smuzhiyun #define RX_PKT_STATUS_TRUNK_MASK	0x1
329*4882a593Smuzhiyun #define RX_PKT_STATUS_TRUNK_SHIFT	25
330*4882a593Smuzhiyun #define RX_PKT_STATUS_ALIGN_MASK	0x1
331*4882a593Smuzhiyun #define RX_PKT_STATUS_ALIGN_SHIFT	26
332*4882a593Smuzhiyun #define RX_PKT_STATUS_VLAN_MASK		0x1
333*4882a593Smuzhiyun #define RX_PKT_STATUS_VLAN_SHIFT	27
334*4882a593Smuzhiyun #define RX_PKT_STATUS_UPDATE_MASK	0x1
335*4882a593Smuzhiyun #define RX_PKT_STATUS_UPDATE_SHIFT	31
336*4882a593Smuzhiyun #define RX_PKT_STATUS_VLAN_TAG_MASK	0xFFFF
337*4882a593Smuzhiyun #define RX_PKT_STATUS_VLAN_TAG_SHIFT	32
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun struct rx_desc {
340*4882a593Smuzhiyun 	struct rx_pkt_status	status;
341*4882a593Smuzhiyun 	unsigned char     	packet[1536-sizeof(struct rx_pkt_status)];
342*4882a593Smuzhiyun };
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun enum atl2_speed_duplex {
345*4882a593Smuzhiyun 	atl2_10_half = 0,
346*4882a593Smuzhiyun 	atl2_10_full = 1,
347*4882a593Smuzhiyun 	atl2_100_half = 2,
348*4882a593Smuzhiyun 	atl2_100_full = 3
349*4882a593Smuzhiyun };
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun struct atl2_spi_flash_dev {
352*4882a593Smuzhiyun 	const char *manu_name;	/* manufacturer id */
353*4882a593Smuzhiyun 	/* op-code */
354*4882a593Smuzhiyun 	u8 cmdWRSR;
355*4882a593Smuzhiyun 	u8 cmdREAD;
356*4882a593Smuzhiyun 	u8 cmdPROGRAM;
357*4882a593Smuzhiyun 	u8 cmdWREN;
358*4882a593Smuzhiyun 	u8 cmdWRDI;
359*4882a593Smuzhiyun 	u8 cmdRDSR;
360*4882a593Smuzhiyun 	u8 cmdRDID;
361*4882a593Smuzhiyun 	u8 cmdSECTOR_ERASE;
362*4882a593Smuzhiyun 	u8 cmdCHIP_ERASE;
363*4882a593Smuzhiyun };
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun /* Structure containing variables used by the shared code (atl2_hw.c) */
366*4882a593Smuzhiyun struct atl2_hw {
367*4882a593Smuzhiyun 	u8 __iomem *hw_addr;
368*4882a593Smuzhiyun 	void *back;
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	u8 preamble_len;
371*4882a593Smuzhiyun 	u8 max_retry;          /* Retransmission maximum, afterwards the
372*4882a593Smuzhiyun 				* packet will be discarded. */
373*4882a593Smuzhiyun 	u8 jam_ipg;            /* IPG to start JAM for collision based flow
374*4882a593Smuzhiyun 				* control in half-duplex mode. In unit of
375*4882a593Smuzhiyun 				* 8-bit time. */
376*4882a593Smuzhiyun 	u8 ipgt;               /* Desired back to back inter-packet gap. The
377*4882a593Smuzhiyun 				* default is 96-bit time. */
378*4882a593Smuzhiyun 	u8 min_ifg;            /* Minimum number of IFG to enforce in between
379*4882a593Smuzhiyun 				* RX frames. Frame gap below such IFP is
380*4882a593Smuzhiyun 				* dropped. */
381*4882a593Smuzhiyun 	u8 ipgr1;              /* 64bit Carrier-Sense window */
382*4882a593Smuzhiyun 	u8 ipgr2;              /* 96-bit IPG window */
383*4882a593Smuzhiyun 	u8 retry_buf;          /* When half-duplex mode, should hold some
384*4882a593Smuzhiyun 				* bytes for mac retry . (8*4bytes unit) */
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 	u16 fc_rxd_hi;
387*4882a593Smuzhiyun 	u16 fc_rxd_lo;
388*4882a593Smuzhiyun 	u16 lcol;              /* Collision Window */
389*4882a593Smuzhiyun 	u16 max_frame_size;
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	u16 MediaType;
392*4882a593Smuzhiyun 	u16 autoneg_advertised;
393*4882a593Smuzhiyun 	u16 pci_cmd_word;
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	u16 mii_autoneg_adv_reg;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	u32 mem_rang;
398*4882a593Smuzhiyun 	u32 txcw;
399*4882a593Smuzhiyun 	u32 mc_filter_type;
400*4882a593Smuzhiyun 	u32 num_mc_addrs;
401*4882a593Smuzhiyun 	u32 collision_delta;
402*4882a593Smuzhiyun 	u32 tx_packet_delta;
403*4882a593Smuzhiyun 	u16 phy_spd_default;
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	u16 device_id;
406*4882a593Smuzhiyun 	u16 vendor_id;
407*4882a593Smuzhiyun 	u16 subsystem_id;
408*4882a593Smuzhiyun 	u16 subsystem_vendor_id;
409*4882a593Smuzhiyun 	u8 revision_id;
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	/* spi flash */
412*4882a593Smuzhiyun 	u8 flash_vendor;
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	u8 dma_fairness;
415*4882a593Smuzhiyun 	u8 mac_addr[ETH_ALEN];
416*4882a593Smuzhiyun 	u8 perm_mac_addr[ETH_ALEN];
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	/* FIXME */
419*4882a593Smuzhiyun 	/* bool phy_preamble_sup; */
420*4882a593Smuzhiyun 	bool phy_configured;
421*4882a593Smuzhiyun };
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun #endif /* _ATL2_HW_H_ */
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun struct atl2_ring_header {
426*4882a593Smuzhiyun     /* pointer to the descriptor ring memory */
427*4882a593Smuzhiyun     void *desc;
428*4882a593Smuzhiyun     /* physical address of the descriptor ring */
429*4882a593Smuzhiyun     dma_addr_t dma;
430*4882a593Smuzhiyun     /* length of descriptor ring in bytes */
431*4882a593Smuzhiyun     unsigned int size;
432*4882a593Smuzhiyun };
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun /* board specific private data structure */
435*4882a593Smuzhiyun struct atl2_adapter {
436*4882a593Smuzhiyun 	/* OS defined structs */
437*4882a593Smuzhiyun 	struct net_device *netdev;
438*4882a593Smuzhiyun 	struct pci_dev *pdev;
439*4882a593Smuzhiyun 	u32 wol;
440*4882a593Smuzhiyun 	u16 link_speed;
441*4882a593Smuzhiyun 	u16 link_duplex;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	spinlock_t stats_lock;
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 	struct work_struct reset_task;
446*4882a593Smuzhiyun 	struct work_struct link_chg_task;
447*4882a593Smuzhiyun 	struct timer_list watchdog_timer;
448*4882a593Smuzhiyun 	struct timer_list phy_config_timer;
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 	unsigned long cfg_phy;
451*4882a593Smuzhiyun 	bool mac_disabled;
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	/* All Descriptor memory */
454*4882a593Smuzhiyun 	dma_addr_t	ring_dma;
455*4882a593Smuzhiyun 	void		*ring_vir_addr;
456*4882a593Smuzhiyun 	int		ring_size;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	struct tx_pkt_header	*txd_ring;
459*4882a593Smuzhiyun 	dma_addr_t	txd_dma;
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun 	struct tx_pkt_status	*txs_ring;
462*4882a593Smuzhiyun 	dma_addr_t	txs_dma;
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	struct rx_desc	*rxd_ring;
465*4882a593Smuzhiyun 	dma_addr_t	rxd_dma;
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	u32 txd_ring_size;         /* bytes per unit */
468*4882a593Smuzhiyun 	u32 txs_ring_size;         /* dwords per unit */
469*4882a593Smuzhiyun 	u32 rxd_ring_size;         /* 1536 bytes per unit */
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	/* read /write ptr: */
472*4882a593Smuzhiyun 	/* host */
473*4882a593Smuzhiyun 	u32 txd_write_ptr;
474*4882a593Smuzhiyun 	u32 txs_next_clear;
475*4882a593Smuzhiyun 	u32 rxd_read_ptr;
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun 	/* nic */
478*4882a593Smuzhiyun 	atomic_t txd_read_ptr;
479*4882a593Smuzhiyun 	atomic_t txs_write_ptr;
480*4882a593Smuzhiyun 	u32 rxd_write_ptr;
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	/* Interrupt Moderator timer ( 2us resolution) */
483*4882a593Smuzhiyun 	u16 imt;
484*4882a593Smuzhiyun 	/* Interrupt Clear timer (2us resolution) */
485*4882a593Smuzhiyun 	u16 ict;
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	unsigned long flags;
488*4882a593Smuzhiyun 	/* structs defined in atl2_hw.h */
489*4882a593Smuzhiyun 	u32 bd_number;     /* board number */
490*4882a593Smuzhiyun 	bool pci_using_64;
491*4882a593Smuzhiyun 	bool have_msi;
492*4882a593Smuzhiyun 	struct atl2_hw hw;
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun 	u32 usr_cmd;
495*4882a593Smuzhiyun 	/* FIXME */
496*4882a593Smuzhiyun 	/* u32 regs_buff[ATL2_REGS_LEN]; */
497*4882a593Smuzhiyun 	u32 pci_state[16];
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun 	u32 *config_space;
500*4882a593Smuzhiyun };
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun enum atl2_state_t {
503*4882a593Smuzhiyun 	__ATL2_TESTING,
504*4882a593Smuzhiyun 	__ATL2_RESETTING,
505*4882a593Smuzhiyun 	__ATL2_DOWN
506*4882a593Smuzhiyun };
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun #endif /* _ATL2_H_ */
509