aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/kernelcapi.h
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@web.de>2010-02-08 05:12:13 -0500
committerDavid S. Miller <davem@davemloft.net>2010-02-16 19:01:21 -0500
commitef69bb2ec6036945da1d3d3f07b75253f484f693 (patch)
treead309906a7b20b0b13b573abfb3be9d524f08086 /include/linux/kernelcapi.h
parent3efecf7a49cde47e5f2deb1d5504951ff4bede53 (diff)
CAPI: Rework controller state notifier
Another step towards proper locking: Rework the callback provided to capidrv for controller state changes. This is so far attached to an application, which would require us to hold the corresponding lock across notification calls. But there is no direct relation between a controller up/down event and an application, so let's decouple them and provide a notifier call chain for those events instead. This notifier chain is first of all used internally. Here we request the highest priority to unsure that housekeeping work is done before any other notifications. The chain is exported via [un]register_capictr_notifier to our only user, capidrv, to replace the racy and unfixable capi20_set_callback. Signed-off-by: Jan Kiszka <jan.kiszka@web.de> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/kernelcapi.h')
-rw-r--r--include/linux/kernelcapi.h17
1 files changed, 5 insertions, 12 deletions
diff --git a/include/linux/kernelcapi.h b/include/linux/kernelcapi.h
index a53e932f80fb..9c2683929fd3 100644
--- a/include/linux/kernelcapi.h
+++ b/include/linux/kernelcapi.h
@@ -48,9 +48,7 @@ typedef struct kcapi_carddef {
48#include <linux/list.h> 48#include <linux/list.h>
49#include <linux/skbuff.h> 49#include <linux/skbuff.h>
50#include <linux/workqueue.h> 50#include <linux/workqueue.h>
51 51#include <linux/notifier.h>
52#define KCI_CONTRUP 0 /* arg: struct capi_profile */
53#define KCI_CONTRDOWN 1 /* arg: NULL */
54 52
55struct capi20_appl { 53struct capi20_appl {
56 u16 applid; 54 u16 applid;
@@ -67,11 +65,6 @@ struct capi20_appl {
67 struct sk_buff_head recv_queue; 65 struct sk_buff_head recv_queue;
68 struct work_struct recv_work; 66 struct work_struct recv_work;
69 int release_in_progress; 67 int release_in_progress;
70
71 /* ugly hack to allow for notification of added/removed
72 * controllers. The Right Way (tm) is known. XXX
73 */
74 void (*callback) (unsigned int cmd, __u32 contr, void *data);
75}; 68};
76 69
77u16 capi20_isinstalled(void); 70u16 capi20_isinstalled(void);
@@ -84,11 +77,11 @@ u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]);
84u16 capi20_get_profile(u32 contr, struct capi_profile *profp); 77u16 capi20_get_profile(u32 contr, struct capi_profile *profp);
85int capi20_manufacturer(unsigned int cmd, void __user *data); 78int capi20_manufacturer(unsigned int cmd, void __user *data);
86 79
87/* temporary hack XXX */ 80#define CAPICTR_UP 0
88void capi20_set_callback(struct capi20_appl *ap, 81#define CAPICTR_DOWN 1
89 void (*callback) (unsigned int cmd, __u32 contr, void *data));
90
91 82
83int register_capictr_notifier(struct notifier_block *nb);
84int unregister_capictr_notifier(struct notifier_block *nb);
92 85
93#define CAPI_NOERROR 0x0000 86#define CAPI_NOERROR 0x0000
94 87