xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/qualcomm/emac/emac.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
3*4882a593Smuzhiyun  */
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #ifndef _EMAC_H_
6*4882a593Smuzhiyun #define _EMAC_H_
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/irqreturn.h>
9*4882a593Smuzhiyun #include <linux/netdevice.h>
10*4882a593Smuzhiyun #include <linux/clk.h>
11*4882a593Smuzhiyun #include <linux/platform_device.h>
12*4882a593Smuzhiyun #include "emac-mac.h"
13*4882a593Smuzhiyun #include "emac-phy.h"
14*4882a593Smuzhiyun #include "emac-sgmii.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* EMAC base register offsets */
17*4882a593Smuzhiyun #define EMAC_DMA_MAS_CTRL		0x1400
18*4882a593Smuzhiyun #define EMAC_IRQ_MOD_TIM_INIT		0x1408
19*4882a593Smuzhiyun #define EMAC_BLK_IDLE_STS		0x140c
20*4882a593Smuzhiyun #define EMAC_PHY_LINK_DELAY		0x141c
21*4882a593Smuzhiyun #define EMAC_SYS_ALIV_CTRL		0x1434
22*4882a593Smuzhiyun #define EMAC_MAC_CTRL			0x1480
23*4882a593Smuzhiyun #define EMAC_MAC_IPGIFG_CTRL		0x1484
24*4882a593Smuzhiyun #define EMAC_MAC_STA_ADDR0		0x1488
25*4882a593Smuzhiyun #define EMAC_MAC_STA_ADDR1		0x148c
26*4882a593Smuzhiyun #define EMAC_HASH_TAB_REG0		0x1490
27*4882a593Smuzhiyun #define EMAC_HASH_TAB_REG1		0x1494
28*4882a593Smuzhiyun #define EMAC_MAC_HALF_DPLX_CTRL		0x1498
29*4882a593Smuzhiyun #define EMAC_MAX_FRAM_LEN_CTRL		0x149c
30*4882a593Smuzhiyun #define EMAC_WOL_CTRL0			0x14a0
31*4882a593Smuzhiyun #define EMAC_RSS_KEY0			0x14b0
32*4882a593Smuzhiyun #define EMAC_H1TPD_BASE_ADDR_LO		0x14e0
33*4882a593Smuzhiyun #define EMAC_H2TPD_BASE_ADDR_LO		0x14e4
34*4882a593Smuzhiyun #define EMAC_H3TPD_BASE_ADDR_LO		0x14e8
35*4882a593Smuzhiyun #define EMAC_INTER_SRAM_PART9		0x1534
36*4882a593Smuzhiyun #define EMAC_DESC_CTRL_0		0x1540
37*4882a593Smuzhiyun #define EMAC_DESC_CTRL_1		0x1544
38*4882a593Smuzhiyun #define EMAC_DESC_CTRL_2		0x1550
39*4882a593Smuzhiyun #define EMAC_DESC_CTRL_10		0x1554
40*4882a593Smuzhiyun #define EMAC_DESC_CTRL_12		0x1558
41*4882a593Smuzhiyun #define EMAC_DESC_CTRL_13		0x155c
42*4882a593Smuzhiyun #define EMAC_DESC_CTRL_3		0x1560
43*4882a593Smuzhiyun #define EMAC_DESC_CTRL_4		0x1564
44*4882a593Smuzhiyun #define EMAC_DESC_CTRL_5		0x1568
45*4882a593Smuzhiyun #define EMAC_DESC_CTRL_14		0x156c
46*4882a593Smuzhiyun #define EMAC_DESC_CTRL_15		0x1570
47*4882a593Smuzhiyun #define EMAC_DESC_CTRL_16		0x1574
48*4882a593Smuzhiyun #define EMAC_DESC_CTRL_6		0x1578
49*4882a593Smuzhiyun #define EMAC_DESC_CTRL_8		0x1580
50*4882a593Smuzhiyun #define EMAC_DESC_CTRL_9		0x1584
51*4882a593Smuzhiyun #define EMAC_DESC_CTRL_11		0x1588
52*4882a593Smuzhiyun #define EMAC_TXQ_CTRL_0			0x1590
53*4882a593Smuzhiyun #define EMAC_TXQ_CTRL_1			0x1594
54*4882a593Smuzhiyun #define EMAC_TXQ_CTRL_2			0x1598
55*4882a593Smuzhiyun #define EMAC_RXQ_CTRL_0			0x15a0
56*4882a593Smuzhiyun #define EMAC_RXQ_CTRL_1			0x15a4
57*4882a593Smuzhiyun #define EMAC_RXQ_CTRL_2			0x15a8
58*4882a593Smuzhiyun #define EMAC_RXQ_CTRL_3			0x15ac
59*4882a593Smuzhiyun #define EMAC_BASE_CPU_NUMBER		0x15b8
60*4882a593Smuzhiyun #define EMAC_DMA_CTRL			0x15c0
61*4882a593Smuzhiyun #define EMAC_MAILBOX_0			0x15e0
62*4882a593Smuzhiyun #define EMAC_MAILBOX_5			0x15e4
63*4882a593Smuzhiyun #define EMAC_MAILBOX_6			0x15e8
64*4882a593Smuzhiyun #define EMAC_MAILBOX_13			0x15ec
65*4882a593Smuzhiyun #define EMAC_MAILBOX_2			0x15f4
66*4882a593Smuzhiyun #define EMAC_MAILBOX_3			0x15f8
67*4882a593Smuzhiyun #define EMAC_INT_STATUS			0x1600
68*4882a593Smuzhiyun #define EMAC_INT_MASK			0x1604
69*4882a593Smuzhiyun #define EMAC_MAILBOX_11			0x160c
70*4882a593Smuzhiyun #define EMAC_AXI_MAST_CTRL		0x1610
71*4882a593Smuzhiyun #define EMAC_MAILBOX_12			0x1614
72*4882a593Smuzhiyun #define EMAC_MAILBOX_9			0x1618
73*4882a593Smuzhiyun #define EMAC_MAILBOX_10			0x161c
74*4882a593Smuzhiyun #define EMAC_ATHR_HEADER_CTRL		0x1620
75*4882a593Smuzhiyun #define EMAC_RXMAC_STATC_REG0		0x1700
76*4882a593Smuzhiyun #define EMAC_RXMAC_STATC_REG22		0x1758
77*4882a593Smuzhiyun #define EMAC_TXMAC_STATC_REG0		0x1760
78*4882a593Smuzhiyun #define EMAC_TXMAC_STATC_REG24		0x17c0
79*4882a593Smuzhiyun #define EMAC_CLK_GATE_CTRL		0x1814
80*4882a593Smuzhiyun #define EMAC_CORE_HW_VERSION		0x1974
81*4882a593Smuzhiyun #define EMAC_MISC_CTRL			0x1990
82*4882a593Smuzhiyun #define EMAC_MAILBOX_7			0x19e0
83*4882a593Smuzhiyun #define EMAC_MAILBOX_8			0x19e4
84*4882a593Smuzhiyun #define EMAC_IDT_TABLE0			0x1b00
85*4882a593Smuzhiyun #define EMAC_RXMAC_STATC_REG23		0x1bc8
86*4882a593Smuzhiyun #define EMAC_RXMAC_STATC_REG24		0x1bcc
87*4882a593Smuzhiyun #define EMAC_TXMAC_STATC_REG25		0x1bd0
88*4882a593Smuzhiyun #define EMAC_MAILBOX_15			0x1bd4
89*4882a593Smuzhiyun #define EMAC_MAILBOX_16			0x1bd8
90*4882a593Smuzhiyun #define EMAC_INT1_MASK			0x1bf0
91*4882a593Smuzhiyun #define EMAC_INT1_STATUS		0x1bf4
92*4882a593Smuzhiyun #define EMAC_INT2_MASK			0x1bf8
93*4882a593Smuzhiyun #define EMAC_INT2_STATUS		0x1bfc
94*4882a593Smuzhiyun #define EMAC_INT3_MASK			0x1c00
95*4882a593Smuzhiyun #define EMAC_INT3_STATUS		0x1c04
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /* EMAC_DMA_MAS_CTRL */
98*4882a593Smuzhiyun #define DEV_ID_NUM_BMSK                                     0x7f000000
99*4882a593Smuzhiyun #define DEV_ID_NUM_SHFT                                             24
100*4882a593Smuzhiyun #define DEV_REV_NUM_BMSK                                      0xff0000
101*4882a593Smuzhiyun #define DEV_REV_NUM_SHFT                                            16
102*4882a593Smuzhiyun #define INT_RD_CLR_EN                                           0x4000
103*4882a593Smuzhiyun #define IRQ_MODERATOR2_EN                                        0x800
104*4882a593Smuzhiyun #define IRQ_MODERATOR_EN                                         0x400
105*4882a593Smuzhiyun #define LPW_CLK_SEL                                               0x80
106*4882a593Smuzhiyun #define LPW_STATE                                                 0x20
107*4882a593Smuzhiyun #define LPW_MODE                                                  0x10
108*4882a593Smuzhiyun #define SOFT_RST                                                   0x1
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /* EMAC_IRQ_MOD_TIM_INIT */
111*4882a593Smuzhiyun #define IRQ_MODERATOR2_INIT_BMSK                            0xffff0000
112*4882a593Smuzhiyun #define IRQ_MODERATOR2_INIT_SHFT                                    16
113*4882a593Smuzhiyun #define IRQ_MODERATOR_INIT_BMSK                                 0xffff
114*4882a593Smuzhiyun #define IRQ_MODERATOR_INIT_SHFT                                      0
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* EMAC_INT_STATUS */
117*4882a593Smuzhiyun #define DIS_INT                                                BIT(31)
118*4882a593Smuzhiyun #define PTP_INT                                                BIT(30)
119*4882a593Smuzhiyun #define RFD4_UR_INT                                            BIT(29)
120*4882a593Smuzhiyun #define TX_PKT_INT3                                            BIT(26)
121*4882a593Smuzhiyun #define TX_PKT_INT2                                            BIT(25)
122*4882a593Smuzhiyun #define TX_PKT_INT1                                            BIT(24)
123*4882a593Smuzhiyun #define RX_PKT_INT3                                            BIT(19)
124*4882a593Smuzhiyun #define RX_PKT_INT2                                            BIT(18)
125*4882a593Smuzhiyun #define RX_PKT_INT1                                            BIT(17)
126*4882a593Smuzhiyun #define RX_PKT_INT0                                            BIT(16)
127*4882a593Smuzhiyun #define TX_PKT_INT                                             BIT(15)
128*4882a593Smuzhiyun #define TXQ_TO_INT                                             BIT(14)
129*4882a593Smuzhiyun #define GPHY_WAKEUP_INT                                        BIT(13)
130*4882a593Smuzhiyun #define GPHY_LINK_DOWN_INT                                     BIT(12)
131*4882a593Smuzhiyun #define GPHY_LINK_UP_INT                                       BIT(11)
132*4882a593Smuzhiyun #define DMAW_TO_INT                                            BIT(10)
133*4882a593Smuzhiyun #define DMAR_TO_INT                                             BIT(9)
134*4882a593Smuzhiyun #define TXF_UR_INT                                              BIT(8)
135*4882a593Smuzhiyun #define RFD3_UR_INT                                             BIT(7)
136*4882a593Smuzhiyun #define RFD2_UR_INT                                             BIT(6)
137*4882a593Smuzhiyun #define RFD1_UR_INT                                             BIT(5)
138*4882a593Smuzhiyun #define RFD0_UR_INT                                             BIT(4)
139*4882a593Smuzhiyun #define RXF_OF_INT                                              BIT(3)
140*4882a593Smuzhiyun #define SW_MAN_INT                                              BIT(2)
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun /* EMAC_MAILBOX_6 */
143*4882a593Smuzhiyun #define RFD2_PROC_IDX_BMSK                                   0xfff0000
144*4882a593Smuzhiyun #define RFD2_PROC_IDX_SHFT                                          16
145*4882a593Smuzhiyun #define RFD2_PROD_IDX_BMSK                                       0xfff
146*4882a593Smuzhiyun #define RFD2_PROD_IDX_SHFT                                           0
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /* EMAC_CORE_HW_VERSION */
149*4882a593Smuzhiyun #define MAJOR_BMSK                                          0xf0000000
150*4882a593Smuzhiyun #define MAJOR_SHFT                                                  28
151*4882a593Smuzhiyun #define MINOR_BMSK                                           0xfff0000
152*4882a593Smuzhiyun #define MINOR_SHFT                                                  16
153*4882a593Smuzhiyun #define STEP_BMSK                                               0xffff
154*4882a593Smuzhiyun #define STEP_SHFT                                                    0
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun /* EMAC_EMAC_WRAPPER_CSR1 */
157*4882a593Smuzhiyun #define TX_INDX_FIFO_SYNC_RST                                  BIT(23)
158*4882a593Smuzhiyun #define TX_TS_FIFO_SYNC_RST                                    BIT(22)
159*4882a593Smuzhiyun #define RX_TS_FIFO2_SYNC_RST                                   BIT(21)
160*4882a593Smuzhiyun #define RX_TS_FIFO1_SYNC_RST                                   BIT(20)
161*4882a593Smuzhiyun #define TX_TS_ENABLE                                           BIT(16)
162*4882a593Smuzhiyun #define DIS_1588_CLKS                                          BIT(11)
163*4882a593Smuzhiyun #define FREQ_MODE                                               BIT(9)
164*4882a593Smuzhiyun #define ENABLE_RRD_TIMESTAMP                                    BIT(3)
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /* EMAC_EMAC_WRAPPER_CSR2 */
167*4882a593Smuzhiyun #define HDRIVE_BMSK                                             0x3000
168*4882a593Smuzhiyun #define HDRIVE_SHFT                                                 12
169*4882a593Smuzhiyun #define SLB_EN                                                  BIT(9)
170*4882a593Smuzhiyun #define PLB_EN                                                  BIT(8)
171*4882a593Smuzhiyun #define WOL_EN                                                  BIT(3)
172*4882a593Smuzhiyun #define PHY_RESET                                               BIT(0)
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun #define EMAC_DEV_ID                                             0x0040
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun /* SGMII v2 per lane registers */
177*4882a593Smuzhiyun #define SGMII_LN_RSM_START             0x029C
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun /* SGMII v2 PHY common registers */
180*4882a593Smuzhiyun #define SGMII_PHY_CMN_CTRL            0x0408
181*4882a593Smuzhiyun #define SGMII_PHY_CMN_RESET_CTRL      0x0410
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun /* SGMII v2 PHY registers per lane */
184*4882a593Smuzhiyun #define SGMII_PHY_LN_OFFSET          0x0400
185*4882a593Smuzhiyun #define SGMII_PHY_LN_LANE_STATUS     0x00DC
186*4882a593Smuzhiyun #define SGMII_PHY_LN_BIST_GEN0       0x008C
187*4882a593Smuzhiyun #define SGMII_PHY_LN_BIST_GEN1       0x0090
188*4882a593Smuzhiyun #define SGMII_PHY_LN_BIST_GEN2       0x0094
189*4882a593Smuzhiyun #define SGMII_PHY_LN_BIST_GEN3       0x0098
190*4882a593Smuzhiyun #define SGMII_PHY_LN_CDR_CTRL1       0x005C
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun enum emac_clk_id {
193*4882a593Smuzhiyun 	EMAC_CLK_AXI,
194*4882a593Smuzhiyun 	EMAC_CLK_CFG_AHB,
195*4882a593Smuzhiyun 	EMAC_CLK_HIGH_SPEED,
196*4882a593Smuzhiyun 	EMAC_CLK_MDIO,
197*4882a593Smuzhiyun 	EMAC_CLK_TX,
198*4882a593Smuzhiyun 	EMAC_CLK_RX,
199*4882a593Smuzhiyun 	EMAC_CLK_SYS,
200*4882a593Smuzhiyun 	EMAC_CLK_CNT
201*4882a593Smuzhiyun };
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun #define EMAC_LINK_SPEED_UNKNOWN                                    0x0
204*4882a593Smuzhiyun #define EMAC_LINK_SPEED_10_HALF                                 BIT(0)
205*4882a593Smuzhiyun #define EMAC_LINK_SPEED_10_FULL                                 BIT(1)
206*4882a593Smuzhiyun #define EMAC_LINK_SPEED_100_HALF                                BIT(2)
207*4882a593Smuzhiyun #define EMAC_LINK_SPEED_100_FULL                                BIT(3)
208*4882a593Smuzhiyun #define EMAC_LINK_SPEED_1GB_FULL                                BIT(5)
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun #define EMAC_MAX_SETUP_LNK_CYCLE                                   100
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun struct emac_stats {
213*4882a593Smuzhiyun 	/* rx */
214*4882a593Smuzhiyun 	u64 rx_ok;              /* good packets */
215*4882a593Smuzhiyun 	u64 rx_bcast;           /* good broadcast packets */
216*4882a593Smuzhiyun 	u64 rx_mcast;           /* good multicast packets */
217*4882a593Smuzhiyun 	u64 rx_pause;           /* pause packet */
218*4882a593Smuzhiyun 	u64 rx_ctrl;            /* control packets other than pause frame. */
219*4882a593Smuzhiyun 	u64 rx_fcs_err;         /* packets with bad FCS. */
220*4882a593Smuzhiyun 	u64 rx_len_err;         /* packets with length mismatch */
221*4882a593Smuzhiyun 	u64 rx_byte_cnt;        /* good bytes count (without FCS) */
222*4882a593Smuzhiyun 	u64 rx_runt;            /* runt packets */
223*4882a593Smuzhiyun 	u64 rx_frag;            /* fragment count */
224*4882a593Smuzhiyun 	u64 rx_sz_64;	        /* packets that are 64 bytes */
225*4882a593Smuzhiyun 	u64 rx_sz_65_127;       /* packets that are 65-127 bytes */
226*4882a593Smuzhiyun 	u64 rx_sz_128_255;      /* packets that are 128-255 bytes */
227*4882a593Smuzhiyun 	u64 rx_sz_256_511;      /* packets that are 256-511 bytes */
228*4882a593Smuzhiyun 	u64 rx_sz_512_1023;     /* packets that are 512-1023 bytes */
229*4882a593Smuzhiyun 	u64 rx_sz_1024_1518;    /* packets that are 1024-1518 bytes */
230*4882a593Smuzhiyun 	u64 rx_sz_1519_max;     /* packets that are 1519-MTU bytes*/
231*4882a593Smuzhiyun 	u64 rx_sz_ov;           /* packets that are >MTU bytes (truncated) */
232*4882a593Smuzhiyun 	u64 rx_rxf_ov;          /* packets dropped due to RX FIFO overflow */
233*4882a593Smuzhiyun 	u64 rx_align_err;       /* alignment errors */
234*4882a593Smuzhiyun 	u64 rx_bcast_byte_cnt;  /* broadcast packets byte count (without FCS) */
235*4882a593Smuzhiyun 	u64 rx_mcast_byte_cnt;  /* multicast packets byte count (without FCS) */
236*4882a593Smuzhiyun 	u64 rx_err_addr;        /* packets dropped due to address filtering */
237*4882a593Smuzhiyun 	u64 rx_crc_align;       /* CRC align errors */
238*4882a593Smuzhiyun 	u64 rx_jabbers;         /* jabbers */
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	/* tx */
241*4882a593Smuzhiyun 	u64 tx_ok;              /* good packets */
242*4882a593Smuzhiyun 	u64 tx_bcast;           /* good broadcast packets */
243*4882a593Smuzhiyun 	u64 tx_mcast;           /* good multicast packets */
244*4882a593Smuzhiyun 	u64 tx_pause;           /* pause packets */
245*4882a593Smuzhiyun 	u64 tx_exc_defer;       /* packets with excessive deferral */
246*4882a593Smuzhiyun 	u64 tx_ctrl;            /* control packets other than pause frame */
247*4882a593Smuzhiyun 	u64 tx_defer;           /* packets that are deferred. */
248*4882a593Smuzhiyun 	u64 tx_byte_cnt;        /* good bytes count (without FCS) */
249*4882a593Smuzhiyun 	u64 tx_sz_64;           /* packets that are 64 bytes */
250*4882a593Smuzhiyun 	u64 tx_sz_65_127;       /* packets that are 65-127 bytes */
251*4882a593Smuzhiyun 	u64 tx_sz_128_255;      /* packets that are 128-255 bytes */
252*4882a593Smuzhiyun 	u64 tx_sz_256_511;      /* packets that are 256-511 bytes */
253*4882a593Smuzhiyun 	u64 tx_sz_512_1023;     /* packets that are 512-1023 bytes */
254*4882a593Smuzhiyun 	u64 tx_sz_1024_1518;    /* packets that are 1024-1518 bytes */
255*4882a593Smuzhiyun 	u64 tx_sz_1519_max;     /* packets that are 1519-MTU bytes */
256*4882a593Smuzhiyun 	u64 tx_1_col;           /* packets single prior collision */
257*4882a593Smuzhiyun 	u64 tx_2_col;           /* packets with multiple prior collisions */
258*4882a593Smuzhiyun 	u64 tx_late_col;        /* packets with late collisions */
259*4882a593Smuzhiyun 	u64 tx_abort_col;       /* packets aborted due to excess collisions */
260*4882a593Smuzhiyun 	u64 tx_underrun;        /* packets aborted due to FIFO underrun */
261*4882a593Smuzhiyun 	u64 tx_rd_eop;          /* count of reads beyond EOP */
262*4882a593Smuzhiyun 	u64 tx_len_err;         /* packets with length mismatch */
263*4882a593Smuzhiyun 	u64 tx_trunc;           /* packets truncated due to size >MTU */
264*4882a593Smuzhiyun 	u64 tx_bcast_byte;      /* broadcast packets byte count (without FCS) */
265*4882a593Smuzhiyun 	u64 tx_mcast_byte;      /* multicast packets byte count (without FCS) */
266*4882a593Smuzhiyun 	u64 tx_col;             /* collisions */
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	spinlock_t lock;	/* prevent multiple simultaneous readers */
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /* RSS hstype Definitions */
272*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_IPV4_EN				    0x00000001
273*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_TCP4_EN				    0x00000002
274*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_IPV6_EN				    0x00000004
275*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_TCP6_EN				    0x00000008
276*4882a593Smuzhiyun #define EMAC_RSS_HSTYP_ALL_EN (\
277*4882a593Smuzhiyun 		EMAC_RSS_HSTYP_IPV4_EN   |\
278*4882a593Smuzhiyun 		EMAC_RSS_HSTYP_TCP4_EN   |\
279*4882a593Smuzhiyun 		EMAC_RSS_HSTYP_IPV6_EN   |\
280*4882a593Smuzhiyun 		EMAC_RSS_HSTYP_TCP6_EN)
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun #define EMAC_VLAN_TO_TAG(_vlan, _tag) \
283*4882a593Smuzhiyun 		(_tag =  ((((_vlan) >> 8) & 0xFF) | (((_vlan) & 0xFF) << 8)))
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun #define EMAC_TAG_TO_VLAN(_tag, _vlan) \
286*4882a593Smuzhiyun 		(_vlan = ((((_tag) >> 8) & 0xFF) | (((_tag) & 0xFF) << 8)))
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun #define EMAC_DEF_RX_BUF_SIZE					  1536
289*4882a593Smuzhiyun #define EMAC_MAX_JUMBO_PKT_SIZE				    (9 * 1024)
290*4882a593Smuzhiyun #define EMAC_MAX_TX_OFFLOAD_THRESH			    (9 * 1024)
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun #define EMAC_MAX_ETH_FRAME_SIZE		       EMAC_MAX_JUMBO_PKT_SIZE
293*4882a593Smuzhiyun #define EMAC_MIN_ETH_FRAME_SIZE					    68
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun #define EMAC_DEF_TX_QUEUES					     1
296*4882a593Smuzhiyun #define EMAC_DEF_RX_QUEUES					     1
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun #define EMAC_MIN_TX_DESCS					   128
299*4882a593Smuzhiyun #define EMAC_MIN_RX_DESCS					   128
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun #define EMAC_MAX_TX_DESCS					 16383
302*4882a593Smuzhiyun #define EMAC_MAX_RX_DESCS					  2047
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun #define EMAC_DEF_TX_DESCS					   512
305*4882a593Smuzhiyun #define EMAC_DEF_RX_DESCS					   256
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun #define EMAC_DEF_RX_IRQ_MOD					   250
308*4882a593Smuzhiyun #define EMAC_DEF_TX_IRQ_MOD					   250
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun #define EMAC_WATCHDOG_TIME				      (5 * HZ)
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun /* by default check link every 4 seconds */
313*4882a593Smuzhiyun #define EMAC_TRY_LINK_TIMEOUT				      (4 * HZ)
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun /* emac_irq per-device (per-adapter) irq properties.
316*4882a593Smuzhiyun  * @irq:	irq number.
317*4882a593Smuzhiyun  * @mask	mask to use over status register.
318*4882a593Smuzhiyun  */
319*4882a593Smuzhiyun struct emac_irq {
320*4882a593Smuzhiyun 	unsigned int	irq;
321*4882a593Smuzhiyun 	u32		mask;
322*4882a593Smuzhiyun };
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun /* The device's main data structure */
325*4882a593Smuzhiyun struct emac_adapter {
326*4882a593Smuzhiyun 	struct net_device		*netdev;
327*4882a593Smuzhiyun 	struct mii_bus			*mii_bus;
328*4882a593Smuzhiyun 	struct phy_device		*phydev;
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 	void __iomem			*base;
331*4882a593Smuzhiyun 	void __iomem			*csr;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	struct emac_sgmii		phy;
334*4882a593Smuzhiyun 	struct emac_stats		stats;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	struct emac_irq			irq;
337*4882a593Smuzhiyun 	struct clk			*clk[EMAC_CLK_CNT];
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	/* All Descriptor memory */
340*4882a593Smuzhiyun 	struct emac_ring_header		ring_header;
341*4882a593Smuzhiyun 	struct emac_tx_queue		tx_q;
342*4882a593Smuzhiyun 	struct emac_rx_queue		rx_q;
343*4882a593Smuzhiyun 	unsigned int			tx_desc_cnt;
344*4882a593Smuzhiyun 	unsigned int			rx_desc_cnt;
345*4882a593Smuzhiyun 	unsigned int			rrd_size; /* in quad words */
346*4882a593Smuzhiyun 	unsigned int			rfd_size; /* in quad words */
347*4882a593Smuzhiyun 	unsigned int			tpd_size; /* in quad words */
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	unsigned int			rxbuf_size;
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	/* Flow control / pause frames support. If automatic=True, do whatever
352*4882a593Smuzhiyun 	 * the PHY does. Otherwise, use tx_flow_control and rx_flow_control.
353*4882a593Smuzhiyun 	 */
354*4882a593Smuzhiyun 	bool				automatic;
355*4882a593Smuzhiyun 	bool				tx_flow_control;
356*4882a593Smuzhiyun 	bool				rx_flow_control;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	/* True == use single-pause-frame mode. */
359*4882a593Smuzhiyun 	bool				single_pause_mode;
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	/* Ring parameter */
362*4882a593Smuzhiyun 	u8				tpd_burst;
363*4882a593Smuzhiyun 	u8				rfd_burst;
364*4882a593Smuzhiyun 	unsigned int			dmaw_dly_cnt;
365*4882a593Smuzhiyun 	unsigned int			dmar_dly_cnt;
366*4882a593Smuzhiyun 	enum emac_dma_req_block		dmar_block;
367*4882a593Smuzhiyun 	enum emac_dma_req_block		dmaw_block;
368*4882a593Smuzhiyun 	enum emac_dma_order		dma_order;
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	u32				irq_mod;
371*4882a593Smuzhiyun 	u32				preamble;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	struct work_struct		work_thread;
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	u16				msg_enable;
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun 	struct mutex			reset_lock;
378*4882a593Smuzhiyun };
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun int emac_reinit_locked(struct emac_adapter *adpt);
381*4882a593Smuzhiyun void emac_reg_update32(void __iomem *addr, u32 mask, u32 val);
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun void emac_set_ethtool_ops(struct net_device *netdev);
384*4882a593Smuzhiyun void emac_update_hw_stats(struct emac_adapter *adpt);
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun #endif /* _EMAC_H_ */
387