needs_aneg =true;break;casePHY_NOLINK:if(phy_interrupt_is_valid(phydev))break; err = phy_read_status(phydev);if(err)break;if(phydev->link) {if(AUTONEG_ENABLE == phydev->autoneg) { err = phy_aneg_done(phydev);if(err <0)break;if(!err) { phydev->state = PHY_AN; phydev->...
`-| phy_start_aneg() `-| phy_config_aneg() `-| genphy_config_aneg() `-| __genphy_config_aneg() `-| genphy_setup_master_slave()// (1) 如果是千兆网口,配置其 master/slave `-| { | phy_modify_changed(phydev, MII_CTRL1000,// 配置 mdio 0x09 寄存器 | (CTL1000_ENABLE_MASTER ...
(needs_aneg) err = phy_start_aneg(phydev); /* (3) 如果 phy link 状态有变化,通知给对应网口 netdev */ if (old_state != phydev->state) { phydev_dbg(phydev, "PHY state change %s -> %s\n", phy_state_to_str(old_state), phy_state_to_str(phydev->state)); if (phydev->...
1.当phy_device处于PHY_UP状态时,则phy_device状态机处理接口,设置needs_aneg为1,调用phy_start_ange接口,进入PHY_AN状态或PHY_FORCING状态,进行phy_device的状态的协商; 2.在PHY_AN状态时,则phy_state_machine判断是否需要将状态跳转至PHY_RUNNING或PHY_NOLINK; 3.在PHY_RUNNING状态时,若phy_device不支持中断,...
phy_start_aneg//启动自动协商 phydev->drv->config_aneg(phydev);//这里将调用 genphy_config_aneg genphy_config_aneg genphy_config_advert//自动协商声明,关于其源码详见如下 phydev->state=PHY_AN;//设置为自动协商,设置phy的状态为 PHY_AN ---4--- //此时...
_first_device(bus); if (!phydev) { pr_err("No PHY devices found "); mdiobus_unregister(bus); mdiobus_free(bus); return -ENODEV; } // 配置和管理PHY设备 phydev->autoneg = AUTONEG_ENABLE; phydev->speed = SPEED_1000; phydev->duplex = DUPLEX_FULL; phy_start_aneg(phy...
当MAC 层加载时,在 PHY.start 后,phydev 状态切换为 PHY_UP。 PHY_STARTING:phy 准备就绪,phy driver、mac 未准备好 当MAC 加载时,PHY.start 后,phydev 状态为 PHY_PENDING。 当phy driver 加载时,phydev 状态为 PHY_READY。 PHY_PENDING:phy、mac 准备就绪,phy driver 未准备好 ...
|---snprintf(bus->id,MII_BUS_ID_SIZE,"%x",res.start)//把资源的起始地址设置为bus->id | |---of_mdiobus_register(new_bus,np)//注册mii_bus设备,并通过设备树中控制器的子节点创建PHY设备,这一点与模拟方式流程相同 of_mdiobus_register的流程与第四小节一致,这里就不再列出。
|---snprintf(bus->id,MII_BUS_ID_SIZE,"%x",res.start)//把资源的起始地址设置为bus->id | |---of_mdiobus_register(new_bus,np)//注册mii_bus设备,并通过设备树中控制器的子节点创建PHY设备,这一点与模拟方式流程相同 of_mdiobus_register的流程与第四小节一致,这里就不再列出。
int(*config_aneg)(struct phy_device *phydev); int(*aneg_done)(struct phy_device *phydev); int(*read_status)(struct phy_device *phydev); int(*ack_interrupt)(struct phy_device *phydev); int(*config_intr)(struct phy_device *phydev); ...