mirror of
https://github.com/fail0verflow/mini.git
synced 2024-11-16 16:39:25 +01:00
differentiate between timeout and error in wait_intr
This commit is contained in:
parent
5122d749ee
commit
4e8bfc5905
24
sdhc.c
24
sdhc.c
@ -811,6 +811,7 @@ sdhc_wait_intr_debug(const char *funcname, int line, struct sdhc_host *hp, int m
|
|||||||
int status;
|
int status;
|
||||||
|
|
||||||
mask |= SDHC_ERROR_INTERRUPT;
|
mask |= SDHC_ERROR_INTERRUPT;
|
||||||
|
mask |= SDHC_ERROR_TIMEOUT;
|
||||||
|
|
||||||
status = hp->intr_status & mask;
|
status = hp->intr_status & mask;
|
||||||
|
|
||||||
@ -827,7 +828,7 @@ sdhc_wait_intr_debug(const char *funcname, int line, struct sdhc_host *hp, int m
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (timo == 0) {
|
if (timo == 0) {
|
||||||
status |= SDHC_ERROR_INTERRUPT;
|
status |= SDHC_ERROR_TIMEOUT;
|
||||||
}
|
}
|
||||||
hp->intr_status &= ~status;
|
hp->intr_status &= ~status;
|
||||||
|
|
||||||
@ -844,6 +845,16 @@ sdhc_wait_intr_debug(const char *funcname, int line, struct sdhc_host *hp, int m
|
|||||||
status = 0;
|
status = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Command timeout has higher priority than command complete. */
|
||||||
|
if (ISSET(status, SDHC_ERROR_TIMEOUT)) {
|
||||||
|
gecko_printf("not resetting due to timeout\n");
|
||||||
|
sdhc_dump_regs(hp);
|
||||||
|
|
||||||
|
hp->intr_error_status = 0;
|
||||||
|
// (void)sdhc_soft_reset(hp, SDHC_RESET_DAT|SDHC_RESET_CMD);
|
||||||
|
status = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -865,6 +876,9 @@ sdhc_intr(void *arg)
|
|||||||
if (hp == NULL)
|
if (hp == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
DPRINTF(1,("shdc_intr(%d):\n", host));
|
||||||
|
sdhc_dump_regs(hp);
|
||||||
|
|
||||||
/* Find out which interrupts are pending. */
|
/* Find out which interrupts are pending. */
|
||||||
status = HREAD2(hp, SDHC_NINTR_STATUS);
|
status = HREAD2(hp, SDHC_NINTR_STATUS);
|
||||||
if (!ISSET(status, SDHC_NINTR_STATUS_MASK))
|
if (!ISSET(status, SDHC_NINTR_STATUS_MASK))
|
||||||
@ -872,8 +886,8 @@ sdhc_intr(void *arg)
|
|||||||
|
|
||||||
/* Acknowledge the interrupts we are about to handle. */
|
/* Acknowledge the interrupts we are about to handle. */
|
||||||
HWRITE2(hp, SDHC_NINTR_STATUS, status);
|
HWRITE2(hp, SDHC_NINTR_STATUS, status);
|
||||||
// DPRINTF(2,("%s: interrupt status=%d\n", HDEVNAME(hp),
|
DPRINTF(2,("%s: interrupt status=%d\n", HDEVNAME(hp),
|
||||||
// status));
|
status));
|
||||||
|
|
||||||
|
|
||||||
/* Claim this interrupt. */
|
/* Claim this interrupt. */
|
||||||
@ -901,8 +915,8 @@ sdhc_intr(void *arg)
|
|||||||
HWRITE2(hp, SDHC_EINTR_STATUS, error);
|
HWRITE2(hp, SDHC_EINTR_STATUS, error);
|
||||||
HWRITE2(hp, SDHC_EINTR_SIGNAL_EN, signal);
|
HWRITE2(hp, SDHC_EINTR_SIGNAL_EN, signal);
|
||||||
|
|
||||||
// DPRINTF(2,("%s: error interrupt, status=%d\n",
|
DPRINTF(2,("%s: error interrupt, status=%d\n",
|
||||||
// HDEVNAME(hp), error));
|
HDEVNAME(hp), error));
|
||||||
|
|
||||||
if (ISSET(error, SDHC_CMD_TIMEOUT_ERROR|
|
if (ISSET(error, SDHC_CMD_TIMEOUT_ERROR|
|
||||||
SDHC_DATA_TIMEOUT_ERROR)) {
|
SDHC_DATA_TIMEOUT_ERROR)) {
|
||||||
|
1
sdhc.h
1
sdhc.h
@ -141,6 +141,7 @@ void sdhc_ipc(volatile ipc_request *req);
|
|||||||
#define SDHC_RESET_ALL (1<<0)
|
#define SDHC_RESET_ALL (1<<0)
|
||||||
#define SDHC_NINTR_STATUS 0x30
|
#define SDHC_NINTR_STATUS 0x30
|
||||||
#define SDHC_ERROR_INTERRUPT (1<<15)
|
#define SDHC_ERROR_INTERRUPT (1<<15)
|
||||||
|
#define SDHC_ERROR_TIMEOUT (1<<14)
|
||||||
#define SDHC_CARD_INTERRUPT (1<<8)
|
#define SDHC_CARD_INTERRUPT (1<<8)
|
||||||
#define SDHC_CARD_REMOVAL (1<<7)
|
#define SDHC_CARD_REMOVAL (1<<7)
|
||||||
#define SDHC_CARD_INSERTION (1<<6)
|
#define SDHC_CARD_INSERTION (1<<6)
|
||||||
|
Loading…
Reference in New Issue
Block a user