blob: bf7a95b10c766ea3822a3adfdd720548021a97df [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef MMC_QUEUE_H
2#define MMC_QUEUE_H
3
Mike Christiec2df40d2016-06-05 14:32:17 -05004static inline bool mmc_req_is_special(struct request *req)
5{
Mike Christie3a5e02c2016-06-05 14:32:23 -05006 return req &&
Adrian Hunter7afafc82016-08-16 10:59:35 +03007 (req_op(req) == REQ_OP_FLUSH ||
8 req_op(req) == REQ_OP_DISCARD ||
9 req_op(req) == REQ_OP_SECURE_ERASE);
Mike Christiec2df40d2016-06-05 14:32:17 -050010}
Seungwon Jeonef3a69c72013-03-14 15:17:13 +090011
Linus Torvalds1da177e2005-04-16 15:20:36 -070012struct request;
13struct task_struct;
14
Per Forlin97868a22011-07-09 17:12:36 -040015struct mmc_blk_request {
16 struct mmc_request mrq;
17 struct mmc_command sbc;
18 struct mmc_command cmd;
19 struct mmc_command stop;
20 struct mmc_data data;
Adrian Hunterb8360a42015-05-07 13:10:24 +030021 int retune_retry_done;
Per Forlin97868a22011-07-09 17:12:36 -040022};
23
Seungwon Jeonce39f9d2013-02-06 17:02:46 +090024enum mmc_packed_type {
25 MMC_PACKED_NONE = 0,
26 MMC_PACKED_WRITE,
27};
28
29#define mmc_packed_cmd(type) ((type) != MMC_PACKED_NONE)
30#define mmc_packed_wr(type) ((type) == MMC_PACKED_WRITE)
31
32struct mmc_packed {
33 struct list_head list;
Jiri Slaby3f2d2662016-10-03 10:58:28 +020034 __le32 cmd_hdr[1024];
Seungwon Jeonce39f9d2013-02-06 17:02:46 +090035 unsigned int blocks;
36 u8 nr_entries;
37 u8 retries;
38 s16 idx_failure;
39};
40
Per Forlin97868a22011-07-09 17:12:36 -040041struct mmc_queue_req {
42 struct request *req;
43 struct mmc_blk_request brq;
44 struct scatterlist *sg;
45 char *bounce_buf;
46 struct scatterlist *bounce_sg;
47 unsigned int bounce_sg_len;
Per Forlinee8a43a2011-07-01 18:55:33 +020048 struct mmc_async_req mmc_active;
Seungwon Jeonce39f9d2013-02-06 17:02:46 +090049 enum mmc_packed_type cmd_type;
50 struct mmc_packed *packed;
Venkat Gopalakrishnane95d7bf2015-05-29 16:51:43 -070051 struct mmc_cmdq_req cmdq_req;
Per Forlin97868a22011-07-09 17:12:36 -040052};
53
Linus Torvalds1da177e2005-04-16 15:20:36 -070054struct mmc_queue {
55 struct mmc_card *card;
Christoph Hellwig87598a22006-11-13 20:23:52 +010056 struct task_struct *thread;
Linus Torvalds1da177e2005-04-16 15:20:36 -070057 struct semaphore thread_sem;
Sujit Reddy Thumma55291992014-12-09 20:40:16 +020058 unsigned long flags;
59#define MMC_QUEUE_SUSPENDED 0
60#define MMC_QUEUE_NEW_REQUEST 1
Asutosh Das963469b2015-05-21 13:29:51 +053061 int (*issue_fn)(struct mmc_queue *, struct request *);
62 int (*cmdq_issue_fn)(struct mmc_queue *,
63 struct request *);
64 void (*cmdq_complete_fn)(struct request *);
Asutosh Das02e30862015-05-20 16:52:04 +053065 void (*cmdq_error_fn)(struct mmc_queue *);
Asutosh Dasfa8836b2015-03-02 23:14:05 +053066 enum blk_eh_timer_return (*cmdq_req_timed_out)(struct request *);
Linus Torvalds1da177e2005-04-16 15:20:36 -070067 void *data;
68 struct request_queue *queue;
Per Forlin04296b72011-07-01 18:55:31 +020069 struct mmc_queue_req mqrq[2];
Per Forlin97868a22011-07-09 17:12:36 -040070 struct mmc_queue_req *mqrq_cur;
Per Forlin04296b72011-07-01 18:55:31 +020071 struct mmc_queue_req *mqrq_prev;
Asutosh Das963469b2015-05-21 13:29:51 +053072 struct mmc_queue_req *mqrq_cmdq;
Tatyana Brokhmanc879b062014-12-03 23:38:06 +020073 bool wr_packing_enabled;
74 int num_of_potential_packed_wr_reqs;
75 int num_wr_reqs_to_start_packing;
Maya Erez5a8dae12014-12-04 15:13:59 +020076 bool no_pack_for_random;
Asutosh Das02e30862015-05-20 16:52:04 +053077 struct work_struct cmdq_err_work;
78
Asutosh Dasd72115d62015-06-22 11:09:00 +053079 struct completion cmdq_pending_req_done;
Ritesh Harjani7a610872016-02-15 14:20:21 +053080 struct completion cmdq_shutdown_complete;
Subhash Jadavani987144c2015-08-12 17:53:21 -070081 struct request *cmdq_req_peeked;
Tatyana Brokhman71aefb82012-10-09 13:50:56 +020082 int (*err_check_fn)(struct mmc_card *, struct mmc_async_req *);
83 void (*packed_test_fn)(struct request_queue *, struct mmc_queue_req *);
Asutosh Dasa0ba4922015-04-23 16:01:57 +053084 void (*cmdq_shutdown)(struct mmc_queue *);
Mark Salyzyn6904e432016-01-28 11:12:25 -080085#ifdef CONFIG_MMC_SIMULATE_MAX_SPEED
86 atomic_t max_write_speed;
87 atomic_t max_read_speed;
88 atomic_t cache_size;
89 /* i/o tracking */
90 atomic_long_t cache_used;
91 unsigned long cache_jiffies;
92#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070093};
94
Adrian Hunterd09408a2011-06-23 13:40:28 +030095extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *,
Asutosh Das963469b2015-05-21 13:29:51 +053096 const char *, int);
Linus Torvalds1da177e2005-04-16 15:20:36 -070097extern void mmc_cleanup_queue(struct mmc_queue *);
Subhash Jadavani4893b392013-06-20 18:15:50 +053098extern int mmc_queue_suspend(struct mmc_queue *, int);
Linus Torvalds1da177e2005-04-16 15:20:36 -070099extern void mmc_queue_resume(struct mmc_queue *);
100
Per Forlin97868a22011-07-09 17:12:36 -0400101extern unsigned int mmc_queue_map_sg(struct mmc_queue *,
102 struct mmc_queue_req *);
103extern void mmc_queue_bounce_pre(struct mmc_queue_req *);
104extern void mmc_queue_bounce_post(struct mmc_queue_req *);
Pierre Ossman98ccf142007-05-12 00:26:16 +0200105
Seungwon Jeonce39f9d2013-02-06 17:02:46 +0900106extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *);
107extern void mmc_packed_clean(struct mmc_queue *);
108
Chuanxiao Dong4e93b9a2014-08-12 12:01:30 +0800109extern int mmc_access_rpmb(struct mmc_queue *);
110
Tatyana Brokhman71aefb82012-10-09 13:50:56 +0200111extern void print_mmc_packing_stats(struct mmc_card *card);
112
Asutosh Das963469b2015-05-21 13:29:51 +0530113extern int mmc_cmdq_init(struct mmc_queue *mq, struct mmc_card *card);
114extern void mmc_cmdq_clean(struct mmc_queue *mq, struct mmc_card *card);
115
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116#endif