在phy_device_create函数中,开启了状态机 void phy_state_machine(struct work_struct *work) { struct delayed_work *dwork = to_delayed_work(work); struct phy_device *phydev = container_of(dwork, struct phy_device, state_queue); int needs_aneg = 0; int err = 0; mutex_lock(&phydev->loc...
上面phy_device_create()函数中创建了一个重要的 workphy_state_machine(),这个就是phy_device查询任务的主体,用来查询 phy 芯片的状态维护 phy 状态机。 在网口驱动启动时会启动这个 work: net_device_ops->ndo_open() `-| stmmac_open() `-| phylink_start() `-| phy_start() `-| phydev->state ...
of_get_phy_id(child, &phy_id)) //如果设备树中的PHY的属性未指定45号条款 且未通过"ethernet-phy-id%4x.%4x"属性指定PHY的ID -> phy = phy_device_create(mdio, addr, phy_id, 0, NULL); -> else phy = get_phy_device(mdio, addr, is_c45); //用这个分支 -> get_phy_id(bus, addr,...
Device 从上一次调用WdfDeviceCreate获取的客户端驱动程序的框架设备对象的句柄。 PhyCapabilities 指向客户端驱动程序分配并初始化WIFI_PHY_CAPABILITIES结构的指针。 返回值 如果操作成功,则返回STATUS_SUCCESS。 否则,此函数可能会返回相应的 NTSTATUS 错误代码。
每个phy 芯片会创建一个 struct phy_device 类型的设备,对应的有 struct phy_driver 类型的驱动,这两者实际上是挂载在 mdio_bus_type 总线上的,mac 会被注册成 struct net_device。 phy_devicestructphy_device{ structphy_driver*drv;// PHY设备驱动 ...
MODULE_DEVICE_TABLE(of,fs_enet_mdio_bb_match); staticstructplatform_driverfs_enet_bb_mdio_driver={ .driver={ .name="fsl-bb-mdio", .of_match_table=fs_enet_mdio_bb_match, }, .probe=fs_enet_mdio_probe, .remove=fs_enet_mdio_remove, ...
phy device的状态机 在调用phy_connect完成net_device与phy_device的关联后,则启动phy_device的状态机流转对应的延迟队列调度接口,进行phy_device的状态流转操作。如下图为phy_device的状态流程图,下面详细说明下各状态的流转说明: 1.当调用phy_device_create创建一个phy_device或者调用phy_remove移除phy_device时,即将...
结果看 Kconfig 和 Makefile 发现 realtek.c 文件根本没有编译进去,phy_device_create 的 request_module 的返回值不是根据有没有找到 driver 返回,而是有没有执行下去,即不管找没找到 driver 都会返回正常值并继续往下进行。正确的流程是另有一条线进行即 device_bind_driver 函数,即使用的是 /drivers/net 下面...
of_get_phy_id(child, &phy_id)) //如果设备树中的PHY的属性未指定45号条款 且未通过"ethernet-phy-id%4x.%4x"属性指定PHY的ID -> phy = phy_device_create(mdio, addr, phy_id, 0, NULL); -> else phy = get_phy_device(mdio, addr, is_c45); //用这个分支 -> get_phy_id(bus, addr,...
--> phy_device_create // 创建phy设备 --> INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine); // !!!初始化状态机函数 --> phy_device_register 下面结合ti公司的MDIO驱动看看它的过程(好像ti用的名称都叫davinci): 文件路径:drivers\net\ethernet\ti\davinci_mdio.c device...