xref: /rk3399_rockchip-uboot/drivers/net/ne2000_base.h (revision 702c85b0e876d587c11acdbb55738ee52acd54f4)
1e710185aSgoda.yusuke /*
2e710185aSgoda.yusuke Ported to U-Boot by Christian Pellegrin <chri@ascensit.com>
3e710185aSgoda.yusuke 
4e710185aSgoda.yusuke Based on sources from the Linux kernel (pcnet_cs.c, 8390.h) and
5e710185aSgoda.yusuke eCOS(if_dp83902a.c, if_dp83902a.h). Both of these 2 wonderful world
6e710185aSgoda.yusuke are GPL, so this is, of course, GPL.
7e710185aSgoda.yusuke 
8e710185aSgoda.yusuke 
9e710185aSgoda.yusuke ==========================================================================
10e710185aSgoda.yusuke 
11e710185aSgoda.yusuke 	dev/dp83902a.h
12e710185aSgoda.yusuke 
13e710185aSgoda.yusuke 	National Semiconductor DP83902a ethernet chip
14e710185aSgoda.yusuke 
15e710185aSgoda.yusuke ==========================================================================
16e710185aSgoda.yusuke ####ECOSGPLCOPYRIGHTBEGIN####
17e710185aSgoda.yusuke  -------------------------------------------
18e710185aSgoda.yusuke  This file is part of eCos, the Embedded Configurable Operating System.
19e710185aSgoda.yusuke  Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
20e710185aSgoda.yusuke 
21e710185aSgoda.yusuke  eCos is free software; you can redistribute it and/or modify it under
22e710185aSgoda.yusuke  the terms of the GNU General Public License as published by the Free
23e710185aSgoda.yusuke  Software Foundation; either version 2 or (at your option) any later version.
24e710185aSgoda.yusuke 
25e710185aSgoda.yusuke  eCos is distributed in the hope that it will be useful, but WITHOUT ANY
26e710185aSgoda.yusuke  WARRANTY; without even the implied warranty of MERCHANTABILITY or
27e710185aSgoda.yusuke  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
28e710185aSgoda.yusuke  for more details.
29e710185aSgoda.yusuke 
30e710185aSgoda.yusuke  You should have received a copy of the GNU General Public License along
31e710185aSgoda.yusuke  with eCos; if not, write to the Free Software Foundation, Inc.,
32e710185aSgoda.yusuke  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
33e710185aSgoda.yusuke 
34e710185aSgoda.yusuke  As a special exception, if other files instantiate templates or use macros
35e710185aSgoda.yusuke  or inline functions from this file, or you compile this file and link it
36e710185aSgoda.yusuke  with other works to produce a work based on this file, this file does not
37e710185aSgoda.yusuke  by itself cause the resulting work to be covered by the GNU General Public
38e710185aSgoda.yusuke  License. However the source code for this file must still be made available
39e710185aSgoda.yusuke  in accordance with section (3) of the GNU General Public License.
40e710185aSgoda.yusuke 
41e710185aSgoda.yusuke  This exception does not invalidate any other reasons why a work based on
42e710185aSgoda.yusuke  this file might be covered by the GNU General Public License.
43e710185aSgoda.yusuke 
44e710185aSgoda.yusuke  Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
45e710185aSgoda.yusuke  at http://sources.redhat.com/ecos/ecos-license/
46e710185aSgoda.yusuke  -------------------------------------------
47e710185aSgoda.yusuke ####ECOSGPLCOPYRIGHTEND####
48e710185aSgoda.yusuke ####BSDCOPYRIGHTBEGIN####
49e710185aSgoda.yusuke 
50e710185aSgoda.yusuke  -------------------------------------------
51e710185aSgoda.yusuke 
52e710185aSgoda.yusuke  Portions of this software may have been derived from OpenBSD or other sources,
53e710185aSgoda.yusuke  and are covered by the appropriate copyright disclaimers included herein.
54e710185aSgoda.yusuke 
55e710185aSgoda.yusuke  -------------------------------------------
56e710185aSgoda.yusuke 
57e710185aSgoda.yusuke ####BSDCOPYRIGHTEND####
58e710185aSgoda.yusuke ==========================================================================
59e710185aSgoda.yusuke #####DESCRIPTIONBEGIN####
60e710185aSgoda.yusuke 
61e710185aSgoda.yusuke  Author(s):	gthomas
62e710185aSgoda.yusuke  Contributors:	gthomas, jskov
63e710185aSgoda.yusuke  Date:		2001-06-13
64e710185aSgoda.yusuke  Purpose:
65e710185aSgoda.yusuke  Description:
66e710185aSgoda.yusuke 
67e710185aSgoda.yusuke ####DESCRIPTIONEND####
68e710185aSgoda.yusuke 
69e710185aSgoda.yusuke ==========================================================================
70e710185aSgoda.yusuke 
71e710185aSgoda.yusuke */
72e710185aSgoda.yusuke 
73e710185aSgoda.yusuke /*
74e710185aSgoda.yusuke  ------------------------------------------------------------------------
75e710185aSgoda.yusuke  Macros for accessing DP registers
76e710185aSgoda.yusuke  These can be overridden by the platform header
77e710185aSgoda.yusuke */
78e710185aSgoda.yusuke 
794acbc6c7SJean-Christophe PLAGNIOL-VILLARD #ifndef __NE2000_BASE_H__
804acbc6c7SJean-Christophe PLAGNIOL-VILLARD #define __NE2000_BASE_H__
814acbc6c7SJean-Christophe PLAGNIOL-VILLARD 
82e710185aSgoda.yusuke #define bool int
83e710185aSgoda.yusuke #define false 0
84e710185aSgoda.yusuke #define true 1
85e710185aSgoda.yusuke 
86*702c85b0SNobuhiro Iwamatsu /*
87*702c85b0SNobuhiro Iwamatsu  * Debugging details
88*702c85b0SNobuhiro Iwamatsu  *
89*702c85b0SNobuhiro Iwamatsu  * Set to perms of:
90*702c85b0SNobuhiro Iwamatsu  * 0 disables all debug output
91*702c85b0SNobuhiro Iwamatsu  * 1 for process debug output
92*702c85b0SNobuhiro Iwamatsu  * 2 for added data IO output: get_reg, put_reg
93*702c85b0SNobuhiro Iwamatsu  * 4 for packet allocation/free output
94*702c85b0SNobuhiro Iwamatsu  * 8 for only startup status, so we can tell we're installed OK
95*702c85b0SNobuhiro Iwamatsu  */
96*702c85b0SNobuhiro Iwamatsu #if 0
97*702c85b0SNobuhiro Iwamatsu #define DEBUG 0xf
98*702c85b0SNobuhiro Iwamatsu #else
99*702c85b0SNobuhiro Iwamatsu #define DEBUG 0
100*702c85b0SNobuhiro Iwamatsu #endif
101*702c85b0SNobuhiro Iwamatsu 
102*702c85b0SNobuhiro Iwamatsu #if DEBUG & 1
103*702c85b0SNobuhiro Iwamatsu #define DEBUG_FUNCTION() do { printf("%s\n", __FUNCTION__); } while (0)
104*702c85b0SNobuhiro Iwamatsu #define DEBUG_LINE() do { printf("%d\n", __LINE__); } while (0)
105*702c85b0SNobuhiro Iwamatsu #define PRINTK(args...) printf(args)
106*702c85b0SNobuhiro Iwamatsu #else
107*702c85b0SNobuhiro Iwamatsu #define DEBUG_FUNCTION() do {} while(0)
108*702c85b0SNobuhiro Iwamatsu #define DEBUG_LINE() do {} while(0)
109*702c85b0SNobuhiro Iwamatsu #define PRINTK(args...)
110*702c85b0SNobuhiro Iwamatsu #endif
111*702c85b0SNobuhiro Iwamatsu 
112e710185aSgoda.yusuke /* timeout for tx/rx in s */
113e710185aSgoda.yusuke #define TOUT 5
114e710185aSgoda.yusuke /* Ether MAC address size */
115e710185aSgoda.yusuke #define ETHER_ADDR_LEN 6
116e710185aSgoda.yusuke 
117e710185aSgoda.yusuke 
118e710185aSgoda.yusuke #define CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA 1
119e710185aSgoda.yusuke #define CYGACC_CALL_IF_DELAY_US(X) udelay(X)
120e710185aSgoda.yusuke 
121e710185aSgoda.yusuke /* H/W infomation struct */
122e710185aSgoda.yusuke typedef struct hw_info_t {
123e710185aSgoda.yusuke 	u32 offset;
124e710185aSgoda.yusuke 	u8 a0, a1, a2;
125e710185aSgoda.yusuke 	u32 flags;
126e710185aSgoda.yusuke } hw_info_t;
127e710185aSgoda.yusuke 
128e710185aSgoda.yusuke typedef struct dp83902a_priv_data {
129e710185aSgoda.yusuke 	u8* base;
130e710185aSgoda.yusuke 	u8* data;
131e710185aSgoda.yusuke 	u8* reset;
132e710185aSgoda.yusuke 	int tx_next;		/* First free Tx page */
133e710185aSgoda.yusuke 	int tx_int;		/* Expecting interrupt from this buffer */
134e710185aSgoda.yusuke 	int rx_next;		/* First free Rx page */
135e710185aSgoda.yusuke 	int tx1, tx2;		/* Page numbers for Tx buffers */
136e710185aSgoda.yusuke 	u32 tx1_key, tx2_key;	/* Used to ack when packet sent */
137e710185aSgoda.yusuke 	int tx1_len, tx2_len;
138e710185aSgoda.yusuke 	bool tx_started, running, hardwired_esa;
139e710185aSgoda.yusuke 	u8 esa[6];
140e710185aSgoda.yusuke 	void* plf_priv;
141e710185aSgoda.yusuke 
142e710185aSgoda.yusuke 	/* Buffer allocation */
143e710185aSgoda.yusuke 	int tx_buf1, tx_buf2;
144e710185aSgoda.yusuke 	int rx_buf_start, rx_buf_end;
145e710185aSgoda.yusuke } dp83902a_priv_data_t;
146e710185aSgoda.yusuke 
147e710185aSgoda.yusuke /* ------------------------------------------------------------------------ */
148e710185aSgoda.yusuke /* Register offsets */
149e710185aSgoda.yusuke 
150e710185aSgoda.yusuke #define DP_CR		0x00
151e710185aSgoda.yusuke #define DP_CLDA0	0x01
152e710185aSgoda.yusuke #define DP_PSTART	0x01	/* write */
153e710185aSgoda.yusuke #define DP_CLDA1	0x02
154e710185aSgoda.yusuke #define DP_PSTOP	0x02	/* write */
155e710185aSgoda.yusuke #define DP_BNDRY	0x03
156e710185aSgoda.yusuke #define DP_TSR		0x04
157e710185aSgoda.yusuke #define DP_TPSR		0x04	/* write */
158e710185aSgoda.yusuke #define DP_NCR		0x05
159e710185aSgoda.yusuke #define DP_TBCL		0x05	/* write */
160e710185aSgoda.yusuke #define DP_FIFO		0x06
161e710185aSgoda.yusuke #define DP_TBCH		0x06	/* write */
162e710185aSgoda.yusuke #define DP_ISR		0x07
163e710185aSgoda.yusuke #define DP_CRDA0	0x08
164e710185aSgoda.yusuke #define DP_RSAL		0x08	/* write */
165e710185aSgoda.yusuke #define DP_CRDA1	0x09
166e710185aSgoda.yusuke #define DP_RSAH		0x09	/* write */
167e710185aSgoda.yusuke #define DP_RBCL		0x0a	/* write */
168e710185aSgoda.yusuke #define DP_RBCH		0x0b	/* write */
169e710185aSgoda.yusuke #define DP_RSR		0x0c
170e710185aSgoda.yusuke #define DP_RCR		0x0c	/* write */
171e710185aSgoda.yusuke #define DP_FER		0x0d
172e710185aSgoda.yusuke #define DP_TCR		0x0d	/* write */
173e710185aSgoda.yusuke #define DP_CER		0x0e
174e710185aSgoda.yusuke #define DP_DCR		0x0e	/* write */
175e710185aSgoda.yusuke #define DP_MISSED	0x0f
176e710185aSgoda.yusuke #define DP_IMR		0x0f	/* write */
177e710185aSgoda.yusuke #define DP_DATAPORT	0x10	/* "eprom" data port */
178e710185aSgoda.yusuke 
179e710185aSgoda.yusuke #define DP_P1_CR	0x00
180e710185aSgoda.yusuke #define DP_P1_PAR0	0x01
181e710185aSgoda.yusuke #define DP_P1_PAR1	0x02
182e710185aSgoda.yusuke #define DP_P1_PAR2	0x03
183e710185aSgoda.yusuke #define DP_P1_PAR3	0x04
184e710185aSgoda.yusuke #define DP_P1_PAR4	0x05
185e710185aSgoda.yusuke #define DP_P1_PAR5	0x06
186e710185aSgoda.yusuke #define DP_P1_CURP	0x07
187e710185aSgoda.yusuke #define DP_P1_MAR0	0x08
188e710185aSgoda.yusuke #define DP_P1_MAR1	0x09
189e710185aSgoda.yusuke #define DP_P1_MAR2	0x0a
190e710185aSgoda.yusuke #define DP_P1_MAR3	0x0b
191e710185aSgoda.yusuke #define DP_P1_MAR4	0x0c
192e710185aSgoda.yusuke #define DP_P1_MAR5	0x0d
193e710185aSgoda.yusuke #define DP_P1_MAR6	0x0e
194e710185aSgoda.yusuke #define DP_P1_MAR7	0x0f
195e710185aSgoda.yusuke 
196e710185aSgoda.yusuke #define DP_P2_CR	0x00
197e710185aSgoda.yusuke #define DP_P2_PSTART	0x01
198e710185aSgoda.yusuke #define DP_P2_CLDA0	0x01	/* write */
199e710185aSgoda.yusuke #define DP_P2_PSTOP	0x02
200e710185aSgoda.yusuke #define DP_P2_CLDA1	0x02	/* write */
201e710185aSgoda.yusuke #define DP_P2_RNPP	0x03
202e710185aSgoda.yusuke #define DP_P2_TPSR	0x04
203e710185aSgoda.yusuke #define DP_P2_LNPP	0x05
204e710185aSgoda.yusuke #define DP_P2_ACH	0x06
205e710185aSgoda.yusuke #define DP_P2_ACL	0x07
206e710185aSgoda.yusuke #define DP_P2_RCR	0x0c
207e710185aSgoda.yusuke #define DP_P2_TCR	0x0d
208e710185aSgoda.yusuke #define DP_P2_DCR	0x0e
209e710185aSgoda.yusuke #define DP_P2_IMR	0x0f
210e710185aSgoda.yusuke 
211e710185aSgoda.yusuke /* Command register - common to all pages */
212e710185aSgoda.yusuke 
213e710185aSgoda.yusuke #define DP_CR_STOP	0x01	/* Stop: software reset */
214e710185aSgoda.yusuke #define DP_CR_START	0x02	/* Start: initialize device */
215e710185aSgoda.yusuke #define DP_CR_TXPKT	0x04	/* Transmit packet */
216e710185aSgoda.yusuke #define DP_CR_RDMA	0x08	/* Read DMA (recv data from device) */
217e710185aSgoda.yusuke #define DP_CR_WDMA	0x10	/* Write DMA (send data to device) */
218e710185aSgoda.yusuke #define DP_CR_SEND	0x18	/* Send packet */
219e710185aSgoda.yusuke #define DP_CR_NODMA	0x20	/* Remote (or no) DMA */
220e710185aSgoda.yusuke #define DP_CR_PAGE0	0x00	/* Page select */
221e710185aSgoda.yusuke #define DP_CR_PAGE1	0x40
222e710185aSgoda.yusuke #define DP_CR_PAGE2	0x80
223e710185aSgoda.yusuke #define DP_CR_PAGEMSK	0x3F	/* Used to mask out page bits */
224e710185aSgoda.yusuke 
225e710185aSgoda.yusuke /* Data configuration register */
226e710185aSgoda.yusuke 
227e710185aSgoda.yusuke #define DP_DCR_WTS	0x01	/* 1=16 bit word transfers */
228e710185aSgoda.yusuke #define DP_DCR_BOS	0x02	/* 1=Little Endian */
229e710185aSgoda.yusuke #define DP_DCR_LAS	0x04	/* 1=Single 32 bit DMA mode */
230e710185aSgoda.yusuke #define DP_DCR_LS	0x08	/* 1=normal mode, 0=loopback */
231e710185aSgoda.yusuke #define DP_DCR_ARM	0x10	/* 0=no send command (program I/O) */
232e710185aSgoda.yusuke #define DP_DCR_FIFO_1	0x00	/* FIFO threshold */
233e710185aSgoda.yusuke #define DP_DCR_FIFO_2	0x20
234e710185aSgoda.yusuke #define DP_DCR_FIFO_4	0x40
235e710185aSgoda.yusuke #define DP_DCR_FIFO_6	0x60
236e710185aSgoda.yusuke 
237e710185aSgoda.yusuke #define DP_DCR_INIT	(DP_DCR_LS|DP_DCR_FIFO_4)
238e710185aSgoda.yusuke 
239e710185aSgoda.yusuke /* Interrupt status register */
240e710185aSgoda.yusuke 
241e710185aSgoda.yusuke #define DP_ISR_RxP	0x01	/* Packet received */
242e710185aSgoda.yusuke #define DP_ISR_TxP	0x02	/* Packet transmitted */
243e710185aSgoda.yusuke #define DP_ISR_RxE	0x04	/* Receive error */
244e710185aSgoda.yusuke #define DP_ISR_TxE	0x08	/* Transmit error */
245e710185aSgoda.yusuke #define DP_ISR_OFLW	0x10	/* Receive overflow */
246e710185aSgoda.yusuke #define DP_ISR_CNT	0x20	/* Tally counters need emptying */
247e710185aSgoda.yusuke #define DP_ISR_RDC	0x40	/* Remote DMA complete */
248e710185aSgoda.yusuke #define DP_ISR_RESET	0x80	/* Device has reset (shutdown, error) */
249e710185aSgoda.yusuke 
250e710185aSgoda.yusuke /* Interrupt mask register */
251e710185aSgoda.yusuke 
252e710185aSgoda.yusuke #define DP_IMR_RxP	0x01	/* Packet received */
253e710185aSgoda.yusuke #define DP_IMR_TxP	0x02	/* Packet transmitted */
254e710185aSgoda.yusuke #define DP_IMR_RxE	0x04	/* Receive error */
255e710185aSgoda.yusuke #define DP_IMR_TxE	0x08	/* Transmit error */
256e710185aSgoda.yusuke #define DP_IMR_OFLW	0x10	/* Receive overflow */
257e710185aSgoda.yusuke #define DP_IMR_CNT	0x20	/* Tall counters need emptying */
258e710185aSgoda.yusuke #define DP_IMR_RDC	0x40	/* Remote DMA complete */
259e710185aSgoda.yusuke 
260e710185aSgoda.yusuke #define DP_IMR_All	0x3F	/* Everything but remote DMA */
261e710185aSgoda.yusuke 
262e710185aSgoda.yusuke /* Receiver control register */
263e710185aSgoda.yusuke 
264e710185aSgoda.yusuke #define DP_RCR_SEP	0x01	/* Save bad(error) packets */
265e710185aSgoda.yusuke #define DP_RCR_AR	0x02	/* Accept runt packets */
266e710185aSgoda.yusuke #define DP_RCR_AB	0x04	/* Accept broadcast packets */
267e710185aSgoda.yusuke #define DP_RCR_AM	0x08	/* Accept multicast packets */
268e710185aSgoda.yusuke #define DP_RCR_PROM	0x10	/* Promiscuous mode */
269e710185aSgoda.yusuke #define DP_RCR_MON	0x20	/* Monitor mode - 1=accept no packets */
270e710185aSgoda.yusuke 
271e710185aSgoda.yusuke /* Receiver status register */
272e710185aSgoda.yusuke 
273e710185aSgoda.yusuke #define DP_RSR_RxP	0x01	/* Packet received */
274e710185aSgoda.yusuke #define DP_RSR_CRC	0x02	/* CRC error */
275e710185aSgoda.yusuke #define DP_RSR_FRAME	0x04	/* Framing error */
276e710185aSgoda.yusuke #define DP_RSR_FO	0x08	/* FIFO overrun */
277e710185aSgoda.yusuke #define DP_RSR_MISS	0x10	/* Missed packet */
278e710185aSgoda.yusuke #define DP_RSR_PHY	0x20	/* 0=pad match, 1=mad match */
279e710185aSgoda.yusuke #define DP_RSR_DIS	0x40	/* Receiver disabled */
280e710185aSgoda.yusuke #define DP_RSR_DFR	0x80	/* Receiver processing deferred */
281e710185aSgoda.yusuke 
282e710185aSgoda.yusuke /* Transmitter control register */
283e710185aSgoda.yusuke 
284e710185aSgoda.yusuke #define DP_TCR_NOCRC	0x01	/* 1=inhibit CRC */
285e710185aSgoda.yusuke #define DP_TCR_NORMAL	0x00	/* Normal transmitter operation */
286e710185aSgoda.yusuke #define DP_TCR_LOCAL	0x02	/* Internal NIC loopback */
287e710185aSgoda.yusuke #define DP_TCR_INLOOP	0x04	/* Full internal loopback */
288e710185aSgoda.yusuke #define DP_TCR_OUTLOOP	0x08	/* External loopback */
289e710185aSgoda.yusuke #define DP_TCR_ATD	0x10	/* Auto transmit disable */
290e710185aSgoda.yusuke #define DP_TCR_OFFSET	0x20	/* Collision offset adjust */
291e710185aSgoda.yusuke 
292e710185aSgoda.yusuke /* Transmit status register */
293e710185aSgoda.yusuke 
294e710185aSgoda.yusuke #define DP_TSR_TxP	0x01	/* Packet transmitted */
295e710185aSgoda.yusuke #define DP_TSR_COL	0x04	/* Collision (at least one) */
296e710185aSgoda.yusuke #define DP_TSR_ABT	0x08	/* Aborted because of too many collisions */
297e710185aSgoda.yusuke #define DP_TSR_CRS	0x10	/* Lost carrier */
298e710185aSgoda.yusuke #define DP_TSR_FU	0x20	/* FIFO underrun */
299e710185aSgoda.yusuke #define DP_TSR_CDH	0x40	/* Collision Detect Heartbeat */
300e710185aSgoda.yusuke #define DP_TSR_OWC	0x80	/* Collision outside normal window */
301e710185aSgoda.yusuke 
302e710185aSgoda.yusuke #define IEEE_8023_MAX_FRAME	1518	/* Largest possible ethernet frame */
303e710185aSgoda.yusuke #define IEEE_8023_MIN_FRAME	64	/* Smallest possible ethernet frame */
304*702c85b0SNobuhiro Iwamatsu 
305*702c85b0SNobuhiro Iwamatsu /* Functions */
306*702c85b0SNobuhiro Iwamatsu int get_prom(u8* mac_addr, u8* base_addr);
307*702c85b0SNobuhiro Iwamatsu 
3084acbc6c7SJean-Christophe PLAGNIOL-VILLARD #endif /* __NE2000_BASE_H__ */
309