Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932995AbcKQC5X (ORCPT ); Wed, 16 Nov 2016 21:57:23 -0500 Received: from mail5.windriver.com ([192.103.53.11]:43824 "EHLO mail5.wrs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932229AbcKQC5V (ORCPT ); Wed, 16 Nov 2016 21:57:21 -0500 From: To: , , , CC: , , , Subject: [PATCH] edac: mpc85xx: implement "remove" for mpc85xx_pci_err_driver Date: Thu, 17 Nov 2016 10:56:20 +0800 Message-ID: <1479351380-17109-2-git-send-email-yanjiang.jin@windriver.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1479351380-17109-1-git-send-email-yanjiang.jin@windriver.com> References: <1479351380-17109-1-git-send-email-yanjiang.jin@windriver.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2146 Lines: 80 From: Yanjiang Jin Tested on a T4240QDS board. If we execute the below steps without this patch: 1. modprobe mpc85xx_edac [The first insmod, everything is well.] 2. modprobe -r mpc85xx_edac 3. modprobe mpc85xx_edac [insmod again, error happens.] We would get the error messages as below: BUG: recent printk recursion! Oops: Kernel access of bad area, sig: 11 [#48] Modules linked in: mpc85xx_edac edac_core softdog [last unloaded: mpc85xx_edac] CPU: 5 PID: 14773 Comm: modprobe Tainted: G D C 4.8.3-rt2 .vsnprintf .vscnprintf .vprintk_emit .printk .edac_pci_add_device .mpc85xx_pci_err_probe .platform_drv_probe .driver_probe_device .__driver_attach .bus_for_each_dev .driver_attach .bus_add_driver .driver_register .__platform_register_drivers .mpc85xx_mc_init .do_one_initcall .do_init_module .load_module .SyS_finit_module system_call Signed-off-by: Yanjiang Jin --- drivers/edac/mpc85xx_edac.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index ff05675..c626021 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c @@ -300,6 +300,22 @@ static int mpc85xx_pci_err_probe(struct platform_device *op) return res; } +static int mpc85xx_pci_err_remove(struct platform_device *op) +{ + struct edac_pci_ctl_info *pci = dev_get_drvdata(&op->dev); + struct mpc85xx_pci_pdata *pdata = pci->pvt_info; + + edac_dbg(0, "\n"); + + out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR, orig_pci_err_cap_dr); + out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, orig_pci_err_en); + + edac_pci_del_device(&op->dev); + edac_pci_free_ctl_info(pci); + + return 0; +} + static const struct platform_device_id mpc85xx_pci_err_match[] = { { .name = "mpc85xx-pci-edac" @@ -309,6 +325,7 @@ static int mpc85xx_pci_err_probe(struct platform_device *op) static struct platform_driver mpc85xx_pci_err_driver = { .probe = mpc85xx_pci_err_probe, + .remove = mpc85xx_pci_err_remove, .id_table = mpc85xx_pci_err_match, .driver = { .name = "mpc85xx_pci_err", -- 1.9.1