From c5933354e2cc5b8979586de0175f3e373b26404f Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Fri, 17 May 2002 08:52:22 -0500 Subject: ISDN: Export CAPI user interface directly Why pass the callbacks via a struct when we can just call them directly? --- include/linux/kernelcapi.h | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) (limited to 'include/linux') diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index e6312ebffbc4..bc202f714255 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -49,28 +49,6 @@ typedef struct kcapi_carddef { #include -struct capi_interface { - __u16 (*capi_isinstalled) (void); - - __u16 (*capi_register) (capi_register_params * rparam, __u16 * applidp); - __u16 (*capi_release) (__u16 applid); - __u16 (*capi_put_message) (__u16 applid, struct sk_buff * msg); - __u16 (*capi_get_message) (__u16 applid, struct sk_buff ** msgp); - __u16 (*capi_set_signal) (__u16 applid, - void (*signal) (__u16 applid, void *param), - void *param); - __u16 (*capi_get_manufacturer) (__u32 contr, __u8 buf[CAPI_MANUFACTURER_LEN]); - __u16 (*capi_get_version) (__u32 contr, struct capi_version * verp); - __u16(*capi_get_serial) (__u32 contr, __u8 serial[CAPI_SERIAL_LEN]); - __u16(*capi_get_profile) (__u32 contr, struct capi_profile * profp); - - /* - * to init controllers, data is always in user memory - */ - int (*capi_manufacturer) (unsigned int cmd, void *data); - -}; - #define KCI_CONTRUP 0 /* struct capi_profile */ #define KCI_CONTRDOWN 1 /* NULL */ @@ -81,9 +59,22 @@ struct capi_interface_user { struct list_head user_list; }; -struct capi_interface *attach_capi_interface(struct capi_interface_user *); -int detach_capi_interface(struct capi_interface_user *); - +void attach_capi_interface(struct capi_interface_user *); +void detach_capi_interface(struct capi_interface_user *); + +u16 capi20_isinstalled(void); +u16 capi20_register(capi_register_params * rparam, u16 * applidp); +u16 capi20_release(u16 applid); +u16 capi20_put_message(u16 applid, struct sk_buff *skb); +u16 capi20_get_message(u16 applid, struct sk_buff **msgp); +u16 capi20_set_signal(u16 applid, + void (*signal) (u16 applid, void *param), + void *param); +u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN]); +u16 capi20_get_version(u32 contr, struct capi_version *verp); +u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]); +u16 capi20_get_profile(u32 contr, struct capi_profile *profp); +int capi20_manufacturer(unsigned int cmd, void *data); #define CAPI_NOERROR 0x0000 -- cgit v1.2.3 From 56424fa889987de9204325949351998d683f15eb Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Fri, 17 May 2002 09:10:53 -0500 Subject: ISDN: CAPI: Move the notification callback The callback to be notified of added/removed controllers is logically per application. This will be replaced by the standardized mechanism anyway, so the temporary capi20_set_callback will fortunately vanish later. --- drivers/isdn/capi/capidrv.c | 3 ++- drivers/isdn/capi/kcapi.c | 49 ++++++++++++++++++++++++++++----------------- include/linux/kernelcapi.h | 6 +++++- 3 files changed, 38 insertions(+), 20 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index d1b9f4902105..33fd333910c6 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c @@ -2293,7 +2293,6 @@ static void __exit proc_exit(void) static struct capi_interface_user cuser = { name: "capidrv", - callback: lower_callback }; static int __init capidrv_init(void) @@ -2327,6 +2326,8 @@ static int __init capidrv_init(void) return -EIO; } + capi20_set_callback(global.appid, lower_callback); + errcode = capi20_get_profile(0, &profile); if (errcode != CAPI_NOERROR) { capi20_release(global.appid); diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index 54020b351076..c97def3000f7 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c @@ -68,6 +68,11 @@ struct capi_appl { unsigned long nrecvdatapkt; unsigned long nsentctlpkt; unsigned long nsentdatapkt; + + /* ugly hack to allow for notification of added/removed + * controllers. The Right Way (tm) is known. XXX + */ + void (*callback) (unsigned int cmd, __u32 contr, void *data); }; struct capi_notifier { @@ -548,35 +553,33 @@ static int notify_push(unsigned int cmd, u32 controller, static void notify_up(u32 contr) { - struct list_head *l; - struct capi_interface_user *p; struct capi_ctr *card = get_capi_ctr_by_nr(contr); + struct capi_appl *ap; + u16 applid; - printk(KERN_NOTICE "kcapi: notify up contr %d\n", contr); - spin_lock(&users_lock); - list_for_each(l, &users) { - p = list_entry(l, struct capi_interface_user, user_list); - if (!p->callback) continue; - (*p->callback) (KCI_CONTRUP, contr, &card->profile); + printk(KERN_DEBUG "kcapi: notify up contr %d\n", contr); + + for (applid = 1; applid <= CAPI_MAXAPPL; applid++) { + ap = get_capi_appl_by_nr(applid); + if (ap && ap->callback) + ap->callback(KCI_CONTRUP, contr, &card->profile); } - spin_unlock(&users_lock); } /* -------- KCI_CONTRDOWN ------------------------------------- */ static void notify_down(u32 contr) { - struct list_head *l; - struct capi_interface_user *p; + struct capi_appl *ap; + u16 applid; - printk(KERN_NOTICE "kcapi: notify down contr %d\n", contr); - spin_lock(&users_lock); - list_for_each(l, &users) { - p = list_entry(l, struct capi_interface_user, user_list); - if (!p->callback) continue; - (*p->callback) (KCI_CONTRDOWN, contr, 0); + printk(KERN_DEBUG "kcapi: notify down contr %d\n", contr); + + for (applid = 1; applid <= CAPI_MAXAPPL; applid++) { + ap = get_capi_appl_by_nr(applid); + if (ap && ap->callback) + ap->callback(KCI_CONTRDOWN, contr, 0); } - spin_unlock(&users_lock); } /* ------------------------------------------------------------ */ @@ -1318,6 +1321,16 @@ int capi20_manufacturer(unsigned int cmd, void *data) EXPORT_SYMBOL(capi20_manufacturer); +/* temporary hack */ +void capi20_set_callback(u16 applid, void (*callback) (unsigned int cmd, __u32 contr, void *data)) +{ + struct capi_appl *ap = get_capi_appl_by_nr(applid); + + ap->callback = callback; +} + +EXPORT_SYMBOL(capi20_set_callback); + /* ------------------------------------------------------------- */ /* -------- Exported Functions --------------------------------- */ /* ------------------------------------------------------------- */ diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index bc202f714255..5162c2c98bc9 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -54,7 +54,6 @@ typedef struct kcapi_carddef { struct capi_interface_user { char name[20]; - void (*callback) (unsigned int cmd, __u32 contr, void *data); /* internal */ struct list_head user_list; }; @@ -76,6 +75,11 @@ u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]); u16 capi20_get_profile(u32 contr, struct capi_profile *profp); int capi20_manufacturer(unsigned int cmd, void *data); +/* temporary hack XXX */ +void capi20_set_callback(u16 applid, void (*callback) (unsigned int cmd, __u32 contr, void *data)); + + + #define CAPI_NOERROR 0x0000 #define CAPI_TOOMANYAPPLS 0x1001 -- cgit v1.2.3 From b77e092a5d06d651288d4f9030907e79a5ce9abf Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Fri, 17 May 2002 09:15:07 -0500 Subject: ISDN: CAPI: Remove capi_interface_user etc. It's not used anymore, registering/unregistering just happens on a per-application basis. --- drivers/isdn/capi/capi.c | 9 ------- drivers/isdn/capi/capidrv.c | 10 -------- drivers/isdn/capi/kcapi.c | 62 --------------------------------------------- include/linux/kernelcapi.h | 9 ------- 4 files changed, 90 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index 042b2d8a990c..d73796c664ac 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c @@ -1594,10 +1594,6 @@ static int __init alloc_init(void) return 0; } -static struct capi_interface_user cuser = { - name: "capi20", -}; - static char rev[32]; static int __init capi_init(void) @@ -1626,11 +1622,8 @@ static int __init capi_init(void) &capi_fops, NULL); printk(KERN_NOTICE "capi20: started up with major %d\n", capi_major); - attach_capi_interface(&cuser); - #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE if (capinc_tty_init() < 0) { - (void) detach_capi_interface(&cuser); devfs_unregister_chrdev(capi_major, "capi20"); MOD_DEC_USE_COUNT; return -ENOMEM; @@ -1641,7 +1634,6 @@ static int __init capi_init(void) #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE capinc_tty_exit(); #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ - (void) detach_capi_interface(&cuser); devfs_unregister_chrdev(capi_major, "capi20"); devfs_unregister(devfs_find_handle(NULL, "capi20", capi_major, 0, @@ -1679,7 +1671,6 @@ static void __exit capi_exit(void) #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE capinc_tty_exit(); #endif - (void) detach_capi_interface(&cuser); printk(KERN_NOTICE "capi: Rev %s: unloaded\n", rev); } diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index 33fd333910c6..c88fbb79c3ef 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c @@ -2291,10 +2291,6 @@ static void __exit proc_exit(void) } } -static struct capi_interface_user cuser = { - name: "capidrv", -}; - static int __init capidrv_init(void) { struct capi_register_params rparam; @@ -2306,8 +2302,6 @@ static int __init capidrv_init(void) MOD_INC_USE_COUNT; - attach_capi_interface(&cuser); - if ((p = strchr(revision, ':')) != 0 && p[1]) { strncpy(rev, p + 2, sizeof(rev)); rev[sizeof(rev)-1] = 0; @@ -2321,7 +2315,6 @@ static int __init capidrv_init(void) rparam.datablklen = 2048; errcode = capi20_register(&rparam, &global.appid); if (errcode) { - detach_capi_interface(&cuser); MOD_DEC_USE_COUNT; return -EIO; } @@ -2331,7 +2324,6 @@ static int __init capidrv_init(void) errcode = capi20_get_profile(0, &profile); if (errcode != CAPI_NOERROR) { capi20_release(global.appid); - detach_capi_interface(&cuser); MOD_DEC_USE_COUNT; return -EIO; } @@ -2368,8 +2360,6 @@ static void __exit capidrv_exit(void) capi20_release(global.appid); - detach_capi_interface(&cuser); - proc_exit(); printk(KERN_NOTICE "capidrv: Rev%s: unloaded\n", rev); diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index c97def3000f7..40e09d311adf 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c @@ -96,9 +96,6 @@ static struct capi_ctr *cards[CAPI_MAXCONTR]; static int ncards; static struct sk_buff_head recv_queue; -static LIST_HEAD(users); -static spinlock_t users_lock = SPIN_LOCK_UNLOCKED; - static LIST_HEAD(drivers); static spinlock_t drivers_lock = SPIN_LOCK_UNLOCKED; @@ -270,39 +267,6 @@ endloop: return len; } -/* - * /proc/capi/users: - * name - */ -static int proc_users_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct list_head *l; - struct capi_interface_user *cp; - int len = 0; - - spin_lock(&users_lock); - list_for_each(l, &users) { - cp = list_entry(l, struct capi_interface_user, user_list); - len += sprintf(page+len, "%s\n", cp->name); - if (len <= off) { - off -= len; - len = 0; - } else { - if (len-off > count) - goto endloop; - } - } -endloop: - spin_unlock(&users_lock); - *start = page+off; - if (len < count) - *eof = 1; - if (len>count) len = count; - if (len<0) len = 0; - return len; -} - /* * /proc/capi/controller: * cnr driver cardstate name driverinfo @@ -427,7 +391,6 @@ static struct procfsentries { { "capi", S_IFDIR, 0 }, { "capi/applications", 0 , proc_applications_read_proc }, { "capi/driver", 0 , proc_driver_read_proc }, - { "capi/users", 0 , proc_users_read_proc }, { "capi/controller", 0 , proc_controller_read_proc }, { "capi/applstats", 0 , proc_applstats_read_proc }, { "capi/contrstats", 0 , proc_contrstats_read_proc }, @@ -1331,31 +1294,6 @@ void capi20_set_callback(u16 applid, void (*callback) (unsigned int cmd, __u32 c EXPORT_SYMBOL(capi20_set_callback); -/* ------------------------------------------------------------- */ -/* -------- Exported Functions --------------------------------- */ -/* ------------------------------------------------------------- */ - -void attach_capi_interface(struct capi_interface_user *userp) -{ - - spin_lock(&users_lock); - list_add_tail(&userp->user_list, &users); - spin_unlock(&users_lock); - printk(KERN_NOTICE "kcapi: %s attached\n", userp->name); -} - -EXPORT_SYMBOL(attach_capi_interface); - -void detach_capi_interface(struct capi_interface_user *userp) -{ - spin_lock(&users_lock); - list_del(&userp->user_list); - spin_unlock(&users_lock); - printk(KERN_NOTICE "kcapi: %s detached\n", userp->name); -} - -EXPORT_SYMBOL(detach_capi_interface); - /* ------------------------------------------------------------- */ /* -------- Init & Cleanup ------------------------------------- */ /* ------------------------------------------------------------- */ diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index 5162c2c98bc9..1dd78feaad57 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -52,15 +52,6 @@ typedef struct kcapi_carddef { #define KCI_CONTRUP 0 /* struct capi_profile */ #define KCI_CONTRDOWN 1 /* NULL */ -struct capi_interface_user { - char name[20]; - /* internal */ - struct list_head user_list; -}; - -void attach_capi_interface(struct capi_interface_user *); -void detach_capi_interface(struct capi_interface_user *); - u16 capi20_isinstalled(void); u16 capi20_register(capi_register_params * rparam, u16 * applidp); u16 capi20_release(u16 applid); -- cgit v1.2.3 From 10b080a3bd276e723c5359763667ade360e9b57a Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Fri, 17 May 2002 09:39:18 -0500 Subject: ISDN: Have the CAPI application alloc struct capi_appl Inside the kernel, we rather go the standard way than converting to/from indices to the actual data structs all the time. --- drivers/isdn/capi/capi.c | 50 +++++++++++------------ drivers/isdn/capi/capidrv.c | 56 ++++++++++++------------- drivers/isdn/capi/kcapi.c | 99 +++++++++++++++++---------------------------- include/linux/kernelcapi.h | 26 +++++++++++- 4 files changed, 113 insertions(+), 118 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index d73796c664ac..cf152cd8945b 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c @@ -121,7 +121,7 @@ struct capincci { struct capidev { struct list_head list; - u16 applid; + struct capi20_appl ap; u16 errcode; unsigned userflags; @@ -309,7 +309,7 @@ static struct capincci *capincci_alloc(struct capidev *cdev, u32 ncci) #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE mp = 0; if (cdev->userflags & CAPIFLAG_HIGHJACKING) - mp = np->minorp = capiminor_alloc(cdev->applid, ncci); + mp = np->minorp = capiminor_alloc(cdev->ap.applid, ncci); if (mp) { mp->nccip = np; #ifdef _DEBUG_REFCOUNT @@ -399,10 +399,10 @@ static void capidev_free(struct capidev *cdev) { unsigned long flags; - if (cdev->applid) - capi20_release(cdev->applid); // XXX - cdev->applid = 0; - + if (cdev->ap.applid) { + capi20_release(&cdev->ap); + cdev->ap.applid = 0; + } skb_queue_purge(&cdev->recvqueue); write_lock_irqsave(&capidev_list_lock, flags); @@ -583,7 +583,7 @@ static void capi_signal(u16 applid, void *param) return; } - BUG_ON(cdev->applid != applid); + BUG_ON(cdev->ap.applid != applid); if (CAPIMSG_COMMAND(skb->data) == CAPI_CONNECT_B3_CONF) { u16 info = CAPIMSG_U16(skb->data, 12); // Info field @@ -666,7 +666,7 @@ capi_read(struct file *file, char *buf, size_t count, loff_t *ppos) if (ppos != &file->f_pos) return -ESPIPE; - if (!cdev->applid) + if (!cdev->ap.applid) return -ENODEV; if ((skb = skb_dequeue(&cdev->recvqueue)) == 0) { @@ -717,7 +717,7 @@ capi_write(struct file *file, const char *buf, size_t count, loff_t *ppos) if (ppos != &file->f_pos) return -ESPIPE; - if (!cdev->applid) + if (!cdev->ap.applid) return -ENODEV; skb = alloc_skb(count, GFP_USER); @@ -740,14 +740,14 @@ capi_write(struct file *file, const char *buf, size_t count, loff_t *ppos) return -EINVAL; } } - CAPIMSG_SETAPPID(skb->data, cdev->applid); + CAPIMSG_SETAPPID(skb->data, cdev->ap.applid); if (CAPIMSG_COMMAND(skb->data) == CAPI_DISCONNECT_B3_RESP) { capincci_free(cdev, CAPIMSG_NCCI(skb->data)); } - cdev->errcode = capi20_put_message(cdev->applid, skb); + cdev->errcode = capi20_put_message(cdev->ap.applid, skb); if (cdev->errcode) { kfree_skb(skb); @@ -767,7 +767,7 @@ capi_poll(struct file *file, poll_table * wait) struct capidev *cdev = (struct capidev *)file->private_data; unsigned int mask = 0; - if (!cdev->applid) + if (!cdev->ap.applid) return POLLERR; poll_wait(file, &(cdev->recvwait), wait); @@ -779,7 +779,7 @@ capi_poll(struct file *file, poll_table * wait) static int capi_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) + unsigned int cmd, unsigned long arg) { struct capidev *cdev = (struct capidev *)file->private_data; capi_ioctl_struct data; @@ -788,21 +788,21 @@ capi_ioctl(struct inode *inode, struct file *file, switch (cmd) { case CAPI_REGISTER: { - retval = copy_from_user((void *) &data.rparams, - (void *) arg, sizeof(struct capi_register_params)); - if (retval) - return -EFAULT; - if (cdev->applid) + if (cdev->ap.applid) return -EEXIST; - cdev->errcode = capi20_register(&data.rparams, - &cdev->applid); + + if (copy_from_user(&cdev->ap.rparam, (void *) arg, + sizeof(struct capi_register_params))) + return -EFAULT; + + cdev->errcode = capi20_register(&cdev->ap); if (cdev->errcode) { - cdev->applid = 0; + cdev->ap.applid = 0; return -EIO; } - capi20_set_signal(cdev->applid, capi_signal, cdev); + capi20_set_signal(cdev->ap.applid, capi_signal, cdev); } - return (int)cdev->applid; + return (int)cdev->ap.applid; case CAPI_GET_VERSION: { @@ -1426,7 +1426,7 @@ static int proc_capidev_read_proc(char *page, char **start, off_t off, list_for_each(l, &capidev_list) { cdev = list_entry(l, struct capidev, list); len += sprintf(page+len, "0 %d %lu %lu %lu %lu\n", - cdev->applid, + cdev->ap.applid, cdev->nrecvctlpkt, cdev->nrecvdatapkt, cdev->nsentctlpkt, @@ -1466,7 +1466,7 @@ static int proc_capincci_read_proc(char *page, char **start, off_t off, cdev = list_entry(l, struct capidev, list); for (np=cdev->nccis; np; np = np->next) { len += sprintf(page+len, "%d 0x%x\n", - cdev->applid, + cdev->ap.applid, np->ncci); if (len <= off) { off -= len; diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index c88fbb79c3ef..74ec0b59b542 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c @@ -125,10 +125,10 @@ struct capidrv_contr { struct capidrv_data { - u16 appid; + struct capi20_appl ap; int ncontr; struct capidrv_contr *contr_list; - + /* statistic */ unsigned long nrecvctlpkt; unsigned long nrecvdatapkt; @@ -518,7 +518,7 @@ static void send_message(capidrv_contr * card, _cmsg * cmsg) len = CAPIMSG_LEN(cmsg->buf); skb = alloc_skb(len, GFP_ATOMIC); memcpy(skb_put(skb, len), cmsg->buf, len); - capi20_put_message(global.appid, skb); + capi20_put_message(global.ap.applid, skb); global.nsentctlpkt++; } @@ -666,7 +666,7 @@ static void n0(capidrv_contr * card, capidrv_ncci * ncci) isdn_ctrl cmd; capi_fill_DISCONNECT_REQ(&cmsg, - global.appid, + global.ap.applid, card->msgid++, ncci->plcip->plci, 0, /* BChannelinformation */ @@ -954,7 +954,7 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg) cmd.parm.setup.si2, cmd.parm.setup.eazmsn); capi_fill_ALERT_REQ(cmsg, - global.appid, + global.ap.applid, card->msgid++, plcip->plci, /* adr */ 0, /* BChannelinformation */ @@ -1094,7 +1094,7 @@ static void handle_plci(_cmsg * cmsg) break; /* $$$$ */ } capi_fill_CONNECT_B3_REQ(cmsg, - global.appid, + global.ap.applid, card->msgid++, plcip->plci, /* adr */ 0 /* NCPI */ @@ -1211,7 +1211,7 @@ static void handle_ncci(_cmsg * cmsg) if (nccip) { ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_IND); capi_fill_CONNECT_B3_RESP(cmsg, - global.appid, + global.ap.applid, card->msgid++, nccip->ncci, /* adr */ 0, /* Reject */ @@ -1229,7 +1229,7 @@ static void handle_ncci(_cmsg * cmsg) cmsg->adr.adrNCCI); } capi_fill_CONNECT_B3_RESP(cmsg, - global.appid, + global.ap.applid, card->msgid++, cmsg->adr.adrNCCI, 2, /* Reject */ @@ -1376,7 +1376,7 @@ static void capidrv_signal(u16 applid, void *dummy) { struct sk_buff *skb = 0; - while (capi20_get_message(global.appid, &skb) == CAPI_NOERROR) { + while (capi20_get_message(global.ap.applid, &skb) == CAPI_NOERROR) { capi_message2cmsg(&s_cmsg, skb->data); if (debugmode > 2) printk(KERN_DEBUG "capidrv_signal: applid=%d %s\n", @@ -1627,7 +1627,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card) } capi_fill_CONNECT_REQ(&cmdcmsg, - global.appid, + global.ap.applid, card->msgid++, card->contrnr, /* adr */ si2cip(bchan->si1, bchan->si2), /* cipvalue */ @@ -1673,7 +1673,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card) c->arg, bchan->l2, bchan->l3); capi_fill_CONNECT_RESP(&cmdcmsg, - global.appid, + global.ap.applid, card->msgid++, bchan->plcip->plci, /* adr */ 0, /* Reject */ @@ -1720,7 +1720,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card) if (bchan->nccip) { bchan->disconnecting = 1; capi_fill_DISCONNECT_B3_REQ(&cmdcmsg, - global.appid, + global.ap.applid, card->msgid++, bchan->nccip->ncci, 0 /* NCPI */ @@ -1741,7 +1741,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card) } else if (bchan->plcip->plci) { bchan->disconnecting = 1; capi_fill_DISCONNECT_REQ(&cmdcmsg, - global.appid, + global.ap.applid, card->msgid++, bchan->plcip->plci, 0, /* BChannelinformation */ @@ -1888,7 +1888,7 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb) return 0; } datahandle = nccip->datahandle; - capi_fill_DATA_B3_REQ(&sendcmsg, global.appid, card->msgid++, + capi_fill_DATA_B3_REQ(&sendcmsg, global.ap.applid, card->msgid++, nccip->ncci, /* adr */ (u32) skb->data, /* Data */ skb->len, /* DataLength */ @@ -1912,7 +1912,7 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb) printk(KERN_DEBUG "capidrv-%d: only %d bytes headroom, need %d\n", card->contrnr, skb_headroom(skb), msglen); memcpy(skb_push(nskb, msglen), sendcmsg.buf, msglen); - errcode = capi20_put_message(global.appid, nskb); + errcode = capi20_put_message(global.ap.applid, nskb); if (errcode == CAPI_NOERROR) { dev_kfree_skb(skb); nccip->datahandle++; @@ -1924,7 +1924,7 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb) return errcode == CAPI_SENDQUEUEFULL ? 0 : -1; } else { memcpy(skb_push(skb, msglen), sendcmsg.buf, msglen); - errcode = capi20_put_message(global.appid, skb); + errcode = capi20_put_message(global.ap.applid, skb); if (errcode == CAPI_NOERROR) { nccip->datahandle++; global.nsentdatapkt++; @@ -1992,7 +1992,7 @@ static void enable_dchannel_trace(capidrv_contr *card) if (avmversion[0] > 3 || (avmversion[0] == 3 && avmversion[1] > 5)) { printk(KERN_INFO "%s: D2 trace enabled\n", card->name); - capi_fill_MANUFACTURER_REQ(&cmdcmsg, global.appid, + capi_fill_MANUFACTURER_REQ(&cmdcmsg, global.ap.applid, card->msgid++, contr, 0x214D5641, /* ManuID */ @@ -2001,7 +2001,7 @@ static void enable_dchannel_trace(capidrv_contr *card) (_cstruct)"\004\200\014\000\000"); } else { printk(KERN_INFO "%s: D3 trace enabled\n", card->name); - capi_fill_MANUFACTURER_REQ(&cmdcmsg, global.appid, + capi_fill_MANUFACTURER_REQ(&cmdcmsg, global.ap.applid, card->msgid++, contr, 0x214D5641, /* ManuID */ @@ -2015,7 +2015,7 @@ static void enable_dchannel_trace(capidrv_contr *card) static void send_listen(capidrv_contr *card) { - capi_fill_LISTEN_REQ(&cmdcmsg, global.appid, + capi_fill_LISTEN_REQ(&cmdcmsg, global.ap.applid, card->msgid++, card->contrnr, /* controller */ 1 << 6, /* Infomask */ @@ -2293,7 +2293,6 @@ static void __exit proc_exit(void) static int __init capidrv_init(void) { - struct capi_register_params rparam; capi_profile profile; char rev[32]; char *p; @@ -2310,25 +2309,26 @@ static int __init capidrv_init(void) } else strcpy(rev, "1.0"); - rparam.level3cnt = -2; /* number of bchannels twice */ - rparam.datablkcnt = 16; - rparam.datablklen = 2048; - errcode = capi20_register(&rparam, &global.appid); + global.ap.rparam.level3cnt = -2; /* number of bchannels twice */ + global.ap.rparam.datablkcnt = 16; + global.ap.rparam.datablklen = 2048; + + errcode = capi20_register(&global.ap); if (errcode) { MOD_DEC_USE_COUNT; return -EIO; } - capi20_set_callback(global.appid, lower_callback); + capi20_set_callback(global.ap.applid, lower_callback); errcode = capi20_get_profile(0, &profile); if (errcode != CAPI_NOERROR) { - capi20_release(global.appid); + capi20_release(&global.ap); MOD_DEC_USE_COUNT; return -EIO; } - capi20_set_signal(global.appid, capidrv_signal, 0); + capi20_set_signal(global.ap.applid, capidrv_signal, 0); ncontr = profile.ncontroller; for (contr = 1; contr <= ncontr; contr++) { @@ -2358,7 +2358,7 @@ static void __exit capidrv_exit(void) strcpy(rev, " ??? "); } - capi20_release(global.appid); + capi20_release(&global.ap); proc_exit(); diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index 40e09d311adf..35db4a484930 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c @@ -55,26 +55,6 @@ MODULE_PARM(showcapimsgs, "i"); /* ------------------------------------------------------------- */ -struct capi_appl { - u16 applid; - capi_register_params rparam; - void *param; - void (*signal) (u16 applid, void *param); - struct sk_buff_head recv_queue; - int nncci; - struct capi_ncci *nccilist; - - unsigned long nrecvctlpkt; - unsigned long nrecvdatapkt; - unsigned long nsentctlpkt; - unsigned long nsentdatapkt; - - /* ugly hack to allow for notification of added/removed - * controllers. The Right Way (tm) is known. XXX - */ - void (*callback) (unsigned int cmd, __u32 contr, void *data); -}; - struct capi_notifier { struct capi_notifier *next; unsigned int cmd; @@ -91,7 +71,7 @@ static char capi_manufakturer[64] = "AVM Berlin"; #define NCCI2CTRL(ncci) (((ncci) >> 24) & 0x7f) -static struct capi_appl *applications[CAPI_MAXAPPL]; +static struct capi20_appl *applications[CAPI_MAXAPPL]; static struct capi_ctr *cards[CAPI_MAXCONTR]; static int ncards; static struct sk_buff_head recv_queue; @@ -136,7 +116,7 @@ static inline struct capi_ctr *get_capi_ctr_by_nr(u16 contr) return cards[contr - 1]; } -static inline struct capi_appl *get_capi_appl_by_nr(u16 applid) +static inline struct capi20_appl *get_capi_appl_by_nr(u16 applid) { if (applid - 1 >= CAPI_MAXAPPL) return NULL; @@ -199,7 +179,7 @@ static inline int capi_subcmd_valid(u8 subcmd) static int proc_applications_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { - struct capi_appl *ap; + struct capi20_appl *ap; int i; int len = 0; @@ -313,7 +293,7 @@ endloop: static int proc_applstats_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { - struct capi_appl *ap; + struct capi20_appl *ap; int i; int len = 0; @@ -517,7 +497,7 @@ static int notify_push(unsigned int cmd, u32 controller, static void notify_up(u32 contr) { struct capi_ctr *card = get_capi_ctr_by_nr(contr); - struct capi_appl *ap; + struct capi20_appl *ap; u16 applid; printk(KERN_DEBUG "kcapi: notify up contr %d\n", contr); @@ -533,7 +513,7 @@ static void notify_up(u32 contr) static void notify_down(u32 contr) { - struct capi_appl *ap; + struct capi20_appl *ap; u16 applid; printk(KERN_DEBUG "kcapi: notify down contr %d\n", contr); @@ -576,7 +556,7 @@ static void notify_handler(void *dummy) static void recv_handler(void *dummy) { struct sk_buff *skb; - struct capi_appl *ap; + struct capi20_appl *ap; while ((skb = skb_dequeue(&recv_queue)) != 0) { ap = get_capi_appl_by_nr(CAPIMSG_APPID(skb->data)); @@ -650,7 +630,7 @@ error: static void controllercb_ready(struct capi_ctr * card) { u16 appl; - struct capi_appl *ap; + struct capi20_appl *ap; card->cardstate = CARD_RUNNING; @@ -683,7 +663,7 @@ static void controllercb_reseted(struct capi_ctr * card) memset(card->serial, 0, sizeof(card->serial)); for (appl = 1; appl <= CAPI_MAXAPPL; appl++) { - struct capi_appl *ap = get_capi_appl_by_nr(appl); + struct capi20_appl *ap = get_capi_appl_by_nr(appl); if (!ap) continue; @@ -870,69 +850,62 @@ u16 capi20_isinstalled(void) EXPORT_SYMBOL(capi20_isinstalled); -u16 capi20_register(capi_register_params * rparam, u16 * applidp) +u16 capi20_register(struct capi20_appl *ap) { - struct capi_appl *ap; - int appl; int i; + u16 applid; DBG(""); - if (rparam->datablklen < 128) + if (ap->rparam.datablklen < 128) return CAPI_LOGBLKSIZETOSMALL; - for (appl = 1; appl <= CAPI_MAXAPPL; appl++) { - if (applications[appl - 1] == NULL) + for (applid = 1; applid <= CAPI_MAXAPPL; applid++) { + if (applications[applid - 1] == NULL) break; } - if (appl > CAPI_MAXAPPL) + if (applid > CAPI_MAXAPPL) return CAPI_TOOMANYAPPLS; - ap = kmalloc(sizeof(*ap), GFP_KERNEL); - if (!ap) - return CAPI_REGOSRESOURCEERR; + ap->applid = applid; + applications[applid - 1] = ap; - memset(ap, 0, sizeof(*ap)); - ap->applid = appl; - applications[appl - 1] = ap; - + ap->param = NULL; + ap->signal = NULL; skb_queue_head_init(&ap->recv_queue); ap->nncci = 0; - - memcpy(&ap->rparam, rparam, sizeof(capi_register_params)); - + ap->nrecvctlpkt = 0; + ap->nrecvdatapkt = 0; + ap->nsentctlpkt = 0; + ap->nsentdatapkt = 0; + ap->callback = 0; + for (i = 0; i < CAPI_MAXCONTR; i++) { if (!cards[i] || cards[i]->cardstate != CARD_RUNNING) continue; - register_appl(cards[i], appl, &ap->rparam); + register_appl(cards[i], applid, &ap->rparam); } - *applidp = appl; - printk(KERN_INFO "kcapi: appl %d up\n", appl); + printk(KERN_DEBUG "kcapi: appl %d up\n", applid); return CAPI_NOERROR; } EXPORT_SYMBOL(capi20_register); -u16 capi20_release(u16 applid) +u16 capi20_release(struct capi20_appl *ap) { - struct capi_appl *ap = get_capi_appl_by_nr(applid); int i; - DBG("applid %#x", applid); - - if (!ap) - return CAPI_ILLAPPNR; + DBG("applid %#x", ap->applid); skb_queue_purge(&ap->recv_queue); for (i = 0; i < CAPI_MAXCONTR; i++) { if (!cards[i] || cards[i]->cardstate != CARD_RUNNING) continue; - release_appl(cards[i], applid); + release_appl(cards[i], ap->applid); } - applications[applid - 1] = NULL; - kfree(ap); - printk(KERN_INFO "kcapi: appl %d down\n", applid); + applications[ap->applid - 1] = NULL; + printk(KERN_DEBUG "kcapi: appl %d down\n", ap->applid); return CAPI_NOERROR; } @@ -942,7 +915,7 @@ EXPORT_SYMBOL(capi20_release); u16 capi20_put_message(u16 applid, struct sk_buff *skb) { struct capi_ctr *card; - struct capi_appl *ap; + struct capi20_appl *ap; int showctl = 0; u8 cmd, subcmd; @@ -1000,7 +973,7 @@ EXPORT_SYMBOL(capi20_put_message); u16 capi20_get_message(u16 applid, struct sk_buff **msgp) { - struct capi_appl *ap = get_capi_appl_by_nr(applid); + struct capi20_appl *ap = get_capi_appl_by_nr(applid); struct sk_buff *skb; if (!ap) @@ -1017,7 +990,7 @@ u16 capi20_set_signal(u16 applid, void (*signal) (u16 applid, void *param), void *param) { - struct capi_appl *ap = get_capi_appl_by_nr(applid); + struct capi20_appl *ap = get_capi_appl_by_nr(applid); if (!ap) return CAPI_ILLAPPNR; @@ -1287,7 +1260,7 @@ EXPORT_SYMBOL(capi20_manufacturer); /* temporary hack */ void capi20_set_callback(u16 applid, void (*callback) (unsigned int cmd, __u32 contr, void *data)) { - struct capi_appl *ap = get_capi_appl_by_nr(applid); + struct capi20_appl *ap = get_capi_appl_by_nr(applid); ap->callback = callback; } diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index 1dd78feaad57..e783ba610e9e 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -52,9 +52,31 @@ typedef struct kcapi_carddef { #define KCI_CONTRUP 0 /* struct capi_profile */ #define KCI_CONTRDOWN 1 /* NULL */ +struct capi20_appl { + u16 applid; + capi_register_params rparam; + + /* internal to kernelcapi.o */ + void *param; + void (*signal) (u16 applid, void *param); + struct sk_buff_head recv_queue; + int nncci; + struct capi_ncci *nccilist; + + unsigned long nrecvctlpkt; + unsigned long nrecvdatapkt; + unsigned long nsentctlpkt; + unsigned long nsentdatapkt; + + /* ugly hack to allow for notification of added/removed + * controllers. The Right Way (tm) is known. XXX + */ + void (*callback) (unsigned int cmd, __u32 contr, void *data); +}; + u16 capi20_isinstalled(void); -u16 capi20_register(capi_register_params * rparam, u16 * applidp); -u16 capi20_release(u16 applid); +u16 capi20_register(struct capi20_appl *ap); +u16 capi20_release(struct capi20_appl *ap); u16 capi20_put_message(u16 applid, struct sk_buff *skb); u16 capi20_get_message(u16 applid, struct sk_buff **msgp); u16 capi20_set_signal(u16 applid, -- cgit v1.2.3 From 1d1a9e39b60f473db6d917c82a4242e39a61bf9d Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Fri, 17 May 2002 09:56:53 -0500 Subject: ISDN: CAPI: Pass struct capi_appl * instead of index Now that we have the struct capi_appl *, let's pass this around instead of just an index which would mean another useless lookup. --- drivers/isdn/capi/capi.c | 35 +++++++++++++++++------------------ drivers/isdn/capi/capidrv.c | 12 ++++++------ drivers/isdn/capi/kcapi.c | 28 +++++++++++----------------- include/linux/kernelcapi.h | 9 +++++---- 4 files changed, 39 insertions(+), 45 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index cf152cd8945b..b105ae3ecc49 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c @@ -84,7 +84,7 @@ struct capiminor { struct capincci *nccip; unsigned int minor; - u16 applid; + struct capi20_appl *ap; u32 ncci; u16 datahandle; u16 msgid; @@ -207,7 +207,7 @@ static void capiminor_del_all_ack(struct capiminor *mp) /* -------- struct capiminor ---------------------------------------- */ -static struct capiminor *capiminor_alloc(u16 applid, u32 ncci) +static struct capiminor *capiminor_alloc(struct capi20_appl *ap, u32 ncci) { struct capiminor *mp, *p; struct list_head *l; @@ -225,7 +225,7 @@ static struct capiminor *capiminor_alloc(u16 applid, u32 ncci) printk(KERN_DEBUG "capiminor_alloc %d\n", GET_USE_COUNT(THIS_MODULE)); #endif memset(mp, 0, sizeof(struct capiminor)); - mp->applid = applid; + mp->ap = ap; mp->ncci = ncci; mp->msgid = 0; atomic_set(&mp->ttyopencount,0); @@ -309,7 +309,7 @@ static struct capincci *capincci_alloc(struct capidev *cdev, u32 ncci) #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE mp = 0; if (cdev->userflags & CAPIFLAG_HIGHJACKING) - mp = np->minorp = capiminor_alloc(cdev->ap.applid, ncci); + mp = np->minorp = capiminor_alloc(&cdev->ap, ncci); if (mp) { mp->nccip = np; #ifdef _DEBUG_REFCOUNT @@ -423,7 +423,7 @@ gen_data_b3_resp_for(struct capiminor *mp, struct sk_buff *skb) u16 datahandle = CAPIMSG_U16(skb->data,CAPIMSG_BASELEN+4+4+2); unsigned char *s = skb_put(nskb, CAPI_DATA_B3_RESP_LEN); capimsg_setu16(s, 0, CAPI_DATA_B3_RESP_LEN); - capimsg_setu16(s, 2, mp->applid); + capimsg_setu16(s, 2, mp->ap->applid); capimsg_setu8 (s, 4, CAPI_DATA_B3); capimsg_setu8 (s, 5, CAPI_RESP); capimsg_setu16(s, 6, mp->msgid++); @@ -463,7 +463,7 @@ static int handle_recv_skb(struct capiminor *mp, struct sk_buff *skb) return -1; } datahandle = CAPIMSG_U16(skb->data,CAPIMSG_BASELEN+4); - errcode = capi20_put_message(mp->applid, nskb); + errcode = capi20_put_message(mp->ap, nskb); if (errcode != CAPI_NOERROR) { printk(KERN_ERR "capi: send DATA_B3_RESP failed=%x\n", errcode); @@ -521,7 +521,7 @@ static int handle_minor_send(struct capiminor *mp) skb_push(skb, CAPI_DATA_B3_REQ_LEN); memset(skb->data, 0, CAPI_DATA_B3_REQ_LEN); capimsg_setu16(skb->data, 0, CAPI_DATA_B3_REQ_LEN); - capimsg_setu16(skb->data, 2, mp->applid); + capimsg_setu16(skb->data, 2, mp->ap->applid); capimsg_setu8 (skb->data, 4, CAPI_DATA_B3); capimsg_setu8 (skb->data, 5, CAPI_REQ); capimsg_setu16(skb->data, 6, mp->msgid++); @@ -536,7 +536,7 @@ static int handle_minor_send(struct capiminor *mp) skb_queue_head(&mp->outqueue, skb); return count; } - errcode = capi20_put_message(mp->applid, skb); + errcode = capi20_put_message(mp->ap, skb); if (errcode == CAPI_NOERROR) { mp->datahandle++; count++; @@ -577,14 +577,12 @@ static void capi_signal(u16 applid, void *param) struct sk_buff *skb = 0; u32 ncci; - capi20_get_message(applid, &skb); + capi20_get_message(&cdev->ap, &skb); if (!skb) { printk(KERN_ERR "BUG: capi_signal: no skb\n"); return; } - BUG_ON(cdev->ap.applid != applid); - if (CAPIMSG_COMMAND(skb->data) == CAPI_CONNECT_B3_CONF) { u16 info = CAPIMSG_U16(skb->data, 12); // Info field if (info == 0) @@ -747,7 +745,7 @@ capi_write(struct file *file, const char *buf, size_t count, loff_t *ppos) } - cdev->errcode = capi20_put_message(cdev->ap.applid, skb); + cdev->errcode = capi20_put_message(&cdev->ap, skb); if (cdev->errcode) { kfree_skb(skb); @@ -781,28 +779,29 @@ static int capi_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct capidev *cdev = (struct capidev *)file->private_data; + struct capidev *cdev = file->private_data; + struct capi20_appl *ap = &cdev->ap; capi_ioctl_struct data; int retval = -EINVAL; switch (cmd) { case CAPI_REGISTER: { - if (cdev->ap.applid) + if (ap->applid) return -EEXIST; if (copy_from_user(&cdev->ap.rparam, (void *) arg, sizeof(struct capi_register_params))) return -EFAULT; - cdev->errcode = capi20_register(&cdev->ap); + cdev->errcode = capi20_register(ap); if (cdev->errcode) { - cdev->ap.applid = 0; + ap->applid = 0; return -EIO; } - capi20_set_signal(cdev->ap.applid, capi_signal, cdev); + capi20_set_signal(ap, capi_signal, cdev); } - return (int)cdev->ap.applid; + return (int)ap->applid; case CAPI_GET_VERSION: { diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index 74ec0b59b542..91a5639c36fe 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c @@ -518,7 +518,7 @@ static void send_message(capidrv_contr * card, _cmsg * cmsg) len = CAPIMSG_LEN(cmsg->buf); skb = alloc_skb(len, GFP_ATOMIC); memcpy(skb_put(skb, len), cmsg->buf, len); - capi20_put_message(global.ap.applid, skb); + capi20_put_message(&global.ap, skb); global.nsentctlpkt++; } @@ -1376,7 +1376,7 @@ static void capidrv_signal(u16 applid, void *dummy) { struct sk_buff *skb = 0; - while (capi20_get_message(global.ap.applid, &skb) == CAPI_NOERROR) { + while (capi20_get_message(&global.ap, &skb) == CAPI_NOERROR) { capi_message2cmsg(&s_cmsg, skb->data); if (debugmode > 2) printk(KERN_DEBUG "capidrv_signal: applid=%d %s\n", @@ -1912,7 +1912,7 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb) printk(KERN_DEBUG "capidrv-%d: only %d bytes headroom, need %d\n", card->contrnr, skb_headroom(skb), msglen); memcpy(skb_push(nskb, msglen), sendcmsg.buf, msglen); - errcode = capi20_put_message(global.ap.applid, nskb); + errcode = capi20_put_message(&global.ap, nskb); if (errcode == CAPI_NOERROR) { dev_kfree_skb(skb); nccip->datahandle++; @@ -1924,7 +1924,7 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb) return errcode == CAPI_SENDQUEUEFULL ? 0 : -1; } else { memcpy(skb_push(skb, msglen), sendcmsg.buf, msglen); - errcode = capi20_put_message(global.ap.applid, skb); + errcode = capi20_put_message(&global.ap, skb); if (errcode == CAPI_NOERROR) { nccip->datahandle++; global.nsentdatapkt++; @@ -2319,7 +2319,7 @@ static int __init capidrv_init(void) return -EIO; } - capi20_set_callback(global.ap.applid, lower_callback); + capi20_set_callback(&global.ap, lower_callback); errcode = capi20_get_profile(0, &profile); if (errcode != CAPI_NOERROR) { @@ -2328,7 +2328,7 @@ static int __init capidrv_init(void) return -EIO; } - capi20_set_signal(global.ap.applid, capidrv_signal, 0); + capi20_set_signal(&global.ap, capidrv_signal, 0); ncontr = profile.ncontroller; for (contr = 1; contr <= ncontr; contr++) { diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index 35db4a484930..38db8a4b2369 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c @@ -912,19 +912,17 @@ u16 capi20_release(struct capi20_appl *ap) EXPORT_SYMBOL(capi20_release); -u16 capi20_put_message(u16 applid, struct sk_buff *skb) +u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb) { struct capi_ctr *card; - struct capi20_appl *ap; int showctl = 0; u8 cmd, subcmd; - DBG("applid %#x", applid); + DBG("applid %#x", ap->applid); if (ncards == 0) return CAPI_REGNOTINSTALLED; - ap = get_capi_appl_by_nr(applid); - if (!ap) + if (ap->applid == 0) return CAPI_ILLAPPNR; if (skb->len < 12 || !capi_cmd_valid(CAPIMSG_COMMAND(skb->data)) @@ -971,12 +969,11 @@ u16 capi20_put_message(u16 applid, struct sk_buff *skb) EXPORT_SYMBOL(capi20_put_message); -u16 capi20_get_message(u16 applid, struct sk_buff **msgp) +u16 capi20_get_message(struct capi20_appl *ap, struct sk_buff **msgp) { - struct capi20_appl *ap = get_capi_appl_by_nr(applid); struct sk_buff *skb; - if (!ap) + if (ap->applid == 0) return CAPI_ILLAPPNR; if ((skb = skb_dequeue(&ap->recv_queue)) == 0) return CAPI_RECEIVEQUEUEEMPTY; @@ -986,13 +983,11 @@ u16 capi20_get_message(u16 applid, struct sk_buff **msgp) EXPORT_SYMBOL(capi20_get_message); -u16 capi20_set_signal(u16 applid, - void (*signal) (u16 applid, void *param), - void *param) +u16 capi20_set_signal(struct capi20_appl *ap, + void (*signal) (u16 applid, void *param), + void *param) { - struct capi20_appl *ap = get_capi_appl_by_nr(applid); - - if (!ap) + if (ap->applid == 0) return CAPI_ILLAPPNR; ap->signal = signal; ap->param = param; @@ -1258,10 +1253,9 @@ int capi20_manufacturer(unsigned int cmd, void *data) EXPORT_SYMBOL(capi20_manufacturer); /* temporary hack */ -void capi20_set_callback(u16 applid, void (*callback) (unsigned int cmd, __u32 contr, void *data)) +void capi20_set_callback(struct capi20_appl *ap, + void (*callback) (unsigned int cmd, __u32 contr, void *data)) { - struct capi20_appl *ap = get_capi_appl_by_nr(applid); - ap->callback = callback; } diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index e783ba610e9e..81b32c37bad4 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -77,9 +77,9 @@ struct capi20_appl { u16 capi20_isinstalled(void); u16 capi20_register(struct capi20_appl *ap); u16 capi20_release(struct capi20_appl *ap); -u16 capi20_put_message(u16 applid, struct sk_buff *skb); -u16 capi20_get_message(u16 applid, struct sk_buff **msgp); -u16 capi20_set_signal(u16 applid, +u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb); +u16 capi20_get_message(struct capi20_appl *ap, struct sk_buff **msgp); +u16 capi20_set_signal(struct capi20_appl *ap, void (*signal) (u16 applid, void *param), void *param); u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN]); @@ -89,7 +89,8 @@ u16 capi20_get_profile(u32 contr, struct capi_profile *profp); int capi20_manufacturer(unsigned int cmd, void *data); /* temporary hack XXX */ -void capi20_set_callback(u16 applid, void (*callback) (unsigned int cmd, __u32 contr, void *data)); +void capi20_set_callback(struct capi20_appl *ap, + void (*callback) (unsigned int cmd, __u32 contr, void *data)); -- cgit v1.2.3 From c073438613a5a16040e75c7a9d056495852cfa92 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Fri, 17 May 2002 10:04:23 -0500 Subject: ISDN: CAPI use struct capi20_appl * in signal callback Instead of passing an opaque handle, pass the actual struct capi20_appl, which is now known to the applications. Applications can store a pointer to the private data into struct capi20_appl::private. --- drivers/isdn/capi/capi.c | 7 ++++--- drivers/isdn/capi/capidrv.c | 8 ++++---- drivers/isdn/capi/kcapi.c | 7 ++----- include/linux/kernelcapi.h | 7 +++---- 4 files changed, 13 insertions(+), 16 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index b105ae3ecc49..5e6cb6354b26 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c @@ -566,9 +566,9 @@ static int handle_minor_send(struct capiminor *mp) #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ /* -------- function called by lower level -------------------------- */ -static void capi_signal(u16 applid, void *param) +static void capi_signal(struct capi20_appl *ap) { - struct capidev *cdev = (struct capidev *)param; + struct capidev *cdev = ap->private; #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE struct capiminor *mp; u16 datahandle; @@ -794,12 +794,13 @@ capi_ioctl(struct inode *inode, struct file *file, sizeof(struct capi_register_params))) return -EFAULT; + cdev->ap.private = cdev; cdev->errcode = capi20_register(ap); if (cdev->errcode) { ap->applid = 0; return -EIO; } - capi20_set_signal(ap, capi_signal, cdev); + capi20_set_signal(ap, capi_signal); } return (int)ap->applid; diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index 91a5639c36fe..b85ebb83916d 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c @@ -1372,15 +1372,15 @@ static void handle_data(_cmsg * cmsg, struct sk_buff *skb) static _cmsg s_cmsg; -static void capidrv_signal(u16 applid, void *dummy) +static void capidrv_signal(struct capi20_appl *ap) { struct sk_buff *skb = 0; - while (capi20_get_message(&global.ap, &skb) == CAPI_NOERROR) { + while (capi20_get_message(ap, &skb) == CAPI_NOERROR) { capi_message2cmsg(&s_cmsg, skb->data); if (debugmode > 2) printk(KERN_DEBUG "capidrv_signal: applid=%d %s\n", - applid, capi_cmsg2str(&s_cmsg)); + ap->applid, capi_cmsg2str(&s_cmsg)); if (s_cmsg.Command == CAPI_DATA_B3 && s_cmsg.Subcommand == CAPI_IND) { @@ -2328,7 +2328,7 @@ static int __init capidrv_init(void) return -EIO; } - capi20_set_signal(&global.ap, capidrv_signal, 0); + capi20_set_signal(&global.ap, capidrv_signal); ncontr = profile.ncontroller; for (contr = 1; contr <= ncontr; contr++) { diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index 38db8a4b2369..6f46b5b3f6c4 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c @@ -579,7 +579,7 @@ static void recv_handler(void *dummy) ap->nrecvctlpkt++; } skb_queue_tail(&ap->recv_queue, skb); - (ap->signal) (ap->applid, ap->param); + (ap->signal) (ap); } } @@ -870,7 +870,6 @@ u16 capi20_register(struct capi20_appl *ap) ap->applid = applid; applications[applid - 1] = ap; - ap->param = NULL; ap->signal = NULL; skb_queue_head_init(&ap->recv_queue); ap->nncci = 0; @@ -984,13 +983,11 @@ u16 capi20_get_message(struct capi20_appl *ap, struct sk_buff **msgp) EXPORT_SYMBOL(capi20_get_message); u16 capi20_set_signal(struct capi20_appl *ap, - void (*signal) (u16 applid, void *param), - void *param) + void (*signal) (struct capi20_appl *appl)) { if (ap->applid == 0) return CAPI_ILLAPPNR; ap->signal = signal; - ap->param = param; return CAPI_NOERROR; } diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index 81b32c37bad4..689b7766885b 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -55,10 +55,10 @@ typedef struct kcapi_carddef { struct capi20_appl { u16 applid; capi_register_params rparam; + void *private; /* internal to kernelcapi.o */ - void *param; - void (*signal) (u16 applid, void *param); + void (*signal) (struct capi20_appl *ap); struct sk_buff_head recv_queue; int nncci; struct capi_ncci *nccilist; @@ -80,8 +80,7 @@ u16 capi20_release(struct capi20_appl *ap); u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb); u16 capi20_get_message(struct capi20_appl *ap, struct sk_buff **msgp); u16 capi20_set_signal(struct capi20_appl *ap, - void (*signal) (u16 applid, void *param), - void *param); + void (*signal) (struct capi20_appl *ap)); u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN]); u16 capi20_get_version(u32 contr, struct capi_version *verp); u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]); -- cgit v1.2.3 From 7914dddec2e6546b6ce7b2ed9a408f9a6ba55ec4 Mon Sep 17 00:00:00 2001 From: Kai Germaschewski Date: Fri, 17 May 2002 10:16:21 -0500 Subject: ISDN: CAPI: Get rid of capi_signal mechanism On arrival of a new message, kernelcapi used to call capi20_appl::signal(), which, from the application, would call back to capi20_get_message(). So we rather just push the message down directly, saving this detour. --- drivers/isdn/capi/capi.c | 11 ++------- drivers/isdn/capi/capidrv.c | 55 +++++++++++++++++++++------------------------ drivers/isdn/capi/kcapi.c | 51 ++++++----------------------------------- include/linux/kernelcapi.h | 13 +++-------- 4 files changed, 37 insertions(+), 93 deletions(-) (limited to 'include/linux') diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index 5e6cb6354b26..21db8583d6f2 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c @@ -566,7 +566,7 @@ static int handle_minor_send(struct capiminor *mp) #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ /* -------- function called by lower level -------------------------- */ -static void capi_signal(struct capi20_appl *ap) +static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb) { struct capidev *cdev = ap->private; #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE @@ -574,15 +574,8 @@ static void capi_signal(struct capi20_appl *ap) u16 datahandle; #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ struct capincci *np; - struct sk_buff *skb = 0; u32 ncci; - capi20_get_message(&cdev->ap, &skb); - if (!skb) { - printk(KERN_ERR "BUG: capi_signal: no skb\n"); - return; - } - if (CAPIMSG_COMMAND(skb->data) == CAPI_CONNECT_B3_CONF) { u16 info = CAPIMSG_U16(skb->data, 12); // Info field if (info == 0) @@ -795,12 +788,12 @@ capi_ioctl(struct inode *inode, struct file *file, return -EFAULT; cdev->ap.private = cdev; + cdev->ap.recv_message = capi_recv_message; cdev->errcode = capi20_register(ap); if (cdev->errcode) { ap->applid = 0; return -EIO; } - capi20_set_signal(ap, capi_signal); } return (int)ap->applid; diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index b85ebb83916d..1b0065316b42 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c @@ -1372,36 +1372,32 @@ static void handle_data(_cmsg * cmsg, struct sk_buff *skb) static _cmsg s_cmsg; -static void capidrv_signal(struct capi20_appl *ap) +static void capidrv_recv_message(struct capi20_appl *ap, struct sk_buff *skb) { - struct sk_buff *skb = 0; - - while (capi20_get_message(ap, &skb) == CAPI_NOERROR) { - capi_message2cmsg(&s_cmsg, skb->data); - if (debugmode > 2) - printk(KERN_DEBUG "capidrv_signal: applid=%d %s\n", - ap->applid, capi_cmsg2str(&s_cmsg)); - - if (s_cmsg.Command == CAPI_DATA_B3 - && s_cmsg.Subcommand == CAPI_IND) { - handle_data(&s_cmsg, skb); - global.nrecvdatapkt++; - continue; - } - if ((s_cmsg.adr.adrController & 0xffffff00) == 0) - handle_controller(&s_cmsg); - else if ((s_cmsg.adr.adrPLCI & 0xffff0000) == 0) - handle_plci(&s_cmsg); - else - handle_ncci(&s_cmsg); - /* - * data of skb used in s_cmsg, - * free data when s_cmsg is not used again - * thanks to Lars Heete - */ - kfree_skb(skb); - global.nrecvctlpkt++; + capi_message2cmsg(&s_cmsg, skb->data); + if (debugmode > 2) + printk(KERN_DEBUG "capidrv_signal: applid=%d %s\n", + ap->applid, capi_cmsg2str(&s_cmsg)); + + if (s_cmsg.Command == CAPI_DATA_B3 + && s_cmsg.Subcommand == CAPI_IND) { + handle_data(&s_cmsg, skb); + global.nrecvdatapkt++; + return; } + if ((s_cmsg.adr.adrController & 0xffffff00) == 0) + handle_controller(&s_cmsg); + else if ((s_cmsg.adr.adrPLCI & 0xffff0000) == 0) + handle_plci(&s_cmsg); + else + handle_ncci(&s_cmsg); + /* + * data of skb used in s_cmsg, + * free data when s_cmsg is not used again + * thanks to Lars Heete + */ + kfree_skb(skb); + global.nrecvctlpkt++; } /* ------------------------------------------------------------------- */ @@ -2313,6 +2309,7 @@ static int __init capidrv_init(void) global.ap.rparam.datablkcnt = 16; global.ap.rparam.datablklen = 2048; + global.ap.recv_message = capidrv_recv_message; errcode = capi20_register(&global.ap); if (errcode) { MOD_DEC_USE_COUNT; @@ -2328,8 +2325,6 @@ static int __init capidrv_init(void) return -EIO; } - capi20_set_signal(&global.ap, capidrv_signal); - ncontr = profile.ncontroller; for (contr = 1; contr <= ncontr; contr++) { errcode = capi20_get_profile(contr, &profile); diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index 6f46b5b3f6c4..b3ce4372649c 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c @@ -186,13 +186,11 @@ static int proc_applications_read_proc(char *page, char **start, off_t off, for (i=1; i <= CAPI_MAXAPPL; i++) { ap = get_capi_appl_by_nr(i); if (!ap) continue; - len += sprintf(page+len, "%u %d %d %d %d %d\n", - ap->applid, - ap->rparam.level3cnt, - ap->rparam.datablkcnt, - ap->rparam.datablklen, - ap->nncci, - skb_queue_len(&ap->recv_queue)); + len += sprintf(page+len, "%u %d %d %d\n", + ap->applid, + ap->rparam.level3cnt, + ap->rparam.datablkcnt, + ap->rparam.datablklen); if (len <= off) { off -= len; len = 0; @@ -566,20 +564,14 @@ static void recv_handler(void *dummy) kfree_skb(skb); continue; } - if (ap->signal == 0) { - printk(KERN_ERR "kcapi: recv_handler: applid %d has no signal function\n", - ap->applid); - kfree_skb(skb); - continue; - } + if ( CAPIMSG_COMMAND(skb->data) == CAPI_DATA_B3 && CAPIMSG_SUBCOMMAND(skb->data) == CAPI_IND) { ap->nrecvdatapkt++; } else { ap->nrecvctlpkt++; } - skb_queue_tail(&ap->recv_queue, skb); - (ap->signal) (ap); + ap->recv_message(ap, skb); } } @@ -870,9 +862,6 @@ u16 capi20_register(struct capi20_appl *ap) ap->applid = applid; applications[applid - 1] = ap; - ap->signal = NULL; - skb_queue_head_init(&ap->recv_queue); - ap->nncci = 0; ap->nrecvctlpkt = 0; ap->nrecvdatapkt = 0; ap->nsentctlpkt = 0; @@ -897,7 +886,6 @@ u16 capi20_release(struct capi20_appl *ap) DBG("applid %#x", ap->applid); - skb_queue_purge(&ap->recv_queue); for (i = 0; i < CAPI_MAXCONTR; i++) { if (!cards[i] || cards[i]->cardstate != CARD_RUNNING) continue; @@ -968,31 +956,6 @@ u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb) EXPORT_SYMBOL(capi20_put_message); -u16 capi20_get_message(struct capi20_appl *ap, struct sk_buff **msgp) -{ - struct sk_buff *skb; - - if (ap->applid == 0) - return CAPI_ILLAPPNR; - if ((skb = skb_dequeue(&ap->recv_queue)) == 0) - return CAPI_RECEIVEQUEUEEMPTY; - *msgp = skb; - return CAPI_NOERROR; -} - -EXPORT_SYMBOL(capi20_get_message); - -u16 capi20_set_signal(struct capi20_appl *ap, - void (*signal) (struct capi20_appl *appl)) -{ - if (ap->applid == 0) - return CAPI_ILLAPPNR; - ap->signal = signal; - return CAPI_NOERROR; -} - -EXPORT_SYMBOL(capi20_set_signal); - u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN]) { struct capi_ctr *card; diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h index 689b7766885b..b982d5b77ae9 100644 --- a/include/linux/kernelcapi.h +++ b/include/linux/kernelcapi.h @@ -49,20 +49,16 @@ typedef struct kcapi_carddef { #include -#define KCI_CONTRUP 0 /* struct capi_profile */ -#define KCI_CONTRDOWN 1 /* NULL */ +#define KCI_CONTRUP 0 /* arg: struct capi_profile */ +#define KCI_CONTRDOWN 1 /* arg: NULL */ struct capi20_appl { u16 applid; capi_register_params rparam; + void (*recv_message)(struct capi20_appl *ap, struct sk_buff *skb); void *private; /* internal to kernelcapi.o */ - void (*signal) (struct capi20_appl *ap); - struct sk_buff_head recv_queue; - int nncci; - struct capi_ncci *nccilist; - unsigned long nrecvctlpkt; unsigned long nrecvdatapkt; unsigned long nsentctlpkt; @@ -78,9 +74,6 @@ u16 capi20_isinstalled(void); u16 capi20_register(struct capi20_appl *ap); u16 capi20_release(struct capi20_appl *ap); u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb); -u16 capi20_get_message(struct capi20_appl *ap, struct sk_buff **msgp); -u16 capi20_set_signal(struct capi20_appl *ap, - void (*signal) (struct capi20_appl *ap)); u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN]); u16 capi20_get_version(u32 contr, struct capi_version *verp); u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]); -- cgit v1.2.3