1 #include <linux/kernel.h>
3 #include <linux/hdreg.h>
4 #include <linux/jiffies.h>
5 #include <linux/blkdev.h>
7 DECLARE_WAIT_QUEUE_HEAD(ide_park_wq
);
9 static void issue_park_cmd(ide_drive_t
*drive
, unsigned long timeout
)
11 ide_hwif_t
*hwif
= drive
->hwif
;
12 struct request_queue
*q
= drive
->queue
;
17 spin_lock_irq(&hwif
->lock
);
18 if (drive
->dev_flags
& IDE_DFLAG_PARKED
) {
19 int reset_timer
= time_before(timeout
, drive
->sleep
);
22 drive
->sleep
= timeout
;
23 wake_up_all(&ide_park_wq
);
24 if (reset_timer
&& del_timer(&hwif
->timer
))
26 spin_unlock_irq(&hwif
->lock
);
29 spin_lock_irq(q
->queue_lock
);
30 blk_start_queueing(q
);
31 spin_unlock_irq(q
->queue_lock
);
35 spin_unlock_irq(&hwif
->lock
);
37 rq
= blk_get_request(q
, READ
, __GFP_WAIT
);
38 rq
->cmd
[0] = REQ_PARK_HEADS
;
40 rq
->cmd_type
= REQ_TYPE_SPECIAL
;
41 rq
->special
= &timeout
;
42 rc
= blk_execute_rq(q
, NULL
, rq
, 1);
48 * Make sure that *some* command is sent to the drive after the
49 * timeout has expired, so power management will be reenabled.
51 rq
= blk_get_request(q
, READ
, GFP_NOWAIT
);
55 rq
->cmd
[0] = REQ_UNPARK_HEADS
;
57 rq
->cmd_type
= REQ_TYPE_SPECIAL
;
58 elv_add_request(q
, rq
, ELEVATOR_INSERT_FRONT
, 1);
64 ide_startstop_t
ide_do_park_unpark(ide_drive_t
*drive
, struct request
*rq
)
67 struct ide_taskfile
*tf
= &cmd
.tf
;
69 memset(&cmd
, 0, sizeof(cmd
));
70 if (rq
->cmd
[0] == REQ_PARK_HEADS
) {
71 drive
->sleep
= *(unsigned long *)rq
->special
;
72 drive
->dev_flags
|= IDE_DFLAG_SLEEPING
;
73 tf
->command
= ATA_CMD_IDLEIMMEDIATE
;
78 cmd
.tf_flags
|= IDE_TFLAG_CUSTOM_HANDLER
;
79 } else /* cmd == REQ_UNPARK_HEADS */
80 tf
->command
= ATA_CMD_CHK_POWER
;
82 cmd
.tf_flags
|= IDE_TFLAG_TF
| IDE_TFLAG_DEVICE
;
84 cmd
.data_phase
= TASKFILE_NO_DATA
;
86 return do_rw_taskfile(drive
, &cmd
);
89 ssize_t
ide_park_show(struct device
*dev
, struct device_attribute
*attr
,
92 ide_drive_t
*drive
= to_ide_device(dev
);
93 ide_hwif_t
*hwif
= drive
->hwif
;
97 if (drive
->dev_flags
& IDE_DFLAG_NO_UNLOAD
)
100 spin_lock_irq(&hwif
->lock
);
102 if (drive
->dev_flags
& IDE_DFLAG_PARKED
&&
103 time_after(drive
->sleep
, now
))
104 msecs
= jiffies_to_msecs(drive
->sleep
- now
);
107 spin_unlock_irq(&hwif
->lock
);
109 return snprintf(buf
, 20, "%u\n", msecs
);
112 ssize_t
ide_park_store(struct device
*dev
, struct device_attribute
*attr
,
113 const char *buf
, size_t len
)
115 #define MAX_PARK_TIMEOUT 30000
116 ide_drive_t
*drive
= to_ide_device(dev
);
120 rc
= strict_strtol(buf
, 10, &input
);
121 if (rc
|| input
< -2)
123 if (input
> MAX_PARK_TIMEOUT
) {
124 input
= MAX_PARK_TIMEOUT
;
128 mutex_lock(&ide_setting_mtx
);
130 if (drive
->dev_flags
& IDE_DFLAG_NO_UNLOAD
)
132 else if (input
|| drive
->dev_flags
& IDE_DFLAG_PARKED
)
133 issue_park_cmd(drive
, msecs_to_jiffies(input
));
135 if (drive
->media
== ide_disk
)
138 drive
->dev_flags
&= ~IDE_DFLAG_NO_UNLOAD
;
141 drive
->dev_flags
|= IDE_DFLAG_NO_UNLOAD
;
147 mutex_unlock(&ide_setting_mtx
);
149 return rc
? rc
: len
;
This page took 0.062541 seconds and 5 git commands to generate.