2005-04-16 22:20:36 +00:00
|
|
|
#ifndef MMC_QUEUE_H
|
|
|
|
#define MMC_QUEUE_H
|
|
|
|
|
2017-01-13 13:14:07 +00:00
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/blkdev.h>
|
|
|
|
#include <linux/mmc/core.h>
|
|
|
|
#include <linux/mmc/host.h>
|
|
|
|
|
2016-06-05 19:32:17 +00:00
|
|
|
static inline bool mmc_req_is_special(struct request *req)
|
|
|
|
{
|
2016-06-05 19:32:23 +00:00
|
|
|
return req &&
|
2016-08-16 07:59:35 +00:00
|
|
|
(req_op(req) == REQ_OP_FLUSH ||
|
|
|
|
req_op(req) == REQ_OP_DISCARD ||
|
|
|
|
req_op(req) == REQ_OP_SECURE_ERASE);
|
2016-06-05 19:32:17 +00:00
|
|
|
}
|
2013-03-14 06:17:13 +00:00
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
struct task_struct;
|
2016-11-18 12:36:15 +00:00
|
|
|
struct mmc_blk_data;
|
2005-04-16 22:20:36 +00:00
|
|
|
|
2011-07-09 21:12:36 +00:00
|
|
|
struct mmc_blk_request {
|
|
|
|
struct mmc_request mrq;
|
|
|
|
struct mmc_command sbc;
|
|
|
|
struct mmc_command cmd;
|
|
|
|
struct mmc_command stop;
|
|
|
|
struct mmc_data data;
|
2015-05-07 10:10:24 +00:00
|
|
|
int retune_retry_done;
|
2011-07-09 21:12:36 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct mmc_queue_req {
|
|
|
|
struct request *req;
|
|
|
|
struct mmc_blk_request brq;
|
|
|
|
struct scatterlist *sg;
|
|
|
|
char *bounce_buf;
|
|
|
|
struct scatterlist *bounce_sg;
|
|
|
|
unsigned int bounce_sg_len;
|
2011-07-01 16:55:33 +00:00
|
|
|
struct mmc_async_req mmc_active;
|
2011-07-09 21:12:36 +00:00
|
|
|
};
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
struct mmc_queue {
|
|
|
|
struct mmc_card *card;
|
2006-11-13 19:23:52 +00:00
|
|
|
struct task_struct *thread;
|
2005-04-16 22:20:36 +00:00
|
|
|
struct semaphore thread_sem;
|
|
|
|
unsigned int flags;
|
2013-01-14 19:28:17 +00:00
|
|
|
#define MMC_QUEUE_SUSPENDED (1 << 0)
|
|
|
|
#define MMC_QUEUE_NEW_REQUEST (1 << 1)
|
2016-11-29 10:09:10 +00:00
|
|
|
bool asleep;
|
2016-11-18 12:36:15 +00:00
|
|
|
struct mmc_blk_data *blkdata;
|
2005-04-16 22:20:36 +00:00
|
|
|
struct request_queue *queue;
|
2016-11-29 10:09:15 +00:00
|
|
|
struct mmc_queue_req *mqrq;
|
2011-07-09 21:12:36 +00:00
|
|
|
struct mmc_queue_req *mqrq_cur;
|
2011-07-01 16:55:31 +00:00
|
|
|
struct mmc_queue_req *mqrq_prev;
|
2016-11-29 10:09:15 +00:00
|
|
|
int qdepth;
|
2005-04-16 22:20:36 +00:00
|
|
|
};
|
|
|
|
|
2011-06-23 10:40:28 +00:00
|
|
|
extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *,
|
|
|
|
const char *);
|
2005-04-16 22:20:36 +00:00
|
|
|
extern void mmc_cleanup_queue(struct mmc_queue *);
|
|
|
|
extern void mmc_queue_suspend(struct mmc_queue *);
|
|
|
|
extern void mmc_queue_resume(struct mmc_queue *);
|
|
|
|
|
2011-07-09 21:12:36 +00:00
|
|
|
extern unsigned int mmc_queue_map_sg(struct mmc_queue *,
|
|
|
|
struct mmc_queue_req *);
|
|
|
|
extern void mmc_queue_bounce_pre(struct mmc_queue_req *);
|
|
|
|
extern void mmc_queue_bounce_post(struct mmc_queue_req *);
|
2007-05-11 22:26:16 +00:00
|
|
|
|
mmc: card: Don't access RPMB partitions for normal read/write
During kernel boot, it will try to read some logical sectors
of each block device node for the possible partition table.
But since RPMB partition is special and can not be accessed
by normal eMMC read / write CMDs, it will cause below error
messages during kernel boot:
...
mmc0: Got data interrupt 0x00000002 even though no data operation was in progress.
mmcblk0rpmb: error -110 transferring data, sector 0, nr 32, cmd response 0x900, card status 0xb00
mmcblk0rpmb: retrying using single block read
mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
end_request: I/O error, dev mmcblk0rpmb, sector 0
Buffer I/O error on device mmcblk0rpmb, logical block 0
end_request: I/O error, dev mmcblk0rpmb, sector 8
Buffer I/O error on device mmcblk0rpmb, logical block 1
end_request: I/O error, dev mmcblk0rpmb, sector 16
Buffer I/O error on device mmcblk0rpmb, logical block 2
end_request: I/O error, dev mmcblk0rpmb, sector 24
Buffer I/O error on device mmcblk0rpmb, logical block 3
...
This patch will discard the access request in eMMC queue if
it is RPMB partition access request. By this way, it avoids
trigger above error messages.
Fixes: 090d25fe224c ("mmc: core: Expose access to RPMB partition")
Signed-off-by: Yunpeng Gao <yunpeng.gao@intel.com>
Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>
Tested-by: Michael Shigorin <mike@altlinux.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
2014-08-12 04:01:30 +00:00
|
|
|
extern int mmc_access_rpmb(struct mmc_queue *);
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
#endif
|