Commit 0927678f authored by Jesse Barnes's avatar Jesse Barnes

PCI: use pci_find_ext_capability everywhere

Remove some open coded (and buggy) versions of pci_find_ext_capability
in favor of the real routine in the PCI core.
Tested-by: default avatarTomasz Czernecki <czernecki@gmail.com>
Acked-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Reviewed-by: default avatarMatthew Wilcox <willy@linux.intel.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 1543c90c
...@@ -105,7 +105,7 @@ static irqreturn_t aer_irq(int irq, void *context) ...@@ -105,7 +105,7 @@ static irqreturn_t aer_irq(int irq, void *context)
unsigned long flags; unsigned long flags;
int pos; int pos;
pos = pci_find_aer_capability(pdev->port); pos = pci_find_ext_capability(pdev->port, PCI_EXT_CAP_ID_ERR);
/* /*
* Must lock access to Root Error Status Reg, Root Error ID Reg, * Must lock access to Root Error Status Reg, Root Error ID Reg,
* and Root error producer/consumer index * and Root error producer/consumer index
...@@ -252,7 +252,7 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev) ...@@ -252,7 +252,7 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev)
u32 status; u32 status;
int pos; int pos;
pos = pci_find_aer_capability(dev); pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
/* Disable Root's interrupt in response to error messages */ /* Disable Root's interrupt in response to error messages */
pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND, 0); pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND, 0);
...@@ -316,7 +316,7 @@ static void aer_error_resume(struct pci_dev *dev) ...@@ -316,7 +316,7 @@ static void aer_error_resume(struct pci_dev *dev)
pci_write_config_word(dev, pos + PCI_EXP_DEVSTA, reg16); pci_write_config_word(dev, pos + PCI_EXP_DEVSTA, reg16);
/* Clean AER Root Error Status */ /* Clean AER Root Error Status */
pos = pci_find_aer_capability(dev); pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &status); pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &status);
pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, &mask); pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, &mask);
if (dev->error_state == pci_channel_io_normal) if (dev->error_state == pci_channel_io_normal)
......
...@@ -28,36 +28,6 @@ ...@@ -28,36 +28,6 @@
static int forceload; static int forceload;
module_param(forceload, bool, 0); module_param(forceload, bool, 0);
#define PCI_CFG_SPACE_SIZE (0x100)
int pci_find_aer_capability(struct pci_dev *dev)
{
int pos;
u32 reg32 = 0;
/* Check if it's a pci-express device */
pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
if (!pos)
return 0;
/* Check if it supports pci-express AER */
pos = PCI_CFG_SPACE_SIZE;
while (pos) {
if (pci_read_config_dword(dev, pos, &reg32))
return 0;
/* some broken boards return ~0 */
if (reg32 == 0xffffffff)
return 0;
if (PCI_EXT_CAP_ID(reg32) == PCI_EXT_CAP_ID_ERR)
break;
pos = reg32 >> 20;
}
return pos;
}
int pci_enable_pcie_error_reporting(struct pci_dev *dev) int pci_enable_pcie_error_reporting(struct pci_dev *dev)
{ {
u16 reg16 = 0; u16 reg16 = 0;
...@@ -67,6 +37,10 @@ int pci_enable_pcie_error_reporting(struct pci_dev *dev) ...@@ -67,6 +37,10 @@ int pci_enable_pcie_error_reporting(struct pci_dev *dev)
if (!pos) if (!pos)
return -EIO; return -EIO;
pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
if (!pos)
return -EIO;
pci_read_config_word(dev, pos+PCI_EXP_DEVCTL, &reg16); pci_read_config_word(dev, pos+PCI_EXP_DEVCTL, &reg16);
reg16 = reg16 | reg16 = reg16 |
PCI_EXP_DEVCTL_CERE | PCI_EXP_DEVCTL_CERE |
...@@ -102,7 +76,7 @@ int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev) ...@@ -102,7 +76,7 @@ int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)
int pos; int pos;
u32 status, mask; u32 status, mask;
pos = pci_find_aer_capability(dev); pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
if (!pos) if (!pos)
return -EIO; return -EIO;
...@@ -123,7 +97,7 @@ int pci_cleanup_aer_correct_error_status(struct pci_dev *dev) ...@@ -123,7 +97,7 @@ int pci_cleanup_aer_correct_error_status(struct pci_dev *dev)
int pos; int pos;
u32 status; u32 status;
pos = pci_find_aer_capability(dev); pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
if (!pos) if (!pos)
return -EIO; return -EIO;
...@@ -502,7 +476,7 @@ static void handle_error_source(struct pcie_device * aerdev, ...@@ -502,7 +476,7 @@ static void handle_error_source(struct pcie_device * aerdev,
* Correctable error does not need software intevention. * Correctable error does not need software intevention.
* No need to go through error recovery process. * No need to go through error recovery process.
*/ */
pos = pci_find_aer_capability(dev); pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
if (pos) if (pos)
pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS,
info.status); info.status);
...@@ -542,7 +516,7 @@ void aer_enable_rootport(struct aer_rpc *rpc) ...@@ -542,7 +516,7 @@ void aer_enable_rootport(struct aer_rpc *rpc)
reg16 &= ~(SYSTEM_ERROR_INTR_ON_MESG_MASK); reg16 &= ~(SYSTEM_ERROR_INTR_ON_MESG_MASK);
pci_write_config_word(pdev, pos + PCI_EXP_RTCTL, reg16); pci_write_config_word(pdev, pos + PCI_EXP_RTCTL, reg16);
aer_pos = pci_find_aer_capability(pdev); aer_pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
/* Clear error status */ /* Clear error status */
pci_read_config_dword(pdev, aer_pos + PCI_ERR_ROOT_STATUS, &reg32); pci_read_config_dword(pdev, aer_pos + PCI_ERR_ROOT_STATUS, &reg32);
pci_write_config_dword(pdev, aer_pos + PCI_ERR_ROOT_STATUS, reg32); pci_write_config_dword(pdev, aer_pos + PCI_ERR_ROOT_STATUS, reg32);
...@@ -579,7 +553,7 @@ static void disable_root_aer(struct aer_rpc *rpc) ...@@ -579,7 +553,7 @@ static void disable_root_aer(struct aer_rpc *rpc)
u32 reg32; u32 reg32;
int pos; int pos;
pos = pci_find_aer_capability(pdev); pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
/* Disable Root's interrupt in response to error messages */ /* Disable Root's interrupt in response to error messages */
pci_write_config_dword(pdev, pos + PCI_ERR_ROOT_COMMAND, 0); pci_write_config_dword(pdev, pos + PCI_ERR_ROOT_COMMAND, 0);
...@@ -618,7 +592,7 @@ static int get_device_error_info(struct pci_dev *dev, struct aer_err_info *info) ...@@ -618,7 +592,7 @@ static int get_device_error_info(struct pci_dev *dev, struct aer_err_info *info)
{ {
int pos; int pos;
pos = pci_find_aer_capability(dev); pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
/* The device might not support AER */ /* The device might not support AER */
if (!pos) if (!pos)
...@@ -755,7 +729,6 @@ int aer_init(struct pcie_device *dev) ...@@ -755,7 +729,6 @@ int aer_init(struct pcie_device *dev)
return AER_SUCCESS; return AER_SUCCESS;
} }
EXPORT_SYMBOL_GPL(pci_find_aer_capability);
EXPORT_SYMBOL_GPL(pci_enable_pcie_error_reporting); EXPORT_SYMBOL_GPL(pci_enable_pcie_error_reporting);
EXPORT_SYMBOL_GPL(pci_disable_pcie_error_reporting); EXPORT_SYMBOL_GPL(pci_disable_pcie_error_reporting);
EXPORT_SYMBOL_GPL(pci_cleanup_aer_uncorrect_error_status); EXPORT_SYMBOL_GPL(pci_cleanup_aer_uncorrect_error_status);
......
...@@ -196,23 +196,10 @@ static int get_port_device_capability(struct pci_dev *dev) ...@@ -196,23 +196,10 @@ static int get_port_device_capability(struct pci_dev *dev)
if (((reg16 >> 4) & PORT_TYPE_MASK) == PCIE_RC_PORT) if (((reg16 >> 4) & PORT_TYPE_MASK) == PCIE_RC_PORT)
services |= PCIE_PORT_SERVICE_PME; services |= PCIE_PORT_SERVICE_PME;
pos = PCI_CFG_SPACE_SIZE; if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR))
while (pos) {
pci_read_config_dword(dev, pos, &reg32);
switch (reg32 & 0xffff) {
case PCI_EXT_CAP_ID_ERR:
services |= PCIE_PORT_SERVICE_AER; services |= PCIE_PORT_SERVICE_AER;
pos = reg32 >> 20; if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_VC))
break;
case PCI_EXT_CAP_ID_VC:
services |= PCIE_PORT_SERVICE_VC; services |= PCIE_PORT_SERVICE_VC;
pos = reg32 >> 20;
break;
default:
pos = 0;
break;
}
}
return services; return services;
} }
......
...@@ -1566,9 +1566,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1566,9 +1566,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
goto probe_out; goto probe_out;
} }
if (pci_find_aer_capability(pdev)) /* This may fail but that's ok */
if (pci_enable_pcie_error_reporting(pdev)) pci_enable_pcie_error_reporting(pdev);
goto probe_out;
host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t)); host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t));
if (host == NULL) { if (host == NULL) {
......
...@@ -18,10 +18,6 @@ static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev) ...@@ -18,10 +18,6 @@ static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev)
{ {
return -EINVAL; return -EINVAL;
} }
static inline int pci_find_aer_capability(struct pci_dev *dev)
{
return 0;
}
static inline int pci_disable_pcie_error_reporting(struct pci_dev *dev) static inline int pci_disable_pcie_error_reporting(struct pci_dev *dev)
{ {
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment