1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/kernel.h>
5 #include <linux/jiffies.h>
6 #include <linux/blkdev.h>
8 DECLARE_WAIT_QUEUE_HEAD(ide_park_wq
);
10 static void issue_park_cmd(ide_drive_t
*drive
, unsigned long timeout
)
12 ide_hwif_t
*hwif
= drive
->hwif
;
13 struct request_queue
*q
= drive
->queue
;
18 spin_lock_irq(&hwif
->lock
);
19 if (drive
->dev_flags
& IDE_DFLAG_PARKED
) {
20 int reset_timer
= time_before(timeout
, drive
->sleep
);
23 drive
->sleep
= timeout
;
24 wake_up_all(&ide_park_wq
);
25 if (reset_timer
&& del_timer(&hwif
->timer
))
27 spin_unlock_irq(&hwif
->lock
);
30 blk_mq_run_hw_queues(q
, true);
33 spin_unlock_irq(&hwif
->lock
);
35 rq
= blk_get_request(q
, REQ_OP_DRV_IN
, 0);
36 scsi_req(rq
)->cmd
[0] = REQ_PARK_HEADS
;
37 scsi_req(rq
)->cmd_len
= 1;
38 ide_req(rq
)->type
= ATA_PRIV_MISC
;
39 ide_req(rq
)->special
= &timeout
;
40 blk_execute_rq(q
, NULL
, rq
, 1);
41 rc
= scsi_req(rq
)->result
? -EIO
: 0;
47 * Make sure that *some* command is sent to the drive after the
48 * timeout has expired, so power management will be reenabled.
50 rq
= blk_get_request(q
, REQ_OP_DRV_IN
, BLK_MQ_REQ_NOWAIT
);
54 scsi_req(rq
)->cmd
[0] = REQ_UNPARK_HEADS
;
55 scsi_req(rq
)->cmd_len
= 1;
56 ide_req(rq
)->type
= ATA_PRIV_MISC
;
57 spin_lock_irq(&hwif
->lock
);
58 ide_insert_request_head(drive
, rq
);
59 spin_unlock_irq(&hwif
->lock
);
65 ide_startstop_t
ide_do_park_unpark(ide_drive_t
*drive
, struct request
*rq
)
68 struct ide_taskfile
*tf
= &cmd
.tf
;
70 memset(&cmd
, 0, sizeof(cmd
));
71 if (scsi_req(rq
)->cmd
[0] == REQ_PARK_HEADS
) {
72 drive
->sleep
= *(unsigned long *)ide_req(rq
)->special
;
73 drive
->dev_flags
|= IDE_DFLAG_SLEEPING
;
74 tf
->command
= ATA_CMD_IDLEIMMEDIATE
;
79 cmd
.valid
.out
.tf
= IDE_VALID_OUT_TF
| IDE_VALID_DEVICE
;
80 cmd
.valid
.in
.tf
= IDE_VALID_IN_TF
| IDE_VALID_DEVICE
;
81 } else /* cmd == REQ_UNPARK_HEADS */
82 tf
->command
= ATA_CMD_CHK_POWER
;
84 cmd
.tf_flags
|= IDE_TFLAG_CUSTOM_HANDLER
;
85 cmd
.protocol
= ATA_PROT_NODATA
;
89 return do_rw_taskfile(drive
, &cmd
);
92 ssize_t
ide_park_show(struct device
*dev
, struct device_attribute
*attr
,
95 ide_drive_t
*drive
= to_ide_device(dev
);
96 ide_hwif_t
*hwif
= drive
->hwif
;
100 if (drive
->dev_flags
& IDE_DFLAG_NO_UNLOAD
)
103 spin_lock_irq(&hwif
->lock
);
105 if (drive
->dev_flags
& IDE_DFLAG_PARKED
&&
106 time_after(drive
->sleep
, now
))
107 msecs
= jiffies_to_msecs(drive
->sleep
- now
);
110 spin_unlock_irq(&hwif
->lock
);
112 return snprintf(buf
, 20, "%u\n", msecs
);
115 ssize_t
ide_park_store(struct device
*dev
, struct device_attribute
*attr
,
116 const char *buf
, size_t len
)
118 #define MAX_PARK_TIMEOUT 30000
119 ide_drive_t
*drive
= to_ide_device(dev
);
123 rc
= kstrtol(buf
, 10, &input
);
128 if (input
> MAX_PARK_TIMEOUT
) {
129 input
= MAX_PARK_TIMEOUT
;
133 mutex_lock(&ide_setting_mtx
);
135 if (drive
->dev_flags
& IDE_DFLAG_NO_UNLOAD
)
137 else if (input
|| drive
->dev_flags
& IDE_DFLAG_PARKED
)
138 issue_park_cmd(drive
, msecs_to_jiffies(input
));
140 if (drive
->media
== ide_disk
)
143 drive
->dev_flags
&= ~IDE_DFLAG_NO_UNLOAD
;
146 drive
->dev_flags
|= IDE_DFLAG_NO_UNLOAD
;
152 mutex_unlock(&ide_setting_mtx
);
154 return rc
? rc
: len
;