I'll try to give this a run tomorrow - thanks Yanmin & others. Tomasz On 10/5/08, Zhang, Yanmin <yanmin_zhang@xxxxxxxxxxxxxxx> wrote: > Tomasz, > > Matthew and Jesse have a better patch to fix the AER issue on your machine. Would you like > to help test the new patch? You could get the new patch at: > http://article.gmane.org/gmane.linux.kernel.pci/1115. > > Thanks, > Yanmin > > On Fri, 2008-10-03 at 09:24 -0700, Jesse Barnes wrote: > > On Friday, October 3, 2008 8:39 am Jesse Barnes wrote: > > > On Friday, October 3, 2008 7:50 am Matthew Wilcox wrote: > > > > On Thu, Oct 02, 2008 at 11:50:24AM -0700, Jesse Barnes wrote: > > > > > +++ b/drivers/pci/pcie/aer/aerdrv.c > > > > > @@ -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(dev, PCI_EXT_CAP_ID_ERR); > > > > > /* > > > > > * Must lock access to Root Error Status Reg, Root Error ID Reg, > > > > > * and Root error producer/consumer index > > > > > > > > Waitaminute ... you didn't actually compile this, did you? pdev changes > > > > > > > > to dev in three other hunks: > > > > > > Doh! You caught me. :) That's why I was careful to put [RFC] rather than > > > [PATCH] on the subject. > > > > > > But since you're looking... I'll respin and include a change to do > > > something similar to get_port_device_capability(), please check it out when > > > you get a chance. > > > > Ok, here's an updated version that fixes the qla_os.c change (Andrew, how does > > this look?) and also fixes up the portdrv_core.c stuff (Yanmin can you take a > > look at that to see if it'll fix your problem?). > > > > Thanks, > > -- > > Jesse Barnes, Intel Open Source Technology Center > > > > > > diff --git a/drivers/pci/pcie/aer/aerdrv.c b/drivers/pci/pcie/aer/aerdrv.c > > index 77036f4..e390707 100644 > > --- a/drivers/pci/pcie/aer/aerdrv.c > > +++ b/drivers/pci/pcie/aer/aerdrv.c > > @@ -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) > > diff --git a/drivers/pci/pcie/aer/aerdrv_core.c > > b/drivers/pci/pcie/aer/aerdrv_core.c > > index 6f5244b..2ef8bbd 100644 > > --- a/drivers/pci/pcie/aer/aerdrv_core.c > > +++ b/drivers/pci/pcie/aer/aerdrv_core.c > > @@ -28,35 +28,6 @@ > > static int forceload; > > module_param(forceload, bool, 0); > > > > -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; > > @@ -66,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 | > > @@ -101,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; > > > > @@ -122,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; > > > > @@ -501,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); > > @@ -541,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); > > @@ -578,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); > > > > @@ -617,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) > > diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c > > index 18bb811..6cdd41f 100644 > > --- a/drivers/pci/pcie/portdrv_core.c > > +++ b/drivers/pci/pcie/portdrv_core.c > > @@ -196,23 +196,10 @@ static int get_port_device_capability(struct pci_dev > > *dev) > > 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; > > } > > diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c > > index 26afe44..7e79835 100644 > > --- a/drivers/scsi/qla2xxx/qla_os.c > > +++ b/drivers/scsi/qla2xxx/qla_os.c > > @@ -1567,9 +1567,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; > > + if (!pci_enable_pcie_error_reporting(pdev)) > > + printk(KERN_INFO "qla2xxx: Enabled error reporting\n"); > > > > host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t)); > > if (host == NULL) { > > -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html