From: Stephen Hemminger <shemminger@vyatta.com>
To: David Miller <davem@davemloft.net>
Cc: jeffrey.t.kirsher@intel.com, netdev@vger.kernel.org,
jeff@garzik.org, peter.p.waskiewicz.jr@intel.com,
linux-pci@vger.kernel.org
Subject: [PATCH] pciaer: report config read/write errors
Date: Tue, 2 Dec 2008 09:23:16 -0800 [thread overview]
Message-ID: <20081202092316.7d6b6291@extreme> (raw)
In-Reply-To: <20081201.232527.66213356.davem@davemloft.net>
This patch does more error checking in the Advanced Error Reporting code.
Since AER needs to access PCI registers > 255, it won't work without MMCONFIG
and other quirks may stop it as well. The code must check this by looking
at return values from pci_read/write_config_XXX calls.
I don't have any hardware that uses AER routines but discovered this
in earlier versions of the sky2 driver that tried to use
pci AER routines. Ended up just giving up and using other ways to access PCI
config space on sky2 since there were too many platform glitches.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
--- a/drivers/pci/pcie/aer/aerdrv_core.c 2008-12-02 07:56:08.000000000 -0800
+++ b/drivers/pci/pcie/aer/aerdrv_core.c 2008-12-02 09:07:32.000000000 -0800
@@ -31,80 +31,92 @@ module_param(forceload, bool, 0);
int pci_enable_pcie_error_reporting(struct pci_dev *dev)
{
u16 reg16 = 0;
- int pos;
+ int pos, err;
+ u32 status;
pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
if (!pos)
return -EIO;
+ err = pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &status);
+ if (err)
+ return err;
+
pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
if (!pos)
return -EIO;
- pci_read_config_word(dev, pos+PCI_EXP_DEVCTL, ®16);
+ err = pci_read_config_word(dev, pos+PCI_EXP_DEVCTL, ®16);
+ if (err)
+ return err;
+
reg16 = reg16 |
PCI_EXP_DEVCTL_CERE |
PCI_EXP_DEVCTL_NFERE |
PCI_EXP_DEVCTL_FERE |
PCI_EXP_DEVCTL_URRE;
- pci_write_config_word(dev, pos+PCI_EXP_DEVCTL,
- reg16);
- return 0;
+ return pci_write_config_word(dev, pos+PCI_EXP_DEVCTL, reg16);
}
int pci_disable_pcie_error_reporting(struct pci_dev *dev)
{
u16 reg16 = 0;
- int pos;
+ int pos, err;
pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
if (!pos)
return -EIO;
- pci_read_config_word(dev, pos+PCI_EXP_DEVCTL, ®16);
+ err = pci_read_config_word(dev, pos+PCI_EXP_DEVCTL, ®16);
+ if (err)
+ return err;
+
reg16 = reg16 & ~(PCI_EXP_DEVCTL_CERE |
PCI_EXP_DEVCTL_NFERE |
PCI_EXP_DEVCTL_FERE |
PCI_EXP_DEVCTL_URRE);
- pci_write_config_word(dev, pos+PCI_EXP_DEVCTL,
- reg16);
- return 0;
+ return pci_write_config_word(dev, pos+PCI_EXP_DEVCTL, reg16);
}
int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)
{
- int pos;
+ int pos, err;
u32 status, mask;
pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
if (!pos)
return -EIO;
- pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &status);
- pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, &mask);
+ err = pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &status);
+ if (err)
+ return err;
+
+ err = pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, &mask);
+ if (err)
+ return err;
+
if (dev->error_state == pci_channel_io_normal)
status &= ~mask; /* Clear corresponding nonfatal bits */
else
status &= mask; /* Clear corresponding fatal bits */
- pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, status);
-
- return 0;
+ return pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, status);
}
#if 0
int pci_cleanup_aer_correct_error_status(struct pci_dev *dev)
{
- int pos;
+ int pos, err;
u32 status;
pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
if (!pos)
return -EIO;
- pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS, &status);
- pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, status);
+ err = pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS, &status);
+ if (err)
+ return err;
- return 0;
+ return pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, status);
}
#endif /* 0 */
next prev parent reply other threads:[~2008-12-02 17:23 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-02 0:41 [NET-NEXT PATCH] ixgbe: Implement PCIe AER support Jeff Kirsher
2008-12-02 1:47 ` Stephen Hemminger
2008-12-02 7:25 ` David Miller
2008-12-02 17:23 ` Stephen Hemminger [this message]
2008-12-02 18:41 ` [PATCH] pciaer: report config read/write errors Waskiewicz Jr, Peter P
2008-12-02 19:04 ` Loic Prylli
2008-12-02 19:44 ` Stephen Hemminger
2008-12-02 20:14 ` Loic Prylli
2008-12-02 21:41 ` Stephen Hemminger
2008-12-09 7:13 ` [NET-NEXT PATCH] ixgbe: Implement PCIe AER support Waskiewicz Jr, Peter P
2008-12-02 8:19 ` Waskiewicz Jr, Peter P
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=20081202092316.7d6b6291@extreme \
--to=shemminger@vyatta.com \
--cc=davem@davemloft.net \
--cc=jeff@garzik.org \
--cc=jeffrey.t.kirsher@intel.com \
--cc=linux-pci@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=peter.p.waskiewicz.jr@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).