提交 21e1a5f2 编写于 作者: J Jeff Garzik 提交者: James Bottomley

[SCSI] ips: PCI API cleanups

* pass Scsi_Host to ips_remove_device() via pci_set_drvdata(),
  allowing us to eliminate the ips_ha[] search loop and call
  ips_release() directly.

* call pci_{request,release}_regions() and eliminate individual
  request/release_[mem_]region() calls

* call pci_disable_device(), paired with pci_enable_device()

* s/0/NULL/ in a few places

* check ioremap() return value
Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
Acked-by: N"Salyzyn, Mark" <mark_salyzyn@adaptec.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
上级 2f277d6a
...@@ -702,10 +702,6 @@ ips_release(struct Scsi_Host *sh) ...@@ -702,10 +702,6 @@ ips_release(struct Scsi_Host *sh)
/* free extra memory */ /* free extra memory */
ips_free(ha); ips_free(ha);
/* Free I/O Region */
if (ha->io_addr)
release_region(ha->io_addr, ha->io_len);
/* free IRQ */ /* free IRQ */
free_irq(ha->pcidev->irq, ha); free_irq(ha->pcidev->irq, ha);
...@@ -4394,8 +4390,6 @@ ips_free(ips_ha_t * ha) ...@@ -4394,8 +4390,6 @@ ips_free(ips_ha_t * ha)
ha->mem_ptr = NULL; ha->mem_ptr = NULL;
} }
if (ha->mem_addr)
release_mem_region(ha->mem_addr, ha->mem_len);
ha->mem_addr = 0; ha->mem_addr = 0;
} }
...@@ -6880,20 +6874,14 @@ ips_register_scsi(int index) ...@@ -6880,20 +6874,14 @@ ips_register_scsi(int index)
static void __devexit static void __devexit
ips_remove_device(struct pci_dev *pci_dev) ips_remove_device(struct pci_dev *pci_dev)
{ {
int i; struct Scsi_Host *sh = pci_get_drvdata(pci_dev);
struct Scsi_Host *sh;
ips_ha_t *ha;
for (i = 0; i < IPS_MAX_ADAPTERS; i++) { pci_set_drvdata(pci_dev, NULL);
ha = ips_ha[i];
if (ha) { ips_release(sh);
if ((pci_dev->bus->number == ha->pcidev->bus->number) &&
(pci_dev->devfn == ha->pcidev->devfn)) { pci_release_regions(pci_dev);
sh = ips_sh[i]; pci_disable_device(pci_dev);
ips_release(sh);
}
}
}
} }
/****************************************************************************/ /****************************************************************************/
...@@ -6947,12 +6935,17 @@ module_exit(ips_module_exit); ...@@ -6947,12 +6935,17 @@ module_exit(ips_module_exit);
static int __devinit static int __devinit
ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent) ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent)
{ {
int uninitialized_var(index); int index = -1;
int rc; int rc;
METHOD_TRACE("ips_insert_device", 1); METHOD_TRACE("ips_insert_device", 1);
if (pci_enable_device(pci_dev)) rc = pci_enable_device(pci_dev);
return -1; if (rc)
return rc;
rc = pci_request_regions(pci_dev, "ips");
if (rc)
goto err_out;
rc = ips_init_phase1(pci_dev, &index); rc = ips_init_phase1(pci_dev, &index);
if (rc == SUCCESS) if (rc == SUCCESS)
...@@ -6968,6 +6961,19 @@ ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent) ...@@ -6968,6 +6961,19 @@ ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent)
ips_num_controllers++; ips_num_controllers++;
ips_next_controller = ips_num_controllers; ips_next_controller = ips_num_controllers;
if (rc < 0) {
rc = -ENODEV;
goto err_out_regions;
}
pci_set_drvdata(pci_dev, ips_sh[index]);
return 0;
err_out_regions:
pci_release_regions(pci_dev);
err_out:
pci_disable_device(pci_dev);
return rc; return rc;
} }
...@@ -7000,7 +7006,7 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr) ...@@ -7000,7 +7006,7 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
METHOD_TRACE("ips_init_phase1", 1); METHOD_TRACE("ips_init_phase1", 1);
index = IPS_MAX_ADAPTERS; index = IPS_MAX_ADAPTERS;
for (j = 0; j < IPS_MAX_ADAPTERS; j++) { for (j = 0; j < IPS_MAX_ADAPTERS; j++) {
if (ips_ha[j] == 0) { if (ips_ha[j] == NULL) {
index = j; index = j;
break; break;
} }
...@@ -7037,32 +7043,17 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr) ...@@ -7037,32 +7043,17 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
uint32_t base; uint32_t base;
uint32_t offs; uint32_t offs;
if (!request_mem_region(mem_addr, mem_len, "ips")) {
IPS_PRINTK(KERN_WARNING, pci_dev,
"Couldn't allocate IO Memory space %x len %d.\n",
mem_addr, mem_len);
return -1;
}
base = mem_addr & PAGE_MASK; base = mem_addr & PAGE_MASK;
offs = mem_addr - base; offs = mem_addr - base;
ioremap_ptr = ioremap(base, PAGE_SIZE); ioremap_ptr = ioremap(base, PAGE_SIZE);
if (!ioremap_ptr)
return -1;
mem_ptr = ioremap_ptr + offs; mem_ptr = ioremap_ptr + offs;
} else { } else {
ioremap_ptr = NULL; ioremap_ptr = NULL;
mem_ptr = NULL; mem_ptr = NULL;
} }
/* setup I/O mapped area (if applicable) */
if (io_addr) {
if (!request_region(io_addr, io_len, "ips")) {
IPS_PRINTK(KERN_WARNING, pci_dev,
"Couldn't allocate IO space %x len %d.\n",
io_addr, io_len);
return -1;
}
}
/* found a controller */ /* found a controller */
ha = kzalloc(sizeof (ips_ha_t), GFP_KERNEL); ha = kzalloc(sizeof (ips_ha_t), GFP_KERNEL);
if (ha == NULL) { if (ha == NULL) {
...@@ -7071,7 +7062,6 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr) ...@@ -7071,7 +7062,6 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
return -1; return -1;
} }
ips_sh[index] = NULL; ips_sh[index] = NULL;
ips_ha[index] = ha; ips_ha[index] = ha;
ha->active = 1; ha->active = 1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册