[PATCH] at91_mci: manage cmd error and data error independently

From: Nicolas Ferre
Date: Tue Jun 10 2008 - 05:28:15 EST


In at91_mci_completed_command() function, this patch distinguishes command error and data error. It reports it in the corresponding error field.

Signed-off-by: Nicolas Ferre <nicolas.ferre@xxxxxxxxx>
---
Related to this thread :

Pierre Ossman :

On Fri, 06 Jun 2008 17:31:15 +0200
Nicolas Ferre <nicolas.ferre@xxxxxxxxx> wrote:

Hi Pierre,

Here are the results of a mmc_test run played on at91_mci after applying this patch series :
http://lkml.org/lkml/2008/5/30/201

I skipped some of the tests just to concentrate on those ones.

Can you tell me if the test is correct : are the errors reported for the xfer_size tests the normal behavior (I assume yes because a failure is simulated) ?

No. You're supposed to get an OK there as well. Basically it tests that
the driver doesn't report some unexpected error (-ETIMEDOUT is the
desired one) or overreports the number of written bytes.
Ok, so here is the first correction of the driver reporting the proper values in read.

It goes on top of this series :
http://lkml.org/lkml/2008/5/30/201

drivers/mmc/host/at91_mci.c | 28 ++++++++++++++++++++--------
1 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c
index 9948fe1..86a3c5b 100644
--- a/drivers/mmc/host/at91_mci.c
+++ b/drivers/mmc/host/at91_mci.c
@@ -663,6 +664,7 @@ static void at91_mci_process_next(struct at91mci_host *host)
static void at91_mci_completed_command(struct at91mci_host *host, unsigned int status)
{
struct mmc_command *cmd = host->cmd;
+ struct mmc_data *data = cmd->data;

at91_mci_write(host, AT91_MCI_IDR, 0xffffffff & ~(AT91_MCI_SDIOIRQA | AT91_MCI_SDIOIRQB));

@@ -685,15 +687,25 @@ static void at91_mci_completed_command(struct at91mci_host *host, unsigned int s
cmd->error = 0;
}
else {
- if (status & (AT91_MCI_RTOE | AT91_MCI_DTOE))
- cmd->error = -ETIMEDOUT;
- else if (status & (AT91_MCI_RCRCE | AT91_MCI_DCRCE))
- cmd->error = -EILSEQ;
- else
- cmd->error = -EIO;
+ if (status & (AT91_MCI_DTOE | AT91_MCI_DCRCE)) {
+ if (data) {
+ if (status & AT91_MCI_DTOE)
+ data->error = -ETIMEDOUT;
+ else if (status & AT91_MCI_DCRCE)
+ data->error = -EILSEQ;
+ }
+ } else {
+ if (status & AT91_MCI_RTOE)
+ cmd->error = -ETIMEDOUT;
+ else if (status & AT91_MCI_RCRCE)
+ cmd->error = -EILSEQ;
+ else
+ cmd->error = -EIO;
+ }

- pr_debug("Error detected and set to %d (cmd = %d, retries = %d)\n",
- cmd->error, cmd->opcode, cmd->retries);
+ pr_debug("Error detected and set to %d/%d (cmd = %d, retries = %d)\n",
+ cmd->error, data ? data->error : 0,
+ cmd->opcode, cmd->retries);
}
}
else
--
1.5.3.7


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/