s390/qeth: reshuffle initialization
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Tue, 15 May 2012 16:09:50 +0000 (18:09 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 16 May 2012 12:42:50 +0000 (14:42 +0200)
Reshuffle the init function of the qeth driver to ensure
that the driver is usable at the time it is registered.

Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/net/qeth_core_main.c

index a628f56ae576c9f27891f1e224d0f4cac4b57613..739e8566a876e25bf40ecdbfe21bedd4ed43a9ab 100644 (file)
@@ -5540,43 +5540,41 @@ static int __init qeth_core_init(void)
        rc = qeth_register_dbf_views();
        if (rc)
                goto out_err;
-       rc = ccw_driver_register(&qeth_ccw_driver);
-       if (rc)
-               goto ccw_err;
-       qeth_core_ccwgroup_driver.driver.groups = qeth_drv_attr_groups;
-       rc = ccwgroup_driver_register(&qeth_core_ccwgroup_driver);
-       if (rc)
-               goto ccwgroup_err;
        qeth_core_root_dev = root_device_register("qeth");
        rc = IS_ERR(qeth_core_root_dev) ? PTR_ERR(qeth_core_root_dev) : 0;
        if (rc)
                goto register_err;
-
        qeth_core_header_cache = kmem_cache_create("qeth_hdr",
                        sizeof(struct qeth_hdr) + ETH_HLEN, 64, 0, NULL);
        if (!qeth_core_header_cache) {
                rc = -ENOMEM;
                goto slab_err;
        }
-
        qeth_qdio_outbuf_cache = kmem_cache_create("qeth_buf",
                        sizeof(struct qeth_qdio_out_buffer), 0, 0, NULL);
        if (!qeth_qdio_outbuf_cache) {
                rc = -ENOMEM;
                goto cqslab_err;
        }
+       rc = ccw_driver_register(&qeth_ccw_driver);
+       if (rc)
+               goto ccw_err;
+       qeth_core_ccwgroup_driver.driver.groups = qeth_drv_attr_groups;
+       rc = ccwgroup_driver_register(&qeth_core_ccwgroup_driver);
+       if (rc)
+               goto ccwgroup_err;
 
        return 0;
+
+ccwgroup_err:
+       ccw_driver_unregister(&qeth_ccw_driver);
+ccw_err:
+       kmem_cache_destroy(qeth_qdio_outbuf_cache);
 cqslab_err:
        kmem_cache_destroy(qeth_core_header_cache);
 slab_err:
        root_device_unregister(qeth_core_root_dev);
 register_err:
-       ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver);
-ccwgroup_err:
-       ccw_driver_unregister(&qeth_ccw_driver);
-ccw_err:
-       QETH_DBF_MESSAGE(2, "Initialization failed with code %d\n", rc);
        qeth_unregister_dbf_views();
 out_err:
        pr_err("Initializing the qeth device driver failed\n");
@@ -5585,11 +5583,11 @@ out_err:
 
 static void __exit qeth_core_exit(void)
 {
-       root_device_unregister(qeth_core_root_dev);
        ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver);
        ccw_driver_unregister(&qeth_ccw_driver);
        kmem_cache_destroy(qeth_qdio_outbuf_cache);
        kmem_cache_destroy(qeth_core_header_cache);
+       root_device_unregister(qeth_core_root_dev);
        qeth_unregister_dbf_views();
        pr_info("core functions removed\n");
 }