dwmac-motorcomm: RX dies after long s2idle, only wrapper SYS_RESET recovers
Giuseppe Nespolino <[email protected]>
| Newsgroups | org.kernel.vger.netdev,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <CAKx9m6PywVwkirvkAtz144c-yg71c2+OcNYOTM4Bjtd8dF2PaA@mail.gmail.com> |
Hi Yao, On a Slimbook EVO15-A8 (YT6801, 1f0a:6801, kernel 7.0.0-28 Ubuntu) enp2s0 stops receiving after a long s2idle. 18-25 minutes reproduces it; 5s and 30s cycles never did. Link comes up at 1Gbps and the resume path logs nothing unusual. Measured while broken: - MAC is receiving: mmc_rx_framecount_gb climbing, mmc_rx_fifo_overflow 2585. netdev rx_packets and the rx-0 MSI-X count frozen. - MSIX_PBA (BAR0+0x1300) = 0, so the device isn't asserting anything. - CH0_STATUS = 0x4c5: RI/RBU/TI/TBU latched, NIS and AIS clear, with NIE/AIE set in CH0_INTR_ENA (0xd041). - All 512 RX descriptors in writeback format with sane lengths (64-1518), OWN=0. The DMA received them; nothing ever consumed them. Event bits latch and clear fine (W1C works, MGMT_INT_CTRL0 tracks it as a mirror), but the summary stage never asserts and no MSI-X is generated. RBU, the full ring and the FIFO overflow are all downstream of that. Ruled out with data: ASPM/remapping (PBA=0, MSI-X table intact, zero IOMMU faults), wrapper registers lost across D3 (all identical to a healthy baseline), unarmed ring, and MGMT_INT_CTRL0 needing an ack (status field is read-only). What recovers it: toggling SYS_RESET (0x152c bit31) plus motorcomm_init(), then ip link down/up. down/up alone does not - rings get rebuilt, IRQs re-requested, packets land in memory, still zero interrupts. I haven't yet isolated the reset from motorcomm_init(). Which brings me to the question, since you know the chip: does clearing OOB_WOL_CTRL_DIS actually disarm an OOB WOL engine that already armed, or does that need the SYS_RESET? Your comment says OOB WOL blocks DMA interrupt delivery, which is exactly the symptom, and stmmac_pci_plat_suspend() enables PCI wake unconditionally even with WoL off - it is off here. I have a candidate fix (do the full motorcomm_reset() in motorcomm_resume() instead of only deasserting the MDIO/PHY reset) and I'm happy to send it, but if OOB WOL is the mechanism the right patch is probably narrower. Caveat: I validated reset + full open, not reset + the stmmac_resume path, so a patched module still needs testing. Happy to run any experiment on this hardware. Giuseppe