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.

[参考译文] CCS/AM3359:重负载下以太网 CPDMA 发送停止

Guru**** 2914610 points

Other Parts Discussed in Thread: AM3359

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/663155/ccs-am3359-ethernet-cpdma-transmit-stall-under-heavy-load

器件型号:AM3359

工具/软件:Code Composer Studio

各位专家、您好!

在基于自定义固件 RTOS 的 Sitara AM3359定制板上发送以太网数据时、CPDMA/Tx 中断停止存在问题。
在重负载下、CPDMA 停止发送、我不再获得 Tx 中断。 我的测试条件是大约200个 ping 控制台、每个控制台向端口发送1472字节。 几分钟或几小时后、发送停止、但接收继续。 我无法重新启动传输。 最后一个封装由 DMA 完成(例如、HDP=0x4A102A8C、FLAGS=0xE0000071、CP=0x4A102A78、FLAGS=0x1000003C、NEL=0x0)、并且 DMA_STAT 空闲0x8000000。 我在这里似乎有比赛条件、但我遵循了 TRM 关于排队错误处理的说明。 我看不到 DMA 的任何错误情况。
发生这种情况时、我已经尝试通过再次写入 TX_CP 和 TX_HDP 来重新启动 DMA、禁用并启用 TX_EN、再次写入 EOI_TX_PULSE。 没有成功。

我的问题:在哪个寄存器中可以看到、为什么 CPDMA 不会再次启动?

此致、
Stephan


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

    这是什么软件? RTOS? 您能否提供更多详细信息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Biser、

    RTOS 是 FreeRTOS V8.2.0。

    此致、
    Stephan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、TI 不支持此功能。 我只能让工厂团队就您的硬件问题发表意见:

    "在哪一个寄存器中、为什么 CPDMA 不会再次启动?"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你 Biser、我已经知道工作方式了。 我刚才提到了 RTOS、因为任务切换会导致竞态条件。 我的问题是、现在我不知道为什么 CPDMA 不会再次启动以及 我必须评估哪个寄存器。

    此致、
    Stephan

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

    e2e.ti.com/.../2251.0001_2D00_net_2D00_ethernet_2D00_ti_2D00_cpdma_2D00_am437x_2D00_allow_2D00_descs_2D00_to_2D00_be_2D00_plase.txtHiStephen、

    您可能会遇到 Linux 版 cpsw/cpdma 驱动程序中遇到的类似问题。 有一种情况导致 cpdma 静默停止处理数据包。 随附的是一个 Linux 修补程序,它描述了此问题和此情况的 Linux 修复程序。 显然、它不会直接应用于您的操作系统、但它可能提供一些见解。 该补丁针对 AM437编写、而 CPsw IP 在 AM335x 和 AM437x 之间是相同的。 问题是更新 CPDMA 寄存器所需的时间、Linux 驱动程序更改了宏、使其基本上更接近硬件。 我需要补充一点、这可能有帮助、也可能不有帮助、因为正如您指出的、您的 RTOS 可能会引入 TI 未见的其他条件。

    此致、

    Schuyler

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

    感谢您的支持。

    我检查了 Linux 修复程序、但这似乎与我的问题无关。 我将 CPPI RAM 用于描述符。 我仍然看不出为什么 CPDMA 在 HDP 处于空闲状态时不响应它的进一步写入。 我知道、当设置 TX_HOST_ERR_code 时、CPDMA 停止工作。 我以前见过这种情况。
    我检查了中断屏蔽。 Tx 中断未被屏蔽。 RX 中断仍在处理接收到的数据包。

    下面是一个日志示例。 当描述符排队时、我复制了 CPPI RAM 中的整个传输队列:
    最后一个 Tx BD HDP=0x4A102924、CP=0x4A102910、FLAGS=0x1000003C、DMA_STAT=0x80000000
    TX_BD_TRACE[115]=0x4A1028FC:FLAGS=0xE0000074、NEX=0x0、buf_len=116、bufptr =0x8321C94E
    TX_BD_TRACE[116]=0x4A102910:标志=0xE000003C、下一个=0x0、buf_len=60、bufptr=0x8321C9E0 <<<这是 CPDMA 最后一次发送 BD
    TX_BD_TRACE[117]=0x4A102924:FLAGS=0xE00005EA、NEX=0x0、buf_len=1514、bufptr =0x83CC9510 <<< CPDMA 不再处理此 BD
    没有来自 CPDMA 的响应的最后一次启动尝试:
    最后一次启动尝试:HDP=0x4A102924:FLAGS=0xE00005EA、NEL=0x0

    因此、从我的角度来看、CPDMA 没有理由不开始发送下一个 HDP。 我可以观察到其他寄存器吗?

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

    各位专家、您好!

    以下是一些测试结果、可能会为某人提供线索、让他知道这个问题来自哪里。

    这是另一个日志输出、与上一个日志输出类似。 但我验证了来自 IP 堆栈的(未发送)数据包是否有效。

    最后一个 TX HDP=0x4A102884、CP=0x4A102870、FLAGS=0x1000003C、DMA_STAT=0x8000000

    TX_CP_TRACE[107]=0x4A10285C:标志=0xE0000071、下一个=0x0、len=113、bufptr =0x8321C94E

    TX_CP_TRACE[108]=0x4A102870:标志=0xE000003C、NEX=0x0、len=60、bufptr=0x8321C9C4 <<这是 CPDMA 最后发送的 BD

    TX_CP_TRACE[109]=0x4A102884:FLAGS=0xE000005A、NEX=0x0、LEN=90、bufptr =0x8321C94E << CPDMA 不再发送此 BD

     BD-0x4A102884:以太网报头 dest=fc4596aa29f、src=985dade42a20、type=8

    Wireshark 输出显示、CPDMA 最后发送的数据包为60字节。 它始终是向另一台主机广播的 ARP。 我不知道为什么在传输停止前生成这个数据包。

    此行为与 CPSW 开关配置有关。 我使用2个端口作为交换机。 连接了一个端口。 另一个端口不是。 但是、一项任务是通过 MDIO 周期性地轮询 PHY、以检查另一个端口是否已连接。 通过执行此操作、可读取 MDIO 自动协商和状态寄存器。 连接第二个端口后,问题消失。 因此、MDIO 通信似乎会导致这个问题。

    我感谢您的任何提示。

    此致、

    Stephan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请检查 ALE 中未连接的端口状态-必须禁用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Stephan、

    以下是一些内部讨论建议:

    1) 1)如果尚未了解、我们建议查看 Linux cpsw 和 cpdma 驱动程序源文件。 您可以下载最新的 TI SDK、并在安装后(假设您有 Linux 计算机)查看 drivers/net/ethernet/ti/cpsw.c 和 Davinci_cpdma.c 如果您没有 Linux 计算机、则可以在 Web 上搜索这些文件名、可以查看联机内核源树。

    2) 2)写入 HDP 时、您需要检查:
    '当这些位置非零时写入这些位置是一个错误(复位时除外)。' 根据 TRM

    3) 3)为了恢复、他必须使用拆卸或重置-只需写入 HDP 就没有帮助。

    4) 4)您需要确保在 ALE 模式下禁用未连接的端口、并将其设置为阻塞。

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

    感谢您的支持。

    >> 4)您需要确保在 ALE 模式下禁用未连接的端口、并将其设置为阻塞。
    这似乎解决了问题。 导致我头痛数月. 即使我写了所有新的东西,我也不会自己发现这一点。

    >>1)... 请看 drivers/net/ti/cpsw.c 和 Davinci_cpdma.c
    是的、我知道 Linux 驱动程序、遇到问题时、请务必查看这些驱动程序。 但 Linux 驱动程序非常抽象、不能用作固件参考、只是开发人员自己是 Linux 驱动程序专家。 在 Davinci_cpdma.c 中、我没有找到任何有关 ALE/PORT_State_Blocking 的信息。 u-boot 驱动程序更有用。 但功能有限。

    >> 2)写入 HDP 时、需要检查:
    >>"当这些位置非零时写入它们是一个错误(复位时除外)。" 根据 TRM
    是的、我检查了、实际上、当传输停止时、再次写入 HDP 不起作用。

    >> 3)为了恢复、他必须使用拆卸或重置-只需写入 HDP 就没有帮助。
    到目前为止、我没有尝试 Tx_Teardown。 这可能是重新激活端口的一种很好的解决方法。 如果问题再次意外弹出、我将尝试此操作。

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

    我们很高兴听到您能够与您的司机取得进展。

    此致、
    Schuyler