hi,
        misc fixes on eepro driver, please apply

-- 
                                                        Aris
---------------------------------------------------------------------------
Aristeu Sergio Rozanski Filho                         [EMAIL PROTECTED]
---------------------------------------------------------------------------
--- linux/drivers/net/eepro.c.old       Tue Sep 12 15:41:50 2000
+++ linux/drivers/net/eepro.c           Wed Sep 13 15:28:04 2000
@@ -23,6 +23,8 @@
        This is a compatibility hardware problem.
 
        Versions:
+       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
                and other minor fixes. this may fix a problem found after
                initialization that delays tx until a transmit timeout is 
@@ -212,6 +214,12 @@
                                   version of the 82595 chip. */
        int stepping;
        spinlock_t lock; /* Serializing lock  */ 
+       unsigned rcv_ram;
+       unsigned rcv_start;
+       unsigned xmt_bar;
+       unsigned xmt_lower_limit_reg;
+       unsigned xmt_upper_limit_reg;
+       unsigned eeprom_reg;
 };
 
 /* The station (ethernet) address prefix, used for IDing the board. */
@@ -356,24 +364,20 @@
 
 #define        RCV_HEADER      8
 #define RCV_DEFAULT_RAM        0x6000
-#define RCV_RAM        rcv_ram
-
-static unsigned rcv_ram = RCV_DEFAULT_RAM;
+#define RCV_RAM        lp->rcv_ram
 
 #define XMT_HEADER     8
 #define XMT_RAM                (RAM_SIZE - RCV_RAM)
 
-#define XMT_START      ((rcv_start + RCV_RAM) % RAM_SIZE)
+#define XMT_START      ((lp->rcv_start + RCV_RAM) % RAM_SIZE)
 
-#define RCV_LOWER_LIMIT        (rcv_start >> 8)
-#define RCV_UPPER_LIMIT        (((rcv_start + RCV_RAM) - 2) >> 8)
+#define RCV_LOWER_LIMIT        (lp->rcv_start >> 8)
+#define RCV_UPPER_LIMIT        (((lp->rcv_start + RCV_RAM) - 2) >> 8)
 #define XMT_LOWER_LIMIT        (XMT_START >> 8)
 #define XMT_UPPER_LIMIT        (((XMT_START + XMT_RAM) - 2) >> 8)
 
 #define RCV_START_PRO  0x00
 #define RCV_START_10   XMT_RAM
-                                       /* by default the old driver */
-static unsigned rcv_start = RCV_START_PRO;
 
 #define        RCV_DONE        0x0008
 #define        RX_OK           0x2000
@@ -422,7 +426,6 @@
 
 #define        XMT_BAR_PRO     0x0a
 #define        XMT_BAR_10      0x0b
-static unsigned xmt_bar = XMT_BAR_PRO;
 
 #define        HOST_ADDRESS_REG        0x0c
 #define        IO_PORT         0x0e
@@ -440,8 +443,6 @@
 #define        XMT_UPPER_LIMIT_REG_PRO 0x0b
 #define        XMT_LOWER_LIMIT_REG_10  0x0b
 #define        XMT_UPPER_LIMIT_REG_10  0x0a
-static unsigned xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_PRO;
-static unsigned xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_PRO;
 
 /* Bank 2 registers */
 #define        XMT_Chain_Int   0x20    /* Interrupt at the end of the transmit chain 
*/
@@ -466,7 +467,6 @@
 
 #define EEPROM_REG_PRO 0x0a
 #define EEPROM_REG_10  0x0b
-static unsigned eeprom_reg = EEPROM_REG_PRO;
 
 #define EESK 0x01
 #define EECS 0x02
@@ -528,7 +528,8 @@
 #define eepro_ack_tx(ioaddr) outb (TX_INT, ioaddr + STATUS_REG)
 
 /* a complete sel reset */
-#define eepro_complete_selreset(ioaddr) {      eepro_dis_int(ioaddr);\
+#define eepro_complete_selreset(ioaddr) {      \
+                                               /* eepro_dis_int(ioaddr); */ \
                                                lp->stats.tx_errors++;\
                                                eepro_sel_reset(ioaddr);\
                                                lp->tx_end = \
@@ -537,7 +538,7 @@
                                                lp->tx_last = 0;\
                                                dev->tbusy=0;\
                                                dev->trans_start = jiffies;\
-                                               eepro_en_int(ioaddr);\
+                                               /*eepro_en_int(ioaddr); */ \
                                                eepro_en_rx(ioaddr);\
                                        }
 
@@ -670,7 +671,15 @@
 
                        lp = (struct eepro_local *)dev->priv;
 
-                       /* Now, get the ethernet hardware address from
+                       /* default values */
+                       lp->rcv_start = RCV_START_PRO;
+                       lp->xmt_bar = XMT_BAR_PRO;
+                       lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_PRO;
+                       lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_PRO;
+                       lp->eeprom_reg = EEPROM_REG_PRO;
+                       lp->rcv_ram = RCV_DEFAULT_RAM;
+
+               /* Now, get the ethernet hardware address from
                           the EEPROM */
 
                        station_addr[0] = read_eeprom(ioaddr, 2, dev);
@@ -682,18 +691,18 @@
                            station_addr[0] == 0xffff) {
                                eepro = 3;
                                lp->eepro = LAN595FX_10ISA;
-                               eeprom_reg = EEPROM_REG_10;
-                               rcv_start = RCV_START_10;
-                               xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_10;
-                               xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_10;
+                               lp->eeprom_reg = EEPROM_REG_10;
+                               lp->rcv_start = RCV_START_10;
+                               lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_10;
+                               lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_10;
+                               lp->xmt_bar = XMT_BAR_10;
 
                                station_addr[0] = read_eeprom(ioaddr, 2, dev);
                        }
-                       
+
                        station_addr[1] = read_eeprom(ioaddr, 3, dev);
                        station_addr[2] = read_eeprom(ioaddr, 4, dev);
 
-
                        if (eepro) {
                                printk("%s: Intel EtherExpress 10 ISA\n at %#x,",
                                        dev->name, ioaddr);
@@ -729,7 +738,7 @@
                        else {
                                dev->mem_end = (dev->mem_end * 1024) +
                                                        (RCV_LOWER_LIMIT << 8);
-                               rcv_ram = dev->mem_end - (RCV_LOWER_LIMIT << 8);
+                               lp->rcv_ram = dev->mem_end - (RCV_LOWER_LIMIT << 8);
                        }
 
                        /* From now on, dev->mem_end - dev->mem_start contains 
@@ -939,7 +948,7 @@
        /* Initialize the 82595. */
 
        eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */
-       temp_reg = inb(ioaddr + eeprom_reg);
+       temp_reg = inb(ioaddr + lp->eeprom_reg);
 
        lp->stepping = temp_reg >> 5;   /* Get the stepping number of the 595 */
        /* Get the stepping number of the 595 */
@@ -948,7 +957,7 @@
                printk(KERN_DEBUG "The stepping of the 82595 is %d\n", lp->stepping);
 
        if (temp_reg & 0x10) /* Check the TurnOff Enable bit */
-               outb(temp_reg & 0xef, ioaddr + eeprom_reg);
+               outb(temp_reg & 0xef, ioaddr + lp->eeprom_reg);
        for (i=0; i < 6; i++) /* Fill the mac address */
                outb(dev->dev_addr[i] , ioaddr + I_ADD_REG0 + i);
                        
@@ -983,8 +992,8 @@
        /* Initialize the RCV and XMT upper and lower limits */
        outb(RCV_LOWER_LIMIT, ioaddr + RCV_LOWER_LIMIT_REG); 
        outb(RCV_UPPER_LIMIT, ioaddr + RCV_UPPER_LIMIT_REG); 
-       outb(XMT_LOWER_LIMIT, ioaddr + xmt_lower_limit_reg); 
-       outb(XMT_UPPER_LIMIT, ioaddr + xmt_upper_limit_reg); 
+       outb(XMT_LOWER_LIMIT, ioaddr + lp->xmt_lower_limit_reg); 
+       outb(XMT_UPPER_LIMIT, ioaddr + lp->xmt_upper_limit_reg); 
 
        /* Enable the interrupt line. */
        eepro_en_intline(ioaddr);
@@ -1003,7 +1012,7 @@
        outw(((RCV_UPPER_LIMIT << 8) | 0xfe), ioaddr + RCV_STOP); 
 
        /* Initialize XMT */
-       outw((XMT_LOWER_LIMIT << 8), ioaddr + xmt_bar); 
+       outw((XMT_LOWER_LIMIT << 8), ioaddr + lp->xmt_bar); 
 
        /* Check for the i82595TX and i82595FX */
        old8 = inb(ioaddr + 8);
@@ -1174,7 +1183,6 @@
                                break;
                        case TX_INT:
                                eepro_ack_tx(ioaddr);
-                               break;
                }
                if (status & RX_INT) {
                        if (net_debug > 4)
@@ -1330,7 +1338,7 @@
                outw(eaddrs[0], ioaddr + IO_PORT);
                outw(eaddrs[1], ioaddr + IO_PORT);
                outw(eaddrs[2], ioaddr + IO_PORT);
-               outw(lp->tx_end, ioaddr + xmt_bar);
+               outw(lp->tx_end, ioaddr + lp->xmt_bar);
                outb(MC_SETUP, ioaddr);
 
                /* Update the transmit queue */
@@ -1392,8 +1400,8 @@
 {
        int i;
        unsigned short retval = 0;
-       short ee_addr = ioaddr + eeprom_reg;
        struct eepro_local *lp = (struct eepro_local *)dev->priv;
+       short ee_addr = ioaddr + lp->eeprom_reg;
        int read_cmd = location | EE_READ_CMD;
        short ctrl_val = EECS ;
        
@@ -1512,7 +1520,7 @@
                status = inw(ioaddr + IO_PORT); 
 
                if (lp->tx_start == lp->tx_end) {
-                       outw(last, ioaddr + xmt_bar);
+                       outw(last, ioaddr + lp->xmt_bar);
                        outb(XMT_CMD, ioaddr);                  
                        lp->tx_start = last;   /* I don't like to change tx_start here 
*/
                }

Reply via email to