使用独立外部PHY芯片时,需要有PHY芯片驱动。通常PHY芯片的寄存器定义都差不多,使用内核的通用PHY芯片驱动即可。通用PHY驱动见drivers/net/phy/phy_device.c。
内核有一个phy_state_machine工作队列将不断调用genphy_read_status函数来检测PHY状态。当使用独立PHY芯片时,网络设备需要从关联的PHY设备获取当前网络信息,在net_device结构中,phy_device结构的*phydev成员记录了这种连接关系。phy_connect函数将PHY设备与网络设备连接起来:
bus_id即PHY的ID。使用独立PHY芯片的网络设备与自带PHY功能的网络设备(如DM9000)在处理ethtool命令时方法是不同的。拿第一个ethtool命令来分析:
ethtool_get_settings函数调用的是ethtool_ops->get_settings:
先看DM9000的get_settings,调用的是mii_ethtool_gset:
与S3C6410X加DM9000的组合不同,TI的Davinci处理器通常都自带MAC控制器,但需要外接一个PHY芯片。Davinci EMAC驱动初始化时连接了一个PHY设备:priv->phydev=phy_connect(ndev,priv->phy_id,&emac_adjust_link,PHY_INTERFACE_MODE_MII);再看内核中Davinci EMAC驱动的get_settings接口实现如下:
可见emac_get_settings直接通过PHY设备获取设置。(www.xing528.com)
例13.4 ET1011C芯片不支持1000M网络分析
使用ethtool命令查看eth0网络参数,结果如下:
ET1011C芯片本身支持1000M网络,但以上输出结果却显示并未支持1000M网络。分析phy_device.c代码:
查找芯片手册中MII_ESTATUS寄存器信息,见表13-7:
表13-7 ET1011CMII_ESTATUS寄存器
可见13位是从SPEED_1000管脚读取的。这个管脚是个复用管脚,复位时,用来配置1000M网支持。复位时这个管脚电平为1,寄存器值就是1;这个管脚电平为0,则寄存器值为0。焊接相应的电阻,将该管脚电平拉高,使用ethtool命令查看网络参数:
可见芯片已支持1000M网。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。