linux/drivers/mmc/core/queue.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef MMC_QUEUE_H
   3#define MMC_QUEUE_H
   4
   5#include <linux/types.h>
   6#include <linux/blkdev.h>
   7#include <linux/blk-mq.h>
   8#include <linux/mmc/core.h>
   9#include <linux/mmc/host.h>
  10
  11static inline struct mmc_queue_req *req_to_mmc_queue_req(struct request *rq)
  12{
  13        return blk_mq_rq_to_pdu(rq);
  14}
  15
  16struct mmc_queue_req;
  17
  18static inline struct request *mmc_queue_req_to_req(struct mmc_queue_req *mqr)
  19{
  20        return blk_mq_rq_from_pdu(mqr);
  21}
  22
  23struct task_struct;
  24struct mmc_blk_data;
  25struct mmc_blk_ioc_data;
  26
  27struct mmc_blk_request {
  28        struct mmc_request      mrq;
  29        struct mmc_command      sbc;
  30        struct mmc_command      cmd;
  31        struct mmc_command      stop;
  32        struct mmc_data         data;
  33        int                     retune_retry_done;
  34};
  35
  36/**
  37 * enum mmc_drv_op - enumerates the operations in the mmc_queue_req
  38 * @MMC_DRV_OP_IOCTL: ioctl operation
  39 * @MMC_DRV_OP_BOOT_WP: write protect boot partitions
  40 * @MMC_DRV_OP_GET_CARD_STATUS: get card status
  41 * @MMC_DRV_OP_GET_EXT_CSD: get the EXT CSD from an eMMC card
  42 */
  43enum mmc_drv_op {
  44        MMC_DRV_OP_IOCTL,
  45        MMC_DRV_OP_BOOT_WP,
  46        MMC_DRV_OP_GET_CARD_STATUS,
  47        MMC_DRV_OP_GET_EXT_CSD,
  48};
  49
  50struct mmc_queue_req {
  51        struct mmc_blk_request  brq;
  52        struct scatterlist      *sg;
  53        struct mmc_async_req    areq;
  54        enum mmc_drv_op         drv_op;
  55        int                     drv_op_result;
  56        void                    *drv_op_data;
  57        unsigned int            ioc_count;
  58};
  59
  60struct mmc_queue {
  61        struct mmc_card         *card;
  62        struct task_struct      *thread;
  63        struct semaphore        thread_sem;
  64        bool                    suspended;
  65        bool                    asleep;
  66        struct mmc_blk_data     *blkdata;
  67        struct request_queue    *queue;
  68        /*
  69         * FIXME: this counter is not a very reliable way of keeping
  70         * track of how many requests that are ongoing. Switch to just
  71         * letting the block core keep track of requests and per-request
  72         * associated mmc_queue_req data.
  73         */
  74        int                     qcnt;
  75};
  76
  77extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *,
  78                          const char *);
  79extern void mmc_cleanup_queue(struct mmc_queue *);
  80extern void mmc_queue_suspend(struct mmc_queue *);
  81extern void mmc_queue_resume(struct mmc_queue *);
  82extern unsigned int mmc_queue_map_sg(struct mmc_queue *,
  83                                     struct mmc_queue_req *);
  84
  85extern int mmc_access_rpmb(struct mmc_queue *);
  86
  87#endif
  88