2351981_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2351981_zh-CN

2351981_zh-CN

无法在 eth1 上的 ls1021a-twr 上可靠地配置 SGMII

你好

我们目前正在使用

  • U-Boot:if_v2404.04
  • Linux 内核5.15
  • 两者均来自恩智浦 QorIQ 软件栈。

我们正在基于 LS1021A TWR 平台为现有产品开发新的通信板。在这款新的通信板上,eth1 接口通过 SGMII 以 Mac 到 Mac/Less PHY 的配置连接到外部以太网交换机 IC。相反,我们现有的通信板使用 Marvell PHY,通过 SGMII 在 eth1 上连接到主机处理器。

我们正在尝试使用通用的 U-Boot 来支持这两个产品,同时允许 Linux 正确处理不同的 eth1 拓扑。

当前问题

我们最初是通过对DTS进行以下更改来使新的通信板正常运转的。

1) U-Boot DTS 解决方法

在 U-Boot 中,我们强制 enet0 和 enet 1 在 arch/arm/dts/ls1021a-twr.dtsi 中使用相同的 TBI 句柄:

&enet0 {
tbi-handle =<& tbi0> ;
phy-handle =<& sgmii_phy0> ;
phy-connection-type ="sgmii" ;
status ="okay" ;
};
&enet1 {
tbi-handle =<& tbi0> ;
phy-handle =<& sgmii_phy1> ;
phy-connection-type ="sgmii" ;
status ="okay" ;
};

2) Linux 内核 DTS 更改

在内核 DTS(arch/arm/boot/dts/ls1021a-twr.dts)中,我们随后将 eth1 更改为使用自己的 TBI 句柄和固定链路描述:

&enet0 {
tbi-handle =<& tbi0> ;
phy-handle =<& sgmii_phy0> ;
phy-connection-type ="sgmii" ;
status ="okay" ;
};
&enet1 {
tbi-handle =<& tbi1> ;
/* phy-handle =<& sgmii_phy1>; */
phy-connection-type ="sgmii" ;
fixed-link =<1 1 1000 0 0> ;
status ="okay" ;
};

3) 内核吉安法修改

我们还修改了 gianfar.c使 TBI 自动协商功能在eth1 上禁用,而在正常 PHY 连接的情况下启用自动协商功能:

static void gfar_configure_serdes(struct net_device *dev)
{
/* 初始化 */

 

/* 仅在 eth1 上禁用 */
char *eth1 ="eth1" ;
if (strcmp(eth1, priv->ndev->name) == 0) {
printk(KERN_INFO"interface%s turning off tbi autoneg" 、
priv->ndev->name);
phy_write(tbiphy, MII_BMCR、
bmcr_fulldplx | bmcr_speed1000);
} 否则 {
phy_write(tbiphy, MII_BMCR、
bmcr_anenable | bmcr_anrestart | n
bmcr_fulldplx | bmcr_speed1000);
    }
}

通过上述解决方法,处理器能够与新通信板上的外部开关通信。


我们需要改变什么

我们现在需要 U-Boot 使用普通的每个接口 TBI 绑定,因为 U-Boot 必须在两个产品之间共享,并且在现有产品上 eth1 连接了真正的 PHY。

因此,在 U-Boot 中,我们需要像这样描述接口:

&enet0 {
tbi-handle =<& tbi0> ;
phy-handle =<& sgmii_phy0> ;
phy-connection-type ="sgmii" ;
status ="okay" ;
};
&enet1 {
tbi-handle =<& tbi1> ;
phy-handle =<& sgmii_phy1> ;
phy-connection-type ="sgmii" ;
status ="okay" ;
};

但是,当我们在 U-Boot 中进行此更改时,处理器会停止与新 Mac-to-Mac/固定链路通信板上的以太网交换机通信。


我们目前的理解


  1. 在第一种解决方法中,U-Boot没有初始化 tbi1,Linux随后初始化了tbi1 并禁用了eth1的TBI自动协商,这使固定链路的Mac到Mac的连接能够正常工作。
  2. 当我们将 U-Boot 恢复为正确的每端口 TBI 映射(eth0-> tbi0,eth1-> tbi1)时,行为会发生变化,固定链路板将不再与交换机通信。
  3. 在上述第一个 U-Boot 解决方法中,现有产品(其中 eth1 在 SGMII 上使用 Marvell PHY)eth1 不起作用,看来必须在 U-Boot 中正确初始化 eth1,否则接口无法正确传输流量。

其他技术背景

我们希望了解处理以下情况的建议方法:一个接口在 eth0 上使用真正的 PHY,而另一个接口在 eth1 上使用固定链路/MAC-to-MAC SGMII 连接。


问题

  1. 在不依赖 U-Boot DTS 解决方法的情况下,在 eth1 上禁用或绕过 TBI 自动协商以在 eth1 上进行固定链路/无 PHY 的 SGMII 连接时,在 LS1021A 上推荐的方法是什么?
  2. 即使 Linux 后来在 eth1 上使用固定链路,U-Boot 是否应该始终完全按照 DTS(eth0-> tbi0,eth1-> tbi1)初始化每个端口 TBI?
  3. 在 PHY 连接和固定链路案例之间切换时,有没有推荐的方法可以在 gfar_configure_serdes () 之前从 Linux 重置或重新初始化 TBI?
  4. 在固定链路/MAC-to-MAC SGMII 情况下,PCS/TBI 是否仍应通过正常的 gfar_configure_serdes()流程进行编程,还是建议采用不同的初始化流程?
Re: Cannot configure SGMII reliably on ls1021a-twr on eth1

感谢您的回复。

我做了这些改动,并做了更多测试,但还是遇到同样的问题。

我想在两个设备上使用相同的 uboot 镜像,这意味着 enet1 在相同的 uboot 上都将有 phy 和 phy-less 连接。

我曾尝试删除 uboot 中 enet1 的定义,这样 enet 的配置就完全由内核处理了,这对固定 phy 的情况有效,但对 phy 连接的情况无效。看来 phy 配置工作正常,但 tbi 配置却失灵了。

1.您建议如何处理这种情况?
2.如果在 uboot 中根本没有配置 enet 接口,那么在内核中配置 enet 接口还需要做什么额外的工作吗?


谢谢

Re: Cannot configure SGMII reliably on ls1021a-twr on eth1

1. 在 Linux dts 中可以像下面这样声明固定链接:

&enet1 {
phy-mode ="sgmii";
managed ="fixed-link";
fixed-link

{ speed =<1000>; full-duplex; pause; }

;
status = " 好吧 ";
};

2. 是的,U-Boot 应该初始化每个端口 TBI,但是如果是固定链接,则应禁用 TBI 的自动取消。

3.修复链接后,应在 gfar_configure_serdes 中重置 PCS/TBI,如下所示:if (is_fixed_link)

{ phy_write(phydev, MII_BMCR, BMCR_RESET); udelay(10); phy_write(phydev, MII_BMCR, BMCR_FULLDPLX | BMCR_SPEED1000); ...// 禁用自动降噪功能 }


谢谢

Re: Cannot configure SGMII reliably on ls1021a-twr on eth1

1.我建议在 U-Boot 中保持 enet1 的最小初始化,而不是完全删除它,同时对两种硬件变体使用相同的 U-Boot 映像。
具体来说

a.将 enet1 的 MAC 和 PCS/TBI 初始化保留在 U-Boot 中。
b.避免在 U-Boot 中进行特定于 PHY 的配置(如延迟调整、LED 设置或特定于供应商的寄存器)。
c.让 Linux 内核设备树决定 enet1 是否使用:

固定链路(无 PHY 情况),或通过 phy-handle
一个真正的外部 PHY。


2.是的,有一些额外的考虑因素,但只是在一定程度上。
如果在 U-Boot 中根本没有配置 ENET 接口,Linux 内核仍可初始化 MAC 和 PHY,前提是

设备树正确描述了接口(状态 = " ok "、正确的 phy 模式、有效的 phy-handle 或固定链接)。
时钟、pinctrl 和 MDIO 已正确定义。
内核驱动程序可连接并支持 PHY 本身。

不过,Linux 驱动程序通常不会完全初始化 PCS/TBI(或 SerDes)块。对于许多 SoC,尤其是采用 SGMII/RGMII 配置的 SoC,内核会认为 PCS/TBI 已被引导加载程序带入可用模式。

谢谢!

Tags (1)
No ratings
Version history
Last update:
‎05-10-2026 02:38 AM
Updated by: