summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Axboe <axboe@suse.de>2003-08-31 20:18:28 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-08-31 20:18:28 -0700
commit62523467a77306d251a9d8855acbc7f002a9d01b (patch)
tree79d1cf6d16835503107fdc812368190d07179cab
parent3e1716972de659cda34d97fa2097326c0b08add4 (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.c11
-rw-r--r--include/linux/blkdev.h5
-rw-r--r--include/linux/ide.h2
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;
/*