1#ifndef MMC_QUEUE_H 2#define MMC_QUEUE_H 3 4#define MMC_REQ_SPECIAL_MASK (REQ_DISCARD | REQ_FLUSH) 5 6struct request; 7struct task_struct; 8 9struct mmc_blk_request { 10 struct mmc_request mrq; 11 struct mmc_command sbc; 12 struct mmc_command cmd; 13 struct mmc_command stop; 14 struct mmc_data data; 15 int retune_retry_done; 16}; 17 18enum mmc_packed_type { 19 MMC_PACKED_NONE = 0, 20 MMC_PACKED_WRITE, 21}; 22 23#define mmc_packed_cmd(type) ((type) != MMC_PACKED_NONE) 24#define mmc_packed_wr(type) ((type) == MMC_PACKED_WRITE) 25 26struct mmc_packed { 27 struct list_head list; 28 u32 cmd_hdr[1024]; 29 unsigned int blocks; 30 u8 nr_entries; 31 u8 retries; 32 s16 idx_failure; 33}; 34 35struct mmc_queue_req { 36 struct request *req; 37 struct mmc_blk_request brq; 38 struct scatterlist *sg; 39 char *bounce_buf; 40 struct scatterlist *bounce_sg; 41 unsigned int bounce_sg_len; 42 struct mmc_async_req mmc_active; 43 enum mmc_packed_type cmd_type; 44 struct mmc_packed *packed; 45}; 46 47struct mmc_queue { 48 struct mmc_card *card; 49 struct task_struct *thread; 50 struct semaphore thread_sem; 51 unsigned int flags; 52#define MMC_QUEUE_SUSPENDED (1 << 0) 53#define MMC_QUEUE_NEW_REQUEST (1 << 1) 54 55 int (*issue_fn)(struct mmc_queue *, struct request *); 56 void *data; 57 struct request_queue *queue; 58 struct mmc_queue_req mqrq[2]; 59 struct mmc_queue_req *mqrq_cur; 60 struct mmc_queue_req *mqrq_prev; 61}; 62 63extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *, 64 const char *); 65extern void mmc_cleanup_queue(struct mmc_queue *); 66extern void mmc_queue_suspend(struct mmc_queue *); 67extern void mmc_queue_resume(struct mmc_queue *); 68 69extern unsigned int mmc_queue_map_sg(struct mmc_queue *, 70 struct mmc_queue_req *); 71extern void mmc_queue_bounce_pre(struct mmc_queue_req *); 72extern void mmc_queue_bounce_post(struct mmc_queue_req *); 73 74extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *); 75extern void mmc_packed_clean(struct mmc_queue *); 76 77extern int mmc_access_rpmb(struct mmc_queue *); 78 79#endif 80