lkml.org 
[lkml]   [2017]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V14 08/24] mmc: block: Check for transfer state in card_busy_detect()
    Date
    The card is required to return to transfer state. Since that is the state
    required to start another transfer, check for that state instead of
    programming state.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    drivers/mmc/core/block.c | 17 +++++++++++++----
    1 file changed, 13 insertions(+), 4 deletions(-)

    diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
    index 0874ab3e5c92..130ce94fdaf2 100644
    --- a/drivers/mmc/core/block.c
    +++ b/drivers/mmc/core/block.c
    @@ -948,6 +948,16 @@ static unsigned long mmc_blk_data_timeout_jiffies(struct mmc_host *host,
    return msecs_to_jiffies(ms);
    }

    +static inline bool mmc_blk_in_tran_state(u32 status)
    +{
    + /*
    + * Some cards mishandle the status bits, so make sure to check both the
    + * busy indication and the card state.
    + */
    + return status & R1_READY_FOR_DATA &&
    + (R1_CURRENT_STATE(status) == R1_STATE_TRAN);
    +}
    +
    static int card_busy_detect(struct mmc_card *card, bool hw_busy_detect,
    struct request *req, bool *gen_err)
    {
    @@ -985,9 +995,9 @@ static int card_busy_detect(struct mmc_card *card, bool hw_busy_detect,
    * leaves the program state.
    */
    if (done) {
    - pr_err("%s: Card stuck in programming state! %s %s\n",
    + pr_err("%s: Card stuck in wrong state! %s %s status: %#x\n",
    mmc_hostname(card->host),
    - req->rq_disk->disk_name, __func__);
    + req->rq_disk->disk_name, __func__, status);
    return -ETIMEDOUT;
    }

    @@ -996,8 +1006,7 @@ static int card_busy_detect(struct mmc_card *card, bool hw_busy_detect,
    * so make sure to check both the busy
    * indication and the card state.
    */
    - } while (!(status & R1_READY_FOR_DATA) ||
    - (R1_CURRENT_STATE(status) == R1_STATE_PRG));
    + } while (!mmc_blk_in_tran_state(status));

    return err;
    }
    --
    1.9.1
    \
     
     \ /
      Last update: 2017-11-21 14:48    [W:4.424 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site