Merge tag 's390-5.11-3' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux-2.6-microblaze.git] / drivers / ide / ide-pm.c
index 59217aa..82ab308 100644 (file)
@@ -21,7 +21,7 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg)
        memset(&rqpm, 0, sizeof(rqpm));
        rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0);
        ide_req(rq)->type = ATA_PRIV_PM_SUSPEND;
-       rq->special = &rqpm;
+       ide_req(rq)->special = &rqpm;
        rqpm.pm_step = IDE_PM_START_SUSPEND;
        if (mesg.event == PM_EVENT_PRETHAW)
                mesg.event = PM_EVENT_FREEZE;
@@ -40,32 +40,17 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg)
        return ret;
 }
 
-static void ide_end_sync_rq(struct request *rq, blk_status_t error)
-{
-       complete(rq->end_io_data);
-}
-
 static int ide_pm_execute_rq(struct request *rq)
 {
        struct request_queue *q = rq->q;
-       DECLARE_COMPLETION_ONSTACK(wait);
 
-       rq->end_io_data = &wait;
-       rq->end_io = ide_end_sync_rq;
-
-       spin_lock_irq(q->queue_lock);
        if (unlikely(blk_queue_dying(q))) {
                rq->rq_flags |= RQF_QUIET;
                scsi_req(rq)->result = -ENXIO;
-               __blk_end_request_all(rq, BLK_STS_OK);
-               spin_unlock_irq(q->queue_lock);
+               blk_mq_end_request(rq, BLK_STS_OK);
                return -ENXIO;
        }
-       __elv_add_request(q, rq, ELEVATOR_INSERT_FRONT);
-       __blk_run_queue_uncond(q);
-       spin_unlock_irq(q->queue_lock);
-
-       wait_for_completion_io(&wait);
+       blk_execute_rq(q, NULL, rq, true);
 
        return scsi_req(rq)->result ? -EIO : 0;
 }
@@ -79,6 +64,8 @@ int generic_ide_resume(struct device *dev)
        struct ide_pm_state rqpm;
        int err;
 
+       blk_mq_start_stopped_hw_queues(drive->queue, true);
+
        if (ide_port_acpi(hwif)) {
                /* call ACPI _PS0 / _STM only once */
                if ((drive->dn & 1) == 0 || pair == NULL) {
@@ -90,9 +77,9 @@ int generic_ide_resume(struct device *dev)
        }
 
        memset(&rqpm, 0, sizeof(rqpm));
-       rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, BLK_MQ_REQ_PREEMPT);
+       rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, BLK_MQ_REQ_PM);
        ide_req(rq)->type = ATA_PRIV_PM_RESUME;
-       rq->special = &rqpm;
+       ide_req(rq)->special = &rqpm;
        rqpm.pm_step = IDE_PM_START_RESUME;
        rqpm.pm_state = PM_EVENT_ON;
 
@@ -111,7 +98,7 @@ int generic_ide_resume(struct device *dev)
 
 void ide_complete_power_step(ide_drive_t *drive, struct request *rq)
 {
-       struct ide_pm_state *pm = rq->special;
+       struct ide_pm_state *pm = ide_req(rq)->special;
 
 #ifdef DEBUG_PM
        printk(KERN_INFO "%s: complete_power_step(step: %d)\n",
@@ -141,7 +128,7 @@ void ide_complete_power_step(ide_drive_t *drive, struct request *rq)
 
 ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq)
 {
-       struct ide_pm_state *pm = rq->special;
+       struct ide_pm_state *pm = ide_req(rq)->special;
        struct ide_cmd cmd = { };
 
        switch (pm->pm_step) {
@@ -213,8 +200,7 @@ out_do_tf:
 void ide_complete_pm_rq(ide_drive_t *drive, struct request *rq)
 {
        struct request_queue *q = drive->queue;
-       struct ide_pm_state *pm = rq->special;
-       unsigned long flags;
+       struct ide_pm_state *pm = ide_req(rq)->special;
 
        ide_complete_power_step(drive, rq);
        if (pm->pm_step != IDE_PM_COMPLETED)
@@ -224,22 +210,19 @@ void ide_complete_pm_rq(ide_drive_t *drive, struct request *rq)
        printk("%s: completing PM request, %s\n", drive->name,
               (ide_req(rq)->type == ATA_PRIV_PM_SUSPEND) ? "suspend" : "resume");
 #endif
-       spin_lock_irqsave(q->queue_lock, flags);
        if (ide_req(rq)->type == ATA_PRIV_PM_SUSPEND)
-               blk_stop_queue(q);
+               blk_mq_stop_hw_queues(q);
        else
                drive->dev_flags &= ~IDE_DFLAG_BLOCKED;
-       spin_unlock_irqrestore(q->queue_lock, flags);
 
        drive->hwif->rq = NULL;
 
-       if (blk_end_request(rq, BLK_STS_OK, 0))
-               BUG();
+       blk_mq_end_request(rq, BLK_STS_OK);
 }
 
 void ide_check_pm_state(ide_drive_t *drive, struct request *rq)
 {
-       struct ide_pm_state *pm = rq->special;
+       struct ide_pm_state *pm = ide_req(rq)->special;
 
        if (blk_rq_is_private(rq) &&
            ide_req(rq)->type == ATA_PRIV_PM_SUSPEND &&
@@ -260,7 +243,6 @@ void ide_check_pm_state(ide_drive_t *drive, struct request *rq)
                ide_hwif_t *hwif = drive->hwif;
                const struct ide_tp_ops *tp_ops = hwif->tp_ops;
                struct request_queue *q = drive->queue;
-               unsigned long flags;
                int rc;
 #ifdef DEBUG_PM
                printk("%s: Wakeup request inited, waiting for !BSY...\n", drive->name);
@@ -274,8 +256,6 @@ void ide_check_pm_state(ide_drive_t *drive, struct request *rq)
                if (rc)
                        printk(KERN_WARNING "%s: drive not ready on wakeup\n", drive->name);
 
-               spin_lock_irqsave(q->queue_lock, flags);
-               blk_start_queue(q);
-               spin_unlock_irqrestore(q->queue_lock, flags);
+               blk_mq_start_hw_queues(q);
        }
 }