]> www.infradead.org Git - users/willy/linux.git/commitdiff
staging: gpib: cb7210: Handle gpib_register_driver() errors
authorNihar Chaithanya <niharchaithanya@gmail.com>
Mon, 30 Dec 2024 18:56:24 +0000 (00:26 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 7 Jan 2025 14:38:55 +0000 (15:38 +0100)
The function cb_pcmcia_init_module() can be replaced by calling
pcmcia_register_driver() directly. The error value from this
function is not returned and the previous registering functions
are not unregistered.

The function gpib_register_driver() can fail and similar to
pcmcia_register_driver() function failing, the previous registering
functions are not unregistered.

Replace cb_pcmcia_init_module() with pcmcia_register_driver().
Unregister the gpib and pci register functions if the subsequent
gpib or pcmcia register functions fail and return the error value.
Add pr_err() statements to indicate the fail and also the error
value.

Signed-off-by: Nihar Chaithanya <niharchaithanya@gmail.com>
Link: https://lore.kernel.org/r/20241230185633.175690-5-niharchaithanya@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/gpib/cb7210/cb7210.c

index 63df7f3eb3f3e73d9ba448fa9778b4a65214ac50..45a54219ea6dd47d122e8e4ed763ef554630c75e 100644 (file)
@@ -1351,12 +1351,6 @@ static struct pcmcia_driver cb_gpib_cs_driver = {
        .resume         = cb_gpib_resume,
 };
 
-int cb_pcmcia_init_module(void)
-{
-       pcmcia_register_driver(&cb_gpib_cs_driver);
-       return 0;
-}
-
 void cb_pcmcia_cleanup_module(void)
 {
        DEBUG(0, "cb_gpib_cs: unloading\n");
@@ -1506,32 +1500,102 @@ void cb_pcmcia_detach(gpib_board_t *board)
 
 static int __init cb7210_init_module(void)
 {
-       int err = 0;
-       int result;
+       int ret;
+
+       ret = pci_register_driver(&cb7210_pci_driver);
+       if (ret) {
+               pr_err("cb7210: pci_register_driver failed: error = %d\n", ret);
+               return ret;
+       }
+
+       ret = gpib_register_driver(&cb_pci_interface, THIS_MODULE);
+       if (ret) {
+               pr_err("cb7210: gpib_register_driver failed: error = %d\n", ret);
+               goto err_pci;
+       }
+
+       ret = gpib_register_driver(&cb_isa_interface, THIS_MODULE);
+       if (ret) {
+               pr_err("cb7210: gpib_register_driver failed: error = %d\n", ret);
+               goto err_isa;
+       }
 
-       result = pci_register_driver(&cb7210_pci_driver);
-       if (result) {
-               pr_err("cb7210: pci_driver_register failed!\n");
-               return result;
+       ret = gpib_register_driver(&cb_pci_accel_interface, THIS_MODULE);
+       if (ret) {
+               pr_err("cb7210: gpib_register_driver failed: error = %d\n", ret);
+               goto err_pci_accel;
        }
 
-       gpib_register_driver(&cb_pci_interface, THIS_MODULE);
-       gpib_register_driver(&cb_isa_interface, THIS_MODULE);
-       gpib_register_driver(&cb_pci_accel_interface, THIS_MODULE);
-       gpib_register_driver(&cb_pci_unaccel_interface, THIS_MODULE);
-       gpib_register_driver(&cb_isa_accel_interface, THIS_MODULE);
-       gpib_register_driver(&cb_isa_unaccel_interface, THIS_MODULE);
-
-#ifdef GPIB__PCMCIA
-       gpib_register_driver(&cb_pcmcia_interface, THIS_MODULE);
-       gpib_register_driver(&cb_pcmcia_accel_interface, THIS_MODULE);
-       gpib_register_driver(&cb_pcmcia_unaccel_interface, THIS_MODULE);
-       err += cb_pcmcia_init_module();
+       ret = gpib_register_driver(&cb_pci_unaccel_interface, THIS_MODULE);
+       if (ret) {
+               pr_err("cb7210: gpib_register_driver failed: error = %d\n", ret);
+               goto err_pci_unaccel;
+       }
+
+       ret = gpib_register_driver(&cb_isa_accel_interface, THIS_MODULE);
+       if (ret) {
+               pr_err("cb7210: gpib_register_driver failed: error = %d\n", ret);
+               goto err_isa_accel;
+       }
+
+       ret = gpib_register_driver(&cb_isa_unaccel_interface, THIS_MODULE);
+       if (ret) {
+               pr_err("cb7210: gpib_register_driver failed: error = %d\n", ret);
+               goto err_isa_unaccel;
+       }
+
+#ifdef GPIB_PCMCIA
+       ret = gpib_register_driver(&cb_pcmcia_interface, THIS_MODULE);
+       if (ret) {
+               pr_err("cb7210: gpib_register_driver failed: error = %d\n", ret);
+               goto err_pcmcia;
+       }
+
+       ret = gpib_register_driver(&cb_pcmcia_accel_interface, THIS_MODULE);
+       if (ret) {
+               pr_err("cb7210: gpib_register_driver failed: error = %d\n", ret);
+               goto err_pcmcia_accel;
+       }
+
+       ret = gpib_register_driver(&cb_pcmcia_unaccel_interface, THIS_MODULE);
+       if (ret) {
+               pr_err("cb7210: gpib_register_driver failed: error = %d\n", ret);
+               goto err_pcmcia_unaccel;
+       }
+
+       ret = pcmcia_register_driver(&cb_gpib_cs_driver);
+       if (ret) {
+               pr_err("cb7210: pcmcia_register_driver failed: error = %d\n", ret);
+               goto err_pcmcia_driver;
+       }
 #endif
-       if (err)
-               return -1;
 
        return 0;
+
+#ifdef GPIB_PCMCIA
+err_pcmcia_driver:
+       gpib_unregister_driver(&cb_pcmcia_unaccel_interface);
+err_pcmcia_unaccel:
+       gpib_unregister_driver(&cb_pcmcia_accel_interface);
+err_pcmcia_accel:
+       gpib_unregister_driver(&cb_pcmcia_interface);
+err_pcmcia:
+#endif
+       gpib_unregister_driver(&cb_isa_unaccel_interface);
+err_isa_unaccel:
+       gpib_unregister_driver(&cb_isa_accel_interface);
+err_isa_accel:
+       gpib_unregister_driver(&cb_pci_unaccel_interface);
+err_pci_unaccel:
+       gpib_unregister_driver(&cb_pci_accel_interface);
+err_pci_accel:
+       gpib_unregister_driver(&cb_isa_interface);
+err_isa:
+       gpib_unregister_driver(&cb_pci_interface);
+err_pci:
+       pci_unregister_driver(&cb7210_pci_driver);
+
+       return ret;
 }
 
 static void __exit cb7210_exit_module(void)