unsigned int pcibios_handle_status_errors(unsigned long addr, unsigned int status, struct pci_channel *hose) { unsigned int cmd = 0; if (status & PCI_STATUS_REC_MASTER_ABORT) { printk(KERN_DEBUG "PCI: master abort, pc=0x%08lx\n", addr); cmd |= PCI_STATUS_REC_MASTER_ABORT; } if (status & PCI_STATUS_REC_TARGET_ABORT) { printk(KERN_DEBUG "PCI: target abort: "); pcibios_report_status(PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT, 1); printk("\n"); cmd |= PCI_STATUS_REC_TARGET_ABORT; } if (status & (PCI_STATUS_PARITY | PCI_STATUS_DETECTED_PARITY)) { printk(KERN_DEBUG "PCI: parity error detected: "); pcibios_report_status(PCI_STATUS_PARITY | PCI_STATUS_DETECTED_PARITY, 1); printk("\n"); cmd |= PCI_STATUS_PARITY | PCI_STATUS_DETECTED_PARITY; /* Now back off of the IRQ for awhile */ if (hose->err_irq) { disable_irq_nosync(hose->err_irq); hose->err_timer.expires = jiffies + HZ; add_timer(&hose->err_timer); } } return cmd; }
static irqreturn_t sh7780_pci_serr_irq(int irq, void *dev_id) { struct pci_channel *hose = dev_id; printk(KERN_DEBUG "PCI: system error received: "); pcibios_report_status(PCI_STATUS_SIG_SYSTEM_ERROR, 1); printk("\n"); /* Deassert SERR */ __raw_writel(SH4_PCIINTM_SDIM, hose->reg_base + SH4_PCIINTM); /* Back off the IRQ for awhile */ disable_irq_nosync(irq); hose->serr_timer.expires = jiffies + HZ; add_timer(&hose->serr_timer); return IRQ_HANDLED; }