The function ines_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. Signed-off-by: Nihar Chaithanya <niharchaithanya@xxxxxxxxx> --- drivers/staging/gpib/ines/ines_gpib.c | 81 ++++++++++++++++++++------- 1 file changed, 60 insertions(+), 21 deletions(-) diff --git a/drivers/staging/gpib/ines/ines_gpib.c b/drivers/staging/gpib/ines/ines_gpib.c index 9d8387c3bf01..73df4cd16926 100644 --- a/drivers/staging/gpib/ines/ines_gpib.c +++ b/drivers/staging/gpib/ines/ines_gpib.c @@ -1227,12 +1227,6 @@ static struct pcmcia_driver ines_gpib_cs_driver = { .resume = ines_gpib_resume, }; -int ines_pcmcia_init_module(void) -{ - pcmcia_register_driver(&ines_gpib_cs_driver); - return 0; -} - void ines_pcmcia_cleanup_module(void) { DEBUG(0, "ines_cs: unloading\n"); @@ -1420,28 +1414,73 @@ void ines_pcmcia_detach(gpib_board_t *board) static int __init ines_init_module(void) { - int err = 0; + int ret; - err = pci_register_driver(&ines_pci_driver); - if (err) { - pr_err("ines_gpib: pci_driver_register failed!\n"); - return err; + ret = pci_register_driver(&ines_pci_driver); + if (ret) { + pr_err("ines_gpib: pci_driver_register failed: error = %d\n", ret); + return ret; } - gpib_register_driver(&ines_pci_interface, THIS_MODULE); - gpib_register_driver(&ines_pci_unaccel_interface, THIS_MODULE); - gpib_register_driver(&ines_pci_accel_interface, THIS_MODULE); - gpib_register_driver(&ines_isa_interface, THIS_MODULE); + ret = gpib_register_driver(&ines_pci_interface, THIS_MODULE); + if (ret) + goto err_pci; + + ret = gpib_register_driver(&ines_pci_unaccel_interface, THIS_MODULE); + if (ret) + goto err_pci_unaccel; + + ret = gpib_register_driver(&ines_pci_accel_interface, THIS_MODULE); + if (ret) + goto err_pci_accel; + + ret = gpib_register_driver(&ines_isa_interface, THIS_MODULE); + if (ret) + goto err_isa; + #ifdef GPIB_PCMCIA - gpib_register_driver(&ines_pcmcia_interface, THIS_MODULE); - gpib_register_driver(&ines_pcmcia_unaccel_interface, THIS_MODULE); - gpib_register_driver(&ines_pcmcia_accel_interface, THIS_MODULE); - err += ines_pcmcia_init_module(); + ret = gpib_register_driver(&ines_pcmcia_interface, THIS_MODULE); + if (ret) + goto err_pcmcia; + + ret = gpib_register_driver(&ines_pcmcia_unaccel_interface, THIS_MODULE); + if (ret) + goto err_pcmcia_unaccel; + + ret = gpib_register_driver(&ines_pcmcia_accel_interface, THIS_MODULE); + if (ret) + goto err_pcmcia_accel; + + ret = pcmcia_register_driver(&ines_gpib_cs_driver); + if (ret) + goto err_pcmcia_driver; #endif - if (err) - return -1; + pr_info("ines_gpib: module init is complete\n"); return 0; + +#ifdef GPIB_PCMCIA +err_pcmcia_driver: + pr_err("ines_gpib: pcmcia_register_driver failed: error = %d\n", ret); + gpib_unregister_driver(&ines_pcmcia_accel_interface); +err_pcmcia_accel: + gpib_unregister_driver(&ines_pcmcia_unaccel_interface); +err_pcmcia_unaccel: + gpib_unregister_driver(&ines_pcmcia_interface); +err_pcmcia: +#endif + gpib_unregister_driver(&ines_isa_interface); +err_isa: + gpib_unregister_driver(&ines_pci_accel_interface); +err_pci_accel: + gpib_unregister_driver(&ines_pci_unaccel_interface); +err_pci_unaccel: + gpib_unregister_driver(&ines_pci_interface); +err_pci: + pci_unregister_driver(&ines_pci_driver); + + pr_err("ines_gpib: gpib_register_driver failed!\n"); + return ret; } static void __exit ines_exit_module(void) -- 2.34.1