Re: intel 8?0 and intel eepro

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> The tested kernels:
> 2.2.16, 2.4.0-test7
2.2.16 driver has some problems on eepro driver. update to 2.2.17
version. if you still get problems, test this patch and send comments to
me as it's a test patch yet. 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

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux