Commit 20953a62 authored by Hanjun Guo's avatar Hanjun Guo Committed by James Bottomley

[SCSI] Fusion MPT: disable pci device when mpt map resoures failed

when probe a pci device, first we enable it, and disable it when
some error happened in the following process, because the power
state of the device is set to D0, and if MSI is disabled,
we will allocate irq and register gsi for this device in the enable process.

In function mpt_mapresources(MPT_ADAPTER *ioc), it forgot disable the
pci device when error happened, the irq and gsi will never be released.
this patch will fix it.
Signed-off-by: default avatarHanjun Guo <guohanjun@huawei.com>
Signed-off-by: default avatarJiang Liu <jiang.liu@huawei.com>
Acked-by: "Nandigama, Nagalakshmi" <Nagalakshmi.Nandigama@lsi.com> 
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 6ed33a4a
...@@ -1666,7 +1666,7 @@ mpt_mapresources(MPT_ADAPTER *ioc) ...@@ -1666,7 +1666,7 @@ mpt_mapresources(MPT_ADAPTER *ioc)
if (pci_request_selected_regions(pdev, ioc->bars, "mpt")) { if (pci_request_selected_regions(pdev, ioc->bars, "mpt")) {
printk(MYIOC_s_ERR_FMT "pci_request_selected_regions() with " printk(MYIOC_s_ERR_FMT "pci_request_selected_regions() with "
"MEM failed\n", ioc->name); "MEM failed\n", ioc->name);
return r; goto out_pci_disable_device;
} }
if (sizeof(dma_addr_t) > 4) { if (sizeof(dma_addr_t) > 4) {
...@@ -1690,8 +1690,7 @@ mpt_mapresources(MPT_ADAPTER *ioc) ...@@ -1690,8 +1690,7 @@ mpt_mapresources(MPT_ADAPTER *ioc)
} else { } else {
printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n", printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n",
ioc->name, pci_name(pdev)); ioc->name, pci_name(pdev));
pci_release_selected_regions(pdev, ioc->bars); goto out_pci_release_region;
return r;
} }
} else { } else {
if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
...@@ -1704,8 +1703,7 @@ mpt_mapresources(MPT_ADAPTER *ioc) ...@@ -1704,8 +1703,7 @@ mpt_mapresources(MPT_ADAPTER *ioc)
} else { } else {
printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n", printk(MYIOC_s_WARN_FMT "no suitable DMA mask for %s\n",
ioc->name, pci_name(pdev)); ioc->name, pci_name(pdev));
pci_release_selected_regions(pdev, ioc->bars); goto out_pci_release_region;
return r;
} }
} }
...@@ -1735,8 +1733,8 @@ mpt_mapresources(MPT_ADAPTER *ioc) ...@@ -1735,8 +1733,8 @@ mpt_mapresources(MPT_ADAPTER *ioc)
if (mem == NULL) { if (mem == NULL) {
printk(MYIOC_s_ERR_FMT ": ERROR - Unable to map adapter" printk(MYIOC_s_ERR_FMT ": ERROR - Unable to map adapter"
" memory!\n", ioc->name); " memory!\n", ioc->name);
pci_release_selected_regions(pdev, ioc->bars); r = -EINVAL;
return -EINVAL; goto out_pci_release_region;
} }
ioc->memmap = mem; ioc->memmap = mem;
dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %llx\n", dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %llx\n",
...@@ -1750,6 +1748,12 @@ mpt_mapresources(MPT_ADAPTER *ioc) ...@@ -1750,6 +1748,12 @@ mpt_mapresources(MPT_ADAPTER *ioc)
ioc->pio_chip = (SYSIF_REGS __iomem *)port; ioc->pio_chip = (SYSIF_REGS __iomem *)port;
return 0; return 0;
out_pci_release_region:
pci_release_selected_regions(pdev, ioc->bars);
out_pci_disable_device:
pci_disable_device(pdev);
return r;
} }
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment