edac: fix device removal on a few drivers
The removal logic was broken by the patch that added support for
struct device. Fix it.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
index 99f4c32..9851a1a 100644
--- a/drivers/edac/amd64_edac.c
+++ b/drivers/edac/amd64_edac.c
@@ -2452,6 +2452,14 @@
return 0;
}
+static void del_mc_sysfs_attrs(struct mem_ctl_info *mci)
+{
+ amd64_remove_sysfs_dbg_files(mci);
+
+ if (boot_cpu_data.x86 >= 0x10)
+ amd64_remove_sysfs_inject_files(mci);
+}
+
static void setup_mci_misc_attrs(struct mem_ctl_info *mci,
struct amd64_family_type *fam)
{
@@ -2669,6 +2677,8 @@
struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
struct ecc_settings *s = ecc_stngs[nid];
+ mci = find_mci_by_dev(&pdev->dev);
+ del_mc_sysfs_attrs(mci);
/* Remove from EDAC CORE tracking list */
mci = edac_mc_del_mc(&pdev->dev);
if (!mci)
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h
index df902ff..628c2d9 100644
--- a/drivers/edac/amd64_edac.h
+++ b/drivers/edac/amd64_edac.h
@@ -414,20 +414,30 @@
#ifdef CONFIG_EDAC_DEBUG
int amd64_create_sysfs_dbg_files(struct mem_ctl_info *mci);
+void amd64_remove_sysfs_dbg_files(struct mem_ctl_info *mci);
+
#else
static int amd64_create_sysfs_dbg_files(struct mem_ctl_info *mci)
{
return 0;
}
+void amd64_remove_sysfs_dbg_files(struct mem_ctl_info *mci)
+{
+}
#endif
#ifdef CONFIG_EDAC_AMD64_ERROR_INJECTION
int amd64_create_sysfs_inject_files(struct mem_ctl_info *mci);
+void amd64_remove_sysfs_inject_files(struct mem_ctl_info *mci);
+
#else
static int amd64_create_sysfs_inject_files(struct mem_ctl_info *mci)
{
return 0;
}
+static void amd64_remove_sysfs_inject_files(struct mem_ctl_info *mci)
+{
+}
#endif
/*
diff --git a/drivers/edac/amd64_edac_dbg.c b/drivers/edac/amd64_edac_dbg.c
index a7cd553..2c1bbf7 100644
--- a/drivers/edac/amd64_edac_dbg.c
+++ b/drivers/edac/amd64_edac_dbg.c
@@ -62,3 +62,12 @@
return 0;
}
+
+void amd64_remove_sysfs_dbg_files(struct mem_ctl_info *mci)
+{
+ device_remove_file(&mci->dev, &dev_attr_dhar);
+ device_remove_file(&mci->dev, &dev_attr_dbam);
+ device_remove_file(&mci->dev, &dev_attr_topmem);
+ device_remove_file(&mci->dev, &dev_attr_topmem2);
+ device_remove_file(&mci->dev, &dev_attr_dram_hole);
+}
diff --git a/drivers/edac/amd64_edac_inj.c b/drivers/edac/amd64_edac_inj.c
index 1129e7a..ef1ff4e 100644
--- a/drivers/edac/amd64_edac_inj.c
+++ b/drivers/edac/amd64_edac_inj.c
@@ -222,3 +222,12 @@
return 0;
}
+
+void amd64_remove_sysfs_inject_files(struct mem_ctl_info *mci)
+{
+ device_remove_file(&mci->dev, &dev_attr_inject_section);
+ device_remove_file(&mci->dev, &dev_attr_inject_word);
+ device_remove_file(&mci->dev, &dev_attr_inject_ecc_vector);
+ device_remove_file(&mci->dev, &dev_attr_inject_write);
+ device_remove_file(&mci->dev, &dev_attr_inject_read);
+}
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index 8e10e8e..4ab2e19 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -1029,15 +1029,14 @@
void edac_unregister_sysfs(struct mem_ctl_info *mci)
{
- debugf1("Unregistering device %s\n", __func__,
- dev_name(&mci->dev));
+ debugf1("Unregistering device %s\n", dev_name(&mci->dev));
put_device(&mci->dev);
device_del(&mci->dev);
}
static void mc_attr_release(struct device *device)
{
- debugf1("Releasing device %s\n", __func__, dev_name(device));
+ debugf1("Releasing device %s\n", dev_name(device));
}
static struct device_type mc_attr_type = {
diff --git a/drivers/edac/edac_stub.c b/drivers/edac/edac_stub.c
index 4dea0af..670c448 100644
--- a/drivers/edac/edac_stub.c
+++ b/drivers/edac/edac_stub.c
@@ -65,7 +65,6 @@
{
int err = 0;
-
if (atomic_read(&edac_subsys_valid))
goto out;
@@ -78,20 +77,14 @@
out:
atomic_inc(&edac_subsys_valid);
-
-printk("%s() edac instance %d\n",
- __func__, atomic_read(&edac_subsys_valid));
-
return &edac_subsys;
}
EXPORT_SYMBOL_GPL(edac_get_sysfs_subsys);
void edac_put_sysfs_subsys(void)
{
- /* last user unregisters it */
+ /* last user unregisters it */
if (atomic_dec_and_test(&edac_subsys_valid))
bus_unregister(&edac_subsys);
-printk("%s() edac instance %d\n",
- __func__, atomic_read(&edac_subsys_valid));
}
EXPORT_SYMBOL_GPL(edac_put_sysfs_subsys);
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c
index 11253ef..9fd8ff5 100644
--- a/drivers/edac/i7core_edac.c
+++ b/drivers/edac/i7core_edac.c
@@ -1101,7 +1101,7 @@
static void addrmatch_release(struct device *device)
{
- debugf1("Releasing device %s\n", __func__, dev_name(device));
+ debugf1("Releasing device %s\n", dev_name(device));
}
static struct device_type addrmatch_type = {
@@ -1131,7 +1131,7 @@
static void all_channel_counts_release(struct device *device)
{
- debugf1("Releasing device %s\n", __func__, dev_name(device));
+ debugf1("Releasing device %s\n", dev_name(device));
}
static struct device_type all_channel_counts_type = {
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c
index 69ddefe..bf0d73a 100644
--- a/drivers/edac/mpc85xx_edac.c
+++ b/drivers/edac/mpc85xx_edac.c
@@ -149,6 +149,12 @@
return 0;
}
+static void mpc85xx_remove_sysfs_attributes(struct mem_ctl_info *mci)
+{
+ device_remove_file(&mci->dev, &dev_attr_inject_data_hi);
+ device_remove_file(&mci->dev, &dev_attr_inject_data_lo);
+ device_remove_file(&mci->dev, &dev_attr_inject_ctrl);
+}
/**************************** PCI Err device ***************************/
#ifdef CONFIG_PCI
@@ -1127,6 +1133,7 @@
orig_ddr_err_disable);
out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_SBE, orig_ddr_err_sbe);
+ mpc85xx_remove_sysfs_attributes(mci);
edac_mc_del_mc(&op->dev);
edac_mc_free(mci);
return 0;