[U-Boot] [PATCH] spi: zynq_spi: Fix infinite looping while xfer

During spi transfer, for example: sspi 1:1.0 8 ff
the rx_len values will be: rx_len = 0 rx_len = 4294967295
This caused a busy looping during xfer, this patch fixes it by adding a check while reading the rx fifo
Signed-off-by: Lad, Prabhakar Prabhakar.Lad@racelogic.co.uk Cc: Michal Simek michal.simek@xilinx.com Cc: Siva Durga Prasad Paladugu sivadur@xilinx.com Cc: Jagan Teki jteki@openedev.com --- drivers/spi/zynq_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/spi/zynq_spi.c b/drivers/spi/zynq_spi.c index 09ae1be..dd3de27 100644 --- a/drivers/spi/zynq_spi.c +++ b/drivers/spi/zynq_spi.c @@ -230,7 +230,7 @@ static int zynq_spi_xfer(struct udevice *dev, unsigned int bitlen,
/* Read the data from RX FIFO */ status = readl(®s->isr); - while (status & ZYNQ_SPI_IXR_RXNEMPTY_MASK) { + while ((status & ZYNQ_SPI_IXR_RXNEMPTY_MASK) && rx_len) { buf = readl(®s->rxdr); if (rx_buf) *rx_buf++ = buf;

On Thu, Jun 23, 2016 at 2:58 PM, Lad, Prabhakar prabhakar.csengg@gmail.com wrote:
During spi transfer, for example: sspi 1:1.0 8 ff
the rx_len values will be: rx_len = 0 rx_len = 4294967295
This caused a busy looping during xfer, this patch fixes it by adding a check while reading the rx fifo
Gentle ping..
Cheers, --Prabhakar Lad

On 23 June 2016 at 19:28, Lad, Prabhakar prabhakar.csengg@gmail.com wrote:
During spi transfer, for example: sspi 1:1.0 8 ff
the rx_len values will be: rx_len = 0 rx_len = 4294967295
Does these number during 'sspi' or during data transfer? why rx_len is 4294967295?
This caused a busy looping during xfer, this patch fixes it by adding a check while reading the rx fifo
Signed-off-by: Lad, Prabhakar Prabhakar.Lad@racelogic.co.uk Cc: Michal Simek michal.simek@xilinx.com Cc: Siva Durga Prasad Paladugu sivadur@xilinx.com Cc: Jagan Teki jteki@openedev.com
drivers/spi/zynq_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/spi/zynq_spi.c b/drivers/spi/zynq_spi.c index 09ae1be..dd3de27 100644 --- a/drivers/spi/zynq_spi.c +++ b/drivers/spi/zynq_spi.c @@ -230,7 +230,7 @@ static int zynq_spi_xfer(struct udevice *dev, unsigned int bitlen,
/* Read the data from RX FIFO */ status = readl(®s->isr);
while (status & ZYNQ_SPI_IXR_RXNEMPTY_MASK) {
while ((status & ZYNQ_SPI_IXR_RXNEMPTY_MASK) && rx_len) { buf = readl(®s->rxdr); if (rx_buf) *rx_buf++ = buf;

On Thu, Jul 21, 2016 at 7:58 AM, Jagan Teki jagannadh.teki@gmail.com wrote:
On 23 June 2016 at 19:28, Lad, Prabhakar prabhakar.csengg@gmail.com wrote:
During spi transfer, for example: sspi 1:1.0 8 ff
the rx_len values will be: rx_len = 0 rx_len = 4294967295
Does these number during 'sspi' or during data transfer? why rx_len is 4294967295?
As mentioned in the commit, if you run the command 'sspi 1:1.0 8 ff' It just keeps busy looping.
Cheers, --Prabhakar Lad

On 21 July 2016 at 13:54, Lad, Prabhakar prabhakar.csengg@gmail.com wrote:
On Thu, Jul 21, 2016 at 7:58 AM, Jagan Teki jagannadh.teki@gmail.com wrote:
On 23 June 2016 at 19:28, Lad, Prabhakar prabhakar.csengg@gmail.com wrote:
During spi transfer, for example: sspi 1:1.0 8 ff
the rx_len values will be: rx_len = 0 rx_len = 4294967295
Does these number during 'sspi' or during data transfer? why rx_len is 4294967295?
As mentioned in the commit, if you run the command 'sspi 1:1.0 8 ff' It just keeps busy looping.
OK, will update commit message as for rx

On 23 June 2016 at 19:28, Lad, Prabhakar prabhakar.csengg@gmail.com wrote:
During spi transfer, for example: sspi 1:1.0 8 ff
the rx_len values will be: rx_len = 0 rx_len = 4294967295
This caused a busy looping during xfer, this patch fixes it by adding a check while reading the rx fifo
Signed-off-by: Lad, Prabhakar Prabhakar.Lad@racelogic.co.uk Cc: Michal Simek michal.simek@xilinx.com Cc: Siva Durga Prasad Paladugu sivadur@xilinx.com Cc: Jagan Teki jteki@openedev.com
drivers/spi/zynq_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/spi/zynq_spi.c b/drivers/spi/zynq_spi.c index 09ae1be..dd3de27 100644 --- a/drivers/spi/zynq_spi.c +++ b/drivers/spi/zynq_spi.c @@ -230,7 +230,7 @@ static int zynq_spi_xfer(struct udevice *dev, unsigned int bitlen,
/* Read the data from RX FIFO */ status = readl(®s->isr);
while (status & ZYNQ_SPI_IXR_RXNEMPTY_MASK) {
while ((status & ZYNQ_SPI_IXR_RXNEMPTY_MASK) && rx_len) {
Do post-decrement directly on while.
thanks!

On Sat, Jul 23, 2016 at 5:19 PM, Jagan Teki jagannadh.teki@gmail.com wrote:
On 23 June 2016 at 19:28, Lad, Prabhakar prabhakar.csengg@gmail.com wrote:
During spi transfer, for example: sspi 1:1.0 8 ff
the rx_len values will be: rx_len = 0 rx_len = 4294967295
This caused a busy looping during xfer, this patch fixes it by adding a check while reading the rx fifo
Signed-off-by: Lad, Prabhakar Prabhakar.Lad@racelogic.co.uk Cc: Michal Simek michal.simek@xilinx.com Cc: Siva Durga Prasad Paladugu sivadur@xilinx.com Cc: Jagan Teki jteki@openedev.com
drivers/spi/zynq_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/spi/zynq_spi.c b/drivers/spi/zynq_spi.c index 09ae1be..dd3de27 100644 --- a/drivers/spi/zynq_spi.c +++ b/drivers/spi/zynq_spi.c @@ -230,7 +230,7 @@ static int zynq_spi_xfer(struct udevice *dev, unsigned int bitlen,
/* Read the data from RX FIFO */ status = readl(®s->isr);
while (status & ZYNQ_SPI_IXR_RXNEMPTY_MASK) {
while ((status & ZYNQ_SPI_IXR_RXNEMPTY_MASK) && rx_len) {
Do post-decrement directly on while.
Its the matter of taste, I usually prefer minimal changes. Anyway above in the function tx_len isnt done in while just keeping it consistent.
Cheers, --Prabhakar Lad

Please resend the patch, patchwork mbox download shows different.
On 24 July 2016 at 00:49, Lad, Prabhakar prabhakar.csengg@gmail.com wrote:
On Sat, Jul 23, 2016 at 5:19 PM, Jagan Teki jagannadh.teki@gmail.com wrote:
On 23 June 2016 at 19:28, Lad, Prabhakar prabhakar.csengg@gmail.com wrote:
During spi transfer, for example: sspi 1:1.0 8 ff
participants (2)
-
Jagan Teki
-
Lad, Prabhakar