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