aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-10 12:30:36 -0500
committerJens Axboe <jens.axboe@oracle.com>2008-01-28 04:54:11 -0500
commitfa0ccd837e3dddb44c7db2f128a8bb7e4eabc21a (patch)
treeade071502f3e7cba423295890d828f0f301ad731 /include/linux
parent5d84070ee0a433620c57e85dac7f82faaec5fbb3 (diff)
block: implement drain buffers
These DMA drain buffer implementations in drivers are pretty horrible to do in terms of manipulating the scatterlist. Plus they're being done at least in drivers/ide and drivers/ata, so we now have code duplication. The one use case for this, as I understand it is AHCI controllers doing PIO mode to mmc devices but translating this to DMA at the controller level. So, what about adding a callback to the block layer that permits the adding of the drain buffer for the problem devices. The idea is that you'd do this in slave_configure after you find one of these devices. The beauty of doing it in the block layer is that it quietly adds the drain buffer to the end of the sg list, so it automatically gets mapped (and unmapped) without anything unusual having to be done to the scatterlist in driver/scsi or drivers/ata and without any alteration to the transfer length. Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/blkdev.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index c7a3ab575c24..e542c8fd9215 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -429,6 +429,8 @@ struct request_queue
429 unsigned int max_segment_size; 429 unsigned int max_segment_size;
430 430
431 unsigned long seg_boundary_mask; 431 unsigned long seg_boundary_mask;
432 void *dma_drain_buffer;
433 unsigned int dma_drain_size;
432 unsigned int dma_alignment; 434 unsigned int dma_alignment;
433 435
434 struct blk_queue_tag *queue_tags; 436 struct blk_queue_tag *queue_tags;
@@ -760,6 +762,8 @@ extern void blk_queue_max_hw_segments(struct request_queue *, unsigned short);
760extern void blk_queue_max_segment_size(struct request_queue *, unsigned int); 762extern void blk_queue_max_segment_size(struct request_queue *, unsigned int);
761extern void blk_queue_hardsect_size(struct request_queue *, unsigned short); 763extern void blk_queue_hardsect_size(struct request_queue *, unsigned short);
762extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b); 764extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b);
765extern int blk_queue_dma_drain(struct request_queue *q, void *buf,
766 unsigned int size);
763extern void blk_queue_segment_boundary(struct request_queue *, unsigned long); 767extern void blk_queue_segment_boundary(struct request_queue *, unsigned long);
764extern void blk_queue_prep_rq(struct request_queue *, prep_rq_fn *pfn); 768extern void blk_queue_prep_rq(struct request_queue *, prep_rq_fn *pfn);
765extern void blk_queue_merge_bvec(struct request_queue *, merge_bvec_fn *); 769extern void blk_queue_merge_bvec(struct request_queue *, merge_bvec_fn *);