diff mbox

[U-Boot,RESEND] x86: ich-spi: Fix a bug of reading from a non-64 bytes aligned address

Message ID 1418200550-4374-1-git-send-email-bmeng.cn@gmail.com
State Accepted
Delegated to: Simon Glass
Headers show

Commit Message

Bin Meng Dec. 10, 2014, 8:35 a.m. UTC
The ich spi controller driver spi_xfer() tries to align reading
address to 64 bytes when doing spi data in, which causes a bug of
either infinite loop or a huge size memcpy().

Actually the ich spi controller does not have such requirement of
64 bytes alignment when reading data from spi slave devices.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
Tested-by: Simon Glass <sjg@chromium.org>

---
RESEND Notes:
Simon, this patch can be applied now as it does not require any
dependency to Jagan's recent patch series, nor my x86 patch series.

 drivers/spi/ich.c | 17 ++---------------
 1 file changed, 2 insertions(+), 15 deletions(-)

Comments

Simon Glass Dec. 11, 2014, 3:19 a.m. UTC | #1
On 10 December 2014 at 01:35, Bin Meng <bmeng.cn@gmail.com> wrote:
> The ich spi controller driver spi_xfer() tries to align reading
> address to 64 bytes when doing spi data in, which causes a bug of
> either infinite loop or a huge size memcpy().
>
> Actually the ich spi controller does not have such requirement of
> 64 bytes alignment when reading data from spi slave devices.
>
> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
> Acked-by: Simon Glass <sjg@chromium.org>
> Tested-by: Simon Glass <sjg@chromium.org>
>
> ---
> RESEND Notes:
> Simon, this patch can be applied now as it does not require any
> dependency to Jagan's recent patch series, nor my x86 patch series.

Applied to x86 - thanks!

- Simon
diff mbox

Patch

diff --git a/drivers/spi/ich.c b/drivers/spi/ich.c
index 0e00edf..7b24981 100644
--- a/drivers/spi/ich.c
+++ b/drivers/spi/ich.c
@@ -484,8 +484,6 @@  int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
 	struct spi_trans *trans = &ich->trans;
 	unsigned type = flags & (SPI_XFER_BEGIN | SPI_XFER_END);
 	int using_cmd = 0;
-	/* Align read transactions to 64-byte boundaries */
-	char buff[ctlr.databytes];
 
 	/* Ee don't support writing partial bytes. */
 	if (bitlen % 8) {
@@ -633,14 +631,9 @@  int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
 	 */
 	while (trans->bytesout || trans->bytesin) {
 		uint32_t data_length;
-		uint32_t aligned_offset;
-		uint32_t diff;
-
-		aligned_offset = trans->offset & ~(ctlr.databytes - 1);
-		diff = trans->offset - aligned_offset;
 
 		/* SPI addresses are 24 bit only */
-		ich_writel(aligned_offset & 0x00FFFFFF, ctlr.addr);
+		ich_writel(trans->offset & 0x00FFFFFF, ctlr.addr);
 
 		if (trans->bytesout)
 			data_length = min(trans->bytesout, ctlr.databytes);
@@ -674,13 +667,7 @@  int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
 		}
 
 		if (trans->bytesin) {
-			if (diff) {
-				data_length -= diff;
-				read_reg(ctlr.data, buff, ctlr.databytes);
-				memcpy(trans->in, buff + diff, data_length);
-			} else {
-				read_reg(ctlr.data, trans->in, data_length);
-			}
+			read_reg(ctlr.data, trans->in, data_length);
 			spi_use_in(trans, data_length);
 			if (with_address)
 				trans->offset += data_length;