Lines Matching full:phydev
201 void phy_device_free(struct phy_device *phydev) in phy_device_free() argument
203 put_device(&phydev->mdio.dev); in phy_device_free()
209 struct phy_device *phydev; in phy_mdio_device_free() local
211 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_free()
212 phy_device_free(phydev); in phy_mdio_device_free()
222 struct phy_device *phydev; in phy_mdio_device_remove() local
224 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_remove()
225 phy_device_remove(phydev); in phy_mdio_device_remove()
233 static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) in mdio_bus_phy_may_suspend() argument
235 struct device_driver *drv = phydev->mdio.dev.driver; in mdio_bus_phy_may_suspend()
237 struct net_device *netdev = phydev->attached_dev; in mdio_bus_phy_may_suspend()
269 return !phydev->suspended; in mdio_bus_phy_may_suspend()
274 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_suspend() local
277 * control, possibly with the phydev->lock held. Upon resume, netdev in mdio_bus_phy_suspend()
281 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_suspend()
282 phy_stop_machine(phydev); in mdio_bus_phy_suspend()
284 if (!mdio_bus_phy_may_suspend(phydev)) in mdio_bus_phy_suspend()
287 phydev->suspended_by_mdio_bus = 1; in mdio_bus_phy_suspend()
289 return phy_suspend(phydev); in mdio_bus_phy_suspend()
294 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_resume() local
297 if (!phydev->suspended_by_mdio_bus) in mdio_bus_phy_resume()
300 phydev->suspended_by_mdio_bus = 0; in mdio_bus_phy_resume()
302 ret = phy_init_hw(phydev); in mdio_bus_phy_resume()
306 ret = phy_resume(phydev); in mdio_bus_phy_resume()
310 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_resume()
311 phy_start_machine(phydev); in mdio_bus_phy_resume()
321 * @bus_id: A string which matches phydev->mdio.dev.bus_id (or PHY_ANY_ID)
322 * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY)
324 * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before
412 /* Returns 1 if fixup matches phydev in bus_id and phy_uid.
415 static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup) in phy_needs_fixup() argument
417 if (strcmp(fixup->bus_id, phydev_name(phydev)) != 0) in phy_needs_fixup()
422 (phydev->phy_id & fixup->phy_uid_mask)) in phy_needs_fixup()
429 /* Runs any matching fixups for this phydev */
430 static int phy_scan_fixups(struct phy_device *phydev) in phy_scan_fixups() argument
436 if (phy_needs_fixup(phydev, fixup)) { in phy_scan_fixups()
437 int err = fixup->run(phydev); in phy_scan_fixups()
443 phydev->has_fixups = true; in phy_scan_fixups()
453 struct phy_device *phydev = to_phy_device(dev); in phy_bus_match() local
455 const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); in phy_bus_match()
462 return phydrv->match_phy_device(phydev); in phy_bus_match()
464 if (phydev->is_c45) { in phy_bus_match()
466 if (phydev->c45_ids.device_ids[i] == 0xffffffff) in phy_bus_match()
470 (phydev->c45_ids.device_ids[i] & in phy_bus_match()
477 (phydev->phy_id & phydrv->phy_id_mask); in phy_bus_match()
484 struct phy_device *phydev = to_phy_device(dev); in phy_id_show() local
486 return sprintf(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id); in phy_id_show()
493 struct phy_device *phydev = to_phy_device(dev); in phy_interface_show() local
496 if (phy_is_internal(phydev)) in phy_interface_show()
499 mode = phy_modes(phydev->interface); in phy_interface_show()
509 struct phy_device *phydev = to_phy_device(dev); in phy_has_fixups_show() local
511 return sprintf(buf, "%d\n", phydev->has_fixups); in phy_has_fixups_show()
518 struct phy_device *phydev = to_phy_device(dev); in phy_registers_show() local
523 phy_read(phydev, index)); in phy_registers_show()
533 struct phy_device *phydev = to_phy_device(dev); in phy_registers_store() local
559 phy_write(phydev, index, val); in phy_registers_store()
920 * @phydev: phy_device structure to be added to the MDIO bus
922 int phy_device_register(struct phy_device *phydev) in phy_device_register() argument
926 err = mdiobus_register_device(&phydev->mdio); in phy_device_register()
931 phy_device_reset(phydev, 0); in phy_device_register()
934 err = phy_scan_fixups(phydev); in phy_device_register()
936 phydev_err(phydev, "failed to initialize\n"); in phy_device_register()
940 err = device_add(&phydev->mdio.dev); in phy_device_register()
942 phydev_err(phydev, "failed to add\n"); in phy_device_register()
950 phy_device_reset(phydev, 1); in phy_device_register()
952 mdiobus_unregister_device(&phydev->mdio); in phy_device_register()
959 * @phydev: phy_device structure to remove
965 void phy_device_remove(struct phy_device *phydev) in phy_device_remove() argument
967 if (phydev->mii_ts) in phy_device_remove()
968 unregister_mii_timestamper(phydev->mii_ts); in phy_device_remove()
970 device_del(&phydev->mdio.dev); in phy_device_remove()
973 phy_device_reset(phydev, 1); in phy_device_remove()
975 mdiobus_unregister_device(&phydev->mdio); in phy_device_remove()
985 struct phy_device *phydev; in phy_find_first() local
989 phydev = mdiobus_get_phy(bus, addr); in phy_find_first()
990 if (phydev) in phy_find_first()
991 return phydev; in phy_find_first()
997 static void phy_link_change(struct phy_device *phydev, bool up) in phy_link_change() argument
999 struct net_device *netdev = phydev->attached_dev; in phy_link_change()
1005 phydev->adjust_link(netdev); in phy_link_change()
1006 if (phydev->mii_ts && phydev->mii_ts->link_state) in phy_link_change()
1007 phydev->mii_ts->link_state(phydev->mii_ts, phydev); in phy_link_change()
1012 * @phydev: target phy_device struct
1022 static void phy_prepare_link(struct phy_device *phydev, in phy_prepare_link() argument
1025 phydev->adjust_link = handler; in phy_prepare_link()
1031 * @phydev: the pointer to the phy device
1035 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, in phy_connect_direct() argument
1044 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_connect_direct()
1048 phy_prepare_link(phydev, handler); in phy_connect_direct()
1049 if (phy_interrupt_is_valid(phydev)) in phy_connect_direct()
1050 phy_request_interrupt(phydev); in phy_connect_direct()
1075 struct phy_device *phydev; in phy_connect() local
1087 phydev = to_phy_device(d); in phy_connect()
1089 rc = phy_connect_direct(dev, phydev, handler, interface); in phy_connect()
1094 return phydev; in phy_connect()
1101 * @phydev: target phy_device struct
1103 void phy_disconnect(struct phy_device *phydev) in phy_disconnect() argument
1105 if (phy_is_started(phydev)) in phy_disconnect()
1106 phy_stop(phydev); in phy_disconnect()
1108 if (phy_interrupt_is_valid(phydev)) in phy_disconnect()
1109 phy_free_interrupt(phydev); in phy_disconnect()
1111 phydev->adjust_link = NULL; in phy_disconnect()
1113 phy_detach(phydev); in phy_disconnect()
1119 * @phydev: The PHY device to poll
1135 static int phy_poll_reset(struct phy_device *phydev) in phy_poll_reset() argument
1140 ret = phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET), in phy_poll_reset()
1151 int phy_init_hw(struct phy_device *phydev) in phy_init_hw() argument
1156 phy_device_reset(phydev, 0); in phy_init_hw()
1158 if (!phydev->drv) in phy_init_hw()
1161 if (phydev->drv->soft_reset) { in phy_init_hw()
1162 ret = phydev->drv->soft_reset(phydev); in phy_init_hw()
1165 phydev->suspended = 0; in phy_init_hw()
1171 ret = phy_scan_fixups(phydev); in phy_init_hw()
1175 if (phydev->drv->config_init) { in phy_init_hw()
1176 ret = phydev->drv->config_init(phydev); in phy_init_hw()
1181 if (phydev->drv->config_intr) { in phy_init_hw()
1182 ret = phydev->drv->config_intr(phydev); in phy_init_hw()
1191 void phy_attached_info(struct phy_device *phydev) in phy_attached_info() argument
1193 phy_attached_print(phydev, NULL); in phy_attached_info()
1198 char *phy_attached_info_irq(struct phy_device *phydev) in phy_attached_info_irq() argument
1203 switch(phydev->irq) { in phy_attached_info_irq()
1211 snprintf(irq_num, sizeof(irq_num), "%d", phydev->irq); in phy_attached_info_irq()
1220 void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) in phy_attached_print() argument
1222 const char *drv_name = phydev->drv ? phydev->drv->name : "unbound"; in phy_attached_print()
1223 char *irq_str = phy_attached_info_irq(phydev); in phy_attached_print()
1226 phydev_info(phydev, ATTACHED_FMT "\n", in phy_attached_print()
1227 drv_name, phydev_name(phydev), in phy_attached_print()
1232 phydev_info(phydev, ATTACHED_FMT, in phy_attached_print()
1233 drv_name, phydev_name(phydev), in phy_attached_print()
1244 static void phy_sysfs_create_links(struct phy_device *phydev) in phy_sysfs_create_links() argument
1246 struct net_device *dev = phydev->attached_dev; in phy_sysfs_create_links()
1252 err = sysfs_create_link(&phydev->mdio.dev.kobj, &dev->dev.kobj, in phy_sysfs_create_links()
1258 &phydev->mdio.dev.kobj, in phy_sysfs_create_links()
1259 "phydev"); in phy_sysfs_create_links()
1262 kobject_name(&phydev->mdio.dev.kobj), in phy_sysfs_create_links()
1269 phydev->sysfs_links = true; in phy_sysfs_create_links()
1276 struct phy_device *phydev = to_phy_device(dev); in phy_standalone_show() local
1278 return sprintf(buf, "%d\n", !phydev->attached_dev); in phy_standalone_show()
1291 struct phy_device *phydev = upstream; in phy_sfp_attach() local
1293 if (phydev->attached_dev) in phy_sfp_attach()
1294 phydev->attached_dev->sfp_bus = bus; in phy_sfp_attach()
1295 phydev->sfp_bus_attached = true; in phy_sfp_attach()
1308 struct phy_device *phydev = upstream; in phy_sfp_detach() local
1310 if (phydev->attached_dev) in phy_sfp_detach()
1311 phydev->attached_dev->sfp_bus = NULL; in phy_sfp_detach()
1312 phydev->sfp_bus_attached = false; in phy_sfp_detach()
1318 * @phydev: Pointer to phy_device
1321 int phy_sfp_probe(struct phy_device *phydev, in phy_sfp_probe() argument
1327 if (phydev->mdio.dev.fwnode) { in phy_sfp_probe()
1328 bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode); in phy_sfp_probe()
1332 phydev->sfp_bus = bus; in phy_sfp_probe()
1334 ret = sfp_bus_add_upstream(bus, phydev, ops); in phy_sfp_probe()
1344 * @phydev: Pointer to phy_device to attach
1356 int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, in phy_attach_direct() argument
1359 struct mii_bus *bus = phydev->mdio.bus; in phy_attach_direct()
1360 struct device *d = &phydev->mdio.dev; in phy_attach_direct()
1373 phydev_err(phydev, "failed to get the bus module\n"); in phy_attach_direct()
1383 if (phydev->is_c45) in phy_attach_direct()
1392 phydev_err(phydev, "failed to get the device driver module\n"); in phy_attach_direct()
1406 if (phydev->attached_dev) { in phy_attach_direct()
1412 phydev->phy_link_change = phy_link_change; in phy_attach_direct()
1414 phydev->attached_dev = dev; in phy_attach_direct()
1415 dev->phydev = phydev; in phy_attach_direct()
1417 if (phydev->sfp_bus_attached) in phy_attach_direct()
1418 dev->sfp_bus = phydev->sfp_bus; in phy_attach_direct()
1429 phydev->sysfs_links = false; in phy_attach_direct()
1431 phy_sysfs_create_links(phydev); in phy_attach_direct()
1433 if (!phydev->attached_dev) { in phy_attach_direct()
1434 err = sysfs_create_file(&phydev->mdio.dev.kobj, in phy_attach_direct()
1437 phydev_err(phydev, "error creating 'phy_standalone' sysfs entry\n"); in phy_attach_direct()
1440 phydev->dev_flags |= flags; in phy_attach_direct()
1442 phydev->interface = interface; in phy_attach_direct()
1444 phydev->state = PHY_READY; in phy_attach_direct()
1452 phydev->port = PORT_MII; in phy_attach_direct()
1458 netif_carrier_off(phydev->attached_dev); in phy_attach_direct()
1464 err = phy_init_hw(phydev); in phy_attach_direct()
1468 err = phy_disable_interrupts(phydev); in phy_attach_direct()
1472 phy_resume(phydev); in phy_attach_direct()
1473 phy_led_triggers_register(phydev); in phy_attach_direct()
1479 phy_detach(phydev); in phy_attach_direct()
1506 struct phy_device *phydev; in phy_attach() local
1521 phydev = to_phy_device(d); in phy_attach()
1523 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_attach()
1528 return phydev; in phy_attach()
1532 static bool phy_driver_is_genphy_kind(struct phy_device *phydev, in phy_driver_is_genphy_kind() argument
1535 struct device *d = &phydev->mdio.dev; in phy_driver_is_genphy_kind()
1538 if (!phydev->drv) in phy_driver_is_genphy_kind()
1548 bool phy_driver_is_genphy(struct phy_device *phydev) in phy_driver_is_genphy() argument
1550 return phy_driver_is_genphy_kind(phydev, in phy_driver_is_genphy()
1555 bool phy_driver_is_genphy_10g(struct phy_device *phydev) in phy_driver_is_genphy_10g() argument
1557 return phy_driver_is_genphy_kind(phydev, in phy_driver_is_genphy_10g()
1564 * @phydev: target phy_device struct
1580 * This will set the shared pointer of the phydev to the shared storage.
1588 int phy_package_join(struct phy_device *phydev, int addr, size_t priv_size) in phy_package_join() argument
1590 struct mii_bus *bus = phydev->mdio.bus; in phy_package_join()
1621 phydev->shared = shared; in phy_package_join()
1635 * @phydev: target phy_device struct
1637 * This leaves a PHY group created by phy_package_join(). If this phydev
1639 * freed. Resets the phydev->shared pointer to NULL.
1641 void phy_package_leave(struct phy_device *phydev) in phy_package_leave() argument
1643 struct phy_package_shared *shared = phydev->shared; in phy_package_leave()
1644 struct mii_bus *bus = phydev->mdio.bus; in phy_package_leave()
1656 phydev->shared = NULL; in phy_package_leave()
1668 * @phydev: target phy_device struct
1676 int devm_phy_package_join(struct device *dev, struct phy_device *phydev, in devm_phy_package_join() argument
1687 ret = phy_package_join(phydev, addr, priv_size); in devm_phy_package_join()
1690 *ptr = phydev; in devm_phy_package_join()
1702 * @phydev: target phy_device struct
1707 void phy_detach(struct phy_device *phydev) in phy_detach() argument
1709 struct net_device *dev = phydev->attached_dev; in phy_detach()
1713 if (phydev->sysfs_links) { in phy_detach()
1715 sysfs_remove_link(&dev->dev.kobj, "phydev"); in phy_detach()
1716 sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev"); in phy_detach()
1719 if (!phydev->attached_dev) in phy_detach()
1720 sysfs_remove_file(&phydev->mdio.dev.kobj, in phy_detach()
1723 phy_suspend(phydev); in phy_detach()
1725 phydev->attached_dev->phydev = NULL; in phy_detach()
1726 phydev->attached_dev = NULL; in phy_detach()
1728 phydev->phylink = NULL; in phy_detach()
1730 phy_led_triggers_unregister(phydev); in phy_detach()
1732 if (phydev->mdio.dev.driver) in phy_detach()
1733 module_put(phydev->mdio.dev.driver->owner); in phy_detach()
1740 if (phy_driver_is_genphy(phydev) || in phy_detach()
1741 phy_driver_is_genphy_10g(phydev)) in phy_detach()
1742 device_release_driver(&phydev->mdio.dev); in phy_detach()
1745 phy_device_reset(phydev, 1); in phy_detach()
1748 * The phydev might go away on the put_device() below, so avoid in phy_detach()
1751 bus = phydev->mdio.bus; in phy_detach()
1753 put_device(&phydev->mdio.dev); in phy_detach()
1761 int phy_suspend(struct phy_device *phydev) in phy_suspend() argument
1764 struct net_device *netdev = phydev->attached_dev; in phy_suspend()
1765 struct phy_driver *phydrv = phydev->drv; in phy_suspend()
1768 if (phydev->suspended) in phy_suspend()
1772 phy_ethtool_get_wol(phydev, &wol); in phy_suspend()
1779 ret = phydrv->suspend(phydev); in phy_suspend()
1781 phydev->suspended = true; in phy_suspend()
1787 int __phy_resume(struct phy_device *phydev) in __phy_resume() argument
1789 struct phy_driver *phydrv = phydev->drv; in __phy_resume()
1792 WARN_ON(!mutex_is_locked(&phydev->lock)); in __phy_resume()
1797 ret = phydrv->resume(phydev); in __phy_resume()
1799 phydev->suspended = false; in __phy_resume()
1805 int phy_resume(struct phy_device *phydev) in phy_resume() argument
1809 mutex_lock(&phydev->lock); in phy_resume()
1810 ret = __phy_resume(phydev); in phy_resume()
1811 mutex_unlock(&phydev->lock); in phy_resume()
1817 int phy_loopback(struct phy_device *phydev, bool enable) in phy_loopback() argument
1819 struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver); in phy_loopback()
1822 mutex_lock(&phydev->lock); in phy_loopback()
1824 if (enable && phydev->loopback_enabled) { in phy_loopback()
1829 if (!enable && !phydev->loopback_enabled) { in phy_loopback()
1834 if (phydev->drv && phydrv->set_loopback) in phy_loopback()
1835 ret = phydrv->set_loopback(phydev, enable); in phy_loopback()
1842 phydev->loopback_enabled = enable; in phy_loopback()
1845 mutex_unlock(&phydev->lock); in phy_loopback()
1852 * @phydev: target phy_device struct
1859 int phy_reset_after_clk_enable(struct phy_device *phydev) in phy_reset_after_clk_enable() argument
1861 if (!phydev || !phydev->drv) in phy_reset_after_clk_enable()
1864 if (phydev->drv->flags & PHY_RST_AFTER_CLK_EN) { in phy_reset_after_clk_enable()
1865 phy_device_reset(phydev, 1); in phy_reset_after_clk_enable()
1866 phy_device_reset(phydev, 0); in phy_reset_after_clk_enable()
1878 * @phydev: target phy_device struct
1885 static int genphy_config_advert(struct phy_device *phydev) in genphy_config_advert() argument
1891 linkmode_and(phydev->advertising, phydev->advertising, in genphy_config_advert()
1892 phydev->supported); in genphy_config_advert()
1894 adv = linkmode_adv_to_mii_adv_t(phydev->advertising); in genphy_config_advert()
1897 err = phy_modify_changed(phydev, MII_ADVERTISE, in genphy_config_advert()
1906 bmsr = phy_read(phydev, MII_BMSR); in genphy_config_advert()
1917 adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); in genphy_config_advert()
1919 err = phy_modify_changed(phydev, MII_CTRL1000, in genphy_config_advert()
1932 * @phydev: target phy_device struct
1940 static int genphy_c37_config_advert(struct phy_device *phydev) in genphy_c37_config_advert() argument
1945 linkmode_and(phydev->advertising, phydev->advertising, in genphy_c37_config_advert()
1946 phydev->supported); in genphy_c37_config_advert()
1949 phydev->advertising)) in genphy_c37_config_advert()
1952 phydev->advertising)) in genphy_c37_config_advert()
1955 phydev->advertising)) in genphy_c37_config_advert()
1958 return phy_modify_changed(phydev, MII_ADVERTISE, in genphy_c37_config_advert()
1966 * @phydev: target phy_device struct
1972 int genphy_config_eee_advert(struct phy_device *phydev) in genphy_config_eee_advert() argument
1977 if (!phydev->eee_broken_modes) in genphy_config_eee_advert()
1980 err = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, in genphy_config_eee_advert()
1981 phydev->eee_broken_modes, 0); in genphy_config_eee_advert()
1988 * genphy_setup_forced - configures/forces speed/duplex from @phydev
1989 * @phydev: target phy_device struct
1992 * to the values in phydev. Assumes that the values are valid.
1995 int genphy_setup_forced(struct phy_device *phydev) in genphy_setup_forced() argument
1999 phydev->pause = 0; in genphy_setup_forced()
2000 phydev->asym_pause = 0; in genphy_setup_forced()
2002 if (SPEED_1000 == phydev->speed) in genphy_setup_forced()
2004 else if (SPEED_100 == phydev->speed) in genphy_setup_forced()
2007 if (DUPLEX_FULL == phydev->duplex) in genphy_setup_forced()
2010 return phy_modify(phydev, MII_BMCR, in genphy_setup_forced()
2015 static int genphy_setup_master_slave(struct phy_device *phydev) in genphy_setup_master_slave() argument
2019 if (!phydev->is_gigabit_capable) in genphy_setup_master_slave()
2022 switch (phydev->master_slave_set) { in genphy_setup_master_slave()
2038 phydev_warn(phydev, "Unsupported Master/Slave mode\n"); in genphy_setup_master_slave()
2042 return phy_modify_changed(phydev, MII_CTRL1000, in genphy_setup_master_slave()
2047 static int genphy_read_master_slave(struct phy_device *phydev) in genphy_read_master_slave() argument
2052 if (!phydev->is_gigabit_capable) { in genphy_read_master_slave()
2053 phydev->master_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED; in genphy_read_master_slave()
2054 phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED; in genphy_read_master_slave()
2058 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN; in genphy_read_master_slave()
2059 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN; in genphy_read_master_slave()
2061 val = phy_read(phydev, MII_CTRL1000); in genphy_read_master_slave()
2077 val = phy_read(phydev, MII_STAT1000); in genphy_read_master_slave()
2083 } else if (phydev->link) { in genphy_read_master_slave()
2093 phydev->master_slave_get = cfg; in genphy_read_master_slave()
2094 phydev->master_slave_state = state; in genphy_read_master_slave()
2101 * @phydev: target phy_device struct
2103 int genphy_restart_aneg(struct phy_device *phydev) in genphy_restart_aneg() argument
2106 return phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, in genphy_restart_aneg()
2113 * @phydev: target phy_device struct
2118 int genphy_check_and_restart_aneg(struct phy_device *phydev, bool restart) in genphy_check_and_restart_aneg() argument
2126 ret = phy_read(phydev, MII_BMCR); in genphy_check_and_restart_aneg()
2135 return genphy_restart_aneg(phydev); in genphy_check_and_restart_aneg()
2143 * @phydev: target phy_device struct
2150 int __genphy_config_aneg(struct phy_device *phydev, bool changed) in __genphy_config_aneg() argument
2154 if (genphy_config_eee_advert(phydev)) in __genphy_config_aneg()
2157 err = genphy_setup_master_slave(phydev); in __genphy_config_aneg()
2163 if (AUTONEG_ENABLE != phydev->autoneg) in __genphy_config_aneg()
2164 return genphy_setup_forced(phydev); in __genphy_config_aneg()
2166 err = genphy_config_advert(phydev); in __genphy_config_aneg()
2172 return genphy_check_and_restart_aneg(phydev, changed); in __genphy_config_aneg()
2178 * @phydev: target phy_device struct
2185 int genphy_c37_config_aneg(struct phy_device *phydev) in genphy_c37_config_aneg() argument
2189 if (phydev->autoneg != AUTONEG_ENABLE) in genphy_c37_config_aneg()
2190 return genphy_setup_forced(phydev); in genphy_c37_config_aneg()
2192 err = phy_modify(phydev, MII_BMCR, BMCR_SPEED1000 | BMCR_SPEED100, in genphy_c37_config_aneg()
2197 changed = genphy_c37_config_advert(phydev); in genphy_c37_config_aneg()
2205 int ctl = phy_read(phydev, MII_BMCR); in genphy_c37_config_aneg()
2218 return genphy_restart_aneg(phydev); in genphy_c37_config_aneg()
2226 * @phydev: target phy_device struct
2232 int genphy_aneg_done(struct phy_device *phydev) in genphy_aneg_done() argument
2234 int retval = phy_read(phydev, MII_BMSR); in genphy_aneg_done()
2241 * genphy_update_link - update link status in @phydev
2242 * @phydev: target phy_device struct
2244 * Description: Update the value in phydev->link to reflect the
2248 int genphy_update_link(struct phy_device *phydev) in genphy_update_link() argument
2252 bmcr = phy_read(phydev, MII_BMCR); in genphy_update_link()
2267 if (!phy_polling_mode(phydev) || !phydev->link) { in genphy_update_link()
2268 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2276 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2280 phydev->link = status & BMSR_LSTATUS ? 1 : 0; in genphy_update_link()
2281 phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0; in genphy_update_link()
2286 if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete) in genphy_update_link()
2287 phydev->link = 0; in genphy_update_link()
2293 int genphy_read_lpa(struct phy_device *phydev) in genphy_read_lpa() argument
2297 if (phydev->autoneg == AUTONEG_ENABLE) { in genphy_read_lpa()
2298 if (!phydev->autoneg_complete) { in genphy_read_lpa()
2299 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2301 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0); in genphy_read_lpa()
2305 if (phydev->is_gigabit_capable) { in genphy_read_lpa()
2306 lpagb = phy_read(phydev, MII_STAT1000); in genphy_read_lpa()
2311 int adv = phy_read(phydev, MII_CTRL1000); in genphy_read_lpa()
2317 phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n"); in genphy_read_lpa()
2319 phydev_err(phydev, "Master/Slave resolution failed\n"); in genphy_read_lpa()
2323 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2327 lpa = phy_read(phydev, MII_LPA); in genphy_read_lpa()
2331 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); in genphy_read_lpa()
2333 linkmode_zero(phydev->lp_advertising); in genphy_read_lpa()
2342 * @phydev: target phy_device struct
2347 int genphy_read_status_fixed(struct phy_device *phydev) in genphy_read_status_fixed() argument
2349 int bmcr = phy_read(phydev, MII_BMCR); in genphy_read_status_fixed()
2355 phydev->duplex = DUPLEX_FULL; in genphy_read_status_fixed()
2357 phydev->duplex = DUPLEX_HALF; in genphy_read_status_fixed()
2360 phydev->speed = SPEED_1000; in genphy_read_status_fixed()
2362 phydev->speed = SPEED_100; in genphy_read_status_fixed()
2364 phydev->speed = SPEED_10; in genphy_read_status_fixed()
2372 * @phydev: target phy_device struct
2379 int genphy_read_status(struct phy_device *phydev) in genphy_read_status() argument
2381 int err, old_link = phydev->link; in genphy_read_status()
2384 err = genphy_update_link(phydev); in genphy_read_status()
2389 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) in genphy_read_status()
2392 phydev->speed = SPEED_UNKNOWN; in genphy_read_status()
2393 phydev->duplex = DUPLEX_UNKNOWN; in genphy_read_status()
2394 phydev->pause = 0; in genphy_read_status()
2395 phydev->asym_pause = 0; in genphy_read_status()
2397 err = genphy_read_master_slave(phydev); in genphy_read_status()
2401 err = genphy_read_lpa(phydev); in genphy_read_status()
2405 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_read_status()
2406 phy_resolve_aneg_linkmode(phydev); in genphy_read_status()
2407 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_read_status()
2408 err = genphy_read_status_fixed(phydev); in genphy_read_status()
2419 * @phydev: target phy_device struct
2425 int genphy_c37_read_status(struct phy_device *phydev) in genphy_c37_read_status() argument
2427 int lpa, err, old_link = phydev->link; in genphy_c37_read_status()
2430 err = genphy_update_link(phydev); in genphy_c37_read_status()
2435 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) in genphy_c37_read_status()
2438 phydev->duplex = DUPLEX_UNKNOWN; in genphy_c37_read_status()
2439 phydev->pause = 0; in genphy_c37_read_status()
2440 phydev->asym_pause = 0; in genphy_c37_read_status()
2442 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_c37_read_status()
2443 lpa = phy_read(phydev, MII_LPA); in genphy_c37_read_status()
2448 phydev->lp_advertising, lpa & LPA_LPACK); in genphy_c37_read_status()
2450 phydev->lp_advertising, lpa & LPA_1000XFULL); in genphy_c37_read_status()
2452 phydev->lp_advertising, lpa & LPA_1000XPAUSE); in genphy_c37_read_status()
2454 phydev->lp_advertising, in genphy_c37_read_status()
2457 phy_resolve_aneg_linkmode(phydev); in genphy_c37_read_status()
2458 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_c37_read_status()
2459 int bmcr = phy_read(phydev, MII_BMCR); in genphy_c37_read_status()
2465 phydev->duplex = DUPLEX_FULL; in genphy_c37_read_status()
2467 phydev->duplex = DUPLEX_HALF; in genphy_c37_read_status()
2476 * @phydev: target phy_device struct
2483 int genphy_soft_reset(struct phy_device *phydev) in genphy_soft_reset() argument
2488 if (phydev->autoneg == AUTONEG_ENABLE) in genphy_soft_reset()
2491 ret = phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, res); in genphy_soft_reset()
2499 phydev->suspended = 0; in genphy_soft_reset()
2501 ret = phy_poll_reset(phydev); in genphy_soft_reset()
2506 if (phydev->autoneg == AUTONEG_DISABLE) in genphy_soft_reset()
2507 ret = genphy_setup_forced(phydev); in genphy_soft_reset()
2515 * @phydev: target phy_device struct
2518 * phydev->supported accordingly.
2522 int genphy_read_abilities(struct phy_device *phydev) in genphy_read_abilities() argument
2528 phydev->supported); in genphy_read_abilities()
2530 val = phy_read(phydev, MII_BMSR); in genphy_read_abilities()
2534 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported, in genphy_read_abilities()
2537 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2539 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2541 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2543 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2547 val = phy_read(phydev, MII_ESTATUS); in genphy_read_abilities()
2552 phydev->supported, val & ESTATUS_1000_TFULL); in genphy_read_abilities()
2554 phydev->supported, val & ESTATUS_1000_THALF); in genphy_read_abilities()
2556 phydev->supported, val & ESTATUS_1000_XFULL); in genphy_read_abilities()
2580 int genphy_suspend(struct phy_device *phydev) in genphy_suspend() argument
2582 return phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_suspend()
2586 int genphy_resume(struct phy_device *phydev) in genphy_resume() argument
2588 return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_resume()
2592 int genphy_loopback(struct phy_device *phydev, bool enable) in genphy_loopback() argument
2594 return phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, in genphy_loopback()
2601 * @phydev: phy_device structure to remove link mode from
2608 void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode) in phy_remove_link_mode() argument
2610 linkmode_clear_bit(link_mode, phydev->supported); in phy_remove_link_mode()
2611 phy_advertise_supported(phydev); in phy_remove_link_mode()
2625 * @phydev: target phy_device struct
2630 void phy_advertise_supported(struct phy_device *phydev) in phy_advertise_supported() argument
2634 linkmode_copy(new, phydev->supported); in phy_advertise_supported()
2635 phy_copy_pause_bits(new, phydev->advertising); in phy_advertise_supported()
2636 linkmode_copy(phydev->advertising, new); in phy_advertise_supported()
2642 * @phydev: target phy_device struct
2647 void phy_support_sym_pause(struct phy_device *phydev) in phy_support_sym_pause() argument
2649 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in phy_support_sym_pause()
2650 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_sym_pause()
2656 * @phydev: target phy_device struct
2660 void phy_support_asym_pause(struct phy_device *phydev) in phy_support_asym_pause() argument
2662 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_asym_pause()
2668 * @phydev: target phy_device struct
2677 void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, in phy_set_sym_pause() argument
2680 linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in phy_set_sym_pause()
2684 phydev->supported); in phy_set_sym_pause()
2686 linkmode_copy(phydev->advertising, phydev->supported); in phy_set_sym_pause()
2692 * @phydev: target phy_device struct
2701 void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) in phy_set_asym_pause() argument
2705 linkmode_copy(oldadv, phydev->advertising); in phy_set_asym_pause()
2706 linkmode_set_pause(phydev->advertising, tx, rx); in phy_set_asym_pause()
2708 if (!linkmode_equal(oldadv, phydev->advertising) && in phy_set_asym_pause()
2709 phydev->autoneg) in phy_set_asym_pause()
2710 phy_start_aneg(phydev); in phy_set_asym_pause()
2716 * @phydev: phy_device struct
2723 bool phy_validate_pause(struct phy_device *phydev, in phy_validate_pause() argument
2727 phydev->supported) && pp->rx_pause) in phy_validate_pause()
2731 phydev->supported) && in phy_validate_pause()
2741 * @phydev: phy_device struct
2751 void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause) in phy_get_pause() argument
2753 if (phydev->duplex != DUPLEX_FULL) { in phy_get_pause()
2759 return linkmode_resolve_pause(phydev->advertising, in phy_get_pause()
2760 phydev->lp_advertising, in phy_get_pause()
2786 * @phydev: phy_device struct
2800 s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev, in phy_get_internal_delay() argument
2809 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
2810 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) in phy_get_internal_delay()
2819 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
2820 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) in phy_get_internal_delay()
2834 phydev_err(phydev, "Delay %d is out of range\n", delay); in phy_get_internal_delay()
2856 phydev_err(phydev, "error finding internal delay index for %d\n", in phy_get_internal_delay()
2878 struct phy_device *phydev = to_phy_device(dev); in phy_probe() local
2879 struct device_driver *drv = phydev->mdio.dev.driver; in phy_probe()
2883 phydev->drv = phydrv; in phy_probe()
2888 if (!phy_drv_supports_irq(phydrv) && phy_interrupt_is_valid(phydev)) in phy_probe()
2889 phydev->irq = PHY_POLL; in phy_probe()
2892 phydev->is_internal = true; in phy_probe()
2894 mutex_lock(&phydev->lock); in phy_probe()
2897 phy_device_reset(phydev, 0); in phy_probe()
2899 if (phydev->drv->probe) { in phy_probe()
2900 err = phydev->drv->probe(phydev); in phy_probe()
2910 linkmode_copy(phydev->supported, phydrv->features); in phy_probe()
2912 err = phydrv->get_features(phydev); in phy_probe()
2913 } else if (phydev->is_c45) { in phy_probe()
2914 err = genphy_c45_pma_read_abilities(phydev); in phy_probe()
2916 err = genphy_read_abilities(phydev); in phy_probe()
2923 phydev->supported)) in phy_probe()
2924 phydev->autoneg = 0; in phy_probe()
2927 phydev->supported)) in phy_probe()
2928 phydev->is_gigabit_capable = 1; in phy_probe()
2930 phydev->supported)) in phy_probe()
2931 phydev->is_gigabit_capable = 1; in phy_probe()
2933 of_set_phy_supported(phydev); in phy_probe()
2934 phy_advertise_supported(phydev); in phy_probe()
2939 of_set_phy_eee_broken(phydev); in phy_probe()
2952 if (!test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported) && in phy_probe()
2953 !test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported)) { in phy_probe()
2955 phydev->supported); in phy_probe()
2957 phydev->supported); in phy_probe()
2961 phydev->state = PHY_READY; in phy_probe()
2966 phy_device_reset(phydev, 1); in phy_probe()
2968 mutex_unlock(&phydev->lock); in phy_probe()
2975 struct phy_device *phydev = to_phy_device(dev); in phy_remove() local
2977 cancel_delayed_work_sync(&phydev->state_queue); in phy_remove()
2979 mutex_lock(&phydev->lock); in phy_remove()
2980 phydev->state = PHY_DOWN; in phy_remove()
2981 mutex_unlock(&phydev->lock); in phy_remove()
2983 sfp_bus_del_upstream(phydev->sfp_bus); in phy_remove()
2984 phydev->sfp_bus = NULL; in phy_remove()
2986 if (phydev->drv && phydev->drv->remove) in phy_remove()
2987 phydev->drv->remove(phydev); in phy_remove()
2990 phy_device_reset(phydev, 1); in phy_remove()
2992 phydev->drv = NULL; in phy_remove()