Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46a243f7 authored by Oliver Neukum's avatar Oliver Neukum Committed by James Bottomley
Browse files

[SCSI] st: implement PM



This implements basic power management for SCSI tapes.

Signed-off-by: default avatarOliver Neukum <oneukum@suse.de>
Acked-by: default avatarKai Mäkisara <kai.makisara@kolumbus.fi>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent fea6d607
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1177,6 +1177,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)
static int st_open(struct inode *inode, struct file *filp)
{
	int i, retval = (-EIO);
	int resumed = 0;
	struct scsi_tape *STp;
	struct st_partstat *STps;
	int dev = TAPE_NR(inode);
@@ -1211,6 +1212,11 @@ static int st_open(struct inode *inode, struct file *filp)
	write_unlock(&st_dev_arr_lock);
	STp->rew_at_close = STp->autorew_dev = (iminor(inode) & 0x80) == 0;

	if (scsi_autopm_get_device(STp->device) < 0) {
		retval = -EIO;
		goto err_out;
	}
	resumed = 1;
	if (!scsi_block_when_processing_errors(STp->device)) {
		retval = (-ENXIO);
		goto err_out;
@@ -1258,6 +1264,8 @@ static int st_open(struct inode *inode, struct file *filp)
	normalize_buffer(STp->buffer);
	STp->in_use = 0;
	scsi_tape_put(STp);
	if (resumed)
		scsi_autopm_put_device(STp->device);
	mutex_unlock(&st_mutex);
	return retval;

@@ -1391,6 +1399,7 @@ static int st_release(struct inode *inode, struct file *filp)
	write_lock(&st_dev_arr_lock);
	STp->in_use = 0;
	write_unlock(&st_dev_arr_lock);
	scsi_autopm_put_device(STp->device);
	scsi_tape_put(STp);

	return result;
@@ -4154,6 +4163,7 @@ static int st_probe(struct device *dev)
		if (error)
			goto out_free_tape;
	}
	scsi_autopm_put_device(SDp);

	sdev_printk(KERN_NOTICE, SDp,
		    "Attached scsi tape %s\n", tape_name(tpnt));
@@ -4201,6 +4211,7 @@ static int st_remove(struct device *dev)
	struct scsi_tape *tpnt;
	int i, j, mode;

	scsi_autopm_get_device(SDp);
	write_lock(&st_dev_arr_lock);
	for (i = 0; i < st_dev_max; i++) {
		tpnt = scsi_tapes[i];