Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel
[pandora-kernel.git] / drivers / scsi / sd.c
index 352bc77..7992635 100644 (file)
@@ -105,7 +105,7 @@ static void sd_unlock_native_capacity(struct gendisk *disk);
 static int  sd_probe(struct device *);
 static int  sd_remove(struct device *);
 static void sd_shutdown(struct device *);
-static int sd_suspend(struct device *, pm_message_t state);
+static int sd_suspend(struct device *);
 static int sd_resume(struct device *);
 static void sd_rescan(struct device *);
 static int sd_done(struct scsi_cmnd *);
@@ -465,15 +465,23 @@ static struct class sd_disk_class = {
        .dev_attrs      = sd_disk_attrs,
 };
 
+static const struct dev_pm_ops sd_pm_ops = {
+       .suspend                = sd_suspend,
+       .resume                 = sd_resume,
+       .poweroff               = sd_suspend,
+       .restore                = sd_resume,
+       .runtime_suspend        = sd_suspend,
+       .runtime_resume         = sd_resume,
+};
+
 static struct scsi_driver sd_template = {
        .owner                  = THIS_MODULE,
        .gendrv = {
                .name           = "sd",
                .probe          = sd_probe,
                .remove         = sd_remove,
-               .suspend        = sd_suspend,
-               .resume         = sd_resume,
                .shutdown       = sd_shutdown,
+               .pm             = &sd_pm_ops,
        },
        .rescan                 = sd_rescan,
        .done                   = sd_done,
@@ -1011,7 +1019,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq)
                SCpnt->cmnd[29] = (unsigned char) (this_count >> 16) & 0xff;
                SCpnt->cmnd[30] = (unsigned char) (this_count >> 8) & 0xff;
                SCpnt->cmnd[31] = (unsigned char) this_count & 0xff;
-       } else if (block > 0xffffffff) {
+       } else if (sdp->use_16_for_rw) {
                SCpnt->cmnd[0] += READ_16 - READ_6;
                SCpnt->cmnd[1] = protect | ((rq->cmd_flags & REQ_FUA) ? 0x8 : 0);
                SCpnt->cmnd[2] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0;
@@ -2203,6 +2211,8 @@ got_data:
                }
        }
 
+       sdp->use_16_for_rw = (sdkp->capacity > 0xffffffff);
+
        /* Rescale capacity to 512-byte units */
        if (sector_size == 4096)
                sdkp->capacity <<= 3;
@@ -3052,7 +3062,7 @@ exit:
        scsi_disk_put(sdkp);
 }
 
-static int sd_suspend(struct device *dev, pm_message_t mesg)
+static int sd_suspend(struct device *dev)
 {
        struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev);
        int ret = 0;
@@ -3067,7 +3077,7 @@ static int sd_suspend(struct device *dev, pm_message_t mesg)
                        goto done;
        }
 
-       if ((mesg.event & PM_EVENT_SLEEP) && sdkp->device->manage_start_stop) {
+       if (sdkp->device->manage_start_stop) {
                sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n");
                ret = sd_start_stop_device(sdkp, 0);
        }
@@ -3116,10 +3126,6 @@ static int __init init_sd(void)
        if (err)
                goto err_out;
 
-       err = scsi_register_driver(&sd_template.gendrv);
-       if (err)
-               goto err_out_class;
-
        sd_cdb_cache = kmem_cache_create("sd_ext_cdb", SD_EXT_CDB_SIZE,
                                         0, 0, NULL);
        if (!sd_cdb_cache) {
@@ -3133,8 +3139,15 @@ static int __init init_sd(void)
                goto err_out_cache;
        }
 
+       err = scsi_register_driver(&sd_template.gendrv);
+       if (err)
+               goto err_out_driver;
+
        return 0;
 
+err_out_driver:
+       mempool_destroy(sd_cdb_pool);
+
 err_out_cache:
        kmem_cache_destroy(sd_cdb_cache);
 
@@ -3157,10 +3170,10 @@ static void __exit exit_sd(void)
 
        SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n"));
 
+       scsi_unregister_driver(&sd_template.gendrv);
        mempool_destroy(sd_cdb_pool);
        kmem_cache_destroy(sd_cdb_cache);
 
-       scsi_unregister_driver(&sd_template.gendrv);
        class_unregister(&sd_disk_class);
 
        for (i = 0; i < SD_MAJORS; i++)