PCI: dwc: Fix crashes seen due to missing assignments
authorGuenter Roeck <linux@roeck-us.net>
Sat, 25 Feb 2017 10:08:12 +0000 (02:08 -0800)
committerBjorn Helgaas <bhelgaas@google.com>
Sat, 25 Feb 2017 15:06:02 +0000 (09:06 -0600)
Fix the following crash, seen in dwc/pci-imx6.

  Unable to handle kernel NULL pointer dereference at virtual address 00000070
  pgd = c0004000
  [00000070] *pgd=00000000
  Internal error: Oops: 805 [#1] SMP ARM
  Modules linked in:
  CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.10.0-09686-g9e31489 #1
  Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
  task: cb850000 task.stack: cb84e000
  PC is at imx6_pcie_probe+0x2f4/0x414
  ...

While at it, fix the same problem in various drivers instead of waiting for
individual crash reports.

The change in the imx6 driver was tested with qemu. The changes in other
drivers are based on code inspection and have been compile tested only.

Fixes: 442ec4c04d12 ("PCI: dwc: all: Split struct pcie_port into host-only and core structures")
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org> # designware-plat
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Kishon Vijay Abraham I <kishon@ti.com>
drivers/pci/dwc/pci-exynos.c
drivers/pci/dwc/pci-imx6.c
drivers/pci/dwc/pci-keystone.c
drivers/pci/dwc/pci-layerscape.c
drivers/pci/dwc/pcie-armada8k.c
drivers/pci/dwc/pcie-artpec6.c
drivers/pci/dwc/pcie-designware-plat.c
drivers/pci/dwc/pcie-hisi.c
drivers/pci/dwc/pcie-qcom.c
drivers/pci/dwc/pcie-spear13xx.c

index 001c91a..993b650 100644 (file)
@@ -668,6 +668,7 @@ static int __init exynos_pcie_probe(struct platform_device *pdev)
        pci->dev = dev;
        pci->ops = &dw_pcie_ops;
 
+       ep->pci = pci;
        ep->ops = (const struct exynos_pcie_ops *)
                of_device_get_match_data(dev);
 
index 3ab6761..801e46c 100644 (file)
@@ -605,6 +605,7 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
        pci->dev = dev;
        pci->ops = &dw_pcie_ops;
 
+       imx6_pcie->pci = pci;
        imx6_pcie->variant =
                (enum imx6_pcie_variants)of_device_get_match_data(dev);
 
index 8dc6640..fcc9723 100644 (file)
@@ -401,6 +401,8 @@ static int __init ks_pcie_probe(struct platform_device *pdev)
        pci->dev = dev;
        pci->ops = &dw_pcie_ops;
 
+       ks_pcie->pci = pci;
+
        /* initialize SerDes Phy if present */
        phy = devm_phy_get(dev, "pcie-phy");
        if (PTR_ERR_OR_ZERO(phy) == -EPROBE_DEFER)
index 175c09e..c32e392 100644 (file)
@@ -280,6 +280,8 @@ static int __init ls_pcie_probe(struct platform_device *pdev)
        pci->dev = dev;
        pci->ops = pcie->drvdata->dw_pcie_ops;
 
+       pcie->pci = pci;
+
        dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
        pci->dbi_base = devm_ioremap_resource(dev, dbi_base);
        if (IS_ERR(pci->dbi_base))
index 66bac6f..f110e3b 100644 (file)
@@ -220,6 +220,8 @@ static int armada8k_pcie_probe(struct platform_device *pdev)
        pci->dev = dev;
        pci->ops = &dw_pcie_ops;
 
+       pcie->pci = pci;
+
        pcie->clk = devm_clk_get(dev, NULL);
        if (IS_ERR(pcie->clk))
                return PTR_ERR(pcie->clk);
index 59ecc9e..fcd3ef8 100644 (file)
@@ -253,6 +253,8 @@ static int artpec6_pcie_probe(struct platform_device *pdev)
 
        pci->dev = dev;
 
+       artpec6_pcie->pci = pci;
+
        dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi");
        pci->dbi_base = devm_ioremap_resource(dev, dbi_base);
        if (IS_ERR(pci->dbi_base))
index 65250f6..b6c832b 100644 (file)
@@ -104,6 +104,8 @@ static int dw_plat_pcie_probe(struct platform_device *pdev)
 
        pci->dev = dev;
 
+       dw_plat_pcie->pci = pci;
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        pci->dbi_base = devm_ioremap_resource(dev, res);
        if (IS_ERR(pci->dbi_base))
index e3e4fed..fd66a31 100644 (file)
@@ -284,6 +284,8 @@ static int hisi_pcie_probe(struct platform_device *pdev)
 
        driver = dev->driver;
 
+       hisi_pcie->pci = pci;
+
        hisi_pcie->soc_ops = of_device_get_match_data(dev);
 
        hisi_pcie->subctrl =
index e36abe0..67eb7f5 100644 (file)
@@ -686,6 +686,8 @@ static int qcom_pcie_probe(struct platform_device *pdev)
        pci->ops = &dw_pcie_ops;
        pp = &pci->pp;
 
+       pcie->pci = pci;
+
        pcie->ops = (struct qcom_pcie_ops *)of_device_get_match_data(dev);
 
        pcie->reset = devm_gpiod_get_optional(dev, "perst", GPIOD_OUT_LOW);
index 348f9c5..eaa4ea8 100644 (file)
@@ -247,6 +247,8 @@ static int spear13xx_pcie_probe(struct platform_device *pdev)
        pci->dev = dev;
        pci->ops = &dw_pcie_ops;
 
+       spear13xx_pcie->pci = pci;
+
        spear13xx_pcie->phy = devm_phy_get(dev, "pcie-phy");
        if (IS_ERR(spear13xx_pcie->phy)) {
                ret = PTR_ERR(spear13xx_pcie->phy);