 ee8a43a51c
			
		
	
	
	ee8a43a51c
	
	
	
		
			
			Change mmc_blk_issue_rw_rq() to become asynchronous. The execution flow looks like this: * The mmc-queue calls issue_rw_rq(), which sends the request to the host and returns back to the mmc-queue. * The mmc-queue calls issue_rw_rq() again with a new request. * This new request is prepared in issue_rw_rq(), then it waits for the active request to complete before pushing it to the host. * When the mmc-queue is empty it will call issue_rw_rq() with a NULL req to finish off the active request without starting a new request. Signed-off-by: Per Forlin <per.forlin@linaro.org> Acked-by: Kyungmin Park <kyungmin.park@samsung.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Venkatraman S <svenkatr@ti.com> Tested-by: Sourav Poddar <sourav.poddar@ti.com> Tested-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Chris Ball <cjb@laptop.org>
		
			
				
	
	
		
			49 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef MMC_QUEUE_H
 | |
| #define MMC_QUEUE_H
 | |
| 
 | |
| struct request;
 | |
| struct task_struct;
 | |
| 
 | |
| struct mmc_blk_request {
 | |
| 	struct mmc_request	mrq;
 | |
| 	struct mmc_command	sbc;
 | |
| 	struct mmc_command	cmd;
 | |
| 	struct mmc_command	stop;
 | |
| 	struct mmc_data		data;
 | |
| };
 | |
| 
 | |
| struct mmc_queue_req {
 | |
| 	struct request		*req;
 | |
| 	struct mmc_blk_request	brq;
 | |
| 	struct scatterlist	*sg;
 | |
| 	char			*bounce_buf;
 | |
| 	struct scatterlist	*bounce_sg;
 | |
| 	unsigned int		bounce_sg_len;
 | |
| 	struct mmc_async_req	mmc_active;
 | |
| };
 | |
| 
 | |
| struct mmc_queue {
 | |
| 	struct mmc_card		*card;
 | |
| 	struct task_struct	*thread;
 | |
| 	struct semaphore	thread_sem;
 | |
| 	unsigned int		flags;
 | |
| 	int			(*issue_fn)(struct mmc_queue *, struct request *);
 | |
| 	void			*data;
 | |
| 	struct request_queue	*queue;
 | |
| 	struct mmc_queue_req	mqrq[2];
 | |
| 	struct mmc_queue_req	*mqrq_cur;
 | |
| 	struct mmc_queue_req	*mqrq_prev;
 | |
| };
 | |
| 
 | |
| extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *,
 | |
| 			  const char *);
 | |
| extern void mmc_cleanup_queue(struct mmc_queue *);
 | |
| extern void mmc_queue_suspend(struct mmc_queue *);
 | |
| extern void mmc_queue_resume(struct mmc_queue *);
 | |
| 
 | |
| extern unsigned int mmc_queue_map_sg(struct mmc_queue *,
 | |
| 				     struct mmc_queue_req *);
 | |
| extern void mmc_queue_bounce_pre(struct mmc_queue_req *);
 | |
| extern void mmc_queue_bounce_post(struct mmc_queue_req *);
 | |
| 
 | |
| #endif
 |