From 3bcbfef37b1902dad158c513105103b52065573c Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Tue, 7 May 2002 05:21:08 -0500 Subject: ISDN: maintain outstanding CAPI messages in the drivers It's up to the drivers to maintain their list of buffered messages themselves. As most drivers can share common code, provide it in capilib.o, inside of the module kernelcapi.o --- include/linux/isdn/capilli.h | 21 ++++++++++++++++----- include/linux/kernelcapi.h | 2 ++ 2 files changed, 18 insertions(+), 5 deletions(-) (limited to 'include/linux') diff --git a/include/linux/isdn/capilli.h b/include/linux/isdn/capilli.h index 76eb4e1d2fad..2d34c7384ec2 100644 --- a/include/linux/isdn/capilli.h +++ b/include/linux/isdn/capilli.h @@ -12,7 +12,10 @@ #ifndef __CAPILLI_H__ #define __CAPILLI_H__ +#include #include +#include +#include typedef struct capiloaddatapart { int user; /* data in userspace ? */ @@ -60,10 +63,6 @@ struct capi_ctr { void (*handle_capimsg)(struct capi_ctr * card, __u16 appl, struct sk_buff *skb); - void (*new_ncci)(struct capi_ctr * card, - __u16 appl, __u32 ncci, __u32 winsize); - void (*free_ncci)(struct capi_ctr * card, __u16 appl, __u32 ncci); - /* management information for kcapi */ unsigned long nrecvctlpkt; @@ -85,7 +84,7 @@ struct capi_driver { void (*register_appl)(struct capi_ctr *, __u16 appl, capi_register_params *); void (*release_appl)(struct capi_ctr *, __u16 appl); - void (*send_message)(struct capi_ctr *, struct sk_buff *skb); + u16 (*send_message)(struct capi_ctr *, struct sk_buff *skb); char *(*procinfo)(struct capi_ctr *); int (*ctr_read_proc)(char *page, char **start, off_t off, @@ -109,4 +108,16 @@ void detach_capi_driver(struct capi_driver *driver); struct capi_ctr *attach_capi_ctr(struct capi_driver *driver, char *name, void *data); int detach_capi_ctr(struct capi_ctr *); + + +// --------------------------------------------------------------------------- +// library functions for use by hardware controller drivers + +void capilib_new_ncci(struct list_head *head, u16 applid, u32 ncci, u32 winsize); +void capilib_free_ncci(struct list_head *head, u16 applid, u32 ncci); +void capilib_release_appl(struct list_head *head, u16 applid); +void capilib_release(struct list_head *head); +void capilib_data_b3_conf(struct list_head *head, u16 applid, u32 ncci, u16 msgid); +u16 capilib_data_b3_req(struct list_head *head, u16 applid, u32 ncci, u16 msgid); + #endif /* __CAPILLI_H__ */ diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index c162ff96f53b..2c7264b4326e 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -47,6 +47,8 @@ typedef struct kcapi_carddef { #ifdef __KERNEL__ +#include + struct capi_interface { __u16 (*capi_isinstalled) (void); -- cgit v1.2.3 From 383a058c2de4975cb0305faa58312e1e6225d377 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Sat, 11 May 2002 11:39:05 -0500 Subject: ISDN: Init ISA AVM CAPI drivers at module load time Don't use a special CAPI solution to tell the drivers about ISA cards but use module parameters, just as other drivers do. Internally use struct pci_dev to save that data - hopefully one day the device tree will provide a nicer way to achieve this. --- drivers/isdn/capi/kcapi.c | 74 ------------------------- drivers/isdn/hardware/avm/b1isa.c | 72 +++++++++++++++++++------ drivers/isdn/hardware/avm/t1isa.c | 110 ++++++++++++++++++++++++-------------- drivers/isdn/hysdn/hycapi.c | 2 - include/linux/b1lli.h | 2 +- include/linux/isdn/capilli.h | 2 - include/linux/kernelcapi.h | 2 +- 7 files changed, 128 insertions(+), 136 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index 742fd0b046ee..46a7c8a76cfe 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c @@ -1135,54 +1135,13 @@ static struct capi_driver *find_driver(char *name) static int old_capi_manufacturer(unsigned int cmd, void *data) { avmb1_loadandconfigdef ldef; - avmb1_extcarddef cdef; avmb1_resetdef rdef; avmb1_getdef gdef; - struct capi_driver *driver; struct capi_ctr *card; - capicardparams cparams; capiloaddata ldata; int retval; switch (cmd) { - case AVMB1_ADDCARD: - case AVMB1_ADDCARD_WITH_TYPE: - if (cmd == AVMB1_ADDCARD) { - if ((retval = copy_from_user((void *) &cdef, data, - sizeof(avmb1_carddef)))) - return retval; - cdef.cardtype = AVM_CARDTYPE_B1; - } else { - if ((retval = copy_from_user((void *) &cdef, data, - sizeof(avmb1_extcarddef)))) - return retval; - } - cparams.port = cdef.port; - cparams.irq = cdef.irq; - cparams.cardnr = cdef.cardnr; - - switch (cdef.cardtype) { - case AVM_CARDTYPE_B1: - driver = find_driver("b1isa"); - break; - case AVM_CARDTYPE_T1: - driver = find_driver("t1isa"); - break; - default: - driver = 0; - break; - } - if (!driver) { - printk(KERN_ERR "kcapi: driver not loaded.\n"); - return -EIO; - } - if (!driver->add_card) { - printk(KERN_ERR "kcapi: driver has no add card function.\n"); - return -EIO; - } - - return driver->add_card(driver, &cparams); - case AVMB1_LOAD: case AVMB1_LOAD_AND_CONFIG: @@ -1327,8 +1286,6 @@ static int capi_manufacturer(unsigned int cmd, void *data) switch (cmd) { #ifdef CONFIG_AVMB1_COMPAT - case AVMB1_ADDCARD: - case AVMB1_ADDCARD_WITH_TYPE: case AVMB1_LOAD: case AVMB1_LOAD_AND_CONFIG: case AVMB1_RESETCARD: @@ -1354,37 +1311,6 @@ static int capi_manufacturer(unsigned int cmd, void *data) return 0; } - case KCAPI_CMD_ADDCARD: - { - struct capi_driver *driver; - capicardparams cparams; - kcapi_carddef cdef; - - if ((retval = copy_from_user((void *) &cdef, data, - sizeof(cdef)))) - return retval; - - cparams.port = cdef.port; - cparams.irq = cdef.irq; - cparams.membase = cdef.membase; - cparams.cardnr = cdef.cardnr; - cparams.cardtype = 0; - cdef.driver[sizeof(cdef.driver)-1] = 0; - - if ((driver = find_driver(cdef.driver)) == 0) { - printk(KERN_ERR "kcapi: driver \"%s\" not loaded.\n", - cdef.driver); - return -ESRCH; - } - - if (!driver->add_card) { - printk(KERN_ERR "kcapi: driver \"%s\" has no add card function.\n", cdef.driver); - return -EIO; - } - - return driver->add_card(driver, &cparams); - } - default: printk(KERN_ERR "kcapi: manufacturer command %d unknown.\n", cmd); diff --git a/drivers/isdn/hardware/avm/b1isa.c b/drivers/isdn/hardware/avm/b1isa.c index b650299d29c9..65b5c6c2bf6a 100644 --- a/drivers/isdn/hardware/avm/b1isa.c +++ b/drivers/isdn/hardware/avm/b1isa.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -34,16 +35,18 @@ MODULE_LICENSE("GPL"); /* ------------------------------------------------------------- */ -static void b1isa_remove_ctr(struct capi_ctr *ctrl) +static struct capi_driver b1isa_driver; + +static void b1isa_remove(struct pci_dev *pdev) { - avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata); + avmctrl_info *cinfo = pci_get_drvdata(pdev); avmcard *card = cinfo->card; - unsigned int port = card->port; + unsigned int port = cinfo->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); b1_free_card(card); @@ -51,7 +54,7 @@ static void b1isa_remove_ctr(struct capi_ctr *ctrl) /* ------------------------------------------------------------- */ -static int b1isa_add_card(struct capi_driver *driver, struct capicardparams *p) +static int __init b1isa_probe(struct pci_dev *pdev) { avmctrl_info *cinfo; avmcard *card; @@ -66,10 +69,10 @@ static int b1isa_add_card(struct capi_driver *driver, struct capicardparams *p) cinfo = card->ctrlinfo; - sprintf(card->name, "b1isa-%x", p->port); - card->port = p->port; - card->irq = p->irq; + card->port = pci_resource_start(pdev, 0); + card->irq = pdev->irq; card->cardtype = avm_b1isa; + sprintf(card->name, "b1isa-%x", card->port); if ( card->port != 0x150 && card->port != 0x250 && card->port != 0x300 && card->port != 0x340) { @@ -103,7 +106,7 @@ static int b1isa_add_card(struct capi_driver *driver, struct capicardparams *p) b1_reset(card->port); b1_getrevision(card); - cinfo->capi_ctrl = attach_capi_ctr(driver, card->name, cinfo); + cinfo->capi_ctrl = attach_capi_ctr(&b1isa_driver, card->name, cinfo); if (!cinfo->capi_ctrl) { printk(KERN_ERR "b1isa: attach controller failed.\n"); retval = -EBUSY; @@ -112,8 +115,9 @@ static int b1isa_add_card(struct capi_driver *driver, struct capicardparams *p) printk(KERN_INFO "%s: AVM B1 ISA at i/o %#x, irq %d, revision %d\n", - driver->name, card->port, card->irq, card->revision); + b1isa_driver.name, card->port, card->irq, card->revision); + pci_set_drvdata(pdev, cinfo); return 0; err_free_irq: @@ -150,7 +154,6 @@ static struct capi_driver b1isa_driver = { revision: "0.0", load_firmware: b1_load_firmware, reset_ctr: b1_reset_ctr, - remove_ctr: b1isa_remove_ctr, register_appl: b1_register_appl, release_appl: b1_release_appl, send_message: b1_send_message, @@ -158,24 +161,63 @@ static struct capi_driver b1isa_driver = { procinfo: b1isa_procinfo, ctr_read_proc: b1ctl_read_proc, driver_read_proc: 0, /* use standard driver_read_proc */ - - add_card: b1isa_add_card, }; +#define MAX_CARDS 4 +static struct pci_dev isa_dev[MAX_CARDS]; +static int io[MAX_CARDS]; +static int irq[MAX_CARDS]; + +MODULE_PARM(io, "1-" __MODULE_STRING(MAX_CARDS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_CARDS) "i"); +MODULE_PARM_DESC(io, "I/O base address(es)"); +MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)"); + static int __init b1isa_init(void) { + int i, retval; + int found = 0; + MOD_INC_USE_COUNT; b1_set_revision(&b1isa_driver, revision); attach_capi_driver(&b1isa_driver); + for (i = 0; i < MAX_CARDS; i++) { + if (!io[i]) + break; + + isa_dev[i].resource[0].start = io[i]; + isa_dev[i].irq_resource[0].start = irq[i]; + + if (b1isa_probe(&isa_dev[i]) == 0) + found++; + } + if (found == 0) { + retval = -ENODEV; + goto err; + } + retval = 0; + goto out; + + err: + detach_capi_driver(&b1isa_driver); + out: MOD_DEC_USE_COUNT; - return 0; + return retval; } static void __exit b1isa_exit(void) { - detach_capi_driver(&b1isa_driver); + int i; + + for (i = 0; i < MAX_CARDS; i++) { + if (!io[i]) + break; + + b1isa_remove(&isa_dev[i]); + } + detach_capi_driver(&b1isa_driver); } module_init(b1isa_init); diff --git a/drivers/isdn/hardware/avm/t1isa.c b/drivers/isdn/hardware/avm/t1isa.c index a170ad31ee53..70b50178d2e8 100644 --- a/drivers/isdn/hardware/avm/t1isa.c +++ b/drivers/isdn/hardware/avm/t1isa.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,8 @@ MODULE_LICENSE("GPL"); /* ------------------------------------------------------------- */ +static struct capi_driver t1isa_driver; + static int hema_irq_table[16] = {0, 0, @@ -323,9 +326,9 @@ void t1isa_reset_ctr(struct capi_ctr *ctrl) ctrl->reseted(ctrl); } -static void t1isa_remove_ctr(struct capi_ctr *ctrl) +static void t1isa_remove(struct pci_dev *pdev) { - avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata); + avmctrl_info *cinfo = pci_get_drvdata(pdev); avmcard *card = cinfo->card; unsigned int port = card->port; @@ -334,7 +337,7 @@ static void t1isa_remove_ctr(struct capi_ctr *ctrl) b1_reset(port); t1_reset(port); - detach_capi_ctr(ctrl); + detach_capi_ctr(cinfo->capi_ctrl); free_irq(card->irq, card); release_region(card->port, AVMB1_PORTLEN); b1_free_card(card); @@ -342,87 +345,74 @@ static void t1isa_remove_ctr(struct capi_ctr *ctrl) /* ------------------------------------------------------------- */ -static int t1isa_add_card(struct capi_driver *driver, struct capicardparams *p) +static int __init t1isa_probe(struct pci_dev *pdev) { - struct capi_ctr *ctrl; - struct list_head *l; avmctrl_info *cinfo; avmcard *card; int retval; + static int cardnr = 1; card = b1_alloc_card(1); if (!card) { - printk(KERN_WARNING "%s: no memory.\n", driver->name); + printk(KERN_WARNING "%s: no memory.\n", t1isa_driver.name); retval = -ENOMEM; goto err; } cinfo = card->ctrlinfo; - sprintf(card->name, "t1isa-%x", p->port); - card->port = p->port; - card->irq = p->irq; + card->port = pci_resource_start(pdev, 0); + card->irq = pdev->irq; card->cardtype = avm_t1isa; - card->cardnr = p->cardnr; + card->cardnr = cardnr++; + sprintf(card->name, "t1isa-%x", card->port); if (!(((card->port & 0x7) == 0) && ((card->port & 0x30) != 0x30))) { printk(KERN_WARNING "%s: illegal port 0x%x.\n", - driver->name, card->port); + t1isa_driver.name, card->port); retval = -EINVAL; goto err_free; } if (hema_irq_table[card->irq & 0xf] == 0) { printk(KERN_WARNING "%s: irq %d not valid.\n", - driver->name, card->irq); + t1isa_driver.name, card->irq); retval = -EINVAL; goto err_free; } - list_for_each(l, &driver->contr_head) { - avmcard *cardp; - - ctrl = list_entry(l, struct capi_ctr, driver_list); - cardp = ((avmctrl_info *)(ctrl->driverdata))->card; - if (cardp->cardnr == card->cardnr) { - printk(KERN_WARNING "%s: card with number %d already installed at 0x%x.\n", - driver->name, card->cardnr, cardp->port); - retval = -EINVAL; - goto err_free; - } - } if (!request_region(card->port, AVMB1_PORTLEN, card->name)) { - printk(KERN_WARNING "%s: ports 0x%03x-0x%03x in use.\n", - driver->name, card->port, card->port + AVMB1_PORTLEN); + printk(KERN_INFO "%s: ports 0x%03x-0x%03x in use.\n", + t1isa_driver.name, card->port, card->port + AVMB1_PORTLEN); retval = -EBUSY; goto err_free; } retval = request_irq(card->irq, t1isa_interrupt, 0, card->name, card); if (retval) { - printk(KERN_ERR "%s: unable to get IRQ %d.\n", - driver->name, card->irq); + printk(KERN_INFO "%s: unable to get IRQ %d.\n", + t1isa_driver.name, card->irq); retval = -EBUSY; goto err_release_region; } if ((retval = t1_detectandinit(card->port, card->irq, card->cardnr)) != 0) { - printk(KERN_NOTICE "%s: NO card at 0x%x (%d)\n", - driver->name, card->port, retval); + printk(KERN_INFO "%s: NO card at 0x%x (%d)\n", + t1isa_driver.name, card->port, retval); retval = -ENODEV; goto err_free_irq; } t1_disable_irq(card->port); b1_reset(card->port); - cinfo->capi_ctrl = attach_capi_ctr(driver, card->name, cinfo); + cinfo->capi_ctrl = attach_capi_ctr(&t1isa_driver, card->name, cinfo); if (!cinfo->capi_ctrl) { - printk(KERN_ERR "%s: attach controller failed.\n", - driver->name); + printk(KERN_INFO "%s: attach controller failed.\n", + t1isa_driver.name); retval = -EBUSY; goto err_free_irq; } - printk(KERN_INFO - "%s: AVM T1 ISA at i/o %#x, irq %d, card %d\n", - driver->name, card->port, card->irq, card->cardnr); + printk(KERN_INFO "%s: AVM T1 ISA at i/o %#x, irq %d, card %d\n", + t1isa_driver.name, card->port, card->irq, card->cardnr); + pci_set_drvdata(pdev, cinfo); return 0; err_free_irq: @@ -502,7 +492,6 @@ static struct capi_driver t1isa_driver = { revision: "0.0", load_firmware: t1isa_load_firmware, reset_ctr: t1isa_reset_ctr, - remove_ctr: t1isa_remove_ctr, register_appl: b1_register_appl, release_appl: b1_release_appl, send_message: t1isa_send_message, @@ -510,23 +499,62 @@ static struct capi_driver t1isa_driver = { procinfo: t1isa_procinfo, ctr_read_proc: b1ctl_read_proc, driver_read_proc: 0, /* use standard driver_read_proc */ - - add_card: t1isa_add_card, }; +#define MAX_CARDS 4 +static struct pci_dev isa_dev[MAX_CARDS]; +static int io[MAX_CARDS]; +static int irq[MAX_CARDS]; + +MODULE_PARM(io, "1-" __MODULE_STRING(MAX_CARDS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_CARDS) "i"); +MODULE_PARM_DESC(io, "I/O base address(es)"); +MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)"); + static int __init t1isa_init(void) { + int i, retval; + int found = 0; + MOD_INC_USE_COUNT; b1_set_revision(&t1isa_driver, revision); attach_capi_driver(&t1isa_driver); + for (i = 0; i < MAX_CARDS; i++) { + if (!io[i]) + break; + + isa_dev[i].resource[0].start = io[i]; + isa_dev[i].irq_resource[0].start = irq[i]; + + if (t1isa_probe(&isa_dev[i]) == 0) + found++; + } + if (found == 0) { + retval = -ENODEV; + goto err; + } + retval = 0; + goto out; + + err: + detach_capi_driver(&t1isa_driver); + out: MOD_DEC_USE_COUNT; - return 0; + return retval; } static void __exit t1isa_exit(void) { + int i; + + for (i = 0; i < MAX_CARDS; i++) { + if (!io[i]) + break; + + t1isa_remove(&isa_dev[i]); + } detach_capi_driver(&t1isa_driver); } diff --git a/drivers/isdn/hysdn/hycapi.c b/drivers/isdn/hysdn/hycapi.c index aef7d8c3b68c..ed6edb204699 100644 --- a/drivers/isdn/hysdn/hycapi.c +++ b/drivers/isdn/hysdn/hycapi.c @@ -701,8 +701,6 @@ static struct capi_driver hycapi_driver = { procinfo: hycapi_procinfo, ctr_read_proc: hycapi_read_proc, driver_read_proc: 0, /* use standard driver_read_proc */ - - add_card: 0, /* no add_card function */ }; diff --git a/include/linux/b1lli.h b/include/linux/b1lli.h index 24ec4670a033..f1cb288d7861 100644 --- a/include/linux/b1lli.h +++ b/include/linux/b1lli.h @@ -61,7 +61,7 @@ typedef struct avmb1_extcarddef { } avmb1_extcarddef; #define AVMB1_LOAD 0 /* load image to card */ -#define AVMB1_ADDCARD 1 /* add a new card */ +#define AVMB1_ADDCARD 1 /* add a new card - OBSOLETE */ #define AVMB1_RESETCARD 2 /* reset a card */ #define AVMB1_LOAD_AND_CONFIG 3 /* load image and config to card */ #define AVMB1_ADDCARD_WITH_TYPE 4 /* add a new card, with cardtype */ diff --git a/include/linux/isdn/capilli.h b/include/linux/isdn/capilli.h index 2d34c7384ec2..7d29c37f1980 100644 --- a/include/linux/isdn/capilli.h +++ b/include/linux/isdn/capilli.h @@ -92,8 +92,6 @@ struct capi_driver { int (*driver_read_proc)(char *page, char **start, off_t off, int count, int *eof, struct capi_driver *driver); - int (*add_card)(struct capi_driver *driver, capicardparams *data); - /* intitialized by kcapi */ struct list_head contr_head; /* list of controllers */ struct list_head driver_list; diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index 2c7264b4326e..e6312ebffbc4 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -32,7 +32,7 @@ typedef struct kcapi_carddef { /* new ioctls >= 10 */ #define KCAPI_CMD_TRACE 10 -#define KCAPI_CMD_ADDCARD 11 /* add card to named driver */ +#define KCAPI_CMD_ADDCARD 11 /* OBSOLETE */ /* * flag > 2 => trace also data -- cgit v1.2.3 From 960dc036bfad885d9d2d04d16a50bce806b043e4 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Sat, 11 May 2002 12:14:35 -0500 Subject: ISDN: Release AVM CAPI controllers at module unload time 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 | 24 ----------- drivers/isdn/hardware/avm/b1pci.c | 77 +++++++++++++++++++----------------- drivers/isdn/hardware/avm/b1pcmcia.c | 3 -- drivers/isdn/hardware/avm/c4.c | 12 ++---- drivers/isdn/hardware/avm/t1pci.c | 18 ++++----- drivers/isdn/hysdn/hycapi.c | 1 - include/linux/b1lli.h | 2 +- include/linux/isdn/capilli.h | 1 - 8 files changed, 53 insertions(+), 85 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index 46a7c8a76cfe..1ed56d7b2a3d 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c @@ -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; } diff --git a/drivers/isdn/hardware/avm/b1pci.c b/drivers/isdn/hardware/avm/b1pci.c index d8b91f09569e..d19656449f18 100644 --- a/drivers/isdn/hardware/avm/b1pci.c +++ b/drivers/isdn/hardware/avm/b1pci.c @@ -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, ¶m, dev); + retval = b1pciv4_probe(driver, ¶m, pdev); #else - retval = b1pci_add_card(driver, ¶m, dev); + retval = b1pci_probe(driver, ¶m, 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, ¶m, dev); + retval = b1pci_probe(driver, ¶m, 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) diff --git a/drivers/isdn/hardware/avm/b1pcmcia.c b/drivers/isdn/hardware/avm/b1pcmcia.c index f98957c723d6..6bc2e4b971ce 100644 --- a/drivers/isdn/hardware/avm/b1pcmcia.c +++ b/drivers/isdn/hardware/avm/b1pcmcia.c @@ -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, }; /* ------------------------------------------------------------- */ diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c index f612eb040e5c..3b884dcccfc7 100644 --- a/drivers/isdn/hardware/avm/c4.c +++ b/drivers/isdn/hardware/avm/c4.c @@ -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) diff --git a/drivers/isdn/hardware/avm/t1pci.c b/drivers/isdn/hardware/avm/t1pci.c index 31e1ae2b6430..4fef2a45b619 100644 --- a/drivers/isdn/hardware/avm/t1pci.c +++ b/drivers/isdn/hardware/avm/t1pci.c @@ -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) diff --git a/drivers/isdn/hysdn/hycapi.c b/drivers/isdn/hysdn/hycapi.c index ed6edb204699..4fca2189972e 100644 --- a/drivers/isdn/hysdn/hycapi.c +++ b/drivers/isdn/hysdn/hycapi.c @@ -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, diff --git a/include/linux/b1lli.h b/include/linux/b1lli.h index f1cb288d7861..713f712685d3 100644 --- a/include/linux/b1lli.h +++ b/include/linux/b1lli.h @@ -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 diff --git a/include/linux/isdn/capilli.h b/include/linux/isdn/capilli.h index 7d29c37f1980..cd10cf67b6f3 100644 --- a/include/linux/isdn/capilli.h +++ b/include/linux/isdn/capilli.h @@ -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); -- cgit v1.2.3