Merge branch 'pci/controller/dwc'
[linux-2.6-microblaze.git] / drivers / pci / controller / dwc / pcie-designware-host.c
index d5fc31f..d15a5c2 100644 (file)
@@ -328,7 +328,7 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
        struct device *dev = pci->dev;
        struct platform_device *pdev = to_platform_device(dev);
-       u64 *msi_vaddr;
+       u64 *msi_vaddr = NULL;
        int ret;
        u32 ctrl, num_ctrls;
 
@@ -379,15 +379,20 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
         * memory.
         */
        ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
-       if (ret)
-               dev_warn(dev, "Failed to set DMA mask to 32-bit. Devices with only 32-bit MSI support may not work properly\n");
+       if (!ret)
+               msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data,
+                                               GFP_KERNEL);
 
-       msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data,
-                                       GFP_KERNEL);
        if (!msi_vaddr) {
-               dev_err(dev, "Failed to alloc and map MSI data\n");
-               dw_pcie_free_msi(pp);
-               return -ENOMEM;
+               dev_warn(dev, "Failed to allocate 32-bit MSI address\n");
+               dma_set_coherent_mask(dev, DMA_BIT_MASK(64));
+               msi_vaddr = dmam_alloc_coherent(dev, sizeof(u64), &pp->msi_data,
+                                               GFP_KERNEL);
+               if (!msi_vaddr) {
+                       dev_err(dev, "Failed to allocate MSI address\n");
+                       dw_pcie_free_msi(pp);
+                       return -ENOMEM;
+               }
        }
 
        return 0;