1 #ifndef MMC_QUEUE_H 2 #define MMC_QUEUE_H 3 4 #include <linux/types.h> 5 #include <linux/blkdev.h> 6 #include <linux/blk-mq.h> 7 #include <linux/mmc/core.h> 8 #include <linux/mmc/host.h> 9 10 static inline struct mmc_queue_req *req_to_mmc_queue_req(struct request *rq) 11 { 12 return blk_mq_rq_to_pdu(rq); 13 } 14 15 struct mmc_queue_req; 16 17 static inline struct request *mmc_queue_req_to_req(struct mmc_queue_req *mqr) 18 { 19 return blk_mq_rq_from_pdu(mqr); 20 } 21 22 struct task_struct; 23 struct mmc_blk_data; 24 struct mmc_blk_ioc_data; 25 26 struct mmc_blk_request { 27 struct mmc_request mrq; 28 struct mmc_command sbc; 29 struct mmc_command cmd; 30 struct mmc_command stop; 31 struct mmc_data data; 32 int retune_retry_done; 33 }; 34 35 /** 36 * enum mmc_drv_op - enumerates the operations in the mmc_queue_req 37 * @MMC_DRV_OP_IOCTL: ioctl operation 38 * @MMC_DRV_OP_BOOT_WP: write protect boot partitions 39 */ 40 enum mmc_drv_op { 41 MMC_DRV_OP_IOCTL, 42 MMC_DRV_OP_BOOT_WP, 43 }; 44 45 struct mmc_queue_req { 46 struct mmc_blk_request brq; 47 struct scatterlist *sg; 48 char *bounce_buf; 49 struct scatterlist *bounce_sg; 50 unsigned int bounce_sg_len; 51 struct mmc_async_req areq; 52 enum mmc_drv_op drv_op; 53 int drv_op_result; 54 struct mmc_blk_ioc_data **idata; 55 unsigned int ioc_count; 56 }; 57 58 struct mmc_queue { 59 struct mmc_card *card; 60 struct task_struct *thread; 61 struct semaphore thread_sem; 62 bool suspended; 63 bool asleep; 64 struct mmc_blk_data *blkdata; 65 struct request_queue *queue; 66 /* 67 * FIXME: this counter is not a very reliable way of keeping 68 * track of how many requests that are ongoing. Switch to just 69 * letting the block core keep track of requests and per-request 70 * associated mmc_queue_req data. 71 */ 72 int qcnt; 73 }; 74 75 extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *, 76 const char *); 77 extern void mmc_cleanup_queue(struct mmc_queue *); 78 extern void mmc_queue_suspend(struct mmc_queue *); 79 extern void mmc_queue_resume(struct mmc_queue *); 80 81 extern unsigned int mmc_queue_map_sg(struct mmc_queue *, 82 struct mmc_queue_req *); 83 extern void mmc_queue_bounce_pre(struct mmc_queue_req *); 84 extern void mmc_queue_bounce_post(struct mmc_queue_req *); 85 86 extern int mmc_access_rpmb(struct mmc_queue *); 87 88 #endif 89