lkml.org 
[lkml]   [2022]   [Mar]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 33/43] mmc: meson: Fix usage of meson_mmc_post_req()
    Date
    From: Rong Chen <rong.chen@amlogic.com>

    commit f0d2f15362f02444c5d7ffd5a5eb03e4aa54b685 upstream.

    Currently meson_mmc_post_req() is called in meson_mmc_request() right
    after meson_mmc_start_cmd(). This could lead to DMA unmapping before the request
    is actually finished.

    To fix, don't call meson_mmc_post_req() until meson_mmc_request_done().

    Signed-off-by: Rong Chen <rong.chen@amlogic.com>
    Reviewed-by: Kevin Hilman <khilman@baylibre.com>
    Fixes: 79ed05e329c3 ("mmc: meson-gx: add support for descriptor chain mode")
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20220216124239.4007667-1-rong.chen@amlogic.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/mmc/host/meson-gx-mmc.c | 15 ++++++++-------
    1 file changed, 8 insertions(+), 7 deletions(-)

    --- a/drivers/mmc/host/meson-gx-mmc.c
    +++ b/drivers/mmc/host/meson-gx-mmc.c
    @@ -174,6 +174,8 @@ struct meson_host {
    int irq;

    bool vqmmc_enabled;
    + bool needs_pre_post_req;
    +
    };

    #define CMD_CFG_LENGTH_MASK GENMASK(8, 0)
    @@ -655,6 +657,8 @@ static void meson_mmc_request_done(struc
    struct meson_host *host = mmc_priv(mmc);

    host->cmd = NULL;
    + if (host->needs_pre_post_req)
    + meson_mmc_post_req(mmc, mrq, 0);
    mmc_request_done(host->mmc, mrq);
    }

    @@ -872,7 +876,7 @@ static int meson_mmc_validate_dram_acces
    static void meson_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
    {
    struct meson_host *host = mmc_priv(mmc);
    - bool needs_pre_post_req = mrq->data &&
    + host->needs_pre_post_req = mrq->data &&
    !(mrq->data->host_cookie & SD_EMMC_PRE_REQ_DONE);

    /*
    @@ -888,22 +892,19 @@ static void meson_mmc_request(struct mmc
    }
    }

    - if (needs_pre_post_req) {
    + if (host->needs_pre_post_req) {
    meson_mmc_get_transfer_mode(mmc, mrq);
    if (!meson_mmc_desc_chain_mode(mrq->data))
    - needs_pre_post_req = false;
    + host->needs_pre_post_req = false;
    }

    - if (needs_pre_post_req)
    + if (host->needs_pre_post_req)
    meson_mmc_pre_req(mmc, mrq);

    /* Stop execution */
    writel(0, host->regs + SD_EMMC_START);

    meson_mmc_start_cmd(mmc, mrq->sbc ?: mrq->cmd);
    -
    - if (needs_pre_post_req)
    - meson_mmc_post_req(mmc, mrq, 0);
    }

    static void meson_mmc_read_resp(struct mmc_host *mmc, struct mmc_command *cmd)

    \
     
     \ /
      Last update: 2022-03-14 12:58    [W:4.510 / U:0.684 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site