Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef MMC_QUEUE_H |
| 2 | #define MMC_QUEUE_H |
| 3 | |
Mike Christie | c2df40d | 2016-06-05 14:32:17 -0500 | [diff] [blame] | 4 | static inline bool mmc_req_is_special(struct request *req) |
| 5 | { |
Mike Christie | 3a5e02c | 2016-06-05 14:32:23 -0500 | [diff] [blame] | 6 | return req && |
Adrian Hunter | 7afafc8 | 2016-08-16 10:59:35 +0300 | [diff] [blame] | 7 | (req_op(req) == REQ_OP_FLUSH || |
| 8 | req_op(req) == REQ_OP_DISCARD || |
| 9 | req_op(req) == REQ_OP_SECURE_ERASE); |
Mike Christie | c2df40d | 2016-06-05 14:32:17 -0500 | [diff] [blame] | 10 | } |
Seungwon Jeon | ef3a69c7 | 2013-03-14 15:17:13 +0900 | [diff] [blame] | 11 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 12 | struct request; |
| 13 | struct task_struct; |
| 14 | |
Per Forlin | 97868a2 | 2011-07-09 17:12:36 -0400 | [diff] [blame] | 15 | struct 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 Hunter | b8360a4 | 2015-05-07 13:10:24 +0300 | [diff] [blame] | 21 | int retune_retry_done; |
Per Forlin | 97868a2 | 2011-07-09 17:12:36 -0400 | [diff] [blame] | 22 | }; |
| 23 | |
Seungwon Jeon | ce39f9d | 2013-02-06 17:02:46 +0900 | [diff] [blame] | 24 | enum 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 | |
| 32 | struct mmc_packed { |
| 33 | struct list_head list; |
Jiri Slaby | 3f2d266 | 2016-10-03 10:58:28 +0200 | [diff] [blame] | 34 | __le32 cmd_hdr[1024]; |
Seungwon Jeon | ce39f9d | 2013-02-06 17:02:46 +0900 | [diff] [blame] | 35 | unsigned int blocks; |
| 36 | u8 nr_entries; |
| 37 | u8 retries; |
| 38 | s16 idx_failure; |
| 39 | }; |
| 40 | |
Per Forlin | 97868a2 | 2011-07-09 17:12:36 -0400 | [diff] [blame] | 41 | struct 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 Forlin | ee8a43a | 2011-07-01 18:55:33 +0200 | [diff] [blame] | 48 | struct mmc_async_req mmc_active; |
Seungwon Jeon | ce39f9d | 2013-02-06 17:02:46 +0900 | [diff] [blame] | 49 | enum mmc_packed_type cmd_type; |
| 50 | struct mmc_packed *packed; |
Venkat Gopalakrishnan | e95d7bf | 2015-05-29 16:51:43 -0700 | [diff] [blame] | 51 | struct mmc_cmdq_req cmdq_req; |
Per Forlin | 97868a2 | 2011-07-09 17:12:36 -0400 | [diff] [blame] | 52 | }; |
| 53 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 54 | struct mmc_queue { |
| 55 | struct mmc_card *card; |
Christoph Hellwig | 87598a2 | 2006-11-13 20:23:52 +0100 | [diff] [blame] | 56 | struct task_struct *thread; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 57 | struct semaphore thread_sem; |
Sujit Reddy Thumma | 5529199 | 2014-12-09 20:40:16 +0200 | [diff] [blame] | 58 | unsigned long flags; |
| 59 | #define MMC_QUEUE_SUSPENDED 0 |
| 60 | #define MMC_QUEUE_NEW_REQUEST 1 |
Asutosh Das | 963469b | 2015-05-21 13:29:51 +0530 | [diff] [blame] | 61 | 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 Das | 02e3086 | 2015-05-20 16:52:04 +0530 | [diff] [blame] | 65 | void (*cmdq_error_fn)(struct mmc_queue *); |
Asutosh Das | fa8836b | 2015-03-02 23:14:05 +0530 | [diff] [blame] | 66 | enum blk_eh_timer_return (*cmdq_req_timed_out)(struct request *); |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 67 | void *data; |
| 68 | struct request_queue *queue; |
Per Forlin | 04296b7 | 2011-07-01 18:55:31 +0200 | [diff] [blame] | 69 | struct mmc_queue_req mqrq[2]; |
Per Forlin | 97868a2 | 2011-07-09 17:12:36 -0400 | [diff] [blame] | 70 | struct mmc_queue_req *mqrq_cur; |
Per Forlin | 04296b7 | 2011-07-01 18:55:31 +0200 | [diff] [blame] | 71 | struct mmc_queue_req *mqrq_prev; |
Asutosh Das | 963469b | 2015-05-21 13:29:51 +0530 | [diff] [blame] | 72 | struct mmc_queue_req *mqrq_cmdq; |
Tatyana Brokhman | c879b06 | 2014-12-03 23:38:06 +0200 | [diff] [blame] | 73 | bool wr_packing_enabled; |
| 74 | int num_of_potential_packed_wr_reqs; |
| 75 | int num_wr_reqs_to_start_packing; |
Maya Erez | 5a8dae1 | 2014-12-04 15:13:59 +0200 | [diff] [blame] | 76 | bool no_pack_for_random; |
Asutosh Das | 02e3086 | 2015-05-20 16:52:04 +0530 | [diff] [blame] | 77 | struct work_struct cmdq_err_work; |
| 78 | |
Asutosh Das | d72115d6 | 2015-06-22 11:09:00 +0530 | [diff] [blame] | 79 | struct completion cmdq_pending_req_done; |
Ritesh Harjani | 7a61087 | 2016-02-15 14:20:21 +0530 | [diff] [blame] | 80 | struct completion cmdq_shutdown_complete; |
Subhash Jadavani | 987144c | 2015-08-12 17:53:21 -0700 | [diff] [blame] | 81 | struct request *cmdq_req_peeked; |
Tatyana Brokhman | 71aefb8 | 2012-10-09 13:50:56 +0200 | [diff] [blame] | 82 | int (*err_check_fn)(struct mmc_card *, struct mmc_async_req *); |
| 83 | void (*packed_test_fn)(struct request_queue *, struct mmc_queue_req *); |
Asutosh Das | a0ba492 | 2015-04-23 16:01:57 +0530 | [diff] [blame] | 84 | void (*cmdq_shutdown)(struct mmc_queue *); |
Mark Salyzyn | 6904e43 | 2016-01-28 11:12:25 -0800 | [diff] [blame] | 85 | #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 Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 93 | }; |
| 94 | |
Adrian Hunter | d09408a | 2011-06-23 13:40:28 +0300 | [diff] [blame] | 95 | extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *, |
Asutosh Das | 963469b | 2015-05-21 13:29:51 +0530 | [diff] [blame] | 96 | const char *, int); |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 97 | extern void mmc_cleanup_queue(struct mmc_queue *); |
Subhash Jadavani | 4893b39 | 2013-06-20 18:15:50 +0530 | [diff] [blame] | 98 | extern int mmc_queue_suspend(struct mmc_queue *, int); |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 99 | extern void mmc_queue_resume(struct mmc_queue *); |
| 100 | |
Per Forlin | 97868a2 | 2011-07-09 17:12:36 -0400 | [diff] [blame] | 101 | extern unsigned int mmc_queue_map_sg(struct mmc_queue *, |
| 102 | struct mmc_queue_req *); |
| 103 | extern void mmc_queue_bounce_pre(struct mmc_queue_req *); |
| 104 | extern void mmc_queue_bounce_post(struct mmc_queue_req *); |
Pierre Ossman | 98ccf14 | 2007-05-12 00:26:16 +0200 | [diff] [blame] | 105 | |
Seungwon Jeon | ce39f9d | 2013-02-06 17:02:46 +0900 | [diff] [blame] | 106 | extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *); |
| 107 | extern void mmc_packed_clean(struct mmc_queue *); |
| 108 | |
Chuanxiao Dong | 4e93b9a | 2014-08-12 12:01:30 +0800 | [diff] [blame] | 109 | extern int mmc_access_rpmb(struct mmc_queue *); |
| 110 | |
Tatyana Brokhman | 71aefb8 | 2012-10-09 13:50:56 +0200 | [diff] [blame] | 111 | extern void print_mmc_packing_stats(struct mmc_card *card); |
| 112 | |
Asutosh Das | 963469b | 2015-05-21 13:29:51 +0530 | [diff] [blame] | 113 | extern int mmc_cmdq_init(struct mmc_queue *mq, struct mmc_card *card); |
| 114 | extern void mmc_cmdq_clean(struct mmc_queue *mq, struct mmc_card *card); |
| 115 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 116 | #endif |