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.

[FAQ] CPSW linux Phy回环自检实现

我已在ti-linux-kernel (branch=ti-rt-linux-5.4.y ; commit=3be7c8fa970782c88c2a188f7310ccc7256121f7) drivers/net/ethernet/ti/cpsw.c 驱动器的 Git 存储库中实施了 Phy 环回模式自检过程。它目前在我的 am5718-idk 板上工作,具有两个 cpsw 接口(gmac 配置为双 gmac 模式)。

目前我有以下限制:

  • 如果我们同时在两个接口上运行测试,测试可能会失败(添加锁应该可以解决问题)
  • 该测试在单 emac 模式下无法运行。我没有对此进行调查,我很确定只需再加上一点东西,即可使其在此模式下正常运行。

如果您有兴趣,我可以为您提供补丁以供审核,并且(当然,如果它足够好)在内核中集成。

  • 下面是补丁:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    From 7526fa471a712cfd783edcd0bcc97a4ec62a4f41 Mon Sep 17 00:00:00 2001
    From: Kamel Hacene <kamel.hacene@safrangroup.com>
    Date: Mon, 7 Jun 2021 08:13:47 +0000
    Subject: [PATCH] net: ethernet: ti: Add phy loopback ethtool self-test for
    cpsw driver
    ---
    drivers/net/ethernet/ti/cpsw.c | 3 +-
    drivers/net/ethernet/ti/cpsw_ethtool.c | 339 ++++++++++++++++++++++++++++++++
    drivers/net/ethernet/ti/cpsw_priv.h | 9 +
    drivers/net/ethernet/ti/davinci_cpdma.c | 10 +
    drivers/net/ethernet/ti/davinci_cpdma.h | 2 +
    5 files changed, 362 insertions(+), 1 deletion(-)
    diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
    index 5146685eddd8..8544bb193b71 100644
    --- a/drivers/net/ethernet/ti/cpsw.c
    +++ b/drivers/net/ethernet/ti/cpsw.c
    @@ -1058,7 +1058,7 @@ static void cpsw_fifo_shp_on(struct cpsw_priv *priv, int fifo, int on)
    writel_relaxed(val, &cpsw->regs->ptype);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    稍微解释一下:

    文件 cpsw.c:

    - 将回调 cpsw_self_test 添加到 ethtool_ops,以便我们可以通过用户空间中的“ethtool -t <iface>”调用它

    - 将 _cpsw_adjust_link 设置为非静态,因此我们可以在 cpsw_ethtool.c 中调用它

    文件 davinci_cpdma.c:

    - 为处理程序添加 getter/setter。在自动测试期间,我将用包装程序替换 rx 处理程序,以检查接收到的帧是否与发出的帧一致

    文件 cpsw_ethtool.c:

    - 实现 cpsw_self_test 函数,以执行以下操作:

     * 将测试的从接口设置为向上,停止另一个接口(双 EMAC)以防止来自另一个从机的帧干扰测试(在我的测试期间从未发生过,因为我无法 100% 确定这不会发生)。

     * 禁用中断

     * 在 phy BMCR 寄存器中设置 phy 环回模式、1Gbit、全双工(不带自动协商)

     * 启用 cpsw_sl 1Gbit/全

     * 启用 ALE 转发

     * 在 phy MII_CTRL1000 寄存器中启用主/从

     * 启用 ALE 旁路

     * 用图案填充缓冲器 (0xAA)

     * 替换 RX 处理器

     * 复位 TX 通道

     * 发送帧

    // 在这里,RX 处理程序应该接收帧。它会先检查帧的大小和数据,然后在从器件的私有结构中设置结果

     * 等待系统执行 RX 处理程序,然后检索结果。

     * 恢复 RX 处理程序、ALE、phy 寄存器...

     * 调用 _cpsw_adjust_link 以根据之前的值恢复 phy 配置和 cpsw 旁路模式。

     * 恢复载波

x 出现错误。请重试或与管理员联系。