Lines Matching refs:phydev

57 	int (*run)(struct phy_device *phydev);
210 void phy_device_free(struct phy_device *phydev) in phy_device_free() argument
212 put_device(&phydev->mdio.dev); in phy_device_free()
218 struct phy_device *phydev; in phy_mdio_device_free() local
220 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_free()
221 phy_device_free(phydev); in phy_mdio_device_free()
232 struct phy_device *phydev; in phy_mdio_device_remove() local
234 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_remove()
235 phy_device_remove(phydev); in phy_mdio_device_remove()
243 static bool phy_drv_wol_enabled(struct phy_device *phydev) in phy_drv_wol_enabled() argument
247 phy_ethtool_get_wol(phydev, &wol); in phy_drv_wol_enabled()
252 bool phy_may_wakeup(struct phy_device *phydev) in phy_may_wakeup() argument
255 if (phy_can_wakeup(phydev)) in phy_may_wakeup()
256 return device_may_wakeup(&phydev->mdio.dev); in phy_may_wakeup()
258 return phy_drv_wol_enabled(phydev); in phy_may_wakeup()
262 static void phy_link_change(struct phy_device *phydev, bool up) in phy_link_change() argument
264 struct net_device *netdev = phydev->attached_dev; in phy_link_change()
270 phydev->adjust_link(netdev); in phy_link_change()
271 if (phydev->mii_ts && phydev->mii_ts->link_state) in phy_link_change()
272 phydev->mii_ts->link_state(phydev->mii_ts, phydev); in phy_link_change()
293 static bool phy_uses_state_machine(struct phy_device *phydev) in phy_uses_state_machine() argument
295 if (phydev->phy_link_change == phy_link_change) in phy_uses_state_machine()
296 return phydev->attached_dev && phydev->adjust_link; in phy_uses_state_machine()
298 return !!phydev->phy_link_change; in phy_uses_state_machine()
301 static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) in mdio_bus_phy_may_suspend() argument
303 struct device_driver *drv = phydev->mdio.dev.driver; in mdio_bus_phy_may_suspend()
305 struct net_device *netdev = phydev->attached_dev; in mdio_bus_phy_may_suspend()
313 if (!netdev && phy_may_wakeup(phydev)) in mdio_bus_phy_may_suspend()
343 return !phydev->suspended; in mdio_bus_phy_may_suspend()
348 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_suspend() local
350 if (phydev->mac_managed_pm) in mdio_bus_phy_suspend()
357 if (phy_interrupt_is_valid(phydev)) { in mdio_bus_phy_suspend()
358 phydev->irq_suspended = 1; in mdio_bus_phy_suspend()
359 synchronize_irq(phydev->irq); in mdio_bus_phy_suspend()
367 if (phy_uses_state_machine(phydev)) in mdio_bus_phy_suspend()
368 phy_stop_machine(phydev); in mdio_bus_phy_suspend()
370 if (!mdio_bus_phy_may_suspend(phydev)) in mdio_bus_phy_suspend()
373 phydev->suspended_by_mdio_bus = 1; in mdio_bus_phy_suspend()
375 return phy_suspend(phydev); in mdio_bus_phy_suspend()
380 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_resume() local
383 if (phydev->mac_managed_pm) in mdio_bus_phy_resume()
386 if (!phydev->suspended_by_mdio_bus) in mdio_bus_phy_resume()
389 phydev->suspended_by_mdio_bus = 0; in mdio_bus_phy_resume()
396 WARN_ON(phydev->state != PHY_HALTED && phydev->state != PHY_READY && in mdio_bus_phy_resume()
397 phydev->state != PHY_UP); in mdio_bus_phy_resume()
399 ret = phy_init_hw(phydev); in mdio_bus_phy_resume()
403 ret = phy_resume(phydev); in mdio_bus_phy_resume()
407 if (phy_interrupt_is_valid(phydev)) { in mdio_bus_phy_resume()
408 phydev->irq_suspended = 0; in mdio_bus_phy_resume()
409 synchronize_irq(phydev->irq); in mdio_bus_phy_resume()
414 if (phydev->irq_rerun) { in mdio_bus_phy_resume()
415 phydev->irq_rerun = 0; in mdio_bus_phy_resume()
416 enable_irq(phydev->irq); in mdio_bus_phy_resume()
417 irq_wake_thread(phydev->irq, phydev); in mdio_bus_phy_resume()
421 if (phy_uses_state_machine(phydev)) in mdio_bus_phy_resume()
422 phy_start_machine(phydev); in mdio_bus_phy_resume()
475 static bool phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup) in phy_needs_fixup() argument
477 if (!strcmp(fixup->bus_id, phydev_name(phydev))) in phy_needs_fixup()
481 phy_id_compare(phydev->phy_id, fixup->phy_uid, fixup->phy_uid_mask)) in phy_needs_fixup()
488 static int phy_scan_fixups(struct phy_device *phydev) in phy_scan_fixups() argument
494 if (phy_needs_fixup(phydev, fixup)) { in phy_scan_fixups()
495 int err = fixup->run(phydev); in phy_scan_fixups()
501 phydev->has_fixups = true; in phy_scan_fixups()
522 int genphy_match_phy_device(struct phy_device *phydev, in genphy_match_phy_device() argument
525 if (phydev->is_c45) { in genphy_match_phy_device()
526 const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); in genphy_match_phy_device()
530 if (phydev->c45_ids.device_ids[i] == 0xffffffff) in genphy_match_phy_device()
533 if (phy_id_compare(phydev->c45_ids.device_ids[i], in genphy_match_phy_device()
541 return phy_id_compare(phydev->phy_id, phydrv->phy_id, in genphy_match_phy_device()
548 struct phy_device *phydev = to_phy_device(dev); in phy_bus_match() local
555 return phydrv->match_phy_device(phydev, phydrv); in phy_bus_match()
557 return genphy_match_phy_device(phydev, phydrv); in phy_bus_match()
563 struct phy_device *phydev = to_phy_device(dev); in phy_id_show() local
565 return sysfs_emit(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id); in phy_id_show()
572 struct phy_device *phydev = to_phy_device(dev); in phy_interface_show() local
575 if (phydev->is_internal) in phy_interface_show()
578 mode = phy_modes(phydev->interface); in phy_interface_show()
588 struct phy_device *phydev = to_phy_device(dev); in phy_has_fixups_show() local
590 return sysfs_emit(buf, "%d\n", phydev->has_fixups); in phy_has_fixups_show()
598 struct phy_device *phydev = to_phy_device(dev); in phy_dev_flags_show() local
600 return sysfs_emit(buf, "0x%08x\n", phydev->dev_flags); in phy_dev_flags_show()
620 struct phy_device *phydev = to_phy_device(dev); \
622 (unsigned long)phydev->c45_ids.device_ids[n]); \
697 struct phy_device *phydev = to_phy_device(dev); in phy_mmd_is_visible() local
700 if (!phydev->is_c45) in phy_mmd_is_visible()
702 if (i >= ARRAY_SIZE(phydev->c45_ids.device_ids) || in phy_mmd_is_visible()
703 phydev->c45_ids.device_ids[i] == 0xffffffff) in phy_mmd_is_visible()
1109 int phy_device_register(struct phy_device *phydev) in phy_device_register() argument
1113 err = mdiobus_register_device(&phydev->mdio); in phy_device_register()
1118 phy_device_reset(phydev, 0); in phy_device_register()
1121 err = phy_scan_fixups(phydev); in phy_device_register()
1123 phydev_err(phydev, "failed to initialize\n"); in phy_device_register()
1127 err = device_add(&phydev->mdio.dev); in phy_device_register()
1129 phydev_err(phydev, "failed to add\n"); in phy_device_register()
1137 phy_device_reset(phydev, 1); in phy_device_register()
1139 mdiobus_unregister_device(&phydev->mdio); in phy_device_register()
1152 void phy_device_remove(struct phy_device *phydev) in phy_device_remove() argument
1154 unregister_mii_timestamper(phydev->mii_ts); in phy_device_remove()
1155 pse_control_put(phydev->psec); in phy_device_remove()
1157 device_del(&phydev->mdio.dev); in phy_device_remove()
1160 phy_device_reset(phydev, 1); in phy_device_remove()
1162 mdiobus_unregister_device(&phydev->mdio); in phy_device_remove()
1173 int phy_get_c45_ids(struct phy_device *phydev) in phy_get_c45_ids() argument
1175 return get_phy_c45_ids(phydev->mdio.bus, phydev->mdio.addr, in phy_get_c45_ids()
1176 &phydev->c45_ids); in phy_get_c45_ids()
1191 struct phy_device *phydev = mdiobus_get_phy(bus, addr); in phy_find_next() local
1193 if (phydev) in phy_find_next()
1194 return phydev; in phy_find_next()
1212 static void phy_prepare_link(struct phy_device *phydev, in phy_prepare_link() argument
1215 phydev->adjust_link = handler; in phy_prepare_link()
1225 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, in phy_connect_direct() argument
1234 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_connect_direct()
1238 phy_prepare_link(phydev, handler); in phy_connect_direct()
1239 if (phy_interrupt_is_valid(phydev)) in phy_connect_direct()
1240 phy_request_interrupt(phydev); in phy_connect_direct()
1265 struct phy_device *phydev; in phy_connect() local
1277 phydev = to_phy_device(d); in phy_connect()
1279 rc = phy_connect_direct(dev, phydev, handler, interface); in phy_connect()
1284 return phydev; in phy_connect()
1293 void phy_disconnect(struct phy_device *phydev) in phy_disconnect() argument
1295 if (phy_is_started(phydev)) in phy_disconnect()
1296 phy_stop(phydev); in phy_disconnect()
1298 if (phy_interrupt_is_valid(phydev)) in phy_disconnect()
1299 phy_free_interrupt(phydev); in phy_disconnect()
1301 phydev->adjust_link = NULL; in phy_disconnect()
1303 phy_detach(phydev); in phy_disconnect()
1325 static int phy_poll_reset(struct phy_device *phydev) in phy_poll_reset() argument
1330 ret = phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET), in phy_poll_reset()
1341 int phy_init_hw(struct phy_device *phydev) in phy_init_hw() argument
1346 phy_device_reset(phydev, 0); in phy_init_hw()
1348 if (!phydev->drv) in phy_init_hw()
1351 if (phydev->drv->soft_reset) { in phy_init_hw()
1352 ret = phydev->drv->soft_reset(phydev); in phy_init_hw()
1357 phydev->suspended = 0; in phy_init_hw()
1360 ret = phy_scan_fixups(phydev); in phy_init_hw()
1364 phy_interface_zero(phydev->possible_interfaces); in phy_init_hw()
1366 if (phydev->drv->config_init) { in phy_init_hw()
1367 ret = phydev->drv->config_init(phydev); in phy_init_hw()
1372 if (phydev->drv->config_intr) { in phy_init_hw()
1373 ret = phydev->drv->config_intr(phydev); in phy_init_hw()
1382 void phy_attached_info(struct phy_device *phydev) in phy_attached_info() argument
1384 phy_attached_print(phydev, NULL); in phy_attached_info()
1389 char *phy_attached_info_irq(struct phy_device *phydev) in phy_attached_info_irq() argument
1394 switch(phydev->irq) { in phy_attached_info_irq()
1402 snprintf(irq_num, sizeof(irq_num), "%d", phydev->irq); in phy_attached_info_irq()
1411 void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) in phy_attached_print() argument
1413 const char *unbound = phydev->drv ? "" : "[unbound] "; in phy_attached_print()
1414 char *irq_str = phy_attached_info_irq(phydev); in phy_attached_print()
1417 phydev_info(phydev, ATTACHED_FMT "\n", unbound, in phy_attached_print()
1418 phydev_name(phydev), irq_str); in phy_attached_print()
1422 phydev_info(phydev, ATTACHED_FMT, unbound, in phy_attached_print()
1423 phydev_name(phydev), irq_str); in phy_attached_print()
1433 static void phy_sysfs_create_links(struct phy_device *phydev) in phy_sysfs_create_links() argument
1435 struct net_device *dev = phydev->attached_dev; in phy_sysfs_create_links()
1441 err = sysfs_create_link(&phydev->mdio.dev.kobj, &dev->dev.kobj, in phy_sysfs_create_links()
1447 &phydev->mdio.dev.kobj, in phy_sysfs_create_links()
1451 kobject_name(&phydev->mdio.dev.kobj), in phy_sysfs_create_links()
1458 phydev->sysfs_links = true; in phy_sysfs_create_links()
1465 struct phy_device *phydev = to_phy_device(dev); in phy_standalone_show() local
1467 return sysfs_emit(buf, "%d\n", !phydev->attached_dev); in phy_standalone_show()
1483 struct phy_device *phydev = upstream; in phy_sfp_connect_phy() local
1484 struct net_device *dev = phydev->attached_dev; in phy_sfp_connect_phy()
1487 return phy_link_topo_add_phy(dev, phy, PHY_UPSTREAM_PHY, phydev); in phy_sfp_connect_phy()
1504 struct phy_device *phydev = upstream; in phy_sfp_disconnect_phy() local
1505 struct net_device *dev = phydev->attached_dev; in phy_sfp_disconnect_phy()
1520 struct phy_device *phydev = upstream; in phy_sfp_attach() local
1522 if (phydev->attached_dev) in phy_sfp_attach()
1523 phydev->attached_dev->sfp_bus = bus; in phy_sfp_attach()
1524 phydev->sfp_bus_attached = true; in phy_sfp_attach()
1536 struct phy_device *phydev = upstream; in phy_sfp_detach() local
1538 if (phydev->attached_dev) in phy_sfp_detach()
1539 phydev->attached_dev->sfp_bus = NULL; in phy_sfp_detach()
1540 phydev->sfp_bus_attached = false; in phy_sfp_detach()
1546 struct phy_device *phydev = upstream; in phy_sfp_module_insert() local
1554 port = phy_get_sfp_port(phydev); in phy_sfp_module_insert()
1558 caps = sfp_get_module_caps(phydev->sfp_bus); in phy_sfp_module_insert()
1562 dev_err(&phydev->mdio.dev, "incompatible SFP module inserted, no common linkmode\n"); in phy_sfp_module_insert()
1566 iface = sfp_select_interface(phydev->sfp_bus, sfp_support); in phy_sfp_module_insert()
1568 dev_err(&phydev->mdio.dev, "PHY %s does not support the SFP module's requested MII interfaces\n", in phy_sfp_module_insert()
1569 phydev_name(phydev)); in phy_sfp_module_insert()
1573 if (phydev->n_ports == 1) in phy_sfp_module_insert()
1574 phydev->port = caps->port; in phy_sfp_module_insert()
1584 struct phy_device *phydev = upstream; in phy_sfp_module_remove() local
1585 struct phy_port *port = phy_get_sfp_port(phydev); in phy_sfp_module_remove()
1590 if (phydev->n_ports == 1) in phy_sfp_module_remove()
1591 phydev->port = PORT_NONE; in phy_sfp_module_remove()
1596 struct phy_device *phydev = upstream; in phy_sfp_link_up() local
1597 struct phy_port *port = phy_get_sfp_port(phydev); in phy_sfp_link_up()
1605 struct phy_device *phydev = upstream; in phy_sfp_link_down() local
1606 struct phy_port *port = phy_get_sfp_port(phydev); in phy_sfp_link_down()
1623 static int phy_add_port(struct phy_device *phydev, struct phy_port *port) in phy_add_port() argument
1627 if (phydev->n_ports == phydev->max_n_ports) in phy_add_port()
1636 if (phydev->drv && phydev->drv->attach_mii_port) in phy_add_port()
1637 ret = phydev->drv->attach_mii_port(phydev, port); in phy_add_port()
1639 if (phydev->drv && phydev->drv->attach_mdi_port) in phy_add_port()
1640 ret = phydev->drv->attach_mdi_port(phydev, port); in phy_add_port()
1651 list_add(&port->head, &phydev->ports); in phy_add_port()
1653 phydev->n_ports++; in phy_add_port()
1658 static void phy_del_port(struct phy_device *phydev, struct phy_port *port) in phy_del_port() argument
1660 if (!phydev->n_ports) in phy_del_port()
1665 phydev->n_ports--; in phy_del_port()
1668 static int phy_setup_sfp_port(struct phy_device *phydev) in phy_setup_sfp_port() argument
1677 port->phy = phydev; in phy_setup_sfp_port()
1688 ret = phy_add_port(phydev, port); in phy_setup_sfp_port()
1699 static int phy_sfp_probe(struct phy_device *phydev) in phy_sfp_probe() argument
1704 if (phydev->mdio.dev.fwnode) { in phy_sfp_probe()
1705 bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode); in phy_sfp_probe()
1709 phydev->sfp_bus = bus; in phy_sfp_probe()
1711 ret = sfp_bus_add_upstream(bus, phydev, &sfp_phydev_ops); in phy_sfp_probe()
1715 if (!ret && phydev->sfp_bus) in phy_sfp_probe()
1716 ret = phy_setup_sfp_port(phydev); in phy_sfp_probe()
1741 int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, in phy_attach_direct() argument
1744 struct mii_bus *bus = phydev->mdio.bus; in phy_attach_direct()
1745 struct device *d = &phydev->mdio.dev; in phy_attach_direct()
1757 phydev_err(phydev, "failed to get the bus module\n"); in phy_attach_direct()
1767 if (phydev->is_c45) in phy_attach_direct()
1772 phydev->is_genphy_driven = 1; in phy_attach_direct()
1776 phydev_err(phydev, "failed to get the device driver module\n"); in phy_attach_direct()
1781 if (phydev->is_genphy_driven) { in phy_attach_direct()
1790 if (phydev->attached_dev) { in phy_attach_direct()
1796 phydev->phy_link_change = phy_link_change; in phy_attach_direct()
1798 phydev->attached_dev = dev; in phy_attach_direct()
1799 dev->phydev = phydev; in phy_attach_direct()
1801 if (phydev->sfp_bus_attached) in phy_attach_direct()
1802 dev->sfp_bus = phydev->sfp_bus; in phy_attach_direct()
1804 err = phy_link_topo_add_phy(dev, phydev, PHY_UPSTREAM_MAC, dev); in phy_attach_direct()
1817 phydev->sysfs_links = false; in phy_attach_direct()
1819 phy_sysfs_create_links(phydev); in phy_attach_direct()
1821 if (!phydev->attached_dev) { in phy_attach_direct()
1822 err = sysfs_create_file(&phydev->mdio.dev.kobj, in phy_attach_direct()
1825 phydev_err(phydev, "error creating 'phy_standalone' sysfs entry\n"); in phy_attach_direct()
1828 phydev->dev_flags |= flags; in phy_attach_direct()
1830 phydev->interface = interface; in phy_attach_direct()
1832 phydev->state = PHY_READY; in phy_attach_direct()
1834 phydev->interrupts = PHY_INTERRUPT_DISABLED; in phy_attach_direct()
1840 if (phydev->dev_flags & PHY_F_NO_IRQ) in phy_attach_direct()
1841 phydev->irq = PHY_POLL; in phy_attach_direct()
1843 if (!phy_drv_supports_irq(phydev->drv) && phy_interrupt_is_valid(phydev)) in phy_attach_direct()
1844 phydev->irq = PHY_POLL; in phy_attach_direct()
1851 if (phydev->is_genphy_driven) in phy_attach_direct()
1852 phydev->port = PORT_MII; in phy_attach_direct()
1858 netif_carrier_off(phydev->attached_dev); in phy_attach_direct()
1864 err = phy_init_hw(phydev); in phy_attach_direct()
1868 phy_resume(phydev); in phy_attach_direct()
1869 if (!phydev->is_on_sfp_module) in phy_attach_direct()
1870 phy_led_triggers_register(phydev); in phy_attach_direct()
1877 if (dev && phydev->mdio.bus->parent && dev->dev.parent != phydev->mdio.bus->parent) in phy_attach_direct()
1878 phydev->devlink = device_link_add(dev->dev.parent, &phydev->mdio.dev, in phy_attach_direct()
1885 phy_detach(phydev); in phy_attach_direct()
1890 phydev->is_genphy_driven = 0; in phy_attach_direct()
1912 struct phy_device *phydev; in phy_attach() local
1927 phydev = to_phy_device(d); in phy_attach()
1929 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_attach()
1934 return phydev; in phy_attach()
1945 void phy_detach(struct phy_device *phydev) in phy_detach() argument
1947 struct net_device *dev = phydev->attached_dev; in phy_detach()
1951 if (phydev->devlink) { in phy_detach()
1952 device_link_del(phydev->devlink); in phy_detach()
1953 phydev->devlink = NULL; in phy_detach()
1956 if (phydev->sysfs_links) { in phy_detach()
1959 sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev"); in phy_detach()
1962 if (!phydev->attached_dev) in phy_detach()
1963 sysfs_remove_file(&phydev->mdio.dev.kobj, in phy_detach()
1966 phy_suspend(phydev); in phy_detach()
1972 if (hwprov && hwprov->phydev == phydev) { in phy_detach()
1977 phydev->attached_dev->phydev = NULL; in phy_detach()
1978 phydev->attached_dev = NULL; in phy_detach()
1979 phy_link_topo_del_phy(dev, phydev); in phy_detach()
1982 phydev->phy_link_change = NULL; in phy_detach()
1983 phydev->phylink = NULL; in phy_detach()
1985 if (!phydev->is_on_sfp_module) in phy_detach()
1986 phy_led_triggers_unregister(phydev); in phy_detach()
1988 if (phydev->mdio.dev.driver) in phy_detach()
1989 module_put(phydev->mdio.dev.driver->owner); in phy_detach()
1996 if (phydev->is_genphy_driven) { in phy_detach()
1997 device_release_driver(&phydev->mdio.dev); in phy_detach()
1998 phydev->is_genphy_driven = 0; in phy_detach()
2002 phy_device_reset(phydev, 1); in phy_detach()
2008 bus = phydev->mdio.bus; in phy_detach()
2010 put_device(&phydev->mdio.dev); in phy_detach()
2018 int phy_suspend(struct phy_device *phydev) in phy_suspend() argument
2020 struct net_device *netdev = phydev->attached_dev; in phy_suspend()
2021 const struct phy_driver *phydrv = phydev->drv; in phy_suspend()
2024 if (phydev->suspended || !phydrv) in phy_suspend()
2027 phydev->wol_enabled = phy_may_wakeup(phydev) || in phy_suspend()
2030 if (phydev->wol_enabled && !(phydrv->flags & PHY_ALWAYS_CALL_SUSPEND)) in phy_suspend()
2036 ret = phydrv->suspend(phydev); in phy_suspend()
2038 phydev->suspended = true; in phy_suspend()
2044 int __phy_resume(struct phy_device *phydev) in __phy_resume() argument
2046 const struct phy_driver *phydrv = phydev->drv; in __phy_resume()
2049 lockdep_assert_held(&phydev->lock); in __phy_resume()
2054 ret = phydrv->resume(phydev); in __phy_resume()
2056 phydev->suspended = false; in __phy_resume()
2062 int phy_resume(struct phy_device *phydev) in phy_resume() argument
2066 mutex_lock(&phydev->lock); in phy_resume()
2067 ret = __phy_resume(phydev); in phy_resume()
2068 mutex_unlock(&phydev->lock); in phy_resume()
2083 int phy_reset_after_clk_enable(struct phy_device *phydev) in phy_reset_after_clk_enable() argument
2085 if (!phydev || !phydev->drv) in phy_reset_after_clk_enable()
2088 if (phydev->drv->flags & PHY_RST_AFTER_CLK_EN) { in phy_reset_after_clk_enable()
2089 phy_device_reset(phydev, 1); in phy_reset_after_clk_enable()
2090 phy_device_reset(phydev, 0); in phy_reset_after_clk_enable()
2110 static int genphy_config_advert(struct phy_device *phydev, in genphy_config_advert() argument
2119 err = phy_modify_changed(phydev, MII_ADVERTISE, in genphy_config_advert()
2128 bmsr = phy_read(phydev, MII_BMSR); in genphy_config_advert()
2141 err = phy_modify_changed(phydev, MII_CTRL1000, in genphy_config_advert()
2162 static int genphy_c37_config_advert(struct phy_device *phydev) in genphy_c37_config_advert() argument
2167 linkmode_and(phydev->advertising, phydev->advertising, in genphy_c37_config_advert()
2168 phydev->supported); in genphy_c37_config_advert()
2171 phydev->advertising)) in genphy_c37_config_advert()
2174 phydev->advertising)) in genphy_c37_config_advert()
2177 phydev->advertising)) in genphy_c37_config_advert()
2180 return phy_modify_changed(phydev, MII_ADVERTISE, in genphy_c37_config_advert()
2194 int genphy_setup_forced(struct phy_device *phydev) in genphy_setup_forced() argument
2198 phydev->pause = false; in genphy_setup_forced()
2199 phydev->asym_pause = false; in genphy_setup_forced()
2201 ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); in genphy_setup_forced()
2203 return phy_modify(phydev, MII_BMCR, in genphy_setup_forced()
2208 static int genphy_setup_master_slave(struct phy_device *phydev) in genphy_setup_master_slave() argument
2212 if (!phydev->is_gigabit_capable) in genphy_setup_master_slave()
2215 switch (phydev->master_slave_set) { in genphy_setup_master_slave()
2231 phydev_warn(phydev, "Unsupported Master/Slave mode\n"); in genphy_setup_master_slave()
2235 return phy_modify_changed(phydev, MII_CTRL1000, in genphy_setup_master_slave()
2240 int genphy_read_master_slave(struct phy_device *phydev) in genphy_read_master_slave() argument
2245 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN; in genphy_read_master_slave()
2246 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN; in genphy_read_master_slave()
2248 val = phy_read(phydev, MII_CTRL1000); in genphy_read_master_slave()
2264 val = phy_read(phydev, MII_STAT1000); in genphy_read_master_slave()
2270 } else if (phydev->link) { in genphy_read_master_slave()
2280 phydev->master_slave_get = cfg; in genphy_read_master_slave()
2281 phydev->master_slave_state = state; in genphy_read_master_slave()
2291 int genphy_restart_aneg(struct phy_device *phydev) in genphy_restart_aneg() argument
2294 return phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, in genphy_restart_aneg()
2306 int genphy_check_and_restart_aneg(struct phy_device *phydev, bool restart) in genphy_check_and_restart_aneg() argument
2314 ret = phy_read(phydev, MII_BMCR); in genphy_check_and_restart_aneg()
2323 return genphy_restart_aneg(phydev); in genphy_check_and_restart_aneg()
2338 int __genphy_config_aneg(struct phy_device *phydev, bool changed) in __genphy_config_aneg() argument
2345 err = genphy_c45_an_config_eee_aneg(phydev); in __genphy_config_aneg()
2351 err = genphy_setup_master_slave(phydev); in __genphy_config_aneg()
2357 if (phydev->autoneg == AUTONEG_ENABLE) { in __genphy_config_aneg()
2359 linkmode_and(phydev->advertising, phydev->advertising, in __genphy_config_aneg()
2360 phydev->supported); in __genphy_config_aneg()
2361 advert = phydev->advertising; in __genphy_config_aneg()
2362 } else if (phydev->speed < SPEED_1000) { in __genphy_config_aneg()
2363 return genphy_setup_forced(phydev); in __genphy_config_aneg()
2367 c = phy_caps_lookup(phydev->speed, phydev->duplex, in __genphy_config_aneg()
2368 phydev->supported, true); in __genphy_config_aneg()
2370 linkmode_and(fixed_advert, phydev->supported, in __genphy_config_aneg()
2376 err = genphy_config_advert(phydev, advert); in __genphy_config_aneg()
2382 return genphy_check_and_restart_aneg(phydev, changed); in __genphy_config_aneg()
2395 int genphy_c37_config_aneg(struct phy_device *phydev) in genphy_c37_config_aneg() argument
2399 if (phydev->autoneg != AUTONEG_ENABLE) in genphy_c37_config_aneg()
2400 return genphy_setup_forced(phydev); in genphy_c37_config_aneg()
2402 err = phy_modify(phydev, MII_BMCR, BMCR_SPEED1000 | BMCR_SPEED100, in genphy_c37_config_aneg()
2407 changed = genphy_c37_config_advert(phydev); in genphy_c37_config_aneg()
2415 int ctl = phy_read(phydev, MII_BMCR); in genphy_c37_config_aneg()
2428 return genphy_restart_aneg(phydev); in genphy_c37_config_aneg()
2442 int genphy_aneg_done(struct phy_device *phydev) in genphy_aneg_done() argument
2444 int retval = phy_read(phydev, MII_BMSR); in genphy_aneg_done()
2458 int genphy_update_link(struct phy_device *phydev) in genphy_update_link() argument
2462 bmcr = phy_read(phydev, MII_BMCR); in genphy_update_link()
2477 if (!phy_polling_mode(phydev) || !phydev->link) { in genphy_update_link()
2478 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2486 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
2490 phydev->link = status & BMSR_LSTATUS ? 1 : 0; in genphy_update_link()
2491 phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0; in genphy_update_link()
2496 if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete) in genphy_update_link()
2497 phydev->link = 0; in genphy_update_link()
2503 int genphy_read_lpa(struct phy_device *phydev) in genphy_read_lpa() argument
2507 if (phydev->autoneg == AUTONEG_ENABLE) { in genphy_read_lpa()
2508 if (!phydev->autoneg_complete) { in genphy_read_lpa()
2509 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2511 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0); in genphy_read_lpa()
2515 if (phydev->is_gigabit_capable) { in genphy_read_lpa()
2516 lpagb = phy_read(phydev, MII_STAT1000); in genphy_read_lpa()
2521 int adv = phy_read(phydev, MII_CTRL1000); in genphy_read_lpa()
2527 phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n"); in genphy_read_lpa()
2529 phydev_err(phydev, "Master/Slave resolution failed\n"); in genphy_read_lpa()
2533 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, in genphy_read_lpa()
2537 lpa = phy_read(phydev, MII_LPA); in genphy_read_lpa()
2541 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); in genphy_read_lpa()
2543 linkmode_zero(phydev->lp_advertising); in genphy_read_lpa()
2557 int genphy_read_status_fixed(struct phy_device *phydev) in genphy_read_status_fixed() argument
2559 int bmcr = phy_read(phydev, MII_BMCR); in genphy_read_status_fixed()
2565 phydev->duplex = DUPLEX_FULL; in genphy_read_status_fixed()
2567 phydev->duplex = DUPLEX_HALF; in genphy_read_status_fixed()
2570 phydev->speed = SPEED_1000; in genphy_read_status_fixed()
2572 phydev->speed = SPEED_100; in genphy_read_status_fixed()
2574 phydev->speed = SPEED_10; in genphy_read_status_fixed()
2589 int genphy_read_status(struct phy_device *phydev) in genphy_read_status() argument
2591 int err, old_link = phydev->link; in genphy_read_status()
2594 err = genphy_update_link(phydev); in genphy_read_status()
2599 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) in genphy_read_status()
2602 phydev->master_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED; in genphy_read_status()
2603 phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED; in genphy_read_status()
2604 phydev->speed = SPEED_UNKNOWN; in genphy_read_status()
2605 phydev->duplex = DUPLEX_UNKNOWN; in genphy_read_status()
2606 phydev->pause = false; in genphy_read_status()
2607 phydev->asym_pause = false; in genphy_read_status()
2609 if (phydev->is_gigabit_capable) { in genphy_read_status()
2610 err = genphy_read_master_slave(phydev); in genphy_read_status()
2615 err = genphy_read_lpa(phydev); in genphy_read_status()
2619 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_read_status()
2620 phy_resolve_aneg_linkmode(phydev); in genphy_read_status()
2621 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_read_status()
2622 err = genphy_read_status_fixed(phydev); in genphy_read_status()
2642 int genphy_c37_read_status(struct phy_device *phydev, bool *changed) in genphy_c37_read_status() argument
2644 int lpa, err, old_link = phydev->link; in genphy_c37_read_status()
2647 err = genphy_update_link(phydev); in genphy_c37_read_status()
2652 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link) { in genphy_c37_read_status()
2659 phydev->duplex = DUPLEX_UNKNOWN; in genphy_c37_read_status()
2660 phydev->pause = false; in genphy_c37_read_status()
2661 phydev->asym_pause = false; in genphy_c37_read_status()
2663 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_c37_read_status()
2664 lpa = phy_read(phydev, MII_LPA); in genphy_c37_read_status()
2669 phydev->lp_advertising, lpa & LPA_LPACK); in genphy_c37_read_status()
2671 phydev->lp_advertising, lpa & LPA_1000XFULL); in genphy_c37_read_status()
2673 phydev->lp_advertising, lpa & LPA_1000XPAUSE); in genphy_c37_read_status()
2675 phydev->lp_advertising, in genphy_c37_read_status()
2678 phy_resolve_aneg_linkmode(phydev); in genphy_c37_read_status()
2679 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_c37_read_status()
2680 int bmcr = phy_read(phydev, MII_BMCR); in genphy_c37_read_status()
2686 phydev->duplex = DUPLEX_FULL; in genphy_c37_read_status()
2688 phydev->duplex = DUPLEX_HALF; in genphy_c37_read_status()
2704 int genphy_soft_reset(struct phy_device *phydev) in genphy_soft_reset() argument
2709 if (phydev->autoneg == AUTONEG_ENABLE) in genphy_soft_reset()
2712 ret = phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, res); in genphy_soft_reset()
2720 phydev->suspended = 0; in genphy_soft_reset()
2722 ret = phy_poll_reset(phydev); in genphy_soft_reset()
2727 if (phydev->autoneg == AUTONEG_DISABLE) in genphy_soft_reset()
2728 ret = genphy_setup_forced(phydev); in genphy_soft_reset()
2734 irqreturn_t genphy_handle_interrupt_no_ack(struct phy_device *phydev) in genphy_handle_interrupt_no_ack() argument
2741 phy_trigger_machine(phydev); in genphy_handle_interrupt_no_ack()
2756 int genphy_read_abilities(struct phy_device *phydev) in genphy_read_abilities() argument
2762 phydev->supported); in genphy_read_abilities()
2764 val = phy_read(phydev, MII_BMSR); in genphy_read_abilities()
2768 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported, in genphy_read_abilities()
2771 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2773 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2775 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported, in genphy_read_abilities()
2777 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported, in genphy_read_abilities()
2781 val = phy_read(phydev, MII_ESTATUS); in genphy_read_abilities()
2786 phydev->supported, val & ESTATUS_1000_TFULL); in genphy_read_abilities()
2788 phydev->supported, val & ESTATUS_1000_THALF); in genphy_read_abilities()
2790 phydev->supported, val & ESTATUS_1000_XFULL); in genphy_read_abilities()
2796 genphy_c45_read_eee_abilities(phydev); in genphy_read_abilities()
2819 int genphy_suspend(struct phy_device *phydev) in genphy_suspend() argument
2821 return phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_suspend()
2825 int genphy_resume(struct phy_device *phydev) in genphy_resume() argument
2827 return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_resume()
2831 int genphy_loopback(struct phy_device *phydev, bool enable, int speed) in genphy_loopback() argument
2839 phydev->speed = speed; in genphy_loopback()
2843 ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); in genphy_loopback()
2845 phy_modify(phydev, MII_BMCR, ~0, ctl); in genphy_loopback()
2847 ret = phy_read_poll_timeout(phydev, MII_BMSR, val, in genphy_loopback()
2853 phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, 0); in genphy_loopback()
2855 phy_config_aneg(phydev); in genphy_loopback()
2871 void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode) in phy_remove_link_mode() argument
2873 linkmode_clear_bit(link_mode, phydev->supported); in phy_remove_link_mode()
2874 phy_advertise_supported(phydev); in phy_remove_link_mode()
2893 void phy_advertise_supported(struct phy_device *phydev) in phy_advertise_supported() argument
2897 linkmode_copy(new, phydev->supported); in phy_advertise_supported()
2898 phy_copy_pause_bits(new, phydev->advertising); in phy_advertise_supported()
2899 linkmode_copy(phydev->advertising, new); in phy_advertise_supported()
2913 void phy_advertise_eee_all(struct phy_device *phydev) in phy_advertise_eee_all() argument
2915 linkmode_copy(phydev->advertising_eee, phydev->supported_eee); in phy_advertise_eee_all()
2939 void phy_support_eee(struct phy_device *phydev) in phy_support_eee() argument
2941 linkmode_copy(phydev->advertising_eee, phydev->supported_eee); in phy_support_eee()
2942 phydev->eee_cfg.tx_lpi_enabled = true; in phy_support_eee()
2943 phydev->eee_cfg.eee_enabled = true; in phy_support_eee()
2954 void phy_disable_eee(struct phy_device *phydev) in phy_disable_eee() argument
2956 linkmode_zero(phydev->advertising_eee); in phy_disable_eee()
2957 phydev->eee_cfg.tx_lpi_enabled = false; in phy_disable_eee()
2958 phydev->eee_cfg.eee_enabled = false; in phy_disable_eee()
2960 linkmode_fill(phydev->eee_disabled_modes); in phy_disable_eee()
2971 void phy_support_sym_pause(struct phy_device *phydev) in phy_support_sym_pause() argument
2973 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in phy_support_sym_pause()
2974 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_sym_pause()
2984 void phy_support_asym_pause(struct phy_device *phydev) in phy_support_asym_pause() argument
2986 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_asym_pause()
3001 void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, in phy_set_sym_pause() argument
3004 linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in phy_set_sym_pause()
3008 phydev->supported); in phy_set_sym_pause()
3010 linkmode_copy(phydev->advertising, phydev->supported); in phy_set_sym_pause()
3025 void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) in phy_set_asym_pause() argument
3029 linkmode_copy(oldadv, phydev->advertising); in phy_set_asym_pause()
3030 linkmode_set_pause(phydev->advertising, tx, rx); in phy_set_asym_pause()
3032 if (!linkmode_equal(oldadv, phydev->advertising) && in phy_set_asym_pause()
3033 phydev->autoneg) in phy_set_asym_pause()
3034 phy_start_aneg(phydev); in phy_set_asym_pause()
3047 bool phy_validate_pause(struct phy_device *phydev, in phy_validate_pause() argument
3051 phydev->supported) && pp->rx_pause) in phy_validate_pause()
3055 phydev->supported) && in phy_validate_pause()
3075 void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause) in phy_get_pause() argument
3077 if (phydev->duplex != DUPLEX_FULL) { in phy_get_pause()
3083 return linkmode_resolve_pause(phydev->advertising, in phy_get_pause()
3084 phydev->lp_advertising, in phy_get_pause()
3116 s32 phy_get_internal_delay(struct phy_device *phydev, const int *delay_values, in phy_get_internal_delay() argument
3119 struct device *dev = &phydev->mdio.dev; in phy_get_internal_delay()
3126 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
3127 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) in phy_get_internal_delay()
3136 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in phy_get_internal_delay()
3137 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) in phy_get_internal_delay()
3151 phydev_err(phydev, "Delay %d is out of range\n", delay); in phy_get_internal_delay()
3173 phydev_err(phydev, "error finding internal delay index for %d\n", in phy_get_internal_delay()
3189 int phy_get_tx_amplitude_gain(struct phy_device *phydev, struct device *dev, in phy_get_tx_amplitude_gain() argument
3212 int phy_get_mac_termination(struct phy_device *phydev, struct device *dev, in phy_get_mac_termination() argument
3223 struct phy_device *phydev = phyled->phydev; in phy_led_set_brightness() local
3226 mutex_lock(&phydev->lock); in phy_led_set_brightness()
3227 err = phydev->drv->led_brightness_set(phydev, phyled->index, value); in phy_led_set_brightness()
3228 mutex_unlock(&phydev->lock); in phy_led_set_brightness()
3238 struct phy_device *phydev = phyled->phydev; in phy_led_blink_set() local
3241 mutex_lock(&phydev->lock); in phy_led_blink_set()
3242 err = phydev->drv->led_blink_set(phydev, phyled->index, in phy_led_blink_set()
3244 mutex_unlock(&phydev->lock); in phy_led_blink_set()
3253 struct phy_device *phydev = phyled->phydev; in phy_led_hw_control_get_device() local
3255 if (phydev->attached_dev) in phy_led_hw_control_get_device()
3256 return &phydev->attached_dev->dev; in phy_led_hw_control_get_device()
3265 struct phy_device *phydev = phyled->phydev; in phy_led_hw_control_get() local
3268 mutex_lock(&phydev->lock); in phy_led_hw_control_get()
3269 err = phydev->drv->led_hw_control_get(phydev, phyled->index, rules); in phy_led_hw_control_get()
3270 mutex_unlock(&phydev->lock); in phy_led_hw_control_get()
3280 struct phy_device *phydev = phyled->phydev; in phy_led_hw_control_set() local
3283 mutex_lock(&phydev->lock); in phy_led_hw_control_set()
3284 err = phydev->drv->led_hw_control_set(phydev, phyled->index, rules); in phy_led_hw_control_set()
3285 mutex_unlock(&phydev->lock); in phy_led_hw_control_set()
3294 struct phy_device *phydev = phyled->phydev; in phy_led_hw_is_supported() local
3297 mutex_lock(&phydev->lock); in phy_led_hw_is_supported()
3298 err = phydev->drv->led_hw_is_supported(phydev, phyled->index, rules); in phy_led_hw_is_supported()
3299 mutex_unlock(&phydev->lock); in phy_led_hw_is_supported()
3304 static void phy_leds_unregister(struct phy_device *phydev) in phy_leds_unregister() argument
3308 list_for_each_entry_safe(phyled, tmp, &phydev->leds, list) { in phy_leds_unregister()
3314 static int of_phy_led(struct phy_device *phydev, in of_phy_led() argument
3317 struct device *dev = &phydev->mdio.dev; in of_phy_led()
3330 phyled->phydev = phydev; in of_phy_led()
3351 if (!phydev->drv->led_polarity_set) in of_phy_led()
3354 err = phydev->drv->led_polarity_set(phydev, index, modes); in of_phy_led()
3360 if (phydev->drv->led_brightness_set) in of_phy_led()
3362 if (phydev->drv->led_blink_set) in of_phy_led()
3366 if (phydev->drv->led_hw_is_supported && in of_phy_led()
3367 phydev->drv->led_hw_control_set && in of_phy_led()
3368 phydev->drv->led_hw_control_get) { in of_phy_led()
3378 init_data.devicename = dev_name(&phydev->mdio.dev); in of_phy_led()
3386 list_add(&phyled->list, &phydev->leds); in of_phy_led()
3391 static int of_phy_leds(struct phy_device *phydev) in of_phy_leds() argument
3393 struct device_node *node = phydev->mdio.dev.of_node; in of_phy_leds()
3410 if (!(phydev->drv->led_brightness_set || in of_phy_leds()
3411 phydev->drv->led_blink_set || in of_phy_leds()
3412 phydev->drv->led_hw_control_set)) { in of_phy_leds()
3413 phydev_dbg(phydev, "ignoring leds node defined with no PHY driver support\n"); in of_phy_leds()
3418 err = of_phy_led(phydev, led); in of_phy_leds()
3421 phy_leds_unregister(phydev); in of_phy_leds()
3431 static void phy_cleanup_ports(struct phy_device *phydev) in phy_cleanup_ports() argument
3435 list_for_each_entry_safe(port, tmp, &phydev->ports, head) { in phy_cleanup_ports()
3436 phy_del_port(phydev, port); in phy_cleanup_ports()
3441 static int phy_default_setup_single_port(struct phy_device *phydev) in phy_default_setup_single_port() argument
3450 port->phy = phydev; in phy_default_setup_single_port()
3464 linkmode_copy(port->supported, phydev->supported); in phy_default_setup_single_port()
3471 phy_add_port(phydev, port); in phy_default_setup_single_port()
3476 static int of_phy_ports(struct phy_device *phydev) in of_phy_ports() argument
3478 struct device_node *node = phydev->mdio.dev.of_node; in of_phy_ports()
3501 port->phy = phydev; in of_phy_ports()
3503 linkmode_copy(port->supported, phydev->supported); in of_phy_ports()
3505 err = phy_add_port(phydev, port); in of_phy_ports()
3516 phy_cleanup_ports(phydev); in of_phy_ports()
3521 static int phy_setup_ports(struct phy_device *phydev) in phy_setup_ports() argument
3527 ret = of_phy_ports(phydev); in phy_setup_ports()
3531 ret = phy_sfp_probe(phydev); in phy_setup_ports()
3535 if (phydev->n_ports < phydev->max_n_ports) { in phy_setup_ports()
3536 ret = phy_default_setup_single_port(phydev); in phy_setup_ports()
3547 list_for_each_entry(port, &phydev->ports, head) in phy_setup_ports()
3553 linkmode_and(phydev->supported, phydev->supported, in phy_setup_ports()
3557 list_for_each_entry(port, &phydev->ports, head) in phy_setup_ports()
3559 phydev->port = phy_port_get_type(port); in phy_setup_ports()
3566 phy_cleanup_ports(phydev); in phy_setup_ports()
3577 struct phy_port *phy_get_sfp_port(struct phy_device *phydev) in phy_get_sfp_port() argument
3581 list_for_each_entry(port, &phydev->ports, head) in phy_get_sfp_port()
3669 struct phy_device *phydev = to_phy_device(dev); in phy_probe() local
3670 struct device_driver *drv = phydev->mdio.dev.driver; in phy_probe()
3674 phydev->drv = phydrv; in phy_probe()
3679 if (!phy_drv_supports_irq(phydrv) && phy_interrupt_is_valid(phydev)) in phy_probe()
3680 phydev->irq = PHY_POLL; in phy_probe()
3683 phydev->is_internal = true; in phy_probe()
3686 phy_device_reset(phydev, 0); in phy_probe()
3688 if (phydev->drv->probe) { in phy_probe()
3689 err = phydev->drv->probe(phydev); in phy_probe()
3694 phy_disable_interrupts(phydev); in phy_probe()
3701 linkmode_copy(phydev->supported, phydrv->features); in phy_probe()
3702 genphy_c45_read_eee_abilities(phydev); in phy_probe()
3705 err = phydrv->get_features(phydev); in phy_probe()
3706 else if (phydev->is_c45) in phy_probe()
3707 err = genphy_c45_pma_read_abilities(phydev); in phy_probe()
3709 err = genphy_read_abilities(phydev); in phy_probe()
3715 phydev->supported)) in phy_probe()
3716 phydev->autoneg = 0; in phy_probe()
3719 phydev->supported)) in phy_probe()
3720 phydev->is_gigabit_capable = 1; in phy_probe()
3722 phydev->supported)) in phy_probe()
3723 phydev->is_gigabit_capable = 1; in phy_probe()
3725 of_set_phy_supported(phydev); in phy_probe()
3727 err = phy_setup_ports(phydev); in phy_probe()
3731 phy_advertise_supported(phydev); in phy_probe()
3736 err = genphy_c45_read_eee_adv(phydev, phydev->advertising_eee); in phy_probe()
3741 of_set_phy_eee_broken(phydev); in phy_probe()
3746 linkmode_and(phydev->advertising_eee, phydev->supported_eee, in phy_probe()
3747 phydev->advertising_eee); in phy_probe()
3748 linkmode_andnot(phydev->advertising_eee, phydev->advertising_eee, in phy_probe()
3749 phydev->eee_disabled_modes); in phy_probe()
3754 phydev->eee_cfg.eee_enabled = !linkmode_empty(phydev->advertising_eee); in phy_probe()
3757 of_set_phy_timing_role(phydev); in phy_probe()
3770 if (!test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported) && in phy_probe()
3771 !test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported)) { in phy_probe()
3773 phydev->supported); in phy_probe()
3775 phydev->supported); in phy_probe()
3779 phydev->state = PHY_READY; in phy_probe()
3784 if (IS_ENABLED(CONFIG_PHYLIB_LEDS) && !phy_driver_is_genphy(phydev)) in phy_probe()
3785 err = of_phy_leds(phydev); in phy_probe()
3790 phy_device_reset(phydev, 1); in phy_probe()
3797 struct phy_device *phydev = to_phy_device(dev); in phy_remove() local
3799 cancel_delayed_work_sync(&phydev->state_queue); in phy_remove()
3801 if (IS_ENABLED(CONFIG_PHYLIB_LEDS) && !phy_driver_is_genphy(phydev)) in phy_remove()
3802 phy_leds_unregister(phydev); in phy_remove()
3804 phydev->state = PHY_DOWN; in phy_remove()
3806 phy_cleanup_ports(phydev); in phy_remove()
3808 sfp_bus_del_upstream(phydev->sfp_bus); in phy_remove()
3809 phydev->sfp_bus = NULL; in phy_remove()
3811 if (phydev->drv && phydev->drv->remove) in phy_remove()
3812 phydev->drv->remove(phydev); in phy_remove()
3815 phy_device_reset(phydev, 1); in phy_remove()
3817 phydev->drv = NULL; in phy_remove()