serial drivers: get rid of panic() call
PATCH 1/1 serial drivers: get rid of panic() call
Hi all,
please take a look at attached patches (2.4.2-ac1):
cyclades.c: remove panic() calls;
serial.c: ioremap() checks, better error handling in start_pci_pnp_board() function (dectivate/deinit device on failire), remove panic() calls.
Also I have some questions:
- trying to remove panic() from epca.c I found that it calls tty_register_driver()
3 times and tty_unregister_driver() 2 times (registers pc_driver, pc_callout and pc_info, but unregisters only first two). BUG ?
- is here any sane reason (this question also about epca.c) to detect PCI devices
before tty_register_driver() calls ?
- amiserial.c calls requesst_irq() for IRQ_AMIGA_TBE and IRQ_AMIGA_RBF, but
doesn't free then on unload and doesn't check return values. BUG too ?
I don't know anything about Amiga's, so last question can be horribly stupid :))
Best regards.
Signature · 2 lines
Andrey Panin | Embedded systems software engineer [email protected] | PGP key: http://www.orbita1.ru/~pazke/AndreyPanin.asc
linux/drivers/char/cyclades.c renamed from linux.vanilla/drivers/char/cyclades.c +19 -4
@@ -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 */
drivers/char/serial.c +41 -10
95 lines not on this page · raw message