Commit 4e570309 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Linus Torvalds

[PATCH] CCISS: request all PCI resources

We should call pci_request_regions() to claim all resources the device
decodes.  Previously, we claimed only the I/O port range.
Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Acked-by: default avatarJeff Garzik <jeff@garzik.org>
Acked-by: default avatarMike Miller <mike.miller@hp.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c33ac89b
...@@ -2638,16 +2638,6 @@ static void print_cfg_table( CfgTable_struct *tb) ...@@ -2638,16 +2638,6 @@ static void print_cfg_table( CfgTable_struct *tb)
} }
#endif /* CCISS_DEBUG */ #endif /* CCISS_DEBUG */
static void release_io_mem(ctlr_info_t *c)
{
/* if IO mem was not protected do nothing */
if( c->io_mem_addr == 0)
return;
release_region(c->io_mem_addr, c->io_mem_length);
c->io_mem_addr = 0;
c->io_mem_length = 0;
}
static int find_PCI_BAR_index(struct pci_dev *pdev, static int find_PCI_BAR_index(struct pci_dev *pdev,
unsigned long pci_bar_addr) unsigned long pci_bar_addr)
{ {
...@@ -2762,36 +2752,18 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -2762,36 +2752,18 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
return err; return err;
} }
err = pci_request_regions(pdev, "cciss");
if (err) {
printk(KERN_ERR "cciss: Cannot obtain PCI resources, "
"aborting\n");
goto err_out_disable_pdev;
}
subsystem_vendor_id = pdev->subsystem_vendor; subsystem_vendor_id = pdev->subsystem_vendor;
subsystem_device_id = pdev->subsystem_device; subsystem_device_id = pdev->subsystem_device;
board_id = (((__u32) (subsystem_device_id << 16) & 0xffff0000) | board_id = (((__u32) (subsystem_device_id << 16) & 0xffff0000) |
subsystem_vendor_id); subsystem_vendor_id);
/* search for our IO range so we can protect it */
for(i=0; i<DEVICE_COUNT_RESOURCE; i++)
{
/* is this an IO range */
if( pci_resource_flags(pdev, i) & 0x01 ) {
c->io_mem_addr = pci_resource_start(pdev, i);
c->io_mem_length = pci_resource_end(pdev, i) -
pci_resource_start(pdev, i) +1;
#ifdef CCISS_DEBUG
printk("IO value found base_addr[%d] %lx %lx\n", i,
c->io_mem_addr, c->io_mem_length);
#endif /* CCISS_DEBUG */
/* register the IO range */
if(!request_region( c->io_mem_addr,
c->io_mem_length, "cciss"))
{
printk(KERN_WARNING "cciss I/O memory range already in use addr=%lx length=%ld\n",
c->io_mem_addr, c->io_mem_length);
c->io_mem_addr= 0;
c->io_mem_length = 0;
}
break;
}
}
#ifdef CCISS_DEBUG #ifdef CCISS_DEBUG
printk("command = %x\n", command); printk("command = %x\n", command);
printk("irq = %x\n", pdev->irq); printk("irq = %x\n", pdev->irq);
...@@ -2826,7 +2798,7 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -2826,7 +2798,7 @@ 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");
err = -ENODEV; err = -ENODEV;
goto err_out_disable_pdev; goto err_out_free_res;
} }
/* get the address index number */ /* get the address index number */
...@@ -2842,9 +2814,8 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -2842,9 +2814,8 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
#endif /* CCISS_DEBUG */ #endif /* CCISS_DEBUG */
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);
err = -ENODEV; err = -ENODEV;
goto err_out_disable_pdev; goto err_out_free_res;
} }
cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET); cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET);
...@@ -2872,7 +2843,7 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -2872,7 +2843,7 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
" to access the Smart Array controller %08lx\n", " to access the Smart Array controller %08lx\n",
(unsigned long)board_id); (unsigned long)board_id);
err = -ENODEV; err = -ENODEV;
goto err_out_disable_pdev; goto err_out_free_res;
} }
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') ||
...@@ -2881,7 +2852,7 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -2881,7 +2852,7 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
{ {
printk("Does not appear to be a valid CISS config table\n"); printk("Does not appear to be a valid CISS config table\n");
err = -ENODEV; err = -ENODEV;
goto err_out_disable_pdev; goto err_out_free_res;
} }
#ifdef CONFIG_X86 #ifdef CONFIG_X86
...@@ -2926,10 +2897,13 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -2926,10 +2897,13 @@ 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");
err = -ENODEV; err = -ENODEV;
goto err_out_disable_pdev; goto err_out_free_res;
} }
return 0; return 0;
err_out_free_res:
pci_release_regions(pdev);
err_out_disable_pdev: err_out_disable_pdev:
pci_disable_device(pdev); pci_disable_device(pdev);
return err; return err;
...@@ -3276,7 +3250,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, ...@@ -3276,7 +3250,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
clean2: clean2:
unregister_blkdev(hba[i]->major, hba[i]->devname); unregister_blkdev(hba[i]->major, hba[i]->devname);
clean1: clean1:
release_io_mem(hba[i]);
hba[i]->busy_initializing = 0; hba[i]->busy_initializing = 0;
free_hba(i); free_hba(i);
return(-1); return(-1);
...@@ -3322,7 +3295,6 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev) ...@@ -3322,7 +3295,6 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev)
pci_disable_msi(hba[i]->pdev); pci_disable_msi(hba[i]->pdev);
#endif /* CONFIG_PCI_MSI */ #endif /* CONFIG_PCI_MSI */
pci_set_drvdata(pdev, NULL);
iounmap(hba[i]->vaddr); iounmap(hba[i]->vaddr);
cciss_unregister_scsi(i); /* unhook from SCSI subsystem */ cciss_unregister_scsi(i); /* unhook from SCSI subsystem */
unregister_blkdev(hba[i]->major, hba[i]->devname); unregister_blkdev(hba[i]->major, hba[i]->devname);
...@@ -3349,7 +3321,9 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev) ...@@ -3349,7 +3321,9 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev)
#ifdef CONFIG_CISS_SCSI_TAPE #ifdef CONFIG_CISS_SCSI_TAPE
kfree(hba[i]->scsi_rejects.complete); kfree(hba[i]->scsi_rejects.complete);
#endif #endif
release_io_mem(hba[i]); pci_release_regions(pdev);
pci_disable_device(pdev);
pci_set_drvdata(pdev, NULL);
free_hba(i); free_hba(i);
} }
......
...@@ -60,8 +60,6 @@ struct ctlr_info ...@@ -60,8 +60,6 @@ struct ctlr_info
__u32 board_id; __u32 board_id;
void __iomem *vaddr; void __iomem *vaddr;
unsigned long paddr; unsigned long paddr;
unsigned long io_mem_addr;
unsigned long io_mem_length;
CfgTable_struct __iomem *cfgtable; CfgTable_struct __iomem *cfgtable;
int interrupts_enabled; int interrupts_enabled;
int major; int major;
......
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