2009-03-18 09:53:11

by Wolfgang Mües

[permalink] [raw]
Subject: [PATCH 4/7 revised] mmc_spi: do not check CID and CSD blocks with CRC16

From: Wolfgang Muees <[email protected]>

o Some cards are not able to calculate a valid CRC16 value
for CID and CSD reads (CRC for 512 byte data blocks is OK).
So ommit the check for CRC16, as CID and CSD have a checksum
inside the block.

Signed-off-by: Wolfgang Muees <[email protected]>

---

This is patch #4 revised to apply after #1,#2,#5 (already applied)
and #3 (acked by David Brownell). Documentation was extended.
There were some suggestions to move this check into an upper layer
but none of these tries were a valid solution, so stick with this
minimal change here in the readblock function.

diff -uprN 2_6_29_rc7_patch1253/drivers/mmc/host/mmc_spi.c 2_6_29_rc7_patch12534/drivers/mmc/host/mmc_spi.c
--- 2_6_29_rc7_patch1253/drivers/mmc/host/mmc_spi.c 2009-03-16 12:15:36.000000000 +0100
+++ 2_6_29_rc7_patch12534/drivers/mmc/host/mmc_spi.c 2009-03-18 10:32:45.000000000 +0100
@@ -767,7 +767,13 @@ mmc_spi_readblock(struct mmc_spi_host *h
return -EIO;
}

- if (host->mmc->use_spi_crc) {
+ /* Omitt the CRC check for CID reads. There are some SDHC
+ * cards which don't supply a valid CRC after CID reads.
+ * All data reads have len == MMC_SPI_BLOCKSIZE, so use this
+ * check to distinguish between data reads and CID/CSD reads.
+ * Note that CID/CSD has it's own CRC7 value inside the structure.
+ */
+ if (host->mmc->use_spi_crc && (t->len == MMC_SPI_BLOCKSIZE)) {
u16 crc = crc_itu_t(0, t->rx_buf, t->len);

be16_to_cpus(&scratch->crc_val);

---
regards

i. A. Wolfgang M?es
--
Auerswald GmbH & Co. KG
Hardware Development
Telefon: +49 (0)5306 9219 0
Telefax: +49 (0)5306 9219 94
E-Mail: [email protected]
Web: http://www.auerswald.de
?
--------------------------------------------------------------
Auerswald GmbH & Co. KG, Vor den Grash?fen 1, 38162 Cremlingen
Registriert beim AG Braunschweig HRA 13289
p.h.G Auerswald Gesch?ftsf?hrungsges. mbH
Registriert beim AG Braunschweig HRB 7463
Gesch?ftsf?hrer: Dipl-Ing. Gerhard Auerswald


2009-03-24 20:11:22

by David Brownell

[permalink] [raw]
Subject: Re: [PATCH 4/7 revised] mmc_spi: do not check CID and CSD blocks with CRC16

On Wednesday 18 March 2009, Wolfgang M?es wrote:
> From: Wolfgang Muees <[email protected]>
>
> o Some cards are not able to calculate a valid CRC16 value
> for CID and CSD reads (CRC for 512 byte data blocks is OK).
> So ommit the check for CRC16, as CID and CSD have a checksum
> inside the block.
>
> Signed-off-by: Wolfgang Muees <[email protected]>

Acked-by: David Brownell <[email protected]>

.... though I'd edit the patch to spell "Omit" with just one "t".

>
> ---
>
> This is patch #4 revised to apply after #1,#2,#5 (already applied)
> and #3 (acked by David Brownell). Documentation was extended.
> There were some suggestions to move this check into an upper layer
> but none of these tries were a valid solution, so stick with this
> minimal change here in the readblock function.
>
> diff -uprN 2_6_29_rc7_patch1253/drivers/mmc/host/mmc_spi.c 2_6_29_rc7_patch12534/drivers/mmc/host/mmc_spi.c
> --- 2_6_29_rc7_patch1253/drivers/mmc/host/mmc_spi.c 2009-03-16 12:15:36.000000000 +0100
> +++ 2_6_29_rc7_patch12534/drivers/mmc/host/mmc_spi.c 2009-03-18 10:32:45.000000000 +0100
> @@ -767,7 +767,13 @@ mmc_spi_readblock(struct mmc_spi_host *h
> return -EIO;
> }
>
> - if (host->mmc->use_spi_crc) {
> + /* Omitt the CRC check for CID reads. There are some SDHC
> + * cards which don't supply a valid CRC after CID reads.
> + * All data reads have len == MMC_SPI_BLOCKSIZE, so use this
> + * check to distinguish between data reads and CID/CSD reads.
> + * Note that CID/CSD has it's own CRC7 value inside the structure.
> + */
> + if (host->mmc->use_spi_crc && (t->len == MMC_SPI_BLOCKSIZE)) {
> u16 crc = crc_itu_t(0, t->rx_buf, t->len);
>
> be16_to_cpus(&scratch->crc_val);
>
> ---
> regards
>
> i. A. Wolfgang M?es
> --
> Auerswald GmbH & Co. KG
> Hardware Development
> Telefon: +49 (0)5306 9219 0
> Telefax: +49 (0)5306 9219 94
> E-Mail: [email protected]
> Web: http://www.auerswald.de
> ?
> --------------------------------------------------------------
> Auerswald GmbH & Co. KG, Vor den Grash?fen 1, 38162 Cremlingen
> Registriert beim AG Braunschweig HRA 13289
> p.h.G Auerswald Gesch?ftsf?hrungsges. mbH
> Registriert beim AG Braunschweig HRB 7463
> Gesch?ftsf?hrer: Dipl-Ing. Gerhard Auerswald
>
>