[SCSI] hpsa: factor out cmd pool allocation functions
authorStephen M. Cameron <scameron@beardog.cce.hp.com>
Tue, 3 May 2011 19:59:20 +0000 (14:59 -0500)
committerJames Bottomley <jbottomley@parallels.com>
Tue, 17 May 2011 07:05:03 +0000 (11:05 +0400)
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>
drivers/scsi/hpsa.c

index 2aeb210..7336f3c 100644 (file)
@@ -3847,6 +3847,40 @@ static __devinit int hpsa_init_reset_devices(struct pci_dev *pdev)
        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,
                                    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",
               h->devname, pdev->device,
               h->intr[h->intr_mode], dac ? "" : " not");
-
-       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;
+       if (hpsa_allocate_cmd_pool(h))
                goto clean4;
-       }
        if (hpsa_allocate_sg_chain_blocks(h))
                goto clean4;
        init_waitqueue_head(&h->scan_wait_queue);
        h->scan_finished = 1; /* no scan currently in progress */
 
        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);
 
        /* Turn the interrupts on so we can service requests */
@@ -3957,16 +3972,7 @@ static int __devinit hpsa_init_one(struct pci_dev *pdev,
 
 clean4:
        hpsa_free_sg_chain_blocks(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);
+       hpsa_free_cmd_pool(h);
        free_irq(h->intr[h->intr_mode], h);
 clean2:
 clean1: