diff mbox series

[2/2] spi: s3c64xx: update flush_fifo timeout code

Message ID 20240924134009.116247-3-ben.dooks@codethink.co.uk
State New
Headers show
Series [1/2] spi: s3c64xx: fix timeout counters in flush_fifo | expand

Commit Message

Ben Dooks Sept. 24, 2024, 1:40 p.m. UTC
The code that checks for loops in the s3c6xx_flush_fifo() checks
for loops being non-zero as a timeout, however the code /could/
finish with loops being zero and the fifo being flushed...

Also, it would be useful to know what is left in the fifo for this
error case, so update the checks to see what is left, and then also
print the number of entries.

Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
---
 drivers/spi/spi-s3c64xx.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Andi Shyti Sept. 30, 2024, 10:51 p.m. UTC | #1
On Tue, Sep 24, 2024 at 02:40:09PM GMT, Ben Dooks wrote:
> The code that checks for loops in the s3c6xx_flush_fifo() checks
> for loops being non-zero as a timeout, however the code /could/
> finish with loops being zero and the fifo being flushed...

what is the possibility of this case?

> Also, it would be useful to know what is left in the fifo for this
> error case, so update the checks to see what is left, and then also
> print the number of entries.
> 
> Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
> ---
>  drivers/spi/spi-s3c64xx.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
> index 6ab416a33966..7b244e1fd58a 100644
> --- a/drivers/spi/spi-s3c64xx.c
> +++ b/drivers/spi/spi-s3c64xx.c
> @@ -247,8 +247,8 @@ static void s3c64xx_flush_fifo(struct s3c64xx_spi_driver_data *sdd)
>  		val = readl(regs + S3C64XX_SPI_STATUS);
>  	} while (TX_FIFO_LVL(val, sdd) && --loops);
>  
> -	if (loops == 0)
> -		dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO\n");
> +	if (TX_FIFO_LVL(val, sdd))
> +		dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO (%d left)\n", TX_FIFO_LVL(val, sdd));
>  
>  	/* Flush RxFIFO*/
>  	loops = msecs_to_loops(1);
> @@ -260,8 +260,8 @@ static void s3c64xx_flush_fifo(struct s3c64xx_spi_driver_data *sdd)
>  			break;
>  	} while (--loops);
>  
> -	if (loops == 0)
> -		dev_warn(&sdd->pdev->dev, "Timed out flushing RX FIFO\n");
> +	if (RX_FIFO_LVL(val, sdd))
> +		dev_warn(&sdd->pdev->dev, "Timed out flushing RX FIFO (%d left)\n", RX_FIFO_LVL(val, sdd));

This change doesn't super excite me, but it's fine. Please add a
comment explaining the case when loops is '0' and the FIFO is
flushed.

With the comment given, you can have my r-b.

Thanks,
Andi

>  	val = readl(regs + S3C64XX_SPI_CH_CFG);
>  	val &= ~S3C64XX_SPI_CH_SW_RST;
> -- 
> 2.37.2.352.g3c44437643
>
Ben Dooks Oct. 1, 2024, 7:01 a.m. UTC | #2
On 30/09/2024 23:51, Andi Shyti wrote:
> On Tue, Sep 24, 2024 at 02:40:09PM GMT, Ben Dooks wrote:
>> The code that checks for loops in the s3c6xx_flush_fifo() checks
>> for loops being non-zero as a timeout, however the code /could/
>> finish with loops being zero and the fifo being flushed...
> 
> what is the possibility of this case?

Not sure, currently we're trying to debug a customer's setup where
we're seeing some weird issues with SPI. This was found during a
look into the code awaiting hardware access.

The flush count was simply an inspection and it seemed like a good
idea to fix the initial issue and then if there was an issue to
print something more useful than a simple error message.

>> Also, it would be useful to know what is left in the fifo for this
>> error case, so update the checks to see what is left, and then also
>> print the number of entries.
>>
>> Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
>> ---
>>   drivers/spi/spi-s3c64xx.c | 8 ++++----
>>   1 file changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
>> index 6ab416a33966..7b244e1fd58a 100644
>> --- a/drivers/spi/spi-s3c64xx.c
>> +++ b/drivers/spi/spi-s3c64xx.c
>> @@ -247,8 +247,8 @@ static void s3c64xx_flush_fifo(struct s3c64xx_spi_driver_data *sdd)
>>   		val = readl(regs + S3C64XX_SPI_STATUS);
>>   	} while (TX_FIFO_LVL(val, sdd) && --loops);
>>   
>> -	if (loops == 0)
>> -		dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO\n");
>> +	if (TX_FIFO_LVL(val, sdd))
>> +		dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO (%d left)\n", TX_FIFO_LVL(val, sdd));
>>   
>>   	/* Flush RxFIFO*/
>>   	loops = msecs_to_loops(1);
>> @@ -260,8 +260,8 @@ static void s3c64xx_flush_fifo(struct s3c64xx_spi_driver_data *sdd)
>>   			break;
>>   	} while (--loops);
>>   
>> -	if (loops == 0)
>> -		dev_warn(&sdd->pdev->dev, "Timed out flushing RX FIFO\n");
>> +	if (RX_FIFO_LVL(val, sdd))
>> +		dev_warn(&sdd->pdev->dev, "Timed out flushing RX FIFO (%d left)\n", RX_FIFO_LVL(val, sdd));
> 
> This change doesn't super excite me, but it's fine. Please add a
> comment explaining the case when loops is '0' and the FIFO is
> flushed.
> 
> With the comment given, you can have my r-b.

Ok, will look at sending a second version later this week.

> 
> Thanks,
> Andi
> 
>>   	val = readl(regs + S3C64XX_SPI_CH_CFG);
>>   	val &= ~S3C64XX_SPI_CH_SW_RST;
>> -- 
>> 2.37.2.352.g3c44437643
>>
>
Andi Shyti Oct. 1, 2024, 9:19 a.m. UTC | #3
Hi Ben,

On Tue, Oct 01, 2024 at 08:01:48AM GMT, Ben Dooks wrote:
> On 30/09/2024 23:51, Andi Shyti wrote:
> > On Tue, Sep 24, 2024 at 02:40:09PM GMT, Ben Dooks wrote:
> > > The code that checks for loops in the s3c6xx_flush_fifo() checks
> > > for loops being non-zero as a timeout, however the code /could/
> > > finish with loops being zero and the fifo being flushed...
> > 
> > what is the possibility of this case?
> 
> Not sure, currently we're trying to debug a customer's setup where
> we're seeing some weird issues with SPI. This was found during a
> look into the code awaiting hardware access.
> 
> The flush count was simply an inspection and it seemed like a good
> idea to fix the initial issue and then if there was an issue to
> print something more useful than a simple error message.
> 
> > > Also, it would be useful to know what is left in the fifo for this
> > > error case, so update the checks to see what is left, and then also
> > > print the number of entries.
> > > 
> > > Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
> > > ---
> > >   drivers/spi/spi-s3c64xx.c | 8 ++++----
> > >   1 file changed, 4 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
> > > index 6ab416a33966..7b244e1fd58a 100644
> > > --- a/drivers/spi/spi-s3c64xx.c
> > > +++ b/drivers/spi/spi-s3c64xx.c
> > > @@ -247,8 +247,8 @@ static void s3c64xx_flush_fifo(struct s3c64xx_spi_driver_data *sdd)
> > >   		val = readl(regs + S3C64XX_SPI_STATUS);
> > >   	} while (TX_FIFO_LVL(val, sdd) && --loops);
> > > -	if (loops == 0)
> > > -		dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO\n");
> > > +	if (TX_FIFO_LVL(val, sdd))
> > > +		dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO (%d left)\n", TX_FIFO_LVL(val, sdd));
> > >   	/* Flush RxFIFO*/
> > >   	loops = msecs_to_loops(1);
> > > @@ -260,8 +260,8 @@ static void s3c64xx_flush_fifo(struct s3c64xx_spi_driver_data *sdd)
> > >   			break;
> > >   	} while (--loops);
> > > -	if (loops == 0)
> > > -		dev_warn(&sdd->pdev->dev, "Timed out flushing RX FIFO\n");
> > > +	if (RX_FIFO_LVL(val, sdd))
> > > +		dev_warn(&sdd->pdev->dev, "Timed out flushing RX FIFO (%d left)\n", RX_FIFO_LVL(val, sdd));
> > 
> > This change doesn't super excite me, but it's fine. Please add a
> > comment explaining the case when loops is '0' and the FIFO is
> > flushed.
> > 
> > With the comment given, you can have my r-b.
> 
> Ok, will look at sending a second version later this week.

I actually think that these two patches can be squashed into a
single one, I don't see much reason for having it double.

Even better, I think the first patch is not needed at all with
this new one. Right?

Andi

> > 
> > Thanks,
> > Andi
> > 
> > >   	val = readl(regs + S3C64XX_SPI_CH_CFG);
> > >   	val &= ~S3C64XX_SPI_CH_SW_RST;
> > > -- 
> > > 2.37.2.352.g3c44437643
> > > 
> > 
> 
> 
> -- 
> Ben Dooks				http://www.codethink.co.uk/
> Senior Engineer				Codethink - Providing Genius
> 
> https://www.codethink.co.uk/privacy.html
diff mbox series

Patch

diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
index 6ab416a33966..7b244e1fd58a 100644
--- a/drivers/spi/spi-s3c64xx.c
+++ b/drivers/spi/spi-s3c64xx.c
@@ -247,8 +247,8 @@  static void s3c64xx_flush_fifo(struct s3c64xx_spi_driver_data *sdd)
 		val = readl(regs + S3C64XX_SPI_STATUS);
 	} while (TX_FIFO_LVL(val, sdd) && --loops);
 
-	if (loops == 0)
-		dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO\n");
+	if (TX_FIFO_LVL(val, sdd))
+		dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO (%d left)\n", TX_FIFO_LVL(val, sdd));
 
 	/* Flush RxFIFO*/
 	loops = msecs_to_loops(1);
@@ -260,8 +260,8 @@  static void s3c64xx_flush_fifo(struct s3c64xx_spi_driver_data *sdd)
 			break;
 	} while (--loops);
 
-	if (loops == 0)
-		dev_warn(&sdd->pdev->dev, "Timed out flushing RX FIFO\n");
+	if (RX_FIFO_LVL(val, sdd))
+		dev_warn(&sdd->pdev->dev, "Timed out flushing RX FIFO (%d left)\n", RX_FIFO_LVL(val, sdd));
 
 	val = readl(regs + S3C64XX_SPI_CH_CFG);
 	val &= ~S3C64XX_SPI_CH_SW_RST;