diff options
Diffstat (limited to 'drivers/ide/ide-io.c')
-rw-r--r-- | drivers/ide/ide-io.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index e205f46c3c7a..77c6eaeacefa 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -672,7 +672,32 @@ EXPORT_SYMBOL_GPL(ide_devset_execute); | |||
672 | 672 | ||
673 | static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq) | 673 | static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq) |
674 | { | 674 | { |
675 | switch (rq->cmd[0]) { | 675 | u8 cmd = rq->cmd[0]; |
676 | |||
677 | if (cmd == REQ_PARK_HEADS || cmd == REQ_UNPARK_HEADS) { | ||
678 | ide_task_t task; | ||
679 | struct ide_taskfile *tf = &task.tf; | ||
680 | |||
681 | memset(&task, 0, sizeof(task)); | ||
682 | if (cmd == REQ_PARK_HEADS) { | ||
683 | drive->sleep = *(unsigned long *)rq->special; | ||
684 | drive->dev_flags |= IDE_DFLAG_SLEEPING; | ||
685 | tf->command = ATA_CMD_IDLEIMMEDIATE; | ||
686 | tf->feature = 0x44; | ||
687 | tf->lbal = 0x4c; | ||
688 | tf->lbam = 0x4e; | ||
689 | tf->lbah = 0x55; | ||
690 | task.tf_flags |= IDE_TFLAG_CUSTOM_HANDLER; | ||
691 | } else /* cmd == REQ_UNPARK_HEADS */ | ||
692 | tf->command = ATA_CMD_CHK_POWER; | ||
693 | |||
694 | task.tf_flags |= IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | ||
695 | task.rq = rq; | ||
696 | drive->hwif->data_phase = task.data_phase = TASKFILE_NO_DATA; | ||
697 | return do_rw_taskfile(drive, &task); | ||
698 | } | ||
699 | |||
700 | switch (cmd) { | ||
676 | case REQ_DEVSET_EXEC: | 701 | case REQ_DEVSET_EXEC: |
677 | { | 702 | { |
678 | int err, (*setfunc)(ide_drive_t *, int) = rq->special; | 703 | int err, (*setfunc)(ide_drive_t *, int) = rq->special; |
@@ -1008,7 +1033,7 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq) | |||
1008 | } | 1033 | } |
1009 | hwgroup->hwif = hwif; | 1034 | hwgroup->hwif = hwif; |
1010 | hwgroup->drive = drive; | 1035 | hwgroup->drive = drive; |
1011 | drive->dev_flags &= ~IDE_DFLAG_SLEEPING; | 1036 | drive->dev_flags &= ~(IDE_DFLAG_SLEEPING | IDE_DFLAG_PARKED); |
1012 | drive->service_start = jiffies; | 1037 | drive->service_start = jiffies; |
1013 | 1038 | ||
1014 | if (blk_queue_plugged(drive->queue)) { | 1039 | if (blk_queue_plugged(drive->queue)) { |