[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:
Bjorn Helgaas 2006-06-25 05:49:01 -07:00 committed by Linus Torvalds
parent e7b6905582
commit c33ac89bc7

View file

@ -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;
} }
/* /*