diff options
Diffstat (limited to 'drivers/message')
| -rw-r--r-- | drivers/message/fusion/mptbase.c | 4 | ||||
| -rw-r--r-- | drivers/message/fusion/mptctl.c | 6 | ||||
| -rw-r--r-- | drivers/message/fusion/mptfc.c | 12 | ||||
| -rw-r--r-- | drivers/message/fusion/mptsas.c | 18 | ||||
| -rw-r--r-- | drivers/message/fusion/mptscsih.c | 8 | ||||
| -rw-r--r-- | drivers/message/fusion/mptscsih.h | 2 | ||||
| -rw-r--r-- | drivers/message/fusion/mptspi.c | 12 | ||||
| -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 | 
12 files changed, 104 insertions, 99 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 767ff4d839f..ebc0af7d769 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c @@ -346,7 +346,7 @@ static int mpt_remove_dead_ioc_func(void *arg)  	if ((pdev == NULL))  		return -1; -	pci_stop_and_remove_bus_device(pdev); +	pci_stop_and_remove_bus_device_locked(pdev);  	return 0;  } @@ -1037,7 +1037,7 @@ mpt_free_msg_frame(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)  		goto out;  	/* signature to know if this mf is freed */  	mf->u.frame.linkage.arg1 = cpu_to_le32(0xdeadbeaf); -	list_add_tail(&mf->u.frame.linkage.list, &ioc->FreeQ); +	list_add(&mf->u.frame.linkage.list, &ioc->FreeQ);  #ifdef MFCNT  	ioc->mfcnt--;  #endif diff --git a/drivers/message/fusion/mptctl.c b/drivers/message/fusion/mptctl.c index dcc8385adeb..8a050e88568 100644 --- a/drivers/message/fusion/mptctl.c +++ b/drivers/message/fusion/mptctl.c @@ -2432,9 +2432,9 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)  	int			rc, cim_rev;  	ToolboxIstwiReadWriteRequest_t	*IstwiRWRequest;  	MPT_FRAME_HDR		*mf = NULL; -	MPIHeader_t		*mpi_hdr;  	unsigned long		timeleft;  	int			retval; +	u32			msgcontext;  	/* Reset long to int. Should affect IA64 and SPARC only  	 */ @@ -2581,11 +2581,11 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)  	}  	IstwiRWRequest = (ToolboxIstwiReadWriteRequest_t *)mf; -	mpi_hdr = (MPIHeader_t *) mf; +	msgcontext = IstwiRWRequest->MsgContext;  	memset(IstwiRWRequest,0,sizeof(ToolboxIstwiReadWriteRequest_t)); +	IstwiRWRequest->MsgContext = msgcontext;  	IstwiRWRequest->Function = MPI_FUNCTION_TOOLBOX;  	IstwiRWRequest->Tool = MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL; -	IstwiRWRequest->MsgContext = mpi_hdr->MsgContext;  	IstwiRWRequest->Flags = MPI_TB_ISTWI_FLAGS_READ;  	IstwiRWRequest->NumAddressBytes = 0x01;  	IstwiRWRequest->DataLength = cpu_to_le16(0x04); diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index fd75108c355..02a3eefd693 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c @@ -649,7 +649,7 @@ mptfc_slave_alloc(struct scsi_device *sdev)  }  static int -mptfc_qcmd_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) +mptfc_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *SCpnt)  {  	struct mptfc_rport_info	*ri;  	struct fc_rport	*rport = starget_to_rport(scsi_target(SCpnt->device)); @@ -658,14 +658,14 @@ mptfc_qcmd_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	if (!vdevice || !vdevice->vtarget) {  		SCpnt->result = DID_NO_CONNECT << 16; -		done(SCpnt); +		SCpnt->scsi_done(SCpnt);  		return 0;  	}  	err = fc_remote_port_chkready(rport);  	if (unlikely(err)) {  		SCpnt->result = err; -		done(SCpnt); +		SCpnt->scsi_done(SCpnt);  		return 0;  	} @@ -673,15 +673,13 @@ mptfc_qcmd_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	ri = *((struct mptfc_rport_info **)rport->dd_data);  	if (unlikely(!ri)) {  		SCpnt->result = DID_IMM_RETRY << 16; -		done(SCpnt); +		SCpnt->scsi_done(SCpnt);  		return 0;  	} -	return mptscsih_qcmd(SCpnt,done); +	return mptscsih_qcmd(SCpnt);  } -static DEF_SCSI_QCMD(mptfc_qcmd) -  /*   *	mptfc_display_port_link_speed - displaying link speed   *	@ioc: Pointer to MPT_ADAPTER structure diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index dd239bdbfcb..711fcb5cec8 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c @@ -1896,7 +1896,7 @@ mptsas_slave_alloc(struct scsi_device *sdev)  }  static int -mptsas_qcmd_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) +mptsas_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *SCpnt)  {  	MPT_SCSI_HOST	*hd;  	MPT_ADAPTER	*ioc; @@ -1904,11 +1904,11 @@ mptsas_qcmd_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	if (!vdevice || !vdevice->vtarget || vdevice->vtarget->deleted) {  		SCpnt->result = DID_NO_CONNECT << 16; -		done(SCpnt); +		SCpnt->scsi_done(SCpnt);  		return 0;  	} -	hd = shost_priv(SCpnt->device->host); +	hd = shost_priv(shost);  	ioc = hd->ioc;  	if (ioc->sas_discovery_quiesce_io) @@ -1917,11 +1917,9 @@ mptsas_qcmd_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	if (ioc->debug_level & MPT_DEBUG_SCSI)  		scsi_print_command(SCpnt); -	return mptscsih_qcmd(SCpnt,done); +	return mptscsih_qcmd(SCpnt);  } -static DEF_SCSI_QCMD(mptsas_qcmd) -  /**   *	mptsas_mptsas_eh_timed_out - resets the scsi_cmnd timeout   *		if the device under question is currently in the @@ -2235,10 +2233,10 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,  	}  	/* do we need to support multiple segments? */ -	if (bio_segments(req->bio) > 1 || bio_segments(rsp->bio) > 1) { -		printk(MYIOC_s_ERR_FMT "%s: multiple segments req %u %u, rsp %u %u\n", -		    ioc->name, __func__, bio_segments(req->bio), blk_rq_bytes(req), -		    bio_segments(rsp->bio), blk_rq_bytes(rsp)); +	if (bio_multiple_segments(req->bio) || +	    bio_multiple_segments(rsp->bio)) { +		printk(MYIOC_s_ERR_FMT "%s: multiple segments req %u, rsp %u\n", +		    ioc->name, __func__, blk_rq_bytes(req), blk_rq_bytes(rsp));  		return -EINVAL;  	} diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index 727819cc703..2a1c6f21af2 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c @@ -1304,7 +1304,6 @@ int mptscsih_show_info(struct seq_file *m, struct Scsi_Host *host)  /**   *	mptscsih_qcmd - Primary Fusion MPT SCSI initiator IO start routine.   *	@SCpnt: Pointer to scsi_cmnd structure - *	@done: Pointer SCSI mid-layer IO completion function   *   *	(linux scsi_host_template.queuecommand routine)   *	This is the primary SCSI IO start routine.  Create a MPI SCSIIORequest @@ -1313,7 +1312,7 @@ int mptscsih_show_info(struct seq_file *m, struct Scsi_Host *host)   *	Returns 0. (rtn value discarded by linux scsi mid-layer)   */  int -mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) +mptscsih_qcmd(struct scsi_cmnd *SCpnt)  {  	MPT_SCSI_HOST		*hd;  	MPT_FRAME_HDR		*mf; @@ -1329,10 +1328,9 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))  	hd = shost_priv(SCpnt->device->host);  	ioc = hd->ioc; -	SCpnt->scsi_done = done; -	dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "qcmd: SCpnt=%p, done()=%p\n", -		ioc->name, SCpnt, done)); +	dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "qcmd: SCpnt=%p\n", +		ioc->name, SCpnt));  	if (ioc->taskmgmt_quiesce_io)  		return SCSI_MLQUEUE_HOST_BUSY; diff --git a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h index 83f503162f7..99e3390807f 100644 --- a/drivers/message/fusion/mptscsih.h +++ b/drivers/message/fusion/mptscsih.h @@ -113,7 +113,7 @@ extern int mptscsih_resume(struct pci_dev *pdev);  #endif  extern int mptscsih_show_info(struct seq_file *, struct Scsi_Host *);  extern const char * mptscsih_info(struct Scsi_Host *SChost); -extern int mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)); +extern int mptscsih_qcmd(struct scsi_cmnd *SCpnt);  extern int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel,  	u8 id, int lun, int ctx2abort, ulong timeout);  extern void mptscsih_slave_destroy(struct scsi_device *device); diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index 5653e505f91..49d11338294 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c @@ -780,33 +780,31 @@ static int mptspi_slave_configure(struct scsi_device *sdev)  }  static int -mptspi_qcmd_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) +mptspi_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *SCpnt)  { -	struct _MPT_SCSI_HOST *hd = shost_priv(SCpnt->device->host); +	struct _MPT_SCSI_HOST *hd = shost_priv(shost);  	VirtDevice	*vdevice = SCpnt->device->hostdata;  	MPT_ADAPTER *ioc = hd->ioc;  	if (!vdevice || !vdevice->vtarget) {  		SCpnt->result = DID_NO_CONNECT << 16; -		done(SCpnt); +		SCpnt->scsi_done(SCpnt);  		return 0;  	}  	if (SCpnt->device->channel == 1 &&  		mptscsih_is_phys_disk(ioc, 0, SCpnt->device->id) == 0) {  		SCpnt->result = DID_NO_CONNECT << 16; -		done(SCpnt); +		SCpnt->scsi_done(SCpnt);  		return 0;  	}  	if (spi_dv_pending(scsi_target(SCpnt->device)))  		ddvprintk(ioc, scsi_print_command(SCpnt)); -	return mptscsih_qcmd(SCpnt,done); +	return mptscsih_qcmd(SCpnt);  } -static DEF_SCSI_QCMD(mptspi_qcmd) -  static void mptspi_slave_destroy(struct scsi_device *sdev)  {  	struct scsi_target *starget = scsi_target(sdev); 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))  | 
