[PATCH v2 2/2] serial: msm_geni: validate RX FIFO data with IRQ status flags

Balaji Selvanathan balaji.selvanathan at oss.qualcomm.com
Wed Jul 8 14:31:56 CEST 2026


Hi Casey,

On 7/8/2026 5:54 PM, Casey Connolly wrote:
> Hi Balaji,
>
> On 7/7/26 11:52, Balaji Selvanathan wrote:
>> Add IRQ status validation to distinguish legitimate UART data from
>> electrical noise in the RX FIFO.
>>
>> When the UART cable is disconnected, the floating RX line can pick up
>> noise that the GENI hardware interprets as valid data and places in
>> the FIFO. So, check the RX IRQ status register for RX watermark or last
>> flags before reporting pending data.
>
> Thanks for respinning this series. Is this patch still necessary with 
> the first one? Since we should no longer be in this state with noise 
> in the FIFO after resetting it correctly iiuc?

Even after fixing init sequence, still it stops at U-Boot CLI when the 
UART cable is disconnected on QCS615-EVK, so seems SE_GENI_S_IRQ_STATUS 
register has to be checked to make sure data is valid.

Thanks,

Balaji

>
> Thanks,
> // Casey
>
>>
>> Signed-off-by: Balaji Selvanathan <balaji.selvanathan at oss.qualcomm.com>
>> ---
>> Changes in v2:
>> - No changes
>> ---
>>   drivers/serial/serial_msm_geni.c | 28 +++++++++++++++++++++-------
>>   1 file changed, 21 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/serial/serial_msm_geni.c 
>> b/drivers/serial/serial_msm_geni.c
>> index a580dee8c8a..07d38178759 100644
>> --- a/drivers/serial/serial_msm_geni.c
>> +++ b/drivers/serial/serial_msm_geni.c
>> @@ -483,15 +483,29 @@ 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);
>> +    u32 fifo_status;
>> +    u32 s_irq_status;
>> +    int word_count;
>>   -    if (input)
>> -        return readl(priv->base + SE_GENI_RX_FIFO_STATUS) &
>> -               RX_FIFO_WC_MSK;
>> -    else
>> -        return readl(priv->base + SE_GENI_TX_FIFO_STATUS) &
>> -               TX_FIFO_WC_MSK;
>> +    if (input) {
>> +        fifo_status = readl(priv->base + SE_GENI_RX_FIFO_STATUS);
>> +        word_count = fifo_status & RX_FIFO_WC_MSK;
>>   -    return 0;
>> +        if (word_count > 0) {
>> +            /* Validate RX FIFO data with IRQ status */
>> +            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)))
>> +                return 0;
>> +        }
>> +
>> +        return word_count;
>> +    } else {
>> +        fifo_status = readl(priv->base + SE_GENI_TX_FIFO_STATUS);
>> +        word_count = fifo_status & TX_FIFO_WC_MSK;
>> +
>> +        return word_count;
>> +    }
>>   }
>>     static const struct dm_serial_ops msm_serial_ops = {
>>
>


More information about the U-Boot mailing list