forked from Minki/linux
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: Tomasz Czernecki <czernecki@gmail.com> Acked-by: Andrew Vasquez <andrew.vasquez@qlogic.com> Reviewed-by: Matthew Wilcox <willy@linux.intel.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
parent
1543c90c39
commit
0927678f55
@ -105,7 +105,7 @@ static irqreturn_t aer_irq(int irq, void *context)
|
||||
unsigned long flags;
|
||||
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,
|
||||
* and Root error producer/consumer index
|
||||
@ -252,7 +252,7 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev)
|
||||
u32 status;
|
||||
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 */
|
||||
pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND, 0);
|
||||
@ -316,7 +316,7 @@ static void aer_error_resume(struct pci_dev *dev)
|
||||
pci_write_config_word(dev, pos + PCI_EXP_DEVSTA, reg16);
|
||||
|
||||
/* 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_SEVER, &mask);
|
||||
if (dev->error_state == pci_channel_io_normal)
|
||||
|
@ -28,36 +28,6 @@
|
||||
static int forceload;
|
||||
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, ®32))
|
||||
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)
|
||||
{
|
||||
u16 reg16 = 0;
|
||||
@ -67,6 +37,10 @@ int pci_enable_pcie_error_reporting(struct pci_dev *dev)
|
||||
if (!pos)
|
||||
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, ®16);
|
||||
reg16 = reg16 |
|
||||
PCI_EXP_DEVCTL_CERE |
|
||||
@ -102,7 +76,7 @@ int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)
|
||||
int pos;
|
||||
u32 status, mask;
|
||||
|
||||
pos = pci_find_aer_capability(dev);
|
||||
pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
|
||||
if (!pos)
|
||||
return -EIO;
|
||||
|
||||
@ -123,7 +97,7 @@ int pci_cleanup_aer_correct_error_status(struct pci_dev *dev)
|
||||
int pos;
|
||||
u32 status;
|
||||
|
||||
pos = pci_find_aer_capability(dev);
|
||||
pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
|
||||
if (!pos)
|
||||
return -EIO;
|
||||
|
||||
@ -502,7 +476,7 @@ static void handle_error_source(struct pcie_device * aerdev,
|
||||
* Correctable error does not need software intevention.
|
||||
* 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)
|
||||
pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS,
|
||||
info.status);
|
||||
@ -542,7 +516,7 @@ void aer_enable_rootport(struct aer_rpc *rpc)
|
||||
reg16 &= ~(SYSTEM_ERROR_INTR_ON_MESG_MASK);
|
||||
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 */
|
||||
pci_read_config_dword(pdev, aer_pos + PCI_ERR_ROOT_STATUS, ®32);
|
||||
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)
|
||||
u32 reg32;
|
||||
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 */
|
||||
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)
|
||||
{
|
||||
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 */
|
||||
if (!pos)
|
||||
@ -755,7 +729,6 @@ int aer_init(struct pcie_device *dev)
|
||||
return AER_SUCCESS;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(pci_find_aer_capability);
|
||||
EXPORT_SYMBOL_GPL(pci_enable_pcie_error_reporting);
|
||||
EXPORT_SYMBOL_GPL(pci_disable_pcie_error_reporting);
|
||||
EXPORT_SYMBOL_GPL(pci_cleanup_aer_uncorrect_error_status);
|
||||
|
@ -195,24 +195,11 @@ static int get_port_device_capability(struct pci_dev *dev)
|
||||
/* PME Capable - root port capability */
|
||||
if (((reg16 >> 4) & PORT_TYPE_MASK) == PCIE_RC_PORT)
|
||||
services |= PCIE_PORT_SERVICE_PME;
|
||||
|
||||
pos = PCI_CFG_SPACE_SIZE;
|
||||
while (pos) {
|
||||
pci_read_config_dword(dev, pos, ®32);
|
||||
switch (reg32 & 0xffff) {
|
||||
case PCI_EXT_CAP_ID_ERR:
|
||||
services |= PCIE_PORT_SERVICE_AER;
|
||||
pos = reg32 >> 20;
|
||||
break;
|
||||
case PCI_EXT_CAP_ID_VC:
|
||||
services |= PCIE_PORT_SERVICE_VC;
|
||||
pos = reg32 >> 20;
|
||||
break;
|
||||
default:
|
||||
pos = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR))
|
||||
services |= PCIE_PORT_SERVICE_AER;
|
||||
if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_VC))
|
||||
services |= PCIE_PORT_SERVICE_VC;
|
||||
|
||||
return services;
|
||||
}
|
||||
|
@ -1566,9 +1566,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
goto probe_out;
|
||||
}
|
||||
|
||||
if (pci_find_aer_capability(pdev))
|
||||
if (pci_enable_pcie_error_reporting(pdev))
|
||||
goto probe_out;
|
||||
/* This may fail but that's ok */
|
||||
pci_enable_pcie_error_reporting(pdev);
|
||||
|
||||
host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t));
|
||||
if (host == NULL) {
|
||||
|
@ -18,10 +18,6 @@ static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev)
|
||||
{
|
||||
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)
|
||||
{
|
||||
return -EINVAL;
|
||||
|
Loading…
Reference in New Issue
Block a user