2
Ported to U-Boot by Christian Pellegrin <chri@ascensit.com>
4
Based on sources from the Linux kernel (pcnet_cs.c, 8390.h) and
5
eCOS(if_dp83902a.c, if_dp83902a.h). Both of these 2 wonderful world
6
are GPL, so this is, of course, GPL.
8
==========================================================================
12
Ethernet device driver for NS DP83902a ethernet controller
14
==========================================================================
15
####ECOSGPLCOPYRIGHTBEGIN####
16
-------------------------------------------
17
This file is part of eCos, the Embedded Configurable Operating System.
18
Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
20
eCos is free software; you can redistribute it and/or modify it under
21
the terms of the GNU General Public License as published by the Free
22
Software Foundation; either version 2 or (at your option) any later version.
24
eCos is distributed in the hope that it will be useful, but WITHOUT ANY
25
WARRANTY; without even the implied warranty of MERCHANTABILITY or
26
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
29
You should have received a copy of the GNU General Public License along
30
with eCos; if not, write to the Free Software Foundation, Inc.,
31
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
33
As a special exception, if other files instantiate templates or use macros
34
or inline functions from this file, or you compile this file and link it
35
with other works to produce a work based on this file, this file does not
36
by itself cause the resulting work to be covered by the GNU General Public
37
License. However the source code for this file must still be made available
38
in accordance with section (3) of the GNU General Public License.
40
This exception does not invalidate any other reasons why a work based on
41
this file might be covered by the GNU General Public License.
43
Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
44
at http://sources.redhat.com/ecos/ecos-license/
45
-------------------------------------------
46
####ECOSGPLCOPYRIGHTEND####
47
####BSDCOPYRIGHTBEGIN####
49
-------------------------------------------
51
Portions of this software may have been derived from OpenBSD or other sources,
52
and are covered by the appropriate copyright disclaimers included herein.
54
-------------------------------------------
56
####BSDCOPYRIGHTEND####
57
==========================================================================
58
#####DESCRIPTIONBEGIN####
61
Contributors: gthomas, jskov, rsandifo
66
FIXME: Will fail if pinged with large packets (1520 bytes)
70
####DESCRIPTIONEND####
72
==========================================================================
79
#include <linux/compiler.h>
81
/* forward definition of function used for the uboot interface */
82
void uboot_push_packet_len(int len);
83
void uboot_push_tx_done(int key, int val);
85
/* NE2000 base header file */
86
#include "ne2000_base.h"
88
#if defined(CONFIG_DRIVER_AX88796L)
89
/* AX88796L support */
92
/* Basic NE2000 chip support */
96
static dp83902a_priv_data_t nic; /* just one instance of the card supported */
99
* This function reads the MAC address from the serial EEPROM,
100
* used if PROM read fails. Does nothing for ax88796 chips (sh boards)
103
dp83902a_init(unsigned char *enetaddr)
105
dp83902a_priv_data_t *dp = &nic;
107
#if defined(NE2000_BASIC_INIT)
115
return false; /* No device found */
119
#if defined(NE2000_BASIC_INIT)
120
/* AX88796L doesn't need */
122
DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE1); /* Select page 1 */
123
/* Use the address from the serial EEPROM */
124
for (i = 0; i < 6; i++)
125
DP_IN(base, DP_P1_PAR0+i, dp->esa[i]);
126
DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE0); /* Select page 0 */
128
printf("NE2000 - %s ESA: %02x:%02x:%02x:%02x:%02x:%02x\n",
137
memcpy(enetaddr, dp->esa, 6); /* Use MAC from serial EEPROM */
138
#endif /* NE2000_BASIC_INIT */
145
dp83902a_priv_data_t *dp = &nic;
150
DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_STOP); /* Brutal */
151
DP_OUT(base, DP_ISR, 0xFF); /* Clear any pending interrupts */
152
DP_OUT(base, DP_IMR, 0x00); /* Disable all interrupts */
158
* This function is called to "start up" the interface. It may be called
159
* multiple times, even when the hardware is already running. It will be
160
* called whenever something "hardware oriented" changes and should leave
161
* the hardware ready to send/receive packets.
164
dp83902a_start(u8 * enaddr)
166
dp83902a_priv_data_t *dp = &nic;
170
debug("The MAC is %pM\n", enaddr);
174
DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_STOP); /* Brutal */
175
DP_OUT(base, DP_DCR, DP_DCR_INIT);
176
DP_OUT(base, DP_RBCH, 0); /* Remote byte count */
177
DP_OUT(base, DP_RBCL, 0);
178
DP_OUT(base, DP_RCR, DP_RCR_MON); /* Accept no packets */
179
DP_OUT(base, DP_TCR, DP_TCR_LOCAL); /* Transmitter [virtually] off */
180
DP_OUT(base, DP_TPSR, dp->tx_buf1); /* Transmitter start page */
181
dp->tx1 = dp->tx2 = 0;
182
dp->tx_next = dp->tx_buf1;
183
dp->tx_started = false;
185
DP_OUT(base, DP_PSTART, dp->rx_buf_start); /* Receive ring start page */
186
DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1); /* Receive ring boundary */
187
DP_OUT(base, DP_PSTOP, dp->rx_buf_end); /* Receive ring end page */
188
dp->rx_next = dp->rx_buf_start - 1;
190
DP_OUT(base, DP_ISR, 0xFF); /* Clear any pending interrupts */
191
DP_OUT(base, DP_IMR, DP_IMR_All); /* Enable all interrupts */
192
DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE1 | DP_CR_STOP); /* Select page 1 */
193
DP_OUT(base, DP_P1_CURP, dp->rx_buf_start); /* Current page - next free page for Rx */
195
for (i = 0; i < ETHER_ADDR_LEN; i++) {
197
/*((vu_short*)( base + ((DP_P1_PAR0 + i) * 2) +
198
* 0x1400)) = enaddr[i];*/
199
DP_OUT(base, DP_P1_PAR0+i, enaddr[i]);
201
/* Enable and start device */
202
DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
203
DP_OUT(base, DP_TCR, DP_TCR_NORMAL); /* Normal transmit operations */
204
DP_OUT(base, DP_RCR, DP_RCR_AB); /* Accept broadcast, no errors, no multicast */
209
* This routine is called to start the transmitter. It is split out from the
210
* data handling routine so it may be called either when data becomes first
211
* available or when an Tx interrupt occurs
215
dp83902a_start_xmit(int start_page, int len)
217
dp83902a_priv_data_t *dp = (dp83902a_priv_data_t *) &nic;
223
printf("Tx pkt %d len %d\n", start_page, len);
225
printf("TX already started?!?\n");
228
DP_OUT(base, DP_ISR, (DP_ISR_TxP | DP_ISR_TxE));
229
DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
230
DP_OUT(base, DP_TBCL, len & 0xFF);
231
DP_OUT(base, DP_TBCH, len >> 8);
232
DP_OUT(base, DP_TPSR, start_page);
233
DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_TXPKT | DP_CR_START);
235
dp->tx_started = true;
239
* This routine is called to send data to the hardware. It is known a-priori
240
* that there is free buffer space (dp->tx_next).
243
dp83902a_send(u8 *data, int total_len, u32 key)
245
struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
247
int len, start_page, pkt_len, i, isr;
254
len = pkt_len = total_len;
255
if (pkt_len < IEEE_8023_MIN_FRAME)
256
pkt_len = IEEE_8023_MIN_FRAME;
258
start_page = dp->tx_next;
259
if (dp->tx_next == dp->tx_buf1) {
260
dp->tx1 = start_page;
261
dp->tx1_len = pkt_len;
263
dp->tx_next = dp->tx_buf2;
265
dp->tx2 = start_page;
266
dp->tx2_len = pkt_len;
268
dp->tx_next = dp->tx_buf1;
272
printf("TX prep page %d len %d\n", start_page, pkt_len);
275
DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
278
* Dummy read. The manual sez something slightly different,
279
* but the code is extended a bit to do what Hitachi's monitor
280
* does (i.e., also read data).
283
__maybe_unused u16 tmp;
286
DP_OUT(base, DP_RSAL, 0x100 - len);
287
DP_OUT(base, DP_RSAH, (start_page - 1) & 0xff);
288
DP_OUT(base, DP_RBCL, len);
289
DP_OUT(base, DP_RBCH, 0);
290
DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_RDMA | DP_CR_START);
291
DP_IN_DATA(dp->data, tmp);
294
#ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
296
* Stall for a bit before continuing to work around random data
297
* corruption problems on some platforms.
299
CYGACC_CALL_IF_DELAY_US(1);
302
/* Send data to device buffer(s) */
303
DP_OUT(base, DP_RSAL, 0);
304
DP_OUT(base, DP_RSAH, start_page);
305
DP_OUT(base, DP_RBCL, pkt_len & 0xFF);
306
DP_OUT(base, DP_RBCH, pkt_len >> 8);
307
DP_OUT(base, DP_CR, DP_CR_WDMA | DP_CR_START);
309
/* Put data into buffer */
311
printf(" sg buf %08lx len %08x\n ", (u32)data, len);
316
printf(" %02x", *data);
317
if (0 == (++dx % 16)) printf("\n ");
320
DP_OUT_DATA(dp->data, *data++);
326
if (total_len < pkt_len) {
328
printf(" + %d bytes of padding\n", pkt_len - total_len);
330
/* Padding to 802.3 length was required */
331
for (i = total_len; i < pkt_len;) {
333
DP_OUT_DATA(dp->data, 0);
337
#ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
339
* After last data write, delay for a bit before accessing the
340
* device again, or we may get random data corruption in the last
341
* datum (on some platforms).
343
CYGACC_CALL_IF_DELAY_US(1);
346
/* Wait for DMA to complete */
348
DP_IN(base, DP_ISR, isr);
349
} while ((isr & DP_ISR_RDC) == 0);
351
/* Then disable DMA */
352
DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
354
/* Start transmit if not already going */
355
if (!dp->tx_started) {
356
if (start_page == dp->tx1) {
357
dp->tx_int = 1; /* Expecting interrupt from BUF1 */
359
dp->tx_int = 2; /* Expecting interrupt from BUF2 */
361
dp83902a_start_xmit(start_page, pkt_len);
366
* This function is called when a packet has been received. It's job is
367
* to prepare to unload the packet from the hardware. Once the length of
368
* the packet is known, the upper layer of the driver can be told. When
369
* the upper layer is ready to unload the packet, the internal function
370
* 'dp83902a_recv' will be called to actually fetch it from the hardware.
373
dp83902a_RxEvent(void)
375
struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
377
__maybe_unused u8 rsr;
379
int i, len, pkt, cur;
383
DP_IN(base, DP_RSR, rsr);
385
/* Read incoming packet header */
386
DP_OUT(base, DP_CR, DP_CR_PAGE1 | DP_CR_NODMA | DP_CR_START);
387
DP_IN(base, DP_P1_CURP, cur);
388
DP_OUT(base, DP_P1_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
389
DP_IN(base, DP_BNDRY, pkt);
392
if (pkt == dp->rx_buf_end)
393
pkt = dp->rx_buf_start;
398
DP_OUT(base, DP_RBCL, sizeof(rcv_hdr));
399
DP_OUT(base, DP_RBCH, 0);
400
DP_OUT(base, DP_RSAL, 0);
401
DP_OUT(base, DP_RSAH, pkt);
402
if (dp->rx_next == pkt) {
403
if (cur == dp->rx_buf_start)
404
DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1);
406
DP_OUT(base, DP_BNDRY, cur - 1); /* Update pointer */
410
DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
411
DP_OUT(base, DP_CR, DP_CR_RDMA | DP_CR_START);
412
#ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_RX_DMA
413
CYGACC_CALL_IF_DELAY_US(10);
416
/* read header (get data size)*/
417
for (i = 0; i < sizeof(rcv_hdr);) {
418
DP_IN_DATA(dp->data, rcv_hdr[i++]);
422
printf("rx hdr %02x %02x %02x %02x\n",
423
rcv_hdr[0], rcv_hdr[1], rcv_hdr[2], rcv_hdr[3]);
425
len = ((rcv_hdr[3] << 8) | rcv_hdr[2]) - sizeof(rcv_hdr);
428
uboot_push_packet_len(len);
430
if (rcv_hdr[1] == dp->rx_buf_start)
431
DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1);
433
DP_OUT(base, DP_BNDRY, rcv_hdr[1] - 1); /* Update pointer */
438
* This function is called as a result of the "eth_drv_recv()" call above.
439
* It's job is to actually fetch data for a packet from the hardware once
440
* memory buffers have been allocated for the packet. Note that the buffers
441
* may come in pieces, using a scatter-gather list. This allows for more
442
* efficient processing in the upper layers of the stack.
445
dp83902a_recv(u8 *data, int len)
447
struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
459
printf("Rx packet %d length %d\n", dp->rx_next, len);
462
/* Read incoming packet data */
463
DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
464
DP_OUT(base, DP_RBCL, len & 0xFF);
465
DP_OUT(base, DP_RBCH, len >> 8);
466
DP_OUT(base, DP_RSAL, 4); /* Past header */
467
DP_OUT(base, DP_RSAH, dp->rx_next);
468
DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
469
DP_OUT(base, DP_CR, DP_CR_RDMA | DP_CR_START);
470
#ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_RX_DMA
471
CYGACC_CALL_IF_DELAY_US(10);
475
for (i = 0; i < 1; i++) {
479
printf(" sg buf %08lx len %08x \n", (u32) data, mlen);
483
/* Saved byte from previous loop? */
485
*data++ = saved_char;
493
DP_IN_DATA(dp->data, tmp);
495
printf(" %02x", tmp);
496
if (0 == (++dx % 16)) printf("\n ");
510
dp83902a_TxEvent(void)
512
struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
514
__maybe_unused u8 tsr;
519
DP_IN(base, DP_TSR, tsr);
520
if (dp->tx_int == 1) {
527
/* Start next packet if one is ready */
528
dp->tx_started = false;
530
dp83902a_start_xmit(dp->tx1, dp->tx1_len);
532
} else if (dp->tx2) {
533
dp83902a_start_xmit(dp->tx2, dp->tx2_len);
538
/* Tell higher level we sent this packet */
539
uboot_push_tx_done(key, 0);
543
* Read the tally counters to clear them. Called in response to a CNT
547
dp83902a_ClearCounters(void)
549
struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
551
__maybe_unused u8 cnt1, cnt2, cnt3;
553
DP_IN(base, DP_FER, cnt1);
554
DP_IN(base, DP_CER, cnt2);
555
DP_IN(base, DP_MISSED, cnt3);
556
DP_OUT(base, DP_ISR, DP_ISR_CNT);
560
* Deal with an overflow condition. This code follows the procedure set
561
* out in section 7.0 of the datasheet.
564
dp83902a_Overflow(void)
566
struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *)&nic;
570
/* Issue a stop command and wait 1.6ms for it to complete. */
571
DP_OUT(base, DP_CR, DP_CR_STOP | DP_CR_NODMA);
572
CYGACC_CALL_IF_DELAY_US(1600);
574
/* Clear the remote byte counter registers. */
575
DP_OUT(base, DP_RBCL, 0);
576
DP_OUT(base, DP_RBCH, 0);
578
/* Enter loopback mode while we clear the buffer. */
579
DP_OUT(base, DP_TCR, DP_TCR_LOCAL);
580
DP_OUT(base, DP_CR, DP_CR_START | DP_CR_NODMA);
583
* Read in as many packets as we can and acknowledge any and receive
584
* interrupts. Since the buffer has overflowed, a receive event of
585
* some kind will have occured.
588
DP_OUT(base, DP_ISR, DP_ISR_RxP|DP_ISR_RxE);
590
/* Clear the overflow condition and leave loopback mode. */
591
DP_OUT(base, DP_ISR, DP_ISR_OFLW);
592
DP_OUT(base, DP_TCR, DP_TCR_NORMAL);
595
* If a transmit command was issued, but no transmit event has occured,
598
DP_IN(base, DP_ISR, isr);
599
if (dp->tx_started && !(isr & (DP_ISR_TxP|DP_ISR_TxE))) {
600
DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_TXPKT | DP_CR_START);
607
struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
611
DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE0 | DP_CR_START);
612
DP_IN(base, DP_ISR, isr);
615
* The CNT interrupt triggers when the MSB of one of the error
616
* counters is set. We don't much care about these counters, but
617
* we should read their values to reset them.
619
if (isr & DP_ISR_CNT) {
620
dp83902a_ClearCounters();
623
* Check for overflow. It's a special case, since there's a
624
* particular procedure that must be followed to get back into
627
if (isr & DP_ISR_OFLW) {
631
* Other kinds of interrupts can be acknowledged simply by
632
* clearing the relevant bits of the ISR. Do that now, then
633
* handle the interrupts we care about.
635
DP_OUT(base, DP_ISR, isr); /* Clear set bits */
636
if (!dp->running) break; /* Is this necessary? */
638
* Check for tx_started on TX event since these may happen
639
* spuriously it seems.
641
if (isr & (DP_ISR_TxP|DP_ISR_TxE) && dp->tx_started) {
644
if (isr & (DP_ISR_RxP|DP_ISR_RxE)) {
648
DP_IN(base, DP_ISR, isr);
653
/* U-boot specific routines */
654
static u8 *pbuf = NULL;
656
static int pkey = -1;
657
static int initialized = 0;
659
void uboot_push_packet_len(int len) {
660
PRINTK("pushed len = %d\n", len);
662
printf("NE2000: packet too big\n");
665
dp83902a_recv(&pbuf[0], len);
667
/*Just pass it to the upper layer*/
668
NetReceive(&pbuf[0], len);
671
void uboot_push_tx_done(int key, int val) {
672
PRINTK("pushed key = %d\n", key);
677
* Setup the driver and init MAC address according to doc/README.enetaddr
678
* Called by ne2k_register() before registering the driver @eth layer
680
* @param struct ethdevice of this instance of the driver for dev->enetaddr
681
* @return 0 on success, -1 on error (causing caller to print error msg)
683
static int ne2k_setup_driver(struct eth_device *dev)
685
PRINTK("### ne2k_setup_driver\n");
690
printf("Cannot allocate rx buffer\n");
695
#ifdef CONFIG_DRIVER_NE2000_CCR
697
vu_char *p = (vu_char *) CONFIG_DRIVER_NE2000_CCR;
699
PRINTK("CCR before is %x\n", *p);
700
*p = CONFIG_DRIVER_NE2000_VAL;
701
PRINTK("CCR after is %x\n", *p);
705
nic.base = (u8 *) CONFIG_DRIVER_NE2000_BASE;
707
nic.data = nic.base + DP_DATA;
708
nic.tx_buf1 = START_PG;
709
nic.tx_buf2 = START_PG2;
710
nic.rx_buf_start = RX_START;
711
nic.rx_buf_end = RX_END;
714
* According to doc/README.enetaddr, drivers shall give priority
715
* to the MAC address value in the environment, so we do not read
716
* it from the prom or eeprom if it is specified in the environment.
718
if (!eth_getenv_enetaddr("ethaddr", dev->enetaddr)) {
719
/* If the MAC address is not in the environment, get it: */
720
if (!get_prom(dev->enetaddr, nic.base)) /* get MAC from prom */
721
dp83902a_init(dev->enetaddr); /* fallback: seeprom */
722
/* And write it into the environment otherwise eth_write_hwaddr
723
* returns -1 due to eth_getenv_enetaddr_by_index() failing,
724
* and this causes "Warning: failed to set MAC address", and
725
* cmd_bdinfo has no ethaddr value which it can show: */
726
eth_setenv_enetaddr("ethaddr", dev->enetaddr);
731
static int ne2k_init(struct eth_device *dev, bd_t *bd)
733
dp83902a_start(dev->enetaddr);
738
static void ne2k_halt(struct eth_device *dev)
740
debug("### ne2k_halt\n");
746
static int ne2k_recv(struct eth_device *dev)
752
static int ne2k_send(struct eth_device *dev, void *packet, int length)
756
debug("### ne2k_send\n");
760
dp83902a_send((u8 *) packet, length, 666);
761
tmo = get_timer (0) + TOUT * CONFIG_SYS_HZ;
765
PRINTK("Packet sucesfully sent\n");
768
if (get_timer (0) >= tmo) {
769
printf("transmission error (timoeut)\n");
778
* Setup the driver for use and register it with the eth layer
779
* @return 0 on success, -1 on error (causing caller to print error msg)
781
int ne2k_register(void)
783
struct eth_device *dev;
785
dev = calloc(sizeof(*dev), 1);
789
if (ne2k_setup_driver(dev))
792
dev->init = ne2k_init;
793
dev->halt = ne2k_halt;
794
dev->send = ne2k_send;
795
dev->recv = ne2k_recv;
797
sprintf(dev->name, "NE2000");
799
return eth_register(dev);