diff options
Diffstat (limited to 'drivers/message/i2o/iop.c')
| -rw-r--r-- | drivers/message/i2o/iop.c | 85 | 
1 files changed, 42 insertions, 43 deletions
diff --git a/drivers/message/i2o/iop.c b/drivers/message/i2o/iop.c index 090d2a3a654..92752fb5b2d 100644 --- a/drivers/message/i2o/iop.c +++ b/drivers/message/i2o/iop.c @@ -652,6 +652,44 @@ 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 *res = &c->mem_resource; +	resource_size_t size, 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); + +	if (flags & IORESOURCE_MEM) { +		size = sb->desired_mem_size; +		align = 1 << 20;	/* unspecified, use 1Mb and play safe */ +	} else { +		size = sb->desired_io_size; +		align = 1 << 12;	/* unspecified, use 4Kb and play safe */ +	} + +	err = pci_bus_alloc_resource(c->pdev->bus, res, size, align, 0, 0, +				     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 +703,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 = 1 + res->end - res->start; -			sb->current_mem_base = res->start; -			osm_info("%s: allocated %llu bytes of PCI memory at " -				"0x%016llX.\n", c->name, -				(unsigned long long)(1 + res->end - res->start), -				(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 << 20,	/* Unspecified, so use 1Mb and play safe */ -					      NULL, NULL) >= 0) { -			c->io_alloc = 1; -			sb->current_io_size = 1 + res->end - res->start; -			sb->current_mem_base = res->start; -			osm_info("%s: allocated %llu bytes of PCI I/O at " -				"0x%016llX.\n", c->name, -				(unsigned long long)(1 + res->end - res->start), -				(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))  | 
