patch-2.4.0-test5 linux/drivers/isdn/avmb1/b1pci.c
Next file: linux/drivers/isdn/avmb1/b1pcmcia.c
Previous file: linux/drivers/isdn/avmb1/b1dma.c
Back to the patch index
Back to the overall index
- Lines: 150
- Date:
Mon Jul 24 18:48:49 2000
- Orig file:
v2.4.0-test4/linux/drivers/isdn/avmb1/b1pci.c
- Orig date:
Mon Jul 10 16:47:23 2000
diff -u --recursive --new-file v2.4.0-test4/linux/drivers/isdn/avmb1/b1pci.c linux/drivers/isdn/avmb1/b1pci.c
@@ -1,11 +1,15 @@
/*
- * $Id: b1pci.c,v 1.25 2000/05/29 12:29:18 keil Exp $
+ * $Id: b1pci.c,v 1.26 2000/07/20 10:21:21 calle Exp $
*
* Module for AVM B1 PCI-card.
*
* (c) Copyright 1999 by Carsten Paeth (calle@calle.in-berlin.de)
*
* $Log: b1pci.c,v $
+ * Revision 1.26 2000/07/20 10:21:21 calle
+ * Bugfix: driver will not be unregistered, if not cards were detected.
+ * this result in an oops in kcapi.c
+ *
* Revision 1.25 2000/05/29 12:29:18 keil
* make pci_enable_dev compatible to 2.2 kernel versions
*
@@ -93,7 +97,7 @@
#include "capilli.h"
#include "avmcard.h"
-static char *revision = "$Revision: 1.25 $";
+static char *revision = "$Revision: 1.26 $";
/* ------------------------------------------------------------- */
@@ -338,10 +342,13 @@
avmctrl_info *cinfo;
int retval;
+ MOD_INC_USE_COUNT;
+
card = (avmcard *) kmalloc(sizeof(avmcard), GFP_ATOMIC);
if (!card) {
printk(KERN_WARNING "%s: no memory.\n", driver->name);
+ MOD_DEC_USE_COUNT;
return -ENOMEM;
}
memset(card, 0, sizeof(avmcard));
@@ -349,6 +356,7 @@
if (!card->dma) {
printk(KERN_WARNING "%s: no memory.\n", driver->name);
kfree(card);
+ MOD_DEC_USE_COUNT;
return -ENOMEM;
}
memset(card->dma, 0, sizeof(avmcard_dmainfo));
@@ -357,6 +365,7 @@
printk(KERN_WARNING "%s: no memory.\n", driver->name);
kfree(card->dma);
kfree(card);
+ MOD_DEC_USE_COUNT;
return -ENOMEM;
}
memset(cinfo, 0, sizeof(avmctrl_info));
@@ -375,6 +384,7 @@
kfree(card->ctrlinfo);
kfree(card->dma);
kfree(card);
+ MOD_DEC_USE_COUNT;
return -EBUSY;
}
@@ -389,6 +399,7 @@
kfree(card->ctrlinfo);
kfree(card->dma);
kfree(card);
+ MOD_DEC_USE_COUNT;
return -EIO;
}
@@ -401,6 +412,7 @@
kfree(card->ctrlinfo);
kfree(card->dma);
kfree(card);
+ MOD_DEC_USE_COUNT;
return -EIO;
}
b1dma_reset(card);
@@ -417,6 +429,7 @@
kfree(card->ctrlinfo);
kfree(card->dma);
kfree(card);
+ MOD_DEC_USE_COUNT;
return -EBUSY;
}
@@ -429,6 +442,7 @@
kfree(card->ctrlinfo);
kfree(card->dma);
kfree(card);
+ MOD_DEC_USE_COUNT;
return -EBUSY;
}
card->cardnr = cinfo->capi_ctrl->cnr;
@@ -440,8 +454,6 @@
driver->name, card->port, card->irq,
card->membase, card->revision);
- MOD_INC_USE_COUNT;
-
return 0;
}
@@ -493,10 +505,6 @@
printk(KERN_ERR
"%s: failed to enable AVM-B1 V4 at i/o %#x, irq %d, mem %#x err=%d\n",
driver->name, param.port, param.irq, param.membase, retval);
-#ifdef MODULE
- cleanup_module();
-#endif
- MOD_DEC_USE_COUNT;
return -EIO;
}
@@ -523,10 +531,6 @@
printk(KERN_ERR
"%s: failed to enable AVM-B1 at i/o %#x, irq %d, err=%d\n",
driver->name, param.port, param.irq, retval);
-#ifdef MODULE
- cleanup_module();
-#endif
- MOD_DEC_USE_COUNT;
return -EIO;
}
printk(KERN_INFO
@@ -605,8 +609,9 @@
while ((dev = pci_find_device(PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_B1, dev))) {
retval = add_card(dev);
if (retval != 0) {
-#ifdef MODULE
- cleanup_module();
+ detach_capi_driver(driver);
+#ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
+ detach_capi_driver(driverv4);
#endif
MOD_DEC_USE_COUNT;
return retval;
@@ -620,6 +625,10 @@
return 0;
}
printk(KERN_ERR "%s: NO B1-PCI card detected\n", driver->name);
+ detach_capi_driver(driver);
+#ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
+ detach_capi_driver(driverv4);
+#endif
MOD_DEC_USE_COUNT;
return -ESRCH;
#else
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)