[SCSI] hpsa: factor out cmd pool allocation functions
Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com> Signed-off-by: James Bottomley <jbottomley@parallels.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
516fda49e8
commit
2e9d1b3626
|
@ -3847,6 +3847,40 @@ static __devinit int hpsa_init_reset_devices(struct pci_dev *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __devinit int hpsa_allocate_cmd_pool(struct ctlr_info *h)
|
||||||
|
{
|
||||||
|
h->cmd_pool_bits = kzalloc(
|
||||||
|
DIV_ROUND_UP(h->nr_cmds, BITS_PER_LONG) *
|
||||||
|
sizeof(unsigned long), GFP_KERNEL);
|
||||||
|
h->cmd_pool = pci_alloc_consistent(h->pdev,
|
||||||
|
h->nr_cmds * sizeof(*h->cmd_pool),
|
||||||
|
&(h->cmd_pool_dhandle));
|
||||||
|
h->errinfo_pool = pci_alloc_consistent(h->pdev,
|
||||||
|
h->nr_cmds * sizeof(*h->errinfo_pool),
|
||||||
|
&(h->errinfo_pool_dhandle));
|
||||||
|
if ((h->cmd_pool_bits == NULL)
|
||||||
|
|| (h->cmd_pool == NULL)
|
||||||
|
|| (h->errinfo_pool == NULL)) {
|
||||||
|
dev_err(&h->pdev->dev, "out of memory in %s", __func__);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hpsa_free_cmd_pool(struct ctlr_info *h)
|
||||||
|
{
|
||||||
|
kfree(h->cmd_pool_bits);
|
||||||
|
if (h->cmd_pool)
|
||||||
|
pci_free_consistent(h->pdev,
|
||||||
|
h->nr_cmds * sizeof(struct CommandList),
|
||||||
|
h->cmd_pool, h->cmd_pool_dhandle);
|
||||||
|
if (h->errinfo_pool)
|
||||||
|
pci_free_consistent(h->pdev,
|
||||||
|
h->nr_cmds * sizeof(struct ErrorInfo),
|
||||||
|
h->errinfo_pool,
|
||||||
|
h->errinfo_pool_dhandle);
|
||||||
|
}
|
||||||
|
|
||||||
static int __devinit hpsa_init_one(struct pci_dev *pdev,
|
static int __devinit hpsa_init_one(struct pci_dev *pdev,
|
||||||
const struct pci_device_id *ent)
|
const struct pci_device_id *ent)
|
||||||
{
|
{
|
||||||
|
@ -3917,33 +3951,14 @@ static int __devinit hpsa_init_one(struct pci_dev *pdev,
|
||||||
dev_info(&pdev->dev, "%s: <0x%x> at IRQ %d%s using DAC\n",
|
dev_info(&pdev->dev, "%s: <0x%x> at IRQ %d%s using DAC\n",
|
||||||
h->devname, pdev->device,
|
h->devname, pdev->device,
|
||||||
h->intr[h->intr_mode], dac ? "" : " not");
|
h->intr[h->intr_mode], dac ? "" : " not");
|
||||||
|
if (hpsa_allocate_cmd_pool(h))
|
||||||
h->cmd_pool_bits =
|
|
||||||
kmalloc(((h->nr_cmds + BITS_PER_LONG -
|
|
||||||
1) / BITS_PER_LONG) * sizeof(unsigned long), GFP_KERNEL);
|
|
||||||
h->cmd_pool = pci_alloc_consistent(h->pdev,
|
|
||||||
h->nr_cmds * sizeof(*h->cmd_pool),
|
|
||||||
&(h->cmd_pool_dhandle));
|
|
||||||
h->errinfo_pool = pci_alloc_consistent(h->pdev,
|
|
||||||
h->nr_cmds * sizeof(*h->errinfo_pool),
|
|
||||||
&(h->errinfo_pool_dhandle));
|
|
||||||
if ((h->cmd_pool_bits == NULL)
|
|
||||||
|| (h->cmd_pool == NULL)
|
|
||||||
|| (h->errinfo_pool == NULL)) {
|
|
||||||
dev_err(&pdev->dev, "out of memory");
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto clean4;
|
goto clean4;
|
||||||
}
|
|
||||||
if (hpsa_allocate_sg_chain_blocks(h))
|
if (hpsa_allocate_sg_chain_blocks(h))
|
||||||
goto clean4;
|
goto clean4;
|
||||||
init_waitqueue_head(&h->scan_wait_queue);
|
init_waitqueue_head(&h->scan_wait_queue);
|
||||||
h->scan_finished = 1; /* no scan currently in progress */
|
h->scan_finished = 1; /* no scan currently in progress */
|
||||||
|
|
||||||
pci_set_drvdata(pdev, h);
|
pci_set_drvdata(pdev, h);
|
||||||
memset(h->cmd_pool_bits, 0,
|
|
||||||
((h->nr_cmds + BITS_PER_LONG -
|
|
||||||
1) / BITS_PER_LONG) * sizeof(unsigned long));
|
|
||||||
|
|
||||||
hpsa_scsi_setup(h);
|
hpsa_scsi_setup(h);
|
||||||
|
|
||||||
/* Turn the interrupts on so we can service requests */
|
/* Turn the interrupts on so we can service requests */
|
||||||
|
@ -3957,16 +3972,7 @@ static int __devinit hpsa_init_one(struct pci_dev *pdev,
|
||||||
|
|
||||||
clean4:
|
clean4:
|
||||||
hpsa_free_sg_chain_blocks(h);
|
hpsa_free_sg_chain_blocks(h);
|
||||||
kfree(h->cmd_pool_bits);
|
hpsa_free_cmd_pool(h);
|
||||||
if (h->cmd_pool)
|
|
||||||
pci_free_consistent(h->pdev,
|
|
||||||
h->nr_cmds * sizeof(struct CommandList),
|
|
||||||
h->cmd_pool, h->cmd_pool_dhandle);
|
|
||||||
if (h->errinfo_pool)
|
|
||||||
pci_free_consistent(h->pdev,
|
|
||||||
h->nr_cmds * sizeof(struct ErrorInfo),
|
|
||||||
h->errinfo_pool,
|
|
||||||
h->errinfo_pool_dhandle);
|
|
||||||
free_irq(h->intr[h->intr_mode], h);
|
free_irq(h->intr[h->intr_mode], h);
|
||||||
clean2:
|
clean2:
|
||||||
clean1:
|
clean1:
|
||||||
|
|
Loading…
Reference in New Issue