提交 1c6edbbe 编写于 作者: H Hidetoshi Seto 提交者: Mauro Carvalho Chehab

i7core_edac: Introduce i7core_unregister_mci

In i7core_probe, when setup of mci for 2nd or later socket failed,
we should cleanup prepared mci for 1st socket or so before "put" of
all devices.

So let have i7core_unregister_mci that can be shared between here
and i7core_remove.

While here fix a typo "hanler".
Signed-off-by: NHidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 73589c80
...@@ -1471,10 +1471,6 @@ static int mci_bind_devs(struct mem_ctl_info *mci, ...@@ -1471,10 +1471,6 @@ static int mci_bind_devs(struct mem_ctl_info *mci,
struct pci_dev *pdev; struct pci_dev *pdev;
int i, func, slot; int i, func, slot;
/* Associates i7core_dev and mci for future usage */
pvt->i7core_dev = i7core_dev;
i7core_dev->mci = mci;
pvt->is_registered = 0; pvt->is_registered = 0;
for (i = 0; i < i7core_dev->n_devs; i++) { for (i = 0; i < i7core_dev->n_devs; i++) {
pdev = i7core_dev->pdev[i]; pdev = i7core_dev->pdev[i];
...@@ -1918,6 +1914,39 @@ static void i7core_pci_ctl_release(struct i7core_pvt *pvt) ...@@ -1918,6 +1914,39 @@ static void i7core_pci_ctl_release(struct i7core_pvt *pvt)
pvt->i7core_pci = NULL; pvt->i7core_pci = NULL;
} }
static void i7core_unregister_mci(struct i7core_dev *i7core_dev)
{
struct mem_ctl_info *mci = i7core_dev->mci;
struct i7core_pvt *pvt;
if (unlikely(!mci || !mci->pvt_info)) {
debugf0("MC: " __FILE__ ": %s(): dev = %p\n",
__func__, &i7core_dev->pdev[0]->dev);
i7core_printk(KERN_ERR, "Couldn't find mci handler\n");
return;
}
pvt = mci->pvt_info;
debugf0("MC: " __FILE__ ": %s(): mci = %p, dev = %p\n",
__func__, mci, &i7core_dev->pdev[0]->dev);
/* Disable MCE NMI handler */
edac_mce_unregister(&pvt->edac_mce);
/* Disable EDAC polling */
i7core_pci_ctl_release(pvt);
/* Remove MC sysfs nodes */
edac_mc_del_mc(mci->dev);
debugf1("%s: free mci struct\n", mci->ctl_name);
kfree(mci->ctl_name);
edac_mc_free(mci);
i7core_dev->mci = NULL;
}
static int i7core_register_mci(struct i7core_dev *i7core_dev, static int i7core_register_mci(struct i7core_dev *i7core_dev,
const int num_channels, const int num_csrows) const int num_channels, const int num_csrows)
{ {
...@@ -2003,6 +2032,10 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev, ...@@ -2003,6 +2032,10 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev,
goto fail1; goto fail1;
} }
/* Associates i7core_dev and mci for future usage */
pvt->i7core_dev = i7core_dev;
i7core_dev->mci = mci;
return 0; return 0;
fail1: fail1:
...@@ -2011,6 +2044,7 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev, ...@@ -2011,6 +2044,7 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev,
fail0: fail0:
kfree(mci->ctl_name); kfree(mci->ctl_name);
edac_mc_free(mci); edac_mc_free(mci);
i7core_dev->mci = NULL;
return rc; return rc;
} }
...@@ -2065,6 +2099,10 @@ static int __devinit i7core_probe(struct pci_dev *pdev, ...@@ -2065,6 +2099,10 @@ static int __devinit i7core_probe(struct pci_dev *pdev,
return 0; return 0;
fail1: fail1:
list_for_each_entry(i7core_dev, &i7core_edac_list, list) {
if (i7core_dev->mci)
i7core_unregister_mci(i7core_dev);
}
i7core_put_all_devices(); i7core_put_all_devices();
fail0: fail0:
mutex_unlock(&i7core_edac_lock); mutex_unlock(&i7core_edac_lock);
...@@ -2077,9 +2115,7 @@ static int __devinit i7core_probe(struct pci_dev *pdev, ...@@ -2077,9 +2115,7 @@ static int __devinit i7core_probe(struct pci_dev *pdev,
*/ */
static void __devexit i7core_remove(struct pci_dev *pdev) static void __devexit i7core_remove(struct pci_dev *pdev)
{ {
struct mem_ctl_info *mci;
struct i7core_dev *i7core_dev; struct i7core_dev *i7core_dev;
struct i7core_pvt *pvt;
debugf0(__FILE__ ": %s()\n", __func__); debugf0(__FILE__ ": %s()\n", __func__);
...@@ -2099,32 +2135,8 @@ static void __devexit i7core_remove(struct pci_dev *pdev) ...@@ -2099,32 +2135,8 @@ static void __devexit i7core_remove(struct pci_dev *pdev)
} }
list_for_each_entry(i7core_dev, &i7core_edac_list, list) { list_for_each_entry(i7core_dev, &i7core_edac_list, list) {
mci = i7core_dev->mci; if (i7core_dev->mci)
if (unlikely(!mci || !mci->pvt_info)) { i7core_unregister_mci(i7core_dev);
debugf0("MC: " __FILE__ ": %s(): dev = %p\n",
__func__, &i7core_dev->pdev[0]->dev);
i7core_printk(KERN_ERR,
"Couldn't find mci hanler\n");
} else {
pvt = mci->pvt_info;
debugf0("MC: " __FILE__ ": %s(): mci = %p, dev = %p\n",
__func__, mci, &i7core_dev->pdev[0]->dev);
/* Disable MCE NMI handler */
edac_mce_unregister(&pvt->edac_mce);
/* Disable EDAC polling */
i7core_pci_ctl_release(pvt);
/* Remove MC sysfs nodes */
edac_mc_del_mc(mci->dev);
debugf1("%s: free mci struct\n", mci->ctl_name);
kfree(mci->ctl_name);
edac_mc_free(mci);
}
} }
/* Release PCI resources */ /* Release PCI resources */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册