概述
phy device的添加流程,了解linux驱动中的 驱动、设备、总线 模型。
- 87 int mdiobus_register(struct mii_bus *bus)
- 88 {
- // 省略。。。。。。
- 115 for (i = 0; i < PHY_MAX_ADDR; i++) {
- 116 if ((bus->phy_mask & (1 << i)) == 0) {
- 117 struct phy_device *phydev;
- 118
- 119 phydev = mdiobus_scan(bus, i);
- 120 if (IS_ERR(phydev)) {
- 121 err = PTR_ERR(phydev);
- 122 goto error;
- 123 }
- 124 }
- 125 }
- // 省略。。。。。。
- 138 }
phydev = mdiobus_scan(bus, i) 这里的scan,并不仅仅是扫描,而且还包括创建。mdiobus_scan()主要调用了get_phy_device()和phy_device_register()。get_phy_device()里面主要有get_phy_id() 和 phy_device_create() 。 函数int get_phy_id()通过MII BUS总线,读寄存器MII_PHYSID1(高16位)、MII_PHYSID2(低16位)得到。phy_device_create() 创建了一个phy设备,完成了一些speed、duplex 、addr、phy_id等等默认初始化。看一下函数定义
- 182 struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
- 183 {
- 184 struct phy_device *phydev;
- // 省略。。。。。。
- 187 phydev = get_phy_device(bus, addr);
- // 省略。。。。。。
- 191 err = phy_device_register(phydev);
- // 省略。。。。。。
- 198 }
phy_device_register() 调用device_register()
- 251 int phy_device_register(struct phy_device *phydev)
- 252 {
- // 省略。。。。。。
- 264 err = device_register(&phydev->dev);
- // 省略。。。。。。
- 275 }
- device_register()调用 device_add()
- 1040 int device_register(struct device *dev)
- 1041 {
- 1042 device_initialize(dev);
- 1043 return device_add(dev);
- 1044 }
device_add()东西比较多,以后再看。
- 891 int device_add(struct device *dev)
- 892 {
- 893 struct device *parent = NULL;
- // 省略。。。。。。
- 929 /* first, register with generic layer. */
- 930 /* we require the name to be set before, and pass NULL */
- 931 error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);
- // 省略。。。。。。
- 939 error = device_create_file(dev, &uevent_attr);
- // 省略。。。。。。
- 943 if (MAJOR(dev->devt)) {
- 944 error = device_create_file(dev, &devt_attr);
- 945 if (error)
- 946 goto ueventattrError;
- 947
- 948 error = device_create_sys_dev_entry(dev);
- 949 if (error)
- 950 goto devtattrError;
- 951
- 952 devtmpfs_create_node(dev);
- 953 }
- // 省略。。。。。。
- 955 error = device_add_class_symlinks(dev);
- 956 if (error)
- 957 goto SymlinkError;
- 958 error = device_add_attrs(dev);
- 959 if (error)
- 960 goto AttrsError;
- 961 error = bus_add_device(dev);
- 962 if (error)
- 963 goto BusError;
- 964 error = dpm_sysfs_add(dev);
- 965 if (error)
- 966 goto DPMError;
- 967 device_pm_add(dev);
- // 省略。。。。。。
- 1023 }
由此可见,phy设备的添加,是在注册mdio总线的时候。
简单地,phy device设备的添加流程:mdiobus_register() ----> mdiobus_scan() ----> phy_device_register() ----> device_register() ----> device_add() 。
platform device 的添加流程:platform_add_devices() ----> device_add()
原文见:http://blog.csdn.net/yuanzhenhai/article/details/6394724
最后
以上就是虚拟鞋垫为你收集整理的phy device的添加流程 .的全部内容,希望文章能够帮你解决phy device的添加流程 .所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复