]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/message/fusion/mptbase.c
[SCSI] Fusion MPT: disable pci device when mpt map resoures failed
[karo-tx-linux.git] / drivers / message / fusion / mptbase.c
index d99db5623acf45039f53dd9eb7e6b9620d88735d..fb69baa06ca88f8b0cdd60b6ac79fc6fbc7ba118 100644 (file)
@@ -1666,7 +1666,7 @@ mpt_mapresources(MPT_ADAPTER *ioc)
        if (pci_request_selected_regions(pdev, ioc->bars, "mpt")) {
                printk(MYIOC_s_ERR_FMT "pci_request_selected_regions() with "
                    "MEM failed\n", ioc->name);
-               return r;
+               goto out_pci_disable_device;
        }
 
        if (sizeof(dma_addr_t) > 4) {
@@ -1690,8 +1690,7 @@ mpt_mapresources(MPT_ADAPTER *ioc)
                } else {
                        printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n",
                            ioc->name, pci_name(pdev));
-                       pci_release_selected_regions(pdev, ioc->bars);
-                       return r;
+                       goto out_pci_release_region;
                }
        } else {
                if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
@@ -1704,8 +1703,7 @@ mpt_mapresources(MPT_ADAPTER *ioc)
                } else {
                        printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n",
                            ioc->name, pci_name(pdev));
-                       pci_release_selected_regions(pdev, ioc->bars);
-                       return r;
+                       goto out_pci_release_region;
                }
        }
 
@@ -1735,8 +1733,8 @@ mpt_mapresources(MPT_ADAPTER *ioc)
        if (mem == NULL) {
                printk(MYIOC_s_ERR_FMT ": ERROR - Unable to map adapter"
                        " memory!\n", ioc->name);
-               pci_release_selected_regions(pdev, ioc->bars);
-               return -EINVAL;
+               r = -EINVAL;
+               goto out_pci_release_region;
        }
        ioc->memmap = mem;
        dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %llx\n",
@@ -1750,6 +1748,12 @@ mpt_mapresources(MPT_ADAPTER *ioc)
        ioc->pio_chip = (SYSIF_REGS __iomem *)port;
 
        return 0;
+
+out_pci_release_region:
+       pci_release_selected_regions(pdev, ioc->bars);
+out_pci_disable_device:
+       pci_disable_device(pdev);
+       return r;
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/