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()
234 static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) in mdio_bus_phy_may_suspend() argument
236 struct device_driver *drv = phydev->mdio.dev.driver; in mdio_bus_phy_may_suspend()
238 struct net_device *netdev = phydev->attached_dev; in mdio_bus_phy_may_suspend()
270 return !phydev->suspended; in mdio_bus_phy_may_suspend()
275 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_suspend() local
278 * control, possibly with the phydev->lock held. Upon resume, netdev in mdio_bus_phy_suspend()
282 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_suspend()
283 phy_stop_machine(phydev); in mdio_bus_phy_suspend()
285 if (!mdio_bus_phy_may_suspend(phydev)) in mdio_bus_phy_suspend()
288 phydev->suspended_by_mdio_bus = 1; in mdio_bus_phy_suspend()
290 return phy_suspend(phydev); in mdio_bus_phy_suspend()
295 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_resume() local
298 if (!phydev->suspended_by_mdio_bus) in mdio_bus_phy_resume()
301 phydev->suspended_by_mdio_bus = 0; in mdio_bus_phy_resume()
303 ret = phy_resume(phydev); in mdio_bus_phy_resume()
308 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_resume()
309 phy_start_machine(phydev); in mdio_bus_phy_resume()
316 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_restore() local
317 struct net_device *netdev = phydev->attached_dev; in mdio_bus_phy_restore()
323 ret = phy_init_hw(phydev); in mdio_bus_phy_restore()
327 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_restore()
328 phy_start_machine(phydev); in mdio_bus_phy_restore()
351 * @bus_id: A string which matches phydev->mdio.dev.bus_id (or PHY_ANY_ID)
352 * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY)
354 * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before
442 /* Returns 1 if fixup matches phydev in bus_id and phy_uid.
445 static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup) in phy_needs_fixup() argument
447 if (strcmp(fixup->bus_id, phydev_name(phydev)) != 0) in phy_needs_fixup()
452 (phydev->phy_id & fixup->phy_uid_mask)) in phy_needs_fixup()
459 /* Runs any matching fixups for this phydev */
460 static int phy_scan_fixups(struct phy_device *phydev) in phy_scan_fixups() argument
466 if (phy_needs_fixup(phydev, fixup)) { in phy_scan_fixups()
467 int err = fixup->run(phydev); in phy_scan_fixups()
473 phydev->has_fixups = true; in phy_scan_fixups()
483 struct phy_device *phydev = to_phy_device(dev); in phy_bus_match() local
485 const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); in phy_bus_match()
492 return phydrv->match_phy_device(phydev); in phy_bus_match()
494 if (phydev->is_c45) { in phy_bus_match()
496 if (phydev->c45_ids.device_ids[i] == 0xffffffff) in phy_bus_match()
500 (phydev->c45_ids.device_ids[i] & in phy_bus_match()
507 (phydev->phy_id & phydrv->phy_id_mask); in phy_bus_match()
514 struct phy_device *phydev = to_phy_device(dev); in phy_id_show() local
516 return sprintf(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id); in phy_id_show()
523 struct phy_device *phydev = to_phy_device(dev); in phy_interface_show() local
526 if (phy_is_internal(phydev)) in phy_interface_show()
529 mode = phy_modes(phydev->interface); in phy_interface_show()
539 struct phy_device *phydev = to_phy_device(dev); in phy_has_fixups_show() local
541 return sprintf(buf, "%d\n", phydev->has_fixups); in phy_has_fixups_show()
891 * @phydev: phy_device structure to be added to the MDIO bus
893 int phy_device_register(struct phy_device *phydev) in phy_device_register() argument
897 err = mdiobus_register_device(&phydev->mdio); in phy_device_register()
902 phy_device_reset(phydev, 0); in phy_device_register()
905 err = phy_scan_fixups(phydev); in phy_device_register()
907 phydev_err(phydev, "failed to initialize\n"); in phy_device_register()
911 err = device_add(&phydev->mdio.dev); in phy_device_register()
913 phydev_err(phydev, "failed to add\n"); in phy_device_register()
921 phy_device_reset(phydev, 1); in phy_device_register()
923 mdiobus_unregister_device(&phydev->mdio); in phy_device_register()
930 * @phydev: phy_device structure to remove
936 void phy_device_remove(struct phy_device *phydev) in phy_device_remove() argument
938 if (phydev->mii_ts) in phy_device_remove()
939 unregister_mii_timestamper(phydev->mii_ts); in phy_device_remove()
941 device_del(&phydev->mdio.dev); in phy_device_remove()
944 phy_device_reset(phydev, 1); in phy_device_remove()
946 mdiobus_unregister_device(&phydev->mdio); in phy_device_remove()
956 struct phy_device *phydev; in phy_find_first() local
960 phydev = mdiobus_get_phy(bus, addr); in phy_find_first()
961 if (phydev) in phy_find_first()
962 return phydev; in phy_find_first()
968 static void phy_link_change(struct phy_device *phydev, bool up) in phy_link_change() argument
970 struct net_device *netdev = phydev->attached_dev; in phy_link_change()
976 phydev->adjust_link(netdev); in phy_link_change()
977 if (phydev->mii_ts && phydev->mii_ts->link_state) in phy_link_change()
978 phydev->mii_ts->link_state(phydev->mii_ts, phydev); in phy_link_change()
983 * @phydev: target phy_device struct
993 static void phy_prepare_link(struct phy_device *phydev, in phy_prepare_link() argument
996 phydev->adjust_link = handler; in phy_prepare_link()
1002 * @phydev: the pointer to the phy device
1006 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, in phy_connect_direct() argument
1015 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_connect_direct()
1019 phy_prepare_link(phydev, handler); in phy_connect_direct()
1020 if (phy_interrupt_is_valid(phydev)) in phy_connect_direct()
1021 phy_request_interrupt(phydev); in phy_connect_direct()
1046 struct phy_device *phydev; in phy_connect() local
1058 phydev = to_phy_device(d); in phy_connect()
1060 rc = phy_connect_direct(dev, phydev, handler, interface); in phy_connect()
1065 return phydev; in phy_connect()
1072 * @phydev: target phy_device struct
1074 void phy_disconnect(struct phy_device *phydev) in phy_disconnect() argument
1076 if (phy_is_started(phydev)) in phy_disconnect()
1077 phy_stop(phydev); in phy_disconnect()
1079 if (phy_interrupt_is_valid(phydev)) in phy_disconnect()
1080 phy_free_interrupt(phydev); in phy_disconnect()
1082 phydev->adjust_link = NULL; in phy_disconnect()
1084 phy_detach(phydev); in phy_disconnect()
1090 * @phydev: The PHY device to poll
1106 static int phy_poll_reset(struct phy_device *phydev) in phy_poll_reset() argument
1111 ret = phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET), in phy_poll_reset()
1122 int phy_init_hw(struct phy_device *phydev) in phy_init_hw() argument
1127 phy_device_reset(phydev, 0); in phy_init_hw()
1129 if (!phydev->drv) in phy_init_hw()
1132 if (phydev->drv->soft_reset) { in phy_init_hw()
1133 ret = phydev->drv->soft_reset(phydev); in phy_init_hw()
1136 phydev->suspended = 0; in phy_init_hw()
1142 ret = phy_scan_fixups(phydev); in phy_init_hw()
1146 if (phydev->drv->config_init) in phy_init_hw()
1147 ret = phydev->drv->config_init(phydev); in phy_init_hw()
1153 void phy_attached_info(struct phy_device *phydev) in phy_attached_info() argument
1155 phy_attached_print(phydev, NULL); in phy_attached_info()
1160 char *phy_attached_info_irq(struct phy_device *phydev) in phy_attached_info_irq() argument
1165 switch(phydev->irq) { in phy_attached_info_irq()
1173 snprintf(irq_num, sizeof(irq_num), "%d", phydev->irq); in phy_attached_info_irq()
1182 void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) in phy_attached_print() argument
1184 const char *drv_name = phydev->drv ? phydev->drv->name : "unbound"; in phy_attached_print()
1185 char *irq_str = phy_attached_info_irq(phydev); in phy_attached_print()
1188 phydev_info(phydev, ATTACHED_FMT "\n", in phy_attached_print()
1189 drv_name, phydev_name(phydev), in phy_attached_print()
1194 phydev_info(phydev, ATTACHED_FMT, in phy_attached_print()
1195 drv_name, phydev_name(phydev), in phy_attached_print()
1206 static void phy_sysfs_create_links(struct phy_device *phydev) in phy_sysfs_create_links() argument
1208 struct net_device *dev = phydev->attached_dev; in phy_sysfs_create_links()
1214 err = sysfs_create_link(&phydev->mdio.dev.kobj, &dev->dev.kobj, in phy_sysfs_create_links()
1220 &phydev->mdio.dev.kobj, in phy_sysfs_create_links()
1221 "phydev"); in phy_sysfs_create_links()
1224 kobject_name(&phydev->mdio.dev.kobj), in phy_sysfs_create_links()
1231 phydev->sysfs_links = true; in phy_sysfs_create_links()
1238 struct phy_device *phydev = to_phy_device(dev); in phy_standalone_show() local
1240 return sprintf(buf, "%d\n", !phydev->attached_dev); in phy_standalone_show()
1253 struct phy_device *phydev = upstream; in phy_sfp_attach() local
1255 if (phydev->attached_dev) in phy_sfp_attach()
1256 phydev->attached_dev->sfp_bus = bus; in phy_sfp_attach()
1257 phydev->sfp_bus_attached = true; in phy_sfp_attach()
1270 struct phy_device *phydev = upstream; in phy_sfp_detach() local
1272 if (phydev->attached_dev) in phy_sfp_detach()
1273 phydev->attached_dev->sfp_bus = NULL; in phy_sfp_detach()
1274 phydev->sfp_bus_attached = false; in phy_sfp_detach()
1280 * @phydev: Pointer to phy_device
1283 int phy_sfp_probe(struct phy_device *phydev, in phy_sfp_probe() argument
1289 if (phydev->mdio.dev.fwnode) { in phy_sfp_probe()
1290 bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode); in phy_sfp_probe()
1294 phydev->sfp_bus = bus; in phy_sfp_probe()
1296 ret = sfp_bus_add_upstream(bus, phydev, ops); in phy_sfp_probe()
1306 * @phydev: Pointer to phy_device to attach
1318 int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, in phy_attach_direct() argument
1321 struct mii_bus *bus = phydev->mdio.bus; in phy_attach_direct()
1322 struct device *d = &phydev->mdio.dev; in phy_attach_direct()
1335 phydev_err(phydev, "failed to get the bus module\n"); in phy_attach_direct()
1345 if (phydev->is_c45) in phy_attach_direct()
1354 phydev_err(phydev, "failed to get the device driver module\n"); in phy_attach_direct()
1368 if (phydev->attached_dev) { in phy_attach_direct()
1374 phydev->phy_link_change = phy_link_change; in phy_attach_direct()
1376 phydev->attached_dev = dev; in phy_attach_direct()
1377 dev->phydev = phydev; in phy_attach_direct()
1379 if (phydev->sfp_bus_attached) in phy_attach_direct()
1380 dev->sfp_bus = phydev->sfp_bus; in phy_attach_direct()
1391 phydev->sysfs_links = false; in phy_attach_direct()
1393 phy_sysfs_create_links(phydev); in phy_attach_direct()
1395 if (!phydev->attached_dev) { in phy_attach_direct()
1396 err = sysfs_create_file(&phydev->mdio.dev.kobj, in phy_attach_direct()
1399 phydev_err(phydev, "error creating 'phy_standalone' sysfs entry\n"); in phy_attach_direct()
1402 phydev->dev_flags |= flags; in phy_attach_direct()
1404 phydev->interface = interface; in phy_attach_direct()
1406 phydev->state = PHY_READY; in phy_attach_direct()
1412 netif_carrier_off(phydev->attached_dev); in phy_attach_direct()
1418 err = phy_init_hw(phydev); in phy_attach_direct()
1422 err = phy_disable_interrupts(phydev); in phy_attach_direct()
1426 phy_resume(phydev); in phy_attach_direct()
1427 phy_led_triggers_register(phydev); in phy_attach_direct()
1433 phy_detach(phydev); in phy_attach_direct()
1459 struct phy_device *phydev; in phy_attach() local
1474 phydev = to_phy_device(d); in phy_attach()
1476 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_attach()
1481 return phydev; in phy_attach()
1485 static bool phy_driver_is_genphy_kind(struct phy_device *phydev, in phy_driver_is_genphy_kind() argument
1488 struct device *d = &phydev->mdio.dev; in phy_driver_is_genphy_kind()
1491 if (!phydev->drv) in phy_driver_is_genphy_kind()
1501 bool phy_driver_is_genphy(struct phy_device *phydev) in phy_driver_is_genphy() argument
1503 return phy_driver_is_genphy_kind(phydev, in phy_driver_is_genphy()
1508 bool phy_driver_is_genphy_10g(struct phy_device *phydev) in phy_driver_is_genphy_10g() argument
1510 return phy_driver_is_genphy_kind(phydev, in phy_driver_is_genphy_10g()
1517 * @phydev: target phy_device struct
1533 * This will set the shared pointer of the phydev to the shared storage.
1541 int phy_package_join(struct phy_device *phydev, int addr, size_t priv_size) in phy_package_join() argument
1543 struct mii_bus *bus = phydev->mdio.bus; in phy_package_join()
1574 phydev->shared = shared; in phy_package_join()
1588 * @phydev: target phy_device struct
1590 * This leaves a PHY group created by phy_package_join(). If this phydev
1592 * freed. Resets the phydev->shared pointer to NULL.
1594 void phy_package_leave(struct phy_device *phydev) in phy_package_leave() argument
1596 struct phy_package_shared *shared = phydev->shared; in phy_package_leave()
1597 struct mii_bus *bus = phydev->mdio.bus; in phy_package_leave()
1609 phydev->shared = NULL; in phy_package_leave()
1621 * @phydev: target phy_device struct
1629 int devm_phy_package_join(struct device *dev, struct phy_device *phydev, in devm_phy_package_join() argument
1640 ret = phy_package_join(phydev, addr, priv_size); in devm_phy_package_join()
1643 *ptr = phydev; in devm_phy_package_join()
1655 * @phydev: target phy_device struct
1660 void phy_detach(struct phy_device *phydev) in phy_detach() argument
1662 struct net_device *dev = phydev->attached_dev; in phy_detach()
1666 if (phydev->sysfs_links) { in phy_detach()
1668 sysfs_remove_link(&dev->dev.kobj, "phydev"); in phy_detach()
1669 sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev"); in phy_detach()
1672 if (!phydev->attached_dev) in phy_detach()
1673 sysfs_remove_file(&phydev->mdio.dev.kobj, in phy_detach()
1676 phy_suspend(phydev); in phy_detach()
1678 phydev->attached_dev->phydev = NULL; in phy_detach()
1679 phydev->attached_dev = NULL; in phy_detach()
1681 phydev->phylink = NULL; in phy_detach()
1683 phy_led_triggers_unregister(phydev); in phy_detach()
1685 if (phydev->mdio.dev.driver) in phy_detach()
1686 module_put(phydev->mdio.dev.driver->owner); in phy_detach()
1693 if (phy_driver_is_genphy(phydev) || in phy_detach()
1694 phy_driver_is_genphy_10g(phydev)) in phy_detach()
1695 device_release_driver(&phydev->mdio.dev); in phy_detach()
1698 * The phydev might go away on the put_device() below, so avoid in phy_detach()
1701 bus = phydev->mdio.bus; in phy_detach()
1703 put_device(&phydev->mdio.dev); in phy_detach()
1710 phy_device_reset(phydev, 1); in phy_detach()
1714 int phy_suspend(struct phy_device *phydev) in phy_suspend() argument
1717 struct net_device *netdev = phydev->attached_dev; in phy_suspend()
1718 struct phy_driver *phydrv = phydev->drv; in phy_suspend()
1721 if (phydev->suspended) in phy_suspend()
1725 phy_ethtool_get_wol(phydev, &wol); in phy_suspend()
1732 ret = phydrv->suspend(phydev); in phy_suspend()
1734 phydev->suspended = true; in phy_suspend()
1740 int __phy_resume(struct phy_device *phydev) in __phy_resume() argument
1742 struct phy_driver *phydrv = phydev->drv; in __phy_resume()
1745 WARN_ON(!mutex_is_locked(&phydev->lock)); in __phy_resume()
1750 ret = phydrv->resume(phydev); in __phy_resume()
1752 phydev->suspended = false; in __phy_resume()
1758 int phy_resume(struct phy_device *phydev) in phy_resume() argument
1762 mutex_lock(&phydev->lock); in phy_resume()
1763 ret = __phy_resume(phydev); in phy_resume()
1764 mutex_unlock(&phydev->lock); in phy_resume()
1770 int phy_loopback(struct phy_device *phydev, bool enable) in phy_loopback() argument
1772 struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver); in phy_loopback()
1775 mutex_lock(&phydev->lock); in phy_loopback()
1777 if (enable && phydev->loopback_enabled) { in phy_loopback()
1782 if (!enable && !phydev->loopback_enabled) { in phy_loopback()
1787 if (phydev->drv && phydrv->set_loopback) in phy_loopback()
1788 ret = phydrv->set_loopback(phydev, enable); in phy_loopback()
1795 phydev->loopback_enabled = enable; in phy_loopback()
1798 mutex_unlock(&phydev->lock); in phy_loopback()
1805 * @phydev: target phy_device struct
1812 int phy_reset_after_clk_enable(struct phy_device *phydev) in phy_reset_after_clk_enable() argument
1814 if (!phydev || !phydev->drv) in phy_reset_after_clk_enable()
1817 if (phydev->drv->flags & PHY_RST_AFTER_CLK_EN) { in phy_reset_after_clk_enable()
1818 phy_device_reset(phydev, 1); in phy_reset_after_clk_enable()
1819 phy_device_reset(phydev, 0); in phy_reset_after_clk_enable()
1831 * @phydev: target phy_device struct
1838 static int genphy_config_advert(struct phy_device *phydev) in genphy_config_advert() argument
1844 linkmode_and(phydev->advertising, phydev->advertising, in genphy_config_advert()
1845 phydev->supported); in genphy_config_advert()
1847 adv = linkmode_adv_to_mii_adv_t(phydev->advertising); in genphy_config_advert()
1850 err = phy_modify_changed(phydev, MII_ADVERTISE, in genphy_config_advert()
1859 bmsr = phy_read(phydev, MII_BMSR); in genphy_config_advert()
1870 adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); in genphy_config_advert()
1872 err = phy_modify_changed(phydev, MII_CTRL1000, in genphy_config_advert()
1885 * @phydev: target phy_device struct
1893 static int genphy_c37_config_advert(struct phy_device *phydev) in genphy_c37_config_advert() argument
1898 linkmode_and(phydev->advertising, phydev->advertising, in genphy_c37_config_advert()
1899 phydev->supported); in genphy_c37_config_advert()
1902 phydev->advertising)) in genphy_c37_config_advert()
1905 phydev->advertising)) in genphy_c37_config_advert()
1908 phydev->advertising)) in genphy_c37_config_advert()
1911 return phy_modify_changed(phydev, MII_ADVERTISE, in genphy_c37_config_advert()
1919 * @phydev: target phy_device struct
1925 int genphy_config_eee_advert(struct phy_device *phydev) in genphy_config_eee_advert() argument
1930 if (!phydev->eee_broken_modes) in genphy_config_eee_advert()
1933 err = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, in genphy_config_eee_advert()
1934 phydev->eee_broken_modes, 0); in genphy_config_eee_advert()
1941 * genphy_setup_forced - configures/forces speed/duplex from @phydev
1942 * @phydev: target phy_device struct
1945 * to the values in phydev. Assumes that the values are valid.
1948 int genphy_setup_forced(struct phy_device *phydev) in genphy_setup_forced() argument
1952 phydev->pause = 0; in genphy_setup_forced()
1953 phydev->asym_pause = 0; in genphy_setup_forced()
1955 if (SPEED_1000 == phydev->speed) in genphy_setup_forced()
1957 else if (SPEED_100 == phydev->speed) in genphy_setup_forced()
1960 if (DUPLEX_FULL == phydev->duplex) in genphy_setup_forced()
1963 return phy_modify(phydev, MII_BMCR, in genphy_setup_forced()
1968 static int genphy_setup_master_slave(struct phy_device *phydev) in genphy_setup_master_slave() argument
1972 if (!phydev->is_gigabit_capable) in genphy_setup_master_slave()
1975 switch (phydev->master_slave_set) { in genphy_setup_master_slave()
1991 phydev_warn(phydev, "Unsupported Master/Slave mode\n"); in genphy_setup_master_slave()
1995 return phy_modify_changed(phydev, MII_CTRL1000, in genphy_setup_master_slave()
2000 static int genphy_read_master_slave(struct phy_device *phydev) in genphy_read_master_slave() argument
2005 if (!phydev->is_gigabit_capable) { in genphy_read_master_slave()
2006 phydev->master_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED; in genphy_read_master_slave()
2007 phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED; in genphy_read_master_slave()
2011 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN; in genphy_read_master_slave()
2012 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN; in genphy_read_master_slave()
2014 val = phy_read(phydev, MII_CTRL1000); in genphy_read_master_slave()
2030 val = phy_read(phydev, MII_STAT1000); in genphy_read_master_slave()
2036 } else if (phydev->link) { in genphy_read_master_slave()
2046 phydev->master_slave_get = cfg; in genphy_read_master_slave()
2047 phydev->master_slave_state = state; in genphy_read_master_slave()
2054 * @phydev: target phy_device struct
2056 int genphy_restart_aneg(struct phy_device *phydev) in genphy_restart_aneg() argument
2059 return phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, in genphy_restart_aneg()
2066 * @phydev: target phy_device struct
2071 int genphy_check_and_restart_aneg(struct phy_device *phydev, bool restart) in genphy_check_and_restart_aneg() argument
2079 ret = phy_read(phydev, MII_BMCR); in genphy_check_and_restart_aneg()
2088 return genphy_restart_aneg(phydev); in genphy_check_and_restart_aneg()
2096 * @phydev: target phy_device struct
2103 int __genphy_config_aneg(struct phy_device *phydev, bool changed) in __genphy_config_aneg() argument
2107 if (genphy_config_eee_advert(phydev)) in __genphy_config_aneg()
2110 err = genphy_setup_master_slave(phydev); in __genphy_config_aneg()
2116 if (AUTONEG_ENABLE != phydev->autoneg) in __genphy_config_aneg()
2117 return genphy_setup_forced(phydev); in __genphy_config_aneg()
2119 err = genphy_config_advert(phydev); in __genphy_config_aneg()
2125 return genphy_check_and_restart_aneg(phydev, changed); in __genphy_config_aneg()
2131 * @phydev: target phy_device struct
2138 int genphy_c37_config_aneg(struct phy_device *phydev) in genphy_c37_config_aneg() argument
2142 if (phydev->autoneg != AUTONEG_ENABLE) in genphy_c37_config_aneg()
2143 return genphy_setup_forced(phydev); in genphy_c37_config_aneg()
2145 err = phy_modify(phydev, MII_BMCR, BMCR_SPEED1000 | BMCR_SPEED100, in genphy_c37_config_aneg()
2150 changed = genphy_c37_config_advert(phydev); in genphy_c37_config_aneg()
2158 int ctl = phy_read(phydev, MII_BMCR); in genphy_c37_config_aneg()
2171 return genphy_restart_aneg(phydev); in genphy_c37_config_aneg()
2179 * @phydev: target phy_device struct
2185 int genphy_aneg_done(struct phy_device *phydev) in genphy_aneg_done() argument
2187 int retval = phy_read(phydev, MII_BMSR); in genphy_aneg_done()
2194 * genphy_update_link - update link status in @phydev
2195 * @phydev: target phy_device struct
2197 * Description: Update the value in phydev->link to reflect the
2201 int genphy_update_link(struct phy_device *phydev) in genphy_update_link() argument
2205 bmcr = phy_read(phydev, MII_BMCR); in genphy_update_link()
2220 if (!phy_polling_mode(phydev) || !phydev->link) { in genphy_update_link()
2221 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2229 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2233 phydev->link = status & BMSR_LSTATUS ? 1 : 0; in genphy_update_link()
2234 phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0; in genphy_update_link()
2239 if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete) in genphy_update_link()
2240 phydev->link = 0; in genphy_update_link()
2246 int genphy_read_lpa(struct phy_device *phydev) in genphy_read_lpa() argument
2250 if (phydev->autoneg == AUTONEG_ENABLE) { in genphy_read_lpa()
2251 if (!phydev->autoneg_complete) { in genphy_read_lpa()
2252 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2254 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0); in genphy_read_lpa()
2258 if (phydev->is_gigabit_capable) { in genphy_read_lpa()
2259 lpagb = phy_read(phydev, MII_STAT1000); in genphy_read_lpa()
2264 int adv = phy_read(phydev, MII_CTRL1000); in genphy_read_lpa()
2270 phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n"); in genphy_read_lpa()
2272 phydev_err(phydev, "Master/Slave resolution failed\n"); in genphy_read_lpa()
2276 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2280 lpa = phy_read(phydev, MII_LPA); in genphy_read_lpa()
2284 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); in genphy_read_lpa()
2286 linkmode_zero(phydev->lp_advertising); in genphy_read_lpa()
2295 * @phydev: target phy_device struct
2300 int genphy_read_status_fixed(struct phy_device *phydev) in genphy_read_status_fixed() argument
2302 int bmcr = phy_read(phydev, MII_BMCR); in genphy_read_status_fixed()
2308 phydev->duplex = DUPLEX_FULL; in genphy_read_status_fixed()
2310 phydev->duplex = DUPLEX_HALF; in genphy_read_status_fixed()
2313 phydev->speed = SPEED_1000; in genphy_read_status_fixed()
2315 phydev->speed = SPEED_100; in genphy_read_status_fixed()
2317 phydev->speed = SPEED_10; in genphy_read_status_fixed()
2325 * @phydev: target phy_device struct
2332 int genphy_read_status(struct phy_device *phydev) in genphy_read_status() argument
2334 int err, old_link = phydev->link; in genphy_read_status()
2337 err = genphy_update_link(phydev); in genphy_read_status()
2342 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) in genphy_read_status()
2345 phydev->speed = SPEED_UNKNOWN; in genphy_read_status()
2346 phydev->duplex = DUPLEX_UNKNOWN; in genphy_read_status()
2347 phydev->pause = 0; in genphy_read_status()
2348 phydev->asym_pause = 0; in genphy_read_status()
2350 err = genphy_read_master_slave(phydev); in genphy_read_status()
2354 err = genphy_read_lpa(phydev); in genphy_read_status()
2358 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_read_status()
2359 phy_resolve_aneg_linkmode(phydev); in genphy_read_status()
2360 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_read_status()
2361 err = genphy_read_status_fixed(phydev); in genphy_read_status()
2372 * @phydev: target phy_device struct
2378 int genphy_c37_read_status(struct phy_device *phydev) in genphy_c37_read_status() argument
2380 int lpa, err, old_link = phydev->link; in genphy_c37_read_status()
2383 err = genphy_update_link(phydev); in genphy_c37_read_status()
2388 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) in genphy_c37_read_status()
2391 phydev->duplex = DUPLEX_UNKNOWN; in genphy_c37_read_status()
2392 phydev->pause = 0; in genphy_c37_read_status()
2393 phydev->asym_pause = 0; in genphy_c37_read_status()
2395 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_c37_read_status()
2396 lpa = phy_read(phydev, MII_LPA); in genphy_c37_read_status()
2401 phydev->lp_advertising, lpa & LPA_LPACK); in genphy_c37_read_status()
2403 phydev->lp_advertising, lpa & LPA_1000XFULL); in genphy_c37_read_status()
2405 phydev->lp_advertising, lpa & LPA_1000XPAUSE); in genphy_c37_read_status()
2407 phydev->lp_advertising, in genphy_c37_read_status()
2410 phy_resolve_aneg_linkmode(phydev); in genphy_c37_read_status()
2411 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_c37_read_status()
2412 int bmcr = phy_read(phydev, MII_BMCR); in genphy_c37_read_status()
2418 phydev->duplex = DUPLEX_FULL; in genphy_c37_read_status()
2420 phydev->duplex = DUPLEX_HALF; in genphy_c37_read_status()
2429 * @phydev: target phy_device struct
2436 int genphy_soft_reset(struct phy_device *phydev) in genphy_soft_reset() argument
2441 if (phydev->autoneg == AUTONEG_ENABLE) in genphy_soft_reset()
2444 ret = phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, res); in genphy_soft_reset()
2452 phydev->suspended = 0; in genphy_soft_reset()
2454 ret = phy_poll_reset(phydev); in genphy_soft_reset()
2459 if (phydev->autoneg == AUTONEG_DISABLE) in genphy_soft_reset()
2460 ret = genphy_setup_forced(phydev); in genphy_soft_reset()
2468 * @phydev: target phy_device struct
2471 * phydev->supported accordingly.
2475 int genphy_read_abilities(struct phy_device *phydev) in genphy_read_abilities() argument
2481 phydev->supported); in genphy_read_abilities()
2483 val = phy_read(phydev, MII_BMSR); in genphy_read_abilities()
2487 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported, in genphy_read_abilities()
2490 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2492 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2494 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2496 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2500 val = phy_read(phydev, MII_ESTATUS); in genphy_read_abilities()
2505 phydev->supported, val & ESTATUS_1000_TFULL); in genphy_read_abilities()
2507 phydev->supported, val & ESTATUS_1000_THALF); in genphy_read_abilities()
2509 phydev->supported, val & ESTATUS_1000_XFULL); in genphy_read_abilities()
2533 int genphy_suspend(struct phy_device *phydev) in genphy_suspend() argument
2535 return phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_suspend()
2539 int genphy_resume(struct phy_device *phydev) in genphy_resume() argument
2541 return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_resume()
2545 int genphy_loopback(struct phy_device *phydev, bool enable) in genphy_loopback() argument
2547 return phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, in genphy_loopback()
2554 * @phydev: phy_device structure to remove link mode from
2561 void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode) in phy_remove_link_mode() argument
2563 linkmode_clear_bit(link_mode, phydev->supported); in phy_remove_link_mode()
2564 phy_advertise_supported(phydev); in phy_remove_link_mode()
2578 * @phydev: target phy_device struct
2583 void phy_advertise_supported(struct phy_device *phydev) in phy_advertise_supported() argument
2587 linkmode_copy(new, phydev->supported); in phy_advertise_supported()
2588 phy_copy_pause_bits(new, phydev->advertising); in phy_advertise_supported()
2589 linkmode_copy(phydev->advertising, new); in phy_advertise_supported()
2595 * @phydev: target phy_device struct
2600 void phy_support_sym_pause(struct phy_device *phydev) in phy_support_sym_pause() argument
2602 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in phy_support_sym_pause()
2603 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_sym_pause()
2609 * @phydev: target phy_device struct
2613 void phy_support_asym_pause(struct phy_device *phydev) in phy_support_asym_pause() argument
2615 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_asym_pause()
2621 * @phydev: target phy_device struct
2630 void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, in phy_set_sym_pause() argument
2633 linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in phy_set_sym_pause()
2637 phydev->supported); in phy_set_sym_pause()
2639 linkmode_copy(phydev->advertising, phydev->supported); in phy_set_sym_pause()
2645 * @phydev: target phy_device struct
2654 void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) in phy_set_asym_pause() argument
2658 linkmode_copy(oldadv, phydev->advertising); in phy_set_asym_pause()
2659 linkmode_set_pause(phydev->advertising, tx, rx); in phy_set_asym_pause()
2661 if (!linkmode_equal(oldadv, phydev->advertising) && in phy_set_asym_pause()
2662 phydev->autoneg) in phy_set_asym_pause()
2663 phy_start_aneg(phydev); in phy_set_asym_pause()
2669 * @phydev: phy_device struct
2676 bool phy_validate_pause(struct phy_device *phydev, in phy_validate_pause() argument
2680 phydev->supported) && pp->rx_pause) in phy_validate_pause()
2684 phydev->supported) && in phy_validate_pause()
2694 * @phydev: phy_device struct
2704 void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause) in phy_get_pause() argument
2706 if (phydev->duplex != DUPLEX_FULL) { in phy_get_pause()
2712 return linkmode_resolve_pause(phydev->advertising, in phy_get_pause()
2713 phydev->lp_advertising, in phy_get_pause()
2739 * @phydev: phy_device struct
2753 s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev, in phy_get_internal_delay() argument
2762 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
2763 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) in phy_get_internal_delay()
2772 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
2773 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) in phy_get_internal_delay()
2787 phydev_err(phydev, "Delay %d is out of range\n", delay); in phy_get_internal_delay()
2809 phydev_err(phydev, "error finding internal delay index for %d\n", in phy_get_internal_delay()
2831 struct phy_device *phydev = to_phy_device(dev); in phy_probe() local
2832 struct device_driver *drv = phydev->mdio.dev.driver; in phy_probe()
2836 phydev->drv = phydrv; in phy_probe()
2841 if (!phy_drv_supports_irq(phydrv) && phy_interrupt_is_valid(phydev)) in phy_probe()
2842 phydev->irq = PHY_POLL; in phy_probe()
2845 phydev->is_internal = true; in phy_probe()
2847 mutex_lock(&phydev->lock); in phy_probe()
2850 phy_device_reset(phydev, 0); in phy_probe()
2852 if (phydev->drv->probe) { in phy_probe()
2853 err = phydev->drv->probe(phydev); in phy_probe()
2863 linkmode_copy(phydev->supported, phydrv->features); in phy_probe()
2865 err = phydrv->get_features(phydev); in phy_probe()
2866 } else if (phydev->is_c45) { in phy_probe()
2867 err = genphy_c45_pma_read_abilities(phydev); in phy_probe()
2869 err = genphy_read_abilities(phydev); in phy_probe()
2876 phydev->supported)) in phy_probe()
2877 phydev->autoneg = 0; in phy_probe()
2880 phydev->supported)) in phy_probe()
2881 phydev->is_gigabit_capable = 1; in phy_probe()
2883 phydev->supported)) in phy_probe()
2884 phydev->is_gigabit_capable = 1; in phy_probe()
2886 of_set_phy_supported(phydev); in phy_probe()
2887 phy_advertise_supported(phydev); in phy_probe()
2892 of_set_phy_eee_broken(phydev); in phy_probe()
2905 if (!test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported) && in phy_probe()
2906 !test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported)) { in phy_probe()
2908 phydev->supported); in phy_probe()
2910 phydev->supported); in phy_probe()
2914 phydev->state = PHY_READY; in phy_probe()
2919 phy_device_reset(phydev, 1); in phy_probe()
2921 mutex_unlock(&phydev->lock); in phy_probe()
2928 struct phy_device *phydev = to_phy_device(dev); in phy_remove() local
2930 cancel_delayed_work_sync(&phydev->state_queue); in phy_remove()
2932 mutex_lock(&phydev->lock); in phy_remove()
2933 phydev->state = PHY_DOWN; in phy_remove()
2934 mutex_unlock(&phydev->lock); in phy_remove()
2936 sfp_bus_del_upstream(phydev->sfp_bus); in phy_remove()
2937 phydev->sfp_bus = NULL; in phy_remove()
2939 if (phydev->drv && phydev->drv->remove) in phy_remove()
2940 phydev->drv->remove(phydev); in phy_remove()
2943 phy_device_reset(phydev, 1); in phy_remove()
2945 phydev->drv = NULL; in phy_remove()