Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02166a01 authored by Linus Walleij's avatar Linus Walleij Committed by Ulf Hansson
Browse files

mmc: block: Tag DRV_OPs with a driver operation type



We will expand the DRV_OP usage, so we need to know which
operation we're performing. Tag the operations with an
enum:ed type and rename the function so it is clear that
it deals with any command and put a switch statement in
it. Currently only ioctls are supported.

Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 67e69d52
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -602,6 +602,7 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
		idata->ic.write_flag ? REQ_OP_DRV_OUT : REQ_OP_DRV_IN,
		__GFP_RECLAIM);
	idatas[0] = idata;
	req_to_mmc_queue_req(req)->drv_op = MMC_DRV_OP_IOCTL;
	req_to_mmc_queue_req(req)->idata = idatas;
	req_to_mmc_queue_req(req)->ioc_count = 1;
	blk_execute_rq(mq->queue, NULL, req, 0);
@@ -618,11 +619,11 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
}

/*
 * The ioctl commands come back from the block layer after it queued it and
 * The non-block commands come back from the block layer after it queued it and
 * processed it with all other requests and then they get issued in this
 * function.
 */
static void mmc_blk_ioctl_cmd_issue(struct mmc_queue *mq, struct request *req)
static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
{
	struct mmc_queue_req *mq_rq;
	struct mmc_card *card = mq->card;
@@ -631,8 +632,12 @@ static void mmc_blk_ioctl_cmd_issue(struct mmc_queue *mq, struct request *req)
	int i;

	mq_rq = req_to_mmc_queue_req(req);

	switch (mq_rq->drv_op) {
	case MMC_DRV_OP_IOCTL:
		for (i = 0; i < mq_rq->ioc_count; i++) {
		ioc_err = __mmc_blk_ioctl_cmd(card, md, mq_rq->idata[i]);
			ioc_err =
				__mmc_blk_ioctl_cmd(card, md, mq_rq->idata[i]);
			if (ioc_err)
				break;
		}
@@ -643,6 +648,11 @@ static void mmc_blk_ioctl_cmd_issue(struct mmc_queue *mq, struct request *req)
			mmc_blk_part_switch(card, dev_get_drvdata(&card->dev));

		blk_end_request_all(req, ioc_err);
		break;
	default:
		/* Unknown operation */
		break;
	}
}

static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev,
@@ -705,6 +715,7 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev,
	req = blk_get_request(mq->queue,
		idata[0]->ic.write_flag ? REQ_OP_DRV_OUT : REQ_OP_DRV_IN,
		__GFP_RECLAIM);
	req_to_mmc_queue_req(req)->drv_op = MMC_DRV_OP_IOCTL;
	req_to_mmc_queue_req(req)->idata = idata;
	req_to_mmc_queue_req(req)->ioc_count = num_of_cmds;
	blk_execute_rq(mq->queue, NULL, req, 0);
@@ -1904,7 +1915,7 @@ void mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
			 */
			if (mq->qcnt)
				mmc_blk_issue_rw_rq(mq, NULL);
			mmc_blk_ioctl_cmd_issue(mq, req);
			mmc_blk_issue_drv_op(mq, req);
			break;
		case REQ_OP_DISCARD:
			/*
+9 −0
Original line number Diff line number Diff line
@@ -32,6 +32,14 @@ struct mmc_blk_request {
	int			retune_retry_done;
};

/**
 * enum mmc_drv_op - enumerates the operations in the mmc_queue_req
 * @MMC_DRV_OP_IOCTL: ioctl operation
 */
enum mmc_drv_op {
	MMC_DRV_OP_IOCTL,
};

struct mmc_queue_req {
	struct mmc_blk_request	brq;
	struct scatterlist	*sg;
@@ -39,6 +47,7 @@ struct mmc_queue_req {
	struct scatterlist	*bounce_sg;
	unsigned int		bounce_sg_len;
	struct mmc_async_req	areq;
	enum mmc_drv_op		drv_op;
	int			ioc_result;
	struct mmc_blk_ioc_data	**idata;
	unsigned int		ioc_count;