]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Fix NE2000 driver:
authorVlad Lungu <vlad@comsys.ro>
Thu, 4 Oct 2007 17:47:10 +0000 (20:47 +0300)
committerWolfgang Denk <wd@denx.de>
Sat, 20 Oct 2007 22:54:02 +0000 (00:54 +0200)
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>
drivers/ne2000.c
drivers/ne2000.h

index b7ed8761659f8d744929e84d7a75630dba2ee792..0bfe74e547246311e2b06ed3ec1ea6c38a8ba3e5 100644 (file)
@@ -755,7 +755,7 @@ static void pcnet_reset_8390(void)
 #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 plen[NB];
 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 @@ void uboot_push_packet_len(int len) {
        }
        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 @@ int eth_init(bd_t *bd) {
        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) {
index 2955533d7a72b4f8e11d0b038f5797cba62d2786..c13d9f0bbb73a8e65131421ed0b1d7da16e0b3f6 100644 (file)
@@ -42,7 +42,7 @@ are GPL, so this is, of course, GPL.
  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####