mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-02 09:46:37 +03:00
spi: fsl_espi: fix read transactions
Since commit7917c2e356("spi: fsl_espi: fix din offset") MTD is basically broken because any read transaction will get wrong data. While the commit in question will fix simple transfers (where both SPI_XFER_BEGIN and SPI_XFER_END is set), it will break the most common case, where opcode and address is send first and then data comes as a second transfer. This basically reverts commit7917c2e356("spi: fsl_espi: fix din offset") and make the fix particular for this simple case. Instead of providing two buffers for reading and writing, just malloc one which is used for both. This will work because the data is first written on the SPI bus and then it will be read (and overwite the written data) into the same buffer. Suggested-by: Tomas Alvarez Vanoli <tomas.alvarez-vanoli@hitachienergy.com> Fixes:7917c2e356("spi: fsl_espi: fix din offset") Signed-off-by: Michael Walle <mwalle@kernel.org> Signed-off-by: Peng Fan <peng.fan@nxp.com>
This commit is contained in:
@@ -216,13 +216,13 @@ int espi_xfer(struct fsl_spi_slave *fsl, uint cs, unsigned int bitlen,
|
||||
break;
|
||||
case SPI_XFER_BEGIN | SPI_XFER_END:
|
||||
len = data_len;
|
||||
buffer = (unsigned char *)malloc(len * 2);
|
||||
buffer = (unsigned char *)malloc(len);
|
||||
if (!buffer) {
|
||||
debug("SF: Failed to malloc memory.\n");
|
||||
return 1;
|
||||
}
|
||||
memcpy(buffer, data_out, len);
|
||||
rx_offset = len;
|
||||
rx_offset = 0;
|
||||
cmd_len = 0;
|
||||
break;
|
||||
}
|
||||
@@ -275,7 +275,7 @@ int espi_xfer(struct fsl_spi_slave *fsl, uint cs, unsigned int bitlen,
|
||||
}
|
||||
}
|
||||
if (data_in) {
|
||||
memcpy(data_in, buffer + rx_offset, tran_len);
|
||||
memcpy(data_in, buffer + 2 * cmd_len, tran_len);
|
||||
if (*buffer == 0x0b) {
|
||||
data_in += tran_len;
|
||||
data_len -= tran_len;
|
||||
|
||||
Reference in New Issue
Block a user