diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 3d6def7f44be..a353130806ec 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -3200,7 +3200,7 @@ void mmc_blk_cmdq_complete_rq(struct request *rq) BUG_ON(!test_and_clear_bit(cmdq_req->tag, &ctx_info->data_active_reqs)); - mmc_cmdq_post_req(host, mrq, err); + mmc_cmdq_post_req(host, cmdq_req->tag, err); if (err) { pr_err("%s: %s: txfr error: %d\n", mmc_hostname(mrq->host), __func__, err); diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 0f2c693696d5..1a972207f299 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1512,13 +1512,13 @@ EXPORT_SYMBOL(mmc_cmdq_discard_queue); /** * mmc_cmdq_post_req - post process of a completed request * @host: host instance - * @mrq: the request to be processed + * @tag: the request tag. * @err: non-zero is error, success otherwise */ -void mmc_cmdq_post_req(struct mmc_host *host, struct mmc_request *mrq, int err) +void mmc_cmdq_post_req(struct mmc_host *host, int tag, int err) { if (likely(host->cmdq_ops->post_req)) - host->cmdq_ops->post_req(host, mrq, err); + host->cmdq_ops->post_req(host, tag, err); } EXPORT_SYMBOL(mmc_cmdq_post_req); diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c index a5f121516417..4c5817776dfe 100644 --- a/drivers/mmc/host/cmdq_hci.c +++ b/drivers/mmc/host/cmdq_hci.c @@ -992,15 +992,23 @@ static int cmdq_halt(struct mmc_host *mmc, bool halt) return ret; } -static void cmdq_post_req(struct mmc_host *host, struct mmc_request *mrq, - int err) +static void cmdq_post_req(struct mmc_host *mmc, int tag, int err) { - struct mmc_data *data = mrq->data; - struct sdhci_host *sdhci_host = mmc_priv(host); + struct cmdq_host *cq_host; + struct mmc_request *mrq; + struct mmc_data *data; + struct sdhci_host *sdhci_host = mmc_priv(mmc); + + if (WARN_ON(!mmc)) + return; + + cq_host = (struct cmdq_host *)mmc_cmdq_private(mmc); + mrq = get_req_by_tag(cq_host, tag); + data = mrq->data; if (data) { data->error = err; - dma_unmap_sg(mmc_dev(host), data->sg, data->sg_len, + dma_unmap_sg(mmc_dev(mmc), data->sg, data->sg_len, (data->flags & MMC_DATA_READ) ? DMA_FROM_DEVICE : DMA_TO_DEVICE); if (err) diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 87332656e0fd..8b5197ba6759 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h @@ -136,8 +136,7 @@ struct mmc_cmdq_req; extern int mmc_cmdq_discard_queue(struct mmc_host *host, u32 tasks); extern int mmc_cmdq_halt(struct mmc_host *host, bool enable); extern int mmc_cmdq_halt_on_empty_queue(struct mmc_host *host); -extern void mmc_cmdq_post_req(struct mmc_host *host, struct mmc_request *mrq, - int err); +extern void mmc_cmdq_post_req(struct mmc_host *host, int tag, int err); extern int mmc_cmdq_start_req(struct mmc_host *host, struct mmc_cmdq_req *cmdq_req); extern int mmc_cmdq_prepare_flush(struct mmc_command *cmd); diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 4743f46bf9b3..b923a74add1d 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -95,8 +95,7 @@ struct mmc_cmdq_host_ops { int (*enable)(struct mmc_host *host); void (*disable)(struct mmc_host *host, bool soft); int (*request)(struct mmc_host *host, struct mmc_request *mrq); - void (*post_req)(struct mmc_host *host, struct mmc_request *mrq, - int err); + void (*post_req)(struct mmc_host *host, int tag, int err); int (*halt)(struct mmc_host *host, bool halt); void (*reset)(struct mmc_host *host, bool soft); void (*dumpstate)(struct mmc_host *host);