diff options
Diffstat (limited to 'drivers/mmc/core/queue.c')
| -rw-r--r-- | drivers/mmc/core/queue.c | 120 | 
1 files changed, 9 insertions, 111 deletions
| diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c index affa7370ba82..0a4e77a5ba33 100644 --- a/drivers/mmc/core/queue.c +++ b/drivers/mmc/core/queue.c @@ -23,8 +23,6 @@  #include "core.h"  #include "card.h" -#define MMC_QUEUE_BOUNCESZ	65536 -  /*   * Prepare a MMC request. This just filters out odd stuff.   */ @@ -150,26 +148,6 @@ static void mmc_queue_setup_discard(struct request_queue *q,  		queue_flag_set_unlocked(QUEUE_FLAG_SECERASE, q);  } -static unsigned int mmc_queue_calc_bouncesz(struct mmc_host *host) -{ -	unsigned int bouncesz = MMC_QUEUE_BOUNCESZ; - -	if (host->max_segs != 1 || (host->caps & MMC_CAP_NO_BOUNCE_BUFF)) -		return 0; - -	if (bouncesz > host->max_req_size) -		bouncesz = host->max_req_size; -	if (bouncesz > host->max_seg_size) -		bouncesz = host->max_seg_size; -	if (bouncesz > host->max_blk_count * 512) -		bouncesz = host->max_blk_count * 512; - -	if (bouncesz <= 512) -		return 0; - -	return bouncesz; -} -  /**   * mmc_init_request() - initialize the MMC-specific per-request data   * @q: the request queue @@ -184,26 +162,9 @@ static int mmc_init_request(struct request_queue *q, struct request *req,  	struct mmc_card *card = mq->card;  	struct mmc_host *host = card->host; -	if (card->bouncesz) { -		mq_rq->bounce_buf = kmalloc(card->bouncesz, gfp); -		if (!mq_rq->bounce_buf) -			return -ENOMEM; -		if (card->bouncesz > 512) { -			mq_rq->sg = mmc_alloc_sg(1, gfp); -			if (!mq_rq->sg) -				return -ENOMEM; -			mq_rq->bounce_sg = mmc_alloc_sg(card->bouncesz / 512, -							gfp); -			if (!mq_rq->bounce_sg) -				return -ENOMEM; -		} -	} else { -		mq_rq->bounce_buf = NULL; -		mq_rq->bounce_sg = NULL; -		mq_rq->sg = mmc_alloc_sg(host->max_segs, gfp); -		if (!mq_rq->sg) -			return -ENOMEM; -	} +	mq_rq->sg = mmc_alloc_sg(host->max_segs, gfp); +	if (!mq_rq->sg) +		return -ENOMEM;  	return 0;  } @@ -212,13 +173,6 @@ static void mmc_exit_request(struct request_queue *q, struct request *req)  {  	struct mmc_queue_req *mq_rq = req_to_mmc_queue_req(req); -	/* It is OK to kfree(NULL) so this will be smooth */ -	kfree(mq_rq->bounce_sg); -	mq_rq->bounce_sg = NULL; - -	kfree(mq_rq->bounce_buf); -	mq_rq->bounce_buf = NULL; -  	kfree(mq_rq->sg);  	mq_rq->sg = NULL;  } @@ -265,18 +219,11 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card,  	if (mmc_can_erase(card))  		mmc_queue_setup_discard(mq->queue, card); -	card->bouncesz = mmc_queue_calc_bouncesz(host); -	if (card->bouncesz) { -		blk_queue_max_hw_sectors(mq->queue, card->bouncesz / 512); -		blk_queue_max_segments(mq->queue, card->bouncesz / 512); -		blk_queue_max_segment_size(mq->queue, card->bouncesz); -	} else { -		blk_queue_bounce_limit(mq->queue, limit); -		blk_queue_max_hw_sectors(mq->queue, -			min(host->max_blk_count, host->max_req_size / 512)); -		blk_queue_max_segments(mq->queue, host->max_segs); -		blk_queue_max_segment_size(mq->queue, host->max_seg_size); -	} +	blk_queue_bounce_limit(mq->queue, limit); +	blk_queue_max_hw_sectors(mq->queue, +		min(host->max_blk_count, host->max_req_size / 512)); +	blk_queue_max_segments(mq->queue, host->max_segs); +	blk_queue_max_segment_size(mq->queue, host->max_seg_size);  	sema_init(&mq->thread_sem, 1); @@ -365,56 +312,7 @@ void mmc_queue_resume(struct mmc_queue *mq)   */  unsigned int mmc_queue_map_sg(struct mmc_queue *mq, struct mmc_queue_req *mqrq)  { -	unsigned int sg_len; -	size_t buflen; -	struct scatterlist *sg;  	struct request *req = mmc_queue_req_to_req(mqrq); -	int i; - -	if (!mqrq->bounce_buf) -		return blk_rq_map_sg(mq->queue, req, mqrq->sg); - -	sg_len = blk_rq_map_sg(mq->queue, req, mqrq->bounce_sg); - -	mqrq->bounce_sg_len = sg_len; - -	buflen = 0; -	for_each_sg(mqrq->bounce_sg, sg, sg_len, i) -		buflen += sg->length; - -	sg_init_one(mqrq->sg, mqrq->bounce_buf, buflen); - -	return 1; -} - -/* - * If writing, bounce the data to the buffer before the request - * is sent to the host driver - */ -void mmc_queue_bounce_pre(struct mmc_queue_req *mqrq) -{ -	if (!mqrq->bounce_buf) -		return; - -	if (rq_data_dir(mmc_queue_req_to_req(mqrq)) != WRITE) -		return; - -	sg_copy_to_buffer(mqrq->bounce_sg, mqrq->bounce_sg_len, -		mqrq->bounce_buf, mqrq->sg[0].length); -} - -/* - * If reading, bounce the data from the buffer after the request - * has been handled by the host driver - */ -void mmc_queue_bounce_post(struct mmc_queue_req *mqrq) -{ -	if (!mqrq->bounce_buf) -		return; - -	if (rq_data_dir(mmc_queue_req_to_req(mqrq)) != READ) -		return; -	sg_copy_from_buffer(mqrq->bounce_sg, mqrq->bounce_sg_len, -		mqrq->bounce_buf, mqrq->sg[0].length); +	return blk_rq_map_sg(mq->queue, req, mqrq->sg);  } |