xref: /openbmc/linux/drivers/net/ethernet/qualcomm/emac/emac.h (revision b9b17debc69d27cd55e21ee51a5ba7fc50a426cf)
1*b9b17debSTimur Tabi /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
2*b9b17debSTimur Tabi  *
3*b9b17debSTimur Tabi  * This program is free software; you can redistribute it and/or modify
4*b9b17debSTimur Tabi  * it under the terms of the GNU General Public License version 2 and
5*b9b17debSTimur Tabi  * only version 2 as published by the Free Software Foundation.
6*b9b17debSTimur Tabi  *
7*b9b17debSTimur Tabi  * This program is distributed in the hope that it will be useful,
8*b9b17debSTimur Tabi  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9*b9b17debSTimur Tabi  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10*b9b17debSTimur Tabi  * GNU General Public License for more details.
11*b9b17debSTimur Tabi  */
12*b9b17debSTimur Tabi 
13*b9b17debSTimur Tabi #ifndef _EMAC_H_
14*b9b17debSTimur Tabi #define _EMAC_H_
15*b9b17debSTimur Tabi 
16*b9b17debSTimur Tabi #include <linux/irqreturn.h>
17*b9b17debSTimur Tabi #include <linux/netdevice.h>
18*b9b17debSTimur Tabi #include <linux/clk.h>
19*b9b17debSTimur Tabi #include <linux/platform_device.h>
20*b9b17debSTimur Tabi #include "emac-mac.h"
21*b9b17debSTimur Tabi #include "emac-phy.h"
22*b9b17debSTimur Tabi 
23*b9b17debSTimur Tabi /* EMAC base register offsets */
24*b9b17debSTimur Tabi #define EMAC_DMA_MAS_CTRL                                     0x001400
25*b9b17debSTimur Tabi #define EMAC_IRQ_MOD_TIM_INIT                                 0x001408
26*b9b17debSTimur Tabi #define EMAC_BLK_IDLE_STS                                     0x00140c
27*b9b17debSTimur Tabi #define EMAC_PHY_LINK_DELAY                                   0x00141c
28*b9b17debSTimur Tabi #define EMAC_SYS_ALIV_CTRL                                    0x001434
29*b9b17debSTimur Tabi #define EMAC_MAC_IPGIFG_CTRL                                  0x001484
30*b9b17debSTimur Tabi #define EMAC_MAC_STA_ADDR0                                    0x001488
31*b9b17debSTimur Tabi #define EMAC_MAC_STA_ADDR1                                    0x00148c
32*b9b17debSTimur Tabi #define EMAC_HASH_TAB_REG0                                    0x001490
33*b9b17debSTimur Tabi #define EMAC_HASH_TAB_REG1                                    0x001494
34*b9b17debSTimur Tabi #define EMAC_MAC_HALF_DPLX_CTRL                               0x001498
35*b9b17debSTimur Tabi #define EMAC_MAX_FRAM_LEN_CTRL                                0x00149c
36*b9b17debSTimur Tabi #define EMAC_INT_STATUS                                       0x001600
37*b9b17debSTimur Tabi #define EMAC_INT_MASK                                         0x001604
38*b9b17debSTimur Tabi #define EMAC_RXMAC_STATC_REG0                                 0x001700
39*b9b17debSTimur Tabi #define EMAC_RXMAC_STATC_REG22                                0x001758
40*b9b17debSTimur Tabi #define EMAC_TXMAC_STATC_REG0                                 0x001760
41*b9b17debSTimur Tabi #define EMAC_TXMAC_STATC_REG24                                0x0017c0
42*b9b17debSTimur Tabi #define EMAC_CORE_HW_VERSION                                  0x001974
43*b9b17debSTimur Tabi #define EMAC_IDT_TABLE0                                       0x001b00
44*b9b17debSTimur Tabi #define EMAC_RXMAC_STATC_REG23                                0x001bc8
45*b9b17debSTimur Tabi #define EMAC_RXMAC_STATC_REG24                                0x001bcc
46*b9b17debSTimur Tabi #define EMAC_TXMAC_STATC_REG25                                0x001bd0
47*b9b17debSTimur Tabi #define EMAC_INT1_MASK                                        0x001bf0
48*b9b17debSTimur Tabi #define EMAC_INT1_STATUS                                      0x001bf4
49*b9b17debSTimur Tabi #define EMAC_INT2_MASK                                        0x001bf8
50*b9b17debSTimur Tabi #define EMAC_INT2_STATUS                                      0x001bfc
51*b9b17debSTimur Tabi #define EMAC_INT3_MASK                                        0x001c00
52*b9b17debSTimur Tabi #define EMAC_INT3_STATUS                                      0x001c04
53*b9b17debSTimur Tabi 
54*b9b17debSTimur Tabi /* EMAC_DMA_MAS_CTRL */
55*b9b17debSTimur Tabi #define DEV_ID_NUM_BMSK                                     0x7f000000
56*b9b17debSTimur Tabi #define DEV_ID_NUM_SHFT                                             24
57*b9b17debSTimur Tabi #define DEV_REV_NUM_BMSK                                      0xff0000
58*b9b17debSTimur Tabi #define DEV_REV_NUM_SHFT                                            16
59*b9b17debSTimur Tabi #define INT_RD_CLR_EN                                           0x4000
60*b9b17debSTimur Tabi #define IRQ_MODERATOR2_EN                                        0x800
61*b9b17debSTimur Tabi #define IRQ_MODERATOR_EN                                         0x400
62*b9b17debSTimur Tabi #define LPW_CLK_SEL                                               0x80
63*b9b17debSTimur Tabi #define LPW_STATE                                                 0x20
64*b9b17debSTimur Tabi #define LPW_MODE                                                  0x10
65*b9b17debSTimur Tabi #define SOFT_RST                                                   0x1
66*b9b17debSTimur Tabi 
67*b9b17debSTimur Tabi /* EMAC_IRQ_MOD_TIM_INIT */
68*b9b17debSTimur Tabi #define IRQ_MODERATOR2_INIT_BMSK                            0xffff0000
69*b9b17debSTimur Tabi #define IRQ_MODERATOR2_INIT_SHFT                                    16
70*b9b17debSTimur Tabi #define IRQ_MODERATOR_INIT_BMSK                                 0xffff
71*b9b17debSTimur Tabi #define IRQ_MODERATOR_INIT_SHFT                                      0
72*b9b17debSTimur Tabi 
73*b9b17debSTimur Tabi /* EMAC_INT_STATUS */
74*b9b17debSTimur Tabi #define DIS_INT                                                BIT(31)
75*b9b17debSTimur Tabi #define PTP_INT                                                BIT(30)
76*b9b17debSTimur Tabi #define RFD4_UR_INT                                            BIT(29)
77*b9b17debSTimur Tabi #define TX_PKT_INT3                                            BIT(26)
78*b9b17debSTimur Tabi #define TX_PKT_INT2                                            BIT(25)
79*b9b17debSTimur Tabi #define TX_PKT_INT1                                            BIT(24)
80*b9b17debSTimur Tabi #define RX_PKT_INT3                                            BIT(19)
81*b9b17debSTimur Tabi #define RX_PKT_INT2                                            BIT(18)
82*b9b17debSTimur Tabi #define RX_PKT_INT1                                            BIT(17)
83*b9b17debSTimur Tabi #define RX_PKT_INT0                                            BIT(16)
84*b9b17debSTimur Tabi #define TX_PKT_INT                                             BIT(15)
85*b9b17debSTimur Tabi #define TXQ_TO_INT                                             BIT(14)
86*b9b17debSTimur Tabi #define GPHY_WAKEUP_INT                                        BIT(13)
87*b9b17debSTimur Tabi #define GPHY_LINK_DOWN_INT                                     BIT(12)
88*b9b17debSTimur Tabi #define GPHY_LINK_UP_INT                                       BIT(11)
89*b9b17debSTimur Tabi #define DMAW_TO_INT                                            BIT(10)
90*b9b17debSTimur Tabi #define DMAR_TO_INT                                             BIT(9)
91*b9b17debSTimur Tabi #define TXF_UR_INT                                              BIT(8)
92*b9b17debSTimur Tabi #define RFD3_UR_INT                                             BIT(7)
93*b9b17debSTimur Tabi #define RFD2_UR_INT                                             BIT(6)
94*b9b17debSTimur Tabi #define RFD1_UR_INT                                             BIT(5)
95*b9b17debSTimur Tabi #define RFD0_UR_INT                                             BIT(4)
96*b9b17debSTimur Tabi #define RXF_OF_INT                                              BIT(3)
97*b9b17debSTimur Tabi #define SW_MAN_INT                                              BIT(2)
98*b9b17debSTimur Tabi 
99*b9b17debSTimur Tabi /* EMAC_MAILBOX_6 */
100*b9b17debSTimur Tabi #define RFD2_PROC_IDX_BMSK                                   0xfff0000
101*b9b17debSTimur Tabi #define RFD2_PROC_IDX_SHFT                                          16
102*b9b17debSTimur Tabi #define RFD2_PROD_IDX_BMSK                                       0xfff
103*b9b17debSTimur Tabi #define RFD2_PROD_IDX_SHFT                                           0
104*b9b17debSTimur Tabi 
105*b9b17debSTimur Tabi /* EMAC_CORE_HW_VERSION */
106*b9b17debSTimur Tabi #define MAJOR_BMSK                                          0xf0000000
107*b9b17debSTimur Tabi #define MAJOR_SHFT                                                  28
108*b9b17debSTimur Tabi #define MINOR_BMSK                                           0xfff0000
109*b9b17debSTimur Tabi #define MINOR_SHFT                                                  16
110*b9b17debSTimur Tabi #define STEP_BMSK                                               0xffff
111*b9b17debSTimur Tabi #define STEP_SHFT                                                    0
112*b9b17debSTimur Tabi 
113*b9b17debSTimur Tabi /* EMAC_EMAC_WRAPPER_CSR1 */
114*b9b17debSTimur Tabi #define TX_INDX_FIFO_SYNC_RST                                  BIT(23)
115*b9b17debSTimur Tabi #define TX_TS_FIFO_SYNC_RST                                    BIT(22)
116*b9b17debSTimur Tabi #define RX_TS_FIFO2_SYNC_RST                                   BIT(21)
117*b9b17debSTimur Tabi #define RX_TS_FIFO1_SYNC_RST                                   BIT(20)
118*b9b17debSTimur Tabi #define TX_TS_ENABLE                                           BIT(16)
119*b9b17debSTimur Tabi #define DIS_1588_CLKS                                          BIT(11)
120*b9b17debSTimur Tabi #define FREQ_MODE                                               BIT(9)
121*b9b17debSTimur Tabi #define ENABLE_RRD_TIMESTAMP                                    BIT(3)
122*b9b17debSTimur Tabi 
123*b9b17debSTimur Tabi /* EMAC_EMAC_WRAPPER_CSR2 */
124*b9b17debSTimur Tabi #define HDRIVE_BMSK                                             0x3000
125*b9b17debSTimur Tabi #define HDRIVE_SHFT                                                 12
126*b9b17debSTimur Tabi #define SLB_EN                                                  BIT(9)
127*b9b17debSTimur Tabi #define PLB_EN                                                  BIT(8)
128*b9b17debSTimur Tabi #define WOL_EN                                                  BIT(3)
129*b9b17debSTimur Tabi #define PHY_RESET                                               BIT(0)
130*b9b17debSTimur Tabi 
131*b9b17debSTimur Tabi #define EMAC_DEV_ID                                             0x0040
132*b9b17debSTimur Tabi 
133*b9b17debSTimur Tabi /* SGMII v2 per lane registers */
134*b9b17debSTimur Tabi #define SGMII_LN_RSM_START             0x029C
135*b9b17debSTimur Tabi 
136*b9b17debSTimur Tabi /* SGMII v2 PHY common registers */
137*b9b17debSTimur Tabi #define SGMII_PHY_CMN_CTRL            0x0408
138*b9b17debSTimur Tabi #define SGMII_PHY_CMN_RESET_CTRL      0x0410
139*b9b17debSTimur Tabi 
140*b9b17debSTimur Tabi /* SGMII v2 PHY registers per lane */
141*b9b17debSTimur Tabi #define SGMII_PHY_LN_OFFSET          0x0400
142*b9b17debSTimur Tabi #define SGMII_PHY_LN_LANE_STATUS     0x00DC
143*b9b17debSTimur Tabi #define SGMII_PHY_LN_BIST_GEN0       0x008C
144*b9b17debSTimur Tabi #define SGMII_PHY_LN_BIST_GEN1       0x0090
145*b9b17debSTimur Tabi #define SGMII_PHY_LN_BIST_GEN2       0x0094
146*b9b17debSTimur Tabi #define SGMII_PHY_LN_BIST_GEN3       0x0098
147*b9b17debSTimur Tabi #define SGMII_PHY_LN_CDR_CTRL1       0x005C
148*b9b17debSTimur Tabi 
149*b9b17debSTimur Tabi enum emac_clk_id {
150*b9b17debSTimur Tabi 	EMAC_CLK_AXI,
151*b9b17debSTimur Tabi 	EMAC_CLK_CFG_AHB,
152*b9b17debSTimur Tabi 	EMAC_CLK_HIGH_SPEED,
153*b9b17debSTimur Tabi 	EMAC_CLK_MDIO,
154*b9b17debSTimur Tabi 	EMAC_CLK_TX,
155*b9b17debSTimur Tabi 	EMAC_CLK_RX,
156*b9b17debSTimur Tabi 	EMAC_CLK_SYS,
157*b9b17debSTimur Tabi 	EMAC_CLK_CNT
158*b9b17debSTimur Tabi };
159*b9b17debSTimur Tabi 
160*b9b17debSTimur Tabi #define EMAC_LINK_SPEED_UNKNOWN                                    0x0
161*b9b17debSTimur Tabi #define EMAC_LINK_SPEED_10_HALF                                 BIT(0)
162*b9b17debSTimur Tabi #define EMAC_LINK_SPEED_10_FULL                                 BIT(1)
163*b9b17debSTimur Tabi #define EMAC_LINK_SPEED_100_HALF                                BIT(2)
164*b9b17debSTimur Tabi #define EMAC_LINK_SPEED_100_FULL                                BIT(3)
165*b9b17debSTimur Tabi #define EMAC_LINK_SPEED_1GB_FULL                                BIT(5)
166*b9b17debSTimur Tabi 
167*b9b17debSTimur Tabi #define EMAC_MAX_SETUP_LNK_CYCLE                                   100
168*b9b17debSTimur Tabi 
169*b9b17debSTimur Tabi /* Wake On Lan */
170*b9b17debSTimur Tabi #define EMAC_WOL_PHY                     0x00000001 /* PHY Status Change */
171*b9b17debSTimur Tabi #define EMAC_WOL_MAGIC                   0x00000002 /* Magic Packet */
172*b9b17debSTimur Tabi 
173*b9b17debSTimur Tabi struct emac_stats {
174*b9b17debSTimur Tabi 	/* rx */
175*b9b17debSTimur Tabi 	u64 rx_ok;              /* good packets */
176*b9b17debSTimur Tabi 	u64 rx_bcast;           /* good broadcast packets */
177*b9b17debSTimur Tabi 	u64 rx_mcast;           /* good multicast packets */
178*b9b17debSTimur Tabi 	u64 rx_pause;           /* pause packet */
179*b9b17debSTimur Tabi 	u64 rx_ctrl;            /* control packets other than pause frame. */
180*b9b17debSTimur Tabi 	u64 rx_fcs_err;         /* packets with bad FCS. */
181*b9b17debSTimur Tabi 	u64 rx_len_err;         /* packets with length mismatch */
182*b9b17debSTimur Tabi 	u64 rx_byte_cnt;        /* good bytes count (without FCS) */
183*b9b17debSTimur Tabi 	u64 rx_runt;            /* runt packets */
184*b9b17debSTimur Tabi 	u64 rx_frag;            /* fragment count */
185*b9b17debSTimur Tabi 	u64 rx_sz_64;	        /* packets that are 64 bytes */
186*b9b17debSTimur Tabi 	u64 rx_sz_65_127;       /* packets that are 65-127 bytes */
187*b9b17debSTimur Tabi 	u64 rx_sz_128_255;      /* packets that are 128-255 bytes */
188*b9b17debSTimur Tabi 	u64 rx_sz_256_511;      /* packets that are 256-511 bytes */
189*b9b17debSTimur Tabi 	u64 rx_sz_512_1023;     /* packets that are 512-1023 bytes */
190*b9b17debSTimur Tabi 	u64 rx_sz_1024_1518;    /* packets that are 1024-1518 bytes */
191*b9b17debSTimur Tabi 	u64 rx_sz_1519_max;     /* packets that are 1519-MTU bytes*/
192*b9b17debSTimur Tabi 	u64 rx_sz_ov;           /* packets that are >MTU bytes (truncated) */
193*b9b17debSTimur Tabi 	u64 rx_rxf_ov;          /* packets dropped due to RX FIFO overflow */
194*b9b17debSTimur Tabi 	u64 rx_align_err;       /* alignment errors */
195*b9b17debSTimur Tabi 	u64 rx_bcast_byte_cnt;  /* broadcast packets byte count (without FCS) */
196*b9b17debSTimur Tabi 	u64 rx_mcast_byte_cnt;  /* multicast packets byte count (without FCS) */
197*b9b17debSTimur Tabi 	u64 rx_err_addr;        /* packets dropped due to address filtering */
198*b9b17debSTimur Tabi 	u64 rx_crc_align;       /* CRC align errors */
199*b9b17debSTimur Tabi 	u64 rx_jabbers;         /* jabbers */
200*b9b17debSTimur Tabi 
201*b9b17debSTimur Tabi 	/* tx */
202*b9b17debSTimur Tabi 	u64 tx_ok;              /* good packets */
203*b9b17debSTimur Tabi 	u64 tx_bcast;           /* good broadcast packets */
204*b9b17debSTimur Tabi 	u64 tx_mcast;           /* good multicast packets */
205*b9b17debSTimur Tabi 	u64 tx_pause;           /* pause packets */
206*b9b17debSTimur Tabi 	u64 tx_exc_defer;       /* packets with excessive deferral */
207*b9b17debSTimur Tabi 	u64 tx_ctrl;            /* control packets other than pause frame */
208*b9b17debSTimur Tabi 	u64 tx_defer;           /* packets that are deferred. */
209*b9b17debSTimur Tabi 	u64 tx_byte_cnt;        /* good bytes count (without FCS) */
210*b9b17debSTimur Tabi 	u64 tx_sz_64;           /* packets that are 64 bytes */
211*b9b17debSTimur Tabi 	u64 tx_sz_65_127;       /* packets that are 65-127 bytes */
212*b9b17debSTimur Tabi 	u64 tx_sz_128_255;      /* packets that are 128-255 bytes */
213*b9b17debSTimur Tabi 	u64 tx_sz_256_511;      /* packets that are 256-511 bytes */
214*b9b17debSTimur Tabi 	u64 tx_sz_512_1023;     /* packets that are 512-1023 bytes */
215*b9b17debSTimur Tabi 	u64 tx_sz_1024_1518;    /* packets that are 1024-1518 bytes */
216*b9b17debSTimur Tabi 	u64 tx_sz_1519_max;     /* packets that are 1519-MTU bytes */
217*b9b17debSTimur Tabi 	u64 tx_1_col;           /* packets single prior collision */
218*b9b17debSTimur Tabi 	u64 tx_2_col;           /* packets with multiple prior collisions */
219*b9b17debSTimur Tabi 	u64 tx_late_col;        /* packets with late collisions */
220*b9b17debSTimur Tabi 	u64 tx_abort_col;       /* packets aborted due to excess collisions */
221*b9b17debSTimur Tabi 	u64 tx_underrun;        /* packets aborted due to FIFO underrun */
222*b9b17debSTimur Tabi 	u64 tx_rd_eop;          /* count of reads beyond EOP */
223*b9b17debSTimur Tabi 	u64 tx_len_err;         /* packets with length mismatch */
224*b9b17debSTimur Tabi 	u64 tx_trunc;           /* packets truncated due to size >MTU */
225*b9b17debSTimur Tabi 	u64 tx_bcast_byte;      /* broadcast packets byte count (without FCS) */
226*b9b17debSTimur Tabi 	u64 tx_mcast_byte;      /* multicast packets byte count (without FCS) */
227*b9b17debSTimur Tabi 	u64 tx_col;             /* collisions */
228*b9b17debSTimur Tabi 
229*b9b17debSTimur Tabi 	spinlock_t lock;	/* prevent multiple simultaneous readers */
230*b9b17debSTimur Tabi };
231*b9b17debSTimur Tabi 
232*b9b17debSTimur Tabi /* RSS hstype Definitions */
233*b9b17debSTimur Tabi #define EMAC_RSS_HSTYP_IPV4_EN				    0x00000001
234*b9b17debSTimur Tabi #define EMAC_RSS_HSTYP_TCP4_EN				    0x00000002
235*b9b17debSTimur Tabi #define EMAC_RSS_HSTYP_IPV6_EN				    0x00000004
236*b9b17debSTimur Tabi #define EMAC_RSS_HSTYP_TCP6_EN				    0x00000008
237*b9b17debSTimur Tabi #define EMAC_RSS_HSTYP_ALL_EN (\
238*b9b17debSTimur Tabi 		EMAC_RSS_HSTYP_IPV4_EN   |\
239*b9b17debSTimur Tabi 		EMAC_RSS_HSTYP_TCP4_EN   |\
240*b9b17debSTimur Tabi 		EMAC_RSS_HSTYP_IPV6_EN   |\
241*b9b17debSTimur Tabi 		EMAC_RSS_HSTYP_TCP6_EN)
242*b9b17debSTimur Tabi 
243*b9b17debSTimur Tabi #define EMAC_VLAN_TO_TAG(_vlan, _tag) \
244*b9b17debSTimur Tabi 		(_tag =  ((((_vlan) >> 8) & 0xFF) | (((_vlan) & 0xFF) << 8)))
245*b9b17debSTimur Tabi 
246*b9b17debSTimur Tabi #define EMAC_TAG_TO_VLAN(_tag, _vlan) \
247*b9b17debSTimur Tabi 		(_vlan = ((((_tag) >> 8) & 0xFF) | (((_tag) & 0xFF) << 8)))
248*b9b17debSTimur Tabi 
249*b9b17debSTimur Tabi #define EMAC_DEF_RX_BUF_SIZE					  1536
250*b9b17debSTimur Tabi #define EMAC_MAX_JUMBO_PKT_SIZE				    (9 * 1024)
251*b9b17debSTimur Tabi #define EMAC_MAX_TX_OFFLOAD_THRESH			    (9 * 1024)
252*b9b17debSTimur Tabi 
253*b9b17debSTimur Tabi #define EMAC_MAX_ETH_FRAME_SIZE		       EMAC_MAX_JUMBO_PKT_SIZE
254*b9b17debSTimur Tabi #define EMAC_MIN_ETH_FRAME_SIZE					    68
255*b9b17debSTimur Tabi 
256*b9b17debSTimur Tabi #define EMAC_DEF_TX_QUEUES					     1
257*b9b17debSTimur Tabi #define EMAC_DEF_RX_QUEUES					     1
258*b9b17debSTimur Tabi 
259*b9b17debSTimur Tabi #define EMAC_MIN_TX_DESCS					   128
260*b9b17debSTimur Tabi #define EMAC_MIN_RX_DESCS					   128
261*b9b17debSTimur Tabi 
262*b9b17debSTimur Tabi #define EMAC_MAX_TX_DESCS					 16383
263*b9b17debSTimur Tabi #define EMAC_MAX_RX_DESCS					  2047
264*b9b17debSTimur Tabi 
265*b9b17debSTimur Tabi #define EMAC_DEF_TX_DESCS					   512
266*b9b17debSTimur Tabi #define EMAC_DEF_RX_DESCS					   256
267*b9b17debSTimur Tabi 
268*b9b17debSTimur Tabi #define EMAC_DEF_RX_IRQ_MOD					   250
269*b9b17debSTimur Tabi #define EMAC_DEF_TX_IRQ_MOD					   250
270*b9b17debSTimur Tabi 
271*b9b17debSTimur Tabi #define EMAC_WATCHDOG_TIME				      (5 * HZ)
272*b9b17debSTimur Tabi 
273*b9b17debSTimur Tabi /* by default check link every 4 seconds */
274*b9b17debSTimur Tabi #define EMAC_TRY_LINK_TIMEOUT				      (4 * HZ)
275*b9b17debSTimur Tabi 
276*b9b17debSTimur Tabi /* emac_irq per-device (per-adapter) irq properties.
277*b9b17debSTimur Tabi  * @irq:	irq number.
278*b9b17debSTimur Tabi  * @mask	mask to use over status register.
279*b9b17debSTimur Tabi  */
280*b9b17debSTimur Tabi struct emac_irq {
281*b9b17debSTimur Tabi 	unsigned int	irq;
282*b9b17debSTimur Tabi 	u32		mask;
283*b9b17debSTimur Tabi };
284*b9b17debSTimur Tabi 
285*b9b17debSTimur Tabi /* The device's main data structure */
286*b9b17debSTimur Tabi struct emac_adapter {
287*b9b17debSTimur Tabi 	struct net_device		*netdev;
288*b9b17debSTimur Tabi 	struct mii_bus			*mii_bus;
289*b9b17debSTimur Tabi 	struct phy_device		*phydev;
290*b9b17debSTimur Tabi 
291*b9b17debSTimur Tabi 	void __iomem			*base;
292*b9b17debSTimur Tabi 	void __iomem			*csr;
293*b9b17debSTimur Tabi 
294*b9b17debSTimur Tabi 	struct emac_phy			phy;
295*b9b17debSTimur Tabi 	struct emac_stats		stats;
296*b9b17debSTimur Tabi 
297*b9b17debSTimur Tabi 	struct emac_irq			irq;
298*b9b17debSTimur Tabi 	struct clk			*clk[EMAC_CLK_CNT];
299*b9b17debSTimur Tabi 
300*b9b17debSTimur Tabi 	/* All Descriptor memory */
301*b9b17debSTimur Tabi 	struct emac_ring_header		ring_header;
302*b9b17debSTimur Tabi 	struct emac_tx_queue		tx_q;
303*b9b17debSTimur Tabi 	struct emac_rx_queue		rx_q;
304*b9b17debSTimur Tabi 	unsigned int			tx_desc_cnt;
305*b9b17debSTimur Tabi 	unsigned int			rx_desc_cnt;
306*b9b17debSTimur Tabi 	unsigned int			rrd_size; /* in quad words */
307*b9b17debSTimur Tabi 	unsigned int			rfd_size; /* in quad words */
308*b9b17debSTimur Tabi 	unsigned int			tpd_size; /* in quad words */
309*b9b17debSTimur Tabi 
310*b9b17debSTimur Tabi 	unsigned int			rxbuf_size;
311*b9b17debSTimur Tabi 
312*b9b17debSTimur Tabi 	/* Ring parameter */
313*b9b17debSTimur Tabi 	u8				tpd_burst;
314*b9b17debSTimur Tabi 	u8				rfd_burst;
315*b9b17debSTimur Tabi 	unsigned int			dmaw_dly_cnt;
316*b9b17debSTimur Tabi 	unsigned int			dmar_dly_cnt;
317*b9b17debSTimur Tabi 	enum emac_dma_req_block		dmar_block;
318*b9b17debSTimur Tabi 	enum emac_dma_req_block		dmaw_block;
319*b9b17debSTimur Tabi 	enum emac_dma_order		dma_order;
320*b9b17debSTimur Tabi 
321*b9b17debSTimur Tabi 	u32				irq_mod;
322*b9b17debSTimur Tabi 	u32				preamble;
323*b9b17debSTimur Tabi 
324*b9b17debSTimur Tabi 	struct work_struct		work_thread;
325*b9b17debSTimur Tabi 
326*b9b17debSTimur Tabi 	u16				msg_enable;
327*b9b17debSTimur Tabi 
328*b9b17debSTimur Tabi 	struct mutex			reset_lock;
329*b9b17debSTimur Tabi };
330*b9b17debSTimur Tabi 
331*b9b17debSTimur Tabi int emac_reinit_locked(struct emac_adapter *adpt);
332*b9b17debSTimur Tabi void emac_reg_update32(void __iomem *addr, u32 mask, u32 val);
333*b9b17debSTimur Tabi irqreturn_t emac_isr(int irq, void *data);
334*b9b17debSTimur Tabi 
335*b9b17debSTimur Tabi #endif /* _EMAC_H_ */
336