Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bdb9a90b authored by addy ke's avatar addy ke Committed by Ulf Hansson
Browse files

mmc: dw_mmc: fix mmc_test by not sending abort for DRTO/EBE errors



The STOP command can terminate a data transfer between a memory card and
mmc controller.

As show in Synopsys DesignWare Cores Mobile Storage Host Databook:
Data timeout and Data end-bit error will terminate further data transfer
by mmc controller. So we should not send abort command to terminate a
data transfer again if we got DRTO and EBE interrupt.

After this patch, all mmc_test cases can pass on RK3288-Pink2 board.

Signed-off-by: default avatarAddy Ke <addy.ke@rock-chips.com>
Reviewed-by: default avatarDoug Anderson <dianders@chromium.org>
Tested-by: default avatarDoug Anderson <dianders@chromium.org>
Tested-by: default avatarJavier Martinez Canillas <javier.martinez@collabora.co.uk>
Signed-off-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 6d53200b
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -1534,6 +1534,9 @@ static void dw_mci_tasklet_func(unsigned long priv)
			if (test_and_clear_bit(EVENT_DATA_ERROR,
			if (test_and_clear_bit(EVENT_DATA_ERROR,
					       &host->pending_events)) {
					       &host->pending_events)) {
				dw_mci_stop_dma(host);
				dw_mci_stop_dma(host);
				if (data->stop ||
				    !(host->data_status & (SDMMC_INT_DRTO |
							   SDMMC_INT_EBE)))
					send_stop_abort(host, data);
					send_stop_abort(host, data);
				state = STATE_DATA_ERROR;
				state = STATE_DATA_ERROR;
				break;
				break;
@@ -1561,6 +1564,9 @@ static void dw_mci_tasklet_func(unsigned long priv)
			if (test_and_clear_bit(EVENT_DATA_ERROR,
			if (test_and_clear_bit(EVENT_DATA_ERROR,
					       &host->pending_events)) {
					       &host->pending_events)) {
				dw_mci_stop_dma(host);
				dw_mci_stop_dma(host);
				if (data->stop ||
				    !(host->data_status & (SDMMC_INT_DRTO |
							   SDMMC_INT_EBE)))
					send_stop_abort(host, data);
					send_stop_abort(host, data);
				state = STATE_DATA_ERROR;
				state = STATE_DATA_ERROR;
				break;
				break;