Skip to content

Commit

Permalink
at91_mci: AT91SAM9260/9263 12 byte write erratum (v2)
Browse files Browse the repository at this point in the history
AT91SAM926[0/3] PDC must write at least 12 bytes. The code compiles and runs
but the actual condition for this erratum did not trigger in my tests so it's
unclear if it actually works as intended.

Signed-off-by: Ville Syrjala <[email protected]>
Signed-off-by: Nicolas Ferre <[email protected]>
Signed-off-by: Pierre Ossman <[email protected]>
  • Loading branch information
syrjala authored and Pierre Ossman committed Jul 15, 2008
1 parent fa1fe01 commit 5385edc
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions drivers/mmc/host/at91_mci.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,14 @@ static inline void at91_mci_sg_to_dma(struct at91mci_host *host, struct mmc_data
unsigned int len, i, size;
unsigned *dmabuf = host->buffer;

size = host->total_length;
size = data->blksz * data->blocks;
len = data->sg_len;

/* AT91SAM926[0/3] Data Write Operation and number of bytes erratum */
if (cpu_is_at91sam9260() || cpu_is_at91sam9263())
if (host->total_length == 12)
memset(dmabuf, 0, 12);

/*
* Just loop through all entries. Size might not
* be the entire list though so make sure that
Expand All @@ -222,9 +227,10 @@ static inline void at91_mci_sg_to_dma(struct at91mci_host *host, struct mmc_data

for (index = 0; index < (amount / 4); index++)
*dmabuf++ = swab32(sgbuffer[index]);
}
else
} else {
memcpy(dmabuf, sgbuffer, amount);
dmabuf += amount;
}

kunmap_atomic(sgbuffer, KM_BIO_SRC_IRQ);

Expand Down Expand Up @@ -417,7 +423,7 @@ static void at91_mci_update_bytes_xfered(struct at91mci_host *host)
/* card is in IDLE mode now */
pr_debug("-> bytes_xfered %d, total_length = %d\n",
data->bytes_xfered, host->total_length);
data->bytes_xfered = host->total_length;
data->bytes_xfered = data->blksz * data->blocks;
}
}
}
Expand Down Expand Up @@ -600,6 +606,13 @@ static void at91_mci_send_command(struct at91mci_host *host, struct mmc_command
* Handle a write
*/
host->total_length = block_length * blocks;
/*
* AT91SAM926[0/3] Data Write Operation and
* number of bytes erratum
*/
if (cpu_is_at91sam9260 () || cpu_is_at91sam9263())
if (host->total_length < 12)
host->total_length = 12;
host->buffer = dma_alloc_coherent(NULL,
host->total_length,
&host->physical_address, GFP_KERNEL);
Expand Down

0 comments on commit 5385edc

Please sign in to comment.