The attached patch fixes the following problems with the DP83815 driver
(natsemi.c):
1. When compiled into the kernel, the cards would be registered multiple
times.
2. Autonegotiation code was buggy, causing the card to stop working after
autonegotiation.
--
- Steve Hill
System Administrator Email: [EMAIL PROTECTED]
Navaho Technologies Ltd. Tel: +44-870-7034015
... Alcohol and calculus don't mix - Don't drink and derive! ...
diff -urN linux.natsemi/drivers/net/natsemi.c linux/drivers/net/natsemi.c
--- linux.natsemi/drivers/net/natsemi.c Tue Apr 17 13:12:26 2001
+++ linux/drivers/net/natsemi.c Tue Apr 17 13:20:04 2001
@@ -19,6 +19,16 @@
http://www.scyld.com/network/netsemi.html
*/
+/*
+ 11 April 2001 Steve Hill <[EMAIL PROTECTED]>
+ Bugfix: When compiled into the kernel instead of as a module the driver
+ incorrectly registered multiple network cards.
+
+ 17 April 2001 Steve Hill <[EMAIL PROTECTED]>
+ Bugfix: Autonegotiation code was using writew() instead of writel() - this
+ resulted in the card failing after autonegotiation.
+*/
+
/* These identify the driver base version and may not be removed. */
static const char version1[] =
"natsemi.c:v1.07 1/9/2001 Written by Donald Becker <[EMAIL PROTECTED]>\n";
@@ -363,8 +373,12 @@
#ifndef MODULE
int natsemi_probe(struct net_device *dev)
{
+ static int done = 0;
+
+ if (done) return -ENODEV;
if (pci_drv_register(&natsemi_drv_id, dev) < 0)
return -ENODEV;
+ done = 1;
printk(KERN_INFO "%s" KERN_INFO "%s", version1, version2);
return 0;
}
@@ -637,8 +651,8 @@
np->rx_config &= ~0x10000000;
np->tx_config &= ~0xC0000000;
}
- writew(np->tx_config, ioaddr + TxConfig);
- writew(np->rx_config, ioaddr + RxConfig);
+ writel(np->tx_config, ioaddr + TxConfig);
+ writel(np->rx_config, ioaddr + RxConfig);
}
}