ok,
        as i don't have documentation this is the right thing to be
done: restore the default path for old cards and keep the new one to these
blue cards. i hope this finally fixes all problems that my changes (by
guesses and lot of dosemu) introduced on a stable driver.
if it doesn't work for you please email me. i won't rest until i restore
the stability of the old boards and make the blue one supported.

P.S.: (again) if you have any documentation about these boards please send
to me. it will make my work easy and more decent than guesses by sniffing
io.
-----------------------------------------------------------
aristeu sergio rozanski filho | www.cathedrallabs.org/~aris
[EMAIL PROTECTED]        | [EMAIL PROTECTED]     
-----------------------------------------------------------
--- linux/drivers/net/eepro.c.old       Wed Dec 27 21:44:29 2000
+++ linux/drivers/net/eepro.c           Wed Dec 27 22:17:54 2000
@@ -23,6 +23,8 @@
        This is a compatibility hardware problem.
 
        Versions:
+       0.12d   tottaly isolated old code to new code (blue cards).
+               (aris, 12/27/2000)
        0.12c   fixed other multiple cards bug and other cleanups
                (aris, 08/21/2000)
        0.12b   added reset when the tx interrupt is called and TX isn't done
@@ -103,7 +105,7 @@
 */
 
 static const char *version =
-       "eepro.c: v0.12b 06/20/2000 [EMAIL PROTECTED]\n";
+       "eepro.c: v0.12d 12/27/2000 [EMAIL PROTECTED]\n";
 
 #include <linux/module.h>
 
@@ -149,47 +151,28 @@
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
 
-
 #include <linux/version.h>
 
-/* For linux 2.1.xx */
-#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
-
 #include <asm/spinlock.h>
 #include <linux/init.h>
 #include <linux/delay.h>
 
-#define compat_dev_kfree_skb( skb, mode ) dev_kfree_skb( (skb) )
 /* I had reports of looong delays with SLOW_DOWN defined as udelay(2) */
 #define SLOW_DOWN inb(0x80)
-/* udelay(2) */
-#define compat_init_func(X)  __initfunc(X)
-#define compat_init_data     __initdata
-
-#else 
-/* for 2.x */
-
-#define compat_dev_kfree_skb( skb, mode ) dev_kfree_skb( (skb), (mode) )
-#define test_and_set_bit(a,b) set_bit((a),(b))
-#define SLOW_DOWN SLOW_DOWN_IO
-#define compat_init_func(X) X
-#define compat_init_data
-
-#endif
 
-
-/* First, a few definitions that the brave might change. */
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int eepro_portlist[] compat_init_data =
+/* First, a few definitions that the brave might change.
+ * A zero-terminated list of I/O addresses to be probed.
+ * note: 0x300 is default, the 595FX supports ALL IO Ports 
+ * from 0x000 to 0x3F0, some of which are reserved in PCs
+ */
+static unsigned eepro_portlist[] __initdata =
        { 0x300, 0x210, 0x240, 0x280, 0x2C0, 0x200, 0x320, 0x340, 0x360, 0};
-/* note: 0x300 is default, the 595FX supports ALL IO Ports 
-  from 0x000 to 0x3F0, some of which are reserved in PCs */
 
 /* use 0 for production, 1 for verification, >2 for debug */
 #ifndef NET_DEBUG
 #define NET_DEBUG 0
 #endif
-static unsigned int net_debug = NET_DEBUG;
+static unsigned net_debug = NET_DEBUG;
 
 /* The number of low I/O ports used by the ethercard. */
 #define EEPRO_IO_EXTENT        16
@@ -204,16 +187,17 @@
 struct eepro_local {
        struct enet_statistics stats;
        unsigned rx_start;
-       unsigned tx_start; /* start of the transmit chain */
-       int tx_last;  /* pointer to last packet in the transmit chain */
-       unsigned tx_end;   /* end of the transmit chain (plus 1) */
-       int eepro;      /* 1 for the EtherExpress Pro/10,
-                          2 for the EtherExpress Pro/10+,
-                          0 for other 82595-based lan cards. */
-       int version;    /* a flag to indicate if this is a TX or FX
-                                  version of the 82595 chip. */
+       unsigned tx_start;      /* start of the transmit chain */
+       int tx_last;            /* pointer to last packet in the transmit chain */
+       unsigned tx_end;        /* end of the transmit chain (plus 1) */
+       int eepro;              /* 1 for the EtherExpress Pro/10,
+                                * 2 for the EtherExpress Pro/10+,
+                                * 3 for the blue cards,
+                                * 0 for other 82595-based lan cards. */
+       int version;            /* a flag to indicate if this is a TX or FX
+                                * version of the 82595 chip. */
        int stepping;
-       spinlock_t lock; /* Serializing lock  */ 
+       spinlock_t lock;        /* Serializing lock  */ 
        unsigned rcv_ram;
        unsigned rcv_start;
        unsigned xmt_bar;
@@ -322,7 +306,7 @@
 static void     set_multicast_list(struct device *dev);
 
 static int read_eeprom(int ioaddr, int location, struct device *dev);
-static void hardware_send_packet(struct device *dev, void *buf, short length);
+static int     hardware_send_packet(struct device *dev, void *buf, short length);
 static int     eepro_grab_irq(struct device *dev);
 
 /*
@@ -518,8 +502,10 @@
 /* set diagnose flag */
 #define eepro_diag(ioaddr) outb(DIAGNOSE_CMD, ioaddr)
 
+#ifdef ANSWER_TX_AND_RX
 /* ack for rx/tx int */
 #define eepro_ack_rxtx(ioaddr) outb (RX_INT | TX_INT, ioaddr + STATUS_REG)
+#endif
 
 /* ack for rx int */
 #define eepro_ack_rx(ioaddr) outb (RX_INT, ioaddr + STATUS_REG)
@@ -548,14 +534,7 @@
    If dev->base_addr == 2, allocate space for the device and return success
    (detachable devices only).
    */
-#ifdef HAVE_DEVLIST
-       /* Support for an alternate probe manager, which will eliminate the
-                                                       boilerplate below. */
-struct netdev_entry netcard_drv =
-               {"eepro", eepro_probe1, EEPRO_IO_EXTENT, eepro_portlist};
-#else
-compat_init_func(int eepro_probe(struct device *dev))
-{
+__initfunc(int eepro_probe(struct device *dev)) {
        int i;
        int base_addr = dev ? dev->base_addr : 0;
        if (base_addr > 0x1ff)          /* Check a single specified location. */
@@ -575,7 +554,6 @@
        
        return ENODEV;
 }
-#endif
 
 static void printEEPROMInfo(short ioaddr, struct device *dev)
 {
@@ -732,6 +710,7 @@
 
                        dev->mem_start = (RCV_LOWER_LIMIT << 8);
 
+                       /* received mem_end as argument */
                        if ((dev->mem_end & 0x3f) < 3 ||        /* RX buffer must be 
more than 3K */
                                (dev->mem_end & 0x3f) > 29)     /* and less than 29K 
*/
                                dev->mem_end = (RCV_UPPER_LIMIT << 8);
@@ -1055,6 +1034,8 @@
        }
        
        eepro_sel_reset(ioaddr);
+       SLOW_DOWN;
+       SLOW_DOWN;
 
        lp->tx_start = lp->tx_end = (XMT_LOWER_LIMIT << 8);
        lp->tx_last = 0;
@@ -1112,19 +1093,16 @@
        } else {
                short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
                unsigned char *buf = skb->data;
-               int discard = lp->stats.tx_dropped;
 
                lp->stats.tx_bytes+=skb->len;
-               hardware_send_packet(dev, buf, length);
-
-               if (lp->stats.tx_dropped != discard)
+               if (hardware_send_packet(dev, buf, length))
                        return 1;
                
                dev->trans_start = jiffies;
 
        }
 
-       compat_dev_kfree_skb (skb, FREE_WRITE);
+       dev_kfree_skb(skb);
 
        /* You might need to clean up and record Tx statistics here. */
        /* lp->stats.tx_aborted_errors++; */
@@ -1175,9 +1153,11 @@
        while (((status = inb(ioaddr + STATUS_REG)) & 0x06) && (boguscount--)) 
        {
                switch (status & (RX_INT | TX_INT)) {
+#ifdef ANSWER_TX_AND_RX
                        case (RX_INT | TX_INT):
                                eepro_ack_rxtx(ioaddr);
                                break;
+#endif
                        case RX_INT:
                                eepro_ack_rx(ioaddr);
                                break;
@@ -1190,6 +1170,9 @@
 
                        /* Get the received packets */
                        eepro_rx(dev);
+#ifndef ANSWER_TX_AND_RX
+                       continue;
+#endif
                }
                if (status & TX_INT) {
                        if (net_debug > 4)
@@ -1385,7 +1368,11 @@
                eepro_en_int(ioaddr);
        
        }
-       eepro_complete_selreset(ioaddr);
+       if (lp->eepro == LAN595FX_10ISA) {
+               eepro_complete_selreset(ioaddr);
+       }
+       else
+               eepro_en_rx(ioaddr);
 }
 
 /* The horrible routine to read a word from the serial EEPROM. */
@@ -1445,7 +1432,7 @@
        return retval;
 }
 
-static void
+static int
 hardware_send_packet(struct device *dev, void *buf, short length)
 {
        struct eepro_local *lp = (struct eepro_local *)dev->priv;
@@ -1557,13 +1544,16 @@
 
                if (net_debug > 5)
                        printk(KERN_DEBUG "%s: exiting hardware_send_packet 
routine.\n", dev->name);
-               return;
-       }
 
-       dev->tbusy = 1;
+               return 0;
+       }
+       if (lp->eepro == LAN595FX_10ISA)
+               dev->tbusy = 1;
 
        if (net_debug > 5)
                printk(KERN_DEBUG "%s: exiting hardware_send_packet routine.\n", 
dev->name);
+
+       return 1;
 }
 
 static void
@@ -1681,9 +1671,13 @@
                xmt_status = inw(ioaddr+IO_PORT);
 
                if ((xmt_status & TX_DONE_BIT) == 0) {
-                       udelay(40);
-                       boguscount--;
-                       continue;
+                       if (lp->eepro == LAN595FX_10ISA) {
+                               udelay(40);
+                               boguscount--;
+                               continue;
+                       }
+                       else
+                               break;
                }
 
 
@@ -1757,7 +1751,7 @@
         * interrupt again for tx. in other words: tx timeout what will take
         * a lot of time to happen, so we'll do a complete selreset.
         */
-       if (!boguscount)
+       if (!boguscount && lp->eepro == LAN595FX_10ISA)
                eepro_complete_selreset(ioaddr);
 }
 

Reply via email to