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. Signed-off-by: Nihar Chaithanya <niharchaithanya@xxxxxxxxx> --- drivers/staging/gpib/cb7210/cb7210.c | 99 ++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 26 deletions(-) diff --git a/drivers/staging/gpib/cb7210/cb7210.c b/drivers/staging/gpib/cb7210/cb7210.c index 63df7f3eb3f3..99041ee007bb 100644 --- a/drivers/staging/gpib/cb7210/cb7210.c +++ b/drivers/staging/gpib/cb7210/cb7210.c @@ -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,85 @@ void cb_pcmcia_detach(gpib_board_t *board) static int __init cb7210_init_module(void) { - int err = 0; - int result; + int ret; - result = pci_register_driver(&cb7210_pci_driver); - if (result) { - pr_err("cb7210: pci_driver_register failed!\n"); - return result; + ret = pci_register_driver(&cb7210_pci_driver); + if (ret) { + pr_err("cb7210: pci_driver_register failed: error = %d\n", ret); + return ret; } - 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_interface, THIS_MODULE); + if (ret) + goto err_pci; + + ret = gpib_register_driver(&cb_isa_interface, THIS_MODULE); + if (ret) + goto err_isa; + + ret = gpib_register_driver(&cb_pci_accel_interface, THIS_MODULE); + if (ret) + goto err_pci_accel; + + ret = gpib_register_driver(&cb_pci_unaccel_interface, THIS_MODULE); + if (ret) + goto err_pci_unaccel; + + ret = gpib_register_driver(&cb_isa_accel_interface, THIS_MODULE); + if (ret) + goto err_isa_accel; + + ret = gpib_register_driver(&cb_isa_unaccel_interface, THIS_MODULE); + if (ret) + goto err_isa_unaccel; + +#ifdef GPIB_PCMCIA + ret = gpib_register_driver(&cb_pcmcia_interface, THIS_MODULE); + if (ret) + goto err_pcmcia; + + ret = gpib_register_driver(&cb_pcmcia_accel_interface, THIS_MODULE); + if (ret) + goto err_pcmcia_accel; + + ret = gpib_register_driver(&cb_pcmcia_unaccel_interface, THIS_MODULE); + if (ret) + goto err_pcmcia_unaccel; + + ret = pcmcia_register_driver(&cb_gpib_cs_driver); + if (ret) + goto err_pcmcia_driver; #endif - if (err) - return -1; + pr_info("cb7210: module init is complete\n"); return 0; + +#ifdef GPIB_PCMCIA +err_pcmcia_driver: + pr_err("ines: pcmcia_register_driver failed: error = %d\n", ret); + 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); + + pr_err("cb7210: gpib_register_driver failed!\n"); + return ret; } static void __exit cb7210_exit_module(void) -- 2.34.1