lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 015/717] Revert "i2c: i2c-qcom-geni: Fix DMA transfer race"
    Date
    From: Douglas Anderson <dianders@chromium.org>

    [ Upstream commit 9cb4c67d7717135d6f4600a49ab07b470ea4ee2f ]

    This reverts commit 02b9aec59243c6240fc42884acc958602146ddf6.

    As talked about in the patch ("soc: qcom: geni: More properly switch
    to DMA mode"), swapping the order of geni_se_setup_m_cmd() and
    geni_se_xx_dma_prep() can sometimes cause corrupted transfers. Thus
    we traded one problem for another. Now that we've debugged the
    problem further and fixed the geni helper functions to more disable
    FIFO interrupts when we move to DMA mode we can revert it and end up
    with (hopefully) zero problems!

    To be explicit, the patch ("soc: qcom: geni: More properly switch
    to DMA mode") is a prerequisite for this one.

    Fixes: 02b9aec59243 ("i2c: i2c-qcom-geni: Fix DMA transfer race")
    Signed-off-by: Douglas Anderson <dianders@chromium.org>
    Reviewed-by: Stephen Boyd <swboyd@chromium.org>
    Reviewed-by: Akash Asthana <akashast@codeaurora.org>
    Tested-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Link: https://lore.kernel.org/r/20201013142448.v2.2.I7b22281453b8a18ab16ef2bfd4c641fb1cc6a92c@changeid
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/i2c/busses/i2c-qcom-geni.c | 6 ++----
    1 file changed, 2 insertions(+), 4 deletions(-)

    diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
    index 8b4c35f47a70f..dce75b85253c1 100644
    --- a/drivers/i2c/busses/i2c-qcom-geni.c
    +++ b/drivers/i2c/busses/i2c-qcom-geni.c
    @@ -366,6 +366,7 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
    geni_se_select_mode(se, GENI_SE_FIFO);

    writel_relaxed(len, se->base + SE_I2C_RX_TRANS_LEN);
    + geni_se_setup_m_cmd(se, I2C_READ, m_param);

    if (dma_buf && geni_se_rx_dma_prep(se, dma_buf, len, &rx_dma)) {
    geni_se_select_mode(se, GENI_SE_FIFO);
    @@ -373,8 +374,6 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
    dma_buf = NULL;
    }

    - geni_se_setup_m_cmd(se, I2C_READ, m_param);
    -
    time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT);
    if (!time_left)
    geni_i2c_abort_xfer(gi2c);
    @@ -408,6 +407,7 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
    geni_se_select_mode(se, GENI_SE_FIFO);

    writel_relaxed(len, se->base + SE_I2C_TX_TRANS_LEN);
    + geni_se_setup_m_cmd(se, I2C_WRITE, m_param);

    if (dma_buf && geni_se_tx_dma_prep(se, dma_buf, len, &tx_dma)) {
    geni_se_select_mode(se, GENI_SE_FIFO);
    @@ -415,8 +415,6 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
    dma_buf = NULL;
    }

    - geni_se_setup_m_cmd(se, I2C_WRITE, m_param);
    -
    if (!dma_buf) /* Get FIFO IRQ */
    writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG);

    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 15:10    [W:4.113 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site