Commit 960dc036 authored by Kai Germaschewski's avatar Kai Germaschewski

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.
parent 383a058c
...@@ -1250,30 +1250,6 @@ static int old_capi_manufacturer(unsigned int cmd, void *data) ...@@ -1250,30 +1250,6 @@ static int old_capi_manufacturer(unsigned int cmd, void *data)
return retval; return retval;
return 0; 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; return -EINVAL;
} }
......
...@@ -60,9 +60,9 @@ static char *b1pci_procinfo(struct capi_ctr *ctrl) ...@@ -60,9 +60,9 @@ static char *b1pci_procinfo(struct capi_ctr *ctrl)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static int b1pci_add_card(struct capi_driver *driver, static int b1pci_probe(struct capi_driver *driver,
struct capicardparams *p, struct capicardparams *p,
struct pci_dev *dev) struct pci_dev *pdev)
{ {
avmcard *card; avmcard *card;
avmctrl_info *cinfo; avmctrl_info *cinfo;
...@@ -125,6 +125,7 @@ static int b1pci_add_card(struct capi_driver *driver, ...@@ -125,6 +125,7 @@ static int b1pci_add_card(struct capi_driver *driver,
driver->name, card->port, card->irq, card->revision); driver->name, card->port, card->irq, card->revision);
} }
pci_set_drvdata(pdev, card);
return 0; return 0;
err_free_irq: err_free_irq:
...@@ -137,19 +138,18 @@ static int b1pci_add_card(struct capi_driver *driver, ...@@ -137,19 +138,18 @@ static int b1pci_add_card(struct capi_driver *driver,
return retval; 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 = pci_get_drvdata(pdev);
avmcard *card = cinfo->card; avmctrl_info *cinfo = card->ctrlinfo;
unsigned int port = card->port; unsigned int port = card->port;
b1_reset(port); b1_reset(port);
b1_reset(port); b1_reset(port);
detach_capi_ctr(ctrl); detach_capi_ctr(cinfo->capi_ctrl);
free_irq(card->irq, card); free_irq(card->irq, card);
release_region(card->port, AVMB1_PORTLEN); release_region(card->port, AVMB1_PORTLEN);
ctrl->driverdata = 0;
b1_free_card(card); b1_free_card(card);
} }
...@@ -161,7 +161,6 @@ static struct capi_driver b1pci_driver = { ...@@ -161,7 +161,6 @@ static struct capi_driver b1pci_driver = {
revision: "0.0", revision: "0.0",
load_firmware: b1_load_firmware, load_firmware: b1_load_firmware,
reset_ctr: b1_reset_ctr, reset_ctr: b1_reset_ctr,
remove_ctr: b1pci_remove_ctr,
register_appl: b1_register_appl, register_appl: b1_register_appl,
release_appl: b1_release_appl, release_appl: b1_release_appl,
send_message: b1_send_message, send_message: b1_send_message,
...@@ -169,8 +168,6 @@ static struct capi_driver b1pci_driver = { ...@@ -169,8 +168,6 @@ static struct capi_driver b1pci_driver = {
procinfo: b1pci_procinfo, procinfo: b1pci_procinfo,
ctr_read_proc: b1ctl_read_proc, ctr_read_proc: b1ctl_read_proc,
driver_read_proc: 0, /* use standard driver_read_proc */ driver_read_proc: 0, /* use standard driver_read_proc */
add_card: 0, /* no add_card function */
}; };
#ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
...@@ -195,9 +192,9 @@ static char *b1pciv4_procinfo(struct capi_ctr *ctrl) ...@@ -195,9 +192,9 @@ static char *b1pciv4_procinfo(struct capi_ctr *ctrl)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static int b1pciv4_add_card(struct capi_driver *driver, static int b1pciv4_probe(struct capi_driver *driver,
struct capicardparams *p, struct capicardparams *p,
struct pci_dev *dev) struct pci_dev *pdev)
{ {
avmcard *card; avmcard *card;
avmctrl_info *cinfo; avmctrl_info *cinfo;
...@@ -210,7 +207,7 @@ static int b1pciv4_add_card(struct capi_driver *driver, ...@@ -210,7 +207,7 @@ static int b1pciv4_add_card(struct capi_driver *driver,
goto err; 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) { if (!card->dma) {
printk(KERN_WARNING "%s: dma alloc.\n", driver->name); printk(KERN_WARNING "%s: dma alloc.\n", driver->name);
retval = -ENOMEM; retval = -ENOMEM;
...@@ -273,6 +270,7 @@ static int b1pciv4_add_card(struct capi_driver *driver, ...@@ -273,6 +270,7 @@ static int b1pciv4_add_card(struct capi_driver *driver,
driver->name, card->port, card->irq, driver->name, card->port, card->irq,
card->membase, card->revision); card->membase, card->revision);
pci_set_drvdata(pdev, card);
return 0; return 0;
err_free_irq: err_free_irq:
...@@ -290,18 +288,17 @@ static int b1pciv4_add_card(struct capi_driver *driver, ...@@ -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 = pci_get_drvdata(pdev);
avmcard *card = cinfo->card; avmctrl_info *cinfo = card->ctrlinfo;
b1dma_reset(card); b1dma_reset(card);
detach_capi_ctr(ctrl); detach_capi_ctr(cinfo->capi_ctrl);
free_irq(card->irq, card); free_irq(card->irq, card);
iounmap(card->mbase); iounmap(card->mbase);
release_region(card->port, AVMB1_PORTLEN); release_region(card->port, AVMB1_PORTLEN);
ctrl->driverdata = 0;
avmcard_dma_free(card->dma); avmcard_dma_free(card->dma);
b1_free_card(card); b1_free_card(card);
} }
...@@ -315,7 +312,6 @@ static struct capi_driver b1pciv4_driver = { ...@@ -315,7 +312,6 @@ static struct capi_driver b1pciv4_driver = {
revision: "0.0", revision: "0.0",
load_firmware: b1dma_load_firmware, load_firmware: b1dma_load_firmware,
reset_ctr: b1dma_reset_ctr, reset_ctr: b1dma_reset_ctr,
remove_ctr: b1pciv4_remove_ctr,
register_appl: b1dma_register_appl, register_appl: b1dma_register_appl,
release_appl: b1dma_release_appl, release_appl: b1dma_release_appl,
send_message: b1dma_send_message, send_message: b1dma_send_message,
...@@ -323,42 +319,40 @@ static struct capi_driver b1pciv4_driver = { ...@@ -323,42 +319,40 @@ static struct capi_driver b1pciv4_driver = {
procinfo: b1pciv4_procinfo, procinfo: b1pciv4_procinfo,
ctr_read_proc: b1dmactl_read_proc, ctr_read_proc: b1dmactl_read_proc,
driver_read_proc: 0, /* use standard driver_read_proc */ driver_read_proc: 0, /* use standard driver_read_proc */
add_card: 0, /* no add_card function */
}; };
#endif /* CONFIG_ISDN_DRV_AVMB1_B1PCIV4 */ #endif /* CONFIG_ISDN_DRV_AVMB1_B1PCIV4 */
static int __devinit b1pci_probe(struct pci_dev *dev, static int __devinit b1pci_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
{ {
struct capi_driver *driver = &b1pci_driver; struct capi_driver *driver = &b1pci_driver;
struct capicardparams param; struct capicardparams param;
int retval; int retval;
if (pci_enable_device(dev) < 0) { if (pci_enable_device(pdev) < 0) {
printk(KERN_ERR "%s: failed to enable AVM-B1\n", printk(KERN_ERR "%s: failed to enable AVM-B1\n",
driver->name); driver->name);
return -ENODEV; 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 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
driver = &b1pciv4_driver; driver = &b1pciv4_driver;
pci_set_master(dev); pci_set_master(pdev);
#endif #endif
param.membase = pci_resource_start(dev, 0); param.membase = pci_resource_start(pdev, 0);
param.port = pci_resource_start(dev, 2); param.port = pci_resource_start(pdev, 2);
printk(KERN_INFO printk(KERN_INFO
"%s: PCI BIOS reports AVM-B1 V4 at i/o %#x, irq %d, mem %#x\n", "%s: PCI BIOS reports AVM-B1 V4 at i/o %#x, irq %d, mem %#x\n",
driver->name, param.port, param.irq, param.membase); driver->name, param.port, param.irq, param.membase);
#ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
retval = b1pciv4_add_card(driver, &param, dev); retval = b1pciv4_probe(driver, &param, pdev);
#else #else
retval = b1pci_add_card(driver, &param, dev); retval = b1pci_probe(driver, &param, pdev);
#endif #endif
if (retval != 0) { if (retval != 0) {
printk(KERN_ERR printk(KERN_ERR
...@@ -367,12 +361,12 @@ static int __devinit b1pci_probe(struct pci_dev *dev, ...@@ -367,12 +361,12 @@ static int __devinit b1pci_probe(struct pci_dev *dev,
} }
} else { } else {
param.membase = 0; param.membase = 0;
param.port = pci_resource_start(dev, 1); param.port = pci_resource_start(pdev, 1);
printk(KERN_INFO printk(KERN_INFO
"%s: PCI BIOS reports AVM-B1 at i/o %#x, irq %d\n", "%s: PCI BIOS reports AVM-B1 at i/o %#x, irq %d\n",
driver->name, param.port, param.irq); driver->name, param.port, param.irq);
retval = b1pci_add_card(driver, &param, dev); retval = b1pci_probe(driver, &param, pdev);
if (retval != 0) { if (retval != 0) {
printk(KERN_ERR printk(KERN_ERR
"%s: no AVM-B1 at i/o %#x, irq %d detected\n", "%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, ...@@ -382,10 +376,21 @@ static int __devinit b1pci_probe(struct pci_dev *dev,
return retval; 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 = { static struct pci_driver b1pci_pci_driver = {
name: "b1pci", name: "b1pci",
id_table: b1pci_pci_tbl, id_table: b1pci_pci_tbl,
probe: b1pci_probe, probe: b1pci_pci_probe,
remove: __devexit_p(b1pci_pci_remove),
}; };
static int __init b1pci_init(void) static int __init b1pci_init(void)
......
...@@ -148,7 +148,6 @@ static struct capi_driver b1pcmcia_driver = { ...@@ -148,7 +148,6 @@ static struct capi_driver b1pcmcia_driver = {
revision: "0.0", revision: "0.0",
load_firmware: b1_load_firmware, load_firmware: b1_load_firmware,
reset_ctr: b1_reset_ctr, reset_ctr: b1_reset_ctr,
remove_ctr: b1pcmcia_remove_ctr,
register_appl: b1_register_appl, register_appl: b1_register_appl,
release_appl: b1_release_appl, release_appl: b1_release_appl,
send_message: b1_send_message, send_message: b1_send_message,
...@@ -156,8 +155,6 @@ static struct capi_driver b1pcmcia_driver = { ...@@ -156,8 +155,6 @@ static struct capi_driver b1pcmcia_driver = {
procinfo: b1pcmcia_procinfo, procinfo: b1pcmcia_procinfo,
ctr_read_proc: b1ctl_read_proc, ctr_read_proc: b1ctl_read_proc,
driver_read_proc: 0, /* use standard driver_read_proc */ driver_read_proc: 0, /* use standard driver_read_proc */
add_card: 0,
}; };
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
......
...@@ -901,9 +901,9 @@ void c4_reset_ctr(struct capi_ctr *ctrl) ...@@ -901,9 +901,9 @@ void c4_reset_ctr(struct capi_ctr *ctrl)
card->nlogcontr = 0; 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; avmctrl_info *cinfo;
int i; int i;
...@@ -920,7 +920,6 @@ static void c4_remove_ctr(struct capi_ctr *ctrl) ...@@ -920,7 +920,6 @@ static void c4_remove_ctr(struct capi_ctr *ctrl)
free_irq(card->irq, card); free_irq(card->irq, card);
iounmap(card->mbase); iounmap(card->mbase);
release_region(card->port, AVMB1_PORTLEN); release_region(card->port, AVMB1_PORTLEN);
ctrl->driverdata = 0;
avmcard_dma_free(card->dma); avmcard_dma_free(card->dma);
b1_free_card(card); b1_free_card(card);
} }
...@@ -1215,7 +1214,6 @@ static struct capi_driver c2_driver = { ...@@ -1215,7 +1214,6 @@ static struct capi_driver c2_driver = {
revision: "0.0", revision: "0.0",
load_firmware: c4_load_firmware, load_firmware: c4_load_firmware,
reset_ctr: c4_reset_ctr, reset_ctr: c4_reset_ctr,
remove_ctr: c4_remove_ctr,
register_appl: c4_register_appl, register_appl: c4_register_appl,
release_appl: c4_release_appl, release_appl: c4_release_appl,
send_message: c4_send_message, send_message: c4_send_message,
...@@ -1223,8 +1221,6 @@ static struct capi_driver c2_driver = { ...@@ -1223,8 +1221,6 @@ static struct capi_driver c2_driver = {
procinfo: c4_procinfo, procinfo: c4_procinfo,
ctr_read_proc: c4_read_proc, ctr_read_proc: c4_read_proc,
driver_read_proc: 0, /* use standard driver_read_proc */ driver_read_proc: 0, /* use standard driver_read_proc */
add_card: 0, /* no add_card function */
}; };
static struct capi_driver c4_driver = { static struct capi_driver c4_driver = {
...@@ -1233,7 +1229,6 @@ static struct capi_driver c4_driver = { ...@@ -1233,7 +1229,6 @@ static struct capi_driver c4_driver = {
revision: "0.0", revision: "0.0",
load_firmware: c4_load_firmware, load_firmware: c4_load_firmware,
reset_ctr: c4_reset_ctr, reset_ctr: c4_reset_ctr,
remove_ctr: c4_remove_ctr,
register_appl: c4_register_appl, register_appl: c4_register_appl,
release_appl: c4_release_appl, release_appl: c4_release_appl,
send_message: c4_send_message, send_message: c4_send_message,
...@@ -1241,8 +1236,6 @@ static struct capi_driver c4_driver = { ...@@ -1241,8 +1236,6 @@ static struct capi_driver c4_driver = {
procinfo: c4_procinfo, procinfo: c4_procinfo,
ctr_read_proc: c4_read_proc, ctr_read_proc: c4_read_proc,
driver_read_proc: 0, /* use standard driver_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, static int __devinit c4_probe(struct pci_dev *dev,
...@@ -1282,6 +1275,7 @@ static struct pci_driver c4_pci_driver = { ...@@ -1282,6 +1275,7 @@ static struct pci_driver c4_pci_driver = {
name: "c4", name: "c4",
id_table: c4_pci_tbl, id_table: c4_pci_tbl,
probe: c4_probe, probe: c4_probe,
remove: c4_remove,
}; };
static int __init c4_init(void) static int __init c4_init(void)
......
...@@ -47,7 +47,7 @@ MODULE_LICENSE("GPL"); ...@@ -47,7 +47,7 @@ MODULE_LICENSE("GPL");
static int t1pci_add_card(struct capi_driver *driver, static int t1pci_add_card(struct capi_driver *driver,
struct capicardparams *p, struct capicardparams *p,
struct pci_dev *dev) struct pci_dev *pdev)
{ {
avmcard *card; avmcard *card;
avmctrl_info *cinfo; avmctrl_info *cinfo;
...@@ -60,7 +60,7 @@ static int t1pci_add_card(struct capi_driver *driver, ...@@ -60,7 +60,7 @@ static int t1pci_add_card(struct capi_driver *driver,
goto err; 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) { if (!card->dma) {
printk(KERN_WARNING "%s: no memory.\n", driver->name); printk(KERN_WARNING "%s: no memory.\n", driver->name);
retval = -ENOMEM; retval = -ENOMEM;
...@@ -125,6 +125,7 @@ static int t1pci_add_card(struct capi_driver *driver, ...@@ -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", "%s: AVM T1 PCI at i/o %#x, irq %d, mem %#lx\n",
driver->name, card->port, card->irq, card->membase); driver->name, card->port, card->irq, card->membase);
pci_set_drvdata(pdev, card);
return 0; return 0;
err_free_irq: err_free_irq:
...@@ -143,18 +144,17 @@ static int t1pci_add_card(struct capi_driver *driver, ...@@ -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 = pci_get_drvdata(pdev);
avmcard *card = cinfo->card; avmctrl_info *cinfo = card->ctrlinfo;
b1dma_reset(card); b1dma_reset(card);
detach_capi_ctr(ctrl); detach_capi_ctr(cinfo->capi_ctrl);
free_irq(card->irq, card); free_irq(card->irq, card);
iounmap(card->mbase); iounmap(card->mbase);
release_region(card->port, AVMB1_PORTLEN); release_region(card->port, AVMB1_PORTLEN);
ctrl->driverdata = 0;
avmcard_dma_free(card->dma); avmcard_dma_free(card->dma);
b1_free_card(card); b1_free_card(card);
} }
...@@ -185,7 +185,6 @@ static struct capi_driver t1pci_driver = { ...@@ -185,7 +185,6 @@ static struct capi_driver t1pci_driver = {
revision: "0.0", revision: "0.0",
load_firmware: b1dma_load_firmware, load_firmware: b1dma_load_firmware,
reset_ctr: b1dma_reset_ctr, reset_ctr: b1dma_reset_ctr,
remove_ctr: t1pci_remove_ctr,
register_appl: b1dma_register_appl, register_appl: b1dma_register_appl,
release_appl: b1dma_release_appl, release_appl: b1dma_release_appl,
send_message: b1dma_send_message, send_message: b1dma_send_message,
...@@ -193,8 +192,6 @@ static struct capi_driver t1pci_driver = { ...@@ -193,8 +192,6 @@ static struct capi_driver t1pci_driver = {
procinfo: t1pci_procinfo, procinfo: t1pci_procinfo,
ctr_read_proc: b1dmactl_read_proc, ctr_read_proc: b1dmactl_read_proc,
driver_read_proc: 0, /* use standard driver_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 = { ...@@ -235,6 +232,7 @@ static struct pci_driver t1pci_pci_driver = {
name: "t1pci", name: "t1pci",
id_table: t1pci_pci_tbl, id_table: t1pci_pci_tbl,
probe: t1pci_probe, probe: t1pci_probe,
remove: t1pci_remove,
}; };
static int __init t1pci_init(void) static int __init t1pci_init(void)
......
...@@ -693,7 +693,6 @@ static struct capi_driver hycapi_driver = { ...@@ -693,7 +693,6 @@ static struct capi_driver hycapi_driver = {
revision: "0.0", revision: "0.0",
load_firmware: hycapi_load_firmware, load_firmware: hycapi_load_firmware,
reset_ctr: hycapi_reset_ctr, reset_ctr: hycapi_reset_ctr,
remove_ctr: hycapi_remove_ctr,
register_appl: hycapi_register_appl, register_appl: hycapi_register_appl,
release_appl: hycapi_release_appl, release_appl: hycapi_release_appl,
send_message: hycapi_send_message, send_message: hycapi_send_message,
......
...@@ -66,7 +66,7 @@ typedef struct avmb1_extcarddef { ...@@ -66,7 +66,7 @@ typedef struct avmb1_extcarddef {
#define AVMB1_LOAD_AND_CONFIG 3 /* load image and config to 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 */ #define AVMB1_ADDCARD_WITH_TYPE 4 /* add a new card, with cardtype */
#define AVMB1_GET_CARDINFO 5 /* get 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 #define AVMB1_REGISTERCARD_IS_OBSOLETE
......
...@@ -80,7 +80,6 @@ struct capi_driver { ...@@ -80,7 +80,6 @@ struct capi_driver {
char revision[32]; char revision[32];
int (*load_firmware)(struct capi_ctr *, capiloaddata *); int (*load_firmware)(struct capi_ctr *, capiloaddata *);
void (*reset_ctr)(struct capi_ctr *); void (*reset_ctr)(struct capi_ctr *);
void (*remove_ctr)(struct capi_ctr *);
void (*register_appl)(struct capi_ctr *, __u16 appl, void (*register_appl)(struct capi_ctr *, __u16 appl,
capi_register_params *); capi_register_params *);
void (*release_appl)(struct capi_ctr *, __u16 appl); void (*release_appl)(struct capi_ctr *, __u16 appl);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment