@@ -3439,12 +3439,18 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
3439
3439
host -> data -> error = - EILSEQ ;
3440
3440
if (!mmc_op_tuning (SDHCI_GET_CMD (sdhci_readw (host , SDHCI_COMMAND ))))
3441
3441
sdhci_err_stats_inc (host , DAT_CRC );
3442
- } else if ((intmask & SDHCI_INT_DATA_CRC ) &&
3442
+ } else if ((intmask & ( SDHCI_INT_DATA_CRC | SDHCI_INT_TUNING_ERROR ) ) &&
3443
3443
SDHCI_GET_CMD (sdhci_readw (host , SDHCI_COMMAND ))
3444
3444
!= MMC_BUS_TEST_R ) {
3445
3445
host -> data -> error = - EILSEQ ;
3446
3446
if (!mmc_op_tuning (SDHCI_GET_CMD (sdhci_readw (host , SDHCI_COMMAND ))))
3447
3447
sdhci_err_stats_inc (host , DAT_CRC );
3448
+ if (intmask & SDHCI_INT_TUNING_ERROR ) {
3449
+ u16 ctrl2 = sdhci_readw (host , SDHCI_HOST_CONTROL2 );
3450
+
3451
+ ctrl2 &= ~SDHCI_CTRL_TUNED_CLK ;
3452
+ sdhci_writew (host , ctrl2 , SDHCI_HOST_CONTROL2 );
3453
+ }
3448
3454
} else if (intmask & SDHCI_INT_ADMA_ERROR ) {
3449
3455
pr_err ("%s: ADMA error: 0x%08x\n" , mmc_hostname (host -> mmc ),
3450
3456
intmask );
@@ -3979,7 +3985,7 @@ bool sdhci_cqe_irq(struct sdhci_host *host, u32 intmask, int *cmd_error,
3979
3985
} else
3980
3986
* cmd_error = 0 ;
3981
3987
3982
- if (intmask & (SDHCI_INT_DATA_END_BIT | SDHCI_INT_DATA_CRC )) {
3988
+ if (intmask & (SDHCI_INT_DATA_END_BIT | SDHCI_INT_DATA_CRC | SDHCI_INT_TUNING_ERROR )) {
3983
3989
* data_error = - EILSEQ ;
3984
3990
if (!mmc_op_tuning (SDHCI_GET_CMD (sdhci_readw (host , SDHCI_COMMAND ))))
3985
3991
sdhci_err_stats_inc (host , DAT_CRC );
0 commit comments