2014-01-14 60 views
1

我试图激活Linux phyless以太网驱动程序。网上没有太多的信息。我正在使用基于ARM的Linux内核SOC连接到1GBPS RGMII端口,而没有真正的PHY。来了解Linux有固定的phy支持。一些文件使用了fixed_phy_add函数。但是仍然不清楚如何激活。任何形式的帮助或指针在这里都会有帮助。如何激活phyless linux以太网驱动程序

回答

1

是的。我刚刚为我们的董事会做了这件事。真正让我困惑的是,在固定的mdio总线被激活之前,你需要添加固定的phy。因此,无论您是需要在平台初始化代码中尽早添加它,还是像我一样将它添加到固定的mdio代码中(当然,这只是为了让事情有效)。这个补丁为我做了。

diff --git a/drivers/net/phy/fixed.c b/drivers/net/phy/fixed.c 
index ba55adf..7013ef0 100644 
--- a/drivers/net/phy/fixed.c 
+++ b/drivers/net/phy/fixed.c 
@@ -203,11 +203,24 @@ err_regs: 
} 
EXPORT_SYMBOL_GPL(fixed_phy_add); 

+static struct fixed_phy_status fixed_phy_status = { 
+  .link   = 1, 
+  .speed   = 100, 
+  .duplex   = 0, 
+}; 
+ 
static int __init fixed_mdio_bus_init(void) 
{ 
     struct fixed_mdio_bus *fmb = &platform_fmb; 
     int ret; 

+  ret = fixed_phy_add(PHY_POLL, 0, &fixed_phy_status); 
+  if (ret < 0) 
+  { 
+   pr_err("could not add fixed phy.\n"); 
+   return ret; 
+  } 
+ 
     pdev = platform_device_register_simple("Fixed MDIO bus", 0, NULL, 0); 
     if (IS_ERR(pdev)) { 
       ret = PTR_ERR(pdev); 

下一步是在你的驱动程序才能使用此PHY,应该足够使用固定0名:00作为PHY的名字,当你看它(的:00是固定的PHY ID在上面的 fixed_phy_add)

snprintf(phy_id, sizeof(slave_data->phy_id), PHY_ID_FMT, "fixed-0", 0); 

0,那么你的驱动已经有phy_connect应该找到固定的PHY和它应该工作 只要固定配置的另一侧(开关匹配我们的情况下):

phy_connect(ndev, phy_id, &_adjust_link, phy_if); 

应该有一种方法可以使所有这些工作都与设备树一起工作,但是还没有人能够在那里获得,AFAICS。

祝你好运。

+0

fixed_mdio_bus_init不是将固定phy添加到系统的最佳位置。这应该是特定于电路板的代码。添加的行应该放在你的电路板初始化中。以/arch/m68k/platform/coldfire/m5272.c为例。 – spearson

+0

我知道。但我的董事会使用devicetree,并没有固定phys的devicetree支持。即使有,它也需要提前添加,因为在调用固定的phy初始化例程之前phys需要存在,所以以后不能添加它们。最简单的方法是将其明确添加到fixed_mdio_bus_init中。现在我想到了为什么不只是为固定的phys数添加一个配置参数,而不是将这些东西放在board文件中? – slobobaby