Re: [PATCH-v2.6.39] spi/omap_mcspi: Fix broken last word xfer
On Mon, Mar 21, 2011 at 04:27:30PM +0200, Jarkko Nikula wrote: Commit adef658 spi/omap_mcspi: catch xfers of non-multiple SPI word size broke the transmission of last word in cases where access is multiple of word size and word size is 16 or 32 bits. Fix this by replacing the test c (word_len3) in do-while loops with c = 'pointer increment size'. This ensures that the last word is transmitted in above case and still allow to break the loop and prevent variable c underflow in cases where word size != 'pointer increment size'. Signed-off-by: Jarkko Nikula jhnik...@gmail.com Cc: Michael Jones michael.jo...@matrix-vision.de Applied, thanks. g. --- I noticed the issue with wl1251 WLAN driver on Nokia N900 using today's vanilla head a44f99c7efdb88fa41128065c9a9445c19894e34. --- drivers/spi/omap2_mcspi.c |6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c index 3a5ed06..6f86ba0 100644 --- a/drivers/spi/omap2_mcspi.c +++ b/drivers/spi/omap2_mcspi.c @@ -517,7 +517,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %02x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c); } else if (word_len = 16) { u16 *rx; const u16 *tx; @@ -564,7 +564,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %04x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c = 2); } else if (word_len = 32) { u32 *rx; const u32 *tx; @@ -611,7 +611,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %08x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c = 4); } /* for TX_ONLY mode, be sure all words have shifted out */ -- 1.7.4.1 -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH-v2.6.39] spi/omap_mcspi: Fix broken last word xfer
On Mon, Mar 21, 2011 at 7:57 PM, Jarkko Nikula jhnik...@gmail.com wrote: Commit adef658 spi/omap_mcspi: catch xfers of non-multiple SPI word size broke the transmission of last word in cases where access is multiple of word size and word size is 16 or 32 bits. Fix this by replacing the test c (word_len3) in do-while loops with c = 'pointer increment size'. This ensures that the last word is transmitted in above case and still allow to break the loop and prevent variable c underflow in cases where word size != 'pointer increment size'. Signed-off-by: Jarkko Nikula jhnik...@gmail.com Cc: Michael Jones michael.jo...@matrix-vision.de --- I noticed the issue with wl1251 WLAN driver on Nokia N900 using today's vanilla head a44f99c7efdb88fa41128065c9a9445c19894e34. --- drivers/spi/omap2_mcspi.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c index 3a5ed06..6f86ba0 100644 --- a/drivers/spi/omap2_mcspi.c +++ b/drivers/spi/omap2_mcspi.c @@ -517,7 +517,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %02x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c); } else if (word_len = 16) { u16 *rx; const u16 *tx; @@ -564,7 +564,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %04x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c = 2); } else if (word_len = 32) { u32 *rx; const u32 *tx; @@ -611,7 +611,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %08x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c = 4); } /* for TX_ONLY mode, be sure all words have shifted out */ -- 1.7.4.1 Latest mainline when booted on Omap4 was not booting up. It crashes showing something like this: [2.581634] ks8851 spi1.0: (unregistered net_device): spi_sync() failed [2.589843] ks8851 spi1.0: (unregistered net_device): spi_sync() failed [2.597900] ks8851 spi1.0: (unregistered net_device): read: spi_sync() failed [2.605499] ks8851 spi1.0: failed to read device ID The above patch when applied to the mainline solves the problem and the kernel boots fine on Omap4. Tested-by: Sourav Poddarsourav.pod...@ti.com -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH-v2.6.39] spi/omap_mcspi: Fix broken last word xfer
On 03/21/2011 03:27 PM, Jarkko Nikula wrote: Commit adef658 spi/omap_mcspi: catch xfers of non-multiple SPI word size broke the transmission of last word in cases where access is multiple of word size and word size is 16 or 32 bits. Fix this by replacing the test c (word_len3) in do-while loops with c = 'pointer increment size'. This ensures that the last word is transmitted in above case and still allow to break the loop and prevent variable c underflow in cases where word size != 'pointer increment size'. Signed-off-by: Jarkko Nikula jhnik...@gmail.com Cc: Michael Jones michael.jo...@matrix-vision.de --- I noticed the issue with wl1251 WLAN driver on Nokia N900 using today's vanilla head a44f99c7efdb88fa41128065c9a9445c19894e34. --- drivers/spi/omap2_mcspi.c |6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c index 3a5ed06..6f86ba0 100644 --- a/drivers/spi/omap2_mcspi.c +++ b/drivers/spi/omap2_mcspi.c @@ -517,7 +517,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %02x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c); } else if (word_len = 16) { u16 *rx; const u16 *tx; @@ -564,7 +564,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %04x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c = 2); } else if (word_len = 32) { u32 *rx; const u32 *tx; @@ -611,7 +611,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %08x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c = 4); } /* for TX_ONLY mode, be sure all words have shifted out */ Acked-by: Michael Jones michael.jo...@matrix-vision.de MATRIX VISION GmbH, Talstrasse 16, DE-71570 Oppenweiler Registergericht: Amtsgericht Stuttgart, HRB 271090 Geschaeftsfuehrer: Gerhard Thullner, Werner Armingeon, Uwe Furtner -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH-v2.6.39] spi/omap_mcspi: Fix broken last word xfer
Commit adef658 spi/omap_mcspi: catch xfers of non-multiple SPI word size broke the transmission of last word in cases where access is multiple of word size and word size is 16 or 32 bits. Fix this by replacing the test c (word_len3) in do-while loops with c = 'pointer increment size'. This ensures that the last word is transmitted in above case and still allow to break the loop and prevent variable c underflow in cases where word size != 'pointer increment size'. Signed-off-by: Jarkko Nikula jhnik...@gmail.com Cc: Michael Jones michael.jo...@matrix-vision.de --- I noticed the issue with wl1251 WLAN driver on Nokia N900 using today's vanilla head a44f99c7efdb88fa41128065c9a9445c19894e34. --- drivers/spi/omap2_mcspi.c |6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c index 3a5ed06..6f86ba0 100644 --- a/drivers/spi/omap2_mcspi.c +++ b/drivers/spi/omap2_mcspi.c @@ -517,7 +517,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %02x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c); } else if (word_len = 16) { u16 *rx; const u16 *tx; @@ -564,7 +564,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %04x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c = 2); } else if (word_len = 32) { u32 *rx; const u32 *tx; @@ -611,7 +611,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) dev_vdbg(spi-dev, read-%d %08x\n, word_len, *(rx - 1)); } - } while (c (word_len3)); + } while (c = 4); } /* for TX_ONLY mode, be sure all words have shifted out */ -- 1.7.4.1 -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html