lkml.org 
[lkml]   [2008]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 7/7] mmc: at91_mci: do not read irq status twice as it will forget some errors
    Reading AT91_MCI_SR again at the end of transfer can corrupt the
    error reporting. Some fields in the SR register are read-and-clear.

    Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
    ---
    drivers/mmc/host/at91_mci.c | 12 +++++-------
    1 files changed, 5 insertions(+), 7 deletions(-)

    diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c
    index 92a0200..9948fe1 100644
    --- a/drivers/mmc/host/at91_mci.c
    +++ b/drivers/mmc/host/at91_mci.c
    @@ -660,10 +660,9 @@ static void at91_mci_process_next(struct at91mci_host *host)
    /*
    * Handle a command that has been completed
    */
    -static void at91_mci_completed_command(struct at91mci_host *host)
    +static void at91_mci_completed_command(struct at91mci_host *host, unsigned int status)
    {
    struct mmc_command *cmd = host->cmd;
    - unsigned int status;

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

    @@ -677,10 +676,9 @@ static void at91_mci_completed_command(struct at91mci_host *host)
    host->buffer = NULL;
    }

    - status = at91_mci_read(host, AT91_MCI_SR);
    -
    - pr_debug("Status = %08X [%08X %08X %08X %08X]\n",
    - status, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);
    + pr_debug("Status = %08X/%08x [%08X %08X %08X %08X]\n",
    + status, at91_mci_read(host, AT91_MCI_SR),
    + cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);

    if (status & AT91_MCI_ERRORS) {
    if ((status & AT91_MCI_RCRCE) && !(mmc_resp_type(cmd) & MMC_RSP_CRC)) {
    @@ -877,7 +875,7 @@ static irqreturn_t at91_mci_irq(int irq, void *devid)
    if (completed) {
    pr_debug("Completed command\n");
    at91_mci_write(host, AT91_MCI_IDR, 0xffffffff & ~(AT91_MCI_SDIOIRQA | AT91_MCI_SDIOIRQB));
    - at91_mci_completed_command(host);
    + at91_mci_completed_command(host, int_status);
    } else
    at91_mci_write(host, AT91_MCI_IDR, int_status & ~(AT91_MCI_SDIOIRQA | AT91_MCI_SDIOIRQB));

    --
    1.5.3.7



    \
     
     \ /
      Last update: 2008-05-30 14:31    [W:0.022 / U:123.940 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site