This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM4378:添加对 Microsemi VSC8502以太网 PHY 的支持-更新

Guru**** 648580 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1191557/am4378-adding-support-for-microsemi-vsc8502-ethernet-phy---update

器件型号:AM4378

代表客户发布

与上一篇文章相关、我们通过更改 u-boot 中的 TI CPSW 驱动程序(cpsw.c)使第二个 PHY 正常工作。 尽管这种变通办法并不理想、但它确实允许他们使事情正常工作。 它还提出了更多的问题。

 

我们 注意到,设备树文件的“mac”对象中的“active_slave”参数控制了初始化的 PHY。 它默认为0、从而允许第一个 PHY 工作。 将其更改为1可使第二个 PHY 正常工作、但使第一个 PHY 停止工作。 根据这一观察结果、他们进入 CPSW 驱动程序并更改了仅初始化活动从器件以初始化所有从器件的位置。 此更改使我们能够在 u-boot 中看到两个 PHY、并允许两个 PHY 在 Linux 内核启动后工作。

 

但是、 我们无法使 Linux 内核正确初始化从属设备/PHY、它们只能在 u-boot 中执行此操作。

 

因此、这种解决方法产生了几个问题:

  • 为什么 我们必须在每个 PHY 上具有 u-boot 调用初始化?
  • 为什么 Linux 驱动程序无法正确初始化 PHY?
  • 我们是否缺少会导致 Linux 驱动程序初始化 PHY 的 DTS 条目?

TI 能否提供有关上述内容的任何其他指针  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是我们与 PHY 相关的 DTS 文件的一部分。 这位于"/ti-processor-sdk-linux-AM437X-EVM-08.02.00.24/board-support/linux-5.10.100+gitAUTOINC+7a3af903-g7a7a3af903/arch/arm/boot/dts/AM437X-gp-evm."文件中。

    &MAC_SW{
       pinctrl-names ="default"、"sleep";
       pinctrl-0 =<&cpsw_default1>、<&cpsw_default2>;
       pinctrl-1 =<&cpsw_sleep1>、<&cpsw_sleep2>;
       DUAL_EMAC =<1>;
       状态="正常";
    };

    达芬奇_MDIO_SW{
       pinctrl-names ="default"、"sleep";
       pinctrl-0 =<&Davinc_MDIO_default>;
       pinctrl-1 =<&Davinc_MDIO_SLEEP>;
       状态="正常";

       ethphy0:以太网 phy@0{
          reg =<0>;
          兼容="以太网-phy-id0007.0631";
       };

       ethphy1:以太网 phy@14{
          reg =<0x14>;
          兼容="以太网-phy-id0007.0631";
       };
    };

    cpsw_port1{&cpsw_port1}
       PHY-Handle =<&ethphy0>;
       PHY-MODE ="RGMII-id";
       TI、DUAL - EMAC-PVID =<1>;
    };

    cpsw_port2{&cpsw_port2}
       PHY-Handle =<&ethphy1>;
       PHY-MODE ="RGMII-id";
       TI、DUAL - EMAC-PVID =<2>;
    };

    谢谢、

    Tim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Tim

    我已将此任务分配给我们的 EMAC 专家、以查看他们是否有任何有关此方面的其他指导。 响应可能需要一些时间、因为它们与其他升级相关联。 感谢您的耐心等待。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请使用下面的插入文件选项附加引导日志。 MDIO 驱动程序应执行扫描、其中列出了总线上找到的 PHY。 这应与您的 DTS 保持一致。   

    • 为什么 我们必须在每个 PHY 上具有 u-boot 调用初始化? 内核不依赖 u-boot 来初始化网络、Linux 驱动程序应执行所需的任何初始化。
    • 为什么 Linux 驱动程序无法正确初始化 PHY? 它应该在内核引导时有指示。
    • 我们是否缺少会导致 Linux 驱动程序初始化 PHY 的 DTS 条目? 但让我们回顾一下启动日志。

    此致、

    Schuyler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    这是 dmesg (引导日志)的输出。 它将具有一些其他调试打印件、我在其中尝试深入了解启动时发生的情况。 如果您需要其他东西、请告诉我。

    谢谢、

    Tim

    e2e.ti.com/.../2234.boot.log

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    查看引导日志、可以根据线程中显示的 DTS 使用正确的 PHY 地址识别 PHY。 CPSW 报告 ETH1上有一个链路伙伴。 如果您没有执行上述 u-boot 中的步骤、则不会显示这些消息?  在此状态下、您能够获取网络流量?

    [32.051885]  Microsemi GE VSC8502 SyncE 4a10100.MDIO:14:连接的 PHY 驱动器[Microsemi GE VSC8502 SyncE](MII_bus:phy_addr=4a101000.MDIO:14、IRQ=POLL)
    [32.170237]  位于 cpsw_ne_open 内
    [32.177339]  cpsw-switch 4a100000.switch:正在启动 ndev。 模式:dual_mac
    [32.218468]  cpsw_slave_open 与从器件0
    [32.433494]  cpsw_slave_open、使用 PHY 4a101000.mdio:00
    [32.438602]  Microsemi GE VSC8502 SyncE 4a101000.MDIO:00:连接的 PHY 驱动器[Microsemi GE VSC8502 SyncE](MII_bus:phy_addr=4a101000.MDIO:00、IRQ=POLL)


    [49.844026]  cpsw-开关4a100000.switch eth1:链路向上- 100Mbps/全-流控制关闭
    [49.852507]  IPv6:ADDRCONF (NETDEV_CHANGE):ETH1:链路就绪

    在上面提到的日志中、有调试消息? 您能否指出哪一个?

    此致、

    Schuyler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    回答您的问题。。

    如果您没有执行上述 u-boot 中的步骤、则不会显示这些消息?

    如果我们不在 u-boot 中初始化两个 PHY、我们会看到相同的消息。 问题是第二个 phy (地址14)不起作用。

    在此状态下、您能够获取网络流量?

    我们只能在第一个 PHY 上传递流量、而不能在第二个 PHY 上传递流量。 当我们在两个 PHY 上插入/拔下以太网电缆时、我们仍会从 Linux 控制台收到链路上升/下降消息。

    在上面提到的日志中、有调试消息? 您能否指出哪一个?

    下面是我们添加的一些调试消息。

    [31.642646]  cpsw_ne_open 内
    [31.715485]  位于 cpsw_new.c cpsw_init_host_port 内
    [31.758640]  cpsw_init_host_port:调用 cpsw_init_host_port_dual_mac
    [31.802172]  cpsw_slave_open 与从器件1
    [32.034714]  使用 PHY 4a101000.MDIO:14的 cpsw_slave_open
    [32.170237]  位于 cpsw_ne_open 内
    [32.218468]  cpsw_slave_open 与从器件0
    [32.433494]  cpsw_slave_open、使用 PHY 4a101000.mdio:00

    总之、似乎内核级的 CPSW 驱动程序似乎未初始化 PHY。 如果我们在 u-boot 中初始化第一个 PHY、它将在内核中工作。 如果我们在 u-boot 中初始化第二个 PHY、则第二个 PHY 在内核中工作。 如果我们在 u-boot 中初始化两个 PHY、它们都在内核中工作。

    谢谢、

    Tim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们注意到了我要提到的一些其他行为。

    在某些以太网交换机上、PHY 都不工作。 这是一个我们经常使用的开关、也是一个已知良好的开关。 链路检测似乎是最明显的问题。 插入以太网电缆并引导 Linux 内核时,交换机上的链路状态指示灯不会亮起。 在 u-boot 时、开关上的链路指示灯会正确亮起、这是奇怪的。 如果我输入 u-boot 命令行,交换机上的链路指示灯将正确亮起。 我可以插入/拔下电缆、它适用于两个 PHY。 插入电缆并启动内核最终导致交换机上的链路指示灯熄灭。 它看起来好像 u-boot 正确配置了它、而 Linux 内核 cpsw 驱动程序似乎在某种程度上撤消了该配置。

    谢谢、

    Tim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    根据我的经验、链路检测由 PHY 处理、与处理器上的任何软件无关。 从上一个帖子中、仅连接电缆并不总是产生链路检测。 此外、这也与使用哪个链接伙伴无关。  

    电路板启动后、您能否附加 ethtool -S eth1的结果?  和 ethtool eth1? 请在没有电缆连接到 eth0的情况下执行此操作。 然后重新启动并对 eth0执行相同的 ethtool 系列、请发布这些结果。

    此致、

    Schuyler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    附件是 eth0和 eth1的请求输出。 请注意、这些连接到交换机、在 Linux 内核启动后、链路指示灯将熄灭。

    谢谢、

    Tim

    e2e.ti.com/.../1222.eth0.txte2e.ti.com/.../4846.eth1.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    对于这两个接口、ethtool 将返回以下结果:

    检测到链接:否

    当您对两个接口执行 ethtool 命令时、电缆是否已连接?  

    在不与软件交互的情况下进行链路检测。 PHY 设置为自动协商、无需 SW 即可执行此操作。 请在不运行 u-boot 或内核的情况下执行电缆连接测试并检查链路指示灯。  如果链路检测问题如您所述再次发生、则会指向与 PHY 相关的内容。  

    这种情况是否发生在多个电路板上?

    此致、

    Schuyler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、在上述测试期间、电缆已插入所测试的接口。 根据您的要求、一次只连接了一根电缆。 它们连接到我们的问题开关、我们并不总是看到链路指示灯。

    如果我们移除 SD 卡并在没有运行软件的情况下启动电路板、则不会看到问题开关的链路指示灯。 如果我们对其他开关执行相同的测试、我们会在~17秒后看到链路指示灯。 我同意这一点似乎更多地指向 PHY 硬件、但它在 u-boot 时工作是奇怪的。

    我们在两个不同的板上尝试了该测试、它具有相同的行为。

    如果链路检测纯粹是硬件而不受软件影响、您是否知道在 u-boot 时链路检测工作时会发生什么情况? 如果我们在 u-boot 停止、链路指示灯将一直亮起。 如果我们拔下/插入电缆、链路会按预期关闭/打开。 继续引导至内核会停止所有链路指示灯活动。 如果我监控链路指示灯和内核启动消息、当内核进入启动 PHY 驱动程序和配置 PHY 的部分时、链路指示灯将立即熄灭。

    谢谢、

    Tim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    正如我之前提到的、这似乎指向 PHY 硬件问题。 但是、奇怪的部分是 Linux 启动后链路会输出。 您使用的是哪个根文件系统? 由于 ethtool 正在工作、因此 TI SDK 根文件系统中有一个称为 phytool 或类似工具的实用程序。 这将允许读取 PHY 回送。  为什么链路检测中断、我无法解释。 使用 phytool 可以读取 PHY 的寄存器、从而可能推导出正在发生的情况。 例如、有一个问题是为什么链路会关闭、看起来好像是在关闭。

    此致、

    Schuyler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们使用的文件系统是基本映像(tisdk-base-image-am437x-evm.tar.xz)、我们从默认映像(tisdk-default-image-am437x-evm.tar.xz)中提取一些项目、以创建我们的自定义文件系统。

    我将 phytool 放在目标上、这是一个很好的工具。 有趣的是、我不知道 phytool 是否存在、所以我编写了自己的实用程序、它完全相同。 我怀疑 PHY 寄存器在内核引导时与在 u-boot 时发生的变化。 我认为这些寄存器变化会导致链路指示灯关闭。

    我更深入地探讨了这个问题,我认为我的理论是正确的…

    问题是1000BASE-T 控制(0x09)寄存器正在被覆盖。 我们的 PHY 设置为使用 RGMII、但我们的参考时钟为25MHz、从而防止我们使用千兆位以太网速度。 在 u-boot 时间、我将该寄存器设置为0、这会阻止 PHY 广播我们支持千兆位速度。 当 PHY 驱动程序在 Linux 内核时间运行时、该寄存器会以某种方式设置回0x700、这样我们就可以知道我们支持千兆位。 我修改了用于 PHY 的 Linux 驱动程序、并再次关闭了此广播。 使用我的工具/ phytool 读取 PHY 寄存器、它显示该寄存器已设置为0x300、这再次表明我们支持千兆位速度。 内核启动后、如果我再次将寄存器设置为0、则链路指示灯将激活、我们可以开始在接口上传递数据包。 我还注意到、如果我使用 PHY 寄存器对 PHY 进行软复位、它会再次运行 Linux PHY 驱动程序代码(我看到我的调试打印)、这会正确地将此1000BASE-T 控制寄存器设置为0。 然后检测到链路、我能够通过流量。 因此、似乎其他一些驱动程序正在覆盖我在引导时对 PHY 的更改。

    .dts 文件中是否有任何内容可指定我们不支持千兆位以太网?

    PHY 驱动程序运行后、CPSW 驱动程序是否操纵 PHY?

    下面是一些注释输出、显示了我在上面描述的内容:

    root@am437x-evm:/ace/bin# ./phytool read eth0/0/1
    0x7949                                                         <------ Link is not detected
    root@am437x-evm:/ace/bin# ./phytool read eth0/0/9
    0x0300                                                         <------ PHY is advertising gigabit speeds
    root@am437x-evm:/ace/bin# ./phytool write eth0/0/0 0x8000      <------ PHY is soft reset
    [  178.242473] TIMT-DEBUG: register 9 before config 1792       <------ Debug code showing it was defaulted back to 0x700 advertising gigabit speeds
    [  178.248108] TIMT-DEBUG: register 9 after config 0           <------ Debug code turning off gigabit speed advertisements. Notice the link quickly activates.
    root@am437x-evm:/ace/bin# [  180.803177] cpsw-switch 4a100000.switch eth0: Link is Up - 100Mbps/Full - flow control off
    [  180.811692] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
    
    root@am437x-evm:/ace/bin# ./phytool read eth0/0/9
    0000                                                           <------ Gigibit speed advertisement is off and has stayed off because other drivers didn't run
    root@am437x-evm:/ace/bin# ./phytool read eth0/0/1
    0x796d                                                         <------ Link is now detected
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    根据我在上面的发现、我们有一个变通办法、这不是理想的、但它允许两个 PHY 在所有交换机上工作。 最后、我们必须修改 u-boot CPSW 驱动程序以初始化两个 PHY、以便它们在 Linux 内核时间可用。 我们无法确定如何在 Linux 内核时间执行此操作。 然后、我们必须修改 Microsemi Linux 驱动程序、以正确配置两个 PHY 以10/100速度运行(如上所述)。 这似乎不是正确的解决方案,但我们目前似乎没有任何其他选择。 我们本来希望此设置可以在.dts 文件中配置,但在对驱动程序进行反向工程后,我们可以看到不支持此设置。

    除非您有一些信息可以改进我们的解决方案、否则您可以将此问题视为已解决。 感谢你的帮助。

    Tim