lkml.org 
[lkml]   [2019]   [Mar]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 06/11] staging: mt7621-mmc: Initialize completions a single time during probe
    Date
    The module was initializing completions whenever it was going to wait on
    them, and not when the completion was allocated. This is incorrect
    according to the completion docs:

    Calling init_completion() on the same completion object twice is
    most likely a bug [...]

    Re-initialization is also unnecessary because the module never uses
    complete_all(). Fix this by only ever initializing the completion a
    single time.

    Signed-off-by: George Hilliard <thirtythreeforty@gmail.com>
    ---
    drivers/staging/mt7621-mmc/sd.c | 13 +++++++++----
    1 file changed, 9 insertions(+), 4 deletions(-)

    diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c
    index 89fbc0a1dec7..c272aa780719 100644
    --- a/drivers/staging/mt7621-mmc/sd.c
    +++ b/drivers/staging/mt7621-mmc/sd.c
    @@ -467,7 +467,9 @@ static unsigned int msdc_command_start(struct msdc_host *host,
    host->cmd = cmd;
    host->cmd_rsp = resp;

    - init_completion(&host->cmd_done);
    + // The completion should have been consumed by the previous command
    + // response handler, because the mmc requests should be serialized
    + BUG_ON(completion_done(&host->cmd_done));

    sdr_set_bits(host->base + MSDC_INTEN, wints);
    sdc_send_cmd(rawcmd, cmd->arg);
    @@ -489,7 +491,6 @@ static unsigned int msdc_command_resp(struct msdc_host *host,
    MSDC_INT_ACMD19_DONE;

    BUG_ON(in_interrupt());
    - //init_completion(&host->cmd_done);
    //sdr_set_bits(host->base + MSDC_INTEN, wints);

    spin_unlock(&host->lock);
    @@ -673,7 +674,10 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq)
    //msdc_clr_fifo(host); /* no need */

    msdc_dma_on(); /* enable DMA mode first!! */
    - init_completion(&host->xfer_done);
    +
    + // The completion should have been consumed by the previous xfer
    + // response handler, because the mmc requests should be serialized
    + BUG_ON(completion_done(&host->xfer_done));

    /* start the command first*/
    if (msdc_command_start(host, cmd, CMD_TIMEOUT) != 0)
    @@ -692,7 +696,6 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq)
    /* for read, the data coming too fast, then CRC error
    * start DMA no business with CRC.
    */
    - //init_completion(&host->xfer_done);
    msdc_dma_start(host);

    spin_unlock(&host->lock);
    @@ -1684,6 +1687,8 @@ static int msdc_drv_probe(struct platform_device *pdev)
    }
    msdc_init_gpd_bd(host, &host->dma);

    + init_completion(&host->cmd_done);
    + init_completion(&host->xfer_done);
    INIT_DELAYED_WORK(&host->card_delaywork, msdc_tasklet_card);
    spin_lock_init(&host->lock);
    msdc_init_hw(host);
    --
    2.21.0
    \
     
     \ /
      Last update: 2019-03-19 03:22    [W:2.283 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site