mmc: core: Enable re-use of mmc_blk_in_tran_state()
To allow subsequent changes to re-use the code from the static function mmc_blk_in_tran_state(), let's move it to a public header. While at it, let's also rename it to mmc_ready_for_data(), as to try to better describe its purpose. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Tested-by: Baolin Wang <baolin.wang7@gmail.com> Tested-by: Ludovic Barre <ludovic.barre@st.com> Reviewed-by: Ludovic Barre <ludovic.barre@st.com> Link: https://lore.kernel.org/r/20200204085449.32585-7-ulf.hansson@linaro.org
This commit is contained in:
parent
6972096a03
commit
40c96853fe
|
@ -441,16 +441,6 @@ out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
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, unsigned int timeout_ms,
|
static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
|
||||||
u32 *resp_errs)
|
u32 *resp_errs)
|
||||||
{
|
{
|
||||||
|
@ -482,13 +472,7 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
|
||||||
__func__, status);
|
__func__, status);
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
} while (!mmc_ready_for_data(status));
|
||||||
/*
|
|
||||||
* Some cards mishandle the status bits,
|
|
||||||
* so make sure to check both the busy
|
|
||||||
* indication and the card state.
|
|
||||||
*/
|
|
||||||
} while (!mmc_blk_in_tran_state(status));
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -1692,7 +1676,7 @@ static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req)
|
||||||
goto error_exit;
|
goto error_exit;
|
||||||
|
|
||||||
if (!mmc_host_is_spi(host) &&
|
if (!mmc_host_is_spi(host) &&
|
||||||
!mmc_blk_in_tran_state(status)) {
|
!mmc_ready_for_data(status)) {
|
||||||
err = mmc_blk_fix_state(card, req);
|
err = mmc_blk_fix_state(card, req);
|
||||||
if (err)
|
if (err)
|
||||||
goto error_exit;
|
goto error_exit;
|
||||||
|
@ -1752,7 +1736,7 @@ static bool mmc_blk_status_error(struct request *req, u32 status)
|
||||||
return brq->cmd.resp[0] & CMD_ERRORS ||
|
return brq->cmd.resp[0] & CMD_ERRORS ||
|
||||||
brq->stop.resp[0] & stop_err_bits ||
|
brq->stop.resp[0] & stop_err_bits ||
|
||||||
status & stop_err_bits ||
|
status & stop_err_bits ||
|
||||||
(rq_data_dir(req) == WRITE && !mmc_blk_in_tran_state(status));
|
(rq_data_dir(req) == WRITE && !mmc_ready_for_data(status));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool mmc_blk_cmd_started(struct mmc_blk_request *brq)
|
static inline bool mmc_blk_cmd_started(struct mmc_blk_request *brq)
|
||||||
|
@ -1814,7 +1798,7 @@ static void mmc_blk_mq_rw_recovery(struct mmc_queue *mq, struct request *req)
|
||||||
|
|
||||||
/* Try to get back to "tran" state */
|
/* Try to get back to "tran" state */
|
||||||
if (!mmc_host_is_spi(mq->card->host) &&
|
if (!mmc_host_is_spi(mq->card->host) &&
|
||||||
(err || !mmc_blk_in_tran_state(status)))
|
(err || !mmc_ready_for_data(status)))
|
||||||
err = mmc_blk_fix_state(mq->card, req);
|
err = mmc_blk_fix_state(mq->card, req);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -161,6 +161,16 @@ static inline bool mmc_op_multi(u32 opcode)
|
||||||
#define R1_STATE_PRG 7
|
#define R1_STATE_PRG 7
|
||||||
#define R1_STATE_DIS 8
|
#define R1_STATE_DIS 8
|
||||||
|
|
||||||
|
static inline bool mmc_ready_for_data(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;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MMC/SD in SPI mode reports R1 status always, and R2 for SEND_STATUS
|
* MMC/SD in SPI mode reports R1 status always, and R2 for SEND_STATUS
|
||||||
* R1 is the low order byte; R2 is the next highest byte, when present.
|
* R1 is the low order byte; R2 is the next highest byte, when present.
|
||||||
|
|
Loading…
Reference in New Issue