]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/mmc/core/queue.h
Merge tag 'nfs-for-4.13-2' of git://git.linux-nfs.org/projects/anna/linux-nfs
[karo-tx-linux.git] / drivers / mmc / core / queue.h
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