1 #ifndef MMC_QUEUE_H 2 #define MMC_QUEUE_H 3 4 #define MMC_REQ_SPECIAL_MASK (REQ_DISCARD | REQ_FLUSH) 5 6 struct request; 7 struct task_struct; 8 9 struct 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 18 enum 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 26 struct mmc_packed { 27 struct list_head list; 28 __le32 cmd_hdr[1024]; 29 unsigned int blocks; 30 u8 nr_entries; 31 u8 retries; 32 s16 idx_failure; 33 }; 34 35 struct 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 47 struct 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 #ifdef CONFIG_MMC_SIMULATE_MAX_SPEED 62 atomic_t max_write_speed; 63 atomic_t max_read_speed; 64 atomic_t cache_size; 65 /* i/o tracking */ 66 atomic_long_t cache_used; 67 unsigned long cache_jiffies; 68 #endif 69 }; 70 71 extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *, 72 const char *); 73 extern void mmc_cleanup_queue(struct mmc_queue *); 74 extern void mmc_queue_suspend(struct mmc_queue *); 75 extern void mmc_queue_resume(struct mmc_queue *); 76 77 extern unsigned int mmc_queue_map_sg(struct mmc_queue *, 78 struct mmc_queue_req *); 79 extern void mmc_queue_bounce_pre(struct mmc_queue_req *); 80 extern void mmc_queue_bounce_post(struct mmc_queue_req *); 81 82 extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *); 83 extern void mmc_packed_clean(struct mmc_queue *); 84 85 extern int mmc_access_rpmb(struct mmc_queue *); 86 87 #endif 88