diff options
author | Jiri Slaby <jirislaby@gmail.com> | 2007-05-08 00:36:20 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 11:15:23 -0700 |
commit | 9dacf3b2f0cc657a5621e7f6d67ed27ce598f405 (patch) | |
tree | 59169bf14a537d984f3f38e5113352b8f952bcb0 /drivers/char/cyclades.c | |
parent | 14a55a6789d8409e58329310f9a18fc141deb4c2 (diff) |
Char: cyclades, cy_init error handling
- do not panic if tty_register_driver fails
- handle fail paths properly
Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/cyclades.c')
-rw-r--r-- | drivers/char/cyclades.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/drivers/char/cyclades.c b/drivers/char/cyclades.c index 1fe0bb6c7ad..970d99a69a2 100644 --- a/drivers/char/cyclades.c +++ b/drivers/char/cyclades.c @@ -5460,10 +5460,11 @@ static const struct tty_operations cy_ops = { static int __init cy_init(void) { unsigned int i, nboards; + int retval = -ENOMEM; cy_serial_driver = alloc_tty_driver(NR_PORTS); if (!cy_serial_driver) - return -ENOMEM; + goto err; show_version(); /* Initialize the tty_driver structure */ @@ -5481,8 +5482,11 @@ static int __init cy_init(void) cy_serial_driver->flags = TTY_DRIVER_REAL_RAW; tty_set_operations(cy_serial_driver, &cy_ops); - if (tty_register_driver(cy_serial_driver)) - panic("Couldn't register Cyclades serial driver\n"); + retval = tty_register_driver(cy_serial_driver); + if (retval) { + printk(KERN_ERR "Couldn't register Cyclades serial driver\n"); + goto err_frtty; + } for (i = 0; i < NR_CARDS; i++) { /* base_addr=0 indicates board not found */ @@ -5508,7 +5512,18 @@ static int __init cy_init(void) /* look for pci boards */ nboards += cy_detect_pci(); - return nboards ? 0 : -ENODEV; + if (nboards == 0) { + retval = -ENODEV; + goto err_unr; + } + + return 0; +err_unr: + tty_unregister_driver(cy_serial_driver); +err_frtty: + put_tty_driver(cy_serial_driver); +err: + return retval; } /* cy_init */ static void __exit cy_cleanup_module(void) |