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