]> git.hungrycats.org Git - linux/commitdiff
ISDN: Release AVM CAPI controllers at module unload time
authorKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
Sat, 11 May 2002 17:14:35 +0000 (12:14 -0500)
committerKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
Sat, 11 May 2002 17:14:35 +0000 (12:14 -0500)
Use the standard new-style pci_driver::remove to unregister
drivers at module unload time.

PCMCIA obviously has its own way of handling removing, the ISA
drivers unregister at module unload time as well.

drivers/isdn/capi/kcapi.c
drivers/isdn/hardware/avm/b1pci.c
drivers/isdn/hardware/avm/b1pcmcia.c
drivers/isdn/hardware/avm/c4.c
drivers/isdn/hardware/avm/t1pci.c
drivers/isdn/hysdn/hycapi.c
include/linux/b1lli.h
include/linux/isdn/capilli.h

index 46a7c8a76cfe337783a08d2185786d69f969ae81..1ed56d7b2a3da25c6229d0fe1826dc69c4977187 100644 (file)
@@ -1250,30 +1250,6 @@ static int old_capi_manufacturer(unsigned int cmd, void *data)
                        return retval;
 
                return 0;
-
-       case AVMB1_REMOVECARD:
-               if ((retval = copy_from_user((void *) &rdef, data,
-                                        sizeof(avmb1_resetdef))))
-                       return retval;
-
-               card = get_capi_ctr_by_nr(rdef.contr);
-               if (!card)
-                       return -ESRCH;
-
-               if (card->cardstate != CARD_DETECTED)
-                       return -EBUSY;
-
-               card->driver->remove_ctr(card);
-
-               while (cards[rdef.contr]) {
-
-                       set_current_state(TASK_INTERRUPTIBLE);
-                       schedule_timeout(HZ/10);        /* 0.1 sec */
-
-                       if (signal_pending(current))
-                               return -EINTR;
-               }
-               return 0;
        }
        return -EINVAL;
 }
index d8b91f09569e41a94ae2cca38bb03e56163bffd9..d19656449f1828bd7375495a4ed045c18ded99e9 100644 (file)
@@ -60,9 +60,9 @@ static char *b1pci_procinfo(struct capi_ctr *ctrl)
 
 /* ------------------------------------------------------------- */
 
-static int b1pci_add_card(struct capi_driver *driver,
-                          struct capicardparams *p,
-                         struct pci_dev *dev)
+static int b1pci_probe(struct capi_driver *driver,
+                      struct capicardparams *p,
+                      struct pci_dev *pdev)
 {
        avmcard *card;
        avmctrl_info *cinfo;
@@ -125,6 +125,7 @@ static int b1pci_add_card(struct capi_driver *driver,
                        driver->name, card->port, card->irq, card->revision);
        }
 
+       pci_set_drvdata(pdev, card);
        return 0;
 
  err_free_irq:
@@ -137,19 +138,18 @@ static int b1pci_add_card(struct capi_driver *driver,
        return retval;
 }
 
-static void b1pci_remove_ctr(struct capi_ctr *ctrl)
+static void b1pci_remove(struct pci_dev *pdev)
 {
-       avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
-       avmcard *card = cinfo->card;
+       avmcard *card = pci_get_drvdata(pdev);
+       avmctrl_info *cinfo = card->ctrlinfo;
        unsigned int port = card->port;
 
        b1_reset(port);
        b1_reset(port);
 
-       detach_capi_ctr(ctrl);
+       detach_capi_ctr(cinfo->capi_ctrl);
        free_irq(card->irq, card);
        release_region(card->port, AVMB1_PORTLEN);
-       ctrl->driverdata = 0;
        b1_free_card(card);
 }
 
@@ -161,7 +161,6 @@ static struct capi_driver b1pci_driver = {
        revision: "0.0",
        load_firmware: b1_load_firmware,
        reset_ctr: b1_reset_ctr,
-       remove_ctr: b1pci_remove_ctr,
        register_appl: b1_register_appl,
        release_appl: b1_release_appl,
        send_message: b1_send_message,
@@ -169,8 +168,6 @@ static struct capi_driver b1pci_driver = {
        procinfo: b1pci_procinfo,
        ctr_read_proc: b1ctl_read_proc,
        driver_read_proc: 0,    /* use standard driver_read_proc */
-       
-       add_card: 0, /* no add_card function */
 };
 
 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
@@ -195,9 +192,9 @@ static char *b1pciv4_procinfo(struct capi_ctr *ctrl)
 
 /* ------------------------------------------------------------- */
 
-static int b1pciv4_add_card(struct capi_driver *driver,
-                            struct capicardparams *p,
-                           struct pci_dev *dev)
+static int b1pciv4_probe(struct capi_driver *driver,
+                        struct capicardparams *p,
+                        struct pci_dev *pdev)
 {
        avmcard *card;
        avmctrl_info *cinfo;
@@ -210,7 +207,7 @@ static int b1pciv4_add_card(struct capi_driver *driver,
                goto err;
        }
 
-        card->dma = avmcard_dma_alloc(driver->name, dev, 2048+128, 2048+128);
+        card->dma = avmcard_dma_alloc(driver->name, pdev, 2048+128, 2048+128);
        if (!card->dma) {
                printk(KERN_WARNING "%s: dma alloc.\n", driver->name);
                retval = -ENOMEM;
@@ -273,6 +270,7 @@ static int b1pciv4_add_card(struct capi_driver *driver,
                driver->name, card->port, card->irq,
                card->membase, card->revision);
 
+       pci_set_drvdata(pdev, card);
        return 0;
 
  err_free_irq:
@@ -290,18 +288,17 @@ static int b1pciv4_add_card(struct capi_driver *driver,
 
 }
 
-static void b1pciv4_remove_ctr(struct capi_ctr *ctrl)
+static void b1pciv4_remove(struct pci_dev *pdev)
 {
-       avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
-       avmcard *card = cinfo->card;
+       avmcard *card = pci_get_drvdata(pdev);
+       avmctrl_info *cinfo = card->ctrlinfo;
 
        b1dma_reset(card);
 
-       detach_capi_ctr(ctrl);
+       detach_capi_ctr(cinfo->capi_ctrl);
        free_irq(card->irq, card);
        iounmap(card->mbase);
        release_region(card->port, AVMB1_PORTLEN);
-       ctrl->driverdata = 0;
         avmcard_dma_free(card->dma);
        b1_free_card(card);
 }
@@ -315,7 +312,6 @@ static struct capi_driver b1pciv4_driver = {
        revision: "0.0",
        load_firmware: b1dma_load_firmware,
        reset_ctr: b1dma_reset_ctr,
-       remove_ctr: b1pciv4_remove_ctr,
        register_appl: b1dma_register_appl,
        release_appl: b1dma_release_appl,
        send_message: b1dma_send_message,
@@ -323,42 +319,40 @@ static struct capi_driver b1pciv4_driver = {
        procinfo: b1pciv4_procinfo,
        ctr_read_proc: b1dmactl_read_proc,
        driver_read_proc: 0,    /* use standard driver_read_proc */
-       
-       add_card: 0, /* no add_card function */
 };
 
 #endif /* CONFIG_ISDN_DRV_AVMB1_B1PCIV4 */
 
-static int __devinit b1pci_probe(struct pci_dev *dev,
-                                const struct pci_device_id *ent)
+static int __devinit b1pci_pci_probe(struct pci_dev *pdev,
+                                    const struct pci_device_id *ent)
 {
        struct capi_driver *driver = &b1pci_driver;
        struct capicardparams param;
        int retval;
 
-       if (pci_enable_device(dev) < 0) {
+       if (pci_enable_device(pdev) < 0) {
                printk(KERN_ERR "%s: failed to enable AVM-B1\n",
                       driver->name);
                return -ENODEV;
        }
-       param.irq = dev->irq;
+       param.irq = pdev->irq;
 
-       if (pci_resource_start(dev, 2)) { /* B1 PCI V4 */
+       if (pci_resource_start(pdev, 2)) { /* B1 PCI V4 */
 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
                driver = &b1pciv4_driver;
 
-               pci_set_master(dev);
+               pci_set_master(pdev);
 #endif
-               param.membase = pci_resource_start(dev, 0);
-               param.port = pci_resource_start(dev, 2);
+               param.membase = pci_resource_start(pdev, 0);
+               param.port = pci_resource_start(pdev, 2);
 
                printk(KERN_INFO
                "%s: PCI BIOS reports AVM-B1 V4 at i/o %#x, irq %d, mem %#x\n",
                driver->name, param.port, param.irq, param.membase);
 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
-               retval = b1pciv4_add_card(driver, &param, dev);
+               retval = b1pciv4_probe(driver, &param, pdev);
 #else
-               retval = b1pci_add_card(driver, &param, dev);
+               retval = b1pci_probe(driver, &param, pdev);
 #endif
                if (retval != 0) {
                        printk(KERN_ERR
@@ -367,12 +361,12 @@ static int __devinit b1pci_probe(struct pci_dev *dev,
                }
        } else {
                param.membase = 0;
-               param.port = pci_resource_start(dev, 1);
+               param.port = pci_resource_start(pdev, 1);
 
                printk(KERN_INFO
                "%s: PCI BIOS reports AVM-B1 at i/o %#x, irq %d\n",
                driver->name, param.port, param.irq);
-               retval = b1pci_add_card(driver, &param, dev);
+               retval = b1pci_probe(driver, &param, pdev);
                if (retval != 0) {
                        printk(KERN_ERR
                        "%s: no AVM-B1 at i/o %#x, irq %d detected\n",
@@ -382,10 +376,21 @@ static int __devinit b1pci_probe(struct pci_dev *dev,
        return retval;
 }
 
+static void __devexit b1pci_pci_remove(struct pci_dev *pdev)
+{
+       avmcard *card = pci_get_drvdata(pdev);
+
+       if (card->dma)
+               b1pciv4_remove(pdev);
+       else
+               b1pci_remove(pdev);
+}
+
 static struct pci_driver b1pci_pci_driver = {
        name:           "b1pci",
        id_table:       b1pci_pci_tbl,
-       probe:          b1pci_probe,
+       probe:          b1pci_pci_probe,
+       remove:         __devexit_p(b1pci_pci_remove),
 };
 
 static int __init b1pci_init(void)
index f98957c723d6f508e8073724de4dda5dd3ca640c..6bc2e4b971ce696a0aa1458f5d97554d73c38f2c 100644 (file)
@@ -148,7 +148,6 @@ static struct capi_driver b1pcmcia_driver = {
        revision: "0.0",
        load_firmware: b1_load_firmware,
        reset_ctr: b1_reset_ctr,
-       remove_ctr: b1pcmcia_remove_ctr,
        register_appl: b1_register_appl,
        release_appl: b1_release_appl,
        send_message: b1_send_message,
@@ -156,8 +155,6 @@ static struct capi_driver b1pcmcia_driver = {
        procinfo: b1pcmcia_procinfo,
        ctr_read_proc: b1ctl_read_proc,
        driver_read_proc: 0,    /* use standard driver_read_proc */
-
-       add_card: 0,
 };
 
 /* ------------------------------------------------------------- */
index f612eb040e5ce29eb5e1930a7be6b5cd12db7f79..3b884dcccfc7f7ea32b4aff4e943db363c04a64e 100644 (file)
@@ -901,9 +901,9 @@ void c4_reset_ctr(struct capi_ctr *ctrl)
        card->nlogcontr = 0;
 }
 
-static void c4_remove_ctr(struct capi_ctr *ctrl)
+static void c4_remove(struct pci_dev *pdev)
 {
-       avmcard *card = ((avmctrl_info *)(ctrl->driverdata))->card;
+       avmcard *card = pci_get_drvdata(pdev);
        avmctrl_info *cinfo;
        int i;
 
@@ -920,7 +920,6 @@ static void c4_remove_ctr(struct capi_ctr *ctrl)
        free_irq(card->irq, card);
        iounmap(card->mbase);
        release_region(card->port, AVMB1_PORTLEN);
-       ctrl->driverdata = 0;
         avmcard_dma_free(card->dma);
        b1_free_card(card);
 }
@@ -1215,7 +1214,6 @@ static struct capi_driver c2_driver = {
        revision: "0.0",
        load_firmware: c4_load_firmware,
        reset_ctr: c4_reset_ctr,
-       remove_ctr: c4_remove_ctr,
        register_appl: c4_register_appl,
        release_appl: c4_release_appl,
        send_message: c4_send_message,
@@ -1223,8 +1221,6 @@ static struct capi_driver c2_driver = {
        procinfo: c4_procinfo,
        ctr_read_proc: c4_read_proc,
        driver_read_proc: 0,    /* use standard driver_read_proc */
-       
-       add_card: 0, /* no add_card function */
 };
 
 static struct capi_driver c4_driver = {
@@ -1233,7 +1229,6 @@ static struct capi_driver c4_driver = {
        revision: "0.0",
        load_firmware: c4_load_firmware,
        reset_ctr: c4_reset_ctr,
-       remove_ctr: c4_remove_ctr,
        register_appl: c4_register_appl,
        release_appl: c4_release_appl,
        send_message: c4_send_message,
@@ -1241,8 +1236,6 @@ static struct capi_driver c4_driver = {
        procinfo: c4_procinfo,
        ctr_read_proc: c4_read_proc,
        driver_read_proc: 0,    /* use standard driver_read_proc */
-       
-       add_card: 0, /* no add_card function */
 };
 
 static int __devinit c4_probe(struct pci_dev *dev,
@@ -1282,6 +1275,7 @@ static struct pci_driver c4_pci_driver = {
        name:           "c4",
        id_table:       c4_pci_tbl,
        probe:          c4_probe,
+       remove:         c4_remove,
 };
 
 static int __init c4_init(void)
index 31e1ae2b64305f494a8b84869bb3afc10c48b662..4fef2a45b6192752a829d0140c9ca49c6f6b6439 100644 (file)
@@ -47,7 +47,7 @@ MODULE_LICENSE("GPL");
 
 static int t1pci_add_card(struct capi_driver *driver,
                           struct capicardparams *p,
-                         struct pci_dev *dev)
+                         struct pci_dev *pdev)
 {
        avmcard *card;
        avmctrl_info *cinfo;
@@ -60,7 +60,7 @@ static int t1pci_add_card(struct capi_driver *driver,
                goto err;
        }
 
-        card->dma = avmcard_dma_alloc(driver->name, dev, 2048+128, 2048+128);
+        card->dma = avmcard_dma_alloc(driver->name, pdev, 2048+128, 2048+128);
        if (!card->dma) {
                printk(KERN_WARNING "%s: no memory.\n", driver->name);
                retval = -ENOMEM;
@@ -125,6 +125,7 @@ static int t1pci_add_card(struct capi_driver *driver,
                "%s: AVM T1 PCI at i/o %#x, irq %d, mem %#lx\n",
                driver->name, card->port, card->irq, card->membase);
 
+       pci_set_drvdata(pdev, card);
        return 0;
 
  err_free_irq:
@@ -143,18 +144,17 @@ static int t1pci_add_card(struct capi_driver *driver,
 
 /* ------------------------------------------------------------- */
 
-static void t1pci_remove_ctr(struct capi_ctr *ctrl)
+static void t1pci_remove(struct pci_dev *pdev)
 {
-       avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
-       avmcard *card = cinfo->card;
+       avmcard *card = pci_get_drvdata(pdev);
+       avmctrl_info *cinfo = card->ctrlinfo;
 
        b1dma_reset(card);
 
-       detach_capi_ctr(ctrl);
+       detach_capi_ctr(cinfo->capi_ctrl);
        free_irq(card->irq, card);
        iounmap(card->mbase);
        release_region(card->port, AVMB1_PORTLEN);
-       ctrl->driverdata = 0;
        avmcard_dma_free(card->dma);
        b1_free_card(card);
 }
@@ -185,7 +185,6 @@ static struct capi_driver t1pci_driver = {
        revision: "0.0",
        load_firmware: b1dma_load_firmware,
        reset_ctr: b1dma_reset_ctr,
-       remove_ctr: t1pci_remove_ctr,
        register_appl: b1dma_register_appl,
        release_appl: b1dma_release_appl,
        send_message: b1dma_send_message,
@@ -193,8 +192,6 @@ static struct capi_driver t1pci_driver = {
        procinfo: t1pci_procinfo,
        ctr_read_proc: b1dmactl_read_proc,
        driver_read_proc: 0,    /* use standard driver_read_proc */
-       
-       add_card: 0, /* no add_card function */
 };
 
 /* ------------------------------------------------------------- */
@@ -235,6 +232,7 @@ static struct pci_driver t1pci_pci_driver = {
        name:           "t1pci",
        id_table:       t1pci_pci_tbl,
        probe:          t1pci_probe,
+       remove:         t1pci_remove,
 };
 
 static int __init t1pci_init(void)
index ed6edb204699ce3e0633877703e4bfabe35112ae..4fca2189972e21e752d7108e8862b9dce42acb7e 100644 (file)
@@ -693,7 +693,6 @@ static struct capi_driver hycapi_driver = {
        revision: "0.0",
        load_firmware: hycapi_load_firmware, 
        reset_ctr: hycapi_reset_ctr,
-       remove_ctr: hycapi_remove_ctr,
        register_appl: hycapi_register_appl,
        release_appl: hycapi_release_appl,
        send_message: hycapi_send_message,
index f1cb288d786114890932d3995486a57c23f9bcc0..713f712685d3d8ac4bf8ec2044a795e5dbb9656f 100644 (file)
@@ -66,7 +66,7 @@ typedef struct avmb1_extcarddef {
 #define        AVMB1_LOAD_AND_CONFIG   3       /* load image and config to card */
 #define        AVMB1_ADDCARD_WITH_TYPE 4       /* add a new card, with cardtype */
 #define AVMB1_GET_CARDINFO     5       /* get cardtype */
-#define AVMB1_REMOVECARD       6       /* remove a card (useful for T1) */
+#define AVMB1_REMOVECARD       6       /* remove a card - OBSOLETE */
 
 #define        AVMB1_REGISTERCARD_IS_OBSOLETE
 
index 7d29c37f198060f424612d3575cc1c65ebb2c219..cd10cf67b6f3e63c46999211250c8ed2f67ac9b2 100644 (file)
@@ -80,7 +80,6 @@ struct capi_driver {
        char revision[32];
        int (*load_firmware)(struct capi_ctr *, capiloaddata *);
        void (*reset_ctr)(struct capi_ctr *);
-       void (*remove_ctr)(struct capi_ctr *);
        void (*register_appl)(struct capi_ctr *, __u16 appl,
                              capi_register_params *);
        void (*release_appl)(struct capi_ctr *, __u16 appl);