summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Viro <viro@parcelfarce.linux.theplanet.co.uk>2003-06-02 06:31:36 -0700
committerDavid S. Miller <davem@nuts.ninka.net>2003-06-02 06:31:36 -0700
commit730986600982e5361328b86da8700d290edd5ffe (patch)
tree046d8c37d9af6ae011069775f349dab9eb08f976
parentaa5e76829cab3a0c663f8d59d64b81a4c3a40962 (diff)
[NET]: Convert most tokenring drivers away from {init,register,unregister}_trdev, only ibmtr remains.
-rw-r--r--drivers/net/tokenring/3c359.c4
-rw-r--r--drivers/net/tokenring/abyss.c11
-rw-r--r--drivers/net/tokenring/lanstreamer.c338
-rw-r--r--drivers/net/tokenring/madgemc.c33
-rw-r--r--drivers/net/tokenring/olympic.c2
-rw-r--r--drivers/net/tokenring/proteon.c169
-rw-r--r--drivers/net/tokenring/skisa.c169
-rw-r--r--drivers/net/tokenring/smctr.c203
-rw-r--r--drivers/net/tokenring/tmspci.c10
-rw-r--r--drivers/s390/net/lcs.c20
-rw-r--r--net/atm/lec.c7
11 files changed, 430 insertions, 536 deletions
diff --git a/drivers/net/tokenring/3c359.c b/drivers/net/tokenring/3c359.c
index 0fad37ef5c38..7e4d08b41fc4 100644
--- a/drivers/net/tokenring/3c359.c
+++ b/drivers/net/tokenring/3c359.c
@@ -1129,7 +1129,7 @@ static irqreturn_t xl_interrupt(int irq, void *dev_id, struct pt_regs *regs)
netif_stop_queue(dev) ;
xl_freemem(dev) ;
free_irq(dev->irq,dev);
- unregister_trdev(dev) ;
+ unregister_netdev(dev) ;
kfree(dev) ;
xl_reset(dev) ;
writel(ACK_INTERRUPT | LATCH_ACK, xl_mmio + MMIO_COMMAND) ;
@@ -1783,7 +1783,7 @@ static void __devexit xl_remove_one (struct pci_dev *pdev)
struct net_device *dev = pci_get_drvdata(pdev);
struct xl_private *xl_priv=(struct xl_private *)dev->priv;
- unregister_trdev(dev);
+ unregister_netdev(dev);
iounmap(xl_priv->xl_mmio) ;
pci_release_regions(pdev) ;
pci_set_drvdata(pdev,NULL) ;
diff --git a/drivers/net/tokenring/abyss.c b/drivers/net/tokenring/abyss.c
index 0bda7e8225b9..1ff4bdb4d6ff 100644
--- a/drivers/net/tokenring/abyss.c
+++ b/drivers/net/tokenring/abyss.c
@@ -112,9 +112,10 @@ static int __init abyss_attach(struct pci_dev *pdev, const struct pci_device_id
/* At this point we have found a valid card. */
- dev = init_trdev(NULL, 0);
+ dev = alloc_trdev(0);
if (!dev)
return -ENOMEM;
+
SET_MODULE_OWNER(dev);
if (!request_region(pci_ioaddr, ABYSS_IO_EXTENT, dev->name)) {
@@ -165,21 +166,21 @@ static int __init abyss_attach(struct pci_dev *pdev, const struct pci_device_id
dev->open = abyss_open;
dev->stop = abyss_close;
- ret = register_trdev(dev);
+ pci_set_drvdata(pdev, dev);
+
+ ret = register_netdev(dev);
if (ret)
goto err_out_tmsdev;
-
- pci_set_drvdata(pdev, dev);
return 0;
err_out_tmsdev:
+ pci_set_drvdata(pdev, NULL);
tmsdev_term(dev);
err_out_irq:
free_irq(pdev->irq, dev);
err_out_region:
release_region(pci_ioaddr, ABYSS_IO_EXTENT);
err_out_trdev:
- unregister_netdev(dev);
kfree(dev);
return ret;
}
diff --git a/drivers/net/tokenring/lanstreamer.c b/drivers/net/tokenring/lanstreamer.c
index d74cb55dc3d9..01bd5daa2386 100644
--- a/drivers/net/tokenring/lanstreamer.c
+++ b/drivers/net/tokenring/lanstreamer.c
@@ -221,213 +221,217 @@ struct streamer_private *dev_streamer=NULL;
static int __devinit streamer_init_one(struct pci_dev *pdev,
const struct pci_device_id *ent)
{
- struct net_device *dev=NULL;
+ struct net_device *dev;
struct streamer_private *streamer_priv;
- __u32 pio_start, pio_end, pio_flags, pio_len;
- __u32 mmio_start, mmio_end, mmio_flags, mmio_len;
- int rc=0;
- static int card_no=-1;
- u16 pcr;
- u8 cls = 0;
+ __u32 pio_start, pio_end, pio_flags, pio_len;
+ __u32 mmio_start, mmio_end, mmio_flags, mmio_len;
+ int rc = 0;
+ static int card_no=-1;
+ u16 pcr;
+ u8 cls = 0;
#if STREAMER_DEBUG
- printk("lanstreamer::streamer_init_one, entry pdev %p\n",pdev);
+ printk("lanstreamer::streamer_init_one, entry pdev %p\n",pdev);
#endif
- card_no++;
- dev=init_trdev(dev, sizeof(*streamer_priv));
- if(dev==NULL) {
- printk(KERN_ERR "lanstreamer: out of memory.\n");
- return -ENOMEM;
- }
- SET_MODULE_OWNER(dev);
- streamer_priv=dev->priv;
+ card_no++;
+ dev = alloc_trdev(sizeof(*streamer_priv));
+ if (dev==NULL) {
+ printk(KERN_ERR "lanstreamer: out of memory.\n");
+ return -ENOMEM;
+ }
+
+ SET_MODULE_OWNER(dev);
+ streamer_priv = dev->priv;
#if STREAMER_NETWORK_MONITOR
#ifdef CONFIG_PROC_FS
- if (!dev_streamer) {
- create_proc_read_entry("net/streamer_tr",0,0,streamer_proc_info,NULL);
- }
- streamer_priv->next=dev_streamer;
- dev_streamer=streamer_priv;
+ if (!dev_streamer)
+ create_proc_read_entry("net/streamer_tr", 0, 0,
+ streamer_proc_info, NULL);
+ streamer_priv->next = dev_streamer;
+ dev_streamer = streamer_priv;
#endif
#endif
-
- if(pci_set_dma_mask(pdev, 0xFFFFFFFF)) {
- printk(KERN_ERR "%s: No suitable PCI mapping available.\n", dev->name);
- rc = -ENODEV;
- goto err_out;
- }
-
- if (pci_enable_device(pdev)) {
- printk(KERN_ERR "lanstreamer: unable to enable pci device\n");
- rc=-EIO;
- goto err_out;
- }
-
- pci_set_master(pdev);
-
- pio_start = pci_resource_start(pdev, 0);
- pio_end = pci_resource_end(pdev, 0);
- pio_flags = pci_resource_flags(pdev, 0);
- pio_len = pci_resource_len(pdev, 0);
-
- mmio_start = pci_resource_start(pdev, 1);
- mmio_end = pci_resource_end(pdev, 1);
- mmio_flags = pci_resource_flags(pdev, 1);
- mmio_len = pci_resource_len(pdev, 1);
-
+
+ if (pci_set_dma_mask(pdev, 0xFFFFFFFF)) {
+ printk(KERN_ERR "%s: No suitable PCI mapping available.\n",
+ dev->name);
+ rc = -ENODEV;
+ goto err_out;
+ }
+
+ if (pci_enable_device(pdev)) {
+ printk(KERN_ERR "lanstreamer: unable to enable pci device\n");
+ rc=-EIO;
+ goto err_out;
+ }
+
+ pci_set_master(pdev);
+
+ pio_start = pci_resource_start(pdev, 0);
+ pio_end = pci_resource_end(pdev, 0);
+ pio_flags = pci_resource_flags(pdev, 0);
+ pio_len = pci_resource_len(pdev, 0);
+
+ mmio_start = pci_resource_start(pdev, 1);
+ mmio_end = pci_resource_end(pdev, 1);
+ mmio_flags = pci_resource_flags(pdev, 1);
+ mmio_len = pci_resource_len(pdev, 1);
+
#if STREAMER_DEBUG
- printk("lanstreamer: pio_start %x pio_end %x pio_len %x pio_flags %x\n",
- pio_start, pio_end, pio_len, pio_flags);
- printk("lanstreamer: mmio_start %x mmio_end %x mmio_len %x mmio_flags %x\n",
- mmio_start, mmio_end, mmio_flags, mmio_len);
+ printk("lanstreamer: pio_start %x pio_end %x pio_len %x pio_flags %x\n",
+ pio_start, pio_end, pio_len, pio_flags);
+ printk("lanstreamer: mmio_start %x mmio_end %x mmio_len %x mmio_flags %x\n",
+ mmio_start, mmio_end, mmio_flags, mmio_len);
#endif
- if (!request_region(pio_start, pio_len, "lanstreamer")) {
- printk(KERN_ERR "lanstreamer: unable to get pci io addr %x\n",pio_start);
- rc= -EBUSY;
- goto err_out;
- }
-
- if (!request_mem_region(mmio_start, mmio_len, "lanstreamer")) {
- printk(KERN_ERR "lanstreamer: unable to get pci mmio addr %x\n",mmio_start);
- rc= -EBUSY;
- goto err_out_free_pio;
- }
-
- streamer_priv->streamer_mmio=ioremap(mmio_start, mmio_len);
- if (streamer_priv->streamer_mmio == NULL) {
- printk(KERN_ERR "lanstreamer: unable to remap MMIO %x\n",mmio_start);
- rc= -EIO;
- goto err_out_free_mmio;
- }
+ if (!request_region(pio_start, pio_len, "lanstreamer")) {
+ printk(KERN_ERR "lanstreamer: unable to get pci io addr %x\n",
+ pio_start);
+ rc= -EBUSY;
+ goto err_out;
+ }
- init_waitqueue_head(&streamer_priv->srb_wait);
- init_waitqueue_head(&streamer_priv->trb_wait);
+ if (!request_mem_region(mmio_start, mmio_len, "lanstreamer")) {
+ printk(KERN_ERR "lanstreamer: unable to get pci mmio addr %x\n",
+ mmio_start);
+ rc= -EBUSY;
+ goto err_out_free_pio;
+ }
+
+ streamer_priv->streamer_mmio=ioremap(mmio_start, mmio_len);
+ if (streamer_priv->streamer_mmio == NULL) {
+ printk(KERN_ERR "lanstreamer: unable to remap MMIO %x\n",
+ mmio_start);
+ rc= -EIO;
+ goto err_out_free_mmio;
+ }
- dev->open = &streamer_open;
- dev->hard_start_xmit = &streamer_xmit;
- dev->change_mtu = &streamer_change_mtu;
- dev->stop = &streamer_close;
+ init_waitqueue_head(&streamer_priv->srb_wait);
+ init_waitqueue_head(&streamer_priv->trb_wait);
+
+ dev->open = &streamer_open;
+ dev->hard_start_xmit = &streamer_xmit;
+ dev->change_mtu = &streamer_change_mtu;
+ dev->stop = &streamer_close;
#if STREAMER_IOCTL
- dev->do_ioctl = &streamer_ioctl;
+ dev->do_ioctl = &streamer_ioctl;
#else
- dev->do_ioctl = NULL;
+ dev->do_ioctl = NULL;
#endif
- dev->set_multicast_list = &streamer_set_rx_mode;
- dev->get_stats = &streamer_get_stats;
- dev->set_mac_address = &streamer_set_mac_address;
- dev->irq = pdev->irq;
- dev->base_addr=pio_start;
-
- streamer_priv->streamer_card_name = (char *)pdev->resource[0].name;
- streamer_priv->pci_dev=pdev;
-
- if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000))
- streamer_priv->pkt_buf_sz = PKT_BUF_SZ;
- else
- streamer_priv->pkt_buf_sz = pkt_buf_sz[card_no];
-
- streamer_priv->streamer_ring_speed = ringspeed[card_no];
- streamer_priv->streamer_message_level = message_level[card_no];
+ dev->set_multicast_list = &streamer_set_rx_mode;
+ dev->get_stats = &streamer_get_stats;
+ dev->set_mac_address = &streamer_set_mac_address;
+ dev->irq = pdev->irq;
+ dev->base_addr=pio_start;
- pci_set_drvdata(pdev, dev);
+ streamer_priv->streamer_card_name = (char *)pdev->resource[0].name;
+ streamer_priv->pci_dev = pdev;
- spin_lock_init(&streamer_priv->streamer_lock);
-
- pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cls);
- cls <<= 2;
- if (cls != SMP_CACHE_BYTES) {
- printk(KERN_INFO " PCI cache line size set incorrectly "
- "(%i bytes) by BIOS/FW, ", cls);
- if (cls > SMP_CACHE_BYTES)
- printk("expecting %i\n", SMP_CACHE_BYTES);
- else {
- printk("correcting to %i\n", SMP_CACHE_BYTES);
- pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE,
- SMP_CACHE_BYTES >> 2);
- }
- }
-
- pci_read_config_word (pdev, PCI_COMMAND, &pcr);
-
- pcr |= (PCI_COMMAND_INVALIDATE | PCI_COMMAND_SERR);
-
- pci_write_config_word (pdev, PCI_COMMAND, pcr);
- pci_read_config_word (pdev, PCI_COMMAND, &pcr);
-
- printk("%s \n", version);
- printk("%s: %s. I/O at %hx, MMIO at %p, using irq %d\n",dev->name,
- streamer_priv->streamer_card_name,
- (unsigned int) dev->base_addr,
- streamer_priv->streamer_mmio,
- dev->irq);
-
- if (!streamer_reset(dev)) {
- return 0;
- }
-
- iounmap(streamer_priv->streamer_mmio);
+ if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000))
+ streamer_priv->pkt_buf_sz = PKT_BUF_SZ;
+ else
+ streamer_priv->pkt_buf_sz = pkt_buf_sz[card_no];
+
+ streamer_priv->streamer_ring_speed = ringspeed[card_no];
+ streamer_priv->streamer_message_level = message_level[card_no];
+
+ pci_set_drvdata(pdev, dev);
+
+ spin_lock_init(&streamer_priv->streamer_lock);
+
+ pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cls);
+ cls <<= 2;
+ if (cls != SMP_CACHE_BYTES) {
+ printk(KERN_INFO " PCI cache line size set incorrectly "
+ "(%i bytes) by BIOS/FW, ", cls);
+ if (cls > SMP_CACHE_BYTES)
+ printk("expecting %i\n", SMP_CACHE_BYTES);
+ else {
+ printk("correcting to %i\n", SMP_CACHE_BYTES);
+ pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE,
+ SMP_CACHE_BYTES >> 2);
+ }
+ }
+
+ pci_read_config_word (pdev, PCI_COMMAND, &pcr);
+
+ pcr |= (PCI_COMMAND_INVALIDATE | PCI_COMMAND_SERR);
+
+ pci_write_config_word (pdev, PCI_COMMAND, pcr);
+ pci_read_config_word (pdev, PCI_COMMAND, &pcr);
+
+ printk("%s \n", version);
+ printk("%s: %s. I/O at %hx, MMIO at %p, using irq %d\n",dev->name,
+ streamer_priv->streamer_card_name,
+ (unsigned int) dev->base_addr,
+ streamer_priv->streamer_mmio,
+ dev->irq);
+
+ if (streamer_reset(dev))
+ goto err_out_unmap;
+
+ rc = register_netdev(dev);
+ if (rc)
+ goto err_out_unmap;
+ return 0;
+
+err_out_unmap;
+ iounmap(streamer_priv->streamer_mmio);
err_out_free_mmio:
- release_mem_region(mmio_start, mmio_len);
+ release_mem_region(mmio_start, mmio_len);
err_out_free_pio:
- release_region(pio_start, pio_len);
+ release_region(pio_start, pio_len);
err_out:
- unregister_trdev(dev);
- kfree(dev);
+ kfree(dev);
#if STREAMER_DEBUG
- printk("lanstreamer: Exit error %x\n",rc);
+ printk("lanstreamer: Exit error %x\n",rc);
#endif
- return rc;
+ return rc;
}
-static void __devexit streamer_remove_one(struct pci_dev *pdev) {
- struct net_device *dev=pci_get_drvdata(pdev);
- struct streamer_private *streamer_priv;
+static void __devexit streamer_remove_one(struct pci_dev *pdev)
+{
+ struct net_device *dev=pci_get_drvdata(pdev);
+ struct streamer_private **p = &dev_streamer, **next;
+ struct streamer_private *streamer_priv;
#if STREAMER_DEBUG
- printk("lanstreamer::streamer_remove_one entry pdev %p\n",pdev);
+ printk("lanstreamer::streamer_remove_one entry pdev %p\n",pdev);
#endif
- if (dev == NULL) {
- printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev is NULL\n");
- return;
- }
+ if (dev == NULL) {
+ printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev is NULL\n");
+ return;
+ }
- streamer_priv=dev->priv;
- if (streamer_priv == NULL) {
- printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev->priv is NULL\n");
- return;
+ streamer_priv=dev->priv;
+ if (streamer_priv == NULL) {
+ printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev->priv is NULL\n");
+ return;
}
#if STREAMER_NETWORK_MONITOR
#ifdef CONFIG_PROC_FS
- {
- struct streamer_private *slast;
- struct streamer_private *scurrent;
- if (streamer_priv == dev_streamer) {
- dev_streamer=dev_streamer->next;
- } else {
- for(slast=scurrent=dev_streamer; dev_streamer; slast=scurrent, scurrent=scurrent->next) {
- if (scurrent == streamer_priv) {
- slast->next=scurrent->next;
- break;
+ for (p = &dev_streamer; *p; p = next) {
+ next = &(*p)->next;
+ if (*p == streamer_priv) {
+ *p = *next;
+ break;
+ }
}
- }
- }
- if (!dev_streamer) {
- remove_proc_entry("net/streamer_tr", NULL);
- }
- }
+ if (!dev_streamer)
+ remove_proc_entry("net/streamer_tr", NULL);
#endif
#endif
- unregister_trdev(dev);
- release_region(pci_resource_start(pdev, 0), pci_resource_len(pdev,0));
- release_mem_region(pci_resource_start(pdev, 1), pci_resource_len(pdev,1));
- kfree(dev);
- pci_set_drvdata(pdev, NULL);
+ unregister_netdev(dev);
+ /* shouldn't we do iounmap here? */
+ release_region(pci_resource_start(pdev, 0), pci_resource_len(pdev,0));
+ release_mem_region(pci_resource_start(pdev, 1), pci_resource_len(pdev,1));
+ kfree(dev);
+ pci_set_drvdata(pdev, NULL);
}
diff --git a/drivers/net/tokenring/madgemc.c b/drivers/net/tokenring/madgemc.c
index f5f450bc46df..4849f5f62777 100644
--- a/drivers/net/tokenring/madgemc.c
+++ b/drivers/net/tokenring/madgemc.c
@@ -177,12 +177,14 @@ static int __init madgemc_probe(void)
if (versionprinted++ == 0)
printk("%s", version);
- if ((dev = init_trdev(NULL, 0))==NULL) {
+ dev = alloc_trdev(0);
+ if (dev == NULL) {
printk("madgemc: unable to allocate dev space\n");
if (madgemc_card_list)
return 0;
return -1;
}
+
SET_MODULE_OWNER(dev);
dev->dma = 0;
@@ -195,7 +197,7 @@ static int __init madgemc_probe(void)
card = kmalloc(sizeof(struct madgemc_card), GFP_KERNEL);
if (card==NULL) {
printk("madgemc: unable to allocate card struct\n");
- kfree(dev); /* release_trdev? */
+ kfree(dev);
if (madgemc_card_list)
return 0;
return -1;
@@ -331,7 +333,7 @@ static int __init madgemc_probe(void)
*/
outb(0, dev->base_addr + MC_CONTROL_REG0); /* sanity */
madgemc_setsifsel(dev, 1);
- if(request_irq(dev->irq, madgemc_interrupt, SA_SHIRQ,
+ if (request_irq(dev->irq, madgemc_interrupt, SA_SHIRQ,
"madgemc", dev))
goto getout;
@@ -382,33 +384,22 @@ static int __init madgemc_probe(void)
dev->open = madgemc_open;
dev->stop = madgemc_close;
-
- if (register_trdev(dev) == 0) {
+
+ if (register_netdev(dev) == 0) {
/* Enlist in the card list */
card->next = madgemc_card_list;
madgemc_card_list = card;
- } else {
- printk("madgemc: register_trdev() returned non-zero.\n");
- release_region(dev->base_addr-MADGEMC_SIF_OFFSET,
- MADGEMC_IO_EXTENT);
-
- kfree(card);
- tmsdev_term(dev);
- kfree(dev);
- if (madgemc_card_list)
- return 0;
- return -1;
+ slot++;
+ continue; /* successful, try to find another */
}
-
- slot++;
- continue; /* successful, try to find another */
+ free_irq(dev->irq, dev);
getout:
release_region(dev->base_addr-MADGEMC_SIF_OFFSET,
MADGEMC_IO_EXTENT);
getout1:
kfree(card);
- kfree(dev); /* release_trdev? */
+ kfree(dev);
slot++;
}
@@ -779,7 +770,7 @@ static void __exit madgemc_exit(void)
while (madgemc_card_list) {
dev = madgemc_card_list->dev;
- unregister_trdev(dev);
+ unregister_netdev(dev);
release_region(dev->base_addr-MADGEMC_SIF_OFFSET, MADGEMC_IO_EXTENT);
free_irq(dev->irq, dev);
tmsdev_term(dev);
diff --git a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c
index 04621be240e3..4a56a36c350c 100644
--- a/drivers/net/tokenring/olympic.c
+++ b/drivers/net/tokenring/olympic.c
@@ -1773,7 +1773,7 @@ static void __devexit olympic_remove_one(struct pci_dev *pdev)
strcat(proc_name,dev->name) ;
remove_proc_entry(proc_name,NULL);
}
- unregister_trdev(dev) ;
+ unregister_netdev(dev) ;
iounmap(olympic_priv->olympic_mmio) ;
iounmap(olympic_priv->olympic_lap) ;
pci_release_regions(pdev) ;
diff --git a/drivers/net/tokenring/proteon.c b/drivers/net/tokenring/proteon.c
index d95a4d3bfc35..b8b72687f2c1 100644
--- a/drivers/net/tokenring/proteon.c
+++ b/drivers/net/tokenring/proteon.c
@@ -121,6 +121,11 @@ int __init proteon_probe(struct net_device *dev)
int i,j;
struct proteon_card *card;
+#ifndef MODULE
+ netdev_boot_setup_check(dev);
+ tr_setup(dev);
+#endif
+
SET_MODULE_OWNER(dev);
if (!dev->base_addr)
{
@@ -158,20 +163,8 @@ int __init proteon_probe(struct net_device *dev)
if (versionprinted++ == 0)
printk(KERN_DEBUG "%s", version);
-#ifndef MODULE
- dev = init_trdev(dev, 0);
- if (!dev)
- {
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- return -1;
- }
-#endif
-
if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL))
- {
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- return -1;
- }
+ goto out4;
dev->base_addr &= ~3;
@@ -211,9 +204,7 @@ int __init proteon_probe(struct net_device *dev)
if(irqlist[j] == 0)
{
printk(KERN_INFO "%s: AutoSelect no IRQ available\n", dev->name);
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- tmsdev_term(dev);
- return -1;
+ goto out3;
}
}
else
@@ -225,18 +216,14 @@ int __init proteon_probe(struct net_device *dev)
{
printk(KERN_INFO "%s: Illegal IRQ %d specified\n",
dev->name, dev->irq);
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- tmsdev_term(dev);
- return -1;
+ goto out3;
}
if (request_irq(dev->irq, tms380tr_interrupt, 0,
cardname, dev))
{
printk(KERN_INFO "%s: Selected IRQ %d not available\n",
dev->name, dev->irq);
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- tmsdev_term(dev);
- return -1;
+ goto out3;
}
}
@@ -252,10 +239,7 @@ int __init proteon_probe(struct net_device *dev)
if(dmalist[j] == 0)
{
printk(KERN_INFO "%s: AutoSelect no DMA available\n", dev->name);
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- free_irq(dev->irq, dev);
- tmsdev_term(dev);
- return -1;
+ goto out2;
}
}
else
@@ -267,52 +251,36 @@ int __init proteon_probe(struct net_device *dev)
{
printk(KERN_INFO "%s: Illegal DMA %d specified\n",
dev->name, dev->dma);
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- free_irq(dev->irq, dev);
- tmsdev_term(dev);
- return -1;
+ goto out2;
}
if (request_dma(dev->dma, cardname))
{
printk(KERN_INFO "%s: Selected DMA %d not available\n",
dev->name, dev->dma);
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- free_irq(dev->irq, dev);
- tmsdev_term(dev);
- return -1;
+ goto out2;
}
}
printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n",
dev->name, dev->base_addr, dev->irq, dev->dma);
- if (register_trdev(dev) == 0)
- {
- /* Enlist in the card list */
- card = kmalloc(sizeof(struct proteon_card), GFP_KERNEL);
- if (!card) {
- unregister_trdev(dev);
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- free_irq(dev->irq, dev);
- free_dma(dev->dma);
- tmsdev_term(dev);
- return -1;
- }
- card->next = proteon_card_list;
- proteon_card_list = card;
- card->dev = dev;
- }
- else
- {
- printk("KERN_INFO %s: register_trdev() returned non-zero.\n", dev->name);
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- free_irq(dev->irq, dev);
- free_dma(dev->dma);
- tmsdev_term(dev);
- return -1;
- }
-
+ /* Enlist in the card list */
+ card = kmalloc(sizeof(struct proteon_card), GFP_KERNEL);
+ if (!card)
+ goto out;
+ card->next = proteon_card_list;
+ proteon_card_list = card;
+ card->dev = dev;
return 0;
+out:
+ free_dma(dev->dma);
+out2:
+ free_irq(dev->irq, dev);
+out3:
+ tmsdev_term(dev);
+out4:
+ release_region(dev->base_addr, PROTEON_IO_EXTENT);
+ return -1;
}
/*
@@ -402,64 +370,51 @@ MODULE_PARM(io, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
MODULE_PARM(irq, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
MODULE_PARM(dma, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
+static int __init setup_card(unsigned long io, unsigned irq, unsigned char dma)
+{
+ int res = -ENOMEM;
+ struct proteon_card *this_card;
+ struct net_device *dev = alloc_trdev(0);
+
+ if (dev) {
+ dev->base_addr = io;
+ dev->irq = irq;
+ dev->dma = dma;
+ res = -ENODEV;
+ if (proteon_probe(dev) == 0) {
+ res = register_netdev(dev);
+ if (!res)
+ return 0;
+ release_region(dev->base_addr, PROTEON_IO_EXTENT);
+ free_irq(dev->irq, dev);
+ free_dma(dev->dma);
+ tmsdev_term(dev);
+ this_card = proteon_card_list;
+ proteon_card_list = this_card->next;
+ kfree(this_card);
+ }
+ kfree(dev);
+ }
+ return res;
+}
+
int init_module(void)
{
int i, num;
struct net_device *dev;
num = 0;
- if (io[0])
- { /* Only probe addresses from command line */
- dev = init_trdev(NULL, 0);
- if (!dev)
- return (-ENOMEM);
- for (i = 0; i < ISATR_MAX_ADAPTERS; i++)
- {
- if (io[i] == 0)
- continue;
-
- dev->base_addr = io[i];
- dev->irq = irq[i];
- dev->dma = dma[i];
-
- if (!proteon_probe(dev))
- {
+ if (io[0]) { /* Only probe addresses from command line */
+ for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
+ if (io[i] && setup_card(io[i], irq[i], dma[i]) == 0)
num++;
- dev = init_trdev(NULL, 0);
- if (!dev)
- goto partial;
- }
}
- unregister_netdev(dev);
- kfree(dev);
- }
- else
- {
- dev = init_trdev(NULL, 0);
- if (!dev)
- return (-ENOMEM);
-
- for(i = 0; portlist[i]; i++)
- {
- if (num >= ISATR_MAX_ADAPTERS)
- continue;
-
- dev->base_addr = portlist[i];
- dev->irq = irq[num];
- dev->dma = dma[num];
-
- if (!proteon_probe(dev))
- {
+ } else {
+ for(i = 0; num < ISATR_MAX_ADAPTERS && portlist[i]; i++) {
+ if (setup_card(portlist[i], irq[i], dma[i]))
num++;
- dev = init_trdev(NULL, 0);
- if (!dev)
- goto partial;
- }
}
- unregister_netdev(dev);
- kfree(dev);
}
-partial:
printk(KERN_NOTICE "proteon.c: %d cards found.\n", num);
/* Probe for cards. */
if (num == 0) {
diff --git a/drivers/net/tokenring/skisa.c b/drivers/net/tokenring/skisa.c
index f54a8c2491d3..f414e8da25b2 100644
--- a/drivers/net/tokenring/skisa.c
+++ b/drivers/net/tokenring/skisa.c
@@ -141,6 +141,11 @@ int __init sk_isa_probe(struct net_device *dev)
int i,j;
struct sk_isa_card *card;
+#ifndef MODULE
+ netdev_boot_setup_check(dev);
+ tr_setup(dev);
+#endif
+
SET_MODULE_OWNER(dev);
if (!dev->base_addr)
{
@@ -178,20 +183,8 @@ int __init sk_isa_probe(struct net_device *dev)
if (versionprinted++ == 0)
printk(KERN_DEBUG "%s", version);
-#ifndef MODULE
- dev = init_trdev(dev, 0);
- if (!dev)
- {
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- return -1;
- }
-#endif
-
if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL))
- {
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- return -1;
- }
+ goto out4;
dev->base_addr &= ~3;
@@ -231,9 +224,7 @@ int __init sk_isa_probe(struct net_device *dev)
if(irqlist[j] == 0)
{
printk(KERN_INFO "%s: AutoSelect no IRQ available\n", dev->name);
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- tmsdev_term(dev);
- return -1;
+ goto out3;
}
}
else
@@ -245,18 +236,14 @@ int __init sk_isa_probe(struct net_device *dev)
{
printk(KERN_INFO "%s: Illegal IRQ %d specified\n",
dev->name, dev->irq);
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- tmsdev_term(dev);
- return -1;
+ goto out3;
}
if (request_irq(dev->irq, tms380tr_interrupt, 0,
isa_cardname, dev))
{
printk(KERN_INFO "%s: Selected IRQ %d not available\n",
dev->name, dev->irq);
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- tmsdev_term(dev);
- return -1;
+ goto out3;
}
}
@@ -272,10 +259,7 @@ int __init sk_isa_probe(struct net_device *dev)
if(dmalist[j] == 0)
{
printk(KERN_INFO "%s: AutoSelect no DMA available\n", dev->name);
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- free_irq(dev->irq, dev);
- tmsdev_term(dev);
- return -1;
+ goto out2;
}
}
else
@@ -287,52 +271,36 @@ int __init sk_isa_probe(struct net_device *dev)
{
printk(KERN_INFO "%s: Illegal DMA %d specified\n",
dev->name, dev->dma);
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- free_irq(dev->irq, dev);
- tmsdev_term(dev);
- return -1;
+ goto out2;
}
if (request_dma(dev->dma, isa_cardname))
{
printk(KERN_INFO "%s: Selected DMA %d not available\n",
dev->name, dev->dma);
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- free_irq(dev->irq, dev);
- tmsdev_term(dev);
- return -1;
+ goto out2;
}
}
printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n",
dev->name, dev->base_addr, dev->irq, dev->dma);
- if (register_trdev(dev) == 0)
- {
- /* Enlist in the card list */
- card = kmalloc(sizeof(struct sk_isa_card), GFP_KERNEL);
- if (!card) {
- unregister_trdev(dev);
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- free_irq(dev->irq, dev);
- free_dma(dev->dma);
- tmsdev_term(dev);
- return -1;
- }
- card->next = sk_isa_card_list;
- sk_isa_card_list = card;
- card->dev = dev;
- }
- else
- {
- printk("KERN_INFO %s: register_trdev() returned non-zero.\n", dev->name);
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- free_irq(dev->irq, dev);
- free_dma(dev->dma);
- tmsdev_term(dev);
- return -1;
- }
-
+ /* Enlist in the card list */
+ card = kmalloc(sizeof(struct sk_isa_card), GFP_KERNEL);
+ if (!card)
+ goto out;
+ card->next = sk_isa_card_list;
+ sk_isa_card_list = card;
+ card->dev = dev;
return 0;
+out:
+ free_dma(dev->dma);
+out2:
+ free_irq(dev->irq, dev);
+out3:
+ tmsdev_term(dev);
+out4:
+ release_region(dev->base_addr, SK_ISA_IO_EXTENT);
+ return -1;
}
/*
@@ -415,64 +383,51 @@ MODULE_PARM(io, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
MODULE_PARM(irq, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
MODULE_PARM(dma, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
+static int __init setup_card(unsigned long io, unsigned irq, unsigned char dma)
+{
+ int res = -ENOMEM;
+ struct sk_isa_card *this_card;
+ struct net_device *dev = alloc_trdev(0);
+
+ if (dev) {
+ dev->base_addr = io;
+ dev->irq = irq;
+ dev->dma = dma;
+ res = -ENODEV;
+ if (sk_isa_probe(dev) == 0) {
+ res = register_netdev(dev);
+ if (!res)
+ return 0;
+ release_region(dev->base_addr, SK_ISA_IO_EXTENT);
+ free_irq(dev->irq, dev);
+ free_dma(dev->dma);
+ tmsdev_term(dev);
+ this_card = sk_isa_card_list;
+ sk_isa_card_list = this_card->next;
+ kfree(this_card);
+ }
+ kfree(dev);
+ }
+ return res;
+}
+
int init_module(void)
{
int i, num;
struct net_device *dev;
num = 0;
- if (io[0])
- { /* Only probe addresses from command line */
- dev = init_trdev(NULL, 0);
- if (!dev)
- return (-ENOMEM);
- for (i = 0; i < ISATR_MAX_ADAPTERS; i++)
- {
- if (io[i] == 0)
- continue;
-
- dev->base_addr = io[i];
- dev->irq = irq[i];
- dev->dma = dma[i];
-
- if (!sk_isa_probe(dev))
- {
+ if (io[0]) { /* Only probe addresses from command line */
+ for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
+ if (io[i] && setup_card(io[i], irq[i], dma[i]) == 0)
num++;
- dev = init_trdev(NULL, 0);
- if (!dev)
- goto partial;
- }
}
- unregister_netdev(dev);
- kfree(dev);
- }
- else
- {
- dev = init_trdev(NULL, 0);
- if (!dev)
- return (-ENOMEM);
-
- for(i = 0; portlist[i]; i++)
- {
- if (num >= ISATR_MAX_ADAPTERS)
- continue;
-
- dev->base_addr = portlist[i];
- dev->irq = irq[num];
- dev->dma = dma[num];
-
- if (!sk_isa_probe(dev))
- {
+ } else {
+ for(i = 0; num < ISATR_MAX_ADAPTERS && portlist[i]; i++) {
+ if (setup_card(portlist[i], irq[i], dma[i]))
num++;
- dev = init_trdev(NULL, 0);
- if (!dev)
- goto partial;
- }
}
- unregister_netdev(dev);
- kfree(dev);
}
-partial:
printk(KERN_NOTICE "skisa.c: %d cards found.\n", num);
/* Probe for cards. */
if (num == 0) {
diff --git a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c
index e8c96886ff57..a1e365ebdd6b 100644
--- a/drivers/net/tokenring/smctr.c
+++ b/drivers/net/tokenring/smctr.c
@@ -143,7 +143,6 @@ static int smctr_hardware_send_packet(struct net_device *dev,
/* I */
static int smctr_init_acbs(struct net_device *dev);
static int smctr_init_adapter(struct net_device *dev);
-static int __init smctr_init_card(struct net_device *dev);
static int smctr_init_card_real(struct net_device *dev);
static int smctr_init_rx_bdbs(struct net_device *dev);
static int smctr_init_rx_fcbs(struct net_device *dev);
@@ -541,25 +540,18 @@ static int smctr_chk_mca(struct net_device *dev)
dev->irq = 15;
break;
}
- if(request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev))
- return (-ENODEV);
+ if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) {
+ release_region(dev->base_addr, SMCTR_IO_EXTENT);
+ return -ENODEV;
+ }
/* Get RAM base */
r3 = mca_read_stored_pos(tp->slot_num, 3);
- if(r3 & 0x8)
- {
- if(r3 & 0x80)
- tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0xFD0000;
- else
- tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0x0D0000;
- }
- else
- {
- if(r3 & 0x80)
- tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0xFC0000;
- else
- tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0x0C0000;
- }
+ tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0x0C0000;
+ if (r3 & 0x8)
+ tp->ram_base += 0x010000;
+ if (r3 & 0x80)
+ tp->ram_base += 0xF00000;
/* Get Ram Size */
r3 &= 0x30;
@@ -570,26 +562,24 @@ static int smctr_chk_mca(struct net_device *dev)
tp->board_id |= TOKEN_MEDIA;
r4 = mca_read_stored_pos(tp->slot_num, 4);
- if(r4 & 0x8)
- tp->rom_base = ((__u32)(r4 & 0x7) << 13) + 0xD0000;
- else
- tp->rom_base = ((__u32)(r4 & 0x7) << 13) + 0xC0000;
+ tp->rom_base = ((__u32)(r4 & 0x7) << 13) + 0x0C0000;
+ if (r4 & 0x8)
+ tp->rom_base += 0x010000;
/* Get ROM size. */
r4 >>= 4;
- if(r4 == 0)
- tp->rom_size = CNFG_SIZE_8KB;
- else
- {
- if(r4 == 1)
+ switch (r4) {
+ case 0:
+ tp->rom_size = CNFG_SIZE_8KB;
+ break;
+ case 1:
tp->rom_size = CNFG_SIZE_16KB;
- else
- {
- if(r4 == 2)
- tp->rom_size = CNFG_SIZE_32KB;
- else
- tp->rom_size = ROM_DISABLE;
- }
+ break;
+ case 2:
+ tp->rom_size = CNFG_SIZE_32KB;
+ break;
+ default:
+ tp->rom_size = ROM_DISABLE;
}
/* Get Media Type. */
@@ -953,12 +943,19 @@ static int __init smctr_chk_isa(struct net_device *dev)
__u8 r1, r2, b, chksum = 0;
__u16 r;
int i;
+ int err = -ENODEV;
if(smctr_debug > 10)
printk(KERN_DEBUG "%s: smctr_chk_isa %#4x\n", dev->name, ioaddr);
if((ioaddr & 0x1F) != 0)
- return (-ENODEV);
+ goto out;
+
+ /* Grab the region so that no one else tries to probe our ioports. */
+ if (!request_region(ioaddr, SMCTR_IO_EXTENT, smctr_name)) {
+ err = -EBUSY;
+ goto out;
+ }
/* Checksum SMC node address */
for(i = 0; i < 8; i++)
@@ -967,17 +964,14 @@ static int __init smctr_chk_isa(struct net_device *dev)
chksum += b;
}
- if(chksum != NODE_ADDR_CKSUM)
- return (-ENODEV); /* Adapter Not Found */
-
- /* Grab the region so that no one else tries to probe our ioports. */
- request_region(ioaddr, SMCTR_IO_EXTENT, smctr_name);
+ if (chksum != NODE_ADDR_CKSUM)
+ goto out2;
b = inb(ioaddr + BDID);
if(b != BRD_ID_8115T)
{
printk(KERN_ERR "%s: The adapter found is not supported\n", dev->name);
- return (-1);
+ goto out2;
}
/* Check for 8115T Board ID */
@@ -990,7 +984,7 @@ static int __init smctr_chk_isa(struct net_device *dev)
/* value of RegF adds up the sum to 0xFF */
if((r2 != 0xFF) && (r2 != 0xEE))
- return (-1);
+ goto out2;
/* Get adapter ID */
tp->board_id = smctr_get_boardid(dev, 0);
@@ -1077,11 +1071,11 @@ static int __init smctr_chk_isa(struct net_device *dev)
default:
printk(KERN_ERR "%s: No IRQ found aborting\n", dev->name);
- return(-1);
+ goto out2;
}
- if(request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev))
- return (-ENODEV);
+ if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev))
+ goto out2;
/* Get 58x Rom Base */
r1 = inb(ioaddr + CNFG_BIO_583);
@@ -1157,12 +1151,18 @@ static int __init smctr_chk_isa(struct net_device *dev)
if(smctr_read_584_chksum(ioaddr))
{
printk(KERN_ERR "%s: EEPROM Checksum Failure\n", dev->name);
- return(-1);
+ goto out3;
}
*/
}
return (0);
+out3:
+ free_irq(dev->irq, dev);
+out2:
+ release_region(ioaddr, SMCTR_IO_EXTENT);
+out:
+ return err;
}
static int __init smctr_get_boardid(struct net_device *dev, int mca)
@@ -1650,15 +1650,6 @@ static int smctr_init_adapter(struct net_device *dev)
return (0);
}
-/* Dummy function */
-static int __init smctr_init_card(struct net_device *dev)
-{
- if(smctr_debug > 10)
- printk(KERN_DEBUG "%s: smctr_init_card\n", dev->name);
-
- return (0);
-}
-
static int smctr_init_card_real(struct net_device *dev)
{
struct net_local *tp = (struct net_local *)dev->priv;
@@ -3608,8 +3599,14 @@ out:
int __init smctr_probe (struct net_device *dev)
{
int i;
- int base_addr = dev ? dev->base_addr : 0;
+ int base_addr;
+
+#ifndef MODULE
+ netdev_boot_setup_check(dev);
+ tr_setup(dev);
+#endif
+ base_addr = dev->base_addr;
if(base_addr > 0x1ff) /* Check a single specified location. */
return (smctr_probe1(dev, base_addr));
else if(base_addr != 0) /* Don't probe at all. */
@@ -3618,8 +3615,6 @@ int __init smctr_probe (struct net_device *dev)
for(i = 0; smctr_portlist[i]; i++)
{
int ioaddr = smctr_portlist[i];
- if(check_region(ioaddr, SMCTR_IO_EXTENT))
- continue;
if (!smctr_probe1(dev, ioaddr))
return (0);
}
@@ -3627,6 +3622,20 @@ int __init smctr_probe (struct net_device *dev)
return (-ENODEV);
}
+static void cleanup_card(struct net_device *dev)
+{
+#ifdef CONFIG_MCA
+ struct net_local *tp = (struct net_local *)dev->priv;
+ if (tp->slot_num)
+ mca_mark_as_unused(tp->slot_num);
+#endif
+ release_region(dev->base_addr, SMCTR_IO_EXTENT);
+ if (dev->irq)
+ free_irq(dev->irq, dev);
+ if (dev->priv)
+ kfree(dev->priv);
+}
+
static int __init smctr_probe1(struct net_device *dev, int ioaddr)
{
static unsigned version_printed;
@@ -3637,12 +3646,6 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr)
if(smctr_debug && version_printed++ == 0)
printk(version);
-#ifndef MODULE
- dev = init_trdev(dev, 0);
- if(dev == NULL)
- return (-ENOMEM);
-#endif
-
/* Setup this devices private information structure */
tp = (struct net_local *)kmalloc(sizeof(struct net_local),
GFP_KERNEL);
@@ -3677,8 +3680,9 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr)
if(err != UCODE_PRESENT && err != SUCCESS)
{
printk(KERN_ERR "%s: Firmware load failed (%d)\n", dev->name, err);
+ cleanup_card(dev);
err = -EIO;
- goto out_tp;
+ goto out;
}
/* Allow user to specify ring speed on module insert. */
@@ -3692,8 +3696,6 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr)
(unsigned int)dev->base_addr,
dev->irq, tp->rom_base, tp->ram_base);
- /* AKPM: there's no point in this */
- dev->init = smctr_init_card;
dev->open = smctr_open;
dev->stop = smctr_close;
dev->hard_start_xmit = smctr_send_packet;
@@ -5689,33 +5691,31 @@ int init_module(void)
{
int i;
- for(i = 0; i < SMCTR_MAX_ADAPTERS; i++)
- {
+ for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) {
+ struct net_device *dev = alloc_trdev(0);
irq[i] = 0;
mem[i] = 0;
- dev_smctr[i] = NULL;
- dev_smctr[i] = init_trdev(dev_smctr[i], 0);
- if(dev_smctr[i] == NULL)
- return (-ENOMEM);
-
- dev_smctr[i]->base_addr = io[i];
- dev_smctr[i]->irq = irq[i];
- dev_smctr[i]->mem_start = mem[i];
- dev_smctr[i]->init = &smctr_probe;
-
- if(register_trdev(dev_smctr[i]) != 0)
- {
- kfree(dev_smctr[i]);
- dev_smctr[i] = NULL;
- if(i == 0)
- {
- printk(KERN_ERR "%s: register_trdev() returned (<0).\n",
+ if (!dev)
+ return -ENOMEM;
+ dev->base_addr = io[i];
+ dev->irq = irq[i];
+ dev->mem_start = mem[i];
+
+ if (smctr_probe(dev) != 0) {
+ kfree(dev);
+ if (i == 0) {
+ printk(KERN_ERR "%s: smctr_probe failed.\n",
cardname);
- return (-EIO);
+ return -EIO;
}
- else
- return (0);
+ return 0;
}
+ if (register_netdev(dev) != 0) {
+ cleanup_card(dev);
+ kfree(dev);
+ continue;
+ }
+ dev_smctr[i] = dev;
}
return (0);
@@ -5725,26 +5725,13 @@ void cleanup_module(void)
{
int i;
- for(i = 0; i < SMCTR_MAX_ADAPTERS; i++)
- {
- if(dev_smctr[i])
- {
-#ifdef CONFIG_MCA
- struct net_local *tp
- = (struct net_local *)dev_smctr[i]->priv;
- if(tp->slot_num)
- mca_mark_as_unused(tp->slot_num);
-#endif
- unregister_trdev(dev_smctr[i]);
- release_region(dev_smctr[i]->base_addr,
- SMCTR_IO_EXTENT);
- if(dev_smctr[i]->irq)
- free_irq(dev_smctr[i]->irq, dev_smctr[i]);
- if(dev_smctr[i]->priv)
- kfree(dev_smctr[i]->priv);
- kfree(dev_smctr[i]);
- dev_smctr[i] = NULL;
- }
+ for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) {
+ struct net_device *dev = dev_smctr[i];
+ if (dev) {
+ unregister_netdev(dev);
+ cleanup_card(dev);
+ kfree(dev);
+ }
}
}
#endif /* MODULE */
diff --git a/drivers/net/tokenring/tmspci.c b/drivers/net/tokenring/tmspci.c
index 1401392a20db..da15af5700bd 100644
--- a/drivers/net/tokenring/tmspci.c
+++ b/drivers/net/tokenring/tmspci.c
@@ -112,11 +112,11 @@ static int __init tms_pci_attach(struct pci_dev *pdev, const struct pci_device_i
pci_ioaddr = pci_resource_start (pdev, 0);
/* At this point we have found a valid card. */
- dev = init_trdev(NULL, 0);
+ dev = alloc_trdev(0);
if (!dev)
return -ENOMEM;
SET_MODULE_OWNER(dev);
-
+
if (!request_region(pci_ioaddr, TMS_PCI_IO_EXTENT, dev->name)) {
ret = -EBUSY;
goto err_out_trdev;
@@ -163,22 +163,22 @@ static int __init tms_pci_attach(struct pci_dev *pdev, const struct pci_device_i
dev->open = tms380tr_open;
dev->stop = tms380tr_close;
+ pci_set_drvdata(pdev, dev);
- ret = register_trdev(dev);
+ ret = register_netdev(dev);
if (ret)
goto err_out_tmsdev;
- pci_set_drvdata(pdev, dev);
return 0;
err_out_tmsdev:
+ pci_set_drvdata(pdev, NULL);
tmsdev_term(dev);
err_out_irq:
free_irq(pdev->irq, dev);
err_out_region:
release_region(pci_ioaddr, TMS_PCI_IO_EXTENT);
err_out_trdev:
- unregister_netdev(dev);
kfree(dev);
return ret;
}
diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c
index 43fc1556a33d..4f8b87f2b9e3 100644
--- a/drivers/s390/net/lcs.c
+++ b/drivers/s390/net/lcs.c
@@ -1751,30 +1751,29 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
#ifdef CONFIG_NET_ETHERNET
case LCS_FRAME_TYPE_ENET:
card->lan_type_trans = eth_type_trans;
- dev = init_etherdev(NULL,0);
+ dev = alloc_etherdev(0);
break;
#endif
#ifdef CONFIG_TR
case LCS_FRAME_TYPE_TR:
card->lan_type_trans = tr_type_trans;
- dev = init_trdev(NULL,0);
+ dev = alloc_trdev(0);
break;
#endif
#ifdef CONFIG_FDDI
case LCS_FRAME_TYPE_FDDI:
card->lan_type_trans = fddi_type_trans;
- dev = init_fddidev(NULL,0);
+ dev = alloc_fddidev(0);
break;
#endif
default:
LCS_DBF_TEXT(3, setup, "errinit");
PRINT_ERR("LCS: Initialization failed\n");
PRINT_ERR("LCS: No device found!\n");
- lcs_cleanup_channel(&card->read);
- lcs_cleanup_channel(&card->write);
- lcs_free_card(card);
- return -ENODEV;
+ goto out;
}
+ if (!dev)
+ goto out;
memcpy(dev->dev_addr, card->mac, LCS_MAC_LENGTH);
card->dev = dev;
dev->priv = card;
@@ -1787,9 +1786,16 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
#endif
dev->get_stats = lcs_getstats;
SET_MODULE_OWNER(&tun->dev);
+ if (register_netdev(dev) != 0)
+ goto out;
netif_stop_queue(dev);
lcs_stopcard(card);
return 0;
+out:
+ lcs_cleanup_channel(&card->read);
+ lcs_cleanup_channel(&card->write);
+ lcs_free_card(card);
+ return -ENODEV;
}
/**
diff --git a/net/atm/lec.c b/net/atm/lec.c
index f9d51fc45147..fd448c28c795 100644
--- a/net/atm/lec.c
+++ b/net/atm/lec.c
@@ -861,12 +861,7 @@ static void __exit lane_module_cleanup(void)
for (i = 0; i < MAX_LEC_ITF; i++) {
if (dev_lec[i] != NULL) {
priv = (struct lec_priv *)dev_lec[i]->priv;
-#if defined(CONFIG_TR)
- if (priv->is_trdev)
- unregister_trdev(dev_lec[i]);
- else
-#endif
- unregister_netdev(dev_lec[i]);
+ unregister_netdev(dev_lec[i]);
kfree(dev_lec[i]);
dev_lec[i] = NULL;
}