summaryrefslogtreecommitdiffstats
path: root/drivers/edac/i7core_edac.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab2009-06-23 03:48:29 +0200
committerMauro Carvalho Chehab2010-05-10 16:44:46 +0200
commit87d1d272ba25a1863e40ebb1df4bc0eed7a8fd11 (patch)
tree5d20ad1e3edfc95ca38a71350833ba345637eb63 /drivers/edac/i7core_edac.c
parenti7core_edac: A few fixes at error injection code (diff)
downloadkernel-qcow2-linux-87d1d272ba25a1863e40ebb1df4bc0eed7a8fd11.tar.gz
kernel-qcow2-linux-87d1d272ba25a1863e40ebb1df4bc0eed7a8fd11.tar.xz
kernel-qcow2-linux-87d1d272ba25a1863e40ebb1df4bc0eed7a8fd11.zip
i7core_edac: need mci->edac_check, otherwise module removal doesn't work
There are some locking troubles with edac_core: if you don't declare an edac_check, module may suffer from soft lock. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/edac/i7core_edac.c')
-rw-r--r--drivers/edac/i7core_edac.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c
index 0c17db673065..190596af601a 100644
--- a/drivers/edac/i7core_edac.c
+++ b/drivers/edac/i7core_edac.c
@@ -880,6 +880,15 @@ static int i7core_get_devices(struct mem_ctl_info *mci, struct pci_dev *mcidev)
}
/*
+ * i7core_check_error Retrieve and process errors reported by the
+ * hardware. Called by the Core module.
+ */
+static void i7core_check_error(struct mem_ctl_info *mci)
+{
+ /* FIXME: need a real code here */
+}
+
+/*
* i7core_probe Probe for ONE instance of device to see if it is
* present.
* return:
@@ -912,8 +921,11 @@ static int __devinit i7core_probe(struct pci_dev *pdev,
debugf0("MC: " __FILE__ ": %s(): mci = %p\n", __func__, mci);
+ /* 'get' the pci devices we want to reserve for our use */
+ if (i7core_get_devices(mci, pdev))
+ goto fail0;
+
mci->dev = &pdev->dev; /* record ptr to the generic device */
- dev_set_drvdata(mci->dev, mci);
pvt = mci->pvt_info;
@@ -932,9 +944,8 @@ static int __devinit i7core_probe(struct pci_dev *pdev,
mci->ctl_page_to_phys = NULL;
mci->mc_driver_sysfs_attributes = i7core_inj_attrs;
- /* 'get' the pci devices we want to reserve for our use */
- if (i7core_get_devices(mci, pdev))
- goto fail0;
+ /* Set the function pointer to an actual operation function */
+ mci->edac_check = i7core_check_error;
/* add this new MC control structure to EDAC's list of MCs */
if (edac_mc_add_mc(mci)) {
@@ -992,6 +1003,7 @@ static void __devexit i7core_remove(struct pci_dev *pdev)
edac_pci_release_generic_ctl(i7core_pci);
mci = edac_mc_del_mc(&pdev->dev);
+
if (!mci)
return;