xref: /openbmc/u-boot/drivers/net/ne2000_base.c (revision 3f82d89d)
1 /*
2 Ported to U-Boot by Christian Pellegrin <chri@ascensit.com>
3 
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.
7 
8 ==========================================================================
9 
10 dev/if_dp83902a.c
11 
12 Ethernet device driver for NS DP83902a ethernet controller
13 
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.
19 
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.
23 
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
27 for more details.
28 
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.
32 
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.
39 
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.
42 
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####
48 
49 -------------------------------------------
50 
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.
53 
54 -------------------------------------------
55 
56 ####BSDCOPYRIGHTEND####
57 ==========================================================================
58 #####DESCRIPTIONBEGIN####
59 
60 Author(s):	gthomas
61 Contributors:	gthomas, jskov, rsandifo
62 Date:		2001-06-13
63 Purpose:
64 Description:
65 
66 FIXME:		Will fail if pinged with large packets (1520 bytes)
67 Add promisc config
68 Add 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 #include <linux/compiler.h>
80 
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);
84 
85 /* NE2000 base header file */
86 #include "ne2000_base.h"
87 
88 #if defined(CONFIG_DRIVER_AX88796L)
89 /* AX88796L support */
90 #include "ax88796.h"
91 #else
92 /* Basic NE2000 chip support */
93 #include "ne2000.h"
94 #endif
95 
96 static dp83902a_priv_data_t nic; /* just one instance of the card supported */
97 
98 /**
99  * This function reads the MAC address from the serial EEPROM,
100  * used if PROM read fails. Does nothing for ax88796 chips (sh boards)
101  */
102 static bool
103 dp83902a_init(unsigned char *enetaddr)
104 {
105 	dp83902a_priv_data_t *dp = &nic;
106 	u8* base;
107 #if defined(NE2000_BASIC_INIT)
108 	int i;
109 #endif
110 
111 	DEBUG_FUNCTION();
112 
113 	base = dp->base;
114 	if (!base)
115 		return false;	/* No device found */
116 
117 	DEBUG_LINE();
118 
119 #if defined(NE2000_BASIC_INIT)
120 	/* AX88796L doesn't need */
121 	/* Prepare ESA */
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 */
127 
128 	printf("NE2000 - %s ESA: %02x:%02x:%02x:%02x:%02x:%02x\n",
129 		"eeprom",
130 		dp->esa[0],
131 		dp->esa[1],
132 		dp->esa[2],
133 		dp->esa[3],
134 		dp->esa[4],
135 		dp->esa[5] );
136 
137 	memcpy(enetaddr, dp->esa, 6); /* Use MAC from serial EEPROM */
138 #endif	/* NE2000_BASIC_INIT */
139 	return true;
140 }
141 
142 static void
143 dp83902a_stop(void)
144 {
145 	dp83902a_priv_data_t *dp = &nic;
146 	u8 *base = dp->base;
147 
148 	DEBUG_FUNCTION();
149 
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 */
153 
154 	dp->running = false;
155 }
156 
157 /*
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.
162  */
163 static void
164 dp83902a_start(u8 * enaddr)
165 {
166 	dp83902a_priv_data_t *dp = &nic;
167 	u8 *base = dp->base;
168 	int i;
169 
170 	debug("The MAC is %pM\n", enaddr);
171 
172 	DEBUG_FUNCTION();
173 
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;
184 	dp->running = true;
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;
189 	dp->running = true;
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 */
194 	dp->running = true;
195 	for (i = 0; i < ETHER_ADDR_LEN; i++) {
196 		/* FIXME */
197 		/*((vu_short*)( base + ((DP_P1_PAR0 + i) * 2) +
198 		 * 0x1400)) = enaddr[i];*/
199 		DP_OUT(base, DP_P1_PAR0+i, enaddr[i]);
200 	}
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 */
205 	dp->running = true;
206 }
207 
208 /*
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
212  */
213 
214 static void
215 dp83902a_start_xmit(int start_page, int len)
216 {
217 	dp83902a_priv_data_t *dp = (dp83902a_priv_data_t *) &nic;
218 	u8 *base = dp->base;
219 
220 	DEBUG_FUNCTION();
221 
222 #if DEBUG & 1
223 	printf("Tx pkt %d len %d\n", start_page, len);
224 	if (dp->tx_started)
225 		printf("TX already started?!?\n");
226 #endif
227 
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);
234 
235 	dp->tx_started = true;
236 }
237 
238 /*
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).
241  */
242 static void
243 dp83902a_send(u8 *data, int total_len, u32 key)
244 {
245 	struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
246 	u8 *base = dp->base;
247 	int len, start_page, pkt_len, i, isr;
248 #if DEBUG & 4
249 	int dx;
250 #endif
251 
252 	DEBUG_FUNCTION();
253 
254 	len = pkt_len = total_len;
255 	if (pkt_len < IEEE_8023_MIN_FRAME)
256 		pkt_len = IEEE_8023_MIN_FRAME;
257 
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;
262 		dp->tx1_key = key;
263 		dp->tx_next = dp->tx_buf2;
264 	} else {
265 		dp->tx2 = start_page;
266 		dp->tx2_len = pkt_len;
267 		dp->tx2_key = key;
268 		dp->tx_next = dp->tx_buf1;
269 	}
270 
271 #if DEBUG & 5
272 	printf("TX prep page %d len %d\n", start_page, pkt_len);
273 #endif
274 
275 	DP_OUT(base, DP_ISR, DP_ISR_RDC);	/* Clear end of DMA */
276 	{
277 		/*
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).
281 		 */
282 
283 		__maybe_unused u16 tmp;
284 		int len = 1;
285 
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);
292 	}
293 
294 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
295 	/*
296 	 * Stall for a bit before continuing to work around random data
297 	 * corruption problems on some platforms.
298 	 */
299 	CYGACC_CALL_IF_DELAY_US(1);
300 #endif
301 
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);
308 
309 	/* Put data into buffer */
310 #if DEBUG & 4
311 	printf(" sg buf %08lx len %08x\n ", (u32)data, len);
312 	dx = 0;
313 #endif
314 	while (len > 0) {
315 #if DEBUG & 4
316 		printf(" %02x", *data);
317 		if (0 == (++dx % 16)) printf("\n ");
318 #endif
319 
320 		DP_OUT_DATA(dp->data, *data++);
321 		len--;
322 	}
323 #if DEBUG & 4
324 	printf("\n");
325 #endif
326 	if (total_len < pkt_len) {
327 #if DEBUG & 4
328 		printf("  + %d bytes of padding\n", pkt_len - total_len);
329 #endif
330 		/* Padding to 802.3 length was required */
331 		for (i = total_len; i < pkt_len;) {
332 			i++;
333 			DP_OUT_DATA(dp->data, 0);
334 		}
335 	}
336 
337 #ifdef CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA
338 	/*
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).
342 	 */
343 	CYGACC_CALL_IF_DELAY_US(1);
344 #endif
345 
346 	/* Wait for DMA to complete */
347 	do {
348 		DP_IN(base, DP_ISR, isr);
349 	} while ((isr & DP_ISR_RDC) == 0);
350 
351 	/* Then disable DMA */
352 	DP_OUT(base, DP_CR, DP_CR_PAGE0 | DP_CR_NODMA | DP_CR_START);
353 
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 */
358 		} else {
359 			dp->tx_int = 2; /* Expecting interrupt from BUF2 */
360 		}
361 		dp83902a_start_xmit(start_page, pkt_len);
362 	}
363 }
364 
365 /*
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.
371  */
372 static void
373 dp83902a_RxEvent(void)
374 {
375 	struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
376 	u8 *base = dp->base;
377 	__maybe_unused u8 rsr;
378 	u8 rcv_hdr[4];
379 	int i, len, pkt, cur;
380 
381 	DEBUG_FUNCTION();
382 
383 	DP_IN(base, DP_RSR, rsr);
384 	while (true) {
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);
390 
391 		pkt += 1;
392 		if (pkt == dp->rx_buf_end)
393 			pkt = dp->rx_buf_start;
394 
395 		if (pkt == cur) {
396 			break;
397 		}
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);
405 			else
406 				DP_OUT(base, DP_BNDRY, cur - 1); /* Update pointer */
407 			return;
408 		}
409 		dp->rx_next = pkt;
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);
414 #endif
415 
416 		/* read header (get data size)*/
417 		for (i = 0; i < sizeof(rcv_hdr);) {
418 			DP_IN_DATA(dp->data, rcv_hdr[i++]);
419 		}
420 
421 #if DEBUG & 5
422 		printf("rx hdr %02x %02x %02x %02x\n",
423 			rcv_hdr[0], rcv_hdr[1], rcv_hdr[2], rcv_hdr[3]);
424 #endif
425 		len = ((rcv_hdr[3] << 8) | rcv_hdr[2]) - sizeof(rcv_hdr);
426 
427 		/* data read */
428 		uboot_push_packet_len(len);
429 
430 		if (rcv_hdr[1] == dp->rx_buf_start)
431 			DP_OUT(base, DP_BNDRY, dp->rx_buf_end - 1);
432 		else
433 			DP_OUT(base, DP_BNDRY, rcv_hdr[1] - 1); /* Update pointer */
434 	}
435 }
436 
437 /*
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.
443  */
444 static void
445 dp83902a_recv(u8 *data, int len)
446 {
447 	struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
448 	u8 *base = dp->base;
449 	int i, mlen;
450 	u8 saved_char = 0;
451 	bool saved;
452 #if DEBUG & 4
453 	int dx;
454 #endif
455 
456 	DEBUG_FUNCTION();
457 
458 #if DEBUG & 5
459 	printf("Rx packet %d length %d\n", dp->rx_next, len);
460 #endif
461 
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);
472 #endif
473 
474 	saved = false;
475 	for (i = 0; i < 1; i++) {
476 		if (data) {
477 			mlen = len;
478 #if DEBUG & 4
479 			printf(" sg buf %08lx len %08x \n", (u32) data, mlen);
480 			dx = 0;
481 #endif
482 			while (0 < mlen) {
483 				/* Saved byte from previous loop? */
484 				if (saved) {
485 					*data++ = saved_char;
486 					mlen--;
487 					saved = false;
488 					continue;
489 				}
490 
491 				{
492 					u8 tmp;
493 					DP_IN_DATA(dp->data, tmp);
494 #if DEBUG & 4
495 					printf(" %02x", tmp);
496 					if (0 == (++dx % 16)) printf("\n ");
497 #endif
498 					*data++ = tmp;;
499 					mlen--;
500 				}
501 			}
502 #if DEBUG & 4
503 			printf("\n");
504 #endif
505 		}
506 	}
507 }
508 
509 static void
510 dp83902a_TxEvent(void)
511 {
512 	struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
513 	u8 *base = dp->base;
514 	__maybe_unused u8 tsr;
515 	u32 key;
516 
517 	DEBUG_FUNCTION();
518 
519 	DP_IN(base, DP_TSR, tsr);
520 	if (dp->tx_int == 1) {
521 		key = dp->tx1_key;
522 		dp->tx1 = 0;
523 	} else {
524 		key = dp->tx2_key;
525 		dp->tx2 = 0;
526 	}
527 	/* Start next packet if one is ready */
528 	dp->tx_started = false;
529 	if (dp->tx1) {
530 		dp83902a_start_xmit(dp->tx1, dp->tx1_len);
531 		dp->tx_int = 1;
532 	} else if (dp->tx2) {
533 		dp83902a_start_xmit(dp->tx2, dp->tx2_len);
534 		dp->tx_int = 2;
535 	} else {
536 		dp->tx_int = 0;
537 	}
538 	/* Tell higher level we sent this packet */
539 	uboot_push_tx_done(key, 0);
540 }
541 
542 /*
543  * Read the tally counters to clear them. Called in response to a CNT
544  * interrupt.
545  */
546 static void
547 dp83902a_ClearCounters(void)
548 {
549 	struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
550 	u8 *base = dp->base;
551 	__maybe_unused u8 cnt1, cnt2, cnt3;
552 
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);
557 }
558 
559 /*
560  * Deal with an overflow condition. This code follows the procedure set
561  * out in section 7.0 of the datasheet.
562  */
563 static void
564 dp83902a_Overflow(void)
565 {
566 	struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *)&nic;
567 	u8 *base = dp->base;
568 	u8 isr;
569 
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);
573 
574 	/* Clear the remote byte counter registers. */
575 	DP_OUT(base, DP_RBCL, 0);
576 	DP_OUT(base, DP_RBCH, 0);
577 
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);
581 
582 	/*
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.
586 	 */
587 	dp83902a_RxEvent();
588 	DP_OUT(base, DP_ISR, DP_ISR_RxP|DP_ISR_RxE);
589 
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);
593 
594 	/*
595 	 * If a transmit command was issued, but no transmit event has occured,
596 	 * restart it here.
597 	 */
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);
601 	}
602 }
603 
604 static void
605 dp83902a_poll(void)
606 {
607 	struct dp83902a_priv_data *dp = (struct dp83902a_priv_data *) &nic;
608 	u8 *base = dp->base;
609 	u8 isr;
610 
611 	DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE0 | DP_CR_START);
612 	DP_IN(base, DP_ISR, isr);
613 	while (0 != isr) {
614 		/*
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.
618 		 */
619 		if (isr & DP_ISR_CNT) {
620 			dp83902a_ClearCounters();
621 		}
622 		/*
623 		 * Check for overflow. It's a special case, since there's a
624 		 * particular procedure that must be followed to get back into
625 		 * a running state.a
626 		 */
627 		if (isr & DP_ISR_OFLW) {
628 			dp83902a_Overflow();
629 		} else {
630 			/*
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.
634 			 */
635 			DP_OUT(base, DP_ISR, isr);	/* Clear set bits */
636 			if (!dp->running) break;	/* Is this necessary? */
637 			/*
638 			 * Check for tx_started on TX event since these may happen
639 			 * spuriously it seems.
640 			 */
641 			if (isr & (DP_ISR_TxP|DP_ISR_TxE) && dp->tx_started) {
642 				dp83902a_TxEvent();
643 			}
644 			if (isr & (DP_ISR_RxP|DP_ISR_RxE)) {
645 				dp83902a_RxEvent();
646 			}
647 		}
648 		DP_IN(base, DP_ISR, isr);
649 	}
650 }
651 
652 
653 /* U-boot specific routines */
654 static u8 *pbuf = NULL;
655 
656 static int pkey = -1;
657 static int initialized = 0;
658 
659 void uboot_push_packet_len(int len) {
660 	PRINTK("pushed len = %d\n", len);
661 	if (len >= 2000) {
662 		printf("NE2000: packet too big\n");
663 		return;
664 	}
665 	dp83902a_recv(&pbuf[0], len);
666 
667 	/*Just pass it to the upper layer*/
668 	NetReceive(&pbuf[0], len);
669 }
670 
671 void uboot_push_tx_done(int key, int val) {
672 	PRINTK("pushed key = %d\n", key);
673 	pkey = key;
674 }
675 
676 /**
677  * Setup the driver and init MAC address according to doc/README.enetaddr
678  * Called by ne2k_register() before registering the driver @eth layer
679  *
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)
682  */
683 static int ne2k_setup_driver(struct eth_device *dev)
684 {
685 	PRINTK("### ne2k_setup_driver\n");
686 
687 	if (!pbuf) {
688 		pbuf = malloc(2000);
689 		if (!pbuf) {
690 			printf("Cannot allocate rx buffer\n");
691 			return -1;
692 		}
693 	}
694 
695 #ifdef CONFIG_DRIVER_NE2000_CCR
696 	{
697 		vu_char *p = (vu_char *) CONFIG_DRIVER_NE2000_CCR;
698 
699 		PRINTK("CCR before is %x\n", *p);
700 		*p = CONFIG_DRIVER_NE2000_VAL;
701 		PRINTK("CCR after is %x\n", *p);
702 	}
703 #endif
704 
705 	nic.base = (u8 *) CONFIG_DRIVER_NE2000_BASE;
706 
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;
712 
713 	/*
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.
717 	 */
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);
727 	}
728 	return 0;
729 }
730 
731 static int ne2k_init(struct eth_device *dev, bd_t *bd)
732 {
733 	dp83902a_start(dev->enetaddr);
734 	initialized = 1;
735 	return 0;
736 }
737 
738 static void ne2k_halt(struct eth_device *dev)
739 {
740 	debug("### ne2k_halt\n");
741 	if(initialized)
742 		dp83902a_stop();
743 	initialized = 0;
744 }
745 
746 static int ne2k_recv(struct eth_device *dev)
747 {
748 	dp83902a_poll();
749 	return 1;
750 }
751 
752 static int ne2k_send(struct eth_device *dev, void *packet, int length)
753 {
754 	int tmo;
755 
756 	debug("### ne2k_send\n");
757 
758 	pkey = -1;
759 
760 	dp83902a_send((u8 *) packet, length, 666);
761 	tmo = get_timer (0) + TOUT * CONFIG_SYS_HZ;
762 	while(1) {
763 		dp83902a_poll();
764 		if (pkey != -1) {
765 			PRINTK("Packet sucesfully sent\n");
766 			return 0;
767 		}
768 		if (get_timer (0) >= tmo) {
769 			printf("transmission error (timoeut)\n");
770 			return 0;
771 		}
772 
773 	}
774 	return 0;
775 }
776 
777 /**
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)
780  */
781 int ne2k_register(void)
782 {
783 	struct eth_device *dev;
784 
785 	dev = calloc(sizeof(*dev), 1);
786 	if (dev == NULL)
787 		return -1;
788 
789 	if (ne2k_setup_driver(dev))
790 		return -1;
791 
792 	dev->init = ne2k_init;
793 	dev->halt = ne2k_halt;
794 	dev->send = ne2k_send;
795 	dev->recv = ne2k_recv;
796 
797 	sprintf(dev->name, "NE2000");
798 
799 	return eth_register(dev);
800 }
801