]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ieee1394: fix host device registering when nodemgr disabled
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Fri, 9 Feb 2007 23:44:44 +0000 (00:44 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 9 Mar 2007 18:50:20 +0000 (10:50 -0800)
Since my commit 8252bbb1363b7fe963a3eb6f8a36da619a6f5a65 in 2.6.20-rc1,
host devices have a dummy driver attached.  Alas the driver was not
registered before use if ieee1394 was loaded with disable_nodemgr=1.

This resulted in non-functional FireWire drivers or kernel lockup.
http://bugzilla.kernel.org/show_bug.cgi?id=7942

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/ieee1394/nodemgr.c

index 61307ca296ae4745c26c2242d24aae238c2361a5..e2e0771bff9b84837af3745daafb0bbe0ebd36ab 100644 (file)
@@ -274,7 +274,6 @@ static struct device_driver nodemgr_mid_layer_driver = {
 struct device nodemgr_dev_template_host = {
        .bus            = &ieee1394_bus_type,
        .release        = nodemgr_release_host,
-       .driver         = &nodemgr_mid_layer_driver,
 };
 
 
@@ -1889,22 +1888,31 @@ int init_ieee1394_nodemgr(void)
 
        error = class_register(&nodemgr_ne_class);
        if (error)
-               return error;
-
+               goto fail_ne;
        error = class_register(&nodemgr_ud_class);
-       if (error) {
-               class_unregister(&nodemgr_ne_class);
-               return error;
-       }
+       if (error)
+               goto fail_ud;
        error = driver_register(&nodemgr_mid_layer_driver);
+       if (error)
+               goto fail_ml;
+       /* This driver is not used if nodemgr is off (disable_nodemgr=1). */
+       nodemgr_dev_template_host.driver = &nodemgr_mid_layer_driver;
+
        hpsb_register_highlevel(&nodemgr_highlevel);
        return 0;
+
+fail_ml:
+       class_unregister(&nodemgr_ud_class);
+fail_ud:
+       class_unregister(&nodemgr_ne_class);
+fail_ne:
+       return error;
 }
 
 void cleanup_ieee1394_nodemgr(void)
 {
        hpsb_unregister_highlevel(&nodemgr_highlevel);
-
+       driver_unregister(&nodemgr_mid_layer_driver);
        class_unregister(&nodemgr_ud_class);
        class_unregister(&nodemgr_ne_class);
 }