Lines Matching refs:phydev
234 void phy_device_free(struct phy_device *phydev) in phy_device_free() argument
236 put_device(&phydev->mdio.dev); in phy_device_free()
242 struct phy_device *phydev; in phy_mdio_device_free() local
244 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_free()
245 phy_device_free(phydev); in phy_mdio_device_free()
256 struct phy_device *phydev; in phy_mdio_device_remove() local
258 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_remove()
259 phy_device_remove(phydev); in phy_mdio_device_remove()
267 static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) in mdio_bus_phy_may_suspend() argument
269 struct device_driver *drv = phydev->mdio.dev.driver; in mdio_bus_phy_may_suspend()
271 struct net_device *netdev = phydev->attached_dev; in mdio_bus_phy_may_suspend()
303 return !phydev->suspended; in mdio_bus_phy_may_suspend()
308 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_suspend() local
310 if (phydev->mac_managed_pm) in mdio_bus_phy_suspend()
317 if (phy_interrupt_is_valid(phydev)) { in mdio_bus_phy_suspend()
318 phydev->irq_suspended = 1; in mdio_bus_phy_suspend()
319 synchronize_irq(phydev->irq); in mdio_bus_phy_suspend()
327 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_suspend()
328 phy_stop_machine(phydev); in mdio_bus_phy_suspend()
330 if (!mdio_bus_phy_may_suspend(phydev)) in mdio_bus_phy_suspend()
333 phydev->suspended_by_mdio_bus = 1; in mdio_bus_phy_suspend()
335 return phy_suspend(phydev); in mdio_bus_phy_suspend()
340 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_resume() local
343 if (phydev->mac_managed_pm) in mdio_bus_phy_resume()
346 if (!phydev->suspended_by_mdio_bus) in mdio_bus_phy_resume()
349 phydev->suspended_by_mdio_bus = 0; in mdio_bus_phy_resume()
356 WARN_ON(phydev->state != PHY_HALTED && phydev->state != PHY_READY && in mdio_bus_phy_resume()
357 phydev->state != PHY_UP); in mdio_bus_phy_resume()
359 ret = phy_init_hw(phydev); in mdio_bus_phy_resume()
363 ret = phy_resume(phydev); in mdio_bus_phy_resume()
367 if (phy_interrupt_is_valid(phydev)) { in mdio_bus_phy_resume()
368 phydev->irq_suspended = 0; in mdio_bus_phy_resume()
369 synchronize_irq(phydev->irq); in mdio_bus_phy_resume()
374 if (phydev->irq_rerun) { in mdio_bus_phy_resume()
375 phydev->irq_rerun = 0; in mdio_bus_phy_resume()
376 enable_irq(phydev->irq); in mdio_bus_phy_resume()
377 irq_wake_thread(phydev->irq, phydev); in mdio_bus_phy_resume()
381 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_resume()
382 phy_start_machine(phydev); in mdio_bus_phy_resume()
486 static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup) in phy_needs_fixup() argument
488 if (strcmp(fixup->bus_id, phydev_name(phydev)) != 0) in phy_needs_fixup()
493 (phydev->phy_id & fixup->phy_uid_mask)) in phy_needs_fixup()
501 static int phy_scan_fixups(struct phy_device *phydev) in phy_scan_fixups() argument
507 if (phy_needs_fixup(phydev, fixup)) { in phy_scan_fixups()
508 int err = fixup->run(phydev); in phy_scan_fixups()
514 phydev->has_fixups = true; in phy_scan_fixups()
524 struct phy_device *phydev = to_phy_device(dev); in phy_bus_match() local
526 const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); in phy_bus_match()
533 return phydrv->match_phy_device(phydev); in phy_bus_match()
535 if (phydev->is_c45) { in phy_bus_match()
537 if (phydev->c45_ids.device_ids[i] == 0xffffffff) in phy_bus_match()
541 (phydev->c45_ids.device_ids[i] & in phy_bus_match()
548 (phydev->phy_id & phydrv->phy_id_mask); in phy_bus_match()
555 struct phy_device *phydev = to_phy_device(dev); in phy_id_show() local
557 return sysfs_emit(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id); in phy_id_show()
564 struct phy_device *phydev = to_phy_device(dev); in phy_interface_show() local
567 if (phy_is_internal(phydev)) in phy_interface_show()
570 mode = phy_modes(phydev->interface); in phy_interface_show()
580 struct phy_device *phydev = to_phy_device(dev); in phy_has_fixups_show() local
582 return sysfs_emit(buf, "%d\n", phydev->has_fixups); in phy_has_fixups_show()
590 struct phy_device *phydev = to_phy_device(dev); in phy_dev_flags_show() local
592 return sysfs_emit(buf, "0x%08x\n", phydev->dev_flags); in phy_dev_flags_show()
980 int phy_device_register(struct phy_device *phydev) in phy_device_register() argument
984 err = mdiobus_register_device(&phydev->mdio); in phy_device_register()
989 phy_device_reset(phydev, 0); in phy_device_register()
992 err = phy_scan_fixups(phydev); in phy_device_register()
994 phydev_err(phydev, "failed to initialize\n"); in phy_device_register()
998 err = device_add(&phydev->mdio.dev); in phy_device_register()
1000 phydev_err(phydev, "failed to add\n"); in phy_device_register()
1008 phy_device_reset(phydev, 1); in phy_device_register()
1010 mdiobus_unregister_device(&phydev->mdio); in phy_device_register()
1023 void phy_device_remove(struct phy_device *phydev) in phy_device_remove() argument
1025 unregister_mii_timestamper(phydev->mii_ts); in phy_device_remove()
1026 pse_control_put(phydev->psec); in phy_device_remove()
1028 device_del(&phydev->mdio.dev); in phy_device_remove()
1031 phy_device_reset(phydev, 1); in phy_device_remove()
1033 mdiobus_unregister_device(&phydev->mdio); in phy_device_remove()
1044 int phy_get_c45_ids(struct phy_device *phydev) in phy_get_c45_ids() argument
1046 return get_phy_c45_ids(phydev->mdio.bus, phydev->mdio.addr, in phy_get_c45_ids()
1047 &phydev->c45_ids); in phy_get_c45_ids()
1057 struct phy_device *phydev; in phy_find_first() local
1061 phydev = mdiobus_get_phy(bus, addr); in phy_find_first()
1062 if (phydev) in phy_find_first()
1063 return phydev; in phy_find_first()
1069 static void phy_link_change(struct phy_device *phydev, bool up) in phy_link_change() argument
1071 struct net_device *netdev = phydev->attached_dev; in phy_link_change()
1077 phydev->adjust_link(netdev); in phy_link_change()
1078 if (phydev->mii_ts && phydev->mii_ts->link_state) in phy_link_change()
1079 phydev->mii_ts->link_state(phydev->mii_ts, phydev); in phy_link_change()
1094 static void phy_prepare_link(struct phy_device *phydev, in phy_prepare_link() argument
1097 phydev->adjust_link = handler; in phy_prepare_link()
1107 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, in phy_connect_direct() argument
1116 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_connect_direct()
1120 phy_prepare_link(phydev, handler); in phy_connect_direct()
1121 if (phy_interrupt_is_valid(phydev)) in phy_connect_direct()
1122 phy_request_interrupt(phydev); in phy_connect_direct()
1147 struct phy_device *phydev; in phy_connect() local
1159 phydev = to_phy_device(d); in phy_connect()
1161 rc = phy_connect_direct(dev, phydev, handler, interface); in phy_connect()
1166 return phydev; in phy_connect()
1175 void phy_disconnect(struct phy_device *phydev) in phy_disconnect() argument
1177 if (phy_is_started(phydev)) in phy_disconnect()
1178 phy_stop(phydev); in phy_disconnect()
1180 if (phy_interrupt_is_valid(phydev)) in phy_disconnect()
1181 phy_free_interrupt(phydev); in phy_disconnect()
1183 phydev->adjust_link = NULL; in phy_disconnect()
1185 phy_detach(phydev); in phy_disconnect()
1207 static int phy_poll_reset(struct phy_device *phydev) in phy_poll_reset() argument
1212 ret = phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET), in phy_poll_reset()
1223 int phy_init_hw(struct phy_device *phydev) in phy_init_hw() argument
1228 phy_device_reset(phydev, 0); in phy_init_hw()
1230 if (!phydev->drv) in phy_init_hw()
1233 if (phydev->drv->soft_reset) { in phy_init_hw()
1234 ret = phydev->drv->soft_reset(phydev); in phy_init_hw()
1237 phydev->suspended = 0; in phy_init_hw()
1243 ret = phy_scan_fixups(phydev); in phy_init_hw()
1247 if (phydev->drv->config_init) { in phy_init_hw()
1248 ret = phydev->drv->config_init(phydev); in phy_init_hw()
1253 if (phydev->drv->config_intr) { in phy_init_hw()
1254 ret = phydev->drv->config_intr(phydev); in phy_init_hw()
1263 void phy_attached_info(struct phy_device *phydev) in phy_attached_info() argument
1265 phy_attached_print(phydev, NULL); in phy_attached_info()
1270 char *phy_attached_info_irq(struct phy_device *phydev) in phy_attached_info_irq() argument
1275 switch(phydev->irq) { in phy_attached_info_irq()
1283 snprintf(irq_num, sizeof(irq_num), "%d", phydev->irq); in phy_attached_info_irq()
1292 void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) in phy_attached_print() argument
1294 const char *unbound = phydev->drv ? "" : "[unbound] "; in phy_attached_print()
1295 char *irq_str = phy_attached_info_irq(phydev); in phy_attached_print()
1298 phydev_info(phydev, ATTACHED_FMT "\n", unbound, in phy_attached_print()
1299 phydev_name(phydev), irq_str); in phy_attached_print()
1303 phydev_info(phydev, ATTACHED_FMT, unbound, in phy_attached_print()
1304 phydev_name(phydev), irq_str); in phy_attached_print()
1314 static void phy_sysfs_create_links(struct phy_device *phydev) in phy_sysfs_create_links() argument
1316 struct net_device *dev = phydev->attached_dev; in phy_sysfs_create_links()
1322 err = sysfs_create_link(&phydev->mdio.dev.kobj, &dev->dev.kobj, in phy_sysfs_create_links()
1328 &phydev->mdio.dev.kobj, in phy_sysfs_create_links()
1332 kobject_name(&phydev->mdio.dev.kobj), in phy_sysfs_create_links()
1339 phydev->sysfs_links = true; in phy_sysfs_create_links()
1346 struct phy_device *phydev = to_phy_device(dev); in phy_standalone_show() local
1348 return sysfs_emit(buf, "%d\n", !phydev->attached_dev); in phy_standalone_show()
1361 struct phy_device *phydev = upstream; in phy_sfp_attach() local
1363 if (phydev->attached_dev) in phy_sfp_attach()
1364 phydev->attached_dev->sfp_bus = bus; in phy_sfp_attach()
1365 phydev->sfp_bus_attached = true; in phy_sfp_attach()
1378 struct phy_device *phydev = upstream; in phy_sfp_detach() local
1380 if (phydev->attached_dev) in phy_sfp_detach()
1381 phydev->attached_dev->sfp_bus = NULL; in phy_sfp_detach()
1382 phydev->sfp_bus_attached = false; in phy_sfp_detach()
1391 int phy_sfp_probe(struct phy_device *phydev, in phy_sfp_probe() argument
1397 if (phydev->mdio.dev.fwnode) { in phy_sfp_probe()
1398 bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode); in phy_sfp_probe()
1402 phydev->sfp_bus = bus; in phy_sfp_probe()
1404 ret = sfp_bus_add_upstream(bus, phydev, ops); in phy_sfp_probe()
1426 int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, in phy_attach_direct() argument
1429 struct mii_bus *bus = phydev->mdio.bus; in phy_attach_direct()
1430 struct device *d = &phydev->mdio.dev; in phy_attach_direct()
1443 phydev_err(phydev, "failed to get the bus module\n"); in phy_attach_direct()
1453 if (phydev->is_c45) in phy_attach_direct()
1462 phydev_err(phydev, "failed to get the device driver module\n"); in phy_attach_direct()
1476 if (phydev->attached_dev) { in phy_attach_direct()
1482 phydev->phy_link_change = phy_link_change; in phy_attach_direct()
1484 phydev->attached_dev = dev; in phy_attach_direct()
1485 dev->phydev = phydev; in phy_attach_direct()
1487 if (phydev->sfp_bus_attached) in phy_attach_direct()
1488 dev->sfp_bus = phydev->sfp_bus; in phy_attach_direct()
1490 phydev->is_on_sfp_module = true; in phy_attach_direct()
1501 phydev->sysfs_links = false; in phy_attach_direct()
1503 phy_sysfs_create_links(phydev); in phy_attach_direct()
1505 if (!phydev->attached_dev) { in phy_attach_direct()
1506 err = sysfs_create_file(&phydev->mdio.dev.kobj, in phy_attach_direct()
1509 phydev_err(phydev, "error creating 'phy_standalone' sysfs entry\n"); in phy_attach_direct()
1512 phydev->dev_flags |= flags; in phy_attach_direct()
1514 phydev->interface = interface; in phy_attach_direct()
1516 phydev->state = PHY_READY; in phy_attach_direct()
1518 phydev->interrupts = PHY_INTERRUPT_DISABLED; in phy_attach_direct()
1524 if (phydev->dev_flags & PHY_F_NO_IRQ) in phy_attach_direct()
1525 phydev->irq = PHY_POLL; in phy_attach_direct()
1533 phydev->port = PORT_MII; in phy_attach_direct()
1539 netif_carrier_off(phydev->attached_dev); in phy_attach_direct()
1545 err = phy_init_hw(phydev); in phy_attach_direct()
1549 phy_resume(phydev); in phy_attach_direct()
1550 phy_led_triggers_register(phydev); in phy_attach_direct()
1557 if (dev && phydev->mdio.bus->parent && dev->dev.parent != phydev->mdio.bus->parent) in phy_attach_direct()
1558 phydev->devlink = device_link_add(dev->dev.parent, &phydev->mdio.dev, in phy_attach_direct()
1565 phy_detach(phydev); in phy_attach_direct()
1592 struct phy_device *phydev; in phy_attach() local
1607 phydev = to_phy_device(d); in phy_attach()
1609 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_attach()
1614 return phydev; in phy_attach()
1618 static bool phy_driver_is_genphy_kind(struct phy_device *phydev, in phy_driver_is_genphy_kind() argument
1621 struct device *d = &phydev->mdio.dev; in phy_driver_is_genphy_kind()
1624 if (!phydev->drv) in phy_driver_is_genphy_kind()
1634 bool phy_driver_is_genphy(struct phy_device *phydev) in phy_driver_is_genphy() argument
1636 return phy_driver_is_genphy_kind(phydev, in phy_driver_is_genphy()
1641 bool phy_driver_is_genphy_10g(struct phy_device *phydev) in phy_driver_is_genphy_10g() argument
1643 return phy_driver_is_genphy_kind(phydev, in phy_driver_is_genphy_10g()
1674 int phy_package_join(struct phy_device *phydev, int addr, size_t priv_size) in phy_package_join() argument
1676 struct mii_bus *bus = phydev->mdio.bus; in phy_package_join()
1707 phydev->shared = shared; in phy_package_join()
1727 void phy_package_leave(struct phy_device *phydev) in phy_package_leave() argument
1729 struct phy_package_shared *shared = phydev->shared; in phy_package_leave()
1730 struct mii_bus *bus = phydev->mdio.bus; in phy_package_leave()
1742 phydev->shared = NULL; in phy_package_leave()
1762 int devm_phy_package_join(struct device *dev, struct phy_device *phydev, in devm_phy_package_join() argument
1773 ret = phy_package_join(phydev, addr, priv_size); in devm_phy_package_join()
1776 *ptr = phydev; in devm_phy_package_join()
1793 void phy_detach(struct phy_device *phydev) in phy_detach() argument
1795 struct net_device *dev = phydev->attached_dev; in phy_detach()
1799 if (phydev->devlink) in phy_detach()
1800 device_link_del(phydev->devlink); in phy_detach()
1802 if (phydev->sysfs_links) { in phy_detach()
1805 sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev"); in phy_detach()
1808 if (!phydev->attached_dev) in phy_detach()
1809 sysfs_remove_file(&phydev->mdio.dev.kobj, in phy_detach()
1812 phy_suspend(phydev); in phy_detach()
1814 phydev->attached_dev->phydev = NULL; in phy_detach()
1815 phydev->attached_dev = NULL; in phy_detach()
1817 phydev->phylink = NULL; in phy_detach()
1819 phy_led_triggers_unregister(phydev); in phy_detach()
1821 if (phydev->mdio.dev.driver) in phy_detach()
1822 module_put(phydev->mdio.dev.driver->owner); in phy_detach()
1829 if (phy_driver_is_genphy(phydev) || in phy_detach()
1830 phy_driver_is_genphy_10g(phydev)) in phy_detach()
1831 device_release_driver(&phydev->mdio.dev); in phy_detach()
1834 phy_device_reset(phydev, 1); in phy_detach()
1840 bus = phydev->mdio.bus; in phy_detach()
1842 put_device(&phydev->mdio.dev); in phy_detach()
1850 int phy_suspend(struct phy_device *phydev) in phy_suspend() argument
1853 struct net_device *netdev = phydev->attached_dev; in phy_suspend()
1854 struct phy_driver *phydrv = phydev->drv; in phy_suspend()
1857 if (phydev->suspended) in phy_suspend()
1861 phy_ethtool_get_wol(phydev, &wol); in phy_suspend()
1868 ret = phydrv->suspend(phydev); in phy_suspend()
1870 phydev->suspended = true; in phy_suspend()
1876 int __phy_resume(struct phy_device *phydev) in __phy_resume() argument
1878 struct phy_driver *phydrv = phydev->drv; in __phy_resume()
1881 lockdep_assert_held(&phydev->lock); in __phy_resume()
1886 ret = phydrv->resume(phydev); in __phy_resume()
1888 phydev->suspended = false; in __phy_resume()
1894 int phy_resume(struct phy_device *phydev) in phy_resume() argument
1898 mutex_lock(&phydev->lock); in phy_resume()
1899 ret = __phy_resume(phydev); in phy_resume()
1900 mutex_unlock(&phydev->lock); in phy_resume()
1906 int phy_loopback(struct phy_device *phydev, bool enable) in phy_loopback() argument
1910 if (!phydev->drv) in phy_loopback()
1913 mutex_lock(&phydev->lock); in phy_loopback()
1915 if (enable && phydev->loopback_enabled) { in phy_loopback()
1920 if (!enable && !phydev->loopback_enabled) { in phy_loopback()
1925 if (phydev->drv->set_loopback) in phy_loopback()
1926 ret = phydev->drv->set_loopback(phydev, enable); in phy_loopback()
1928 ret = genphy_loopback(phydev, enable); in phy_loopback()
1933 phydev->loopback_enabled = enable; in phy_loopback()
1936 mutex_unlock(&phydev->lock); in phy_loopback()
1950 int phy_reset_after_clk_enable(struct phy_device *phydev) in phy_reset_after_clk_enable() argument
1952 if (!phydev || !phydev->drv) in phy_reset_after_clk_enable()
1955 if (phydev->drv->flags & PHY_RST_AFTER_CLK_EN) { in phy_reset_after_clk_enable()
1956 phy_device_reset(phydev, 1); in phy_reset_after_clk_enable()
1957 phy_device_reset(phydev, 0); in phy_reset_after_clk_enable()
1976 static int genphy_config_advert(struct phy_device *phydev) in genphy_config_advert() argument
1982 linkmode_and(phydev->advertising, phydev->advertising, in genphy_config_advert()
1983 phydev->supported); in genphy_config_advert()
1985 adv = linkmode_adv_to_mii_adv_t(phydev->advertising); in genphy_config_advert()
1988 err = phy_modify_changed(phydev, MII_ADVERTISE, in genphy_config_advert()
1997 bmsr = phy_read(phydev, MII_BMSR); in genphy_config_advert()
2008 adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); in genphy_config_advert()
2010 err = phy_modify_changed(phydev, MII_CTRL1000, in genphy_config_advert()
2031 static int genphy_c37_config_advert(struct phy_device *phydev) in genphy_c37_config_advert() argument
2036 linkmode_and(phydev->advertising, phydev->advertising, in genphy_c37_config_advert()
2037 phydev->supported); in genphy_c37_config_advert()
2040 phydev->advertising)) in genphy_c37_config_advert()
2043 phydev->advertising)) in genphy_c37_config_advert()
2046 phydev->advertising)) in genphy_c37_config_advert()
2049 return phy_modify_changed(phydev, MII_ADVERTISE, in genphy_c37_config_advert()
2063 int genphy_config_eee_advert(struct phy_device *phydev) in genphy_config_eee_advert() argument
2068 if (!phydev->eee_broken_modes) in genphy_config_eee_advert()
2071 err = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, in genphy_config_eee_advert()
2072 phydev->eee_broken_modes, 0); in genphy_config_eee_advert()
2086 int genphy_setup_forced(struct phy_device *phydev) in genphy_setup_forced() argument
2090 phydev->pause = 0; in genphy_setup_forced()
2091 phydev->asym_pause = 0; in genphy_setup_forced()
2093 ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); in genphy_setup_forced()
2095 return phy_modify(phydev, MII_BMCR, in genphy_setup_forced()
2100 static int genphy_setup_master_slave(struct phy_device *phydev) in genphy_setup_master_slave() argument
2104 if (!phydev->is_gigabit_capable) in genphy_setup_master_slave()
2107 switch (phydev->master_slave_set) { in genphy_setup_master_slave()
2123 phydev_warn(phydev, "Unsupported Master/Slave mode\n"); in genphy_setup_master_slave()
2127 return phy_modify_changed(phydev, MII_CTRL1000, in genphy_setup_master_slave()
2132 int genphy_read_master_slave(struct phy_device *phydev) in genphy_read_master_slave() argument
2137 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN; in genphy_read_master_slave()
2138 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN; in genphy_read_master_slave()
2140 val = phy_read(phydev, MII_CTRL1000); in genphy_read_master_slave()
2156 val = phy_read(phydev, MII_STAT1000); in genphy_read_master_slave()
2162 } else if (phydev->link) { in genphy_read_master_slave()
2172 phydev->master_slave_get = cfg; in genphy_read_master_slave()
2173 phydev->master_slave_state = state; in genphy_read_master_slave()
2183 int genphy_restart_aneg(struct phy_device *phydev) in genphy_restart_aneg() argument
2186 return phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, in genphy_restart_aneg()
2198 int genphy_check_and_restart_aneg(struct phy_device *phydev, bool restart) in genphy_check_and_restart_aneg() argument
2206 ret = phy_read(phydev, MII_BMCR); in genphy_check_and_restart_aneg()
2215 return genphy_restart_aneg(phydev); in genphy_check_and_restart_aneg()
2230 int __genphy_config_aneg(struct phy_device *phydev, bool changed) in __genphy_config_aneg() argument
2234 err = genphy_c45_an_config_eee_aneg(phydev); in __genphy_config_aneg()
2240 err = genphy_setup_master_slave(phydev); in __genphy_config_aneg()
2246 if (AUTONEG_ENABLE != phydev->autoneg) in __genphy_config_aneg()
2247 return genphy_setup_forced(phydev); in __genphy_config_aneg()
2249 err = genphy_config_advert(phydev); in __genphy_config_aneg()
2255 return genphy_check_and_restart_aneg(phydev, changed); in __genphy_config_aneg()
2268 int genphy_c37_config_aneg(struct phy_device *phydev) in genphy_c37_config_aneg() argument
2272 if (phydev->autoneg != AUTONEG_ENABLE) in genphy_c37_config_aneg()
2273 return genphy_setup_forced(phydev); in genphy_c37_config_aneg()
2275 err = phy_modify(phydev, MII_BMCR, BMCR_SPEED1000 | BMCR_SPEED100, in genphy_c37_config_aneg()
2280 changed = genphy_c37_config_advert(phydev); in genphy_c37_config_aneg()
2288 int ctl = phy_read(phydev, MII_BMCR); in genphy_c37_config_aneg()
2301 return genphy_restart_aneg(phydev); in genphy_c37_config_aneg()
2315 int genphy_aneg_done(struct phy_device *phydev) in genphy_aneg_done() argument
2317 int retval = phy_read(phydev, MII_BMSR); in genphy_aneg_done()
2331 int genphy_update_link(struct phy_device *phydev) in genphy_update_link() argument
2335 bmcr = phy_read(phydev, MII_BMCR); in genphy_update_link()
2350 if (!phy_polling_mode(phydev) || !phydev->link) { in genphy_update_link()
2351 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2359 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2363 phydev->link = status & BMSR_LSTATUS ? 1 : 0; in genphy_update_link()
2364 phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0; in genphy_update_link()
2369 if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete) in genphy_update_link()
2370 phydev->link = 0; in genphy_update_link()
2376 int genphy_read_lpa(struct phy_device *phydev) in genphy_read_lpa() argument
2380 if (phydev->autoneg == AUTONEG_ENABLE) { in genphy_read_lpa()
2381 if (!phydev->autoneg_complete) { in genphy_read_lpa()
2382 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2384 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0); in genphy_read_lpa()
2388 if (phydev->is_gigabit_capable) { in genphy_read_lpa()
2389 lpagb = phy_read(phydev, MII_STAT1000); in genphy_read_lpa()
2394 int adv = phy_read(phydev, MII_CTRL1000); in genphy_read_lpa()
2400 phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n"); in genphy_read_lpa()
2402 phydev_err(phydev, "Master/Slave resolution failed\n"); in genphy_read_lpa()
2406 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2410 lpa = phy_read(phydev, MII_LPA); in genphy_read_lpa()
2414 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); in genphy_read_lpa()
2416 linkmode_zero(phydev->lp_advertising); in genphy_read_lpa()
2430 int genphy_read_status_fixed(struct phy_device *phydev) in genphy_read_status_fixed() argument
2432 int bmcr = phy_read(phydev, MII_BMCR); in genphy_read_status_fixed()
2438 phydev->duplex = DUPLEX_FULL; in genphy_read_status_fixed()
2440 phydev->duplex = DUPLEX_HALF; in genphy_read_status_fixed()
2443 phydev->speed = SPEED_1000; in genphy_read_status_fixed()
2445 phydev->speed = SPEED_100; in genphy_read_status_fixed()
2447 phydev->speed = SPEED_10; in genphy_read_status_fixed()
2462 int genphy_read_status(struct phy_device *phydev) in genphy_read_status() argument
2464 int err, old_link = phydev->link; in genphy_read_status()
2467 err = genphy_update_link(phydev); in genphy_read_status()
2472 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) in genphy_read_status()
2475 phydev->master_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED; in genphy_read_status()
2476 phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED; in genphy_read_status()
2477 phydev->speed = SPEED_UNKNOWN; in genphy_read_status()
2478 phydev->duplex = DUPLEX_UNKNOWN; in genphy_read_status()
2479 phydev->pause = 0; in genphy_read_status()
2480 phydev->asym_pause = 0; in genphy_read_status()
2482 if (phydev->is_gigabit_capable) { in genphy_read_status()
2483 err = genphy_read_master_slave(phydev); in genphy_read_status()
2488 err = genphy_read_lpa(phydev); in genphy_read_status()
2492 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_read_status()
2493 phy_resolve_aneg_linkmode(phydev); in genphy_read_status()
2494 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_read_status()
2495 err = genphy_read_status_fixed(phydev); in genphy_read_status()
2512 int genphy_c37_read_status(struct phy_device *phydev) in genphy_c37_read_status() argument
2514 int lpa, err, old_link = phydev->link; in genphy_c37_read_status()
2517 err = genphy_update_link(phydev); in genphy_c37_read_status()
2522 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) in genphy_c37_read_status()
2525 phydev->duplex = DUPLEX_UNKNOWN; in genphy_c37_read_status()
2526 phydev->pause = 0; in genphy_c37_read_status()
2527 phydev->asym_pause = 0; in genphy_c37_read_status()
2529 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_c37_read_status()
2530 lpa = phy_read(phydev, MII_LPA); in genphy_c37_read_status()
2535 phydev->lp_advertising, lpa & LPA_LPACK); in genphy_c37_read_status()
2537 phydev->lp_advertising, lpa & LPA_1000XFULL); in genphy_c37_read_status()
2539 phydev->lp_advertising, lpa & LPA_1000XPAUSE); in genphy_c37_read_status()
2541 phydev->lp_advertising, in genphy_c37_read_status()
2544 phy_resolve_aneg_linkmode(phydev); in genphy_c37_read_status()
2545 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_c37_read_status()
2546 int bmcr = phy_read(phydev, MII_BMCR); in genphy_c37_read_status()
2552 phydev->duplex = DUPLEX_FULL; in genphy_c37_read_status()
2554 phydev->duplex = DUPLEX_HALF; in genphy_c37_read_status()
2570 int genphy_soft_reset(struct phy_device *phydev) in genphy_soft_reset() argument
2575 if (phydev->autoneg == AUTONEG_ENABLE) in genphy_soft_reset()
2578 ret = phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, res); in genphy_soft_reset()
2586 phydev->suspended = 0; in genphy_soft_reset()
2588 ret = phy_poll_reset(phydev); in genphy_soft_reset()
2593 if (phydev->autoneg == AUTONEG_DISABLE) in genphy_soft_reset()
2594 ret = genphy_setup_forced(phydev); in genphy_soft_reset()
2600 irqreturn_t genphy_handle_interrupt_no_ack(struct phy_device *phydev) in genphy_handle_interrupt_no_ack() argument
2607 phy_trigger_machine(phydev); in genphy_handle_interrupt_no_ack()
2622 int genphy_read_abilities(struct phy_device *phydev) in genphy_read_abilities() argument
2628 phydev->supported); in genphy_read_abilities()
2630 val = phy_read(phydev, MII_BMSR); in genphy_read_abilities()
2634 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported, in genphy_read_abilities()
2637 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2639 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2641 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2643 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2647 val = phy_read(phydev, MII_ESTATUS); in genphy_read_abilities()
2652 phydev->supported, val & ESTATUS_1000_TFULL); in genphy_read_abilities()
2654 phydev->supported, val & ESTATUS_1000_THALF); in genphy_read_abilities()
2656 phydev->supported, val & ESTATUS_1000_XFULL); in genphy_read_abilities()
2662 genphy_c45_read_eee_abilities(phydev); in genphy_read_abilities()
2685 int genphy_suspend(struct phy_device *phydev) in genphy_suspend() argument
2687 return phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_suspend()
2691 int genphy_resume(struct phy_device *phydev) in genphy_resume() argument
2693 return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_resume()
2697 int genphy_loopback(struct phy_device *phydev, bool enable) in genphy_loopback() argument
2703 ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); in genphy_loopback()
2705 phy_modify(phydev, MII_BMCR, ~0, ctl); in genphy_loopback()
2707 ret = phy_read_poll_timeout(phydev, MII_BMSR, val, in genphy_loopback()
2713 phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, 0); in genphy_loopback()
2715 phy_config_aneg(phydev); in genphy_loopback()
2731 void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode) in phy_remove_link_mode() argument
2733 linkmode_clear_bit(link_mode, phydev->supported); in phy_remove_link_mode()
2734 phy_advertise_supported(phydev); in phy_remove_link_mode()
2753 void phy_advertise_supported(struct phy_device *phydev) in phy_advertise_supported() argument
2757 linkmode_copy(new, phydev->supported); in phy_advertise_supported()
2758 phy_copy_pause_bits(new, phydev->advertising); in phy_advertise_supported()
2759 linkmode_copy(phydev->advertising, new); in phy_advertise_supported()
2770 void phy_support_sym_pause(struct phy_device *phydev) in phy_support_sym_pause() argument
2772 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in phy_support_sym_pause()
2773 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_sym_pause()
2783 void phy_support_asym_pause(struct phy_device *phydev) in phy_support_asym_pause() argument
2785 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_asym_pause()
2800 void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, in phy_set_sym_pause() argument
2803 linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in phy_set_sym_pause()
2807 phydev->supported); in phy_set_sym_pause()
2809 linkmode_copy(phydev->advertising, phydev->supported); in phy_set_sym_pause()
2824 void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) in phy_set_asym_pause() argument
2828 linkmode_copy(oldadv, phydev->advertising); in phy_set_asym_pause()
2829 linkmode_set_pause(phydev->advertising, tx, rx); in phy_set_asym_pause()
2831 if (!linkmode_equal(oldadv, phydev->advertising) && in phy_set_asym_pause()
2832 phydev->autoneg) in phy_set_asym_pause()
2833 phy_start_aneg(phydev); in phy_set_asym_pause()
2846 bool phy_validate_pause(struct phy_device *phydev, in phy_validate_pause() argument
2850 phydev->supported) && pp->rx_pause) in phy_validate_pause()
2854 phydev->supported) && in phy_validate_pause()
2874 void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause) in phy_get_pause() argument
2876 if (phydev->duplex != DUPLEX_FULL) { in phy_get_pause()
2882 return linkmode_resolve_pause(phydev->advertising, in phy_get_pause()
2883 phydev->lp_advertising, in phy_get_pause()
2923 s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev, in phy_get_internal_delay() argument
2932 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
2933 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) in phy_get_internal_delay()
2942 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
2943 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) in phy_get_internal_delay()
2957 phydev_err(phydev, "Delay %d is out of range\n", delay); in phy_get_internal_delay()
2979 phydev_err(phydev, "error finding internal delay index for %d\n", in phy_get_internal_delay()
3085 struct phy_device *phydev = to_phy_device(dev); in phy_probe() local
3086 struct device_driver *drv = phydev->mdio.dev.driver; in phy_probe()
3090 phydev->drv = phydrv; in phy_probe()
3095 if (!phy_drv_supports_irq(phydrv) && phy_interrupt_is_valid(phydev)) in phy_probe()
3096 phydev->irq = PHY_POLL; in phy_probe()
3099 phydev->is_internal = true; in phy_probe()
3102 phy_device_reset(phydev, 0); in phy_probe()
3104 if (phydev->drv->probe) { in phy_probe()
3105 err = phydev->drv->probe(phydev); in phy_probe()
3115 linkmode_copy(phydev->supported, phydrv->features); in phy_probe()
3116 genphy_c45_read_eee_abilities(phydev); in phy_probe()
3119 err = phydrv->get_features(phydev); in phy_probe()
3120 else if (phydev->is_c45) in phy_probe()
3121 err = genphy_c45_pma_read_abilities(phydev); in phy_probe()
3123 err = genphy_read_abilities(phydev); in phy_probe()
3129 phydev->supported)) in phy_probe()
3130 phydev->autoneg = 0; in phy_probe()
3133 phydev->supported)) in phy_probe()
3134 phydev->is_gigabit_capable = 1; in phy_probe()
3136 phydev->supported)) in phy_probe()
3137 phydev->is_gigabit_capable = 1; in phy_probe()
3139 of_set_phy_supported(phydev); in phy_probe()
3140 phy_advertise_supported(phydev); in phy_probe()
3145 err = genphy_c45_read_eee_adv(phydev, phydev->advertising_eee); in phy_probe()
3152 phydev->eee_enabled = !linkmode_empty(phydev->advertising_eee); in phy_probe()
3157 if (phydev->eee_enabled) in phy_probe()
3158 linkmode_and(phydev->advertising_eee, phydev->supported_eee, in phy_probe()
3159 phydev->advertising_eee); in phy_probe()
3164 of_set_phy_eee_broken(phydev); in phy_probe()
3177 if (!test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported) && in phy_probe()
3178 !test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported)) { in phy_probe()
3180 phydev->supported); in phy_probe()
3182 phydev->supported); in phy_probe()
3186 phydev->state = PHY_READY; in phy_probe()
3191 phy_device_reset(phydev, 1); in phy_probe()
3198 struct phy_device *phydev = to_phy_device(dev); in phy_remove() local
3200 cancel_delayed_work_sync(&phydev->state_queue); in phy_remove()
3202 phydev->state = PHY_DOWN; in phy_remove()
3204 sfp_bus_del_upstream(phydev->sfp_bus); in phy_remove()
3205 phydev->sfp_bus = NULL; in phy_remove()
3207 if (phydev->drv && phydev->drv->remove) in phy_remove()
3208 phydev->drv->remove(phydev); in phy_remove()
3211 phy_device_reset(phydev, 1); in phy_remove()
3213 phydev->drv = NULL; in phy_remove()
3220 struct phy_device *phydev = to_phy_device(dev); in phy_shutdown() local
3222 if (phydev->state == PHY_READY || !phydev->attached_dev) in phy_shutdown()
3225 phy_disable_interrupts(phydev); in phy_shutdown()