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.

[参考译文] DP83867E:报告千兆链路出现电缆断裂的情况

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1364650/dp83867e-gigabit-link-reported-up-with-broken-wires-in-cable

器件型号:DP83867E

我们有一个运行 Linux 4.9并使用 DP83867ERGZ 作为其千兆位 PHY 的产品。  如果在连接所有线对的情况下使用 CAT5电缆、则 PHY 操作不会出现问题。

我们遇到的问题是、如果我们将  DP83867ERGZ 连接 到另一个千兆位设备、但在 C 或 D 通道中使用有故障导线的电缆、我们仍然得到报告为 UP 的链路速度为1000 Mbit。  根据 Linux 接口的统计信息、接口已启动并且正在正常传输数据包、但接收到的数据包为零。  当然、由于 C 或 D 通道出现故障、在另一端不会接收数据包。

我们的期望是链路 会自动下调至100Mbit、因为只有 A+B 通道正常工作时该链路才能正常运行。

数据表(SNLS504D)建议器件支持应 可调整链路速度的"速度优化"、但这仅在失败的自动协商之后发生。  在我们看来、即使 C 和 D 通道都出现故障、自动协商也总是成功的。  因此、速度优化并没有开始。

我们已调整 Linux PHY 驱动程序、以转储寄存器并在启动期间实现速度优化、如下所示、但我们仍然 遇到 PHY 协商1G 链路并报告成功的问题:

[ 5.900050] TI DP83867 87e005003880:536912433寄存器转储
[ 5.905210] 0x00:0x1140
[ 5.907933] 0x01:0x7949
[5.910650] 0x02:0x2000
[ 5.913370] 0x03:0xa231
[5.916091] 0x04:0x01e1
[ 5.918807] 0x05:0x0000
[ 5.921528] 0x06:0x0064
[ 5.924248] 0x07:0x2001
[ 5.926964] 0x08:0x0000
[ 5.929684] 0x09:0x0300
[ 5.932404] 0x0a:0x0000
[ 5.935121] 0x0B:0x0000
[ 5.937841] 0x0c:0x0000
[ 5.940561] 0x0d:0x401f
[ 5.943277] 0x0E:0x0077
[5.945998] 0x0F:0x3000
[ 5.948718] 0x10:0xd048
[5.951435] 0x11:0x0002
[ 5.954155] 0x12:0x0000
[ 5.956875] 0x13:0x0000
[ 5.95959592] 0x14:0x29c7
[ 5.962312] 0x15:0x0000
[ 5.965032] 0x16:0x0000
[ 5.967754] 0x17:0x0040
[5.970470] 0x18:0x5b
[ 5.973190] 0x19:0x4444
[ 5.975911] 0x1a:0x0002
[ 5.978627] 0x1b:0x0000
[ 5.981347] 0x1c:0x0000
[ 5.984068] 0x1d:0x0000
[ 5.986784] 0x1E:0x0002
[ 5.989504] 0x1f:0x0000
[5.992204]启用 DP83867速度优化增强
[ 5.997810] 0x14:0x2bc7

我们查看了数据表、但看不到任何缺失的可解决此问题的标志或设置。

检测此故障情况并获取100M 链路的正确方法是什么?

谢谢!

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

    您好、Roger、

    感谢您提出此问题。

    可以多次读取寄存器0x1以清除任何过去的值吗? 我看到0x1 = 0x7949表示链路断开。

    C&D 通道是完全断开还是存在一定程度的降级? 如果衰减程度略有下降、仍可能成功发送自动协商脉冲、以在1G 内建立链路、但通信将失败。

    速度优化需要链路建立过程发生故障、因此、我将重点讨论1G 链路在此情况下错误产生的条件。

    谢谢!

    埃文

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

    您好、Evan:

    感谢您的快速回复。  这会导致现场单元出现问题。  为了在我们的实验中重现该问题、我们取走了5m CAT-5的电缆、并切断了 C 和/或 D 对中的一根电线。

    使用此电缆时、我们始终会在交换机上建立1G 链路。  我们已使用不同的 PHY 通过我们的一款产品测试了相同的电缆和交换机、该 PHY 始终在100m 处建立链路。  另一个 PHY 似乎会自动检测断线并降低链路速度。   

    我想绕过802.3规范、但似乎认为自动协商向后兼容100M 和10M、因此仅适用于 A+B 通道。  这将解释 发生这种情况的原因。  如果自动协商不使用 C 或 D 通道、它将不会自行检测损坏的连接。  需要一些附加功能来检测 C 或 D 通道故障。

     我提供的寄存器读取日志是在内核启动和启动 PHY 时生成的、而不是在正常操作期间生成的。  遗憾的是、我们的 MAC 驱动程序不支持 SIOCGMIIREG 和类似的 IOCTL、因此我必须向其添加该功能、或向 PHY 本身添加一些黑客行为、以便能够在正常运行期间读取寄存器。

    上述内容是否合理、我是否正确理解了自协商?

    谢谢。

    罗杰

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

    您好、Roger、

    感谢您的澄清。 您对自动协商的理解是正确的-速度优化是一项附加功能、用于在速度降级之前检测信道上的故障。

    我认为速度优化启用功能不会在您的驱动器/器件树中生效。 共享寄存器日志中此0x14[9]='0'的使能位。

    使用同一根电缆进行测试时、请写入0x14[9]='1'并分享结果。

    谢谢!

    埃文

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

    您好、Evan:

    感谢您的答复。  我想、我已经设置了该位。  CFG2 (0x14)的默认值为0x29c7。  我已修改 PHY 驱动程序以设置位9、因此您可以在上面的日志中看到:

    [5.992204]启用 DP83867速度优化增强
    [ 5.997810] 0x14:0x2bc7

    此选项从0x28c7更改为0x2bc7。  如果我的数学运算正确、则会设置 SPEED_OPT_EN=1。

    这是我在调查过程中尝试的第一件事、但不幸的是、我们仍然有问题。

    从我可以看到的情况来看、上述设置同时启用 SPEED_OPT_EN 和 SPEED_OPT_ENHANCED 、但根据同一寄存器中的 SPEED_OPT_TRIPE_CNT、在执行速度优化前、我们必须有4次链路建立故障。  我可以将 SPEED_OPT_TRIP_CNT 更 改为00、这意味着单链路失败、但我认为我们没有遇到_ANY_LINK 故障。  由于自动协商握手、我们总是得到建立为1G 的链路。

    我觉得这里少了点东西、因为如果速度优化需要链路故障、可以有1G 的自动协商、 通道 C 和/或 D 不工作、那么我看不出会触发链路故障的原因。  我无法看到可以在通道 C 和/或 D 上检测链路断开的机制、然后将链路标记为故障。

    此数据表是指"能量检测器"和"快速链路丢失"、可使用 FLD_CFG (0x2D)和 FLD_THR_CFG (0x2E)进行配置。  这是我们应该做的事情吗?  FLD_CFG 寄存器中 FLD_EN 的描述表明、在建立链路之前、我们必须将其设置为低电平、然后将其设置为高电平以启用 FLD。  这意味着我们需要 在某个位置有代码来处理此问题、我在 Linux Phy 驱动程序中看不到任何用于处理此问题的代码、即使是在最新的内核中也看不到。  驱动程序甚至不会定义 FLD_CFG 寄存器。

    这是我们所缺少的东西吗?  某些启用 FLD 的 CPU 代码、然后、该代码会由于通道 C 和/或 D 上的能量缺失而失败、反过来会触发降档?

    谢谢。

    罗杰

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

    您好、Roger、

    优化速度需要链路建立过程失败,因此我想重点关注1G 链路在此情况下出现错误的条件。

    我想澄清这一点-速度优化可以通过链路故障触发、也可以通过检测增强模式下的故障导致通道 C 和 D 上的低能耗触发。 配置0x2bc7是正确的、我希望在 C&D 断开时在此处触发速度优化。  

    请使用 SPEED_OPT_TRIP_CNT[11:10]='00'进行测试。 我不清楚这里为什么不触发速度优化。 使用2线对电缆复制此设置并使0x14 = 0x2BC7、我看到速度降级发生:

    谢谢!

    埃文

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

    您好、Evan:

    感谢您对此的全力支持。  我最终确定了正在发生的事情-它是两个问题的组合,一个掩盖了另一个问题。  第一个问题是 您建议的 SPEED_OPT_EN 和 SPEED_OPT_ENHANCED 标志的丢失。  这 会导致 PHY 按预期降档。  芯片没有问题!

    第二个问题掩盖了第一个问题、即 Linux 4.9内核和驱动程序不支持降档。  尽管进行了 Phy _does_降档、但我唯一可以看到的是  实际 报告的链路速度在 PHYSTS[15:14]中。  PHY 驱动程序不知道这一点、因此将速度报告为1G、MAC 将 RGMII 信号配置为1G、现在由于速度不匹配、我们无法发送或接收数据。   

    我已扩展 PHY 驱动程序以从 PHYSTS 报告速度和双工、它均按预期工作。

    再次感谢、

    罗杰

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

    您好、Roger、

    感谢您确认此处的解决方案!

    您能否共享您所做的驱动程序文件/更改、以便我们也可以考虑在其他内核版本上解决此问题?

    此致、

    埃文

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

    您好、Evan:

    没问题、我只是需要先整理一下它们。   我应该能在 下周晚些时候把它们交给你。

    在本次调查中、我已经通过 sysfs 文件将 TDR 添加到 PHY 驱动程序中、您是否也希望这样做?  TDR 的问题是、如果链路接通、我就无法运行它... 并且我看不到任何 从软件强制断开链路的方法、这样我就可以在不手动断开电缆的情况下执行 TDR。  我已经尝试通过 PHYCR[2]将 PHY 设置为 STANDBY 模式,但仍然出现 TDR 故障。  此处的背景是现场发生故障的电缆、因此我想找到故障之前的派单和 工程师、他们向上攀爬一个电杆。

    谢谢。

    罗杰

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

    您好、Roger、

    听起来不错! 如果您也能包含 TDR 功能、这些功能对我们来说很有价值、可供参考。

     应该有几种方法可以消除从软件端访问寄存器的链接、请告诉我、这些方法是否适合您:

    1) 1)交换镜像模式值(0x31[0]="0")

    2) 2)启用 PHY 环回(0x0[14]='1)

    3)禁用速度通告(0x4[8:5]='00'用于10/100m,0x9[9:8]='00'用于1G ),然后使用0x0[9]='1'重新启动自动协商。

    谢谢!

    埃文

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

    您好、Roger、

    太棒了、感谢您分享这些补丁!

    考虑到此问题已结束、如果您有进一步的疑问、请联系我们。

    此致、

    埃文