enable ASPM的过程种遇到一个奇怪的问题,明明RTW8822CE支持L1/s,但是enable kernel ASPM driver之后没有正常建立sysfs的link status节点。
debug发现是aspm driver在获取host/device两端的aspm能力过程种,有做pcie_retrain_link
,pcie_retrain_link后,RTW8822CE的pcie cap寄存器出现短暂时间访问为0的情况,导致driver认为device不支持任何的L1/L0/s。但测试nvme没有出现类似现象。
My workaround:
在pcie_retrain_link 后,通过polling device寄存器非零,可以解决这个问题,正常enable网卡的aspm L1/s。
但是这个修改了apm.c的代码,不太容易能够merge到upstream,遂bing搜索了下,找到有一些类似的线索。
1. Atheros网卡似乎有类似的现象。
这个邮件里说是强制host为gen1可以规避这个问题。因为网卡是gen1的,我测试的rc是gen3,确实有可能是类似的问题.(尝试这个方法后问题解决,RTW88看来确实也有类似问题)
2. cadence的pcie host driver有提交过关于gen2 trainning的patch
这里考虑也可能是cadence 的这个rc本身的问题
[v4,2/2] PCI: cadence: Retrain Link to work around Gen2 training defect. - Patchwork
3. 如果以上都不行,可以考虑打上这个patch,非必要不要进行retrain
pci/pcie: Avoid unnecessary PCIe link retrains - Patchwork
主线的aspm.c 在pcie_aspm_configure_common实现种,不管是否有做ccc的配置,最后都默认会retrain,可以考虑试试这个patch