summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2017-01-24 11:17:55 +0100
committerUlf Hansson <ulf.hansson@linaro.org>2017-02-13 13:20:39 +0100
commitda0dbaffe354043bb0cd61c00c650c819d104b29 (patch)
tree872d6bc4d4381dedd725f21ac7f6009bbbab154e /drivers
parentmmc: block: do not assign mq_rq when aborting command (diff)
downloadlinux-da0dbaffe354043bb0cd61c00c650c819d104b29.tar.xz
linux-da0dbaffe354043bb0cd61c00c650c819d104b29.zip
mmc: block: inline command abortions
Setting rqc to NULL followed by a goto to cmd_abort is just a way to do unconditional abort without starting any new command. Inline the calls to mmc_blk_rw_cmd_abort() and return immediately in those cases. Add some comments to the code flow so it is clear that this is where the asynchronous requests come back in and the result of them gets handled. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/core/block.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 13e6fe060f26..ea86a233cea4 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -1649,9 +1649,8 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
!IS_ALIGNED(blk_rq_sectors(rqc), 8)) {
pr_err("%s: Transfer size is not 4KB sector size aligned\n",
rqc->rq_disk->disk_name);
- req = rqc;
- rqc = NULL;
- goto cmd_abort;
+ mmc_blk_rw_cmd_abort(card, rqc);
+ return 0;
}
mmc_blk_rw_rq_prep(mq->mqrq_cur, card, 0, mq);
@@ -1660,11 +1659,20 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
areq = NULL;
areq = mmc_start_req(card->host, areq, &status);
if (!areq) {
+ /*
+ * We have just put the first request into the pipeline
+ * and there is nothing more to do until it is
+ * complete.
+ */
if (status == MMC_BLK_NEW_REQUEST)
mq->flags |= MMC_QUEUE_NEW_REQUEST;
return 0;
}
+ /*
+ * An asynchronous request has been completed and we proceed
+ * to handle the result of it.
+ */
mq_rq = container_of(areq, struct mmc_queue_req, mmc_active);
brq = &mq_rq->brq;
req = mq_rq->req;
@@ -1691,8 +1699,8 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
pr_err("%s BUG rq_tot %d d_xfer %d\n",
__func__, blk_rq_bytes(req),
brq->data.bytes_xfered);
- rqc = NULL;
- goto cmd_abort;
+ mmc_blk_rw_cmd_abort(card, req);
+ return 0;
}
break;
case MMC_BLK_CMD_ERR: