When command and data interrupts have been aggregated together, don't do
the data-completed processing if a command-error interrupt is also asserted. Reviewed by: Michal Meloun <meloun@miracle.cz>
This commit is contained in:
parent
cf26c00351
commit
7e5866432f
@ -713,9 +713,13 @@ sdhci_timeout(void *arg)
|
||||
struct sdhci_slot *slot = arg;
|
||||
|
||||
if (slot->curcmd != NULL) {
|
||||
slot_printf(slot, " Controller timeout\n");
|
||||
sdhci_dumpregs(slot);
|
||||
sdhci_reset(slot, SDHCI_RESET_CMD|SDHCI_RESET_DATA);
|
||||
slot->curcmd->error = MMC_ERR_TIMEOUT;
|
||||
sdhci_req_done(slot);
|
||||
} else {
|
||||
slot_printf(slot, " Spurious timeout - no active command\n");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1274,7 +1278,9 @@ sdhci_generic_intr(struct sdhci_slot *slot)
|
||||
/* Handle data interrupts. */
|
||||
if (intmask & SDHCI_INT_DATA_MASK) {
|
||||
WR4(slot, SDHCI_INT_STATUS, intmask & SDHCI_INT_DATA_MASK);
|
||||
sdhci_data_irq(slot, intmask & SDHCI_INT_DATA_MASK);
|
||||
/* Dont call data_irq in case of errored command */
|
||||
if ((intmask & SDHCI_INT_CMD_ERROR_MASK) == 0)
|
||||
sdhci_data_irq(slot, intmask & SDHCI_INT_DATA_MASK);
|
||||
}
|
||||
/* Handle AutoCMD12 error interrupt. */
|
||||
if (intmask & SDHCI_INT_ACMD12ERR) {
|
||||
|
@ -182,8 +182,11 @@
|
||||
#define SDHCI_INT_NORMAL_MASK 0x00007FFF
|
||||
#define SDHCI_INT_ERROR_MASK 0xFFFF8000
|
||||
|
||||
#define SDHCI_INT_CMD_MASK (SDHCI_INT_RESPONSE | SDHCI_INT_TIMEOUT | \
|
||||
#define SDHCI_INT_CMD_ERROR_MASK (SDHCI_INT_TIMEOUT | \
|
||||
SDHCI_INT_CRC | SDHCI_INT_END_BIT | SDHCI_INT_INDEX)
|
||||
|
||||
#define SDHCI_INT_CMD_MASK (SDHCI_INT_RESPONSE | SDHCI_INT_CMD_ERROR_MASK)
|
||||
|
||||
#define SDHCI_INT_DATA_MASK (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \
|
||||
SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \
|
||||
SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \
|
||||
|
Loading…
x
Reference in New Issue
Block a user