[PATCH] spi: cadence-quadspi: fix potential malfunction after ~49 days uptime

Vignesh Raghavendra vigneshr at ti.com
Fri Dec 13 07:04:43 CET 2024


+ tom and jagan

On 12/12/24 02:21, Ronald Wahl wrote:
> From: Ronald Wahl <ronald.wahl at legrand.com>
> 
> The get_timer function returns an unsigned long which may be calculated
> from the ARM system counter. This counter is reset only on a cold reset.
> U-boot divides this counter down to a 1000 Hz counter that will cross
> the 32bit barrier after a bit more than 49 days. Assigning the value to
> an unsigned int will truncate it on 64bit systems.
> Passing this truncated value back to the get_timer function will return
> a very large value that is certainly larger than the timeout and so will
> go down the error path and besides stopping U-Boot will lead to messages
> like
> 
>     "SPI: QSPI is still busy after poll for 5000 ms."

Thanks a lot for fixing this!

Reviewed-by: Vignesh Raghavendra <vigneshr at ti.com>


> 
> Signed-off-by: Ronald Wahl <ronald.wahl at legrand.com>
> Cc: Vignesh R <vigneshr at ti.com>
> Cc: Pratyush Yadav <p.yadav at ti.com>
> ---
>  drivers/spi/cadence_qspi_apb.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/spi/cadence_qspi_apb.c b/drivers/spi/cadence_qspi_apb.c
> index 93ab2b5635..f2f69cf9f1 100644
> --- a/drivers/spi/cadence_qspi_apb.c
> +++ b/drivers/spi/cadence_qspi_apb.c
> @@ -151,9 +151,9 @@ static int cadence_qspi_set_protocol(struct cadence_spi_priv *priv,
>  /* Return 1 if idle, otherwise return 0 (busy). */
>  static unsigned int cadence_qspi_wait_idle(void *reg_base)
>  {
> -	unsigned int start, count = 0;
> +	unsigned long start, count = 0;
>  	/* timeout in unit of ms */
> -	unsigned int timeout = 5000;
> +	unsigned long timeout = 5000;
> 
>  	start = get_timer(0);
>  	for ( ; get_timer(start) < timeout ; ) {
> @@ -170,7 +170,7 @@ static unsigned int cadence_qspi_wait_idle(void *reg_base)
>  	}
> 
>  	/* Timeout, still in busy mode. */
> -	printf("QSPI: QSPI is still busy after poll for %d ms.\n", timeout);
> +	printf("QSPI: QSPI is still busy after poll for %lu ms.\n", timeout);
>  	return 0;
>  }
> 
> --
> 2.47.1
> 

-- 
Regards
Vignesh
https://ti.com/opensource



More information about the U-Boot mailing list