+static int sd_suspend(struct device *dev, pm_message_t mesg)
+{
+ struct scsi_device *sdp = to_scsi_device(dev);
+ struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
+ int ret;
+
+ if (!sdkp)
+ return 0; /* this can happen */
+
+ if (sdkp->WCE) {
+ printk(KERN_NOTICE "Synchronizing SCSI cache for disk %s: \n",
+ sdkp->disk->disk_name);
+ ret = sd_sync_cache(sdkp);
+ if (ret)
+ return ret;
+ }
+
+ if (mesg.event == PM_EVENT_SUSPEND && sdp->manage_start_stop) {
+ printk(KERN_NOTICE "Stopping disk %s: \n",
+ sdkp->disk->disk_name);
+ ret = sd_start_stop_device(sdp, 0);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static int sd_resume(struct device *dev)
+{
+ struct scsi_device *sdp = to_scsi_device(dev);
+ struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
+
+ if (!sdp->manage_start_stop)
+ return 0;
+
+ printk(KERN_NOTICE "Starting disk %s: \n", sdkp->disk->disk_name);
+
+ return sd_start_stop_device(sdp, 1);
+}
+