[PATCH] CCISS: disable device when returning failure
If something fails after we call pci_enable_device(), we should call pci_disable_device() before returning the failure. Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> Acked-by: Jeff Garzik <jeff@garzik.org> Acked-by: Mike Miller <mike.miller@hp.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
e7b6905582
commit
c33ac89bc7
|
@ -2744,7 +2744,7 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
||||||
__u64 cfg_offset;
|
__u64 cfg_offset;
|
||||||
__u32 cfg_base_addr;
|
__u32 cfg_base_addr;
|
||||||
__u64 cfg_base_addr_index;
|
__u64 cfg_base_addr_index;
|
||||||
int i;
|
int i, err;
|
||||||
|
|
||||||
/* check to see if controller has been disabled */
|
/* check to see if controller has been disabled */
|
||||||
/* BEFORE trying to enable it */
|
/* BEFORE trying to enable it */
|
||||||
|
@ -2752,13 +2752,14 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
||||||
if(!(command & 0x02))
|
if(!(command & 0x02))
|
||||||
{
|
{
|
||||||
printk(KERN_WARNING "cciss: controller appears to be disabled\n");
|
printk(KERN_WARNING "cciss: controller appears to be disabled\n");
|
||||||
return(-1);
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pci_enable_device(pdev))
|
err = pci_enable_device(pdev);
|
||||||
|
if (err)
|
||||||
{
|
{
|
||||||
printk(KERN_ERR "cciss: Unable to Enable PCI device\n");
|
printk(KERN_ERR "cciss: Unable to Enable PCI device\n");
|
||||||
return( -1);
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
subsystem_vendor_id = pdev->subsystem_vendor;
|
subsystem_vendor_id = pdev->subsystem_vendor;
|
||||||
|
@ -2824,7 +2825,8 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
||||||
}
|
}
|
||||||
if (scratchpad != CCISS_FIRMWARE_READY) {
|
if (scratchpad != CCISS_FIRMWARE_READY) {
|
||||||
printk(KERN_WARNING "cciss: Board not ready. Timed out.\n");
|
printk(KERN_WARNING "cciss: Board not ready. Timed out.\n");
|
||||||
return -1;
|
err = -ENODEV;
|
||||||
|
goto err_out_disable_pdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the address index number */
|
/* get the address index number */
|
||||||
|
@ -2841,7 +2843,8 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
||||||
if (cfg_base_addr_index == -1) {
|
if (cfg_base_addr_index == -1) {
|
||||||
printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n");
|
printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n");
|
||||||
release_io_mem(c);
|
release_io_mem(c);
|
||||||
return -1;
|
err = -ENODEV;
|
||||||
|
goto err_out_disable_pdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET);
|
cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET);
|
||||||
|
@ -2868,7 +2871,8 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
||||||
printk(KERN_WARNING "cciss: Sorry, I don't know how"
|
printk(KERN_WARNING "cciss: Sorry, I don't know how"
|
||||||
" to access the Smart Array controller %08lx\n",
|
" to access the Smart Array controller %08lx\n",
|
||||||
(unsigned long)board_id);
|
(unsigned long)board_id);
|
||||||
return -1;
|
err = -ENODEV;
|
||||||
|
goto err_out_disable_pdev;
|
||||||
}
|
}
|
||||||
if ( (readb(&c->cfgtable->Signature[0]) != 'C') ||
|
if ( (readb(&c->cfgtable->Signature[0]) != 'C') ||
|
||||||
(readb(&c->cfgtable->Signature[1]) != 'I') ||
|
(readb(&c->cfgtable->Signature[1]) != 'I') ||
|
||||||
|
@ -2876,7 +2880,8 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
||||||
(readb(&c->cfgtable->Signature[3]) != 'S') )
|
(readb(&c->cfgtable->Signature[3]) != 'S') )
|
||||||
{
|
{
|
||||||
printk("Does not appear to be a valid CISS config table\n");
|
printk("Does not appear to be a valid CISS config table\n");
|
||||||
return -1;
|
err = -ENODEV;
|
||||||
|
goto err_out_disable_pdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86
|
#ifdef CONFIG_X86
|
||||||
|
@ -2920,10 +2925,14 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
printk(KERN_WARNING "cciss: unable to get board into"
|
printk(KERN_WARNING "cciss: unable to get board into"
|
||||||
" simple mode\n");
|
" simple mode\n");
|
||||||
return -1;
|
err = -ENODEV;
|
||||||
|
goto err_out_disable_pdev;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_out_disable_pdev:
|
||||||
|
pci_disable_device(pdev);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue