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 ==========================================================================
80 /* forward definition of function used for the uboot interface */
81 void uboot_push_packet_len(int len);
82 void uboot_push_tx_done(int key, int val);
84 /* NE2000 base header file */
85 #include "ne2000_base.h"
87 #if defined(CONFIG_DRIVER_AX88796L)
88 /* AX88796L support */
91 /* Basic NE2000 chip support */
95 static dp83902a_priv_data_t nic; /* just one instance of the card supported */
98 * This function reads the MAC address from the serial EEPROM,
99 * used if PROM read fails. Does nothing for ax88796 chips (sh boards)
102 dp83902a_init(unsigned char *enetaddr)
104 dp83902a_priv_data_t *dp = &nic;
106 #if defined(NE2000_BASIC_INIT)
114 return false; /* No device found */
118 #if defined(NE2000_BASIC_INIT)
119 /* AX88796L doesn't need */
121 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE1); /* Select page 1 */
122 /* Use the address from the serial EEPROM */
123 for (i = 0; i < 6; i++)
124 DP_IN(base, DP_P1_PAR0+i, dp->esa[i]);
125 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE0); /* Select page 0 */
127 printf("NE2000 - %s ESA: %02x:%02x:%02x:%02x:%02x:%02x\n",
136 memcpy(enetaddr, dp->esa, 6); /* Use MAC from serial EEPROM */
137 #endif /* NE2000_BASIC_INIT */
144 dp83902a_priv_data_t *dp = &nic;
149 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_STOP); /* Brutal */
150 DP_OUT(base, DP_ISR, 0xFF); /* Clear any pending interrupts */
151 DP_OUT(base, DP_IMR, 0x00); /* Disable all interrupts */
157 * This function is called to "start up" the interface. It may be called
158 * multiple times, even when the hardware is already running. It will be
159 * called whenever something "hardware oriented" changes and should leave
160 * the hardware ready to send/receive packets.
163 dp83902a_start(u8 * enaddr)
165 dp83902a_priv_data_t *dp = &nic;
169 debug("The MAC is %pM\n", enaddr);
173 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_STOP); /* Brutal */
174 DP_OUT(base, DP_DCR, DP_DCR_INIT);
175 DP_OUT(base, DP_RBCH, 0); /* Remote byte count */
176 DP_OUT(base, DP_RBCL, 0);
177 DP_OUT(base, DP_RCR, DP_RCR_MON); /* Accept no packets */
178 DP_OUT(base, DP_TCR, DP_TCR_LOCAL); /* Transmitter [virtually] off */
179 DP_OUT(base, DP_TPSR, dp->tx_buf1); /* Transmitter start page */
180 dp->tx1 = dp->tx2 = 0;
181 dp->tx_next = dp->tx_buf1;
182 dp->tx_started = false;
184 DP_OUT(base, DP_PSTART, dp->rx_buf_start); /* Receive ring start page */
185 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1); /* Receive ring boundary */
186 DP_OUT(base, DP_PSTOP, dp->rx_buf_end); /* Receive ring end page */
187 dp->rx_next = dp->rx_buf_start - 1;
189 DP_OUT(base, DP_ISR, 0xFF); /* Clear any pending interrupts */
190 DP_OUT(base, DP_IMR, DP_IMR_All); /* Enable all interrupts */
191 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE1 | DP_CR_STOP); /* Select page 1 */
192 DP_OUT(base, DP_P1_CURP, dp->rx_buf_start); /* Current page - next free page for Rx */
194 for (i = 0; i < ETHER_ADDR_LEN; i++) {
196 /*((vu_short*)( base + ((DP_P1_PAR0 + i) * 2) +
197 * 0x1400)) = enaddr[i];*/
198 DP_OUT(base, DP_P1_PAR0+i, enaddr[i]);
200 /* Enable and start device */
201 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
202 DP_OUT(base, DP_TCR, DP_TCR_NORMAL); /* Normal transmit operations */
203 DP_OUT(base, DP_RCR, DP_RCR_AB); /* Accept broadcast, no errors, no multicast */
208 * This routine is called to start the transmitter. It is split out from the
209 * data handling routine so it may be called either when data becomes first
210 * available or when an Tx interrupt occurs
214 dp83902a_start_xmit(int start_page, int len)
216 dp83902a_priv_data_t *dp = (dp83902a_priv_data_t *) &nic;
222 printf("Tx pkt %d len %d\n", start_page, len);
224 printf("TX already started?!?\n");
227 DP_OUT(base, DP_ISR, (DP_ISR_TxP | DP_ISR_TxE));
228 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
229 DP_OUT(base, DP_TBCL, len & 0xFF);
230 DP_OUT(base, DP_TBCH, len >> 8);
231 DP_OUT(base, DP_TPSR, start_page);
232 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_TXPKT | DP_CR_START);
234 dp->tx_started = true;
238 * This routine is called to send data to the hardware. It is known a-priori
239 * that there is free buffer space (dp->tx_next).
242 dp83902a_send(u8 *data, int total_len, u32 key)
244 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
246 int len, start_page, pkt_len, i, isr;
253 len = pkt_len = total_len;
254 if (pkt_len < IEEE_8023_MIN_FRAME)
255 pkt_len = IEEE_8023_MIN_FRAME;
257 start_page = dp->tx_next;
258 if (dp->tx_next == dp->tx_buf1) {
259 dp->tx1 = start_page;
260 dp->tx1_len = pkt_len;
262 dp->tx_next = dp->tx_buf2;
264 dp->tx2 = start_page;
265 dp->tx2_len = pkt_len;
267 dp->tx_next = dp->tx_buf1;
271 printf("TX prep page %d len %d\n", start_page, pkt_len);
274 DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
277 * Dummy read. The manual sez something slightly different,
278 * but the code is extended a bit to do what Hitachi's monitor
279 * does (i.e., also read data).
285 DP_OUT(base, DP_RSAL, 0x100 - len);
286 DP_OUT(base, DP_RSAH, (start_page - 1) & 0xff);
287 DP_OUT(base, DP_RBCL, len);
288 DP_OUT(base, DP_RBCH, 0);
289 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_RDMA | DP_CR_START);
290 DP_IN_DATA(dp->data, tmp);
293 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
295 * Stall for a bit before continuing to work around random data
296 * corruption problems on some platforms.
298 CYGACC_CALL_IF_DELAY_US(1);
301 /* Send data to device buffer(s) */
302 DP_OUT(base, DP_RSAL, 0);
303 DP_OUT(base, DP_RSAH, start_page);
304 DP_OUT(base, DP_RBCL, pkt_len & 0xFF);
305 DP_OUT(base, DP_RBCH, pkt_len >> 8);
306 DP_OUT(base, DP_CR, DP_CR_WDMA | DP_CR_START);
308 /* Put data into buffer */
310 printf(" sg buf %08lx len %08x\n ", (u32)data, len);
315 printf(" %02x", *data);
316 if (0 == (++dx % 16)) printf("\n ");
319 DP_OUT_DATA(dp->data, *data++);
325 if (total_len < pkt_len) {
327 printf(" + %d bytes of padding\n", pkt_len - total_len);
329 /* Padding to 802.3 length was required */
330 for (i = total_len; i < pkt_len;) {
332 DP_OUT_DATA(dp->data, 0);
336 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
338 * After last data write, delay for a bit before accessing the
339 * device again, or we may get random data corruption in the last
340 * datum (on some platforms).
342 CYGACC_CALL_IF_DELAY_US(1);
345 /* Wait for DMA to complete */
347 DP_IN(base, DP_ISR, isr);
348 } while ((isr & DP_ISR_RDC) == 0);
350 /* Then disable DMA */
351 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
353 /* Start transmit if not already going */
354 if (!dp->tx_started) {
355 if (start_page == dp->tx1) {
356 dp->tx_int = 1; /* Expecting interrupt from BUF1 */
358 dp->tx_int = 2; /* Expecting interrupt from BUF2 */
360 dp83902a_start_xmit(start_page, pkt_len);
365 * This function is called when a packet has been received. It's job is
366 * to prepare to unload the packet from the hardware. Once the length of
367 * the packet is known, the upper layer of the driver can be told. When
368 * the upper layer is ready to unload the packet, the internal function
369 * 'dp83902a_recv' will be called to actually fetch it from the hardware.
372 dp83902a_RxEvent(void)
374 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
378 int i, len, pkt, cur;
382 DP_IN(base, DP_RSR, rsr);
384 /* Read incoming packet header */
385 DP_OUT(base, DP_CR, DP_CR_PAGE1 | DP_CR_NODMA | DP_CR_START);
386 DP_IN(base, DP_P1_CURP, cur);
387 DP_OUT(base, DP_P1_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
388 DP_IN(base, DP_BNDRY, pkt);
391 if (pkt == dp->rx_buf_end)
392 pkt = dp->rx_buf_start;
397 DP_OUT(base, DP_RBCL, sizeof(rcv_hdr));
398 DP_OUT(base, DP_RBCH, 0);
399 DP_OUT(base, DP_RSAL, 0);
400 DP_OUT(base, DP_RSAH, pkt);
401 if (dp->rx_next == pkt) {
402 if (cur == dp->rx_buf_start)
403 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1);
405 DP_OUT(base, DP_BNDRY, cur - 1); /* Update pointer */
409 DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
410 DP_OUT(base, DP_CR, DP_CR_RDMA | DP_CR_START);
411 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_RX_DMA
412 CYGACC_CALL_IF_DELAY_US(10);
415 /* read header (get data size)*/
416 for (i = 0; i < sizeof(rcv_hdr);) {
417 DP_IN_DATA(dp->data, rcv_hdr[i++]);
421 printf("rx hdr %02x %02x %02x %02x\n",
422 rcv_hdr[0], rcv_hdr[1], rcv_hdr[2], rcv_hdr[3]);
424 len = ((rcv_hdr[3] << 8) | rcv_hdr[2]) - sizeof(rcv_hdr);
427 uboot_push_packet_len(len);
429 if (rcv_hdr[1] == dp->rx_buf_start)
430 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1);
432 DP_OUT(base, DP_BNDRY, rcv_hdr[1] - 1); /* Update pointer */
437 * This function is called as a result of the "eth_drv_recv()" call above.
438 * It's job is to actually fetch data for a packet from the hardware once
439 * memory buffers have been allocated for the packet. Note that the buffers
440 * may come in pieces, using a scatter-gather list. This allows for more
441 * efficient processing in the upper layers of the stack.
444 dp83902a_recv(u8 *data, int len)
446 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
458 printf("Rx packet %d length %d\n", dp->rx_next, len);
461 /* Read incoming packet data */
462 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
463 DP_OUT(base, DP_RBCL, len & 0xFF);
464 DP_OUT(base, DP_RBCH, len >> 8);
465 DP_OUT(base, DP_RSAL, 4); /* Past header */
466 DP_OUT(base, DP_RSAH, dp->rx_next);
467 DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
468 DP_OUT(base, DP_CR, DP_CR_RDMA | DP_CR_START);
469 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_RX_DMA
470 CYGACC_CALL_IF_DELAY_US(10);
474 for (i = 0; i < 1; i++) {
478 printf(" sg buf %08lx len %08x \n", (u32) data, mlen);
482 /* Saved byte from previous loop? */
484 *data++ = saved_char;
492 DP_IN_DATA(dp->data, tmp);
494 printf(" %02x", tmp);
495 if (0 == (++dx % 16)) printf("\n ");
509 dp83902a_TxEvent(void)
511 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
518 DP_IN(base, DP_TSR, tsr);
519 if (dp->tx_int == 1) {
526 /* Start next packet if one is ready */
527 dp->tx_started = false;
529 dp83902a_start_xmit(dp->tx1, dp->tx1_len);
531 } else if (dp->tx2) {
532 dp83902a_start_xmit(dp->tx2, dp->tx2_len);
537 /* Tell higher level we sent this packet */
538 uboot_push_tx_done(key, 0);
542 * Read the tally counters to clear them. Called in response to a CNT
546 dp83902a_ClearCounters(void)
548 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
552 DP_IN(base, DP_FER, cnt1);
553 DP_IN(base, DP_CER, cnt2);
554 DP_IN(base, DP_MISSED, cnt3);
555 DP_OUT(base, DP_ISR, DP_ISR_CNT);
559 * Deal with an overflow condition. This code follows the procedure set
560 * out in section 7.0 of the datasheet.
563 dp83902a_Overflow(void)
565 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *)&nic;
569 /* Issue a stop command and wait 1.6ms for it to complete. */
570 DP_OUT(base, DP_CR, DP_CR_STOP | DP_CR_NODMA);
571 CYGACC_CALL_IF_DELAY_US(1600);
573 /* Clear the remote byte counter registers. */
574 DP_OUT(base, DP_RBCL, 0);
575 DP_OUT(base, DP_RBCH, 0);
577 /* Enter loopback mode while we clear the buffer. */
578 DP_OUT(base, DP_TCR, DP_TCR_LOCAL);
579 DP_OUT(base, DP_CR, DP_CR_START | DP_CR_NODMA);
582 * Read in as many packets as we can and acknowledge any and receive
583 * interrupts. Since the buffer has overflowed, a receive event of
584 * some kind will have occured.
587 DP_OUT(base, DP_ISR, DP_ISR_RxP|DP_ISR_RxE);
589 /* Clear the overflow condition and leave loopback mode. */
590 DP_OUT(base, DP_ISR, DP_ISR_OFLW);
591 DP_OUT(base, DP_TCR, DP_TCR_NORMAL);
594 * If a transmit command was issued, but no transmit event has occured,
597 DP_IN(base, DP_ISR, isr);
598 if (dp->tx_started && !(isr & (DP_ISR_TxP|DP_ISR_TxE))) {
599 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_TXPKT | DP_CR_START);
606 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
610 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE0 | DP_CR_START);
611 DP_IN(base, DP_ISR, isr);
614 * The CNT interrupt triggers when the MSB of one of the error
615 * counters is set. We don't much care about these counters, but
616 * we should read their values to reset them.
618 if (isr & DP_ISR_CNT) {
619 dp83902a_ClearCounters();
622 * Check for overflow. It's a special case, since there's a
623 * particular procedure that must be followed to get back into
626 if (isr & DP_ISR_OFLW) {
630 * Other kinds of interrupts can be acknowledged simply by
631 * clearing the relevant bits of the ISR. Do that now, then
632 * handle the interrupts we care about.
634 DP_OUT(base, DP_ISR, isr); /* Clear set bits */
635 if (!dp->running) break; /* Is this necessary? */
637 * Check for tx_started on TX event since these may happen
638 * spuriously it seems.
640 if (isr & (DP_ISR_TxP|DP_ISR_TxE) && dp->tx_started) {
643 if (isr & (DP_ISR_RxP|DP_ISR_RxE)) {
647 DP_IN(base, DP_ISR, isr);
652 /* U-boot specific routines */
653 static u8 *pbuf = NULL;
655 static int pkey = -1;
656 static int initialized = 0;
658 void uboot_push_packet_len(int len) {
659 PRINTK("pushed len = %d\n", len);
661 printf("NE2000: packet too big\n");
664 dp83902a_recv(&pbuf[0], len);
666 /*Just pass it to the upper layer*/
667 NetReceive(&pbuf[0], len);
670 void uboot_push_tx_done(int key, int val) {
671 PRINTK("pushed key = %d\n", key);
676 * Setup the driver and init MAC address according to doc/README.enetaddr
677 * Called by ne2k_register() before registering the driver @eth layer
679 * @param struct ethdevice of this instance of the driver for dev->enetaddr
680 * @return 0 on success, -1 on error (causing caller to print error msg)
682 static int ne2k_setup_driver(struct eth_device *dev)
684 PRINTK("### ne2k_setup_driver\n");
689 printf("Cannot allocate rx buffer\n");
694 #ifdef CONFIG_DRIVER_NE2000_CCR
696 vu_char *p = (vu_char *) CONFIG_DRIVER_NE2000_CCR;
698 PRINTK("CCR before is %x\n", *p);
699 *p = CONFIG_DRIVER_NE2000_VAL;
700 PRINTK("CCR after is %x\n", *p);
704 nic.base = (u8 *) CONFIG_DRIVER_NE2000_BASE;
706 nic.data = nic.base + DP_DATA;
707 nic.tx_buf1 = START_PG;
708 nic.tx_buf2 = START_PG2;
709 nic.rx_buf_start = RX_START;
710 nic.rx_buf_end = RX_END;
713 * According to doc/README.enetaddr, drivers shall give priority
714 * to the MAC address value in the environment, so we do not read
715 * it from the prom or eeprom if it is specified in the environment.
717 if (!eth_getenv_enetaddr("ethaddr", dev->enetaddr)) {
718 /* If the MAC address is not in the environment, get it: */
719 if (!get_prom(dev->enetaddr, nic.base)) /* get MAC from prom */
720 dp83902a_init(dev->enetaddr); /* fallback: seeprom */
721 /* And write it into the environment otherwise eth_write_hwaddr
722 * returns -1 due to eth_getenv_enetaddr_by_index() failing,
723 * and this causes "Warning: failed to set MAC address", and
724 * cmd_bdinfo has no ethaddr value which it can show: */
725 eth_setenv_enetaddr("ethaddr", dev->enetaddr);
730 static int ne2k_init(struct eth_device *dev, bd_t *bd)
732 dp83902a_start(dev->enetaddr);
737 static void ne2k_halt(struct eth_device *dev)
739 debug("### ne2k_halt\n");
745 static int ne2k_recv(struct eth_device *dev)
751 static int ne2k_send(struct eth_device *dev, volatile void *packet, int length)
755 debug("### ne2k_send\n");
759 dp83902a_send((u8 *) packet, length, 666);
760 tmo = get_timer (0) + TOUT * CONFIG_SYS_HZ;
764 PRINTK("Packet sucesfully sent\n");
767 if (get_timer (0) >= tmo) {
768 printf("transmission error (timoeut)\n");
777 * Setup the driver for use and register it with the eth layer
778 * @return 0 on success, -1 on error (causing caller to print error msg)
780 int ne2k_register(void)
782 struct eth_device *dev;
784 dev = calloc(sizeof(*dev), 1);
788 if (ne2k_setup_driver(dev))
791 dev->init = ne2k_init;
792 dev->halt = ne2k_halt;
793 dev->send = ne2k_send;
794 dev->recv = ne2k_recv;
796 sprintf(dev->name, "NE2000");
798 return eth_register(dev);