[PATCH] serial: msm_geni: validate RX data with IRQ status

Varadarajan Narayanan varadarajan.narayanan at oss.qualcomm.com
Mon Jun 29 16:12:59 CEST 2026


On Mon, Jun 29, 2026 at 05:01:17PM +0530, Balaji Selvanathan wrote:
> The GENI UART hardware can retain stale data in the RX FIFO.
> The msm_serial_pending() function was reporting this stale data as
> pending input, causing U-Boot to incorrectly assume a key press and
> stop at the CLI prompt instead of continuing the boot process.
>
> Add IRQ status validation to distinguish between legitimate received
> data and stale FIFO contents. Check the Secondary IRQ status register
> for RX watermark or last flags before reporting pending data. If the
> FIFO contains data but no valid IRQ flags are set, ignore it as stale.
>
> Signed-off-by: Balaji Selvanathan <balaji.selvanathan at oss.qualcomm.com>
> ---
>  drivers/serial/serial_msm_geni.c | 27 ++++++++++++++++++++++-----
>  1 file changed, 22 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/serial/serial_msm_geni.c b/drivers/serial/serial_msm_geni.c
> index 3dca581f68f..6d30f150966 100644
> --- a/drivers/serial/serial_msm_geni.c
> +++ b/drivers/serial/serial_msm_geni.c
> @@ -424,13 +424,30 @@ static int msm_serial_getc(struct udevice *dev)
>  static int msm_serial_pending(struct udevice *dev, bool input)
>  {
>  	struct msm_serial_data *priv = dev_get_priv(dev);
> -
> -	if (input)
> -		return readl(priv->base + SE_GENI_RX_FIFO_STATUS) &
> -			   RX_FIFO_WC_MSK;
> -	else
> +	u32 rx_fifo_status, s_irq_status;
> +	int result;
> +
> +	if (input) {
> +		rx_fifo_status = readl(priv->base + SE_GENI_RX_FIFO_STATUS);
> +		result = rx_fifo_status & RX_FIFO_WC_MSK;
> +
> +		/*
> +		 * Validate RX data with IRQ status
> +		 * Only report pending data if valid RX IRQ indicators are set.
> +		 */
> +		if (result) {
> +			s_irq_status = readl(priv->base + SE_GENI_S_IRQ_STATUS);
> +
> +			if (!(s_irq_status & (S_RX_FIFO_WATERMARK_EN | S_RX_FIFO_LAST_EN))) {
> +				/* No valid RX IRQ, ignore stale data */
> +				return 0;
> +			}
> +		}
> +		return result;
> +	} else {
>  		return readl(priv->base + SE_GENI_TX_FIFO_STATUS) &
>  			   TX_FIFO_WC_MSK;
> +	}
>
>  	return 0;

It won't reach here...

Reviewed-by: Varadarajan Narayanan <varadarajan.narayanan at oss.qualcomm.com>

>  }
>
> ---
> base-commit: 6902fb4c17faa375003124c451c2550deab5463d
> change-id: 20260629-uart-e07d893e4508
>
> Best regards,
> --
> Balaji Selvanathan <balaji.selvanathan at oss.qualcomm.com>
>


More information about the U-Boot mailing list