xref: /openbmc/u-boot/drivers/net/ne2000_base.h (revision 18122019972ca639ee3b581257e3a63ff7c8efeb)
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 
82*702c85b0SNobuhiro Iwamatsu /*
83*702c85b0SNobuhiro Iwamatsu  * Debugging details
84*702c85b0SNobuhiro Iwamatsu  *
85*702c85b0SNobuhiro Iwamatsu  * Set to perms of:
86*702c85b0SNobuhiro Iwamatsu  * 0 disables all debug output
87*702c85b0SNobuhiro Iwamatsu  * 1 for process debug output
88*702c85b0SNobuhiro Iwamatsu  * 2 for added data IO output: get_reg, put_reg
89*702c85b0SNobuhiro Iwamatsu  * 4 for packet allocation/free output
90*702c85b0SNobuhiro Iwamatsu  * 8 for only startup status, so we can tell we're installed OK
91*702c85b0SNobuhiro Iwamatsu  */
92*702c85b0SNobuhiro Iwamatsu #if 0
93*702c85b0SNobuhiro Iwamatsu #define DEBUG 0xf
94*702c85b0SNobuhiro Iwamatsu #else
95*702c85b0SNobuhiro Iwamatsu #define DEBUG 0
96*702c85b0SNobuhiro Iwamatsu #endif
97*702c85b0SNobuhiro Iwamatsu 
98*702c85b0SNobuhiro Iwamatsu #if DEBUG & 1
99*702c85b0SNobuhiro Iwamatsu #define DEBUG_FUNCTION() do { printf("%s\n", __FUNCTION__); } while (0)
100*702c85b0SNobuhiro Iwamatsu #define DEBUG_LINE() do { printf("%d\n", __LINE__); } while (0)
101*702c85b0SNobuhiro Iwamatsu #define PRINTK(args...) printf(args)
102*702c85b0SNobuhiro Iwamatsu #else
103*702c85b0SNobuhiro Iwamatsu #define DEBUG_FUNCTION() do {} while(0)
104*702c85b0SNobuhiro Iwamatsu #define DEBUG_LINE() do {} while(0)
105*702c85b0SNobuhiro Iwamatsu #define PRINTK(args...)
106*702c85b0SNobuhiro Iwamatsu #endif
107*702c85b0SNobuhiro Iwamatsu 
108e710185aSgoda.yusuke /* timeout for tx/rx in s */
109e710185aSgoda.yusuke #define TOUT 5
110e710185aSgoda.yusuke /* Ether MAC address size */
111e710185aSgoda.yusuke #define ETHER_ADDR_LEN 6
112e710185aSgoda.yusuke 
113e710185aSgoda.yusuke 
114e710185aSgoda.yusuke #define CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA 1
115e710185aSgoda.yusuke #define CYGACC_CALL_IF_DELAY_US(X) udelay(X)
116e710185aSgoda.yusuke 
117e710185aSgoda.yusuke /* H/W infomation struct */
118e710185aSgoda.yusuke typedef struct hw_info_t {
119e710185aSgoda.yusuke 	u32 offset;
120e710185aSgoda.yusuke 	u8 a0, a1, a2;
121e710185aSgoda.yusuke 	u32 flags;
122e710185aSgoda.yusuke } hw_info_t;
123e710185aSgoda.yusuke 
124e710185aSgoda.yusuke typedef struct dp83902a_priv_data {
125e710185aSgoda.yusuke 	u8* base;
126e710185aSgoda.yusuke 	u8* data;
127e710185aSgoda.yusuke 	u8* reset;
128e710185aSgoda.yusuke 	int tx_next;		/* First free Tx page */
129e710185aSgoda.yusuke 	int tx_int;		/* Expecting interrupt from this buffer */
130e710185aSgoda.yusuke 	int rx_next;		/* First free Rx page */
131e710185aSgoda.yusuke 	int tx1, tx2;		/* Page numbers for Tx buffers */
132e710185aSgoda.yusuke 	u32 tx1_key, tx2_key;	/* Used to ack when packet sent */
133e710185aSgoda.yusuke 	int tx1_len, tx2_len;
134e710185aSgoda.yusuke 	bool tx_started, running, hardwired_esa;
135e710185aSgoda.yusuke 	u8 esa[6];
136e710185aSgoda.yusuke 	void* plf_priv;
137e710185aSgoda.yusuke 
138e710185aSgoda.yusuke 	/* Buffer allocation */
139e710185aSgoda.yusuke 	int tx_buf1, tx_buf2;
140e710185aSgoda.yusuke 	int rx_buf_start, rx_buf_end;
141e710185aSgoda.yusuke } dp83902a_priv_data_t;
142e710185aSgoda.yusuke 
143e710185aSgoda.yusuke /* ------------------------------------------------------------------------ */
144e710185aSgoda.yusuke /* Register offsets */
145e710185aSgoda.yusuke 
146e710185aSgoda.yusuke #define DP_CR		0x00
147e710185aSgoda.yusuke #define DP_CLDA0	0x01
148e710185aSgoda.yusuke #define DP_PSTART	0x01	/* write */
149e710185aSgoda.yusuke #define DP_CLDA1	0x02
150e710185aSgoda.yusuke #define DP_PSTOP	0x02	/* write */
151e710185aSgoda.yusuke #define DP_BNDRY	0x03
152e710185aSgoda.yusuke #define DP_TSR		0x04
153e710185aSgoda.yusuke #define DP_TPSR		0x04	/* write */
154e710185aSgoda.yusuke #define DP_NCR		0x05
155e710185aSgoda.yusuke #define DP_TBCL		0x05	/* write */
156e710185aSgoda.yusuke #define DP_FIFO		0x06
157e710185aSgoda.yusuke #define DP_TBCH		0x06	/* write */
158e710185aSgoda.yusuke #define DP_ISR		0x07
159e710185aSgoda.yusuke #define DP_CRDA0	0x08
160e710185aSgoda.yusuke #define DP_RSAL		0x08	/* write */
161e710185aSgoda.yusuke #define DP_CRDA1	0x09
162e710185aSgoda.yusuke #define DP_RSAH		0x09	/* write */
163e710185aSgoda.yusuke #define DP_RBCL		0x0a	/* write */
164e710185aSgoda.yusuke #define DP_RBCH		0x0b	/* write */
165e710185aSgoda.yusuke #define DP_RSR		0x0c
166e710185aSgoda.yusuke #define DP_RCR		0x0c	/* write */
167e710185aSgoda.yusuke #define DP_FER		0x0d
168e710185aSgoda.yusuke #define DP_TCR		0x0d	/* write */
169e710185aSgoda.yusuke #define DP_CER		0x0e
170e710185aSgoda.yusuke #define DP_DCR		0x0e	/* write */
171e710185aSgoda.yusuke #define DP_MISSED	0x0f
172e710185aSgoda.yusuke #define DP_IMR		0x0f	/* write */
173e710185aSgoda.yusuke #define DP_DATAPORT	0x10	/* "eprom" data port */
174e710185aSgoda.yusuke 
175e710185aSgoda.yusuke #define DP_P1_CR	0x00
176e710185aSgoda.yusuke #define DP_P1_PAR0	0x01
177e710185aSgoda.yusuke #define DP_P1_PAR1	0x02
178e710185aSgoda.yusuke #define DP_P1_PAR2	0x03
179e710185aSgoda.yusuke #define DP_P1_PAR3	0x04
180e710185aSgoda.yusuke #define DP_P1_PAR4	0x05
181e710185aSgoda.yusuke #define DP_P1_PAR5	0x06
182e710185aSgoda.yusuke #define DP_P1_CURP	0x07
183e710185aSgoda.yusuke #define DP_P1_MAR0	0x08
184e710185aSgoda.yusuke #define DP_P1_MAR1	0x09
185e710185aSgoda.yusuke #define DP_P1_MAR2	0x0a
186e710185aSgoda.yusuke #define DP_P1_MAR3	0x0b
187e710185aSgoda.yusuke #define DP_P1_MAR4	0x0c
188e710185aSgoda.yusuke #define DP_P1_MAR5	0x0d
189e710185aSgoda.yusuke #define DP_P1_MAR6	0x0e
190e710185aSgoda.yusuke #define DP_P1_MAR7	0x0f
191e710185aSgoda.yusuke 
192e710185aSgoda.yusuke #define DP_P2_CR	0x00
193e710185aSgoda.yusuke #define DP_P2_PSTART	0x01
194e710185aSgoda.yusuke #define DP_P2_CLDA0	0x01	/* write */
195e710185aSgoda.yusuke #define DP_P2_PSTOP	0x02
196e710185aSgoda.yusuke #define DP_P2_CLDA1	0x02	/* write */
197e710185aSgoda.yusuke #define DP_P2_RNPP	0x03
198e710185aSgoda.yusuke #define DP_P2_TPSR	0x04
199e710185aSgoda.yusuke #define DP_P2_LNPP	0x05
200e710185aSgoda.yusuke #define DP_P2_ACH	0x06
201e710185aSgoda.yusuke #define DP_P2_ACL	0x07
202e710185aSgoda.yusuke #define DP_P2_RCR	0x0c
203e710185aSgoda.yusuke #define DP_P2_TCR	0x0d
204e710185aSgoda.yusuke #define DP_P2_DCR	0x0e
205e710185aSgoda.yusuke #define DP_P2_IMR	0x0f
206e710185aSgoda.yusuke 
207e710185aSgoda.yusuke /* Command register - common to all pages */
208e710185aSgoda.yusuke 
209e710185aSgoda.yusuke #define DP_CR_STOP	0x01	/* Stop: software reset */
210e710185aSgoda.yusuke #define DP_CR_START	0x02	/* Start: initialize device */
211e710185aSgoda.yusuke #define DP_CR_TXPKT	0x04	/* Transmit packet */
212e710185aSgoda.yusuke #define DP_CR_RDMA	0x08	/* Read DMA (recv data from device) */
213e710185aSgoda.yusuke #define DP_CR_WDMA	0x10	/* Write DMA (send data to device) */
214e710185aSgoda.yusuke #define DP_CR_SEND	0x18	/* Send packet */
215e710185aSgoda.yusuke #define DP_CR_NODMA	0x20	/* Remote (or no) DMA */
216e710185aSgoda.yusuke #define DP_CR_PAGE0	0x00	/* Page select */
217e710185aSgoda.yusuke #define DP_CR_PAGE1	0x40
218e710185aSgoda.yusuke #define DP_CR_PAGE2	0x80
219e710185aSgoda.yusuke #define DP_CR_PAGEMSK	0x3F	/* Used to mask out page bits */
220e710185aSgoda.yusuke 
221e710185aSgoda.yusuke /* Data configuration register */
222e710185aSgoda.yusuke 
223e710185aSgoda.yusuke #define DP_DCR_WTS	0x01	/* 1=16 bit word transfers */
224e710185aSgoda.yusuke #define DP_DCR_BOS	0x02	/* 1=Little Endian */
225e710185aSgoda.yusuke #define DP_DCR_LAS	0x04	/* 1=Single 32 bit DMA mode */
226e710185aSgoda.yusuke #define DP_DCR_LS	0x08	/* 1=normal mode, 0=loopback */
227e710185aSgoda.yusuke #define DP_DCR_ARM	0x10	/* 0=no send command (program I/O) */
228e710185aSgoda.yusuke #define DP_DCR_FIFO_1	0x00	/* FIFO threshold */
229e710185aSgoda.yusuke #define DP_DCR_FIFO_2	0x20
230e710185aSgoda.yusuke #define DP_DCR_FIFO_4	0x40
231e710185aSgoda.yusuke #define DP_DCR_FIFO_6	0x60
232e710185aSgoda.yusuke 
233e710185aSgoda.yusuke #define DP_DCR_INIT	(DP_DCR_LS|DP_DCR_FIFO_4)
234e710185aSgoda.yusuke 
235e710185aSgoda.yusuke /* Interrupt status register */
236e710185aSgoda.yusuke 
237e710185aSgoda.yusuke #define DP_ISR_RxP	0x01	/* Packet received */
238e710185aSgoda.yusuke #define DP_ISR_TxP	0x02	/* Packet transmitted */
239e710185aSgoda.yusuke #define DP_ISR_RxE	0x04	/* Receive error */
240e710185aSgoda.yusuke #define DP_ISR_TxE	0x08	/* Transmit error */
241e710185aSgoda.yusuke #define DP_ISR_OFLW	0x10	/* Receive overflow */
242e710185aSgoda.yusuke #define DP_ISR_CNT	0x20	/* Tally counters need emptying */
243e710185aSgoda.yusuke #define DP_ISR_RDC	0x40	/* Remote DMA complete */
244e710185aSgoda.yusuke #define DP_ISR_RESET	0x80	/* Device has reset (shutdown, error) */
245e710185aSgoda.yusuke 
246e710185aSgoda.yusuke /* Interrupt mask register */
247e710185aSgoda.yusuke 
248e710185aSgoda.yusuke #define DP_IMR_RxP	0x01	/* Packet received */
249e710185aSgoda.yusuke #define DP_IMR_TxP	0x02	/* Packet transmitted */
250e710185aSgoda.yusuke #define DP_IMR_RxE	0x04	/* Receive error */
251e710185aSgoda.yusuke #define DP_IMR_TxE	0x08	/* Transmit error */
252e710185aSgoda.yusuke #define DP_IMR_OFLW	0x10	/* Receive overflow */
253e710185aSgoda.yusuke #define DP_IMR_CNT	0x20	/* Tall counters need emptying */
254e710185aSgoda.yusuke #define DP_IMR_RDC	0x40	/* Remote DMA complete */
255e710185aSgoda.yusuke 
256e710185aSgoda.yusuke #define DP_IMR_All	0x3F	/* Everything but remote DMA */
257e710185aSgoda.yusuke 
258e710185aSgoda.yusuke /* Receiver control register */
259e710185aSgoda.yusuke 
260e710185aSgoda.yusuke #define DP_RCR_SEP	0x01	/* Save bad(error) packets */
261e710185aSgoda.yusuke #define DP_RCR_AR	0x02	/* Accept runt packets */
262e710185aSgoda.yusuke #define DP_RCR_AB	0x04	/* Accept broadcast packets */
263e710185aSgoda.yusuke #define DP_RCR_AM	0x08	/* Accept multicast packets */
264e710185aSgoda.yusuke #define DP_RCR_PROM	0x10	/* Promiscuous mode */
265e710185aSgoda.yusuke #define DP_RCR_MON	0x20	/* Monitor mode - 1=accept no packets */
266e710185aSgoda.yusuke 
267e710185aSgoda.yusuke /* Receiver status register */
268e710185aSgoda.yusuke 
269e710185aSgoda.yusuke #define DP_RSR_RxP	0x01	/* Packet received */
270e710185aSgoda.yusuke #define DP_RSR_CRC	0x02	/* CRC error */
271e710185aSgoda.yusuke #define DP_RSR_FRAME	0x04	/* Framing error */
272e710185aSgoda.yusuke #define DP_RSR_FO	0x08	/* FIFO overrun */
273e710185aSgoda.yusuke #define DP_RSR_MISS	0x10	/* Missed packet */
274e710185aSgoda.yusuke #define DP_RSR_PHY	0x20	/* 0=pad match, 1=mad match */
275e710185aSgoda.yusuke #define DP_RSR_DIS	0x40	/* Receiver disabled */
276e710185aSgoda.yusuke #define DP_RSR_DFR	0x80	/* Receiver processing deferred */
277e710185aSgoda.yusuke 
278e710185aSgoda.yusuke /* Transmitter control register */
279e710185aSgoda.yusuke 
280e710185aSgoda.yusuke #define DP_TCR_NOCRC	0x01	/* 1=inhibit CRC */
281e710185aSgoda.yusuke #define DP_TCR_NORMAL	0x00	/* Normal transmitter operation */
282e710185aSgoda.yusuke #define DP_TCR_LOCAL	0x02	/* Internal NIC loopback */
283e710185aSgoda.yusuke #define DP_TCR_INLOOP	0x04	/* Full internal loopback */
284e710185aSgoda.yusuke #define DP_TCR_OUTLOOP	0x08	/* External loopback */
285e710185aSgoda.yusuke #define DP_TCR_ATD	0x10	/* Auto transmit disable */
286e710185aSgoda.yusuke #define DP_TCR_OFFSET	0x20	/* Collision offset adjust */
287e710185aSgoda.yusuke 
288e710185aSgoda.yusuke /* Transmit status register */
289e710185aSgoda.yusuke 
290e710185aSgoda.yusuke #define DP_TSR_TxP	0x01	/* Packet transmitted */
291e710185aSgoda.yusuke #define DP_TSR_COL	0x04	/* Collision (at least one) */
292e710185aSgoda.yusuke #define DP_TSR_ABT	0x08	/* Aborted because of too many collisions */
293e710185aSgoda.yusuke #define DP_TSR_CRS	0x10	/* Lost carrier */
294e710185aSgoda.yusuke #define DP_TSR_FU	0x20	/* FIFO underrun */
295e710185aSgoda.yusuke #define DP_TSR_CDH	0x40	/* Collision Detect Heartbeat */
296e710185aSgoda.yusuke #define DP_TSR_OWC	0x80	/* Collision outside normal window */
297e710185aSgoda.yusuke 
298e710185aSgoda.yusuke #define IEEE_8023_MAX_FRAME	1518	/* Largest possible ethernet frame */
299e710185aSgoda.yusuke #define IEEE_8023_MIN_FRAME	64	/* Smallest possible ethernet frame */
300*702c85b0SNobuhiro Iwamatsu 
301*702c85b0SNobuhiro Iwamatsu /* Functions */
302*702c85b0SNobuhiro Iwamatsu int get_prom(u8* mac_addr, u8* base_addr);
303*702c85b0SNobuhiro Iwamatsu 
3044acbc6c7SJean-Christophe PLAGNIOL-VILLARD #endif /* __NE2000_BASE_H__ */
305