Lines Matching refs:phydev
59 int (*run)(struct phy_device *phydev);
205 void phy_device_free(struct phy_device *phydev) in phy_device_free() argument
207 put_device(&phydev->mdio.dev); in phy_device_free()
213 struct phy_device *phydev; in phy_mdio_device_free() local
215 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_free()
216 phy_device_free(phydev); in phy_mdio_device_free()
227 struct phy_device *phydev; in phy_mdio_device_remove() local
229 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_remove()
230 phy_device_remove(phydev); in phy_mdio_device_remove()
238 static bool phy_drv_wol_enabled(struct phy_device *phydev) in phy_drv_wol_enabled() argument
242 phy_ethtool_get_wol(phydev, &wol); in phy_drv_wol_enabled()
247 static void phy_link_change(struct phy_device *phydev, bool up) in phy_link_change() argument
249 struct net_device *netdev = phydev->attached_dev; in phy_link_change()
255 phydev->adjust_link(netdev); in phy_link_change()
256 if (phydev->mii_ts && phydev->mii_ts->link_state) in phy_link_change()
257 phydev->mii_ts->link_state(phydev->mii_ts, phydev); in phy_link_change()
278 static bool phy_uses_state_machine(struct phy_device *phydev) in phy_uses_state_machine() argument
280 if (phydev->phy_link_change == phy_link_change) in phy_uses_state_machine()
281 return phydev->attached_dev && phydev->adjust_link; in phy_uses_state_machine()
287 static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) in mdio_bus_phy_may_suspend() argument
289 struct device_driver *drv = phydev->mdio.dev.driver; in mdio_bus_phy_may_suspend()
291 struct net_device *netdev = phydev->attached_dev; in mdio_bus_phy_may_suspend()
299 if (!netdev && phy_drv_wol_enabled(phydev)) in mdio_bus_phy_may_suspend()
329 return !phydev->suspended; in mdio_bus_phy_may_suspend()
334 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_suspend() local
336 if (phydev->mac_managed_pm) in mdio_bus_phy_suspend()
343 if (phy_interrupt_is_valid(phydev)) { in mdio_bus_phy_suspend()
344 phydev->irq_suspended = 1; in mdio_bus_phy_suspend()
345 synchronize_irq(phydev->irq); in mdio_bus_phy_suspend()
353 if (phy_uses_state_machine(phydev)) in mdio_bus_phy_suspend()
354 phy_stop_machine(phydev); in mdio_bus_phy_suspend()
356 if (!mdio_bus_phy_may_suspend(phydev)) in mdio_bus_phy_suspend()
359 phydev->suspended_by_mdio_bus = 1; in mdio_bus_phy_suspend()
361 return phy_suspend(phydev); in mdio_bus_phy_suspend()
366 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_resume() local
369 if (phydev->mac_managed_pm) in mdio_bus_phy_resume()
372 if (!phydev->suspended_by_mdio_bus) in mdio_bus_phy_resume()
375 phydev->suspended_by_mdio_bus = 0; in mdio_bus_phy_resume()
382 WARN_ON(phydev->state != PHY_HALTED && phydev->state != PHY_READY && in mdio_bus_phy_resume()
383 phydev->state != PHY_UP); in mdio_bus_phy_resume()
385 ret = phy_init_hw(phydev); in mdio_bus_phy_resume()
389 ret = phy_resume(phydev); in mdio_bus_phy_resume()
393 if (phy_interrupt_is_valid(phydev)) { in mdio_bus_phy_resume()
394 phydev->irq_suspended = 0; in mdio_bus_phy_resume()
395 synchronize_irq(phydev->irq); in mdio_bus_phy_resume()
400 if (phydev->irq_rerun) { in mdio_bus_phy_resume()
401 phydev->irq_rerun = 0; in mdio_bus_phy_resume()
402 enable_irq(phydev->irq); in mdio_bus_phy_resume()
403 irq_wake_thread(phydev->irq, phydev); in mdio_bus_phy_resume()
407 if (phy_uses_state_machine(phydev)) in mdio_bus_phy_resume()
408 phy_start_machine(phydev); in mdio_bus_phy_resume()
510 static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup) in phy_needs_fixup() argument
512 if (strcmp(fixup->bus_id, phydev_name(phydev)) != 0) in phy_needs_fixup()
516 if (!phy_id_compare(phydev->phy_id, fixup->phy_uid, in phy_needs_fixup()
525 static int phy_scan_fixups(struct phy_device *phydev) in phy_scan_fixups() argument
531 if (phy_needs_fixup(phydev, fixup)) { in phy_scan_fixups()
532 int err = fixup->run(phydev); in phy_scan_fixups()
538 phydev->has_fixups = true; in phy_scan_fixups()
548 struct phy_device *phydev = to_phy_device(dev); in phy_bus_match() local
550 const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); in phy_bus_match()
557 return phydrv->match_phy_device(phydev); in phy_bus_match()
559 if (phydev->is_c45) { in phy_bus_match()
561 if (phydev->c45_ids.device_ids[i] == 0xffffffff) in phy_bus_match()
564 if (phy_id_compare(phydev->c45_ids.device_ids[i], in phy_bus_match()
570 return phy_id_compare(phydev->phy_id, phydrv->phy_id, in phy_bus_match()
578 struct phy_device *phydev = to_phy_device(dev); in phy_id_show() local
580 return sysfs_emit(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id); in phy_id_show()
587 struct phy_device *phydev = to_phy_device(dev); in phy_interface_show() local
590 if (phydev->is_internal) in phy_interface_show()
593 mode = phy_modes(phydev->interface); in phy_interface_show()
603 struct phy_device *phydev = to_phy_device(dev); in phy_has_fixups_show() local
605 return sysfs_emit(buf, "%d\n", phydev->has_fixups); in phy_has_fixups_show()
613 struct phy_device *phydev = to_phy_device(dev); in phy_dev_flags_show() local
615 return sysfs_emit(buf, "0x%08x\n", phydev->dev_flags); in phy_dev_flags_show()
1009 int phy_device_register(struct phy_device *phydev) in phy_device_register() argument
1013 err = mdiobus_register_device(&phydev->mdio); in phy_device_register()
1018 phy_device_reset(phydev, 0); in phy_device_register()
1021 err = phy_scan_fixups(phydev); in phy_device_register()
1023 phydev_err(phydev, "failed to initialize\n"); in phy_device_register()
1027 err = device_add(&phydev->mdio.dev); in phy_device_register()
1029 phydev_err(phydev, "failed to add\n"); in phy_device_register()
1037 phy_device_reset(phydev, 1); in phy_device_register()
1039 mdiobus_unregister_device(&phydev->mdio); in phy_device_register()
1052 void phy_device_remove(struct phy_device *phydev) in phy_device_remove() argument
1054 unregister_mii_timestamper(phydev->mii_ts); in phy_device_remove()
1055 pse_control_put(phydev->psec); in phy_device_remove()
1057 device_del(&phydev->mdio.dev); in phy_device_remove()
1060 phy_device_reset(phydev, 1); in phy_device_remove()
1062 mdiobus_unregister_device(&phydev->mdio); in phy_device_remove()
1073 int phy_get_c45_ids(struct phy_device *phydev) in phy_get_c45_ids() argument
1075 return get_phy_c45_ids(phydev->mdio.bus, phydev->mdio.addr, in phy_get_c45_ids()
1076 &phydev->c45_ids); in phy_get_c45_ids()
1086 struct phy_device *phydev; in phy_find_first() local
1090 phydev = mdiobus_get_phy(bus, addr); in phy_find_first()
1091 if (phydev) in phy_find_first()
1092 return phydev; in phy_find_first()
1110 static void phy_prepare_link(struct phy_device *phydev, in phy_prepare_link() argument
1113 phydev->adjust_link = handler; in phy_prepare_link()
1123 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, in phy_connect_direct() argument
1132 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_connect_direct()
1136 phy_prepare_link(phydev, handler); in phy_connect_direct()
1137 if (phy_interrupt_is_valid(phydev)) in phy_connect_direct()
1138 phy_request_interrupt(phydev); in phy_connect_direct()
1163 struct phy_device *phydev; in phy_connect() local
1175 phydev = to_phy_device(d); in phy_connect()
1177 rc = phy_connect_direct(dev, phydev, handler, interface); in phy_connect()
1182 return phydev; in phy_connect()
1191 void phy_disconnect(struct phy_device *phydev) in phy_disconnect() argument
1193 if (phy_is_started(phydev)) in phy_disconnect()
1194 phy_stop(phydev); in phy_disconnect()
1196 if (phy_interrupt_is_valid(phydev)) in phy_disconnect()
1197 phy_free_interrupt(phydev); in phy_disconnect()
1199 phydev->adjust_link = NULL; in phy_disconnect()
1201 phy_detach(phydev); in phy_disconnect()
1223 static int phy_poll_reset(struct phy_device *phydev) in phy_poll_reset() argument
1228 ret = phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET), in phy_poll_reset()
1239 int phy_init_hw(struct phy_device *phydev) in phy_init_hw() argument
1244 phy_device_reset(phydev, 0); in phy_init_hw()
1246 if (!phydev->drv) in phy_init_hw()
1249 if (phydev->drv->soft_reset) { in phy_init_hw()
1250 ret = phydev->drv->soft_reset(phydev); in phy_init_hw()
1255 phydev->suspended = 0; in phy_init_hw()
1258 ret = phy_scan_fixups(phydev); in phy_init_hw()
1262 phy_interface_zero(phydev->possible_interfaces); in phy_init_hw()
1264 if (phydev->drv->config_init) { in phy_init_hw()
1265 ret = phydev->drv->config_init(phydev); in phy_init_hw()
1270 if (phydev->drv->config_intr) { in phy_init_hw()
1271 ret = phydev->drv->config_intr(phydev); in phy_init_hw()
1280 void phy_attached_info(struct phy_device *phydev) in phy_attached_info() argument
1282 phy_attached_print(phydev, NULL); in phy_attached_info()
1287 char *phy_attached_info_irq(struct phy_device *phydev) in phy_attached_info_irq() argument
1292 switch(phydev->irq) { in phy_attached_info_irq()
1300 snprintf(irq_num, sizeof(irq_num), "%d", phydev->irq); in phy_attached_info_irq()
1309 void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) in phy_attached_print() argument
1311 const char *unbound = phydev->drv ? "" : "[unbound] "; in phy_attached_print()
1312 char *irq_str = phy_attached_info_irq(phydev); in phy_attached_print()
1315 phydev_info(phydev, ATTACHED_FMT "\n", unbound, in phy_attached_print()
1316 phydev_name(phydev), irq_str); in phy_attached_print()
1320 phydev_info(phydev, ATTACHED_FMT, unbound, in phy_attached_print()
1321 phydev_name(phydev), irq_str); in phy_attached_print()
1331 static void phy_sysfs_create_links(struct phy_device *phydev) in phy_sysfs_create_links() argument
1333 struct net_device *dev = phydev->attached_dev; in phy_sysfs_create_links()
1339 err = sysfs_create_link(&phydev->mdio.dev.kobj, &dev->dev.kobj, in phy_sysfs_create_links()
1345 &phydev->mdio.dev.kobj, in phy_sysfs_create_links()
1349 kobject_name(&phydev->mdio.dev.kobj), in phy_sysfs_create_links()
1356 phydev->sysfs_links = true; in phy_sysfs_create_links()
1363 struct phy_device *phydev = to_phy_device(dev); in phy_standalone_show() local
1365 return sysfs_emit(buf, "%d\n", !phydev->attached_dev); in phy_standalone_show()
1381 struct phy_device *phydev = upstream; in phy_sfp_connect_phy() local
1382 struct net_device *dev = phydev->attached_dev; in phy_sfp_connect_phy()
1385 return phy_link_topo_add_phy(dev, phy, PHY_UPSTREAM_PHY, phydev); in phy_sfp_connect_phy()
1403 struct phy_device *phydev = upstream; in phy_sfp_disconnect_phy() local
1404 struct net_device *dev = phydev->attached_dev; in phy_sfp_disconnect_phy()
1420 struct phy_device *phydev = upstream; in phy_sfp_attach() local
1422 if (phydev->attached_dev) in phy_sfp_attach()
1423 phydev->attached_dev->sfp_bus = bus; in phy_sfp_attach()
1424 phydev->sfp_bus_attached = true; in phy_sfp_attach()
1437 struct phy_device *phydev = upstream; in phy_sfp_detach() local
1439 if (phydev->attached_dev) in phy_sfp_detach()
1440 phydev->attached_dev->sfp_bus = NULL; in phy_sfp_detach()
1441 phydev->sfp_bus_attached = false; in phy_sfp_detach()
1450 int phy_sfp_probe(struct phy_device *phydev, in phy_sfp_probe() argument
1456 if (phydev->mdio.dev.fwnode) { in phy_sfp_probe()
1457 bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode); in phy_sfp_probe()
1461 phydev->sfp_bus = bus; in phy_sfp_probe()
1463 ret = sfp_bus_add_upstream(bus, phydev, ops); in phy_sfp_probe()
1490 int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, in phy_attach_direct() argument
1493 struct mii_bus *bus = phydev->mdio.bus; in phy_attach_direct()
1494 struct device *d = &phydev->mdio.dev; in phy_attach_direct()
1507 phydev_err(phydev, "failed to get the bus module\n"); in phy_attach_direct()
1517 if (phydev->is_c45) in phy_attach_direct()
1526 phydev_err(phydev, "failed to get the device driver module\n"); in phy_attach_direct()
1540 if (phydev->attached_dev) { in phy_attach_direct()
1546 phydev->phy_link_change = phy_link_change; in phy_attach_direct()
1548 phydev->attached_dev = dev; in phy_attach_direct()
1549 dev->phydev = phydev; in phy_attach_direct()
1551 if (phydev->sfp_bus_attached) in phy_attach_direct()
1552 dev->sfp_bus = phydev->sfp_bus; in phy_attach_direct()
1554 err = phy_link_topo_add_phy(dev, phydev, PHY_UPSTREAM_MAC, dev); in phy_attach_direct()
1567 phydev->sysfs_links = false; in phy_attach_direct()
1569 phy_sysfs_create_links(phydev); in phy_attach_direct()
1571 if (!phydev->attached_dev) { in phy_attach_direct()
1572 err = sysfs_create_file(&phydev->mdio.dev.kobj, in phy_attach_direct()
1575 phydev_err(phydev, "error creating 'phy_standalone' sysfs entry\n"); in phy_attach_direct()
1578 phydev->dev_flags |= flags; in phy_attach_direct()
1580 phydev->interface = interface; in phy_attach_direct()
1582 phydev->state = PHY_READY; in phy_attach_direct()
1584 phydev->interrupts = PHY_INTERRUPT_DISABLED; in phy_attach_direct()
1590 if (phydev->dev_flags & PHY_F_NO_IRQ) in phy_attach_direct()
1591 phydev->irq = PHY_POLL; in phy_attach_direct()
1593 if (!phy_drv_supports_irq(phydev->drv) && phy_interrupt_is_valid(phydev)) in phy_attach_direct()
1594 phydev->irq = PHY_POLL; in phy_attach_direct()
1602 phydev->port = PORT_MII; in phy_attach_direct()
1608 netif_carrier_off(phydev->attached_dev); in phy_attach_direct()
1614 err = phy_init_hw(phydev); in phy_attach_direct()
1618 phy_resume(phydev); in phy_attach_direct()
1619 if (!phydev->is_on_sfp_module) in phy_attach_direct()
1620 phy_led_triggers_register(phydev); in phy_attach_direct()
1627 if (dev && phydev->mdio.bus->parent && dev->dev.parent != phydev->mdio.bus->parent) in phy_attach_direct()
1628 phydev->devlink = device_link_add(dev->dev.parent, &phydev->mdio.dev, in phy_attach_direct()
1635 phy_detach(phydev); in phy_attach_direct()
1661 struct phy_device *phydev; in phy_attach() local
1676 phydev = to_phy_device(d); in phy_attach()
1678 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_attach()
1683 return phydev; in phy_attach()
1687 static bool phy_driver_is_genphy_kind(struct phy_device *phydev, in phy_driver_is_genphy_kind() argument
1690 struct device *d = &phydev->mdio.dev; in phy_driver_is_genphy_kind()
1693 if (!phydev->drv) in phy_driver_is_genphy_kind()
1703 bool phy_driver_is_genphy(struct phy_device *phydev) in phy_driver_is_genphy() argument
1705 return phy_driver_is_genphy_kind(phydev, in phy_driver_is_genphy()
1710 bool phy_driver_is_genphy_10g(struct phy_device *phydev) in phy_driver_is_genphy_10g() argument
1712 return phy_driver_is_genphy_kind(phydev, in phy_driver_is_genphy_10g()
1724 void phy_detach(struct phy_device *phydev) in phy_detach() argument
1726 struct net_device *dev = phydev->attached_dev; in phy_detach()
1730 if (phydev->devlink) in phy_detach()
1731 device_link_del(phydev->devlink); in phy_detach()
1733 if (phydev->sysfs_links) { in phy_detach()
1736 sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev"); in phy_detach()
1739 if (!phydev->attached_dev) in phy_detach()
1740 sysfs_remove_file(&phydev->mdio.dev.kobj, in phy_detach()
1743 phy_suspend(phydev); in phy_detach()
1749 if (hwprov && hwprov->phydev == phydev) { in phy_detach()
1754 phydev->attached_dev->phydev = NULL; in phy_detach()
1755 phydev->attached_dev = NULL; in phy_detach()
1756 phy_link_topo_del_phy(dev, phydev); in phy_detach()
1758 phydev->phylink = NULL; in phy_detach()
1760 if (!phydev->is_on_sfp_module) in phy_detach()
1761 phy_led_triggers_unregister(phydev); in phy_detach()
1763 if (phydev->mdio.dev.driver) in phy_detach()
1764 module_put(phydev->mdio.dev.driver->owner); in phy_detach()
1771 if (phy_driver_is_genphy(phydev) || in phy_detach()
1772 phy_driver_is_genphy_10g(phydev)) in phy_detach()
1773 device_release_driver(&phydev->mdio.dev); in phy_detach()
1776 phy_device_reset(phydev, 1); in phy_detach()
1782 bus = phydev->mdio.bus; in phy_detach()
1784 put_device(&phydev->mdio.dev); in phy_detach()
1792 int phy_suspend(struct phy_device *phydev) in phy_suspend() argument
1794 struct net_device *netdev = phydev->attached_dev; in phy_suspend()
1795 const struct phy_driver *phydrv = phydev->drv; in phy_suspend()
1798 if (phydev->suspended || !phydrv) in phy_suspend()
1801 phydev->wol_enabled = phy_drv_wol_enabled(phydev) || in phy_suspend()
1804 if (phydev->wol_enabled && !(phydrv->flags & PHY_ALWAYS_CALL_SUSPEND)) in phy_suspend()
1810 ret = phydrv->suspend(phydev); in phy_suspend()
1812 phydev->suspended = true; in phy_suspend()
1818 int __phy_resume(struct phy_device *phydev) in __phy_resume() argument
1820 const struct phy_driver *phydrv = phydev->drv; in __phy_resume()
1823 lockdep_assert_held(&phydev->lock); in __phy_resume()
1828 ret = phydrv->resume(phydev); in __phy_resume()
1830 phydev->suspended = false; in __phy_resume()
1836 int phy_resume(struct phy_device *phydev) in phy_resume() argument
1840 mutex_lock(&phydev->lock); in phy_resume()
1841 ret = __phy_resume(phydev); in phy_resume()
1842 mutex_unlock(&phydev->lock); in phy_resume()
1857 int phy_reset_after_clk_enable(struct phy_device *phydev) in phy_reset_after_clk_enable() argument
1859 if (!phydev || !phydev->drv) in phy_reset_after_clk_enable()
1862 if (phydev->drv->flags & PHY_RST_AFTER_CLK_EN) { in phy_reset_after_clk_enable()
1863 phy_device_reset(phydev, 1); in phy_reset_after_clk_enable()
1864 phy_device_reset(phydev, 0); in phy_reset_after_clk_enable()
1884 static int genphy_config_advert(struct phy_device *phydev, in genphy_config_advert() argument
1893 err = phy_modify_changed(phydev, MII_ADVERTISE, in genphy_config_advert()
1902 bmsr = phy_read(phydev, MII_BMSR); in genphy_config_advert()
1915 err = phy_modify_changed(phydev, MII_CTRL1000, in genphy_config_advert()
1936 static int genphy_c37_config_advert(struct phy_device *phydev) in genphy_c37_config_advert() argument
1941 linkmode_and(phydev->advertising, phydev->advertising, in genphy_c37_config_advert()
1942 phydev->supported); in genphy_c37_config_advert()
1945 phydev->advertising)) in genphy_c37_config_advert()
1948 phydev->advertising)) in genphy_c37_config_advert()
1951 phydev->advertising)) in genphy_c37_config_advert()
1954 return phy_modify_changed(phydev, MII_ADVERTISE, in genphy_c37_config_advert()
1968 int genphy_setup_forced(struct phy_device *phydev) in genphy_setup_forced() argument
1972 phydev->pause = 0; in genphy_setup_forced()
1973 phydev->asym_pause = 0; in genphy_setup_forced()
1975 ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); in genphy_setup_forced()
1977 return phy_modify(phydev, MII_BMCR, in genphy_setup_forced()
1982 static int genphy_setup_master_slave(struct phy_device *phydev) in genphy_setup_master_slave() argument
1986 if (!phydev->is_gigabit_capable) in genphy_setup_master_slave()
1989 switch (phydev->master_slave_set) { in genphy_setup_master_slave()
2005 phydev_warn(phydev, "Unsupported Master/Slave mode\n"); in genphy_setup_master_slave()
2009 return phy_modify_changed(phydev, MII_CTRL1000, in genphy_setup_master_slave()
2014 int genphy_read_master_slave(struct phy_device *phydev) in genphy_read_master_slave() argument
2019 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN; in genphy_read_master_slave()
2020 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN; in genphy_read_master_slave()
2022 val = phy_read(phydev, MII_CTRL1000); in genphy_read_master_slave()
2038 val = phy_read(phydev, MII_STAT1000); in genphy_read_master_slave()
2044 } else if (phydev->link) { in genphy_read_master_slave()
2054 phydev->master_slave_get = cfg; in genphy_read_master_slave()
2055 phydev->master_slave_state = state; in genphy_read_master_slave()
2065 int genphy_restart_aneg(struct phy_device *phydev) in genphy_restart_aneg() argument
2068 return phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, in genphy_restart_aneg()
2080 int genphy_check_and_restart_aneg(struct phy_device *phydev, bool restart) in genphy_check_and_restart_aneg() argument
2088 ret = phy_read(phydev, MII_BMCR); in genphy_check_and_restart_aneg()
2097 return genphy_restart_aneg(phydev); in genphy_check_and_restart_aneg()
2112 int __genphy_config_aneg(struct phy_device *phydev, bool changed) in __genphy_config_aneg() argument
2119 err = genphy_c45_an_config_eee_aneg(phydev); in __genphy_config_aneg()
2125 err = genphy_setup_master_slave(phydev); in __genphy_config_aneg()
2131 if (phydev->autoneg == AUTONEG_ENABLE) { in __genphy_config_aneg()
2133 linkmode_and(phydev->advertising, phydev->advertising, in __genphy_config_aneg()
2134 phydev->supported); in __genphy_config_aneg()
2135 advert = phydev->advertising; in __genphy_config_aneg()
2136 } else if (phydev->speed < SPEED_1000) { in __genphy_config_aneg()
2137 return genphy_setup_forced(phydev); in __genphy_config_aneg()
2141 c = phy_caps_lookup(phydev->speed, phydev->duplex, in __genphy_config_aneg()
2142 phydev->supported, true); in __genphy_config_aneg()
2144 linkmode_and(fixed_advert, phydev->supported, in __genphy_config_aneg()
2150 err = genphy_config_advert(phydev, advert); in __genphy_config_aneg()
2156 return genphy_check_and_restart_aneg(phydev, changed); in __genphy_config_aneg()
2169 int genphy_c37_config_aneg(struct phy_device *phydev) in genphy_c37_config_aneg() argument
2173 if (phydev->autoneg != AUTONEG_ENABLE) in genphy_c37_config_aneg()
2174 return genphy_setup_forced(phydev); in genphy_c37_config_aneg()
2176 err = phy_modify(phydev, MII_BMCR, BMCR_SPEED1000 | BMCR_SPEED100, in genphy_c37_config_aneg()
2181 changed = genphy_c37_config_advert(phydev); in genphy_c37_config_aneg()
2189 int ctl = phy_read(phydev, MII_BMCR); in genphy_c37_config_aneg()
2202 return genphy_restart_aneg(phydev); in genphy_c37_config_aneg()
2216 int genphy_aneg_done(struct phy_device *phydev) in genphy_aneg_done() argument
2218 int retval = phy_read(phydev, MII_BMSR); in genphy_aneg_done()
2232 int genphy_update_link(struct phy_device *phydev) in genphy_update_link() argument
2236 bmcr = phy_read(phydev, MII_BMCR); in genphy_update_link()
2251 if (!phy_polling_mode(phydev) || !phydev->link) { in genphy_update_link()
2252 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2260 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2264 phydev->link = status & BMSR_LSTATUS ? 1 : 0; in genphy_update_link()
2265 phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0; in genphy_update_link()
2270 if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete) in genphy_update_link()
2271 phydev->link = 0; in genphy_update_link()
2277 int genphy_read_lpa(struct phy_device *phydev) in genphy_read_lpa() argument
2281 if (phydev->autoneg == AUTONEG_ENABLE) { in genphy_read_lpa()
2282 if (!phydev->autoneg_complete) { in genphy_read_lpa()
2283 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2285 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0); in genphy_read_lpa()
2289 if (phydev->is_gigabit_capable) { in genphy_read_lpa()
2290 lpagb = phy_read(phydev, MII_STAT1000); in genphy_read_lpa()
2295 int adv = phy_read(phydev, MII_CTRL1000); in genphy_read_lpa()
2301 phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n"); in genphy_read_lpa()
2303 phydev_err(phydev, "Master/Slave resolution failed\n"); in genphy_read_lpa()
2307 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2311 lpa = phy_read(phydev, MII_LPA); in genphy_read_lpa()
2315 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); in genphy_read_lpa()
2317 linkmode_zero(phydev->lp_advertising); in genphy_read_lpa()
2331 int genphy_read_status_fixed(struct phy_device *phydev) in genphy_read_status_fixed() argument
2333 int bmcr = phy_read(phydev, MII_BMCR); in genphy_read_status_fixed()
2339 phydev->duplex = DUPLEX_FULL; in genphy_read_status_fixed()
2341 phydev->duplex = DUPLEX_HALF; in genphy_read_status_fixed()
2344 phydev->speed = SPEED_1000; in genphy_read_status_fixed()
2346 phydev->speed = SPEED_100; in genphy_read_status_fixed()
2348 phydev->speed = SPEED_10; in genphy_read_status_fixed()
2363 int genphy_read_status(struct phy_device *phydev) in genphy_read_status() argument
2365 int err, old_link = phydev->link; in genphy_read_status()
2368 err = genphy_update_link(phydev); in genphy_read_status()
2373 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) in genphy_read_status()
2376 phydev->master_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED; in genphy_read_status()
2377 phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED; in genphy_read_status()
2378 phydev->speed = SPEED_UNKNOWN; in genphy_read_status()
2379 phydev->duplex = DUPLEX_UNKNOWN; in genphy_read_status()
2380 phydev->pause = 0; in genphy_read_status()
2381 phydev->asym_pause = 0; in genphy_read_status()
2383 if (phydev->is_gigabit_capable) { in genphy_read_status()
2384 err = genphy_read_master_slave(phydev); in genphy_read_status()
2389 err = genphy_read_lpa(phydev); in genphy_read_status()
2393 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_read_status()
2394 phy_resolve_aneg_linkmode(phydev); in genphy_read_status()
2395 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_read_status()
2396 err = genphy_read_status_fixed(phydev); in genphy_read_status()
2416 int genphy_c37_read_status(struct phy_device *phydev, bool *changed) in genphy_c37_read_status() argument
2418 int lpa, err, old_link = phydev->link; in genphy_c37_read_status()
2421 err = genphy_update_link(phydev); in genphy_c37_read_status()
2426 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) { in genphy_c37_read_status()
2433 phydev->duplex = DUPLEX_UNKNOWN; in genphy_c37_read_status()
2434 phydev->pause = 0; in genphy_c37_read_status()
2435 phydev->asym_pause = 0; in genphy_c37_read_status()
2437 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_c37_read_status()
2438 lpa = phy_read(phydev, MII_LPA); in genphy_c37_read_status()
2443 phydev->lp_advertising, lpa & LPA_LPACK); in genphy_c37_read_status()
2445 phydev->lp_advertising, lpa & LPA_1000XFULL); in genphy_c37_read_status()
2447 phydev->lp_advertising, lpa & LPA_1000XPAUSE); in genphy_c37_read_status()
2449 phydev->lp_advertising, in genphy_c37_read_status()
2452 phy_resolve_aneg_linkmode(phydev); in genphy_c37_read_status()
2453 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_c37_read_status()
2454 int bmcr = phy_read(phydev, MII_BMCR); in genphy_c37_read_status()
2460 phydev->duplex = DUPLEX_FULL; in genphy_c37_read_status()
2462 phydev->duplex = DUPLEX_HALF; in genphy_c37_read_status()
2478 int genphy_soft_reset(struct phy_device *phydev) in genphy_soft_reset() argument
2483 if (phydev->autoneg == AUTONEG_ENABLE) in genphy_soft_reset()
2486 ret = phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, res); in genphy_soft_reset()
2494 phydev->suspended = 0; in genphy_soft_reset()
2496 ret = phy_poll_reset(phydev); in genphy_soft_reset()
2501 if (phydev->autoneg == AUTONEG_DISABLE) in genphy_soft_reset()
2502 ret = genphy_setup_forced(phydev); in genphy_soft_reset()
2508 irqreturn_t genphy_handle_interrupt_no_ack(struct phy_device *phydev) in genphy_handle_interrupt_no_ack() argument
2515 phy_trigger_machine(phydev); in genphy_handle_interrupt_no_ack()
2530 int genphy_read_abilities(struct phy_device *phydev) in genphy_read_abilities() argument
2536 phydev->supported); in genphy_read_abilities()
2538 val = phy_read(phydev, MII_BMSR); in genphy_read_abilities()
2542 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported, in genphy_read_abilities()
2545 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2547 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2549 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2551 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2555 val = phy_read(phydev, MII_ESTATUS); in genphy_read_abilities()
2560 phydev->supported, val & ESTATUS_1000_TFULL); in genphy_read_abilities()
2562 phydev->supported, val & ESTATUS_1000_THALF); in genphy_read_abilities()
2564 phydev->supported, val & ESTATUS_1000_XFULL); in genphy_read_abilities()
2570 genphy_c45_read_eee_abilities(phydev); in genphy_read_abilities()
2593 int genphy_suspend(struct phy_device *phydev) in genphy_suspend() argument
2595 return phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_suspend()
2599 int genphy_resume(struct phy_device *phydev) in genphy_resume() argument
2601 return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_resume()
2605 int genphy_loopback(struct phy_device *phydev, bool enable, int speed) in genphy_loopback() argument
2613 phydev->speed = speed; in genphy_loopback()
2617 ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); in genphy_loopback()
2619 phy_modify(phydev, MII_BMCR, ~0, ctl); in genphy_loopback()
2621 ret = phy_read_poll_timeout(phydev, MII_BMSR, val, in genphy_loopback()
2627 phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, 0); in genphy_loopback()
2629 phy_config_aneg(phydev); in genphy_loopback()
2645 void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode) in phy_remove_link_mode() argument
2647 linkmode_clear_bit(link_mode, phydev->supported); in phy_remove_link_mode()
2648 phy_advertise_supported(phydev); in phy_remove_link_mode()
2667 void phy_advertise_supported(struct phy_device *phydev) in phy_advertise_supported() argument
2671 linkmode_copy(new, phydev->supported); in phy_advertise_supported()
2672 phy_copy_pause_bits(new, phydev->advertising); in phy_advertise_supported()
2673 linkmode_copy(phydev->advertising, new); in phy_advertise_supported()
2687 void phy_advertise_eee_all(struct phy_device *phydev) in phy_advertise_eee_all() argument
2689 linkmode_copy(phydev->advertising_eee, phydev->supported_eee); in phy_advertise_eee_all()
2713 void phy_support_eee(struct phy_device *phydev) in phy_support_eee() argument
2715 linkmode_copy(phydev->advertising_eee, phydev->supported_eee); in phy_support_eee()
2716 phydev->eee_cfg.tx_lpi_enabled = true; in phy_support_eee()
2717 phydev->eee_cfg.eee_enabled = true; in phy_support_eee()
2728 void phy_disable_eee(struct phy_device *phydev) in phy_disable_eee() argument
2730 linkmode_zero(phydev->advertising_eee); in phy_disable_eee()
2731 phydev->eee_cfg.tx_lpi_enabled = false; in phy_disable_eee()
2732 phydev->eee_cfg.eee_enabled = false; in phy_disable_eee()
2734 linkmode_fill(phydev->eee_disabled_modes); in phy_disable_eee()
2745 void phy_support_sym_pause(struct phy_device *phydev) in phy_support_sym_pause() argument
2747 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in phy_support_sym_pause()
2748 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_sym_pause()
2758 void phy_support_asym_pause(struct phy_device *phydev) in phy_support_asym_pause() argument
2760 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_asym_pause()
2775 void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, in phy_set_sym_pause() argument
2778 linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in phy_set_sym_pause()
2782 phydev->supported); in phy_set_sym_pause()
2784 linkmode_copy(phydev->advertising, phydev->supported); in phy_set_sym_pause()
2799 void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) in phy_set_asym_pause() argument
2803 linkmode_copy(oldadv, phydev->advertising); in phy_set_asym_pause()
2804 linkmode_set_pause(phydev->advertising, tx, rx); in phy_set_asym_pause()
2806 if (!linkmode_equal(oldadv, phydev->advertising) && in phy_set_asym_pause()
2807 phydev->autoneg) in phy_set_asym_pause()
2808 phy_start_aneg(phydev); in phy_set_asym_pause()
2821 bool phy_validate_pause(struct phy_device *phydev, in phy_validate_pause() argument
2825 phydev->supported) && pp->rx_pause) in phy_validate_pause()
2829 phydev->supported) && in phy_validate_pause()
2849 void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause) in phy_get_pause() argument
2851 if (phydev->duplex != DUPLEX_FULL) { in phy_get_pause()
2857 return linkmode_resolve_pause(phydev->advertising, in phy_get_pause()
2858 phydev->lp_advertising, in phy_get_pause()
2891 s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev, in phy_get_internal_delay() argument
2900 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
2901 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) in phy_get_internal_delay()
2910 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
2911 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) in phy_get_internal_delay()
2925 phydev_err(phydev, "Delay %d is out of range\n", delay); in phy_get_internal_delay()
2947 phydev_err(phydev, "error finding internal delay index for %d\n", in phy_get_internal_delay()
2963 int phy_get_tx_amplitude_gain(struct phy_device *phydev, struct device *dev, in phy_get_tx_amplitude_gain() argument
2982 struct phy_device *phydev = phyled->phydev; in phy_led_set_brightness() local
2985 mutex_lock(&phydev->lock); in phy_led_set_brightness()
2986 err = phydev->drv->led_brightness_set(phydev, phyled->index, value); in phy_led_set_brightness()
2987 mutex_unlock(&phydev->lock); in phy_led_set_brightness()
2997 struct phy_device *phydev = phyled->phydev; in phy_led_blink_set() local
3000 mutex_lock(&phydev->lock); in phy_led_blink_set()
3001 err = phydev->drv->led_blink_set(phydev, phyled->index, in phy_led_blink_set()
3003 mutex_unlock(&phydev->lock); in phy_led_blink_set()
3012 struct phy_device *phydev = phyled->phydev; in phy_led_hw_control_get_device() local
3014 if (phydev->attached_dev) in phy_led_hw_control_get_device()
3015 return &phydev->attached_dev->dev; in phy_led_hw_control_get_device()
3024 struct phy_device *phydev = phyled->phydev; in phy_led_hw_control_get() local
3027 mutex_lock(&phydev->lock); in phy_led_hw_control_get()
3028 err = phydev->drv->led_hw_control_get(phydev, phyled->index, rules); in phy_led_hw_control_get()
3029 mutex_unlock(&phydev->lock); in phy_led_hw_control_get()
3039 struct phy_device *phydev = phyled->phydev; in phy_led_hw_control_set() local
3042 mutex_lock(&phydev->lock); in phy_led_hw_control_set()
3043 err = phydev->drv->led_hw_control_set(phydev, phyled->index, rules); in phy_led_hw_control_set()
3044 mutex_unlock(&phydev->lock); in phy_led_hw_control_set()
3053 struct phy_device *phydev = phyled->phydev; in phy_led_hw_is_supported() local
3056 mutex_lock(&phydev->lock); in phy_led_hw_is_supported()
3057 err = phydev->drv->led_hw_is_supported(phydev, phyled->index, rules); in phy_led_hw_is_supported()
3058 mutex_unlock(&phydev->lock); in phy_led_hw_is_supported()
3063 static void phy_leds_unregister(struct phy_device *phydev) in phy_leds_unregister() argument
3067 list_for_each_entry_safe(phyled, tmp, &phydev->leds, list) { in phy_leds_unregister()
3073 static int of_phy_led(struct phy_device *phydev, in of_phy_led() argument
3076 struct device *dev = &phydev->mdio.dev; in of_phy_led()
3089 phyled->phydev = phydev; in of_phy_led()
3110 if (!phydev->drv->led_polarity_set) in of_phy_led()
3113 err = phydev->drv->led_polarity_set(phydev, index, modes); in of_phy_led()
3119 if (phydev->drv->led_brightness_set) in of_phy_led()
3121 if (phydev->drv->led_blink_set) in of_phy_led()
3125 if (phydev->drv->led_hw_is_supported && in of_phy_led()
3126 phydev->drv->led_hw_control_set && in of_phy_led()
3127 phydev->drv->led_hw_control_get) { in of_phy_led()
3137 init_data.devicename = dev_name(&phydev->mdio.dev); in of_phy_led()
3145 list_add(&phyled->list, &phydev->leds); in of_phy_led()
3150 static int of_phy_leds(struct phy_device *phydev) in of_phy_leds() argument
3152 struct device_node *node = phydev->mdio.dev.of_node; in of_phy_leds()
3169 if (!(phydev->drv->led_brightness_set || in of_phy_leds()
3170 phydev->drv->led_blink_set || in of_phy_leds()
3171 phydev->drv->led_hw_control_set)) { in of_phy_leds()
3172 phydev_dbg(phydev, "ignoring leds node defined with no PHY driver support\n"); in of_phy_leds()
3177 err = of_phy_led(phydev, led); in of_phy_leds()
3180 phy_leds_unregister(phydev); in of_phy_leds()
3282 struct phy_device *phydev = to_phy_device(dev); in phy_probe() local
3283 struct device_driver *drv = phydev->mdio.dev.driver; in phy_probe()
3287 phydev->drv = phydrv; in phy_probe()
3292 if (!phy_drv_supports_irq(phydrv) && phy_interrupt_is_valid(phydev)) in phy_probe()
3293 phydev->irq = PHY_POLL; in phy_probe()
3296 phydev->is_internal = true; in phy_probe()
3299 phy_device_reset(phydev, 0); in phy_probe()
3301 if (phydev->drv->probe) { in phy_probe()
3302 err = phydev->drv->probe(phydev); in phy_probe()
3307 phy_disable_interrupts(phydev); in phy_probe()
3314 linkmode_copy(phydev->supported, phydrv->features); in phy_probe()
3315 genphy_c45_read_eee_abilities(phydev); in phy_probe()
3318 err = phydrv->get_features(phydev); in phy_probe()
3319 else if (phydev->is_c45) in phy_probe()
3320 err = genphy_c45_pma_read_abilities(phydev); in phy_probe()
3322 err = genphy_read_abilities(phydev); in phy_probe()
3328 phydev->supported)) in phy_probe()
3329 phydev->autoneg = 0; in phy_probe()
3332 phydev->supported)) in phy_probe()
3333 phydev->is_gigabit_capable = 1; in phy_probe()
3335 phydev->supported)) in phy_probe()
3336 phydev->is_gigabit_capable = 1; in phy_probe()
3338 of_set_phy_supported(phydev); in phy_probe()
3339 phy_advertise_supported(phydev); in phy_probe()
3344 err = genphy_c45_read_eee_adv(phydev, phydev->advertising_eee); in phy_probe()
3349 of_set_phy_eee_broken(phydev); in phy_probe()
3354 linkmode_and(phydev->advertising_eee, phydev->supported_eee, in phy_probe()
3355 phydev->advertising_eee); in phy_probe()
3356 linkmode_andnot(phydev->advertising_eee, phydev->advertising_eee, in phy_probe()
3357 phydev->eee_disabled_modes); in phy_probe()
3362 phydev->eee_cfg.eee_enabled = !linkmode_empty(phydev->advertising_eee); in phy_probe()
3365 of_set_phy_timing_role(phydev); in phy_probe()
3378 if (!test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported) && in phy_probe()
3379 !test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported)) { in phy_probe()
3381 phydev->supported); in phy_probe()
3383 phydev->supported); in phy_probe()
3387 phydev->state = PHY_READY; in phy_probe()
3393 err = of_phy_leds(phydev); in phy_probe()
3398 phy_device_reset(phydev, 1); in phy_probe()
3405 struct phy_device *phydev = to_phy_device(dev); in phy_remove() local
3407 cancel_delayed_work_sync(&phydev->state_queue); in phy_remove()
3410 phy_leds_unregister(phydev); in phy_remove()
3412 phydev->state = PHY_DOWN; in phy_remove()
3414 sfp_bus_del_upstream(phydev->sfp_bus); in phy_remove()
3415 phydev->sfp_bus = NULL; in phy_remove()
3417 if (phydev->drv && phydev->drv->remove) in phy_remove()
3418 phydev->drv->remove(phydev); in phy_remove()
3421 phy_device_reset(phydev, 1); in phy_remove()
3423 phydev->drv = NULL; in phy_remove()