diff -ur /linux.vanilla/drivers/char/cyclades.c /linux/drivers/char/cyclades.c --- /linux.vanilla/drivers/char/cyclades.c Fri Feb 23 20:37:51 2001 +++ /linux/drivers/char/cyclades.c Mon Feb 26 23:05:10 2001 @@ -5478,6 +5478,15 @@ extra ports are ignored. */ +static void __init cy_cleanup_after_failure(struct tty_driver *tty) +{ + unsigned long flags; + save_flags(flags); cli(); + remove_bh(CYCLADES_BH); + if (tty) tty_unregister_driver(tty); + restore_flags(flags); +} + int __init cy_init(void) { @@ -5544,10 +5553,16 @@ cy_callout_driver.proc_entry = 0; - if (tty_register_driver(&cy_serial_driver)) - panic("Couldn't register Cyclades serial driver\n"); - if (tty_register_driver(&cy_callout_driver)) - panic("Couldn't register Cyclades callout driver\n"); + if ((i = tty_register_driver(&cy_serial_driver))) { + printk(KERN_ERR "cyclades: Couldn't register Cyclades serial driver\n"); + cy_cleanup_after_failure(NULL); + return i; + } + if ((i = tty_register_driver(&cy_callout_driver))) { + printk(KERN_ERR "cyclades: Couldn't register Cyclades callout driver\n"); + cy_cleanup_after_failure(&cy_serial_driver); + return i; + } for (i = 0; i < NR_CARDS; i++) { /* base_addr=0 indicates board not found */