Fix NE2000 driver: Fixed typo in ne2000.h, thinko re n2k_inb() usage, don't try to do anything in eth_stop() if eth_init() was not called. Simplified RX path in order to avoid timeouts on really really fast NE2000 cards (read: qemu with internal tftp), NetLoop() is clever enough to cope with 1 packet per eth_rx(). Signed-off-by: Vlad Lungu <vlad@comsys.ro>
diff --git a/drivers/ne2000.c b/drivers/ne2000.c index b7ed876..0bfe74e 100644 --- a/drivers/ne2000.c +++ b/drivers/ne2000.c
@@ -755,7 +755,7 @@ #endif n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD); - n2k_outb(n2k_inb(nic_base + PCNET_RESET), PCNET_RESET); + n2k_outb(n2k_inb(PCNET_RESET), PCNET_RESET); for (i = 0; i < 100; i++) { if ((r = (n2k_inb(EN0_ISR) & ENISR_RESET)) != 0) @@ -833,6 +833,7 @@ static int nrx = 0; static int pkey = -1; +static int initialized=0; void uboot_push_packet_len(int len) { PRINTK("pushed len = %d, nrx = %d\n", len, nrx); @@ -846,7 +847,12 @@ } plen[nrx] = len; dp83902a_recv(&pbuf[nrx*2000], len); +/*Just pass it to the upper layer*/ + NetReceive(&pbuf[nrx*2000], plen[nrx]); +/*eth_rx() was gutted, so this is not needed anymore*/ +#if 0 nrx++; +#endif } void uboot_push_tx_done(int key, int val) { @@ -903,37 +909,21 @@ if (dp83902a_init() == false) return -1; dp83902a_start(dev_addr); + initialized=1; return 0; } void eth_halt() { PRINTK("### eth_halt\n"); - - dp83902a_stop(); + if(initialized) + dp83902a_stop(); + initialized=0; } int eth_rx() { - int j, tmo; - - PRINTK("### eth_rx\n"); - - tmo = get_timer (0) + TOUT * CFG_HZ; - while(1) { - dp83902a_poll(); - if (nrx > 0) { - for(j=0; j<nrx; j++) { - NetReceive(&pbuf[j*2000], plen[j]); - } - nrx = 0; - return 1; - } - if (get_timer (0) >= tmo) { - printf("timeout during rx\n"); - return 0; - } - } - return 0; +dp83902a_poll(); +return 1; } int eth_send(volatile void *packet, int length) {
diff --git a/drivers/ne2000.h b/drivers/ne2000.h index 2955533..c13d9f0b 100644 --- a/drivers/ne2000.h +++ b/drivers/ne2000.h
@@ -42,7 +42,7 @@ this file might be covered by the GNU General Public License. Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. - at http://sources.redhat.com/ecos/ecos-license/ */ + at http://sources.redhat.com/ecos/ecos-license/ ------------------------------------------- ####ECOSGPLCOPYRIGHTEND#### ####BSDCOPYRIGHTBEGIN####