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