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

Commit bf4faed0 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mmc: card: Requeue the request if it fails during issuing"

parents 13b85cd7 eb561627
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -3170,6 +3170,16 @@ static struct mmc_cmdq_req *mmc_blk_cmdq_rw_prep(
	return &mqrq->cmdq_req;
}

static void mmc_blk_cmdq_requeue_rw_rq(struct mmc_queue *mq,
				struct request *req)
{
	struct mmc_card *card = mq->card;
	struct mmc_host *host = card->host;

	blk_requeue_request(req->q, req);
	mmc_put_card(host->card);
}

static int mmc_blk_cmdq_issue_rw_rq(struct mmc_queue *mq, struct request *req)
{
	struct mmc_queue_req *active_mqrq;
@@ -3217,6 +3227,15 @@ static int mmc_blk_cmdq_issue_rw_rq(struct mmc_queue *mq, struct request *req)
		wait_event_interruptible(ctx->queue_empty_wq,
					(!ctx->active_reqs));

	if (ret) {
		/* clear pending request */
		WARN_ON(!test_and_clear_bit(req->tag,
				&host->cmdq_ctx.data_active_reqs));
		WARN_ON(!test_and_clear_bit(req->tag,
				&host->cmdq_ctx.active_reqs));
		mmc_cmdq_clk_scaling_stop_busy(host, true, false);
	}

	return ret;
}

@@ -4000,6 +4019,13 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req)
			ret = mmc_blk_cmdq_issue_flush_rq(mq, req);
		} else {
			ret = mmc_blk_cmdq_issue_rw_rq(mq, req);
			/*
			 * If issuing of the request fails with eitehr EBUSY or
			 * EAGAIN error, re-queue the request.
			 * This case would occur with ICE calls.
			 */
			if (ret == -EBUSY || ret == -EAGAIN)
				mmc_blk_cmdq_requeue_rw_rq(mq, req);
		}
	}

+19 −8
Original line number Diff line number Diff line
@@ -1160,9 +1160,11 @@ static int mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
	return 0;
}

static void mmc_start_cmdq_request(struct mmc_host *host,
static int mmc_start_cmdq_request(struct mmc_host *host,
				   struct mmc_request *mrq)
{
	int ret = 0;

	if (mrq->data) {
		pr_debug("%s:     blksz %d blocks %d flags %08x tsac %lu ms nsac %d\n",
			mmc_hostname(host), mrq->data->blksz,
@@ -1184,11 +1186,21 @@ static void mmc_start_cmdq_request(struct mmc_host *host,
	}

	mmc_host_clk_hold(host);
	if (likely(host->cmdq_ops->request))
		host->cmdq_ops->request(host, mrq);
	else
		pr_err("%s: %s: issue request failed\n", mmc_hostname(host),
				__func__);
	if (likely(host->cmdq_ops->request)) {
		ret = host->cmdq_ops->request(host, mrq);
	} else {
		ret = -ENOENT;
		pr_err("%s: %s: cmdq request host op is not available\n",
			mmc_hostname(host), __func__);
	}

	if (ret) {
		mmc_host_clk_release(host);
		pr_err("%s: %s: issue request failed, err=%d\n",
			mmc_hostname(host), __func__, ret);
	}

	return ret;
}

/**
@@ -1675,8 +1687,7 @@ int mmc_cmdq_start_req(struct mmc_host *host, struct mmc_cmdq_req *cmdq_req)
		mrq->cmd->error = -ENOMEDIUM;
		return -ENOMEDIUM;
	}
	mmc_start_cmdq_request(host, mrq);
	return 0;
	return mmc_start_cmdq_request(host, mrq);
}
EXPORT_SYMBOL(mmc_cmdq_start_req);