Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127/* SPDX-License-Identifier: GPL-2.0 */#ifndef MMC_QUEUE_H#define MMC_QUEUE_H
#include <linux/types.h>#include <linux/blkdev.h>#include <linux/blk-mq.h>#include <linux/mmc/core.h>#include <linux/mmc/host.h>
enum mmc_issued { MMC_REQ_STARTED, MMC_REQ_BUSY, MMC_REQ_FAILED_TO_START, MMC_REQ_FINISHED,};
enum mmc_issue_type { MMC_ISSUE_SYNC, MMC_ISSUE_DCMD, MMC_ISSUE_ASYNC, MMC_ISSUE_MAX,};
static inline struct mmc_queue_req *req_to_mmc_queue_req(struct request *rq){ return blk_mq_rq_to_pdu(rq);}
struct mmc_queue_req;
static inline struct request *mmc_queue_req_to_req(struct mmc_queue_req *mqr){ return blk_mq_rq_from_pdu(mqr);}
struct mmc_blk_data;struct mmc_blk_ioc_data;
struct mmc_blk_request { struct mmc_request mrq; struct mmc_command sbc; struct mmc_command cmd; struct mmc_command stop; struct mmc_data data;};
/** * enum mmc_drv_op - enumerates the operations in the mmc_queue_req * @MMC_DRV_OP_IOCTL: ioctl operation * @MMC_DRV_OP_IOCTL_RPMB: RPMB-oriented ioctl operation * @MMC_DRV_OP_BOOT_WP: write protect boot partitions * @MMC_DRV_OP_GET_CARD_STATUS: get card status * @MMC_DRV_OP_GET_EXT_CSD: get the EXT CSD from an eMMC card */enum mmc_drv_op { MMC_DRV_OP_IOCTL, MMC_DRV_OP_IOCTL_RPMB, MMC_DRV_OP_BOOT_WP, MMC_DRV_OP_GET_CARD_STATUS, MMC_DRV_OP_GET_EXT_CSD,};
#define MQRQ_XFER_SINGLE_BLOCK BIT(0)
struct mmc_queue_req { struct mmc_blk_request brq; struct scatterlist *sg; enum mmc_drv_op drv_op; int drv_op_result; void *drv_op_data; u8 ioc_count; u8 retries; u8 flags;};
struct mmc_queue { struct mmc_card *card; struct mmc_ctx ctx; struct blk_mq_tag_set tag_set; struct mmc_blk_data *blkdata; struct request_queue *queue; spinlock_t lock; int in_flight[MMC_ISSUE_MAX]; unsigned int cqe_busy;#define MMC_CQE_DCMD_BUSY BIT(0) bool busy; bool recovery_needed; bool in_recovery; bool rw_wait; bool waiting; struct work_struct recovery_work; wait_queue_head_t wait; struct request *recovery_req; struct request *complete_req; struct mutex complete_lock; struct work_struct complete_work;};
struct gendisk *mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, unsigned int features);extern void mmc_cleanup_queue(struct mmc_queue *);extern void mmc_queue_suspend(struct mmc_queue *);extern void mmc_queue_resume(struct mmc_queue *);extern unsigned int mmc_queue_map_sg(struct mmc_queue *, struct mmc_queue_req *);
void mmc_cqe_check_busy(struct mmc_queue *mq);void mmc_cqe_recovery_notifier(struct mmc_request *mrq);
enum mmc_issue_type mmc_issue_type(struct mmc_queue *mq, struct request *req);
static inline int mmc_tot_in_flight(struct mmc_queue *mq){ return mq->in_flight[MMC_ISSUE_SYNC] + mq->in_flight[MMC_ISSUE_DCMD] + mq->in_flight[MMC_ISSUE_ASYNC];}
static inline int mmc_cqe_qcnt(struct mmc_queue *mq){ return mq->in_flight[MMC_ISSUE_DCMD] + mq->in_flight[MMC_ISSUE_ASYNC];}
#endif