]> git.neil.brown.name Git - history.git/commitdiff
ISDN: Hand merge
authorKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
Tue, 6 Aug 2002 07:35:23 +0000 (02:35 -0500)
committerKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
Tue, 6 Aug 2002 07:35:23 +0000 (02:35 -0500)
1  2 
drivers/isdn/i4l/isdn_common.c

index c2a14fa3c981f5a910e10fa2e28dfe52d8d0291d,9888fc36b481de94b139537502edf5eed9a8dfa6..3682f3bcf72500fced5810d9f6ab491a7619fd0d
@@@ -2266,34 -2392,22 +2392,22 @@@ static int __init isdn_init(void
                init_waitqueue_head(&dev->mdm.info[i].open_wait);
                init_waitqueue_head(&dev->mdm.info[i].close_wait);
        }
-       if (register_chrdev(ISDN_MAJOR, "isdn", &isdn_fops)) {
 -      retval = devfs_register_chrdev(ISDN_MAJOR, "isdn", &isdn_fops);
++      retval = register_chrdev(ISDN_MAJOR, "isdn", &isdn_fops);
+       if (retval) {
                printk(KERN_WARNING "isdn: Could not register control devices\n");
-               vfree(dev);
-               return -EIO;
+               goto err_vfree;
        }
        isdn_init_devfs();
-       if ((i = isdn_tty_modem_init()) < 0) {
+       retval = isdn_tty_init();
+       if (retval < 0) {
                printk(KERN_WARNING "isdn: Could not register tty devices\n");
-               if (i == -3)
-                       tty_unregister_driver(&dev->mdm.cua_modem);
-               if (i <= -2)
-                       tty_unregister_driver(&dev->mdm.tty_modem);
-               vfree(dev);
-               isdn_cleanup_devfs();
-               unregister_chrdev(ISDN_MAJOR, "isdn");
-               return -EIO;
+               goto err_cleanup_devfs;
        }
  #ifdef CONFIG_ISDN_PPP
-       if (isdn_ppp_init() < 0) {
+       retval = isdn_ppp_init();
+       if (retval < 0) {
                printk(KERN_WARNING "isdn: Could not create PPP-device-structs\n");
-               tty_unregister_driver(&dev->mdm.tty_modem);
-               tty_unregister_driver(&dev->mdm.cua_modem);
-               for (i = 0; i < ISDN_MAX_CHANNELS; i++)
-                       kfree(dev->mdm.info[i].xmit_buf - 4);
-               isdn_cleanup_devfs();
-               unregister_chrdev(ISDN_MAJOR, "isdn");
-               vfree(dev);
-               return -EIO;
+               goto err_tty_modem;
        }
  #endif                          /* CONFIG_ISDN_PPP */
  
  #endif
        isdn_info_update();
        return 0;
+  err_tty_modem:
+       isdn_tty_exit();
+  err_cleanup_devfs:
+       isdn_cleanup_devfs();
++      unregister_chrdev(ISDN_MAJOR, "isdn");
+  err_vfree:
+       vfree(dev);
+  err:
+       return retval;
  }
  
  /*
@@@ -2332,39 -2454,18 +2455,18 @@@ static void __exit isdn_exit(void
  #endif
        save_flags(flags);
        cli();
-       if (isdn_net_rmall() < 0) {
-               printk(KERN_WARNING "isdn: net-device busy, remove cancelled\n");
-               restore_flags(flags);
-               return;
-       }
-       if (tty_unregister_driver(&dev->mdm.tty_modem)) {
-               printk(KERN_WARNING "isdn: ttyI-device busy, remove cancelled\n");
-               restore_flags(flags);
-               return;
-       }
-       if (tty_unregister_driver(&dev->mdm.cua_modem)) {
-               printk(KERN_WARNING "isdn: cui-device busy, remove cancelled\n");
-               restore_flags(flags);
-               return;
-       }
-       for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
-               isdn_tty_cleanup_xmit(&dev->mdm.info[i]);
-               kfree(dev->mdm.info[i].xmit_buf - 4);
- #ifdef CONFIG_ISDN_TTY_FAX
-               kfree(dev->mdm.info[i].fax);
- #endif
-       }
-       if (unregister_chrdev(ISDN_MAJOR, "isdn") != 0) {
-               printk(KERN_WARNING "isdn: controldevice busy, remove cancelled\n");
-               restore_flags(flags);
-       } else {
-               isdn_cleanup_devfs();
-               del_timer(&dev->timer);
-               restore_flags(flags);
-               /* call vfree with interrupts enabled, else it will hang */
-               vfree(dev);
-               printk(KERN_NOTICE "ISDN-subsystem unloaded\n");
-       }
+       if (isdn_net_rmall() < 0)
+               BUG();
+       isdn_tty_exit();
 -      if (devfs_unregister_chrdev(ISDN_MAJOR, "isdn"))
++      if (unregister_chrdev(ISDN_MAJOR, "isdn"))
+               BUG();
+       isdn_cleanup_devfs();
+       del_timer(&dev->timer);
+       restore_flags(flags);
+       /* call vfree with interrupts enabled, else it will hang */
+       vfree(dev);
  }
  
  module_init(isdn_init);