diff options
Diffstat (limited to 'drivers/isdn/capi/capidrv.c')
-rw-r--r-- | drivers/isdn/capi/capidrv.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index 7d8899ad5796..bf55ed5f38e3 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c | |||
@@ -2210,19 +2210,24 @@ static int capidrv_delcontr(u16 contr) | |||
2210 | } | 2210 | } |
2211 | 2211 | ||
2212 | 2212 | ||
2213 | static void lower_callback(unsigned int cmd, u32 contr, void *data) | 2213 | static int |
2214 | lower_callback(struct notifier_block *nb, unsigned long val, void *v) | ||
2214 | { | 2215 | { |
2216 | capi_profile profile; | ||
2217 | u32 contr = (long)v; | ||
2215 | 2218 | ||
2216 | switch (cmd) { | 2219 | switch (val) { |
2217 | case KCI_CONTRUP: | 2220 | case CAPICTR_UP: |
2218 | printk(KERN_INFO "capidrv: controller %hu up\n", contr); | 2221 | printk(KERN_INFO "capidrv: controller %hu up\n", contr); |
2219 | (void) capidrv_addcontr(contr, (capi_profile *) data); | 2222 | if (capi20_get_profile(contr, &profile) == CAPI_NOERROR) |
2223 | (void) capidrv_addcontr(contr, &profile); | ||
2220 | break; | 2224 | break; |
2221 | case KCI_CONTRDOWN: | 2225 | case CAPICTR_DOWN: |
2222 | printk(KERN_INFO "capidrv: controller %hu down\n", contr); | 2226 | printk(KERN_INFO "capidrv: controller %hu down\n", contr); |
2223 | (void) capidrv_delcontr(contr); | 2227 | (void) capidrv_delcontr(contr); |
2224 | break; | 2228 | break; |
2225 | } | 2229 | } |
2230 | return NOTIFY_OK; | ||
2226 | } | 2231 | } |
2227 | 2232 | ||
2228 | /* | 2233 | /* |
@@ -2262,6 +2267,10 @@ static void __exit proc_exit(void) | |||
2262 | remove_proc_entry("capi/capidrv", NULL); | 2267 | remove_proc_entry("capi/capidrv", NULL); |
2263 | } | 2268 | } |
2264 | 2269 | ||
2270 | static struct notifier_block capictr_nb = { | ||
2271 | .notifier_call = lower_callback, | ||
2272 | }; | ||
2273 | |||
2265 | static int __init capidrv_init(void) | 2274 | static int __init capidrv_init(void) |
2266 | { | 2275 | { |
2267 | capi_profile profile; | 2276 | capi_profile profile; |
@@ -2278,7 +2287,7 @@ static int __init capidrv_init(void) | |||
2278 | return -EIO; | 2287 | return -EIO; |
2279 | } | 2288 | } |
2280 | 2289 | ||
2281 | capi20_set_callback(&global.ap, lower_callback); | 2290 | register_capictr_notifier(&capictr_nb); |
2282 | 2291 | ||
2283 | errcode = capi20_get_profile(0, &profile); | 2292 | errcode = capi20_get_profile(0, &profile); |
2284 | if (errcode != CAPI_NOERROR) { | 2293 | if (errcode != CAPI_NOERROR) { |
@@ -2300,6 +2309,7 @@ static int __init capidrv_init(void) | |||
2300 | 2309 | ||
2301 | static void __exit capidrv_exit(void) | 2310 | static void __exit capidrv_exit(void) |
2302 | { | 2311 | { |
2312 | unregister_capictr_notifier(&capictr_nb); | ||
2303 | capi20_release(&global.ap); | 2313 | capi20_release(&global.ap); |
2304 | 2314 | ||
2305 | proc_exit(); | 2315 | proc_exit(); |