From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: Vasiliy Kulikov <segooon@gmail.com>
Cc: kernel-janitors@vger.kernel.org, linux-edac@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] edac: i7300_edac: call pci_disable_device
Date: Tue, 28 Sep 2010 20:54:22 +0000 [thread overview]
Message-ID: <4CA255FE.7060308@redhat.com> (raw)
In-Reply-To: <1285696172-5612-1-git-send-email-segooon@gmail.com>
Em 28-09-2010 14:49, Vasiliy Kulikov escreveu:
> i7300_init_one() should call pci_disable_device() on error.
> i7300_remove_one() should call pci_disable_device() as i7300_init_one() calls
> pci_enable_device().
> Also pci_enable_device() might return any error, not only -EIO, so check
> for nonzero return code instead of checking equation to -EIO.
hmm... not sure if this is a good idea. A lspci (before applying i7300 edac
drivers) pointed to another driver for i7300, handling other things.
A grep i7300 revels a few drivers with i7300 string on it.
So, before disabling the device, we need to be sure that this won't hurt the
other drivers.
> Signed-off-by: Vasiliy Kulikov <segooon@gmail.com>
> ---
> Compile tested.
>
> drivers/edac/i7300_edac.c | 35 +++++++++++++++++++++--------------
> 1 files changed, 21 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c
> index 38920c0..749fa75 100644
> --- a/drivers/edac/i7300_edac.c
> +++ b/drivers/edac/i7300_edac.c
> @@ -1046,7 +1046,7 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
>
> /* wake up device */
> rc = pci_enable_device(pdev);
> - if (rc = -EIO)
> + if (rc)
> return rc;
>
> debugf0("MC: " __FILE__ ": %s(), pdev bus %u dev=0x%x fn=0x%x\n",
> @@ -1055,8 +1055,9 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
>
> /* We only are looking for func 0 of the set */
> + rc = -ENODEV;
> if (PCI_FUNC(pdev->devfn) != 0)
> - return -ENODEV;
> + goto fail_disable;
>
> /* As we don't have a motherboard identification routine to determine
> * actual number of slots/dimms per channel, we thus utilize the
> @@ -1073,10 +1074,10 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> __func__, num_channels, num_dimms_per_channel, num_csrows);
>
> /* allocate a new MC control structure */
> + rc = -ENOMEM;
> mci = edac_mc_alloc(sizeof(*pvt), num_csrows, num_channels, 0);
> -
> if (mci = NULL)
> - return -ENOMEM;
> + goto fail_disable;
>
> debugf0("MC: " __FILE__ ": %s(): mci = %p\n", __func__, mci);
>
> @@ -1085,15 +1086,15 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> pvt = mci->pvt_info;
> pvt->pci_dev_16_0_fsb_ctlr = pdev; /* Record this device in our private */
>
> + rc = -ENOMEM;
> pvt->tmp_prt_buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
> - if (!pvt->tmp_prt_buffer) {
> - edac_mc_free(mci);
> - return -ENOMEM;
> - }
> + if (!pvt->tmp_prt_buffer)
> + goto fail_free;
>
> /* 'get' the pci devices we want to reserve for our use */
> + rc = -ENODEV;
> if (i7300_get_devices(mci))
> - goto fail0;
> + goto fail_buffer_free;
>
> mci->mc_idx = 0;
> mci->mtype_cap = MEM_FLAG_FB_DDR2;
> @@ -1121,13 +1122,14 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> }
>
> /* add this new MC control structure to EDAC's list of MCs */
> + rc = -ENODEV;
> if (edac_mc_add_mc(mci)) {
> debugf0("MC: " __FILE__
> ": %s(): failed edac_mc_add_mc()\n", __func__);
> /* FIXME: perhaps some code should go here that disables error
> * reporting if we just enabled it
> */
> - goto fail1;
> + goto fail_put;
> }
>
> i7300_clear_error(mci);
> @@ -1146,14 +1148,18 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> return 0;
>
> /* Error exit unwinding stack */
> -fail1:
> -
> +fail_put:
> i7300_put_devices(mci);
>
> -fail0:
> +fail_buffer_free:
> kfree(pvt->tmp_prt_buffer);
> +
> +fail_free:
> edac_mc_free(mci);
> - return -ENODEV;
> +
> +fail_disable:
> + pci_disable_device(pdev);
> + return rc;
> }
>
> /**
> @@ -1181,6 +1187,7 @@ static void __devexit i7300_remove_one(struct pci_dev *pdev)
>
> kfree(tmp);
> edac_mc_free(mci);
> + pci_disable_device(pdev);
> }
>
> /*
WARNING: multiple messages have this Message-ID (diff)
From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: Vasiliy Kulikov <segooon@gmail.com>
Cc: kernel-janitors@vger.kernel.org, linux-edac@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] edac: i7300_edac: call pci_disable_device
Date: Tue, 28 Sep 2010 17:54:22 -0300 [thread overview]
Message-ID: <4CA255FE.7060308@redhat.com> (raw)
In-Reply-To: <1285696172-5612-1-git-send-email-segooon@gmail.com>
Em 28-09-2010 14:49, Vasiliy Kulikov escreveu:
> i7300_init_one() should call pci_disable_device() on error.
> i7300_remove_one() should call pci_disable_device() as i7300_init_one() calls
> pci_enable_device().
> Also pci_enable_device() might return any error, not only -EIO, so check
> for nonzero return code instead of checking equation to -EIO.
hmm... not sure if this is a good idea. A lspci (before applying i7300 edac
drivers) pointed to another driver for i7300, handling other things.
A grep i7300 revels a few drivers with i7300 string on it.
So, before disabling the device, we need to be sure that this won't hurt the
other drivers.
> Signed-off-by: Vasiliy Kulikov <segooon@gmail.com>
> ---
> Compile tested.
>
> drivers/edac/i7300_edac.c | 35 +++++++++++++++++++++--------------
> 1 files changed, 21 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c
> index 38920c0..749fa75 100644
> --- a/drivers/edac/i7300_edac.c
> +++ b/drivers/edac/i7300_edac.c
> @@ -1046,7 +1046,7 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
>
> /* wake up device */
> rc = pci_enable_device(pdev);
> - if (rc == -EIO)
> + if (rc)
> return rc;
>
> debugf0("MC: " __FILE__ ": %s(), pdev bus %u dev=0x%x fn=0x%x\n",
> @@ -1055,8 +1055,9 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
>
> /* We only are looking for func 0 of the set */
> + rc = -ENODEV;
> if (PCI_FUNC(pdev->devfn) != 0)
> - return -ENODEV;
> + goto fail_disable;
>
> /* As we don't have a motherboard identification routine to determine
> * actual number of slots/dimms per channel, we thus utilize the
> @@ -1073,10 +1074,10 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> __func__, num_channels, num_dimms_per_channel, num_csrows);
>
> /* allocate a new MC control structure */
> + rc = -ENOMEM;
> mci = edac_mc_alloc(sizeof(*pvt), num_csrows, num_channels, 0);
> -
> if (mci == NULL)
> - return -ENOMEM;
> + goto fail_disable;
>
> debugf0("MC: " __FILE__ ": %s(): mci = %p\n", __func__, mci);
>
> @@ -1085,15 +1086,15 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> pvt = mci->pvt_info;
> pvt->pci_dev_16_0_fsb_ctlr = pdev; /* Record this device in our private */
>
> + rc = -ENOMEM;
> pvt->tmp_prt_buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
> - if (!pvt->tmp_prt_buffer) {
> - edac_mc_free(mci);
> - return -ENOMEM;
> - }
> + if (!pvt->tmp_prt_buffer)
> + goto fail_free;
>
> /* 'get' the pci devices we want to reserve for our use */
> + rc = -ENODEV;
> if (i7300_get_devices(mci))
> - goto fail0;
> + goto fail_buffer_free;
>
> mci->mc_idx = 0;
> mci->mtype_cap = MEM_FLAG_FB_DDR2;
> @@ -1121,13 +1122,14 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> }
>
> /* add this new MC control structure to EDAC's list of MCs */
> + rc = -ENODEV;
> if (edac_mc_add_mc(mci)) {
> debugf0("MC: " __FILE__
> ": %s(): failed edac_mc_add_mc()\n", __func__);
> /* FIXME: perhaps some code should go here that disables error
> * reporting if we just enabled it
> */
> - goto fail1;
> + goto fail_put;
> }
>
> i7300_clear_error(mci);
> @@ -1146,14 +1148,18 @@ static int __devinit i7300_init_one(struct pci_dev *pdev,
> return 0;
>
> /* Error exit unwinding stack */
> -fail1:
> -
> +fail_put:
> i7300_put_devices(mci);
>
> -fail0:
> +fail_buffer_free:
> kfree(pvt->tmp_prt_buffer);
> +
> +fail_free:
> edac_mc_free(mci);
> - return -ENODEV;
> +
> +fail_disable:
> + pci_disable_device(pdev);
> + return rc;
> }
>
> /**
> @@ -1181,6 +1187,7 @@ static void __devexit i7300_remove_one(struct pci_dev *pdev)
>
> kfree(tmp);
> edac_mc_free(mci);
> + pci_disable_device(pdev);
> }
>
> /*
next prev parent reply other threads:[~2010-09-28 20:54 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-26 8:59 [PATCH] edac: i7300_edac: call pci_disable_device Vasiliy Kulikov
2010-09-26 8:59 ` Vasiliy Kulikov
2010-09-27 18:00 ` Doug Thompson
2010-09-27 18:00 ` Doug Thompson
2010-09-28 17:49 ` Vasiliy Kulikov
2010-09-28 17:49 ` Vasiliy Kulikov
2010-09-28 20:54 ` Mauro Carvalho Chehab [this message]
2010-09-28 20:54 ` Mauro Carvalho Chehab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4CA255FE.7060308@redhat.com \
--to=mchehab@redhat.com \
--cc=kernel-janitors@vger.kernel.org \
--cc=linux-edac@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=segooon@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.