diff options
Diffstat (limited to 'drivers/message/i2o')
| -rw-r--r-- | drivers/message/i2o/core.h | 2 | ||||
| -rw-r--r-- | drivers/message/i2o/device.c | 32 | ||||
| -rw-r--r-- | drivers/message/i2o/driver.c | 18 | ||||
| -rw-r--r-- | drivers/message/i2o/i2o_config.c | 4 | ||||
| -rw-r--r-- | drivers/message/i2o/iop.c | 85 | 
5 files changed, 77 insertions, 64 deletions
diff --git a/drivers/message/i2o/core.h b/drivers/message/i2o/core.h index cbe384fb848..91614f11f89 100644 --- a/drivers/message/i2o/core.h +++ b/drivers/message/i2o/core.h @@ -33,7 +33,7 @@ extern int __init i2o_pci_init(void);  extern void __exit i2o_pci_exit(void);  /* device */ -extern struct device_attribute i2o_device_attrs[]; +extern const struct attribute_group *i2o_device_groups[];  extern void i2o_device_remove(struct i2o_device *);  extern int i2o_device_parse_lct(struct i2o_controller *); diff --git a/drivers/message/i2o/device.c b/drivers/message/i2o/device.c index 4547db99f7d..98348f420b5 100644 --- a/drivers/message/i2o/device.c +++ b/drivers/message/i2o/device.c @@ -138,45 +138,55 @@ static void i2o_device_release(struct device *dev)  }  /** - *	i2o_device_show_class_id - Displays class id of I2O device + *	class_id_show - Displays class id of I2O device   *	@dev: device of which the class id should be displayed   *	@attr: pointer to device attribute   *	@buf: buffer into which the class id should be printed   *   *	Returns the number of bytes which are printed into the buffer.   */ -static ssize_t i2o_device_show_class_id(struct device *dev, -					struct device_attribute *attr, -					char *buf) +static ssize_t class_id_show(struct device *dev, struct device_attribute *attr, +			     char *buf)  {  	struct i2o_device *i2o_dev = to_i2o_device(dev);  	sprintf(buf, "0x%03x\n", i2o_dev->lct_data.class_id);  	return strlen(buf) + 1;  } +static DEVICE_ATTR_RO(class_id);  /** - *	i2o_device_show_tid - Displays TID of I2O device + *	tid_show - Displays TID of I2O device   *	@dev: device of which the TID should be displayed   *	@attr: pointer to device attribute   *	@buf: buffer into which the TID should be printed   *   *	Returns the number of bytes which are printed into the buffer.   */ -static ssize_t i2o_device_show_tid(struct device *dev, -				   struct device_attribute *attr, char *buf) +static ssize_t tid_show(struct device *dev, struct device_attribute *attr, +			char *buf)  {  	struct i2o_device *i2o_dev = to_i2o_device(dev);  	sprintf(buf, "0x%03x\n", i2o_dev->lct_data.tid);  	return strlen(buf) + 1;  } +static DEVICE_ATTR_RO(tid);  /* I2O device attributes */ -struct device_attribute i2o_device_attrs[] = { -	__ATTR(class_id, S_IRUGO, i2o_device_show_class_id, NULL), -	__ATTR(tid, S_IRUGO, i2o_device_show_tid, NULL), -	__ATTR_NULL +static struct attribute *i2o_device_attrs[] = { +	&dev_attr_class_id.attr, +	&dev_attr_tid.attr, +	NULL, +}; + +static const struct attribute_group i2o_device_group = { +	.attrs = i2o_device_attrs, +}; + +const struct attribute_group *i2o_device_groups[] = { +	&i2o_device_group, +	NULL,  };  /** diff --git a/drivers/message/i2o/driver.c b/drivers/message/i2o/driver.c index 813eaa33fa1..1b18a0d1d05 100644 --- a/drivers/message/i2o/driver.c +++ b/drivers/message/i2o/driver.c @@ -62,7 +62,7 @@ static int i2o_bus_match(struct device *dev, struct device_driver *drv)  struct bus_type i2o_bus_type = {  	.name = "i2o",  	.match = i2o_bus_match, -	.dev_attrs = i2o_device_attrs +	.dev_groups = i2o_device_groups,  };  /** @@ -105,7 +105,8 @@ int i2o_driver_register(struct i2o_driver *drv)  			osm_err("too many drivers registered, increase "  				"max_drivers\n");  			spin_unlock_irqrestore(&i2o_drivers_lock, flags); -			return -EFAULT; +			rc = -EFAULT; +			goto out;  		}  	drv->context = i; @@ -124,11 +125,14 @@ int i2o_driver_register(struct i2o_driver *drv)  	}  	rc = driver_register(&drv->driver); -	if (rc) { -		if (drv->event) { -			destroy_workqueue(drv->event_queue); -			drv->event_queue = NULL; -		} +	if (rc) +		goto out; + +	return 0; +out: +	if (drv->event_queue) { +		destroy_workqueue(drv->event_queue); +		drv->event_queue = NULL;  	}  	return rc; diff --git a/drivers/message/i2o/i2o_config.c b/drivers/message/i2o/i2o_config.c index a60c188c2bd..04bd3b6de40 100644 --- a/drivers/message/i2o/i2o_config.c +++ b/drivers/message/i2o/i2o_config.c @@ -754,19 +754,19 @@ static long i2o_cfg_compat_ioctl(struct file *file, unsigned cmd,  				 unsigned long arg)  {  	int ret; -	mutex_lock(&i2o_cfg_mutex);  	switch (cmd) {  	case I2OGETIOPS:  		ret = i2o_cfg_ioctl(file, cmd, arg);  		break;  	case I2OPASSTHRU32: +		mutex_lock(&i2o_cfg_mutex);  		ret = i2o_cfg_passthru32(file, cmd, arg); +		mutex_unlock(&i2o_cfg_mutex);  		break;  	default:  		ret = -ENOIOCTLCMD;  		break;  	} -	mutex_unlock(&i2o_cfg_mutex);  	return ret;  } diff --git a/drivers/message/i2o/iop.c b/drivers/message/i2o/iop.c index a8c08f332da..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 = 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 << 20,	/* Unspecified, so use 1Mb and play safe */ -					      NULL, NULL) >= 0) { -			c->io_alloc = 1; -			sb->current_io_size = resource_size(res); -			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)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))  | 
