From: Richard Purdie Add an LED trigger for IDE disk activity to the ide-disk driver. Signed-off-by: Richard Purdie Cc: Russell King Cc: Bartlomiej Zolnierkiewicz Signed-off-by: Andrew Morton --- drivers/ide/ide-disk.c | 22 +++++++++++++++++++--- 1 files changed, 19 insertions(+), 3 deletions(-) diff -puN drivers/ide/ide-disk.c~led-add-ide-disk-activity-led-trigger drivers/ide/ide-disk.c --- devel/drivers/ide/ide-disk.c~led-add-ide-disk-activity-led-trigger 2006-02-10 02:18:06.000000000 -0800 +++ devel-akpm/drivers/ide/ide-disk.c 2006-02-10 02:19:15.000000000 -0800 @@ -61,6 +61,7 @@ #include #include #include +#include #define _IDE_DISK @@ -81,6 +82,8 @@ struct ide_disk_obj { static DEFINE_MUTEX(idedisk_ref_mutex); +DEFINE_LED_TRIGGER(ide_led_trigger); + #define to_ide_disk(obj) container_of(obj, struct ide_disk_obj, kref) #define ide_disk_g(disk) \ @@ -299,6 +302,13 @@ static ide_startstop_t __ide_do_rw_disk( } } +static int ide_end_rw_disk(ide_drive_t *drive, int uptodate, int nr_sectors) +{ + if (blk_fs_request(HWGROUP(drive)->rq)) + led_trigger_event(ide_led_trigger, LED_OFF); + return ide_end_request(drive, uptodate, nr_sectors); +} + /* * 268435455 == 137439 MB or 28bit limit * 320173056 == 163929 MB or 48bit addressing @@ -313,10 +323,12 @@ static ide_startstop_t ide_do_rw_disk (i if (!blk_fs_request(rq)) { blk_dump_rq_flags(rq, "ide_do_rw_disk - bad command"); - ide_end_request(drive, 0, 0); + ide_end_rw_disk(drive, 0, 0); return ide_stopped; } + led_trigger_event(ide_led_trigger, LED_FULL); + pr_debug("%s: %sing: block=%llu, sectors=%lu, buffer=0x%08lx\n", drive->name, rq_data_dir(rq) == READ ? "read" : "writ", (unsigned long long)block, rq->nr_sectors, @@ -1064,7 +1076,7 @@ static ide_driver_t idedisk_driver = { .media = ide_disk, .supports_dsc_overlap = 0, .do_request = ide_do_rw_disk, - .end_request = ide_end_request, + .end_request = ide_end_rw_disk, .error = __ide_error, .abort = __ide_abort, .proc = idedisk_proc, @@ -1237,12 +1249,16 @@ failed: static void __exit idedisk_exit (void) { + led_trigger_unregister_simple(ide_led_trigger); driver_unregister(&idedisk_driver.gen_driver); } static int __init idedisk_init(void) { - return driver_register(&idedisk_driver.gen_driver); + int ret = driver_register(&idedisk_driver.gen_driver); + if (ret >= 0) + led_trigger_register_simple("ide-disk", &ide_led_trigger); + return ret; } MODULE_ALIAS("ide:*m-disk*"); _