现在要使用MPC8313出一产品, MPC8313开发板自带的PHY是一个1G的phy switch和一个1G的phy 网卡,自然各种系统配置都是按这个方式配置的, 现在的需求只需要支持100M就行, 故准备使用175c这个PHY, 支持一个wan口和4个lan, 通过两个MII口连接8313上, 1G phy改为100M phy, 只要就是修改一下在初始化MII口时,将MII的工作模式由SGMII改为MII就行了.
现在的问题是改为MII后只有一个mii口对应的phy可以工作, 另一个一使用ipconfig配置ip就提示:
eth0: Could not attach to PHY SIOCSIFFLAGS: Device or resource busy
通过跟踪内核的phy驱动注册过程, 发现内核的mdio驱动已经识别了两个MII口, 已创建
了eth0和eth1, eth1可以使用, 但使用ifconfig配置eth0时, 跟踪出现不能attach的
问题:
ifconfig eth0 -- in init_phy name=eth0, irq=0, bassaddr=C9060000, gigabit=0 get interface = 0 ljx: phy_attach d->driver=c0304368 well attach eth0: e0024520:04 eth0: e0024520:04 already attached
继续跟踪发现phy_attach()函数去attach的phy_id是eth1的phy_id.
经研究感觉可能是在设备树中的配置不对,因为在mdio_bus的mdiobus_register()函数中
去读PHY的信息时,只有PHY地址4读到有irq值. 在加dts中修改mdio的配置如下:
mdio@24520 { device_type = "mdio"; compatible = "gianfar"; reg = <24520 20>; #address-cells = <1>; #size-cells = <0>; phy3: ethernet-phy@3 { interrupt-parent = < &ipic >; interrupts = <13 8>; reg = <3>; device_type = "ethernet-phy"; }; phy4: ethernet-phy@4 { interrupt-parent = < &ipic >; interrupts = <14 8>; reg = <4>; device_type = "ethernet-phy"; }; };
这时发现在mdio_bus的mdiobus_register()函数中去读PHY的信息时,在地址3,4都能
读到信息. eth1可以工作, eth0还是attach时的地址不对.
分析发现dts下面的:ethernet@25000的phy-handle=<&phy4> 感觉这个配置应该是和
上面的mdio中的配置应该对应上, 遂改为: phy-handle=<&phy3>, 就是前面在mdio节
新增的配置. 重新编译, 启动板子, 哇卡卡, ifconfig eth0 成功.
PS.设备文件树的配置,一直没找到完成的配置项说明,比较不爽.