[4089] in linux-net channel archive

home help back first fref pref prev next nref lref last post

3c505 patch

daemon@ATHENA.MIT.EDU (Philip Blundell)
Sun Aug 18 17:42:18 1996

Date: 	Sun, 18 Aug 1996 20:02:14 +0100 (BST)
From: Philip Blundell <phil@tazenda.demon.co.uk>
To: linux-net@vger.rutgers.edu
cc: Martyn Wilkins <Martyn.Wilkins@f608.n442.z2.fidonet.org>

Hi guys.

This patch (against 2.0.12, for all that it matters) fixes some problems
with the 3C505 Ethernet driver.  Specifically, it fixes an uninitialised
variable that prevented the driver booting sometimes, changes the DMA
settings to be slightly more conservative and fixes a race condition.
These latter two should make things work a bit better on slow machines --
I can now use it with my 386, which was a disaster before. 

Give it a go, please. 

phil

--- linux/drivers/net/3c505.c	1996/08/06 18:41:28	1.2
+++ linux/drivers/net/3c505.c	1996/08/18 18:49:46
@@ -985,11 +985,6 @@
 	outb_control(CMDE, dev->base_addr);
 
 	/*
-	 * device is now officially open!
-	 */
-	dev->start = 1;
-
-	/*
 	 * configure adapter memory: we need 10 multicast addresses, default==0
 	 */
 	if (elp_debug >= 3)
@@ -1032,7 +1027,7 @@
 	}
 
 	/* enable burst-mode DMA */
-	outb(0x1, dev->base_addr + PORT_AUXDMA);
+	/* outb(0x1, dev->base_addr + PORT_AUXDMA); */
 
 	/*
 	 * queue receive commands to provide buffering
@@ -1041,6 +1036,11 @@
 	if (elp_debug >= 3)
 		printk("%s: %d receive PCBs active\n", dev->name, adapter->rx_active);
 
+	/*
+	 * device is now officially open!
+	 */
+	dev->start = 1;
+
 	MOD_INC_USE_COUNT;
 
 	return 0;		/* Always succeed */
@@ -1100,11 +1100,11 @@
 	cli();
 	disable_dma(dev->dma);
 	clear_dma_ff(dev->dma);
-	set_dma_mode(dev->dma, 0x08);	/* dma memory -> io */
+	set_dma_mode(dev->dma, 0x48);	/* dma memory -> io */
 	set_dma_addr(dev->dma, target);
 	set_dma_count(dev->dma, nlen);
-	enable_dma(dev->dma);
 	outb_control(inb_control(dev->base_addr) | DMAE | TCEN, dev->base_addr);
+	enable_dma(dev->dma);
 	if (elp_debug >= 3)
 		printk("%s: DMA transfer started\n", dev->name);
 
@@ -1515,6 +1515,8 @@
 		printk("%s: out of memory\n", dev->name);
 		return -ENODEV;
         }
+
+	adapter->send_pcb_semaphore = 0;
 
 	for (tries1 = 0; tries1 < 3; tries1++) {
 		outb_control((inb_control(dev->base_addr) | CMDE) & ~DIR, dev->base_addr);


home help back first fref pref prev next nref lref last post