xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/altera/altera_tse.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /* Altera Triple-Speed Ethernet MAC driver
3*4882a593Smuzhiyun  * Copyright (C) 2008-2014 Altera Corporation. All rights reserved
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Contributors:
6*4882a593Smuzhiyun  *   Dalon Westergreen
7*4882a593Smuzhiyun  *   Thomas Chou
8*4882a593Smuzhiyun  *   Ian Abbott
9*4882a593Smuzhiyun  *   Yuriy Kozlov
10*4882a593Smuzhiyun  *   Tobias Klauser
11*4882a593Smuzhiyun  *   Andriy Smolskyy
12*4882a593Smuzhiyun  *   Roman Bulgakov
13*4882a593Smuzhiyun  *   Dmytro Mytarchuk
14*4882a593Smuzhiyun  *   Matthew Gerlach
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  * Original driver contributed by SLS.
17*4882a593Smuzhiyun  * Major updates contributed by GlobalLogic
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #ifndef __ALTERA_TSE_H__
21*4882a593Smuzhiyun #define __ALTERA_TSE_H__
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define ALTERA_TSE_RESOURCE_NAME	"altera_tse"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include <linux/bitops.h>
26*4882a593Smuzhiyun #include <linux/if_vlan.h>
27*4882a593Smuzhiyun #include <linux/list.h>
28*4882a593Smuzhiyun #include <linux/netdevice.h>
29*4882a593Smuzhiyun #include <linux/phy.h>
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define ALTERA_TSE_SW_RESET_WATCHDOG_CNTR	10000
32*4882a593Smuzhiyun #define ALTERA_TSE_MAC_FIFO_WIDTH		4	/* TX/RX FIFO width in
33*4882a593Smuzhiyun 							 * bytes
34*4882a593Smuzhiyun 							 */
35*4882a593Smuzhiyun /* Rx FIFO default settings */
36*4882a593Smuzhiyun #define ALTERA_TSE_RX_SECTION_EMPTY	16
37*4882a593Smuzhiyun #define ALTERA_TSE_RX_SECTION_FULL	0
38*4882a593Smuzhiyun #define ALTERA_TSE_RX_ALMOST_EMPTY	8
39*4882a593Smuzhiyun #define ALTERA_TSE_RX_ALMOST_FULL	8
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /* Tx FIFO default settings */
42*4882a593Smuzhiyun #define ALTERA_TSE_TX_SECTION_EMPTY	16
43*4882a593Smuzhiyun #define ALTERA_TSE_TX_SECTION_FULL	0
44*4882a593Smuzhiyun #define ALTERA_TSE_TX_ALMOST_EMPTY	8
45*4882a593Smuzhiyun #define ALTERA_TSE_TX_ALMOST_FULL	3
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /* MAC function configuration default settings */
48*4882a593Smuzhiyun #define ALTERA_TSE_TX_IPG_LENGTH	12
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define ALTERA_TSE_PAUSE_QUANTA		0xffff
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define GET_BIT_VALUE(v, bit)		(((v) >> (bit)) & 0x1)
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /* MAC Command_Config Register Bit Definitions
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun #define MAC_CMDCFG_TX_ENA			BIT(0)
57*4882a593Smuzhiyun #define MAC_CMDCFG_RX_ENA			BIT(1)
58*4882a593Smuzhiyun #define MAC_CMDCFG_XON_GEN			BIT(2)
59*4882a593Smuzhiyun #define MAC_CMDCFG_ETH_SPEED			BIT(3)
60*4882a593Smuzhiyun #define MAC_CMDCFG_PROMIS_EN			BIT(4)
61*4882a593Smuzhiyun #define MAC_CMDCFG_PAD_EN			BIT(5)
62*4882a593Smuzhiyun #define MAC_CMDCFG_CRC_FWD			BIT(6)
63*4882a593Smuzhiyun #define MAC_CMDCFG_PAUSE_FWD			BIT(7)
64*4882a593Smuzhiyun #define MAC_CMDCFG_PAUSE_IGNORE			BIT(8)
65*4882a593Smuzhiyun #define MAC_CMDCFG_TX_ADDR_INS			BIT(9)
66*4882a593Smuzhiyun #define MAC_CMDCFG_HD_ENA			BIT(10)
67*4882a593Smuzhiyun #define MAC_CMDCFG_EXCESS_COL			BIT(11)
68*4882a593Smuzhiyun #define MAC_CMDCFG_LATE_COL			BIT(12)
69*4882a593Smuzhiyun #define MAC_CMDCFG_SW_RESET			BIT(13)
70*4882a593Smuzhiyun #define MAC_CMDCFG_MHASH_SEL			BIT(14)
71*4882a593Smuzhiyun #define MAC_CMDCFG_LOOP_ENA			BIT(15)
72*4882a593Smuzhiyun #define MAC_CMDCFG_TX_ADDR_SEL(v)		(((v) & 0x7) << 16)
73*4882a593Smuzhiyun #define MAC_CMDCFG_MAGIC_ENA			BIT(19)
74*4882a593Smuzhiyun #define MAC_CMDCFG_SLEEP			BIT(20)
75*4882a593Smuzhiyun #define MAC_CMDCFG_WAKEUP			BIT(21)
76*4882a593Smuzhiyun #define MAC_CMDCFG_XOFF_GEN			BIT(22)
77*4882a593Smuzhiyun #define MAC_CMDCFG_CNTL_FRM_ENA			BIT(23)
78*4882a593Smuzhiyun #define MAC_CMDCFG_NO_LGTH_CHECK		BIT(24)
79*4882a593Smuzhiyun #define MAC_CMDCFG_ENA_10			BIT(25)
80*4882a593Smuzhiyun #define MAC_CMDCFG_RX_ERR_DISC			BIT(26)
81*4882a593Smuzhiyun #define MAC_CMDCFG_DISABLE_READ_TIMEOUT		BIT(27)
82*4882a593Smuzhiyun #define MAC_CMDCFG_CNT_RESET			BIT(31)
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define MAC_CMDCFG_TX_ENA_GET(v)		GET_BIT_VALUE(v, 0)
85*4882a593Smuzhiyun #define MAC_CMDCFG_RX_ENA_GET(v)		GET_BIT_VALUE(v, 1)
86*4882a593Smuzhiyun #define MAC_CMDCFG_XON_GEN_GET(v)		GET_BIT_VALUE(v, 2)
87*4882a593Smuzhiyun #define MAC_CMDCFG_ETH_SPEED_GET(v)		GET_BIT_VALUE(v, 3)
88*4882a593Smuzhiyun #define MAC_CMDCFG_PROMIS_EN_GET(v)		GET_BIT_VALUE(v, 4)
89*4882a593Smuzhiyun #define MAC_CMDCFG_PAD_EN_GET(v)		GET_BIT_VALUE(v, 5)
90*4882a593Smuzhiyun #define MAC_CMDCFG_CRC_FWD_GET(v)		GET_BIT_VALUE(v, 6)
91*4882a593Smuzhiyun #define MAC_CMDCFG_PAUSE_FWD_GET(v)		GET_BIT_VALUE(v, 7)
92*4882a593Smuzhiyun #define MAC_CMDCFG_PAUSE_IGNORE_GET(v)		GET_BIT_VALUE(v, 8)
93*4882a593Smuzhiyun #define MAC_CMDCFG_TX_ADDR_INS_GET(v)		GET_BIT_VALUE(v, 9)
94*4882a593Smuzhiyun #define MAC_CMDCFG_HD_ENA_GET(v)		GET_BIT_VALUE(v, 10)
95*4882a593Smuzhiyun #define MAC_CMDCFG_EXCESS_COL_GET(v)		GET_BIT_VALUE(v, 11)
96*4882a593Smuzhiyun #define MAC_CMDCFG_LATE_COL_GET(v)		GET_BIT_VALUE(v, 12)
97*4882a593Smuzhiyun #define MAC_CMDCFG_SW_RESET_GET(v)		GET_BIT_VALUE(v, 13)
98*4882a593Smuzhiyun #define MAC_CMDCFG_MHASH_SEL_GET(v)		GET_BIT_VALUE(v, 14)
99*4882a593Smuzhiyun #define MAC_CMDCFG_LOOP_ENA_GET(v)		GET_BIT_VALUE(v, 15)
100*4882a593Smuzhiyun #define MAC_CMDCFG_TX_ADDR_SEL_GET(v)		(((v) >> 16) & 0x7)
101*4882a593Smuzhiyun #define MAC_CMDCFG_MAGIC_ENA_GET(v)		GET_BIT_VALUE(v, 19)
102*4882a593Smuzhiyun #define MAC_CMDCFG_SLEEP_GET(v)			GET_BIT_VALUE(v, 20)
103*4882a593Smuzhiyun #define MAC_CMDCFG_WAKEUP_GET(v)		GET_BIT_VALUE(v, 21)
104*4882a593Smuzhiyun #define MAC_CMDCFG_XOFF_GEN_GET(v)		GET_BIT_VALUE(v, 22)
105*4882a593Smuzhiyun #define MAC_CMDCFG_CNTL_FRM_ENA_GET(v)		GET_BIT_VALUE(v, 23)
106*4882a593Smuzhiyun #define MAC_CMDCFG_NO_LGTH_CHECK_GET(v)		GET_BIT_VALUE(v, 24)
107*4882a593Smuzhiyun #define MAC_CMDCFG_ENA_10_GET(v)		GET_BIT_VALUE(v, 25)
108*4882a593Smuzhiyun #define MAC_CMDCFG_RX_ERR_DISC_GET(v)		GET_BIT_VALUE(v, 26)
109*4882a593Smuzhiyun #define MAC_CMDCFG_DISABLE_READ_TIMEOUT_GET(v)	GET_BIT_VALUE(v, 27)
110*4882a593Smuzhiyun #define MAC_CMDCFG_CNT_RESET_GET(v)		GET_BIT_VALUE(v, 31)
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /* SGMII PCS register addresses
113*4882a593Smuzhiyun  */
114*4882a593Smuzhiyun #define SGMII_PCS_SCRATCH	0x10
115*4882a593Smuzhiyun #define SGMII_PCS_REV		0x11
116*4882a593Smuzhiyun #define SGMII_PCS_LINK_TIMER_0	0x12
117*4882a593Smuzhiyun #define SGMII_PCS_LINK_TIMER_1	0x13
118*4882a593Smuzhiyun #define SGMII_PCS_IF_MODE	0x14
119*4882a593Smuzhiyun #define SGMII_PCS_DIS_READ_TO	0x15
120*4882a593Smuzhiyun #define SGMII_PCS_READ_TO	0x16
121*4882a593Smuzhiyun #define SGMII_PCS_SW_RESET_TIMEOUT 100 /* usecs */
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* MDIO registers within MAC register Space
124*4882a593Smuzhiyun  */
125*4882a593Smuzhiyun struct altera_tse_mdio {
126*4882a593Smuzhiyun 	u32 control;	/* PHY device operation control register */
127*4882a593Smuzhiyun 	u32 status;	/* PHY device operation status register */
128*4882a593Smuzhiyun 	u32 phy_id1;	/* Bits 31:16 of PHY identifier */
129*4882a593Smuzhiyun 	u32 phy_id2;	/* Bits 15:0 of PHY identifier */
130*4882a593Smuzhiyun 	u32 auto_negotiation_advertisement;	/* Auto-negotiation
131*4882a593Smuzhiyun 							 * advertisement
132*4882a593Smuzhiyun 							 * register
133*4882a593Smuzhiyun 							 */
134*4882a593Smuzhiyun 	u32 remote_partner_base_page_ability;
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	u32 reg6;
137*4882a593Smuzhiyun 	u32 reg7;
138*4882a593Smuzhiyun 	u32 reg8;
139*4882a593Smuzhiyun 	u32 reg9;
140*4882a593Smuzhiyun 	u32 rega;
141*4882a593Smuzhiyun 	u32 regb;
142*4882a593Smuzhiyun 	u32 regc;
143*4882a593Smuzhiyun 	u32 regd;
144*4882a593Smuzhiyun 	u32 rege;
145*4882a593Smuzhiyun 	u32 regf;
146*4882a593Smuzhiyun 	u32 reg10;
147*4882a593Smuzhiyun 	u32 reg11;
148*4882a593Smuzhiyun 	u32 reg12;
149*4882a593Smuzhiyun 	u32 reg13;
150*4882a593Smuzhiyun 	u32 reg14;
151*4882a593Smuzhiyun 	u32 reg15;
152*4882a593Smuzhiyun 	u32 reg16;
153*4882a593Smuzhiyun 	u32 reg17;
154*4882a593Smuzhiyun 	u32 reg18;
155*4882a593Smuzhiyun 	u32 reg19;
156*4882a593Smuzhiyun 	u32 reg1a;
157*4882a593Smuzhiyun 	u32 reg1b;
158*4882a593Smuzhiyun 	u32 reg1c;
159*4882a593Smuzhiyun 	u32 reg1d;
160*4882a593Smuzhiyun 	u32 reg1e;
161*4882a593Smuzhiyun 	u32 reg1f;
162*4882a593Smuzhiyun };
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun /* MAC register Space. Note that some of these registers may or may not be
165*4882a593Smuzhiyun  * present depending upon options chosen by the user when the core was
166*4882a593Smuzhiyun  * configured and built. Please consult the Altera Triple Speed Ethernet User
167*4882a593Smuzhiyun  * Guide for details.
168*4882a593Smuzhiyun  */
169*4882a593Smuzhiyun struct altera_tse_mac {
170*4882a593Smuzhiyun 	/* Bits 15:0: MegaCore function revision (0x0800). Bit 31:16: Customer
171*4882a593Smuzhiyun 	 * specific revision
172*4882a593Smuzhiyun 	 */
173*4882a593Smuzhiyun 	u32 megacore_revision;
174*4882a593Smuzhiyun 	/* Provides a memory location for user applications to test the device
175*4882a593Smuzhiyun 	 * memory operation.
176*4882a593Smuzhiyun 	 */
177*4882a593Smuzhiyun 	u32 scratch_pad;
178*4882a593Smuzhiyun 	/* The host processor uses this register to control and configure the
179*4882a593Smuzhiyun 	 * MAC block
180*4882a593Smuzhiyun 	 */
181*4882a593Smuzhiyun 	u32 command_config;
182*4882a593Smuzhiyun 	/* 32-bit primary MAC address word 0 bits 0 to 31 of the primary
183*4882a593Smuzhiyun 	 * MAC address
184*4882a593Smuzhiyun 	 */
185*4882a593Smuzhiyun 	u32 mac_addr_0;
186*4882a593Smuzhiyun 	/* 32-bit primary MAC address word 1 bits 32 to 47 of the primary
187*4882a593Smuzhiyun 	 * MAC address
188*4882a593Smuzhiyun 	 */
189*4882a593Smuzhiyun 	u32 mac_addr_1;
190*4882a593Smuzhiyun 	/* 14-bit maximum frame length. The MAC receive logic */
191*4882a593Smuzhiyun 	u32 frm_length;
192*4882a593Smuzhiyun 	/* The pause quanta is used in each pause frame sent to a remote
193*4882a593Smuzhiyun 	 * Ethernet device, in increments of 512 Ethernet bit times
194*4882a593Smuzhiyun 	 */
195*4882a593Smuzhiyun 	u32 pause_quanta;
196*4882a593Smuzhiyun 	/* 12-bit receive FIFO section-empty threshold */
197*4882a593Smuzhiyun 	u32 rx_section_empty;
198*4882a593Smuzhiyun 	/* 12-bit receive FIFO section-full threshold */
199*4882a593Smuzhiyun 	u32 rx_section_full;
200*4882a593Smuzhiyun 	/* 12-bit transmit FIFO section-empty threshold */
201*4882a593Smuzhiyun 	u32 tx_section_empty;
202*4882a593Smuzhiyun 	/* 12-bit transmit FIFO section-full threshold */
203*4882a593Smuzhiyun 	u32 tx_section_full;
204*4882a593Smuzhiyun 	/* 12-bit receive FIFO almost-empty threshold */
205*4882a593Smuzhiyun 	u32 rx_almost_empty;
206*4882a593Smuzhiyun 	/* 12-bit receive FIFO almost-full threshold */
207*4882a593Smuzhiyun 	u32 rx_almost_full;
208*4882a593Smuzhiyun 	/* 12-bit transmit FIFO almost-empty threshold */
209*4882a593Smuzhiyun 	u32 tx_almost_empty;
210*4882a593Smuzhiyun 	/* 12-bit transmit FIFO almost-full threshold */
211*4882a593Smuzhiyun 	u32 tx_almost_full;
212*4882a593Smuzhiyun 	/* MDIO address of PHY Device 0. Bits 0 to 4 hold a 5-bit PHY address */
213*4882a593Smuzhiyun 	u32 mdio_phy0_addr;
214*4882a593Smuzhiyun 	/* MDIO address of PHY Device 1. Bits 0 to 4 hold a 5-bit PHY address */
215*4882a593Smuzhiyun 	u32 mdio_phy1_addr;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	/* Bit[15:0]—16-bit holdoff quanta */
218*4882a593Smuzhiyun 	u32 holdoff_quant;
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	/* only if 100/1000 BaseX PCS, reserved otherwise */
221*4882a593Smuzhiyun 	u32 reserved1[5];
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	/* Minimum IPG between consecutive transmit frame in terms of bytes */
224*4882a593Smuzhiyun 	u32 tx_ipg_length;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	/* IEEE 802.3 oEntity Managed Object Support */
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	/* The MAC addresses */
229*4882a593Smuzhiyun 	u32 mac_id_1;
230*4882a593Smuzhiyun 	u32 mac_id_2;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	/* Number of frames transmitted without error including pause frames */
233*4882a593Smuzhiyun 	u32 frames_transmitted_ok;
234*4882a593Smuzhiyun 	/* Number of frames received without error including pause frames */
235*4882a593Smuzhiyun 	u32 frames_received_ok;
236*4882a593Smuzhiyun 	/* Number of frames received with a CRC error */
237*4882a593Smuzhiyun 	u32 frames_check_sequence_errors;
238*4882a593Smuzhiyun 	/* Frame received with an alignment error */
239*4882a593Smuzhiyun 	u32 alignment_errors;
240*4882a593Smuzhiyun 	/* Sum of payload and padding octets of frames transmitted without
241*4882a593Smuzhiyun 	 * error
242*4882a593Smuzhiyun 	 */
243*4882a593Smuzhiyun 	u32 octets_transmitted_ok;
244*4882a593Smuzhiyun 	/* Sum of payload and padding octets of frames received without error */
245*4882a593Smuzhiyun 	u32 octets_received_ok;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	/* IEEE 802.3 oPausedEntity Managed Object Support */
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	/* Number of transmitted pause frames */
250*4882a593Smuzhiyun 	u32 tx_pause_mac_ctrl_frames;
251*4882a593Smuzhiyun 	/* Number of Received pause frames */
252*4882a593Smuzhiyun 	u32 rx_pause_mac_ctrl_frames;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	/* IETF MIB (MIB-II) Object Support */
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	/* Number of frames received with error */
257*4882a593Smuzhiyun 	u32 if_in_errors;
258*4882a593Smuzhiyun 	/* Number of frames transmitted with error */
259*4882a593Smuzhiyun 	u32 if_out_errors;
260*4882a593Smuzhiyun 	/* Number of valid received unicast frames */
261*4882a593Smuzhiyun 	u32 if_in_ucast_pkts;
262*4882a593Smuzhiyun 	/* Number of valid received multicasts frames (without pause) */
263*4882a593Smuzhiyun 	u32 if_in_multicast_pkts;
264*4882a593Smuzhiyun 	/* Number of valid received broadcast frames */
265*4882a593Smuzhiyun 	u32 if_in_broadcast_pkts;
266*4882a593Smuzhiyun 	u32 if_out_discards;
267*4882a593Smuzhiyun 	/* The number of valid unicast frames transmitted */
268*4882a593Smuzhiyun 	u32 if_out_ucast_pkts;
269*4882a593Smuzhiyun 	/* The number of valid multicast frames transmitted,
270*4882a593Smuzhiyun 	 * excluding pause frames
271*4882a593Smuzhiyun 	 */
272*4882a593Smuzhiyun 	u32 if_out_multicast_pkts;
273*4882a593Smuzhiyun 	u32 if_out_broadcast_pkts;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 	/* IETF RMON MIB Object Support */
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	/* Counts the number of dropped packets due to internal errors
278*4882a593Smuzhiyun 	 * of the MAC client.
279*4882a593Smuzhiyun 	 */
280*4882a593Smuzhiyun 	u32 ether_stats_drop_events;
281*4882a593Smuzhiyun 	/* Total number of bytes received. Good and bad frames. */
282*4882a593Smuzhiyun 	u32 ether_stats_octets;
283*4882a593Smuzhiyun 	/* Total number of packets received. Counts good and bad packets. */
284*4882a593Smuzhiyun 	u32 ether_stats_pkts;
285*4882a593Smuzhiyun 	/* Number of packets received with less than 64 bytes. */
286*4882a593Smuzhiyun 	u32 ether_stats_undersize_pkts;
287*4882a593Smuzhiyun 	/* The number of frames received that are longer than the
288*4882a593Smuzhiyun 	 * value configured in the frm_length register
289*4882a593Smuzhiyun 	 */
290*4882a593Smuzhiyun 	u32 ether_stats_oversize_pkts;
291*4882a593Smuzhiyun 	/* Number of received packet with 64 bytes */
292*4882a593Smuzhiyun 	u32 ether_stats_pkts_64_octets;
293*4882a593Smuzhiyun 	/* Frames (good and bad) with 65 to 127 bytes */
294*4882a593Smuzhiyun 	u32 ether_stats_pkts_65to127_octets;
295*4882a593Smuzhiyun 	/* Frames (good and bad) with 128 to 255 bytes */
296*4882a593Smuzhiyun 	u32 ether_stats_pkts_128to255_octets;
297*4882a593Smuzhiyun 	/* Frames (good and bad) with 256 to 511 bytes */
298*4882a593Smuzhiyun 	u32 ether_stats_pkts_256to511_octets;
299*4882a593Smuzhiyun 	/* Frames (good and bad) with 512 to 1023 bytes */
300*4882a593Smuzhiyun 	u32 ether_stats_pkts_512to1023_octets;
301*4882a593Smuzhiyun 	/* Frames (good and bad) with 1024 to 1518 bytes */
302*4882a593Smuzhiyun 	u32 ether_stats_pkts_1024to1518_octets;
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	/* Any frame length from 1519 to the maximum length configured in the
305*4882a593Smuzhiyun 	 * frm_length register, if it is greater than 1518
306*4882a593Smuzhiyun 	 */
307*4882a593Smuzhiyun 	u32 ether_stats_pkts_1519tox_octets;
308*4882a593Smuzhiyun 	/* Too long frames with CRC error */
309*4882a593Smuzhiyun 	u32 ether_stats_jabbers;
310*4882a593Smuzhiyun 	/* Too short frames with CRC error */
311*4882a593Smuzhiyun 	u32 ether_stats_fragments;
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 	u32 reserved2;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	/* FIFO control register */
316*4882a593Smuzhiyun 	u32 tx_cmd_stat;
317*4882a593Smuzhiyun 	u32 rx_cmd_stat;
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 	/* Extended Statistics Counters */
320*4882a593Smuzhiyun 	u32 msb_octets_transmitted_ok;
321*4882a593Smuzhiyun 	u32 msb_octets_received_ok;
322*4882a593Smuzhiyun 	u32 msb_ether_stats_octets;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	u32 reserved3;
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	/* Multicast address resolution table, mapped in the controller address
327*4882a593Smuzhiyun 	 * space
328*4882a593Smuzhiyun 	 */
329*4882a593Smuzhiyun 	u32 hash_table[64];
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	/* Registers 0 to 31 within PHY device 0/1 connected to the MDIO PHY
332*4882a593Smuzhiyun 	 * management interface
333*4882a593Smuzhiyun 	 */
334*4882a593Smuzhiyun 	struct altera_tse_mdio mdio_phy0;
335*4882a593Smuzhiyun 	struct altera_tse_mdio mdio_phy1;
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 	/* 4 Supplemental MAC Addresses */
338*4882a593Smuzhiyun 	u32 supp_mac_addr_0_0;
339*4882a593Smuzhiyun 	u32 supp_mac_addr_0_1;
340*4882a593Smuzhiyun 	u32 supp_mac_addr_1_0;
341*4882a593Smuzhiyun 	u32 supp_mac_addr_1_1;
342*4882a593Smuzhiyun 	u32 supp_mac_addr_2_0;
343*4882a593Smuzhiyun 	u32 supp_mac_addr_2_1;
344*4882a593Smuzhiyun 	u32 supp_mac_addr_3_0;
345*4882a593Smuzhiyun 	u32 supp_mac_addr_3_1;
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	u32 reserved4[8];
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	/* IEEE 1588v2 Feature */
350*4882a593Smuzhiyun 	u32 tx_period;
351*4882a593Smuzhiyun 	u32 tx_adjust_fns;
352*4882a593Smuzhiyun 	u32 tx_adjust_ns;
353*4882a593Smuzhiyun 	u32 rx_period;
354*4882a593Smuzhiyun 	u32 rx_adjust_fns;
355*4882a593Smuzhiyun 	u32 rx_adjust_ns;
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	u32 reserved5[42];
358*4882a593Smuzhiyun };
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun #define tse_csroffs(a) (offsetof(struct altera_tse_mac, a))
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun /* Transmit and Receive Command Registers Bit Definitions
363*4882a593Smuzhiyun  */
364*4882a593Smuzhiyun #define ALTERA_TSE_TX_CMD_STAT_OMIT_CRC		BIT(17)
365*4882a593Smuzhiyun #define ALTERA_TSE_TX_CMD_STAT_TX_SHIFT16	BIT(18)
366*4882a593Smuzhiyun #define ALTERA_TSE_RX_CMD_STAT_RX_SHIFT16	BIT(25)
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun /* Wrapper around a pointer to a socket buffer,
369*4882a593Smuzhiyun  * so a DMA handle can be stored along with the buffer
370*4882a593Smuzhiyun  */
371*4882a593Smuzhiyun struct tse_buffer {
372*4882a593Smuzhiyun 	struct list_head lh;
373*4882a593Smuzhiyun 	struct sk_buff *skb;
374*4882a593Smuzhiyun 	dma_addr_t dma_addr;
375*4882a593Smuzhiyun 	u32 len;
376*4882a593Smuzhiyun 	int mapped_as_page;
377*4882a593Smuzhiyun };
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun struct altera_tse_private;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun #define ALTERA_DTYPE_SGDMA 1
382*4882a593Smuzhiyun #define ALTERA_DTYPE_MSGDMA 2
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun /* standard DMA interface for SGDMA and MSGDMA */
385*4882a593Smuzhiyun struct altera_dmaops {
386*4882a593Smuzhiyun 	int altera_dtype;
387*4882a593Smuzhiyun 	int dmamask;
388*4882a593Smuzhiyun 	void (*reset_dma)(struct altera_tse_private *);
389*4882a593Smuzhiyun 	void (*enable_txirq)(struct altera_tse_private *);
390*4882a593Smuzhiyun 	void (*enable_rxirq)(struct altera_tse_private *);
391*4882a593Smuzhiyun 	void (*disable_txirq)(struct altera_tse_private *);
392*4882a593Smuzhiyun 	void (*disable_rxirq)(struct altera_tse_private *);
393*4882a593Smuzhiyun 	void (*clear_txirq)(struct altera_tse_private *);
394*4882a593Smuzhiyun 	void (*clear_rxirq)(struct altera_tse_private *);
395*4882a593Smuzhiyun 	int (*tx_buffer)(struct altera_tse_private *, struct tse_buffer *);
396*4882a593Smuzhiyun 	u32 (*tx_completions)(struct altera_tse_private *);
397*4882a593Smuzhiyun 	void (*add_rx_desc)(struct altera_tse_private *, struct tse_buffer *);
398*4882a593Smuzhiyun 	u32 (*get_rx_status)(struct altera_tse_private *);
399*4882a593Smuzhiyun 	int (*init_dma)(struct altera_tse_private *);
400*4882a593Smuzhiyun 	void (*uninit_dma)(struct altera_tse_private *);
401*4882a593Smuzhiyun 	void (*start_rxdma)(struct altera_tse_private *);
402*4882a593Smuzhiyun };
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun /* This structure is private to each device.
405*4882a593Smuzhiyun  */
406*4882a593Smuzhiyun struct altera_tse_private {
407*4882a593Smuzhiyun 	struct net_device *dev;
408*4882a593Smuzhiyun 	struct device *device;
409*4882a593Smuzhiyun 	struct napi_struct napi;
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	/* MAC address space */
412*4882a593Smuzhiyun 	struct altera_tse_mac __iomem *mac_dev;
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	/* TSE Revision */
415*4882a593Smuzhiyun 	u32	revision;
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	/* mSGDMA Rx Dispatcher address space */
418*4882a593Smuzhiyun 	void __iomem *rx_dma_csr;
419*4882a593Smuzhiyun 	void __iomem *rx_dma_desc;
420*4882a593Smuzhiyun 	void __iomem *rx_dma_resp;
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 	/* mSGDMA Tx Dispatcher address space */
423*4882a593Smuzhiyun 	void __iomem *tx_dma_csr;
424*4882a593Smuzhiyun 	void __iomem *tx_dma_desc;
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	/* Rx buffers queue */
427*4882a593Smuzhiyun 	struct tse_buffer *rx_ring;
428*4882a593Smuzhiyun 	u32 rx_cons;
429*4882a593Smuzhiyun 	u32 rx_prod;
430*4882a593Smuzhiyun 	u32 rx_ring_size;
431*4882a593Smuzhiyun 	u32 rx_dma_buf_sz;
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun 	/* Tx ring buffer */
434*4882a593Smuzhiyun 	struct tse_buffer *tx_ring;
435*4882a593Smuzhiyun 	u32 tx_prod;
436*4882a593Smuzhiyun 	u32 tx_cons;
437*4882a593Smuzhiyun 	u32 tx_ring_size;
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	/* Interrupts */
440*4882a593Smuzhiyun 	u32 tx_irq;
441*4882a593Smuzhiyun 	u32 rx_irq;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	/* RX/TX MAC FIFO configs */
444*4882a593Smuzhiyun 	u32 tx_fifo_depth;
445*4882a593Smuzhiyun 	u32 rx_fifo_depth;
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 	/* Hash filter settings */
448*4882a593Smuzhiyun 	u32 hash_filter;
449*4882a593Smuzhiyun 	u32 added_unicast;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	/* Descriptor memory info for managing SGDMA */
452*4882a593Smuzhiyun 	u32 txdescmem;
453*4882a593Smuzhiyun 	u32 rxdescmem;
454*4882a593Smuzhiyun 	dma_addr_t rxdescmem_busaddr;
455*4882a593Smuzhiyun 	dma_addr_t txdescmem_busaddr;
456*4882a593Smuzhiyun 	u32 txctrlreg;
457*4882a593Smuzhiyun 	u32 rxctrlreg;
458*4882a593Smuzhiyun 	dma_addr_t rxdescphys;
459*4882a593Smuzhiyun 	dma_addr_t txdescphys;
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun 	struct list_head txlisthd;
462*4882a593Smuzhiyun 	struct list_head rxlisthd;
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	/* MAC command_config register protection */
465*4882a593Smuzhiyun 	spinlock_t mac_cfg_lock;
466*4882a593Smuzhiyun 	/* Tx path protection */
467*4882a593Smuzhiyun 	spinlock_t tx_lock;
468*4882a593Smuzhiyun 	/* Rx DMA & interrupt control protection */
469*4882a593Smuzhiyun 	spinlock_t rxdma_irq_lock;
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	/* PHY */
472*4882a593Smuzhiyun 	int phy_addr;		/* PHY's MDIO address, -1 for autodetection */
473*4882a593Smuzhiyun 	phy_interface_t phy_iface;
474*4882a593Smuzhiyun 	struct mii_bus *mdio;
475*4882a593Smuzhiyun 	int oldspeed;
476*4882a593Smuzhiyun 	int oldduplex;
477*4882a593Smuzhiyun 	int oldlink;
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun 	/* ethtool msglvl option */
480*4882a593Smuzhiyun 	u32 msg_enable;
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	struct altera_dmaops *dmaops;
483*4882a593Smuzhiyun };
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun /* Function prototypes
486*4882a593Smuzhiyun  */
487*4882a593Smuzhiyun void altera_tse_set_ethtool_ops(struct net_device *);
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun static inline
csrrd32(void __iomem * mac,size_t offs)490*4882a593Smuzhiyun u32 csrrd32(void __iomem *mac, size_t offs)
491*4882a593Smuzhiyun {
492*4882a593Smuzhiyun 	void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
493*4882a593Smuzhiyun 	return readl(paddr);
494*4882a593Smuzhiyun }
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun static inline
csrrd16(void __iomem * mac,size_t offs)497*4882a593Smuzhiyun u16 csrrd16(void __iomem *mac, size_t offs)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun 	void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
500*4882a593Smuzhiyun 	return readw(paddr);
501*4882a593Smuzhiyun }
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun static inline
csrrd8(void __iomem * mac,size_t offs)504*4882a593Smuzhiyun u8 csrrd8(void __iomem *mac, size_t offs)
505*4882a593Smuzhiyun {
506*4882a593Smuzhiyun 	void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
507*4882a593Smuzhiyun 	return readb(paddr);
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun static inline
csrwr32(u32 val,void __iomem * mac,size_t offs)511*4882a593Smuzhiyun void csrwr32(u32 val, void __iomem *mac, size_t offs)
512*4882a593Smuzhiyun {
513*4882a593Smuzhiyun 	void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	writel(val, paddr);
516*4882a593Smuzhiyun }
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun static inline
csrwr16(u16 val,void __iomem * mac,size_t offs)519*4882a593Smuzhiyun void csrwr16(u16 val, void __iomem *mac, size_t offs)
520*4882a593Smuzhiyun {
521*4882a593Smuzhiyun 	void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun 	writew(val, paddr);
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun static inline
csrwr8(u8 val,void __iomem * mac,size_t offs)527*4882a593Smuzhiyun void csrwr8(u8 val, void __iomem *mac, size_t offs)
528*4882a593Smuzhiyun {
529*4882a593Smuzhiyun 	void __iomem *paddr = (void __iomem *)((uintptr_t)mac + offs);
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	writeb(val, paddr);
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun #endif /* __ALTERA_TSE_H__ */
535