bcm53xx: add PCI iproc patch adding abort handler
authorRafał Miłecki <zajec5@gmail.com>
Fri, 8 Apr 2016 20:37:14 +0000 (20:37 +0000)
committerRafał Miłecki <zajec5@gmail.com>
Fri, 8 Apr 2016 20:37:14 +0000 (20:37 +0000)
This prevents die() during PCI bus probe.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
SVN-Revision: 49121

target/linux/bcm53xx/patches-4.4/800-PCI-iproc-Ignore-ARM-core-aborts-when-running-on-bcm.patch [new file with mode: 0644]

diff --git a/target/linux/bcm53xx/patches-4.4/800-PCI-iproc-Ignore-ARM-core-aborts-when-running-on-bcm.patch b/target/linux/bcm53xx/patches-4.4/800-PCI-iproc-Ignore-ARM-core-aborts-when-running-on-bcm.patch
new file mode 100644 (file)
index 0000000..6603be9
--- /dev/null
@@ -0,0 +1,42 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Subject: [PATCH] PCI: iproc: Ignore ARM core aborts when running on bcma bus
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Northstar devices have host bridges that forward errors to the ARM core.
+These errors happen during PCI bus probing (device enumeration) and are
+expected. There is no reason for them to cause a die() so this patch
+adds a handler silencing them.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+
+--- a/drivers/pci/host/pcie-iproc-bcma.c
++++ b/drivers/pci/host/pcie-iproc-bcma.c
+@@ -40,6 +40,15 @@ static int iproc_pcie_bcma_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+       return bcma_core_irq(bdev, 5);
+ }
++static int iproc_pcie_bcma_abort_handler(unsigned long addr, unsigned int fsr,
++                                       struct pt_regs *regs)
++{
++      if (fsr == 0x1406)
++              return 0;
++
++      return 1;
++}
++
+ static int iproc_pcie_bcma_probe(struct bcma_device *bdev)
+ {
+       struct iproc_pcie *pcie;
+@@ -65,6 +74,9 @@ static int iproc_pcie_bcma_probe(struct bcma_device *bdev)
+       pcie->map_irq = iproc_pcie_bcma_map_irq;
++      hook_fault_code(16 + 6, iproc_pcie_bcma_abort_handler, SIGBUS, BUS_OBJERR,
++                      "imprecise external abort");
++
+       ret = iproc_pcie_setup(pcie, &res);
+       if (ret)
+               dev_err(pcie->dev, "PCIe controller setup failed\n");