Re: [Regression] "serial: 8250: use THRE & __stop_tx also with DMA" breaks DMA rx

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 14 Mar 2023, Hans de Goede wrote:

> Hi Ilpo,

Hi,

Thanks for the report.

> I have spend the last couple of days debugging a problem with Bluetooth
> adapters (HCIs) connected over an UART connection on Intel Bay Trail
> and Cherry Trail devices.
> 
> After much debugging I found out that sometimes the first byte of
> a received packet (data[0]) would be overwritten with a 0 byte.
> 
> E.g. this packet received during init of a BCM4324B3 (1) Bluetooth HCI:
> 
> 04 0e 0a 01 79 fc 00 54 fe ff ff 00 00
> 
> would sometimes turn into:
> 
> 00 0e 0a 01 79 fc 00 54 fe ff ff 00 00
>
> Further investigation revealed that this goes away if I stop
> the dw_dmac module from loading, leading to:
> "dw-apb-uart 80860F0A:00: failed to request DMA"
> and the UART working without DMA support.
> 
> Testing various kernels showed that this problem was introduced
> in v5.19, v5.18 - v5.18.19 are fine. An a git bisect points to:
> 
> e8ffbb71f783 ("serial: 8250: use THRE & __stop_tx also with DMA")
> 
> And reverting that on top of v6.3-rc2 indeed solves the problem.

You did something else too than just that because you cannot cleanly 
revert just e8ffbb71f783. Please indicate what happened to:
  f8d6e9d3ca5c ("serial: 8250: Fix __stop_tx() & DMA Tx restart races")

I guess you reverted that too and forgot to mention about it but I just 
want to be sure we're on the same page?

> So it seems that that commit somehow interferes with DMA based
> data receiving, causing the first byte of a received data transfer
> to get replaced by 0.

Okay, and you're sure the problem/corruption occurs on the receiving side? 

Maybe the the extra interrupt that the tx side change will trigger somehow 
causes the confusion on the rx side. So that would be an extra call into 
handle_rx_dma() that could either do an extra flush or start DMA Rx that 
would not occur w/o that tx side change.

> The issue has been seen on and the revert has been tested on
> the following HW:
> 
> Asus T100TA
> SoC: Bay Trail UART: 80860F0A WIFI: brcmfmac43241b4-sdio BT: BCM4324B3
> 
> Lenovo Yoga Tablet 2 1051L
> SoC: Bay Trail UART: 80860F0A WIFI: brcmfmac43241b4-sdio BT: BCM4324B3
> 
> Lenovo Yoga Book X91F
> Soc: Cherry Trail UART: 8086228A WIFI: brcmfmac4356-pcie BT: BCM4356A2
> 
> I have more hw which I believe is affected but these are the models
> where I have done detailed testing.
> 
> I would be happy to test any patches, or run a kernel with some extra
> debugging added, just let me know what you need to help fixing this.

How easy this is to trigger in general? (Mainly trying to gauge how 
easy it will be to find the read and/or the irq that related to the 
corrupted payload).

> Regards,
> 
> Hans
> 
> 
> p.s.
> 
> I believe that these changes were made to improve the timing of
> disabling the transmitter on tx completion when the UART is used
> for a RS485 bus. So one option to workaround this might be to only
> enable the new behavior when RS485 mode is used ?

That change also removed what IMO was a too early serial8250_rpm_put_tx()
which is not just RS485 related but yes, the main reason was to have the
half-duplex RS485 behave correctly.


-- 
 i.




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux