forked from Minki/linux
leds: Extends disk trigger for reads and writes
This adds two new disk triggers for triggering on reads and writes respectively, named "disk-read" and "disk-write". The use case comes from working on the D-Link DNS-313 NAS box. This features an RGB LED for disk activity. with these two triggers I can couple the green LED to read activity and the red LED to write activity, which gives the appropriate user feedback about what is happening on the disk. When tested it gave exactly the feedback desired. The in-kernel interface is simply changed to pass a bool indicating if the activity is write activity and update each trigger (and the composite "disk-activity" trigger) depending on what is passed in. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Acked-by: Pavel Machek <pavel@ucw.cz> Acked-by: Tejun Heo <tj@kernel.org> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
This commit is contained in:
parent
2dd1ea5b8a
commit
d1ed7c5586
@ -5219,7 +5219,7 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
|
|||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
|
|
||||||
/* Trigger the LED (if available) */
|
/* Trigger the LED (if available) */
|
||||||
ledtrig_disk_activity();
|
ledtrig_disk_activity(!!(qc->tf.flags & ATA_TFLAG_WRITE));
|
||||||
|
|
||||||
/* XXX: New EH and old EH use different mechanisms to
|
/* XXX: New EH and old EH use different mechanisms to
|
||||||
* synchronize EH with regular execution path.
|
* synchronize EH with regular execution path.
|
||||||
|
@ -187,7 +187,7 @@ static ide_startstop_t ide_do_rw_disk(ide_drive_t *drive, struct request *rq,
|
|||||||
BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED);
|
BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED);
|
||||||
BUG_ON(blk_rq_is_passthrough(rq));
|
BUG_ON(blk_rq_is_passthrough(rq));
|
||||||
|
|
||||||
ledtrig_disk_activity();
|
ledtrig_disk_activity(rq_data_dir(rq) == WRITE);
|
||||||
|
|
||||||
pr_debug("%s: %sing: block=%llu, sectors=%u\n",
|
pr_debug("%s: %sing: block=%llu, sectors=%u\n",
|
||||||
drive->name, rq_data_dir(rq) == READ ? "read" : "writ",
|
drive->name, rq_data_dir(rq) == READ ? "read" : "writ",
|
||||||
|
@ -18,9 +18,11 @@
|
|||||||
#define BLINK_DELAY 30
|
#define BLINK_DELAY 30
|
||||||
|
|
||||||
DEFINE_LED_TRIGGER(ledtrig_disk);
|
DEFINE_LED_TRIGGER(ledtrig_disk);
|
||||||
|
DEFINE_LED_TRIGGER(ledtrig_disk_read);
|
||||||
|
DEFINE_LED_TRIGGER(ledtrig_disk_write);
|
||||||
DEFINE_LED_TRIGGER(ledtrig_ide);
|
DEFINE_LED_TRIGGER(ledtrig_ide);
|
||||||
|
|
||||||
void ledtrig_disk_activity(void)
|
void ledtrig_disk_activity(bool write)
|
||||||
{
|
{
|
||||||
unsigned long blink_delay = BLINK_DELAY;
|
unsigned long blink_delay = BLINK_DELAY;
|
||||||
|
|
||||||
@ -28,12 +30,20 @@ void ledtrig_disk_activity(void)
|
|||||||
&blink_delay, &blink_delay, 0);
|
&blink_delay, &blink_delay, 0);
|
||||||
led_trigger_blink_oneshot(ledtrig_ide,
|
led_trigger_blink_oneshot(ledtrig_ide,
|
||||||
&blink_delay, &blink_delay, 0);
|
&blink_delay, &blink_delay, 0);
|
||||||
|
if (write)
|
||||||
|
led_trigger_blink_oneshot(ledtrig_disk_write,
|
||||||
|
&blink_delay, &blink_delay, 0);
|
||||||
|
else
|
||||||
|
led_trigger_blink_oneshot(ledtrig_disk_read,
|
||||||
|
&blink_delay, &blink_delay, 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ledtrig_disk_activity);
|
EXPORT_SYMBOL(ledtrig_disk_activity);
|
||||||
|
|
||||||
static int __init ledtrig_disk_init(void)
|
static int __init ledtrig_disk_init(void)
|
||||||
{
|
{
|
||||||
led_trigger_register_simple("disk-activity", &ledtrig_disk);
|
led_trigger_register_simple("disk-activity", &ledtrig_disk);
|
||||||
|
led_trigger_register_simple("disk-read", &ledtrig_disk_read);
|
||||||
|
led_trigger_register_simple("disk-write", &ledtrig_disk_write);
|
||||||
led_trigger_register_simple("ide-disk", &ledtrig_ide);
|
led_trigger_register_simple("ide-disk", &ledtrig_ide);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -346,9 +346,9 @@ static inline void *led_get_trigger_data(struct led_classdev *led_cdev)
|
|||||||
|
|
||||||
/* Trigger specific functions */
|
/* Trigger specific functions */
|
||||||
#ifdef CONFIG_LEDS_TRIGGER_DISK
|
#ifdef CONFIG_LEDS_TRIGGER_DISK
|
||||||
extern void ledtrig_disk_activity(void);
|
extern void ledtrig_disk_activity(bool write);
|
||||||
#else
|
#else
|
||||||
static inline void ledtrig_disk_activity(void) {}
|
static inline void ledtrig_disk_activity(bool write) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_LEDS_TRIGGER_MTD
|
#ifdef CONFIG_LEDS_TRIGGER_MTD
|
||||||
|
Loading…
Reference in New Issue
Block a user