diff options
| author | Jens Axboe <axboe@suse.de> | 2003-08-31 20:18:28 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.osdl.org> | 2003-08-31 20:18:28 -0700 |
| commit | 62523467a77306d251a9d8855acbc7f002a9d01b (patch) | |
| tree | 79d1cf6d16835503107fdc812368190d07179cab | |
| parent | 3e1716972de659cda34d97fa2097326c0b08add4 (diff) | |
[PATCH] software hd led support
This adds support for software controlled hard drive LED activity.
This is really nice on such machines as Apple Powerbooks, where there is
no such LED in the first place and the sleep/suspend LED isn't used for
anything when the machine is running.
| -rw-r--r-- | drivers/block/ll_rw_blk.c | 11 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 5 | ||||
| -rw-r--r-- | include/linux/ide.h | 2 |
3 files changed, 18 insertions, 0 deletions
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c index 98a3182919c5..c6d1d2345db5 100644 --- a/drivers/block/ll_rw_blk.c +++ b/drivers/block/ll_rw_blk.c @@ -136,6 +136,12 @@ struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev) return ret; } +void blk_queue_activity_fn(request_queue_t *q, activity_fn *fn, void *data) +{ + q->activity_fn = fn; + q->activity_data = data; +} + /** * blk_queue_prep_rq - set a prepare_request function for queue * @q: queue @@ -225,6 +231,8 @@ void blk_queue_make_request(request_queue_t * q, make_request_fn * mfn) blk_queue_bounce_limit(q, BLK_BOUNCE_HIGH); INIT_LIST_HEAD(&q->plug_list); + + blk_queue_activity_fn(q, NULL, NULL); } /** @@ -1666,6 +1674,9 @@ static inline void add_request(request_queue_t * q, struct request * req, { drive_stat_acct(req, req->nr_sectors, 1); + if (q->activity_fn) + q->activity_fn(q->activity_data, rq_data_dir(req)); + /* * elevator indicated where it wants this request to be * inserted at elevator_merge time diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index a5c8772b6463..99dbf0d24eaf 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -243,6 +243,7 @@ typedef void (unplug_fn) (void *q); struct bio_vec; typedef int (merge_bvec_fn) (request_queue_t *, struct bio *, struct bio_vec *); +typedef void (activity_fn) (void *data, int rw); enum blk_queue_state { Queue_down, @@ -283,6 +284,7 @@ struct request_queue prep_rq_fn *prep_rq_fn; unplug_fn *unplug_fn; merge_bvec_fn *merge_bvec_fn; + activity_fn *activity_fn; /* * Auto-unplugging state @@ -300,6 +302,8 @@ struct request_queue */ void *queuedata; + void *activity_data; + /* * queue needs bounce pages for pages above this limit */ @@ -504,6 +508,7 @@ extern void blk_start_queue(request_queue_t *q); extern void blk_stop_queue(request_queue_t *q); extern void __blk_stop_queue(request_queue_t *q); extern void blk_run_queue(request_queue_t *q); +extern void blk_queue_activity_fn(request_queue_t *, activity_fn *, void *); static inline request_queue_t *bdev_get_queue(struct block_device *bdev) { diff --git a/include/linux/ide.h b/include/linux/ide.h index a68f7871d3bb..98a1a968ad93 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -1044,6 +1044,8 @@ typedef struct hwif_s { void *hwif_data; /* extra hwif data */ unsigned dma; + + void (*led_act)(void *data, int rw); } ide_hwif_t; /* |
