blob: 88f2b379f37bbb5f73907d5631b56ed7763c78d7 [file] [log] [blame]
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +09001/*
2Ported to U-Boot by Christian Pellegrin <chri@ascensit.com>
3
4Based on sources from the Linux kernel (pcnet_cs.c, 8390.h) and
5eCOS(if_dp83902a.c, if_dp83902a.h). Both of these 2 wonderful world
6are GPL, so this is, of course, GPL.
7
8==========================================================================
9
10dev/if_dp83902a.c
11
12Ethernet device driver for NS DP83902a ethernet controller
13
14==========================================================================
15####ECOSGPLCOPYRIGHTBEGIN####
16-------------------------------------------
17This file is part of eCos, the Embedded Configurable Operating System.
18Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
19
20eCos is free software; you can redistribute it and/or modify it under
21the terms of the GNU General Public License as published by the Free
22Software Foundation; either version 2 or (at your option) any later version.
23
24eCos is distributed in the hope that it will be useful, but WITHOUT ANY
25WARRANTY; without even the implied warranty of MERCHANTABILITY or
26FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27for more details.
28
29You should have received a copy of the GNU General Public License along
30with eCos; if not, write to the Free Software Foundation, Inc.,
3159 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
32
33As a special exception, if other files instantiate templates or use macros
34or inline functions from this file, or you compile this file and link it
35with other works to produce a work based on this file, this file does not
36by itself cause the resulting work to be covered by the GNU General Public
37License. However the source code for this file must still be made available
38in accordance with section (3) of the GNU General Public License.
39
40This exception does not invalidate any other reasons why a work based on
41this file might be covered by the GNU General Public License.
42
43Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
44at http://sources.redhat.com/ecos/ecos-license/
45-------------------------------------------
46####ECOSGPLCOPYRIGHTEND####
47####BSDCOPYRIGHTBEGIN####
48
49-------------------------------------------
50
51Portions of this software may have been derived from OpenBSD or other sources,
52and are covered by the appropriate copyright disclaimers included herein.
53
54-------------------------------------------
55
56####BSDCOPYRIGHTEND####
57==========================================================================
58#####DESCRIPTIONBEGIN####
59
60Author(s): gthomas
61Contributors: gthomas, jskov, rsandifo
62Date: 2001-06-13
63Purpose:
64Description:
65
66FIXME: Will fail if pinged with large packets (1520 bytes)
67Add promisc config
68Add SNMP
69
70####DESCRIPTIONEND####
71
72==========================================================================
73*/
74
75#include <common.h>
76#include <command.h>
77#include <net.h>
78#include <malloc.h>
79
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +090080/* forward definition of function used for the uboot interface */
81void uboot_push_packet_len(int len);
82void uboot_push_tx_done(int key, int val);
83
84/* NE2000 base header file */
85#include "ne2000_base.h"
86
87#if defined(CONFIG_DRIVER_AX88796L)
88/* AX88796L support */
89#include "ax88796.h"
90#else
91/* Basic NE2000 chip support */
92#include "ne2000.h"
93#endif
94
95static dp83902a_priv_data_t nic; /* just one instance of the card supported */
96
Bernhard Kaindladb18ea2011-10-20 10:56:59 +000097/**
98 * This function reads the MAC address from the serial EEPROM,
99 * used if PROM read fails. Does nothing for ax88796 chips (sh boards)
100 */
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900101static bool
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000102dp83902a_init(unsigned char *enetaddr)
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900103{
104 dp83902a_priv_data_t *dp = &nic;
105 u8* base;
106#if defined(NE2000_BASIC_INIT)
107 int i;
108#endif
109
110 DEBUG_FUNCTION();
111
112 base = dp->base;
113 if (!base)
114 return false; /* No device found */
115
116 DEBUG_LINE();
117
118#if defined(NE2000_BASIC_INIT)
119 /* AX88796L doesn't need */
120 /* Prepare ESA */
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 */
126
127 printf("NE2000 - %s ESA: %02x:%02x:%02x:%02x:%02x:%02x\n",
128 "eeprom",
129 dp->esa[0],
130 dp->esa[1],
131 dp->esa[2],
132 dp->esa[3],
133 dp->esa[4],
134 dp->esa[5] );
135
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000136 memcpy(enetaddr, dp->esa, 6); /* Use MAC from serial EEPROM */
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900137#endif /* NE2000_BASIC_INIT */
138 return true;
139}
140
141static void
142dp83902a_stop(void)
143{
144 dp83902a_priv_data_t *dp = &nic;
145 u8 *base = dp->base;
146
147 DEBUG_FUNCTION();
148
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 */
152
153 dp->running = false;
154}
155
156/*
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.
161 */
162static void
163dp83902a_start(u8 * enaddr)
164{
165 dp83902a_priv_data_t *dp = &nic;
166 u8 *base = dp->base;
167 int i;
168
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000169 debug("The MAC is %pM\n", enaddr);
170
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900171 DEBUG_FUNCTION();
172
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;
183 dp->running = true;
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;
188 dp->running = true;
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 */
193 dp->running = true;
194 for (i = 0; i < ETHER_ADDR_LEN; i++) {
195 /* FIXME */
196 /*((vu_short*)( base + ((DP_P1_PAR0 + i) * 2) +
197 * 0x1400)) = enaddr[i];*/
198 DP_OUT(base, DP_P1_PAR0+i, enaddr[i]);
199 }
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 */
204 dp->running = true;
205}
206
207/*
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
211 */
212
213static void
214dp83902a_start_xmit(int start_page, int len)
215{
216 dp83902a_priv_data_t *dp = (dp83902a_priv_data_t *) &nic;
217 u8 *base = dp->base;
218
219 DEBUG_FUNCTION();
220
221#if DEBUG & 1
222 printf("Tx pkt %d len %d\n", start_page, len);
223 if (dp->tx_started)
224 printf("TX already started?!?\n");
225#endif
226
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);
233
234 dp->tx_started = true;
235}
236
237/*
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).
240 */
241static void
242dp83902a_send(u8 *data, int total_len, u32 key)
243{
244 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
245 u8 *base = dp->base;
246 int len, start_page, pkt_len, i, isr;
247#if DEBUG & 4
248 int dx;
249#endif
250
251 DEBUG_FUNCTION();
252
253 len = pkt_len = total_len;
254 if (pkt_len < IEEE_8023_MIN_FRAME)
255 pkt_len = IEEE_8023_MIN_FRAME;
256
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;
261 dp->tx1_key = key;
262 dp->tx_next = dp->tx_buf2;
263 } else {
264 dp->tx2 = start_page;
265 dp->tx2_len = pkt_len;
266 dp->tx2_key = key;
267 dp->tx_next = dp->tx_buf1;
268 }
269
270#if DEBUG & 5
271 printf("TX prep page %d len %d\n", start_page, pkt_len);
272#endif
273
274 DP_OUT(base, DP_ISR, DP_ISR_RDC); /* Clear end of DMA */
275 {
276 /*
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).
280 */
281
282 u16 tmp;
283 int len = 1;
284
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);
291 }
292
293#ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
294 /*
295 * Stall for a bit before continuing to work around random data
296 * corruption problems on some platforms.
297 */
298 CYGACC_CALL_IF_DELAY_US(1);
299#endif
300
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);
307
308 /* Put data into buffer */
309#if DEBUG & 4
310 printf(" sg buf %08lx len %08x\n ", (u32)data, len);
311 dx = 0;
312#endif
313 while (len > 0) {
314#if DEBUG & 4
315 printf(" %02x", *data);
316 if (0 == (++dx % 16)) printf("\n ");
317#endif
318
319 DP_OUT_DATA(dp->data, *data++);
320 len--;
321 }
322#if DEBUG & 4
323 printf("\n");
324#endif
325 if (total_len < pkt_len) {
326#if DEBUG & 4
327 printf(" + %d bytes of padding\n", pkt_len - total_len);
328#endif
329 /* Padding to 802.3 length was required */
330 for (i = total_len; i < pkt_len;) {
331 i++;
332 DP_OUT_DATA(dp->data, 0);
333 }
334 }
335
336#ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
337 /*
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).
341 */
342 CYGACC_CALL_IF_DELAY_US(1);
343#endif
344
345 /* Wait for DMA to complete */
346 do {
347 DP_IN(base, DP_ISR, isr);
348 } while ((isr & DP_ISR_RDC) == 0);
349
350 /* Then disable DMA */
351 DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
352
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 */
357 } else {
358 dp->tx_int = 2; /* Expecting interrupt from BUF2 */
359 }
360 dp83902a_start_xmit(start_page, pkt_len);
361 }
362}
363
364/*
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.
370 */
371static void
372dp83902a_RxEvent(void)
373{
374 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
375 u8 *base = dp->base;
376 u8 rsr;
377 u8 rcv_hdr[4];
378 int i, len, pkt, cur;
379
380 DEBUG_FUNCTION();
381
382 DP_IN(base, DP_RSR, rsr);
383 while (true) {
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);
389
390 pkt += 1;
391 if (pkt == dp->rx_buf_end)
392 pkt = dp->rx_buf_start;
393
394 if (pkt == cur) {
395 break;
396 }
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);
404 else
405 DP_OUT(base, DP_BNDRY, cur - 1); /* Update pointer */
406 return;
407 }
408 dp->rx_next = pkt;
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);
413#endif
414
415 /* read header (get data size)*/
416 for (i = 0; i < sizeof(rcv_hdr);) {
417 DP_IN_DATA(dp->data, rcv_hdr[i++]);
418 }
419
420#if DEBUG & 5
421 printf("rx hdr %02x %02x %02x %02x\n",
422 rcv_hdr[0], rcv_hdr[1], rcv_hdr[2], rcv_hdr[3]);
423#endif
424 len = ((rcv_hdr[3] << 8) | rcv_hdr[2]) - sizeof(rcv_hdr);
425
426 /* data read */
427 uboot_push_packet_len(len);
428
429 if (rcv_hdr[1] == dp->rx_buf_start)
430 DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1);
431 else
432 DP_OUT(base, DP_BNDRY, rcv_hdr[1] - 1); /* Update pointer */
433 }
434}
435
436/*
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.
442 */
443static void
444dp83902a_recv(u8 *data, int len)
445{
446 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
447 u8 *base = dp->base;
448 int i, mlen;
449 u8 saved_char = 0;
450 bool saved;
451#if DEBUG & 4
452 int dx;
453#endif
454
455 DEBUG_FUNCTION();
456
457#if DEBUG & 5
458 printf("Rx packet %d length %d\n", dp->rx_next, len);
459#endif
460
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);
471#endif
472
473 saved = false;
474 for (i = 0; i < 1; i++) {
475 if (data) {
476 mlen = len;
477#if DEBUG & 4
478 printf(" sg buf %08lx len %08x \n", (u32) data, mlen);
479 dx = 0;
480#endif
481 while (0 < mlen) {
482 /* Saved byte from previous loop? */
483 if (saved) {
484 *data++ = saved_char;
485 mlen--;
486 saved = false;
487 continue;
488 }
489
490 {
491 u8 tmp;
492 DP_IN_DATA(dp->data, tmp);
493#if DEBUG & 4
494 printf(" %02x", tmp);
495 if (0 == (++dx % 16)) printf("\n ");
496#endif
497 *data++ = tmp;;
498 mlen--;
499 }
500 }
501#if DEBUG & 4
502 printf("\n");
503#endif
504 }
505 }
506}
507
508static void
509dp83902a_TxEvent(void)
510{
511 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
512 u8 *base = dp->base;
513 u8 tsr;
514 u32 key;
515
516 DEBUG_FUNCTION();
517
518 DP_IN(base, DP_TSR, tsr);
519 if (dp->tx_int == 1) {
520 key = dp->tx1_key;
521 dp->tx1 = 0;
522 } else {
523 key = dp->tx2_key;
524 dp->tx2 = 0;
525 }
526 /* Start next packet if one is ready */
527 dp->tx_started = false;
528 if (dp->tx1) {
529 dp83902a_start_xmit(dp->tx1, dp->tx1_len);
530 dp->tx_int = 1;
531 } else if (dp->tx2) {
532 dp83902a_start_xmit(dp->tx2, dp->tx2_len);
533 dp->tx_int = 2;
534 } else {
535 dp->tx_int = 0;
536 }
537 /* Tell higher level we sent this packet */
538 uboot_push_tx_done(key, 0);
539}
540
541/*
542 * Read the tally counters to clear them. Called in response to a CNT
543 * interrupt.
544 */
545static void
546dp83902a_ClearCounters(void)
547{
548 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
549 u8 *base = dp->base;
550 u8 cnt1, cnt2, cnt3;
551
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);
556}
557
558/*
559 * Deal with an overflow condition. This code follows the procedure set
560 * out in section 7.0 of the datasheet.
561 */
562static void
563dp83902a_Overflow(void)
564{
565 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *)&nic;
566 u8 *base = dp->base;
567 u8 isr;
568
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);
572
573 /* Clear the remote byte counter registers. */
574 DP_OUT(base, DP_RBCL, 0);
575 DP_OUT(base, DP_RBCH, 0);
576
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);
580
581 /*
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.
585 */
586 dp83902a_RxEvent();
587 DP_OUT(base, DP_ISR, DP_ISR_RxP|DP_ISR_RxE);
588
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);
592
593 /*
594 * If a transmit command was issued, but no transmit event has occured,
595 * restart it here.
596 */
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);
600 }
601}
602
603static void
604dp83902a_poll(void)
605{
606 struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
607 u8 *base = dp->base;
608 u8 isr;
609
610 DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE0 | DP_CR_START);
611 DP_IN(base, DP_ISR, isr);
612 while (0 != isr) {
613 /*
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.
617 */
618 if (isr & DP_ISR_CNT) {
619 dp83902a_ClearCounters();
620 }
621 /*
622 * Check for overflow. It's a special case, since there's a
623 * particular procedure that must be followed to get back into
624 * a running state.a
625 */
626 if (isr & DP_ISR_OFLW) {
627 dp83902a_Overflow();
628 } else {
629 /*
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.
633 */
634 DP_OUT(base, DP_ISR, isr); /* Clear set bits */
635 if (!dp->running) break; /* Is this necessary? */
636 /*
637 * Check for tx_started on TX event since these may happen
638 * spuriously it seems.
639 */
640 if (isr & (DP_ISR_TxP|DP_ISR_TxE) && dp->tx_started) {
641 dp83902a_TxEvent();
642 }
643 if (isr & (DP_ISR_RxP|DP_ISR_RxE)) {
644 dp83902a_RxEvent();
645 }
646 }
647 DP_IN(base, DP_ISR, isr);
648 }
649}
650
651
652/* U-boot specific routines */
653static u8 *pbuf = NULL;
654
655static int pkey = -1;
656static int initialized = 0;
657
658void uboot_push_packet_len(int len) {
659 PRINTK("pushed len = %d\n", len);
660 if (len >= 2000) {
661 printf("NE2000: packet too big\n");
662 return;
663 }
664 dp83902a_recv(&pbuf[0], len);
665
666 /*Just pass it to the upper layer*/
667 NetReceive(&pbuf[0], len);
668}
669
670void uboot_push_tx_done(int key, int val) {
671 PRINTK("pushed key = %d\n", key);
672 pkey = key;
673}
674
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000675/**
676 * Setup the driver and init MAC address according to doc/README.enetaddr
677 * Called by ne2k_register() before registering the driver @eth layer
678 *
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)
681 */
682static int ne2k_setup_driver(struct eth_device *dev)
683{
684 PRINTK("### ne2k_setup_driver\n");
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900685
686 if (!pbuf) {
687 pbuf = malloc(2000);
688 if (!pbuf) {
689 printf("Cannot allocate rx buffer\n");
690 return -1;
691 }
692 }
693
694#ifdef CONFIG_DRIVER_NE2000_CCR
695 {
696 vu_char *p = (vu_char *) CONFIG_DRIVER_NE2000_CCR;
697
698 PRINTK("CCR before is %x\n", *p);
699 *p = CONFIG_DRIVER_NE2000_VAL;
700 PRINTK("CCR after is %x\n", *p);
701 }
702#endif
703
704 nic.base = (u8 *) CONFIG_DRIVER_NE2000_BASE;
705
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900706 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;
711
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000712 /*
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.
716 */
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);
726 }
727 return 0;
728}
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900729
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000730static int ne2k_init(struct eth_device *dev, bd_t *bd)
731{
732 dp83902a_start(dev->enetaddr);
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900733 initialized = 1;
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900734 return 0;
735}
736
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000737static void ne2k_halt(struct eth_device *dev)
738{
739 debug("### ne2k_halt\n");
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900740 if(initialized)
741 dp83902a_stop();
742 initialized = 0;
743}
744
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000745static int ne2k_recv(struct eth_device *dev)
746{
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900747 dp83902a_poll();
748 return 1;
749}
750
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000751static int ne2k_send(struct eth_device *dev, volatile void *packet, int length)
752{
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900753 int tmo;
754
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000755 debug("### ne2k_send\n");
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900756
757 pkey = -1;
758
759 dp83902a_send((u8 *) packet, length, 666);
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200760 tmo = get_timer (0) + TOUT * CONFIG_SYS_HZ;
Nobuhiro Iwamatsuf909daa2008-09-30 15:02:53 +0900761 while(1) {
762 dp83902a_poll();
763 if (pkey != -1) {
764 PRINTK("Packet sucesfully sent\n");
765 return 0;
766 }
767 if (get_timer (0) >= tmo) {
768 printf("transmission error (timoeut)\n");
769 return 0;
770 }
771
772 }
773 return 0;
774}
Bernhard Kaindladb18ea2011-10-20 10:56:59 +0000775
776/**
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)
779 */
780int ne2k_register(void)
781{
782 struct eth_device *dev;
783
784 dev = calloc(sizeof(*dev), 1);
785 if (dev == NULL)
786 return -1;
787
788 if (ne2k_setup_driver(dev))
789 return -1;
790
791 dev->init = ne2k_init;
792 dev->halt = ne2k_halt;
793 dev->send = ne2k_send;
794 dev->recv = ne2k_recv;
795
796 sprintf(dev->name, "NE2000");
797
798 return eth_register(dev);
799}