diff options
Diffstat (limited to 'drivers/ide/ide-park.c')
-rw-r--r-- | drivers/ide/ide-park.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/ide/ide-park.c b/drivers/ide/ide-park.c index c875a957596..9490b446519 100644 --- a/drivers/ide/ide-park.c +++ b/drivers/ide/ide-park.c @@ -60,6 +60,32 @@ out: return; } +ide_startstop_t ide_do_park_unpark(ide_drive_t *drive, struct request *rq) +{ + struct ide_cmd cmd; + struct ide_taskfile *tf = &cmd.tf; + + memset(&cmd, 0, sizeof(cmd)); + if (rq->cmd[0] == REQ_PARK_HEADS) { + drive->sleep = *(unsigned long *)rq->special; + drive->dev_flags |= IDE_DFLAG_SLEEPING; + tf->command = ATA_CMD_IDLEIMMEDIATE; + tf->feature = 0x44; + tf->lbal = 0x4c; + tf->lbam = 0x4e; + tf->lbah = 0x55; + cmd.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; + } else /* cmd == REQ_UNPARK_HEADS */ + tf->command = ATA_CMD_CHK_POWER; + + cmd.tf_flags |= IDE_TFLAG_CUSTOM_HANDLER; + cmd.protocol = ATA_PROT_NODATA; + + cmd.rq = rq; + + return do_rw_taskfile(drive, &cmd); +} + ssize_t ide_park_show(struct device *dev, struct device_attribute *attr, char *buf) { |