Commit 40c96853 authored by Ulf Hansson's avatar Ulf Hansson
Browse files

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: default avatarUlf Hansson <ulf.hansson@linaro.org>
Tested-by: default avatarBaolin Wang <baolin.wang7@gmail.com>
Tested-by: default avatarLudovic Barre <ludovic.barre@st.com>
Reviewed-by: default avatarLudovic Barre <ludovic.barre@st.com>
Link: https://lore.kernel.org/r/20200204085449.32585-7-ulf.hansson@linaro.org
parent 6972096a
Loading
Loading
Loading
Loading
+4 −20
Original line number Diff line number Diff line
@@ -441,16 +441,6 @@ static int ioctl_do_sanitize(struct mmc_card *card)
	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,
			    u32 *resp_errs)
{
@@ -482,13 +472,7 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
				 __func__, status);
			return -ETIMEDOUT;
		}

		/*
		 * 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));
	} while (!mmc_ready_for_data(status));

	return err;
}
@@ -1692,7 +1676,7 @@ static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req)
			goto error_exit;

		if (!mmc_host_is_spi(host) &&
		    !mmc_blk_in_tran_state(status)) {
		    !mmc_ready_for_data(status)) {
			err = mmc_blk_fix_state(card, req);
			if (err)
				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    ||
	       brq->stop.resp[0] & 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)
@@ -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 */
	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);

	/*
+10 −0
Original line number Diff line number Diff line
@@ -161,6 +161,16 @@ static inline bool mmc_op_multi(u32 opcode)
#define R1_STATE_PRG	7
#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
 * R1 is the low order byte; R2 is the next highest byte, when present.