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 */
100 dp83902a_priv_data_t *dp = &nic;
102 #if defined(NE2000_BASIC_INIT)
110 return false; /* No device found */
114 #if defined(NE2000_BASIC_INIT)
115 /* AX88796L doesn't need */
117 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE1); /* Select page 1 */
118 /* Use the address from the serial EEPROM */
119 for (i = 0; i < 6; i++)
120 DP_IN(base, DP_P1_PAR0+i, dp->esa[i]);
121 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE0); /* Select page 0 */
123 printf("NE2000 - %s ESA: %02x:%02x:%02x:%02x:%02x:%02x\n",
132 #endif /* NE2000_BASIC_INIT */
139 dp83902a_priv_data_t *dp = &nic;
144 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_STOP); /* Brutal */
145 DP_OUT(base, DP_ISR, 0xFF); /* Clear any pending interrupts */
146 DP_OUT(base, DP_IMR, 0x00); /* Disable all interrupts */
152 * This function is called to "start up" the interface. It may be called
153 * multiple times, even when the hardware is already running. It will be
154 * called whenever something "hardware oriented" changes and should leave
155 * the hardware ready to send/receive packets.
158 dp83902a_start(u8 * enaddr)
160 dp83902a_priv_data_t *dp = &nic;
166 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_STOP); /* Brutal */
167 DP_OUT(base, DP_DCR, DP_DCR_INIT);
168 DP_OUT(base, DP_RBCH, 0); /* Remote byte count */
169 DP_OUT(base, DP_RBCL, 0);
170 DP_OUT(base, DP_RCR, DP_RCR_MON); /* Accept no packets */
171 DP_OUT(base, DP_TCR, DP_TCR_LOCAL); /* Transmitter [virtually] off */
172 DP_OUT(base, DP_TPSR, dp->tx_buf1); /* Transmitter start page */
173 dp->tx1 = dp->tx2 = 0;
174 dp->tx_next = dp->tx_buf1;
175 dp->tx_started = false;
177 DP_OUT(base, DP_PSTART, dp->rx_buf_start); /* Receive ring start page */
178 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1); /* Receive ring boundary */
179 DP_OUT(base, DP_PSTOP, dp->rx_buf_end); /* Receive ring end page */
180 dp->rx_next = dp->rx_buf_start - 1;
182 DP_OUT(base, DP_ISR, 0xFF); /* Clear any pending interrupts */
183 DP_OUT(base, DP_IMR, DP_IMR_All); /* Enable all interrupts */
184 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE1 | DP_CR_STOP); /* Select page 1 */
185 DP_OUT(base, DP_P1_CURP, dp->rx_buf_start); /* Current page - next free page for Rx */
187 for (i = 0; i < ETHER_ADDR_LEN; i++) {
189 /*((vu_short*)( base + ((DP_P1_PAR0 + i) * 2) +
190 * 0x1400)) = enaddr[i];*/
191 DP_OUT(base, DP_P1_PAR0+i, enaddr[i]);
193 /* Enable and start device */
194 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
195 DP_OUT(base, DP_TCR, DP_TCR_NORMAL); /* Normal transmit operations */
196 DP_OUT(base, DP_RCR, DP_RCR_AB); /* Accept broadcast, no errors, no multicast */
201 * This routine is called to start the transmitter. It is split out from the
202 * data handling routine so it may be called either when data becomes first
203 * available or when an Tx interrupt occurs
207 dp83902a_start_xmit(int start_page, int len)
209 dp83902a_priv_data_t *dp = (dp83902a_priv_data_t *) &nic;
215 printf("Tx pkt %d len %d\n", start_page, len);
217 printf("TX already started?!?\n");
220 DP_OUT(base, DP_ISR, (DP_ISR_TxP | DP_ISR_TxE));
221 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
222 DP_OUT(base, DP_TBCL, len & 0xFF);
223 DP_OUT(base, DP_TBCH, len >> 8);
224 DP_OUT(base, DP_TPSR, start_page);
225 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_TXPKT | DP_CR_START);
227 dp->tx_started = true;
231 * This routine is called to send data to the hardware. It is known a-priori
232 * that there is free buffer space (dp->tx_next).
235 dp83902a_send(u8 *data, int total_len, u32 key)
237 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
239 int len, start_page, pkt_len, i, isr;
246 len = pkt_len = total_len;
247 if (pkt_len < IEEE_8023_MIN_FRAME)
248 pkt_len = IEEE_8023_MIN_FRAME;
250 start_page = dp->tx_next;
251 if (dp->tx_next == dp->tx_buf1) {
252 dp->tx1 = start_page;
253 dp->tx1_len = pkt_len;
255 dp->tx_next = dp->tx_buf2;
257 dp->tx2 = start_page;
258 dp->tx2_len = pkt_len;
260 dp->tx_next = dp->tx_buf1;
264 printf("TX prep page %d len %d\n", start_page, pkt_len);
267 DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
270 * Dummy read. The manual sez something slightly different,
271 * but the code is extended a bit to do what Hitachi's monitor
272 * does (i.e., also read data).
278 DP_OUT(base, DP_RSAL, 0x100 - len);
279 DP_OUT(base, DP_RSAH, (start_page - 1) & 0xff);
280 DP_OUT(base, DP_RBCL, len);
281 DP_OUT(base, DP_RBCH, 0);
282 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_RDMA | DP_CR_START);
283 DP_IN_DATA(dp->data, tmp);
286 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
288 * Stall for a bit before continuing to work around random data
289 * corruption problems on some platforms.
291 CYGACC_CALL_IF_DELAY_US(1);
294 /* Send data to device buffer(s) */
295 DP_OUT(base, DP_RSAL, 0);
296 DP_OUT(base, DP_RSAH, start_page);
297 DP_OUT(base, DP_RBCL, pkt_len & 0xFF);
298 DP_OUT(base, DP_RBCH, pkt_len >> 8);
299 DP_OUT(base, DP_CR, DP_CR_WDMA | DP_CR_START);
301 /* Put data into buffer */
303 printf(" sg buf %08lx len %08x\n ", (u32)data, len);
308 printf(" %02x", *data);
309 if (0 == (++dx % 16)) printf("\n ");
312 DP_OUT_DATA(dp->data, *data++);
318 if (total_len < pkt_len) {
320 printf(" + %d bytes of padding\n", pkt_len - total_len);
322 /* Padding to 802.3 length was required */
323 for (i = total_len; i < pkt_len;) {
325 DP_OUT_DATA(dp->data, 0);
329 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
331 * After last data write, delay for a bit before accessing the
332 * device again, or we may get random data corruption in the last
333 * datum (on some platforms).
335 CYGACC_CALL_IF_DELAY_US(1);
338 /* Wait for DMA to complete */
340 DP_IN(base, DP_ISR, isr);
341 } while ((isr & DP_ISR_RDC) == 0);
343 /* Then disable DMA */
344 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
346 /* Start transmit if not already going */
347 if (!dp->tx_started) {
348 if (start_page == dp->tx1) {
349 dp->tx_int = 1; /* Expecting interrupt from BUF1 */
351 dp->tx_int = 2; /* Expecting interrupt from BUF2 */
353 dp83902a_start_xmit(start_page, pkt_len);
358 * This function is called when a packet has been received. It's job is
359 * to prepare to unload the packet from the hardware. Once the length of
360 * the packet is known, the upper layer of the driver can be told. When
361 * the upper layer is ready to unload the packet, the internal function
362 * 'dp83902a_recv' will be called to actually fetch it from the hardware.
365 dp83902a_RxEvent(void)
367 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
371 int i, len, pkt, cur;
375 DP_IN(base, DP_RSR, rsr);
377 /* Read incoming packet header */
378 DP_OUT(base, DP_CR, DP_CR_PAGE1 | DP_CR_NODMA | DP_CR_START);
379 DP_IN(base, DP_P1_CURP, cur);
380 DP_OUT(base, DP_P1_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
381 DP_IN(base, DP_BNDRY, pkt);
384 if (pkt == dp->rx_buf_end)
385 pkt = dp->rx_buf_start;
390 DP_OUT(base, DP_RBCL, sizeof(rcv_hdr));
391 DP_OUT(base, DP_RBCH, 0);
392 DP_OUT(base, DP_RSAL, 0);
393 DP_OUT(base, DP_RSAH, pkt);
394 if (dp->rx_next == pkt) {
395 if (cur == dp->rx_buf_start)
396 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1);
398 DP_OUT(base, DP_BNDRY, cur - 1); /* Update pointer */
402 DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
403 DP_OUT(base, DP_CR, DP_CR_RDMA | DP_CR_START);
404 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_RX_DMA
405 CYGACC_CALL_IF_DELAY_US(10);
408 /* read header (get data size)*/
409 for (i = 0; i < sizeof(rcv_hdr);) {
410 DP_IN_DATA(dp->data, rcv_hdr[i++]);
414 printf("rx hdr %02x %02x %02x %02x\n",
415 rcv_hdr[0], rcv_hdr[1], rcv_hdr[2], rcv_hdr[3]);
417 len = ((rcv_hdr[3] << 8) | rcv_hdr[2]) - sizeof(rcv_hdr);
420 uboot_push_packet_len(len);
422 if (rcv_hdr[1] == dp->rx_buf_start)
423 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1);
425 DP_OUT(base, DP_BNDRY, rcv_hdr[1] - 1); /* Update pointer */
430 * This function is called as a result of the "eth_drv_recv()" call above.
431 * It's job is to actually fetch data for a packet from the hardware once
432 * memory buffers have been allocated for the packet. Note that the buffers
433 * may come in pieces, using a scatter-gather list. This allows for more
434 * efficient processing in the upper layers of the stack.
437 dp83902a_recv(u8 *data, int len)
439 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
451 printf("Rx packet %d length %d\n", dp->rx_next, len);
454 /* Read incoming packet data */
455 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
456 DP_OUT(base, DP_RBCL, len & 0xFF);
457 DP_OUT(base, DP_RBCH, len >> 8);
458 DP_OUT(base, DP_RSAL, 4); /* Past header */
459 DP_OUT(base, DP_RSAH, dp->rx_next);
460 DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
461 DP_OUT(base, DP_CR, DP_CR_RDMA | DP_CR_START);
462 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_RX_DMA
463 CYGACC_CALL_IF_DELAY_US(10);
467 for (i = 0; i < 1; i++) {
471 printf(" sg buf %08lx len %08x \n", (u32) data, mlen);
475 /* Saved byte from previous loop? */
477 *data++ = saved_char;
485 DP_IN_DATA(dp->data, tmp);
487 printf(" %02x", tmp);
488 if (0 == (++dx % 16)) printf("\n ");
502 dp83902a_TxEvent(void)
504 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
511 DP_IN(base, DP_TSR, tsr);
512 if (dp->tx_int == 1) {
519 /* Start next packet if one is ready */
520 dp->tx_started = false;
522 dp83902a_start_xmit(dp->tx1, dp->tx1_len);
524 } else if (dp->tx2) {
525 dp83902a_start_xmit(dp->tx2, dp->tx2_len);
530 /* Tell higher level we sent this packet */
531 uboot_push_tx_done(key, 0);
535 * Read the tally counters to clear them. Called in response to a CNT
539 dp83902a_ClearCounters(void)
541 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
545 DP_IN(base, DP_FER, cnt1);
546 DP_IN(base, DP_CER, cnt2);
547 DP_IN(base, DP_MISSED, cnt3);
548 DP_OUT(base, DP_ISR, DP_ISR_CNT);
552 * Deal with an overflow condition. This code follows the procedure set
553 * out in section 7.0 of the datasheet.
556 dp83902a_Overflow(void)
558 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *)&nic;
562 /* Issue a stop command and wait 1.6ms for it to complete. */
563 DP_OUT(base, DP_CR, DP_CR_STOP | DP_CR_NODMA);
564 CYGACC_CALL_IF_DELAY_US(1600);
566 /* Clear the remote byte counter registers. */
567 DP_OUT(base, DP_RBCL, 0);
568 DP_OUT(base, DP_RBCH, 0);
570 /* Enter loopback mode while we clear the buffer. */
571 DP_OUT(base, DP_TCR, DP_TCR_LOCAL);
572 DP_OUT(base, DP_CR, DP_CR_START | DP_CR_NODMA);
575 * Read in as many packets as we can and acknowledge any and receive
576 * interrupts. Since the buffer has overflowed, a receive event of
577 * some kind will have occured.
580 DP_OUT(base, DP_ISR, DP_ISR_RxP|DP_ISR_RxE);
582 /* Clear the overflow condition and leave loopback mode. */
583 DP_OUT(base, DP_ISR, DP_ISR_OFLW);
584 DP_OUT(base, DP_TCR, DP_TCR_NORMAL);
587 * If a transmit command was issued, but no transmit event has occured,
590 DP_IN(base, DP_ISR, isr);
591 if (dp->tx_started && !(isr & (DP_ISR_TxP|DP_ISR_TxE))) {
592 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_TXPKT | DP_CR_START);
599 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
603 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE0 | DP_CR_START);
604 DP_IN(base, DP_ISR, isr);
607 * The CNT interrupt triggers when the MSB of one of the error
608 * counters is set. We don't much care about these counters, but
609 * we should read their values to reset them.
611 if (isr & DP_ISR_CNT) {
612 dp83902a_ClearCounters();
615 * Check for overflow. It's a special case, since there's a
616 * particular procedure that must be followed to get back into
619 if (isr & DP_ISR_OFLW) {
623 * Other kinds of interrupts can be acknowledged simply by
624 * clearing the relevant bits of the ISR. Do that now, then
625 * handle the interrupts we care about.
627 DP_OUT(base, DP_ISR, isr); /* Clear set bits */
628 if (!dp->running) break; /* Is this necessary? */
630 * Check for tx_started on TX event since these may happen
631 * spuriously it seems.
633 if (isr & (DP_ISR_TxP|DP_ISR_TxE) && dp->tx_started) {
636 if (isr & (DP_ISR_RxP|DP_ISR_RxE)) {
640 DP_IN(base, DP_ISR, isr);
645 /* U-boot specific routines */
646 static u8 *pbuf = NULL;
648 static int pkey = -1;
649 static int initialized = 0;
651 void uboot_push_packet_len(int len) {
652 PRINTK("pushed len = %d\n", len);
654 printf("NE2000: packet too big\n");
657 dp83902a_recv(&pbuf[0], len);
659 /*Just pass it to the upper layer*/
660 NetReceive(&pbuf[0], len);
663 void uboot_push_tx_done(int key, int val) {
664 PRINTK("pushed key = %d\n", key);
668 int eth_init(bd_t *bd) {
673 PRINTK("### eth_init\n");
678 printf("Cannot allocate rx buffer\n");
683 #ifdef CONFIG_DRIVER_NE2000_CCR
685 vu_char *p = (vu_char *) CONFIG_DRIVER_NE2000_CCR;
687 PRINTK("CCR before is %x\n", *p);
688 *p = CONFIG_DRIVER_NE2000_VAL;
689 PRINTK("CCR after is %x\n", *p);
693 nic.base = (u8 *) CONFIG_DRIVER_NE2000_BASE;
695 r = get_prom(dev_addr, nic.base);
699 sprintf (ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
700 dev_addr[0], dev_addr[1],
701 dev_addr[2], dev_addr[3],
702 dev_addr[4], dev_addr[5]) ;
703 PRINTK("Set environment from HW MAC addr = \"%s\"\n", ethaddr);
704 setenv ("ethaddr", ethaddr);
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;
712 if (dp83902a_init() == false)
715 dp83902a_start(dev_addr);
723 PRINTK("### eth_halt\n");
734 int eth_send(volatile void *packet, int length) {
737 PRINTK("### eth_send\n");
741 dp83902a_send((u8 *) packet, length, 666);
742 tmo = get_timer (0) + TOUT * CONFIG_SYS_HZ;
746 PRINTK("Packet sucesfully sent\n");
749 if (get_timer (0) >= tmo) {
750 printf("transmission error (timoeut)\n");