mmc: card: block: Add support for completing cmdq requests with error

Add support for completing failed cmdq requests with error.

If any cmdq request is failed, we enter into error recovery path and
re-queue the same request. But in some cases (e.g. requests failed due
to invalid crypto configuration) same request shouldn't be re-queued
but should complete the request with error so that the a new requested
would be issued.

In mmc_blk_cmdq_complete_rq(), for a request if error information is
present and flag which indicates to skip error handling is set
then complete that request with error info.

Change-Id: I9c4a446bb27b4d82a0847d0bfb4481b314df479c
Signed-off-by: Veerabhadrarao Badiganti <vbadigan@codeaurora.org>
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 120fd54..ca04fba 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -3572,7 +3572,7 @@
 	else if (mrq->data && mrq->data->error)
 		err = mrq->data->error;
 
-	if (err || cmdq_req->resp_err) {
+	if ((err || cmdq_req->resp_err) && !cmdq_req->skip_err_handling) {
 		pr_err("%s: %s: txfr error(%d)/resp_err(%d)\n",
 				mmc_hostname(mrq->host), __func__, err,
 				cmdq_req->resp_err);
@@ -3609,6 +3609,17 @@
 		blk_end_request_all(rq, err);
 		goto out;
 	}
+	/*
+	 * In case of error, cmdq_req->data.bytes_xfered is set to 0.
+	 * If we call blk_end_request() with nr_bytes as 0 then the request
+	 * never gets completed. So in case of error, to complete a request
+	 * with error we should use blk_end_request_all().
+	 */
+	if (err && cmdq_req->skip_err_handling) {
+		cmdq_req->skip_err_handling = false;
+		blk_end_request_all(rq, err);
+		goto out;
+	}
 
 	blk_end_request(rq, err, cmdq_req->data.bytes_xfered);