xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/xilinx/ll_temac.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun #ifndef XILINX_LL_TEMAC_H
4*4882a593Smuzhiyun #define XILINX_LL_TEMAC_H
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <linux/netdevice.h>
7*4882a593Smuzhiyun #include <linux/of.h>
8*4882a593Smuzhiyun #include <linux/spinlock.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifdef CONFIG_PPC_DCR
11*4882a593Smuzhiyun #include <asm/dcr.h>
12*4882a593Smuzhiyun #include <asm/dcr-regs.h>
13*4882a593Smuzhiyun #endif
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /* packet size info */
16*4882a593Smuzhiyun #define XTE_HDR_SIZE			14      /* size of Ethernet header */
17*4882a593Smuzhiyun #define XTE_TRL_SIZE			4       /* size of Ethernet trailer (FCS) */
18*4882a593Smuzhiyun #define XTE_JUMBO_MTU			9000
19*4882a593Smuzhiyun #define XTE_MAX_JUMBO_FRAME_SIZE	(XTE_JUMBO_MTU + XTE_HDR_SIZE + XTE_TRL_SIZE)
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /*  Configuration options */
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /*  Accept all incoming packets.
24*4882a593Smuzhiyun  *  This option defaults to disabled (cleared) */
25*4882a593Smuzhiyun #define XTE_OPTION_PROMISC                      (1 << 0)
26*4882a593Smuzhiyun /*  Jumbo frame support for Tx & Rx.
27*4882a593Smuzhiyun  *  This option defaults to disabled (cleared) */
28*4882a593Smuzhiyun #define XTE_OPTION_JUMBO                        (1 << 1)
29*4882a593Smuzhiyun /*  VLAN Rx & Tx frame support.
30*4882a593Smuzhiyun  *  This option defaults to disabled (cleared) */
31*4882a593Smuzhiyun #define XTE_OPTION_VLAN                         (1 << 2)
32*4882a593Smuzhiyun /*  Enable recognition of flow control frames on Rx
33*4882a593Smuzhiyun  *  This option defaults to enabled (set) */
34*4882a593Smuzhiyun #define XTE_OPTION_FLOW_CONTROL                 (1 << 4)
35*4882a593Smuzhiyun /*  Strip FCS and PAD from incoming frames.
36*4882a593Smuzhiyun  *  Note: PAD from VLAN frames is not stripped.
37*4882a593Smuzhiyun  *  This option defaults to disabled (set) */
38*4882a593Smuzhiyun #define XTE_OPTION_FCS_STRIP                    (1 << 5)
39*4882a593Smuzhiyun /*  Generate FCS field and add PAD automatically for outgoing frames.
40*4882a593Smuzhiyun  *  This option defaults to enabled (set) */
41*4882a593Smuzhiyun #define XTE_OPTION_FCS_INSERT                   (1 << 6)
42*4882a593Smuzhiyun /*  Enable Length/Type error checking for incoming frames. When this option is
43*4882a593Smuzhiyun set, the MAC will filter frames that have a mismatched type/length field
44*4882a593Smuzhiyun and if XTE_OPTION_REPORT_RXERR is set, the user is notified when these
45*4882a593Smuzhiyun types of frames are encountered. When this option is cleared, the MAC will
46*4882a593Smuzhiyun allow these types of frames to be received.
47*4882a593Smuzhiyun This option defaults to enabled (set) */
48*4882a593Smuzhiyun #define XTE_OPTION_LENTYPE_ERR                  (1 << 7)
49*4882a593Smuzhiyun /*  Enable the transmitter.
50*4882a593Smuzhiyun  *  This option defaults to enabled (set) */
51*4882a593Smuzhiyun #define XTE_OPTION_TXEN                         (1 << 11)
52*4882a593Smuzhiyun /*  Enable the receiver
53*4882a593Smuzhiyun *   This option defaults to enabled (set) */
54*4882a593Smuzhiyun #define XTE_OPTION_RXEN                         (1 << 12)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /*  Default options set when device is initialized or reset */
57*4882a593Smuzhiyun #define XTE_OPTION_DEFAULTS                     \
58*4882a593Smuzhiyun 	(XTE_OPTION_TXEN |                          \
59*4882a593Smuzhiyun 	 XTE_OPTION_FLOW_CONTROL |                  \
60*4882a593Smuzhiyun 	 XTE_OPTION_RXEN)
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /* XPS_LL_TEMAC SDMA registers definition */
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun #define TX_NXTDESC_PTR      0x00            /* r */
65*4882a593Smuzhiyun #define TX_CURBUF_ADDR      0x01            /* r */
66*4882a593Smuzhiyun #define TX_CURBUF_LENGTH    0x02            /* r */
67*4882a593Smuzhiyun #define TX_CURDESC_PTR      0x03            /* rw */
68*4882a593Smuzhiyun #define TX_TAILDESC_PTR     0x04            /* rw */
69*4882a593Smuzhiyun #define TX_CHNL_CTRL        0x05            /* rw */
70*4882a593Smuzhiyun /*
71*4882a593Smuzhiyun  0:7      24:31       IRQTimeout
72*4882a593Smuzhiyun  8:15     16:23       IRQCount
73*4882a593Smuzhiyun  16:20    11:15       Reserved
74*4882a593Smuzhiyun  21       10          0
75*4882a593Smuzhiyun  22       9           UseIntOnEnd
76*4882a593Smuzhiyun  23       8           LdIRQCnt
77*4882a593Smuzhiyun  24       7           IRQEn
78*4882a593Smuzhiyun  25:28    3:6         Reserved
79*4882a593Smuzhiyun  29       2           IrqErrEn
80*4882a593Smuzhiyun  30       1           IrqDlyEn
81*4882a593Smuzhiyun  31       0           IrqCoalEn
82*4882a593Smuzhiyun */
83*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_IOE       (1 << 9)
84*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_EN        (1 << 7)
85*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_ERR_EN    (1 << 2)
86*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_DLY_EN    (1 << 1)
87*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_COAL_EN   (1 << 0)
88*4882a593Smuzhiyun #define TX_IRQ_REG          0x06            /* rw */
89*4882a593Smuzhiyun /*
90*4882a593Smuzhiyun   0:7      24:31       DltTmrValue
91*4882a593Smuzhiyun  8:15     16:23       ClscCntrValue
92*4882a593Smuzhiyun  16:17    14:15       Reserved
93*4882a593Smuzhiyun  18:21    10:13       ClscCnt
94*4882a593Smuzhiyun  22:23    8:9         DlyCnt
95*4882a593Smuzhiyun  24:28    3::7        Reserved
96*4882a593Smuzhiyun  29       2           ErrIrq
97*4882a593Smuzhiyun  30       1           DlyIrq
98*4882a593Smuzhiyun  31       0           CoalIrq
99*4882a593Smuzhiyun  */
100*4882a593Smuzhiyun #define TX_CHNL_STS         0x07            /* r */
101*4882a593Smuzhiyun /*
102*4882a593Smuzhiyun    0:9      22:31   Reserved
103*4882a593Smuzhiyun  10       21      TailPErr
104*4882a593Smuzhiyun  11       20      CmpErr
105*4882a593Smuzhiyun  12       19      AddrErr
106*4882a593Smuzhiyun  13       18      NxtPErr
107*4882a593Smuzhiyun  14       17      CurPErr
108*4882a593Smuzhiyun  15       16      BsyWr
109*4882a593Smuzhiyun  16:23    8:15    Reserved
110*4882a593Smuzhiyun  24       7       Error
111*4882a593Smuzhiyun  25       6       IOE
112*4882a593Smuzhiyun  26       5       SOE
113*4882a593Smuzhiyun  27       4       Cmplt
114*4882a593Smuzhiyun  28       3       SOP
115*4882a593Smuzhiyun  29       2       EOP
116*4882a593Smuzhiyun  30       1       EngBusy
117*4882a593Smuzhiyun  31       0       Reserved
118*4882a593Smuzhiyun */
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #define RX_NXTDESC_PTR      0x08            /* r */
121*4882a593Smuzhiyun #define RX_CURBUF_ADDR      0x09            /* r */
122*4882a593Smuzhiyun #define RX_CURBUF_LENGTH    0x0a            /* r */
123*4882a593Smuzhiyun #define RX_CURDESC_PTR      0x0b            /* rw */
124*4882a593Smuzhiyun #define RX_TAILDESC_PTR     0x0c            /* rw */
125*4882a593Smuzhiyun #define RX_CHNL_CTRL        0x0d            /* rw */
126*4882a593Smuzhiyun /*
127*4882a593Smuzhiyun  0:7      24:31       IRQTimeout
128*4882a593Smuzhiyun  8:15     16:23       IRQCount
129*4882a593Smuzhiyun  16:20    11:15       Reserved
130*4882a593Smuzhiyun  21       10          0
131*4882a593Smuzhiyun  22       9           UseIntOnEnd
132*4882a593Smuzhiyun  23       8           LdIRQCnt
133*4882a593Smuzhiyun  24       7           IRQEn
134*4882a593Smuzhiyun  25:28    3:6         Reserved
135*4882a593Smuzhiyun  29       2           IrqErrEn
136*4882a593Smuzhiyun  30       1           IrqDlyEn
137*4882a593Smuzhiyun  31       0           IrqCoalEn
138*4882a593Smuzhiyun  */
139*4882a593Smuzhiyun #define RX_IRQ_REG          0x0e            /* rw */
140*4882a593Smuzhiyun #define IRQ_COAL        (1 << 0)
141*4882a593Smuzhiyun #define IRQ_DLY         (1 << 1)
142*4882a593Smuzhiyun #define IRQ_ERR         (1 << 2)
143*4882a593Smuzhiyun #define IRQ_DMAERR      (1 << 7)            /* this is not documented ??? */
144*4882a593Smuzhiyun /*
145*4882a593Smuzhiyun  0:7      24:31       DltTmrValue
146*4882a593Smuzhiyun  8:15     16:23       ClscCntrValue
147*4882a593Smuzhiyun  16:17    14:15       Reserved
148*4882a593Smuzhiyun  18:21    10:13       ClscCnt
149*4882a593Smuzhiyun  22:23    8:9         DlyCnt
150*4882a593Smuzhiyun  24:28    3::7        Reserved
151*4882a593Smuzhiyun */
152*4882a593Smuzhiyun #define RX_CHNL_STS         0x0f        /* r */
153*4882a593Smuzhiyun #define CHNL_STS_ENGBUSY    (1 << 1)
154*4882a593Smuzhiyun #define CHNL_STS_EOP        (1 << 2)
155*4882a593Smuzhiyun #define CHNL_STS_SOP        (1 << 3)
156*4882a593Smuzhiyun #define CHNL_STS_CMPLT      (1 << 4)
157*4882a593Smuzhiyun #define CHNL_STS_SOE        (1 << 5)
158*4882a593Smuzhiyun #define CHNL_STS_IOE        (1 << 6)
159*4882a593Smuzhiyun #define CHNL_STS_ERR        (1 << 7)
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #define CHNL_STS_BSYWR      (1 << 16)
162*4882a593Smuzhiyun #define CHNL_STS_CURPERR    (1 << 17)
163*4882a593Smuzhiyun #define CHNL_STS_NXTPERR    (1 << 18)
164*4882a593Smuzhiyun #define CHNL_STS_ADDRERR    (1 << 19)
165*4882a593Smuzhiyun #define CHNL_STS_CMPERR     (1 << 20)
166*4882a593Smuzhiyun #define CHNL_STS_TAILERR    (1 << 21)
167*4882a593Smuzhiyun /*
168*4882a593Smuzhiyun  0:9      22:31   Reserved
169*4882a593Smuzhiyun  10       21      TailPErr
170*4882a593Smuzhiyun  11       20      CmpErr
171*4882a593Smuzhiyun  12       19      AddrErr
172*4882a593Smuzhiyun  13       18      NxtPErr
173*4882a593Smuzhiyun  14       17      CurPErr
174*4882a593Smuzhiyun  15       16      BsyWr
175*4882a593Smuzhiyun  16:23    8:15    Reserved
176*4882a593Smuzhiyun  24       7       Error
177*4882a593Smuzhiyun  25       6       IOE
178*4882a593Smuzhiyun  26       5       SOE
179*4882a593Smuzhiyun  27       4       Cmplt
180*4882a593Smuzhiyun  28       3       SOP
181*4882a593Smuzhiyun  29       2       EOP
182*4882a593Smuzhiyun  30       1       EngBusy
183*4882a593Smuzhiyun  31       0       Reserved
184*4882a593Smuzhiyun */
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun #define DMA_CONTROL_REG             0x10            /* rw */
187*4882a593Smuzhiyun #define DMA_CONTROL_RST                 (1 << 0)
188*4882a593Smuzhiyun #define DMA_TAIL_ENABLE                 (1 << 2)
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun /* XPS_LL_TEMAC direct registers definition */
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun #define XTE_RAF0_OFFSET              0x00
193*4882a593Smuzhiyun #define RAF0_RST                        (1 << 0)
194*4882a593Smuzhiyun #define RAF0_MCSTREJ                    (1 << 1)
195*4882a593Smuzhiyun #define RAF0_BCSTREJ                    (1 << 2)
196*4882a593Smuzhiyun #define XTE_TPF0_OFFSET              0x04
197*4882a593Smuzhiyun #define XTE_IFGP0_OFFSET             0x08
198*4882a593Smuzhiyun #define XTE_ISR0_OFFSET              0x0c
199*4882a593Smuzhiyun #define ISR0_HARDACSCMPLT               (1 << 0)
200*4882a593Smuzhiyun #define ISR0_AUTONEG                    (1 << 1)
201*4882a593Smuzhiyun #define ISR0_RXCMPLT                    (1 << 2)
202*4882a593Smuzhiyun #define ISR0_RXREJ                      (1 << 3)
203*4882a593Smuzhiyun #define ISR0_RXFIFOOVR                  (1 << 4)
204*4882a593Smuzhiyun #define ISR0_TXCMPLT                    (1 << 5)
205*4882a593Smuzhiyun #define ISR0_RXDCMLCK                   (1 << 6)
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun #define XTE_IPR0_OFFSET              0x10
208*4882a593Smuzhiyun #define XTE_IER0_OFFSET              0x14
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun #define XTE_MSW0_OFFSET              0x20
211*4882a593Smuzhiyun #define XTE_LSW0_OFFSET              0x24
212*4882a593Smuzhiyun #define XTE_CTL0_OFFSET              0x28
213*4882a593Smuzhiyun #define XTE_RDY0_OFFSET              0x2c
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun #define XTE_RSE_MIIM_RR_MASK      0x0002
216*4882a593Smuzhiyun #define XTE_RSE_MIIM_WR_MASK      0x0004
217*4882a593Smuzhiyun #define XTE_RSE_CFG_RR_MASK       0x0020
218*4882a593Smuzhiyun #define XTE_RSE_CFG_WR_MASK       0x0040
219*4882a593Smuzhiyun #define XTE_RDY0_HARD_ACS_RDY_MASK  (0x10000)
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun /* XPS_LL_TEMAC indirect registers offset definition */
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun #define	XTE_RXC0_OFFSET			0x00000200 /* Rx configuration word 0 */
224*4882a593Smuzhiyun #define	XTE_RXC1_OFFSET			0x00000240 /* Rx configuration word 1 */
225*4882a593Smuzhiyun #define XTE_RXC1_RXRST_MASK		(1 << 31)  /* Receiver reset */
226*4882a593Smuzhiyun #define XTE_RXC1_RXJMBO_MASK		(1 << 30)  /* Jumbo frame enable */
227*4882a593Smuzhiyun #define XTE_RXC1_RXFCS_MASK		(1 << 29)  /* FCS not stripped */
228*4882a593Smuzhiyun #define XTE_RXC1_RXEN_MASK		(1 << 28)  /* Receiver enable */
229*4882a593Smuzhiyun #define XTE_RXC1_RXVLAN_MASK		(1 << 27)  /* VLAN enable */
230*4882a593Smuzhiyun #define XTE_RXC1_RXHD_MASK		(1 << 26)  /* Half duplex */
231*4882a593Smuzhiyun #define XTE_RXC1_RXLT_MASK		(1 << 25)  /* Length/type check disable */
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun #define XTE_TXC_OFFSET			0x00000280 /*  Tx configuration */
234*4882a593Smuzhiyun #define XTE_TXC_TXRST_MASK		(1 << 31)  /* Transmitter reset */
235*4882a593Smuzhiyun #define XTE_TXC_TXJMBO_MASK		(1 << 30)  /* Jumbo frame enable */
236*4882a593Smuzhiyun #define XTE_TXC_TXFCS_MASK		(1 << 29)  /* Generate FCS */
237*4882a593Smuzhiyun #define XTE_TXC_TXEN_MASK		(1 << 28)  /* Transmitter enable */
238*4882a593Smuzhiyun #define XTE_TXC_TXVLAN_MASK		(1 << 27)  /* VLAN enable */
239*4882a593Smuzhiyun #define XTE_TXC_TXHD_MASK		(1 << 26)  /* Half duplex */
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun #define XTE_FCC_OFFSET			0x000002C0 /* Flow control config */
242*4882a593Smuzhiyun #define XTE_FCC_RXFLO_MASK		(1 << 29)  /* Rx flow control enable */
243*4882a593Smuzhiyun #define XTE_FCC_TXFLO_MASK		(1 << 30)  /* Tx flow control enable */
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun #define XTE_EMCFG_OFFSET		0x00000300 /* EMAC configuration */
246*4882a593Smuzhiyun #define XTE_EMCFG_LINKSPD_MASK		0xC0000000 /* Link speed */
247*4882a593Smuzhiyun #define XTE_EMCFG_HOSTEN_MASK		(1 << 26)  /* Host interface enable */
248*4882a593Smuzhiyun #define XTE_EMCFG_LINKSPD_10		0x00000000 /* 10 Mbit LINKSPD_MASK */
249*4882a593Smuzhiyun #define XTE_EMCFG_LINKSPD_100		(1 << 30)  /* 100 Mbit LINKSPD_MASK */
250*4882a593Smuzhiyun #define XTE_EMCFG_LINKSPD_1000		(1 << 31)  /* 1000 Mbit LINKSPD_MASK */
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun #define XTE_GMIC_OFFSET			0x00000320 /* RGMII/SGMII config */
253*4882a593Smuzhiyun #define XTE_MC_OFFSET			0x00000340 /* MDIO configuration */
254*4882a593Smuzhiyun #define XTE_UAW0_OFFSET			0x00000380 /* Unicast address word 0 */
255*4882a593Smuzhiyun #define XTE_UAW1_OFFSET			0x00000384 /* Unicast address word 1 */
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun #define XTE_MAW0_OFFSET			0x00000388 /* Multicast addr word 0 */
258*4882a593Smuzhiyun #define XTE_MAW1_OFFSET			0x0000038C /* Multicast addr word 1 */
259*4882a593Smuzhiyun #define XTE_AFM_OFFSET			0x00000390 /* Promiscuous mode */
260*4882a593Smuzhiyun #define XTE_AFM_EPPRM_MASK		(1 << 31)  /* Promiscuous mode enable */
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun /* Interrupt Request status */
263*4882a593Smuzhiyun #define XTE_TIS_OFFSET			0x000003A0
264*4882a593Smuzhiyun #define TIS_FRIS			(1 << 0)
265*4882a593Smuzhiyun #define TIS_MRIS			(1 << 1)
266*4882a593Smuzhiyun #define TIS_MWIS			(1 << 2)
267*4882a593Smuzhiyun #define TIS_ARIS			(1 << 3)
268*4882a593Smuzhiyun #define TIS_AWIS			(1 << 4)
269*4882a593Smuzhiyun #define TIS_CRIS			(1 << 5)
270*4882a593Smuzhiyun #define TIS_CWIS			(1 << 6)
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun #define XTE_TIE_OFFSET			0x000003A4 /* Interrupt enable */
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun /**  MII Mamagement Control register (MGTCR) */
275*4882a593Smuzhiyun #define XTE_MGTDR_OFFSET		0x000003B0 /* MII data */
276*4882a593Smuzhiyun #define XTE_MIIMAI_OFFSET		0x000003B4 /* MII control */
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun #define CNTLREG_WRITE_ENABLE_MASK   0x8000
279*4882a593Smuzhiyun #define CNTLREG_EMAC1SEL_MASK       0x0400
280*4882a593Smuzhiyun #define CNTLREG_ADDRESSCODE_MASK    0x03ff
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun /* CDMAC descriptor status bit definitions */
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun #define STS_CTRL_APP0_ERR         (1 << 31)
285*4882a593Smuzhiyun #define STS_CTRL_APP0_IRQONEND    (1 << 30)
286*4882a593Smuzhiyun /* undoccumented */
287*4882a593Smuzhiyun #define STS_CTRL_APP0_STOPONEND   (1 << 29)
288*4882a593Smuzhiyun #define STS_CTRL_APP0_CMPLT       (1 << 28)
289*4882a593Smuzhiyun #define STS_CTRL_APP0_SOP         (1 << 27)
290*4882a593Smuzhiyun #define STS_CTRL_APP0_EOP         (1 << 26)
291*4882a593Smuzhiyun #define STS_CTRL_APP0_ENGBUSY     (1 << 25)
292*4882a593Smuzhiyun /* undocumented */
293*4882a593Smuzhiyun #define STS_CTRL_APP0_ENGRST      (1 << 24)
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun #define TX_CONTROL_CALC_CSUM_MASK   1
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun #define MULTICAST_CAM_TABLE_NUM 4
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun /* TEMAC Synthesis features */
300*4882a593Smuzhiyun #define TEMAC_FEATURE_RX_CSUM  (1 << 0)
301*4882a593Smuzhiyun #define TEMAC_FEATURE_TX_CSUM  (1 << 1)
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun /* TX/RX CURDESC_PTR points to first descriptor */
304*4882a593Smuzhiyun /* TX/RX TAILDESC_PTR points to last descriptor in linked list */
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /**
307*4882a593Smuzhiyun  * struct cdmac_bd - LocalLink buffer descriptor format
308*4882a593Smuzhiyun  *
309*4882a593Smuzhiyun  * app0 bits:
310*4882a593Smuzhiyun  *	0    Error
311*4882a593Smuzhiyun  *	1    IrqOnEnd    generate an interrupt at completion of DMA  op
312*4882a593Smuzhiyun  *	2    reserved
313*4882a593Smuzhiyun  *	3    completed   Current descriptor completed
314*4882a593Smuzhiyun  *	4    SOP         TX - marks first desc/ RX marks first desct
315*4882a593Smuzhiyun  *	5    EOP         TX marks last desc/RX marks last desc
316*4882a593Smuzhiyun  *	6    EngBusy     DMA is processing
317*4882a593Smuzhiyun  *	7    reserved
318*4882a593Smuzhiyun  *	8:31 application specific
319*4882a593Smuzhiyun  */
320*4882a593Smuzhiyun struct cdmac_bd {
321*4882a593Smuzhiyun 	u32 next;	/* Physical address of next buffer descriptor */
322*4882a593Smuzhiyun 	u32 phys;
323*4882a593Smuzhiyun 	u32 len;
324*4882a593Smuzhiyun 	u32 app0;
325*4882a593Smuzhiyun 	u32 app1;	/* TX start << 16 | insert */
326*4882a593Smuzhiyun 	u32 app2;	/* TX csum */
327*4882a593Smuzhiyun 	u32 app3;
328*4882a593Smuzhiyun 	u32 app4;	/* skb for TX length for RX */
329*4882a593Smuzhiyun };
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun struct temac_local {
332*4882a593Smuzhiyun 	struct net_device *ndev;
333*4882a593Smuzhiyun 	struct device *dev;
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	/* Connection to PHY device */
336*4882a593Smuzhiyun 	struct device_node *phy_node;
337*4882a593Smuzhiyun 	/* For non-device-tree devices */
338*4882a593Smuzhiyun 	char phy_name[MII_BUS_ID_SIZE + 3];
339*4882a593Smuzhiyun 	phy_interface_t phy_interface;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	/* MDIO bus data */
342*4882a593Smuzhiyun 	struct mii_bus *mii_bus;	/* MII bus reference */
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 	/* IO registers, dma functions and IRQs */
345*4882a593Smuzhiyun 	void __iomem *regs;
346*4882a593Smuzhiyun 	void __iomem *sdma_regs;
347*4882a593Smuzhiyun #ifdef CONFIG_PPC_DCR
348*4882a593Smuzhiyun 	dcr_host_t sdma_dcrs;
349*4882a593Smuzhiyun #endif
350*4882a593Smuzhiyun 	u32 (*temac_ior)(struct temac_local *lp, int offset);
351*4882a593Smuzhiyun 	void (*temac_iow)(struct temac_local *lp, int offset, u32 value);
352*4882a593Smuzhiyun 	u32 (*dma_in)(struct temac_local *lp, int reg);
353*4882a593Smuzhiyun 	void (*dma_out)(struct temac_local *lp, int reg, u32 value);
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	int tx_irq;
356*4882a593Smuzhiyun 	int rx_irq;
357*4882a593Smuzhiyun 	int emac_num;
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 	struct sk_buff **rx_skb;
360*4882a593Smuzhiyun 	spinlock_t rx_lock;
361*4882a593Smuzhiyun 	/* For synchronization of indirect register access.  Must be
362*4882a593Smuzhiyun 	 * shared mutex between interfaces in same TEMAC block.
363*4882a593Smuzhiyun 	 */
364*4882a593Smuzhiyun 	spinlock_t *indirect_lock;
365*4882a593Smuzhiyun 	u32 options;			/* Current options word */
366*4882a593Smuzhiyun 	int last_link;
367*4882a593Smuzhiyun 	unsigned int temac_features;
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	/* Buffer descriptors */
370*4882a593Smuzhiyun 	struct cdmac_bd *tx_bd_v;
371*4882a593Smuzhiyun 	dma_addr_t tx_bd_p;
372*4882a593Smuzhiyun 	u32 tx_bd_num;
373*4882a593Smuzhiyun 	struct cdmac_bd *rx_bd_v;
374*4882a593Smuzhiyun 	dma_addr_t rx_bd_p;
375*4882a593Smuzhiyun 	u32 rx_bd_num;
376*4882a593Smuzhiyun 	int tx_bd_ci;
377*4882a593Smuzhiyun 	int tx_bd_tail;
378*4882a593Smuzhiyun 	int rx_bd_ci;
379*4882a593Smuzhiyun 	int rx_bd_tail;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	/* DMA channel control setup */
382*4882a593Smuzhiyun 	u8 coalesce_count_tx;
383*4882a593Smuzhiyun 	u8 coalesce_delay_tx;
384*4882a593Smuzhiyun 	u8 coalesce_count_rx;
385*4882a593Smuzhiyun 	u8 coalesce_delay_rx;
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 	struct delayed_work restart_work;
388*4882a593Smuzhiyun };
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun /* Wrappers for temac_ior()/temac_iow() function pointers above */
391*4882a593Smuzhiyun #define temac_ior(lp, o) ((lp)->temac_ior(lp, o))
392*4882a593Smuzhiyun #define temac_iow(lp, o, v) ((lp)->temac_iow(lp, o, v))
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun /* xilinx_temac.c */
395*4882a593Smuzhiyun int temac_indirect_busywait(struct temac_local *lp);
396*4882a593Smuzhiyun u32 temac_indirect_in32(struct temac_local *lp, int reg);
397*4882a593Smuzhiyun u32 temac_indirect_in32_locked(struct temac_local *lp, int reg);
398*4882a593Smuzhiyun void temac_indirect_out32(struct temac_local *lp, int reg, u32 value);
399*4882a593Smuzhiyun void temac_indirect_out32_locked(struct temac_local *lp, int reg, u32 value);
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun /* xilinx_temac_mdio.c */
402*4882a593Smuzhiyun int temac_mdio_setup(struct temac_local *lp, struct platform_device *pdev);
403*4882a593Smuzhiyun void temac_mdio_teardown(struct temac_local *lp);
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun #endif /* XILINX_LL_TEMAC_H */
406