lkml.org 
[lkml]   [2000]   [Sep]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[TEST] patch for eepro driver over 2.2.17
hi,
some people reported problems in eepro boards with 2.2.17
driver. please apply this patch over 2.2.17 version.
warning: this is a _test_ patch! i've tested with etherexpress 10 (the
only board supported by this driver that i have here - donations are very
welcome ;)) and it works very well under heavy load.
for interested people: test it and tell me what you think.
thanks,

--
Aris
---------------------------------------------------------------------------
Aristeu Sergio Rozanski Filho aris@conectiva.com.br
---------------------------------------------------------------------------
--- linux/drivers/net/eepro.c.old Tue Sep 12 15:41:50 2000
+++ linux/drivers/net/eepro.c Wed Sep 13 12:00:49 2000
@@ -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 */
}
@@ -1749,8 +1757,10 @@
* 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) {
+ printk("doing a reset due boguscount\n");
eepro_complete_selreset(ioaddr);
+ }
}

#ifdef MODULE
\
 
 \ /
  Last update: 2005-03-22 12:38    [W:0.027 / U:0.144 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site