diff options
Diffstat (limited to 'drivers/message/i2o')
| -rw-r--r-- | drivers/message/i2o/README | 2 | ||||
| -rw-r--r-- | drivers/message/i2o/README.ioctl | 14 | ||||
| -rw-r--r-- | drivers/message/i2o/core.h | 2 | ||||
| -rw-r--r-- | drivers/message/i2o/device.c | 40 | ||||
| -rw-r--r-- | drivers/message/i2o/driver.c | 21 | ||||
| -rw-r--r-- | drivers/message/i2o/i2o_block.c | 32 | ||||
| -rw-r--r-- | drivers/message/i2o/i2o_block.h | 2 | ||||
| -rw-r--r-- | drivers/message/i2o/i2o_config.c | 24 | ||||
| -rw-r--r-- | drivers/message/i2o/i2o_proc.c | 149 | ||||
| -rw-r--r-- | drivers/message/i2o/i2o_scsi.c | 15 | ||||
| -rw-r--r-- | drivers/message/i2o/iop.c | 85 | ||||
| -rw-r--r-- | drivers/message/i2o/pci.c | 12 | 
12 files changed, 182 insertions, 216 deletions
diff --git a/drivers/message/i2o/README b/drivers/message/i2o/README index 911fc3021e3..f072a8eb304 100644 --- a/drivers/message/i2o/README +++ b/drivers/message/i2o/README @@ -53,7 +53,7 @@ Symbios Logic (Now LSI)  BoxHill Corporation  	Loan of initial FibreChannel disk array used for development work. -European Comission +European Commission  	Funding the work done by the University of Helsinki  SysKonnect diff --git a/drivers/message/i2o/README.ioctl b/drivers/message/i2o/README.ioctl index 65c0c47aeb7..4a7d2ebdfc9 100644 --- a/drivers/message/i2o/README.ioctl +++ b/drivers/message/i2o/README.ioctl @@ -110,7 +110,7 @@ V. Getting Logical Configuration Table        ENOBUFS     Buffer not large enough.  If this occurs, the required                    buffer length is written into *(lct->reslen) -VI. Settting Parameters +VI. Setting Parameters     SYNOPSIS  @@ -138,7 +138,7 @@ VI. Settting Parameters     The return value is the size in bytes of the data written into     ops->resbuf if no errors occur.  If an error occurs, -1 is returned  -   and errno is set appropriatly: +   and errno is set appropriately:        EFAULT      Invalid user space pointer was passed        ENXIO       Invalid IOP number @@ -222,7 +222,7 @@ VIII. Downloading Software     RETURNS     This function returns 0 no errors occur. If an error occurs, -1  -   is returned and errno is set appropriatly: +   is returned and errno is set appropriately:        EFAULT      Invalid user space pointer was passed        ENXIO       Invalid IOP number @@ -264,7 +264,7 @@ IX. Uploading Software     RETURNS     This function returns 0 if no errors occur.  If an error occurs, -1 -   is returned and errno is set appropriatly: +   is returned and errno is set appropriately:        EFAULT      Invalid user space pointer was passed        ENXIO       Invalid IOP number @@ -301,7 +301,7 @@ X. Removing Software     RETURNS     This function returns 0 if no errors occur.  If an error occurs, -1 -   is returned and errno is set appropriatly: +   is returned and errno is set appropriately:        EFAULT      Invalid user space pointer was passed        ENXIO       Invalid IOP number @@ -325,7 +325,7 @@ X. Validating Configuration     RETURNS     This function returns 0 if no erro occur.  If an error occurs, -1 is -   returned and errno is set appropriatly: +   returned and errno is set appropriately:        ETIMEDOUT   Timeout waiting for reply message        ENXIO       Invalid IOP number @@ -360,7 +360,7 @@ XI. Configuration Dialog     RETURNS     This function returns 0 if no error occur. If an error occurs, -1 -   is returned and errno is set appropriatly: +   is returned and errno is set appropriately:        EFAULT      Invalid user space pointer was passed        ENXIO       Invalid IOP number 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 0ee4264f5db..98348f420b5 100644 --- a/drivers/message/i2o/device.c +++ b/drivers/message/i2o/device.c @@ -65,7 +65,7 @@ int i2o_device_claim(struct i2o_device *dev)  	rc = i2o_device_issue_claim(dev, I2O_CMD_UTIL_CLAIM, I2O_CLAIM_PRIMARY);  	if (!rc) -		pr_debug("i2o: claim of device %d succeded\n", +		pr_debug("i2o: claim of device %d succeeded\n",  			 dev->lct_data.tid);  	else  		pr_debug("i2o: claim of device %d failed %d\n", @@ -110,7 +110,7 @@ int i2o_device_claim_release(struct i2o_device *dev)  	}  	if (!rc) -		pr_debug("i2o: claim release of device %d succeded\n", +		pr_debug("i2o: claim release of device %d succeeded\n",  			 dev->lct_data.tid);  	else  		pr_debug("i2o: claim release of device %d failed %d\n", @@ -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,  };  /** @@ -248,7 +258,7 @@ static int i2o_device_add(struct i2o_controller *c, i2o_lct_entry *entry)  			goto unreg_dev;  	} -	/* create user entries refering to this device */ +	/* create user entries referring to this device */  	list_for_each_entry(tmp, &c->devices, list)  	    if ((tmp->lct_data.user_tid == i2o_dev->lct_data.tid)  		&& (tmp != i2o_dev)) { @@ -267,7 +277,7 @@ static int i2o_device_add(struct i2o_controller *c, i2o_lct_entry *entry)  			goto rmlink1;  	} -	/* create parent entries refering to this device */ +	/* create parent entries referring to this device */  	list_for_each_entry(tmp, &c->devices, list)  	    if ((tmp->lct_data.parent_tid == i2o_dev->lct_data.tid)  		&& (tmp != i2o_dev)) { diff --git a/drivers/message/i2o/driver.c b/drivers/message/i2o/driver.c index a0421efe04c..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,  };  /** @@ -84,7 +84,8 @@ int i2o_driver_register(struct i2o_driver *drv)  	osm_debug("Register driver %s\n", drv->name);  	if (drv->event) { -		drv->event_queue = create_workqueue(drv->name); +		drv->event_queue = alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, +						   drv->name);  		if (!drv->event_queue) {  			osm_err("Could not initialize event queue for driver "  				"%s\n", drv->name); @@ -104,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; @@ -123,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_block.c b/drivers/message/i2o/i2o_block.c index f87a9d405a5..6fc3866965d 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c @@ -309,7 +309,7 @@ static inline void i2o_block_request_free(struct i2o_block_request *ireq)   *	@ireq: I2O block request   *	@mptr: message body pointer   * - *	Builds the SG list and map it to be accessable by the controller. + *	Builds the SG list and map it to be accessible by the controller.   *   *	Returns 0 on failure or 1 on success.   */ @@ -600,24 +600,22 @@ static int i2o_block_open(struct block_device *bdev, fmode_t mode)   *   *	Unlock and unmount the media, and power down the device. Gets called if   *	the block device is closed. - * - *	Returns 0 on success or negative error code on failure.   */ -static int i2o_block_release(struct gendisk *disk, fmode_t mode) +static void i2o_block_release(struct gendisk *disk, fmode_t mode)  {  	struct i2o_block_device *dev = disk->private_data;  	u8 operation;  	/* -	 * This is to deail with the case of an application -	 * opening a device and then the device dissapears while +	 * This is to deal with the case of an application +	 * opening a device and then the device disappears while  	 * it's in use, and then the application tries to release  	 * it.  ex: Unmounting a deleted RAID volume at reboot.  	 * If we send messages, it will just cause FAILs since  	 * the TID no longer exists.  	 */  	if (!dev->i2o_dev) -		return 0; +		return;  	mutex_lock(&i2o_block_mutex);  	i2o_block_device_flush(dev->i2o_dev); @@ -631,8 +629,6 @@ static int i2o_block_release(struct gendisk *disk, fmode_t mode)  	i2o_block_device_power(dev, operation);  	mutex_unlock(&i2o_block_mutex); - -	return 0;  }  static int i2o_block_getgeo(struct block_device *bdev, struct hd_geometry *geo) @@ -695,27 +691,29 @@ static int i2o_block_ioctl(struct block_device *bdev, fmode_t mode,  };  /** - *	i2o_block_media_changed - Have we seen a media change? + *	i2o_block_check_events - Have we seen a media change?   *	@disk: gendisk which should be verified + *	@clearing: events being cleared   *   *	Verifies if the media has changed.   *   *	Returns 1 if the media was changed or 0 otherwise.   */ -static int i2o_block_media_changed(struct gendisk *disk) +static unsigned int i2o_block_check_events(struct gendisk *disk, +					   unsigned int clearing)  {  	struct i2o_block_device *p = disk->private_data;  	if (p->media_change_flag) {  		p->media_change_flag = 0; -		return 1; +		return DISK_EVENT_MEDIA_CHANGE;  	}  	return 0;  }  /**   *	i2o_block_transfer - Transfer a request to/from the I2O controller - *	@req: the request which should be transfered + *	@req: the request which should be transferred   *   *	This function converts the request into a I2O message. The necessary   *	DMA buffers are allocated and after everything is setup post the message @@ -895,11 +893,7 @@ static void i2o_block_request_fn(struct request_queue *q)  {  	struct request *req; -	while (!blk_queue_plugged(q)) { -		req = blk_peek_request(q); -		if (!req) -			break; - +	while ((req = blk_peek_request(q)) != NULL) {  		if (req->cmd_type == REQ_TYPE_FS) {  			struct i2o_block_delayed_request *dreq;  			struct i2o_block_request *ireq = req->special; @@ -950,7 +944,7 @@ static const struct block_device_operations i2o_block_fops = {  	.ioctl = i2o_block_ioctl,  	.compat_ioctl = i2o_block_ioctl,  	.getgeo = i2o_block_getgeo, -	.media_changed = i2o_block_media_changed +	.check_events = i2o_block_check_events,  };  /** diff --git a/drivers/message/i2o/i2o_block.h b/drivers/message/i2o/i2o_block.h index 67f921b4419..cf8873cbca3 100644 --- a/drivers/message/i2o/i2o_block.h +++ b/drivers/message/i2o/i2o_block.h @@ -73,7 +73,7 @@ struct i2o_block_device {  	struct i2o_device *i2o_dev;	/* pointer to I2O device */  	struct gendisk *gd;  	spinlock_t lock;	/* queue lock */ -	struct list_head open_queue;	/* list of transfered, but unfinished +	struct list_head open_queue;	/* list of transferred, but unfinished  					   requests */  	unsigned int open_queue_depth;	/* number of requests in the queue */ diff --git a/drivers/message/i2o/i2o_config.c b/drivers/message/i2o/i2o_config.c index 7d3cc575c36..04bd3b6de40 100644 --- a/drivers/message/i2o/i2o_config.c +++ b/drivers/message/i2o/i2o_config.c @@ -188,6 +188,13 @@ static int i2o_cfg_parms(unsigned long arg, unsigned int type)  	if (!dev)  		return -ENXIO; +	/* +	 * Stop users being able to try and allocate arbitrary amounts +	 * of DMA space. 64K is way more than sufficient for this. +	 */ +	if (kcmd.oplen > 65536) +		return -EMSGSIZE; +  	ops = memdup_user(kcmd.opbuf, kcmd.oplen);  	if (IS_ERR(ops))  		return PTR_ERR(ops); @@ -680,6 +687,11 @@ static int i2o_cfg_passthru32(struct file *file, unsigned cmnd,  		}  		size = size >> 16;  		size *= 4; +		if (size > sizeof(rmsg)) { +			rcode = -EINVAL; +			goto sg_list_cleanup; +		} +  		/* Copy in the user's I2O command */  		if (copy_from_user(rmsg, user_msg, size)) {  			rcode = -EFAULT; @@ -742,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;  } @@ -915,6 +927,11 @@ static int i2o_cfg_passthru(unsigned long arg)  		}  		size = size >> 16;  		size *= 4; +		if (size > sizeof(rmsg)) { +			rcode = -EFAULT; +			goto sg_list_cleanup; +		} +  		/* Copy in the user's I2O command */  		if (copy_from_user(rmsg, user_msg, size)) {  			rcode = -EFAULT; @@ -1044,8 +1061,7 @@ static long i2o_cfg_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)  static int cfg_open(struct inode *inode, struct file *file)  { -	struct i2o_cfg_info *tmp = -	    (struct i2o_cfg_info *)kmalloc(sizeof(struct i2o_cfg_info), +	struct i2o_cfg_info *tmp = kmalloc(sizeof(struct i2o_cfg_info),  					   GFP_KERNEL);  	unsigned long flags; diff --git a/drivers/message/i2o/i2o_proc.c b/drivers/message/i2o/i2o_proc.c index 07dbeaf9df9..b7d87cd227a 100644 --- a/drivers/message/i2o/i2o_proc.c +++ b/drivers/message/i2o/i2o_proc.c @@ -56,7 +56,7 @@  /* Structure used to define /proc entries */  typedef struct _i2o_proc_entry_t {  	char *name;		/* entry name */ -	mode_t mode;		/* mode */ +	umode_t mode;		/* mode */  	const struct file_operations *fops;	/* open function */  } i2o_proc_entry; @@ -255,9 +255,8 @@ static char *scsi_devices[] = {  	"Array Controller Device"  }; -static char *chtostr(u8 * chars, int n) +static char *chtostr(char *tmp, u8 *chars, int n)  { -	char tmp[256];  	tmp[0] = 0;  	return strncat(tmp, (char *)chars, n);  } @@ -283,7 +282,6 @@ static char *bus_strings[] = {  	"Local Bus",  	"ISA",  	"EISA", -	"MCA",  	"PCI",  	"PCMCIA",  	"NUBUS", @@ -351,18 +349,6 @@ static int i2o_seq_show_hrt(struct seq_file *seq, void *v)  					   EisaSlotNumber);  				break; -			case I2O_BUS_MCA: -				seq_printf(seq, "     IOBase: %0#6x,", -					   hrt->hrt_entry[i].bus.mca_bus. -					   McaBaseIOPort); -				seq_printf(seq, " MemoryBase: %0#10x,", -					   hrt->hrt_entry[i].bus.mca_bus. -					   McaBaseMemoryAddress); -				seq_printf(seq, " Slot: %0#4x,", -					   hrt->hrt_entry[i].bus.mca_bus. -					   McaSlotNumber); -				break; -  			case I2O_BUS_PCI:  				seq_printf(seq, "     Bus: %0#4x",  					   hrt->hrt_entry[i].bus.pci_bus. @@ -804,6 +790,7 @@ static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v)  	} *result;  	i2o_exec_execute_ddm_table ddm_table; +	char tmp[28 + 1];  	result = kmalloc(sizeof(*result), GFP_KERNEL);  	if (!result) @@ -839,7 +826,7 @@ static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v)  		seq_printf(seq, "%-#7x", ddm_table.i2o_vendor_id);  		seq_printf(seq, "%-#8x", ddm_table.module_id);  		seq_printf(seq, "%-29s", -			   chtostr(ddm_table.module_name_version, 28)); +			   chtostr(tmp, ddm_table.module_name_version, 28));  		seq_printf(seq, "%9d  ", ddm_table.data_size);  		seq_printf(seq, "%8d", ddm_table.code_size); @@ -906,6 +893,7 @@ static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v)  	i2o_driver_result_table *result;  	i2o_driver_store_table *dst; +	char tmp[28 + 1];  	result = kmalloc(sizeof(i2o_driver_result_table), GFP_KERNEL);  	if (result == NULL) @@ -940,8 +928,9 @@ static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v)  		seq_printf(seq, "%-#7x", dst->i2o_vendor_id);  		seq_printf(seq, "%-#8x", dst->module_id); -		seq_printf(seq, "%-29s", chtostr(dst->module_name_version, 28)); -		seq_printf(seq, "%-9s", chtostr(dst->date, 8)); +		seq_printf(seq, "%-29s", +			   chtostr(tmp, dst->module_name_version, 28)); +		seq_printf(seq, "%-9s", chtostr(tmp, dst->date, 8));  		seq_printf(seq, "%8d ", dst->module_size);  		seq_printf(seq, "%8d ", dst->mpb_size);  		seq_printf(seq, "0x%04x", dst->module_flags); @@ -1261,6 +1250,7 @@ static int i2o_seq_show_dev_identity(struct seq_file *seq, void *v)  	// == (allow) 512d bytes (max)  	static u16 *work16 = (u16 *) work32;  	int token; +	char tmp[16 + 1];  	token = i2o_parm_field_get(d, 0xF100, -1, &work32, sizeof(work32)); @@ -1273,13 +1263,13 @@ static int i2o_seq_show_dev_identity(struct seq_file *seq, void *v)  	seq_printf(seq, "Owner TID     : %0#5x\n", work16[2]);  	seq_printf(seq, "Parent TID    : %0#5x\n", work16[3]);  	seq_printf(seq, "Vendor info   : %s\n", -		   chtostr((u8 *) (work32 + 2), 16)); +		   chtostr(tmp, (u8 *) (work32 + 2), 16));  	seq_printf(seq, "Product info  : %s\n", -		   chtostr((u8 *) (work32 + 6), 16)); +		   chtostr(tmp, (u8 *) (work32 + 6), 16));  	seq_printf(seq, "Description   : %s\n", -		   chtostr((u8 *) (work32 + 10), 16)); +		   chtostr(tmp, (u8 *) (work32 + 10), 16));  	seq_printf(seq, "Product rev.  : %s\n", -		   chtostr((u8 *) (work32 + 14), 8)); +		   chtostr(tmp, (u8 *) (work32 + 14), 8));  	seq_printf(seq, "Serial number : ");  	print_serial_number(seq, (u8 *) (work32 + 16), @@ -1316,6 +1306,8 @@ static int i2o_seq_show_ddm_identity(struct seq_file *seq, void *v)  		u8 pad[256];	// allow up to 256 byte (max) serial number  	} result; +	char tmp[24 + 1]; +  	token = i2o_parm_field_get(d, 0xF101, -1, &result, sizeof(result));  	if (token < 0) { @@ -1325,9 +1317,9 @@ static int i2o_seq_show_ddm_identity(struct seq_file *seq, void *v)  	seq_printf(seq, "Registering DDM TID : 0x%03x\n", result.ddm_tid);  	seq_printf(seq, "Module name         : %s\n", -		   chtostr(result.module_name, 24)); +		   chtostr(tmp, result.module_name, 24));  	seq_printf(seq, "Module revision     : %s\n", -		   chtostr(result.module_rev, 8)); +		   chtostr(tmp, result.module_rev, 8));  	seq_printf(seq, "Serial number       : ");  	print_serial_number(seq, result.serial_number, sizeof(result) - 36); @@ -1351,6 +1343,8 @@ static int i2o_seq_show_uinfo(struct seq_file *seq, void *v)  		u8 instance_number[4];  	} result; +	char tmp[64 + 1]; +  	token = i2o_parm_field_get(d, 0xF102, -1, &result, sizeof(result));  	if (token < 0) { @@ -1359,13 +1353,13 @@ static int i2o_seq_show_uinfo(struct seq_file *seq, void *v)  	}  	seq_printf(seq, "Device name     : %s\n", -		   chtostr(result.device_name, 64)); +		   chtostr(tmp, result.device_name, 64));  	seq_printf(seq, "Service name    : %s\n", -		   chtostr(result.service_name, 64)); +		   chtostr(tmp, result.service_name, 64));  	seq_printf(seq, "Physical name   : %s\n", -		   chtostr(result.physical_location, 64)); +		   chtostr(tmp, result.physical_location, 64));  	seq_printf(seq, "Instance number : %s\n", -		   chtostr(result.instance_number, 4)); +		   chtostr(tmp, result.instance_number, 4));  	return 0;  } @@ -1605,98 +1599,98 @@ static int i2o_seq_show_sensors(struct seq_file *seq, void *v)  static int i2o_seq_open_hrt(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_hrt, PDE(inode)->data); +	return single_open(file, i2o_seq_show_hrt, PDE_DATA(inode));  };  static int i2o_seq_open_lct(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_lct, PDE(inode)->data); +	return single_open(file, i2o_seq_show_lct, PDE_DATA(inode));  };  static int i2o_seq_open_status(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_status, PDE(inode)->data); +	return single_open(file, i2o_seq_show_status, PDE_DATA(inode));  };  static int i2o_seq_open_hw(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_hw, PDE(inode)->data); +	return single_open(file, i2o_seq_show_hw, PDE_DATA(inode));  };  static int i2o_seq_open_ddm_table(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_ddm_table, PDE(inode)->data); +	return single_open(file, i2o_seq_show_ddm_table, PDE_DATA(inode));  };  static int i2o_seq_open_driver_store(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_driver_store, PDE(inode)->data); +	return single_open(file, i2o_seq_show_driver_store, PDE_DATA(inode));  };  static int i2o_seq_open_drivers_stored(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_drivers_stored, PDE(inode)->data); +	return single_open(file, i2o_seq_show_drivers_stored, PDE_DATA(inode));  };  static int i2o_seq_open_groups(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_groups, PDE(inode)->data); +	return single_open(file, i2o_seq_show_groups, PDE_DATA(inode));  };  static int i2o_seq_open_phys_device(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_phys_device, PDE(inode)->data); +	return single_open(file, i2o_seq_show_phys_device, PDE_DATA(inode));  };  static int i2o_seq_open_claimed(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_claimed, PDE(inode)->data); +	return single_open(file, i2o_seq_show_claimed, PDE_DATA(inode));  };  static int i2o_seq_open_users(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_users, PDE(inode)->data); +	return single_open(file, i2o_seq_show_users, PDE_DATA(inode));  };  static int i2o_seq_open_priv_msgs(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_priv_msgs, PDE(inode)->data); +	return single_open(file, i2o_seq_show_priv_msgs, PDE_DATA(inode));  };  static int i2o_seq_open_authorized_users(struct inode *inode, struct file *file)  {  	return single_open(file, i2o_seq_show_authorized_users, -			   PDE(inode)->data); +			   PDE_DATA(inode));  };  static int i2o_seq_open_dev_identity(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_dev_identity, PDE(inode)->data); +	return single_open(file, i2o_seq_show_dev_identity, PDE_DATA(inode));  };  static int i2o_seq_open_ddm_identity(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_ddm_identity, PDE(inode)->data); +	return single_open(file, i2o_seq_show_ddm_identity, PDE_DATA(inode));  };  static int i2o_seq_open_uinfo(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_uinfo, PDE(inode)->data); +	return single_open(file, i2o_seq_show_uinfo, PDE_DATA(inode));  };  static int i2o_seq_open_sgl_limits(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_sgl_limits, PDE(inode)->data); +	return single_open(file, i2o_seq_show_sgl_limits, PDE_DATA(inode));  };  static int i2o_seq_open_sensors(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_sensors, PDE(inode)->data); +	return single_open(file, i2o_seq_show_sensors, PDE_DATA(inode));  };  static int i2o_seq_open_dev_name(struct inode *inode, struct file *file)  { -	return single_open(file, i2o_seq_show_dev_name, PDE(inode)->data); +	return single_open(file, i2o_seq_show_dev_name, PDE_DATA(inode));  };  static const struct file_operations i2o_seq_fops_lct = { @@ -1901,25 +1895,6 @@ static int i2o_proc_create_entries(struct proc_dir_entry *dir,  }  /** - *	i2o_proc_subdir_remove - Remove child entries from a proc entry - *	@dir: proc dir entry from which the childs should be removed - * - *	Iterate over each i2o proc entry under dir and remove it. If the child - *	also has entries, remove them too. - */ -static void i2o_proc_subdir_remove(struct proc_dir_entry *dir) -{ -	struct proc_dir_entry *pe, *tmp; -	pe = dir->subdir; -	while (pe) { -		tmp = pe->next; -		i2o_proc_subdir_remove(pe); -		remove_proc_entry(pe->name, dir); -		pe = tmp; -	} -}; - -/**   *	i2o_proc_device_add - Add an I2O device to the proc dir   *	@dir: proc dir entry to which the device should be added   *	@dev: I2O device which should be added @@ -1938,14 +1913,12 @@ static void i2o_proc_device_add(struct proc_dir_entry *dir,  	osm_debug("adding device /proc/i2o/%s/%s\n", dev->iop->name, buff); -	devdir = proc_mkdir(buff, dir); +	devdir = proc_mkdir_data(buff, 0, dir, dev);  	if (!devdir) {  		osm_warn("Could not allocate procdir!\n");  		return;  	} -	devdir->data = dev; -  	i2o_proc_create_entries(devdir, generic_dev_entries, dev);  	/* Inform core that we want updates about this device's status */ @@ -1979,12 +1952,10 @@ static int i2o_proc_iop_add(struct proc_dir_entry *dir,  	osm_debug("adding IOP /proc/i2o/%s\n", c->name); -	iopdir = proc_mkdir(c->name, dir); +	iopdir = proc_mkdir_data(c->name, 0, dir, c);  	if (!iopdir)  		return -1; -	iopdir->data = c; -  	i2o_proc_create_entries(iopdir, i2o_proc_generic_iop_entries, c);  	list_for_each_entry(dev, &c->devices, list) @@ -1994,31 +1965,6 @@ static int i2o_proc_iop_add(struct proc_dir_entry *dir,  }  /** - *	i2o_proc_iop_remove - Removes an I2O controller from the i2o proc tree - *	@dir: parent proc dir entry - *	@c: I2O controller which should be removed - * - *	Iterate over each i2o proc entry and search controller c. If it is found - *	remove it from the tree. - */ -static void i2o_proc_iop_remove(struct proc_dir_entry *dir, -				struct i2o_controller *c) -{ -	struct proc_dir_entry *pe, *tmp; - -	pe = dir->subdir; -	while (pe) { -		tmp = pe->next; -		if (pe->data == c) { -			i2o_proc_subdir_remove(pe); -			remove_proc_entry(pe->name, dir); -		} -		osm_debug("removing IOP /proc/i2o/%s\n", c->name); -		pe = tmp; -	} -} - -/**   *	i2o_proc_fs_create - Create the i2o proc fs.   *   *	Iterate over each I2O controller and create the entries for it. @@ -2048,12 +1994,7 @@ static int __init i2o_proc_fs_create(void)   */  static int __exit i2o_proc_fs_destroy(void)  { -	struct i2o_controller *c; - -	list_for_each_entry(c, &i2o_controllers, list) -	    i2o_proc_iop_remove(i2o_proc_dir_root, c); - -	remove_proc_entry("i2o", NULL); +	remove_proc_subtree("i2o", NULL);  	return 0;  }; diff --git a/drivers/message/i2o/i2o_scsi.c b/drivers/message/i2o/i2o_scsi.c index ea6b2197da8..1d31d7284cb 100644 --- a/drivers/message/i2o/i2o_scsi.c +++ b/drivers/message/i2o/i2o_scsi.c @@ -57,9 +57,8 @@  #include <linux/scatterlist.h>  #include <asm/dma.h> -#include <asm/system.h>  #include <asm/io.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <scsi/scsi.h>  #include <scsi/scsi_host.h> @@ -204,7 +203,7 @@ static int i2o_scsi_remove(struct device *dev)   *	i2o_scsi_probe - verify if dev is a I2O SCSI device and install it   *	@dev: device to verify if it is a I2O SCSI device   * - *	Retrieve channel, id and lun for I2O device. If everthing goes well + *	Retrieve channel, id and lun for I2O device. If everything goes well   *	register the I2O device as SCSI device on the I2O SCSI controller.   *   *	Returns 0 on success or negative error code on failure. @@ -361,7 +360,7 @@ static int i2o_scsi_reply(struct i2o_controller *c, u32 m,  	 */  	error = le32_to_cpu(msg->body[0]); -	osm_debug("Completed %ld\n", cmd->serial_number); +	osm_debug("Completed %0x%p\n", cmd);  	cmd->result = error & 0xff;  	/* @@ -506,7 +505,7 @@ static struct i2o_driver i2o_scsi_driver = {   *	Locks: takes the controller lock on error path only   */ -static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt, +static int i2o_scsi_queuecommand_lck(struct scsi_cmnd *SCpnt,  				 void (*done) (struct scsi_cmnd *))  {  	struct i2o_controller *c; @@ -678,7 +677,7 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt,  	/* Queue the message */  	i2o_msg_post(c, msg); -	osm_debug("Issued %ld\n", SCpnt->serial_number); +	osm_debug("Issued %0x%p\n", SCpnt);  	return 0; @@ -688,7 +687,9 @@ static int i2o_scsi_queuecommand(struct scsi_cmnd *SCpnt,        exit:  	return rc; -}; +} + +static DEF_SCSI_QCMD(i2o_scsi_queuecommand)  /**   *	i2o_scsi_abort - abort a running command 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)) diff --git a/drivers/message/i2o/pci.c b/drivers/message/i2o/pci.c index 73e4658af53..0f9f3e1a2b6 100644 --- a/drivers/message/i2o/pci.c +++ b/drivers/message/i2o/pci.c @@ -31,12 +31,13 @@  #include <linux/interrupt.h>  #include <linux/slab.h>  #include <linux/i2o.h> +#include <linux/module.h>  #include "core.h"  #define OSM_DESCRIPTION	"I2O-subsystem"  /* PCI device id table for all I2O controllers */ -static struct pci_device_id __devinitdata i2o_pci_ids[] = { +static struct pci_device_id i2o_pci_ids[] = {  	{PCI_DEVICE_CLASS(PCI_CLASS_INTELLIGENT_I2O << 8, 0xffff00)},  	{PCI_DEVICE(PCI_VENDOR_ID_DPT, 0xa511)},  	{.vendor = PCI_VENDOR_ID_INTEL,.device = 0x1962, @@ -83,7 +84,7 @@ static void i2o_pci_free(struct i2o_controller *c)   *   *	Returns 0 on success or negative error code on failure.   */ -static int __devinit i2o_pci_alloc(struct i2o_controller *c) +static int i2o_pci_alloc(struct i2o_controller *c)  {  	struct pci_dev *pdev = c->pdev;  	struct device *dev = &pdev->dev; @@ -314,8 +315,7 @@ static void i2o_pci_irq_disable(struct i2o_controller *c)   *   *	Returns 0 on success or negative error code on failure.   */ -static int __devinit i2o_pci_probe(struct pci_dev *pdev, -				   const struct pci_device_id *id) +static int i2o_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)  {  	struct i2o_controller *c;  	int rc; @@ -452,7 +452,7 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev,   *	Reset the I2O controller, disable interrupts and remove all allocated   *	resources.   */ -static void __devexit i2o_pci_remove(struct pci_dev *pdev) +static void i2o_pci_remove(struct pci_dev *pdev)  {  	struct i2o_controller *c;  	c = pci_get_drvdata(pdev); @@ -473,7 +473,7 @@ static struct pci_driver i2o_pci_driver = {  	.name = "PCI_I2O",  	.id_table = i2o_pci_ids,  	.probe = i2o_pci_probe, -	.remove = __devexit_p(i2o_pci_remove), +	.remove = i2o_pci_remove,  };  /**  | 
