diff options
Diffstat (limited to 'drivers/scsi/sd.c')
| -rw-r--r-- | drivers/scsi/sd.c | 25 | 
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index ccff8f2e2e75..58fdf679341d 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -3920,7 +3920,7 @@ static int sd_probe(struct device *dev)  	error = device_add_disk(dev, gd, NULL);  	if (error) { -		put_device(&sdkp->disk_dev); +		device_unregister(&sdkp->disk_dev);  		put_disk(gd);  		goto out;  	} @@ -4108,7 +4108,21 @@ static int sd_suspend_runtime(struct device *dev)  	return sd_suspend_common(dev, true);  } -static int sd_resume(struct device *dev, bool runtime) +static int sd_resume(struct device *dev) +{ +	struct scsi_disk *sdkp = dev_get_drvdata(dev); + +	sd_printk(KERN_NOTICE, sdkp, "Starting disk\n"); + +	if (opal_unlock_from_suspend(sdkp->opal_dev)) { +		sd_printk(KERN_NOTICE, sdkp, "OPAL unlock failed\n"); +		return -EIO; +	} + +	return 0; +} + +static int sd_resume_common(struct device *dev, bool runtime)  {  	struct scsi_disk *sdkp = dev_get_drvdata(dev);  	int ret; @@ -4124,7 +4138,7 @@ static int sd_resume(struct device *dev, bool runtime)  	sd_printk(KERN_NOTICE, sdkp, "Starting disk\n");  	ret = sd_start_stop_device(sdkp, 1);  	if (!ret) { -		opal_unlock_from_suspend(sdkp->opal_dev); +		sd_resume(dev);  		sdkp->suspended = false;  	} @@ -4143,7 +4157,7 @@ static int sd_resume_system(struct device *dev)  		return 0;  	} -	return sd_resume(dev, false); +	return sd_resume_common(dev, false);  }  static int sd_resume_runtime(struct device *dev) @@ -4170,7 +4184,7 @@ static int sd_resume_runtime(struct device *dev)  				  "Failed to clear sense data\n");  	} -	return sd_resume(dev, true); +	return sd_resume_common(dev, true);  }  static const struct dev_pm_ops sd_pm_ops = { @@ -4193,6 +4207,7 @@ static struct scsi_driver sd_template = {  		.pm		= &sd_pm_ops,  	},  	.rescan			= sd_rescan, +	.resume			= sd_resume,  	.init_command		= sd_init_command,  	.uninit_command		= sd_uninit_command,  	.done			= sd_done,  |