* [PATCH 1/3] NE2000 driver updates
2003-04-01 18:32 [PATCH 0/3] NE2000 driver updates Jeff Muizelaar
@ 2003-04-01 18:33 ` Jeff Muizelaar
2003-04-01 18:34 ` [PATCH 2/3] " Jeff Muizelaar
2003-04-01 18:35 ` [PATCH 3/3] " Jeff Muizelaar
2 siblings, 0 replies; 4+ messages in thread
From: Jeff Muizelaar @ 2003-04-01 18:33 UTC (permalink / raw)
To: Linux Kernel Mailing List; +Cc: Jeff Garzik
[-- Attachment #1: Type: text/plain, Size: 1 bytes --]
[-- Attachment #2: ne-pnp.patch --]
[-- Type: text/plain, Size: 6847 bytes --]
--- linux-2.5.66/drivers/net/ne.c 2003-03-24 17:00:21.000000000 -0500
+++ linux-2.5.66-nepnp/drivers/net/ne.c 2003-03-29 21:39:17.000000000 -0500
@@ -29,21 +29,20 @@
last in cleanup_modue()
Richard Guenther : Added support for ISAPnP cards
Paul Gortmaker : Discontinued PCI support - use ne2k-pci.c instead.
+ Jeff Muizelaar : moved over to generic PnP api
*/
/* Routines for the NatSemi-based designs (NE[12]000). */
-static const char version1[] =
-"ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)\n";
-static const char version2[] =
-"Last modified Nov 1, 2000 by Paul Gortmaker\n";
+static const char version[] =
+"ne.c:v1.10a 1/26/03 Donald Becker (becker@scyld.com)\n";
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
-#include <linux/isapnp.h>
+#include <linux/pnp.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
@@ -76,20 +75,18 @@
};
#endif
-static struct isapnp_device_id isapnp_clone_list[] __initdata = {
- { ISAPNP_CARD_ID('A','X','E',0x2011),
- ISAPNP_VENDOR('A','X','E'), ISAPNP_FUNCTION(0x2011),
- (long) "NetGear EA201" },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
- ISAPNP_VENDOR('E','D','I'), ISAPNP_FUNCTION(0x0216),
- (long) "NN NE2000" },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
- ISAPNP_VENDOR('P','N','P'), ISAPNP_FUNCTION(0x80d6),
- (long) "Generic PNP" },
- { } /* terminate list */
+#ifdef CONFIG_PNP
+static const struct pnp_device_id ne_pnp_table[] = {
+ /* NetGear EA201 */
+ {.id = "AXE2011", .driver_data = 0},
+ /* NN NE2000 */
+ {.id = "EDI0216", .driver_data = 0},
+ /* NE2000 Compatible */
+ {.id = "PNP80d6", .driver_data = 0},
};
-MODULE_DEVICE_TABLE(isapnp, isapnp_clone_list);
+MODULE_DEVICE_TABLE(pnp, ne_pnp_table);
+#endif
#ifdef SUPPORT_NE_BAD_CLONES
/* A list of bad clones that we none-the-less recognize. */
@@ -126,9 +123,20 @@
#define NESM_START_PG 0x40 /* First page of TX buffer */
#define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */
+#ifdef CONFIG_PNP
+static int ne_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id);
+static void ne_pnp_remove(struct pnp_dev *dev);
+
+static struct pnp_driver ne_pnp_driver = {
+ .name = "ne",
+ .id_table = ne_pnp_table,
+ .probe = ne_pnp_probe,
+ .remove = ne_pnp_remove,
+};
+#endif
+
int ne_probe(struct net_device *dev);
static int ne_probe1(struct net_device *dev, int ioaddr);
-static int ne_probe_isapnp(struct net_device *dev);
static int ne_open(struct net_device *dev);
static int ne_close(struct net_device *dev);
@@ -175,10 +183,6 @@
else if (base_addr != 0) /* Don't probe at all. */
return -ENXIO;
- /* Then look for any installed ISAPnP clones */
- if (isapnp_present() && (ne_probe_isapnp(dev) == 0))
- return 0;
-
#ifndef MODULE
/* Last resort. The semi-risky ISA auto-probe. */
for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
@@ -191,50 +195,58 @@
return -ENODEV;
}
-static int __init ne_probe_isapnp(struct net_device *dev)
+#ifdef CONFIG_PNP
+static int ne_pnp_probe(struct pnp_dev *idev, const struct pnp_device_id *dev_id)
{
- int i;
-
- for (i = 0; isapnp_clone_list[i].vendor != 0; i++) {
- struct pnp_dev *idev = NULL;
+ struct net_device *dev;
+ int err;
+
+ if ( !(dev = alloc_etherdev(0)) ){
+ err = -ENOMEM;
+ goto alloc_fail;
+ }
+
+ dev->base_addr = pnp_port_start(idev, 0);
+ dev->irq = pnp_irq(idev, 0);
+ printk(KERN_INFO "ne.c: PnP reports %s at i/o %#lx, irq %d\n",
+ idev->dev.name, dev->base_addr, dev->irq);
+
+ SET_MODULE_OWNER(dev);
+
+ if (ne_probe1(dev, dev->base_addr) != 0) { /* Shouldn't happen. */
+ printk(KERN_ERR "ne.c: Probe of PnP card at %#lx failed\n", dev->base_addr);
+ err = -ENXIO;
+ goto probe_fail;
+ }
+
+ if ( (err = register_netdev(dev)) != 0)
+ goto register_fail;
- while ((idev = pnp_find_dev(NULL,
- isapnp_clone_list[i].vendor,
- isapnp_clone_list[i].function,
- idev))) {
- /* Avoid already found cards from previous calls */
- if (pnp_device_attach(idev) < 0)
- continue;
- if (pnp_activate_dev(idev) < 0) {
- pnp_device_detach(idev);
- continue;
- }
- /* if no io and irq, search for next */
- if (!pnp_port_valid(idev, 0) || !pnp_irq_valid(idev, 0)) {
- pnp_device_detach(idev);
- continue;
- }
- /* found it */
- dev->base_addr = pnp_port_start(idev, 0);
- dev->irq = pnp_irq(idev, 0);
- printk(KERN_INFO "ne.c: ISAPnP reports %s at i/o %#lx, irq %d.\n",
- (char *) isapnp_clone_list[i].driver_data,
- dev->base_addr, dev->irq);
- if (ne_probe1(dev, dev->base_addr) != 0) { /* Shouldn't happen. */
- printk(KERN_ERR "ne.c: Probe of ISAPnP card at %#lx failed.\n", dev->base_addr);
- pnp_device_detach(idev);
- return -ENXIO;
- }
- ei_status.priv = (unsigned long)idev;
- break;
- }
- if (!idev)
- continue;
- return 0;
+ pnp_set_drvdata(idev, dev);
+
+ return 0;
+
+register_fail:
+ kfree(dev->priv);
+ release_region(dev->base_addr, NE_IO_EXTENT);
+probe_fail:
+ kfree(dev);
+alloc_fail:
+ return err;
+}
+
+static void ne_pnp_remove(struct pnp_dev *idev)
+{
+ struct net_device *dev = pnp_get_drvdata(idev);
+ if (dev) {
+ unregister_netdev(dev);
+ free_irq(dev->irq, dev);
+ release_region(dev->base_addr, NE_IO_EXTENT);
+ kfree(dev->priv);
+ kfree(dev);
}
-
- return -ENODEV;
}
+#endif
static int __init ne_probe1(struct net_device *dev, int ioaddr)
{
@@ -273,7 +285,7 @@
}
if (ei_debug && version_printed++ == 0)
- printk(KERN_INFO "%s" KERN_INFO "%s", version1, version2);
+ printk(KERN_INFO "%s", version);
printk(KERN_INFO "NE*000 ethercard probe at %#3x:", ioaddr);
@@ -757,6 +769,13 @@
{
int this_dev, found = 0;
+#ifdef CONFIG_PNP
+ found = pnp_register_driver(&ne_pnp_driver);
+ if (found < 0) {
+ return found;
+ }
+#endif
+
for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
struct net_device *dev = &dev_ne[this_dev];
dev->irq = irq[this_dev];
@@ -774,6 +793,9 @@
printk(KERN_WARNING "ne.c: No NE*000 card found at i/o = %#x\n", io[this_dev]);
else
printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n");
+#ifdef CONFIG_PNP
+ pnp_unregister_driver(&ne_pnp_driver);
+#endif
return -ENXIO;
}
return 0;
@@ -783,17 +805,16 @@
{
int this_dev;
+#ifdef CONFIG_PNP
+ pnp_unregister_driver(&ne_pnp_driver);
+#endif
for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
struct net_device *dev = &dev_ne[this_dev];
if (dev->priv != NULL) {
- void *priv = dev->priv;
- struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
- if (idev)
- pnp_device_detach(idev);
+ unregister_netdev(dev);
free_irq(dev->irq, dev);
release_region(dev->base_addr, NE_IO_EXTENT);
- unregister_netdev(dev);
- kfree(priv);
+ kfree(dev->priv);
}
}
}
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 2/3] NE2000 driver updates
2003-04-01 18:32 [PATCH 0/3] NE2000 driver updates Jeff Muizelaar
2003-04-01 18:33 ` [PATCH 1/3] " Jeff Muizelaar
@ 2003-04-01 18:34 ` Jeff Muizelaar
2003-04-01 18:35 ` [PATCH 3/3] " Jeff Muizelaar
2 siblings, 0 replies; 4+ messages in thread
From: Jeff Muizelaar @ 2003-04-01 18:34 UTC (permalink / raw)
To: Linux Kernel Mailing List; +Cc: Jeff Garzik
[-- Attachment #1: Type: text/plain, Size: 1 bytes --]
[-- Attachment #2: ne-pnp-id.patch --]
[-- Type: text/plain, Size: 679 bytes --]
--- linux-2.5.66-nepnp/drivers/net/ne.c 2003-03-29 21:39:17.000000000 -0500
+++ linux-2.5.66-nepnpid/drivers/net/ne.c 2003-03-29 21:39:29.000000000 -0500
@@ -81,8 +81,16 @@
{.id = "AXE2011", .driver_data = 0},
/* NN NE2000 */
{.id = "EDI0216", .driver_data = 0},
+ /* Novell/Anthem NE1000 */
+ {.id = "PNP80d3", .driver_data = 0},
+ /* Novell/Anthem NE2000 */
+ {.id = "PNP80d4", .driver_data = 0},
+ /* NE1000 Compatible */
+ {.id = "PNP80d5", .driver_data = 0},
/* NE2000 Compatible */
{.id = "PNP80d6", .driver_data = 0},
+ /* National Semiconductor AT/LANTIC EtherNODE 16-AT3 */
+ {.id = "PNP8160", .driver_data = 0},
};
MODULE_DEVICE_TABLE(pnp, ne_pnp_table);
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 3/3] NE2000 driver updates
2003-04-01 18:32 [PATCH 0/3] NE2000 driver updates Jeff Muizelaar
2003-04-01 18:33 ` [PATCH 1/3] " Jeff Muizelaar
2003-04-01 18:34 ` [PATCH 2/3] " Jeff Muizelaar
@ 2003-04-01 18:35 ` Jeff Muizelaar
2 siblings, 0 replies; 4+ messages in thread
From: Jeff Muizelaar @ 2003-04-01 18:35 UTC (permalink / raw)
To: Linux Kernel Mailing List; +Cc: Jeff Garzik
[-- Attachment #1: Type: text/plain, Size: 1 bytes --]
[-- Attachment #2: ne-legacy.patch --]
[-- Type: text/plain, Size: 8578 bytes --]
diff -u linux-2.5.66-nepnpid/drivers/net/ne.c linux-2.5.66-nelist/drivers/net/ne.c
--- linux-2.5.66-nepnpid/drivers/net/ne.c 2003-03-29 21:39:29.000000000 -0500
+++ linux-2.5.66-nelist/drivers/net/ne.c 2003-03-29 21:39:38.000000000 -0500
@@ -36,7 +36,7 @@
/* Routines for the NatSemi-based designs (NE[12]000). */
static const char version[] =
-"ne.c:v1.10a 1/26/03 Donald Becker (becker@scyld.com)\n";
+"ne.c:v1.10b 4/1/03 Donald Becker (becker@scyld.com)\n";
#include <linux/module.h>
@@ -134,7 +134,6 @@
#ifdef CONFIG_PNP
static int ne_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id);
static void ne_pnp_remove(struct pnp_dev *dev);
-
static struct pnp_driver ne_pnp_driver = {
.name = "ne",
.id_table = ne_pnp_table,
@@ -143,9 +142,14 @@
};
#endif
-int ne_probe(struct net_device *dev);
+static int ne_legacy_probe(unsigned long base_addr, unsigned long irq, unsigned long bad);
+
static int ne_probe1(struct net_device *dev, int ioaddr);
+static int ne_create(struct net_device **ndev, unsigned long base_addr,
+ unsigned long irq, unsigned long bad);
+static void ne_remove(struct net_device *dev);
+
static int ne_open(struct net_device *dev);
static int ne_close(struct net_device *dev);
@@ -179,82 +183,90 @@
E2010 starts at 0x100 and ends at 0x4000.
E2010-x starts at 0x100 and ends at 0xffff. */
-int __init ne_probe(struct net_device *dev)
+#ifdef CONFIG_PNP
+static int ne_pnp_probe(struct pnp_dev *idev, const struct pnp_device_id *dev_id)
{
- unsigned int base_addr = dev->base_addr;
-
- SET_MODULE_OWNER(dev);
-
- /* First check any supplied i/o locations. User knows best. <cough> */
- if (base_addr > 0x1ff) /* Check a single specified location. */
- return ne_probe1(dev, base_addr);
- else if (base_addr != 0) /* Don't probe at all. */
- return -ENXIO;
+ struct net_device *dev = NULL;
+ int err;
+ printk(KERN_INFO "ne.c: PnP reports %s at i/o %#lx, irq %ld\n",
+ idev->dev.name, pnp_port_start(idev, 0), pnp_irq(idev, 0));
+ err = ne_create(&dev, pnp_port_start(idev, 0), pnp_irq(idev, 0), 0);
+ if(dev)
+ pnp_set_drvdata(idev, dev);
+ return err;
+}
-#ifndef MODULE
- /* Last resort. The semi-risky ISA auto-probe. */
- for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
- int ioaddr = netcard_portlist[base_addr];
- if (ne_probe1(dev, ioaddr) == 0)
- return 0;
- }
+static void ne_pnp_remove(struct pnp_dev *idev)
+{
+ struct net_device *dev = pnp_get_drvdata(idev);
+ ne_remove(dev);
+}
#endif
+struct list_head ne_legacy_devs = LIST_HEAD_INIT(ne_legacy_devs);
- return -ENODEV;
+struct ne_legacy{
+ struct net_device *dev;
+ struct list_head list;
+};
+
+static int ne_legacy_probe(unsigned long base_addr, unsigned long irq, unsigned long bad)
+{
+ struct ne_legacy *ne_card;
+ int err;
+ ne_card = kmalloc(sizeof(struct ne_legacy), GFP_KERNEL);
+ err = ne_create(&ne_card->dev, base_addr, irq, bad);
+ if (!err)
+ list_add(&ne_card->list, &ne_legacy_devs);
+ else
+ kfree(ne_card);
+ return err;
}
-#ifdef CONFIG_PNP
-static int ne_pnp_probe(struct pnp_dev *idev, const struct pnp_device_id *dev_id)
+static int ne_create(struct net_device **ndev, unsigned long base_addr, unsigned long irq, unsigned long bad)
{
- struct net_device *dev;
int err;
- if ( !(dev = alloc_etherdev(0)) ){
+ if (!(*ndev = alloc_etherdev(0)) ){
err = -ENOMEM;
goto alloc_fail;
}
- dev->base_addr = pnp_port_start(idev, 0);
- dev->irq = pnp_irq(idev, 0);
- printk(KERN_INFO "ne.c: PnP reports %s at i/o %#lx, irq %d\n",
- idev->dev.name, dev->base_addr, dev->irq);
+ (*ndev)->base_addr = base_addr;
+ (*ndev)->irq = irq;
+ (*ndev)->mem_end = bad;
+ SET_MODULE_OWNER(*ndev);
- SET_MODULE_OWNER(dev);
-
- if (ne_probe1(dev, dev->base_addr) != 0) { /* Shouldn't happen. */
- printk(KERN_ERR "ne.c: Probe of PnP card at %#lx failed\n", dev->base_addr);
+ if (ne_probe1(*ndev, (*ndev)->base_addr) != 0) { /* Shouldn't happen. */
+ printk(KERN_ERR "ne.c: Probe at %#lx failed\n", (*ndev)->base_addr);
err = -ENXIO;
goto probe_fail;
}
- if ( (err = register_netdev(dev)) != 0)
+ if ( (err = register_netdev(*ndev)) != 0)
goto register_fail;
-
- pnp_set_drvdata(idev, dev);
return 0;
register_fail:
- kfree(dev->priv);
- release_region(dev->base_addr, NE_IO_EXTENT);
+ kfree((*ndev)->priv);
+ release_region((*ndev)->base_addr, NE_IO_EXTENT);
probe_fail:
- kfree(dev);
+ kfree(*ndev);
alloc_fail:
return err;
}
-static void ne_pnp_remove(struct pnp_dev *idev)
+static void ne_remove(struct net_device *dev)
{
- struct net_device *dev = pnp_get_drvdata(idev);
if (dev) {
unregister_netdev(dev);
free_irq(dev->irq, dev);
release_region(dev->base_addr, NE_IO_EXTENT);
- kfree(dev->priv);
+ if(dev->priv)
+ kfree(dev->priv);
kfree(dev);
}
}
-#endif
static int __init ne_probe1(struct net_device *dev, int ioaddr)
{
@@ -751,10 +763,7 @@
return;
}
-\f
-#ifdef MODULE
#define MAX_NE_CARDS 4 /* Max number of NE cards per module */
-static struct net_device dev_ne[MAX_NE_CARDS];
static int io[MAX_NE_CARDS];
static int irq[MAX_NE_CARDS];
static int bad[MAX_NE_CARDS]; /* 0xbad = bad sig or no reset ack */
@@ -773,60 +782,71 @@
is at boot) and so the probe will get confused by any other 8390 cards.
ISA device autoprobes on a running machine are not recommended anyway. */
-int init_module(void)
-{
- int this_dev, found = 0;
+
+static int __init ne_init(void)
+{
+ int i, found = 0;
+ int err;
#ifdef CONFIG_PNP
- found = pnp_register_driver(&ne_pnp_driver);
- if (found < 0) {
- return found;
+ err = pnp_register_driver(&ne_pnp_driver);
+ if (err < 0) {
+ goto pnp_fail;
}
+ else found += err;
#endif
+ /* First check any supplied i/o locations. User knows best. <cough> */
+ for (i = 0; i < MAX_NE_CARDS; i++) {
+ if (io[i] > 0x1ff) {
+ err = ne_legacy_probe(io[i], irq[i], bad[i]);
+ if (!err)
+ found++;
+ else
+ printk(KERN_WARNING "ne.c: No NE*000 card found at i/o = %#x\n", io[i]);
+ }
+ }
- for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
- struct net_device *dev = &dev_ne[this_dev];
- dev->irq = irq[this_dev];
- dev->mem_end = bad[this_dev];
- dev->base_addr = io[this_dev];
- dev->init = ne_probe;
- if (register_netdev(dev) == 0) {
+#ifndef MODULE
+ /* Last resort. The semi-risky ISA auto-probe. */
+ printk(KERN_INFO "ne.c: auto-probing...\m");
+ for (i = 0; netcard_portlist[i] != 0; i++) {
+ err = ne_legacy_probe(netcard_portlist[i], 0, 0);
+ if (!err) {
found++;
- continue;
- }
- if (found != 0) { /* Got at least one. */
- return 0;
- }
- if (io[this_dev] != 0)
- printk(KERN_WARNING "ne.c: No NE*000 card found at i/o = %#x\n", io[this_dev]);
- else
- printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n");
+ }
+ }
+#endif
+ if (found > 0) /* Got at least one. */
+ return 0;
+ else
+ printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n");
+
#ifdef CONFIG_PNP
- pnp_unregister_driver(&ne_pnp_driver);
+ pnp_unregister_driver(&ne_pnp_driver);
+pnp_fail:
#endif
- return -ENXIO;
- }
- return 0;
+ return -ENODEV;
}
-void cleanup_module(void)
+static void __exit ne_cleanup(void)
{
- int this_dev;
-
+ struct list_head *entry;
+ struct list_head *tmp;
#ifdef CONFIG_PNP
pnp_unregister_driver(&ne_pnp_driver);
#endif
- for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
- struct net_device *dev = &dev_ne[this_dev];
- if (dev->priv != NULL) {
- unregister_netdev(dev);
- free_irq(dev->irq, dev);
- release_region(dev->base_addr, NE_IO_EXTENT);
- kfree(dev->priv);
- }
+ /* Cleanup legacy devices */
+ list_for_each_safe(entry, tmp, &ne_legacy_devs) {
+ struct ne_legacy *card;
+ card = list_entry(entry, struct ne_legacy, list);
+ ne_remove(card->dev);
+ list_del(entry);
+ kfree(card);
}
}
-#endif /* MODULE */
+
+module_init(ne_init);
+module_exit(ne_cleanup);
\f
/*
diff -u linux-2.5.66-nepnpid/drivers/net/Space.c linux-2.5.66-nelist/drivers/net/Space.c
--- linux-2.5.66-nepnpid/drivers/net/Space.c 2003-04-01 12:54:54.000000000 -0500
+++ linux-2.5.66-nelist/drivers/net/Space.c 2003-04-01 12:53:40.000000000 -0500
@@ -233,7 +233,7 @@
#ifdef CONFIG_E2100 /* Cabletron E21xx series. */
{e2100_probe, 0},
#endif
-#if defined(CONFIG_NE2000) || defined(CONFIG_NE2K_CBUS) /* ISA & PC-9800 CBUS (use ne2k-pci for PCI cards) */
+#ifdef CONFIG_NE2K_CBUS /* ISA & PC-9800 CBUS (use ne2k-pci for PCI cards) */
{ne_probe, 0},
#endif
#ifdef CONFIG_LANCE /* ISA/VLB (use pcnet32 for PCI cards) */
^ permalink raw reply [flat|nested] 4+ messages in thread