[U-Boot] [PATCH] spi: mxc: Fix data loss for non aligned write buffers.

Jagan Teki
2013-10-16T05:46:49Z

Hi,

On Tue, Oct 15, 2013 at 11:27 PM, Martin Fuzzey <mfuzzey@parkeon.com> wrote:
> When writing buffers that are not 32 bit aligned data loss occurs.
>
> This can also occur when the total transfer size is not a multiple of 4 bytes
> since the extra bytes are written first causing the rest to be unaligned.
>
> This can be seen by writing to SPI flash a 57 byte file containing 00 01 .. 38:
>
> U-Boot > dhcp data.bin
> ...
> Bytes transferred = 57 (39 hex)
> U-Boot > md.b $loadaddr
> 72000000: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................
> 72000010: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................
> 72000020: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f !"#$%&'()*+,-./
> 72000030: 30 31 32 33 34 35 36 37 38 ff ff ff ff ff ff ff 012345678.......
> U-Boot > sf write $loadaddr 0 $filesize
>
> U-Boot > mw.b $loadaddr ff 100
> U-Boot > sf read $loadaddr 0 100
> U-Boot > md.b $loadaddr
> 72000000: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................
> 72000010: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................
> 72000020: 20 21 22 23 24 29 2a 2b 2c 31 32 33 34 ff ff ff !"#$)*+,1234...
> 72000030: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
>
> [bytes 25-28, 2d-30, 35-38 are missing]
>
> Activating debug in the write command gave:
> spi_xchg_single: bitlen 256 dout 0x72000000 din 0x0
> Sending SPI 0x10203
> Sending SPI 0x4050607
> Sending SPI 0x8090a0b
> Sending SPI 0xc0d0e0f
> Sending SPI 0x10111213
> Sending SPI 0x14151617
> Sending SPI 0x18191a1b
> Sending SPI 0x1c1d1e1f
> SPI Rx: 0xffffffff 0xffffffff
> ...
> SPI Rx: 0xffffffff 0xffffffff
> spi_xchg_single: bitlen 200 dout 0x72000020 din 0x0
> Sending SPI 0x20
> Sending SPI 0x21222324
> Sending SPI 0x292a2b2c <=== What happened to 25262728?
> Sending SPI 0x31323334
> Sending SPI 0xffffffff
> ...
> SF: program success 57 bytes @ 0x0
Thanks for your log, for showing the exact issues.

>
>
> The problem was that the pointer was being incremented twice for the non aligned case.
>
> Signed-off-by: Martin Fuzzey <mfuzzey@parkeon.com>
> ---
> drivers/spi/mxc_spi.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c
> index 859c43f..964a2b7 100644
> --- a/drivers/spi/mxc_spi.c
> +++ b/drivers/spi/mxc_spi.c
> @@ -274,8 +274,8 @@ int spi_xchg_single(struct spi_slave *slave, unsigned int bitlen,
> } else {
> data = *(u32 *)dout;
> data = cpu_to_be32(data);
> + dout += 4;
> }
> - dout += 4;
> }
> debug("Sending SPI 0x%x\n", data);
> reg_write(&regs->txdata, data);
>

This patch pushed on master, please check it on
http://git.denx.de/?p=u-boot.git;a=commitdiff;h=6d5ce1bd0048617d48c05de1a84fae8696081127

--
Thanks,
Jagan.
--------
Jagannadha Sutradharudu Teki,
E: jagannadh.teki at gmail.com, P: +91-9676773388
Engineer - System Software Hacker
U-boot - SPI Custodian and Zynq APSOC
Ln: http://www.linkedin.com/in/jaganteki