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

Casey Connolly casey.connolly at linaro.org
Thu Jul 9 06:07:28 CEST 2026



On 7/8/26 14:31, Balaji Selvanathan wrote:
> 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.

If that's the case then I suspect we're missing something in the init 
sequence, since it should drain the fifo... Why would you send me patch 
1 if it doesn't even work???


> 
> 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