|
@@ -3014,25 +3014,29 @@ static void amd64_setup_pci_device(void)
|
|
|
static int __init amd64_edac_init(void)
|
|
|
{
|
|
|
int nb, err = -ENODEV;
|
|
|
+ bool load_ok = false;
|
|
|
|
|
|
edac_printk(KERN_INFO, EDAC_MOD_STR, EDAC_AMD64_VERSION "\n");
|
|
|
|
|
|
opstate_init();
|
|
|
|
|
|
if (cache_k8_northbridges() < 0)
|
|
|
- return err;
|
|
|
+ goto err_ret;
|
|
|
|
|
|
msrs = msrs_alloc();
|
|
|
+ if (!msrs)
|
|
|
+ goto err_ret;
|
|
|
|
|
|
err = pci_register_driver(&amd64_pci_driver);
|
|
|
if (err)
|
|
|
- return err;
|
|
|
+ goto err_pci;
|
|
|
|
|
|
/*
|
|
|
* At this point, the array 'pvt_lookup[]' contains pointers to alloc'd
|
|
|
* amd64_pvt structs. These will be used in the 2nd stage init function
|
|
|
* to finish initialization of the MC instances.
|
|
|
*/
|
|
|
+ err = -ENODEV;
|
|
|
for (nb = 0; nb < num_k8_northbridges; nb++) {
|
|
|
if (!pvt_lookup[nb])
|
|
|
continue;
|
|
@@ -3040,16 +3044,21 @@ static int __init amd64_edac_init(void)
|
|
|
err = amd64_init_2nd_stage(pvt_lookup[nb]);
|
|
|
if (err)
|
|
|
goto err_2nd_stage;
|
|
|
- }
|
|
|
|
|
|
- amd64_setup_pci_device();
|
|
|
+ load_ok = true;
|
|
|
+ }
|
|
|
|
|
|
- return 0;
|
|
|
+ if (load_ok) {
|
|
|
+ amd64_setup_pci_device();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
err_2nd_stage:
|
|
|
- debugf0("2nd stage failed\n");
|
|
|
pci_unregister_driver(&amd64_pci_driver);
|
|
|
-
|
|
|
+err_pci:
|
|
|
+ msrs_free(msrs);
|
|
|
+ msrs = NULL;
|
|
|
+err_ret:
|
|
|
return err;
|
|
|
}
|
|
|
|