i2o: Refactor i2o_iop_systab_set() PCI space allocation
authorBjorn Helgaas <bhelgaas@google.com>
Wed, 26 Feb 2014 18:25:57 +0000 (11:25 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 26 Feb 2014 18:56:09 +0000 (11:56 -0700)
Refactor the PCI space allocation in i2o_iop_systab_set().  This might
improve readability slightly, but mainly it is to make the next patch
simpler.

No functional change.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/message/i2o/iop.c

index 68aef58bf89cf0124cf561847a2ff7357cffacf3..bd971b1b88e3be293398d4166486463859a30692 100644 (file)
@@ -652,6 +652,48 @@ static int i2o_iop_activate(struct i2o_controller *c)
        return i2o_hrt_get(c);
 };
 
+static void i2o_res_alloc(struct i2o_controller *c, unsigned long flags)
+{
+       i2o_status_block *sb = c->status_block.virt;
+       struct resource *root, *res = &c->mem_resource;
+       resource_size_t size, min, max, align;
+       int err;
+
+       res->name = c->pdev->bus->name;
+       res->flags = flags;
+       res->start = 0;
+       res->end = 0;
+       osm_info("%s: requires private memory resources.\n", c->name);
+       root = pci_find_parent_resource(c->pdev, res);
+       if (root == NULL) {
+               osm_warn("%s: Can't find parent resource!\n", c->name);
+               return;
+       }
+
+       if (flags & IORESOURCE_MEM) {
+               size = min = max = sb->desired_mem_size;
+               align = 1 << 20;        /* unspecified, use 1Mb and play safe */
+       } else {
+               size = min = max = sb->desired_io_size;
+               align = 1 << 12;        /* unspecified, use 4Kb and play safe */
+       }
+
+       err = allocate_resource(root, res, size, min, max, align, NULL, NULL);
+       if (err < 0)
+               return;
+
+       if (flags & IORESOURCE_MEM) {
+               c->mem_alloc = 1;
+               sb->current_mem_size = resource_size(res);
+               sb->current_mem_base = res->start;
+       } else if (flags & IORESOURCE_IO) {
+               c->io_alloc = 1;
+               sb->current_io_size = resource_size(res);
+               sb->current_io_base = res->start;
+       }
+       osm_info("%s: allocated PCI space %pR\n", c->name, res);
+}
+
 /**
  *     i2o_iop_systab_set - Set the I2O System Table of the specified IOP
  *     @c: I2O controller to which the system table should be send
@@ -665,52 +707,13 @@ static int i2o_iop_systab_set(struct i2o_controller *c)
        struct i2o_message *msg;
        i2o_status_block *sb = c->status_block.virt;
        struct device *dev = &c->pdev->dev;
-       struct resource *root;
        int rc;
 
-       if (sb->current_mem_size < sb->desired_mem_size) {
-               struct resource *res = &c->mem_resource;
-               res->name = c->pdev->bus->name;
-               res->flags = IORESOURCE_MEM;
-               res->start = 0;
-               res->end = 0;
-               osm_info("%s: requires private memory resources.\n", c->name);
-               root = pci_find_parent_resource(c->pdev, res);
-               if (root == NULL)
-                       osm_warn("%s: Can't find parent resource!\n", c->name);
-               if (root && allocate_resource(root, res, sb->desired_mem_size, sb->desired_mem_size, sb->desired_mem_size, 1 << 20,     /* Unspecified, so use 1Mb and play safe */
-                                             NULL, NULL) >= 0) {
-                       c->mem_alloc = 1;
-                       sb->current_mem_size = resource_size(res);
-                       sb->current_mem_base = res->start;
-                       osm_info("%s: allocated %llu bytes of PCI memory at "
-                               "0x%016llX.\n", c->name,
-                               (unsigned long long)resource_size(res),
-                               (unsigned long long)res->start);
-               }
-       }
+       if (sb->current_mem_size < sb->desired_mem_size)
+               i2o_res_alloc(c, IORESOURCE_MEM);
 
-       if (sb->current_io_size < sb->desired_io_size) {
-               struct resource *res = &c->io_resource;
-               res->name = c->pdev->bus->name;
-               res->flags = IORESOURCE_IO;
-               res->start = 0;
-               res->end = 0;
-               osm_info("%s: requires private memory resources.\n", c->name);
-               root = pci_find_parent_resource(c->pdev, res);
-               if (root == NULL)
-                       osm_warn("%s: Can't find parent resource!\n", c->name);
-               if (root && allocate_resource(root, res, sb->desired_io_size, sb->desired_io_size, sb->desired_io_size, 1 << 12,        /* Unspecified, so use 4Kb and play safe */
-                                             NULL, NULL) >= 0) {
-                       c->io_alloc = 1;
-                       sb->current_io_size = resource_size(res);
-                       sb->current_io_base = res->start;
-                       osm_info("%s: allocated %llu bytes of PCI I/O at "
-                               "0x%016llX.\n", c->name,
-                               (unsigned long long)resource_size(res),
-                               (unsigned long long)res->start);
-               }
-       }
+       if (sb->current_io_size < sb->desired_io_size)
+               i2o_res_alloc(c, IORESOURCE_IO);
 
        msg = i2o_msg_get_wait(c, I2O_TIMEOUT_MESSAGE_GET);
        if (IS_ERR(msg))
This page took 0.028112 seconds and 5 git commands to generate.