diff options
author | mkarcher <mkarcher@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1> | 2012-03-06 22:17:06 +0000 |
---|---|---|
committer | mkarcher <mkarcher@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1> | 2012-03-06 22:17:06 +0000 |
commit | 0696959556506afaf30319a752fd29716d2470fd (patch) | |
tree | 5e061ffcfcac316ebb7e346317fe3b86bcb68bdb /linux_spi.c | |
parent | 9b77f60de08e2cf0eabbfc9ab42136f0dca340e5 (diff) | |
download | flashrom-0696959556506afaf30319a752fd29716d2470fd.tar.gz |
Prevent submission of empty read requests in linux_spi.
The submission of zero-sized read requests in a write-only transaction
fails at least for omap2_mcspi drivers and is pointless in general.
This patch does not address the implementation of zero-sized writes (which
would need to skip the write command), as there are no flash transactions
not starting with a command.
Signed-off-by: Michael Karcher <flashrom@mkarcher.dialup.fu-berlin.de>
Acked-by: Stefan Tauner <stefan.tauner@student.tuwien.ac.at>
git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@1513 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'linux_spi.c')
-rw-r--r-- | linux_spi.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/linux_spi.c b/linux_spi.c index 2ae681f..17d003e 100644 --- a/linux_spi.c +++ b/linux_spi.c @@ -130,6 +130,7 @@ static int linux_spi_send_command(struct flashctx *flash, unsigned int writecnt, const unsigned char *txbuf, unsigned char *rxbuf) { + int iocontrol_code; struct spi_ioc_transfer msg[2] = { { .tx_buf = (uint64_t)(ptrdiff_t)txbuf, @@ -143,8 +144,19 @@ static int linux_spi_send_command(struct flashctx *flash, unsigned int writecnt, if (fd == -1) return -1; - - if (ioctl(fd, SPI_IOC_MESSAGE(2), msg) == -1) { + /* The implementation currently does not support requests that + don't start with sending a command. */ + if (writecnt == 0) + return SPI_INVALID_LENGTH; + + /* Just submit the first (write) request in case there is nothing + to read. Otherwise submit both requests. */ + if (readcnt == 0) + iocontrol_code = SPI_IOC_MESSAGE(1); + else + iocontrol_code = SPI_IOC_MESSAGE(2); + + if (ioctl(fd, iocontrol_code, msg) == -1) { msg_cerr("%s: ioctl: %s\n", __func__, strerror(errno)); return -1; } |