If we're an agent/end-point or fsl_add_bridge doesn't succeed due to some
resource failure we should not scan the PCI bus. We change fsl_add_bridge()
to return -ENODEV in the case we're an agent/end-point.

Signed-off-by: Jia Hongtao <b38...@freescale.com>
Signed-off-by: Li Yang <le...@freescale.com>
---
 arch/powerpc/sysdev/fsl_pci.c |   34 +++++++++++++++++++---------------
 1 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c
index a0f305d..e318e9d 100644
--- a/arch/powerpc/sysdev/fsl_pci.c
+++ b/arch/powerpc/sysdev/fsl_pci.c
@@ -370,7 +370,7 @@ int __init fsl_add_bridge(struct device_node *dev, int 
is_primary)
                        iounmap(hose->cfg_data);
                iounmap(hose->cfg_addr);
                pcibios_free_controller(hose);
-               return 0;
+               return -ENODEV;
        }
 
        setup_pci_cmd(hose);
@@ -723,29 +723,33 @@ static const struct of_device_id pci_ids[] = {
 static int __devinit fsl_pci_probe(struct platform_device *pdev)
 {
        struct pci_controller *hose;
+       int ret;
 
        if (of_match_node(pci_ids, pdev->dev.of_node)) {
                struct resource rsrc;
                of_address_to_resource(pdev->dev.of_node, 0, &rsrc);
                if ((rsrc.start & 0xfffff) == 8000)
-                       fsl_add_bridge(pdev->dev.of_node, 1);
+                       ret = fsl_add_bridge(pdev->dev.of_node, 1);
                else
-                       fsl_add_bridge(pdev->dev.of_node, 0);
+                       ret = fsl_add_bridge(pdev->dev.of_node, 0);
 
+               if (ret == 0) {
 #ifdef CONFIG_SWIOTLB
-               hose = pci_find_hose_for_OF_device(pdev->dev.of_node);
-               /*
-                * if we couldn't map all of DRAM via the dma windows
-                * we need SWIOTLB to handle buffers located outside of
-                * dma capable memory region
-                */
-               if (memblock_end_of_DRAM() > hose->dma_window_base_cur
-                               + hose->dma_window_size) {
-                       ppc_swiotlb_enable = 1;
-                       set_pci_dma_ops(&swiotlb_dma_ops);
-                       ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb;
-               }
+                       hose = pci_find_hose_for_OF_device(pdev->dev.of_node);
+                       /*
+                        * if we couldn't map all of DRAM via the dma windows
+                        * we need SWIOTLB to handle buffers located outside of
+                        * dma capable memory region
+                        */
+                       if (memblock_end_of_DRAM() > hose->dma_window_base_cur
+                                       + hose->dma_window_size) {
+                               ppc_swiotlb_enable = 1;
+                               set_pci_dma_ops(&swiotlb_dma_ops);
+                               ppc_md.pci_dma_dev_setup =
+                                       pci_dma_dev_setup_swiotlb;
+                       }
 #endif
+               }
 
        }
 
-- 
1.7.5.1


_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to