Lines Matching +full:tx +full:- +full:internal +full:- +full:delay +full:- +full:ps
1 // SPDX-License-Identifier: GPL-2.0+
13 #include <linux/delay.h>
203 put_device(&phydev->mdio.dev); in phy_device_free()
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()
240 if (!drv || !phydrv->suspend) in mdio_bus_phy_may_suspend()
244 * suspended as part of a prior call to phy_disconnect() -> in mdio_bus_phy_may_suspend()
245 * phy_detach() -> phy_suspend() because the parent netdev might be the in mdio_bus_phy_may_suspend()
251 if (netdev->wol_enabled) in mdio_bus_phy_may_suspend()
259 if (netdev->dev.parent && device_may_wakeup(netdev->dev.parent)) in mdio_bus_phy_may_suspend()
266 if (device_may_wakeup(&netdev->dev)) in mdio_bus_phy_may_suspend()
270 return !phydev->suspended; in mdio_bus_phy_may_suspend()
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()
288 phydev->suspended_by_mdio_bus = 1; in mdio_bus_phy_suspend()
298 if (!phydev->suspended_by_mdio_bus) in mdio_bus_phy_resume()
301 phydev->suspended_by_mdio_bus = 0; in mdio_bus_phy_resume()
308 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_resume()
317 struct net_device *netdev = phydev->attached_dev; in mdio_bus_phy_restore()
327 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_restore()
350 * phy_register_fixup - creates a new phy_fixup and adds it to the list
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
364 return -ENOMEM; in phy_register_fixup()
366 strlcpy(fixup->bus_id, bus_id, sizeof(fixup->bus_id)); in phy_register_fixup()
367 fixup->phy_uid = phy_uid; in phy_register_fixup()
368 fixup->phy_uid_mask = phy_uid_mask; in phy_register_fixup()
369 fixup->run = run; in phy_register_fixup()
372 list_add_tail(&fixup->list, &phy_fixup_list); in phy_register_fixup()
396 * phy_unregister_fixup - remove a phy_fixup from the list
397 * @bus_id: A string matches fixup->bus_id (or PHY_ANY_ID) in phy_fixup_list
398 * @phy_uid: A phy id matches fixup->phy_id (or PHY_ANY_UID) in phy_fixup_list
399 * @phy_uid_mask: Applied to phy_uid and fixup->phy_uid before comparison
407 ret = -ENODEV; in phy_unregister_fixup()
413 if ((!strcmp(fixup->bus_id, bus_id)) && in phy_unregister_fixup()
414 ((fixup->phy_uid & phy_uid_mask) == in phy_unregister_fixup()
416 list_del(&fixup->list); in phy_unregister_fixup()
447 if (strcmp(fixup->bus_id, phydev_name(phydev)) != 0) in phy_needs_fixup()
448 if (strcmp(fixup->bus_id, PHY_ANY_ID) != 0) in phy_needs_fixup()
451 if ((fixup->phy_uid & fixup->phy_uid_mask) != in phy_needs_fixup()
452 (phydev->phy_id & fixup->phy_uid_mask)) in phy_needs_fixup()
453 if (fixup->phy_uid != PHY_ANY_UID) in phy_needs_fixup()
467 int err = fixup->run(phydev); in phy_scan_fixups()
473 phydev->has_fixups = true; in phy_scan_fixups()
485 const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); in phy_bus_match()
488 if (!(phydrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY)) in phy_bus_match()
491 if (phydrv->match_phy_device) 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()
499 if ((phydrv->phy_id & phydrv->phy_id_mask) == in phy_bus_match()
500 (phydev->c45_ids.device_ids[i] & in phy_bus_match()
501 phydrv->phy_id_mask)) in phy_bus_match()
506 return (phydrv->phy_id & phydrv->phy_id_mask) == in phy_bus_match()
507 (phydev->phy_id & phydrv->phy_id_mask); in phy_bus_match()
516 return sprintf(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id); in phy_id_show()
527 mode = "internal"; in phy_interface_show()
529 mode = phy_modes(phydev->interface); in phy_interface_show()
541 return sprintf(buf, "%d\n", phydev->has_fixups); in phy_has_fixups_show()
568 * Accept -ENOENT because this may occur in case no initramfs exists, in phy_request_driver_module()
571 if (IS_ENABLED(CONFIG_MODULES) && ret < 0 && ret != -ENOENT) { in phy_request_driver_module()
591 return ERR_PTR(-ENOMEM); in phy_device_create()
593 mdiodev = &dev->mdio; in phy_device_create()
594 mdiodev->dev.parent = &bus->dev; in phy_device_create()
595 mdiodev->dev.bus = &mdio_bus_type; in phy_device_create()
596 mdiodev->dev.type = &mdio_bus_phy_type; in phy_device_create()
597 mdiodev->bus = bus; in phy_device_create()
598 mdiodev->bus_match = phy_bus_match; in phy_device_create()
599 mdiodev->addr = addr; in phy_device_create()
600 mdiodev->flags = MDIO_DEVICE_FLAG_PHY; in phy_device_create()
601 mdiodev->device_free = phy_mdio_device_free; in phy_device_create()
602 mdiodev->device_remove = phy_mdio_device_remove; in phy_device_create()
604 dev->speed = SPEED_UNKNOWN; in phy_device_create()
605 dev->duplex = DUPLEX_UNKNOWN; in phy_device_create()
606 dev->pause = 0; in phy_device_create()
607 dev->asym_pause = 0; in phy_device_create()
608 dev->link = 0; in phy_device_create()
609 dev->interface = PHY_INTERFACE_MODE_GMII; in phy_device_create()
611 dev->autoneg = AUTONEG_ENABLE; in phy_device_create()
613 dev->is_c45 = is_c45; in phy_device_create()
614 dev->phy_id = phy_id; in phy_device_create()
616 dev->c45_ids = *c45_ids; in phy_device_create()
617 dev->irq = bus->irq[addr]; in phy_device_create()
619 dev_set_name(&mdiodev->dev, PHY_ID_FMT, bus->id, addr); in phy_device_create()
620 device_initialize(&mdiodev->dev); in phy_device_create()
622 dev->state = PHY_DOWN; in phy_device_create()
624 mutex_init(&dev->lock); in phy_device_create()
625 INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine); in phy_device_create()
632 * -- because it relies on the device staying around for long in phy_device_create()
638 const int num_ids = ARRAY_SIZE(c45_ids->device_ids); in phy_device_create()
642 if (c45_ids->device_ids[i] == 0xffffffff) in phy_device_create()
646 c45_ids->device_ids[i]); in phy_device_create()
655 put_device(&mdiodev->dev); in phy_device_create()
663 /* phy_c45_probe_present - checks to see if a MMD is present in the package
685 /* get_phy_c45_devs_in_pkg - reads a MMD's devices in package registers.
694 * Returns: 0 on success, -EIO on failure.
703 return -EIO; in get_phy_c45_devs_in_pkg()
708 return -EIO; in get_phy_c45_devs_in_pkg()
715 * get_phy_c45_ids - reads the specified addr for its 802.3-c45 IDs.
724 * Returns zero on success, %-EIO on bus access error, or %-ENODEV if
730 const int num_ids = ARRAY_SIZE(c45_ids->device_ids); in get_phy_c45_ids()
734 /* Find first non-zero Devices In package. Device zero is reserved in get_phy_c45_ids()
741 * address before reading the devices-in-package in get_phy_c45_ids()
748 return -EIO; in get_phy_c45_ids()
755 return -EIO; in get_phy_c45_ids()
765 return -EIO; in get_phy_c45_ids()
769 return -ENODEV; in get_phy_c45_ids()
792 return -EIO; in get_phy_c45_ids()
793 c45_ids->device_ids[i] = phy_reg << 16; in get_phy_c45_ids()
797 return -EIO; in get_phy_c45_ids()
798 c45_ids->device_ids[i] |= phy_reg; in get_phy_c45_ids()
801 c45_ids->devices_in_package = devs_in_pkg; in get_phy_c45_ids()
803 c45_ids->mmds_present = devs_in_pkg & ~BIT(0); in get_phy_c45_ids()
809 * get_phy_c22_id - reads the specified addr for its clause 22 ID.
816 * valid, %-EIO on bus access error, or %-ENODEV if no device responds
826 /* returning -ENODEV doesn't stop bus scanning */ in get_phy_c22_id()
827 return (phy_reg == -EIO || phy_reg == -ENODEV) ? -ENODEV : -EIO; in get_phy_c22_id()
835 /* returning -ENODEV doesn't stop bus scanning */ in get_phy_c22_id()
836 return (phy_reg == -EIO || phy_reg == -ENODEV) ? -ENODEV : -EIO; in get_phy_c22_id()
843 return -ENODEV; in get_phy_c22_id()
849 * get_phy_device - reads the specified PHY device and returns its @phy_device
864 * Returns an allocated &struct phy_device on success, %-ENODEV if there is
865 * no PHY present, or %-EIO on bus access error.
890 * phy_device_register - Register the phy device on the MDIO bus
897 err = mdiobus_register_device(&phydev->mdio); in phy_device_register()
911 err = device_add(&phydev->mdio.dev); in phy_device_register()
923 mdiobus_unregister_device(&phydev->mdio); in phy_device_register()
929 * phy_device_remove - Remove a previously registered phy device from the MDIO bus
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()
946 mdiobus_unregister_device(&phydev->mdio); in phy_device_remove()
951 * phy_find_first - finds the first PHY device on the bus
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()
982 * phy_prepare_link - prepares the PHY layer to monitor link status
996 phydev->adjust_link = handler; in phy_prepare_link()
1000 * phy_connect_direct - connect an ethernet device to a specific phy_device
1013 return -EINVAL; in phy_connect_direct()
1015 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_connect_direct()
1028 * phy_connect - connect an ethernet device to a PHY device
1056 return ERR_PTR(-ENODEV); in phy_connect()
1070 * phy_disconnect - disable interrupts, stop state machine, and detach a PHY
1082 phydev->adjust_link = NULL; in phy_disconnect()
1089 * phy_poll_reset - Safely wait until a PHY reset has properly completed
1101 * even *REQUIRE* a soft-reset to properly restart autonegotiation. In an
1104 * and reapply all driver-specific and board-specific fixups.
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()
1146 if (phydev->drv->config_init) in phy_init_hw()
1147 ret = phydev->drv->config_init(phydev); in phy_init_hw()
1165 switch(phydev->irq) { in phy_attached_info_irq()
1173 snprintf(irq_num, sizeof(irq_num), "%d", phydev->irq); in phy_attached_info_irq()
1184 const char *drv_name = phydev->drv ? phydev->drv->name : "unbound"; in phy_attached_print()
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()
1219 err = sysfs_create_link_nowarn(&dev->dev.kobj, in phy_sysfs_create_links()
1220 &phydev->mdio.dev.kobj, in phy_sysfs_create_links()
1223 dev_err(&dev->dev, "could not add device link to %s err %d\n", in phy_sysfs_create_links()
1224 kobject_name(&phydev->mdio.dev.kobj), in phy_sysfs_create_links()
1226 /* non-fatal - some net drivers can use one netdevice in phy_sysfs_create_links()
1231 phydev->sysfs_links = true; in phy_sysfs_create_links()
1240 return sprintf(buf, "%d\n", !phydev->attached_dev); in phy_standalone_show()
1245 * phy_sfp_attach - attach the SFP bus to the PHY upstream network device
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()
1262 * phy_sfp_detach - detach the SFP bus from the PHY upstream network device
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()
1279 * phy_sfp_probe - probe for a SFP cage attached to this PHY device
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()
1304 * phy_attach_direct - attach a network device to a given PHY device pointer
1321 struct mii_bus *bus = phydev->mdio.bus; in phy_attach_direct()
1322 struct device *d = &phydev->mdio.dev; in phy_attach_direct()
1328 * will have bus->owner match ndev_mod, so we do not want to increment in phy_attach_direct()
1329 * our own module->refcnt here, otherwise we would not be able to in phy_attach_direct()
1333 ndev_owner = dev->dev.parent->driver->owner; in phy_attach_direct()
1334 if (ndev_owner != bus->owner && !try_module_get(bus->owner)) { in phy_attach_direct()
1336 return -EIO; in phy_attach_direct()
1344 if (!d->driver) { in phy_attach_direct()
1345 if (phydev->is_c45) in phy_attach_direct()
1346 d->driver = &genphy_c45_driver.mdiodrv.driver; in phy_attach_direct()
1348 d->driver = &genphy_driver.mdiodrv.driver; in phy_attach_direct()
1353 if (!try_module_get(d->driver->owner)) { in phy_attach_direct()
1355 err = -EIO; in phy_attach_direct()
1360 err = d->driver->probe(d); in phy_attach_direct()
1368 if (phydev->attached_dev) { in phy_attach_direct()
1369 dev_err(&dev->dev, "PHY already attached\n"); in phy_attach_direct()
1370 err = -EBUSY; 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()
1384 * calling register_netdevice() -> netdev_register_kobject() and in phy_attach_direct()
1385 * does the dev->dev.kobj initialization. Here we only check for in phy_attach_direct()
1391 phydev->sysfs_links = false; 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()
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()
1437 module_put(d->driver->owner); in phy_attach_direct()
1440 if (ndev_owner != bus->owner) in phy_attach_direct()
1441 module_put(bus->owner); in phy_attach_direct()
1447 * phy_attach - attach a network device to a particular PHY device
1464 return ERR_PTR(-EINVAL); in phy_attach()
1472 return ERR_PTR(-ENODEV); in phy_attach()
1476 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_attach()
1488 struct device *d = &phydev->mdio.dev; in phy_driver_is_genphy_kind()
1491 if (!phydev->drv) in phy_driver_is_genphy_kind()
1495 ret = d->driver == driver; in phy_driver_is_genphy_kind()
1516 * phy_package_join - join a common PHY group
1519 * @priv_size: if non-zero allocate this amount of bytes for private data
1535 * allocated. If priv_size is non-zero, the given amount of bytes are
1543 struct mii_bus *bus = phydev->mdio.bus; in phy_package_join()
1548 return -EINVAL; in phy_package_join()
1550 mutex_lock(&bus->shared_lock); in phy_package_join()
1551 shared = bus->shared[addr]; in phy_package_join()
1553 ret = -ENOMEM; in phy_package_join()
1558 shared->priv = kzalloc(priv_size, GFP_KERNEL); in phy_package_join()
1559 if (!shared->priv) in phy_package_join()
1561 shared->priv_size = priv_size; in phy_package_join()
1563 shared->addr = addr; in phy_package_join()
1564 refcount_set(&shared->refcnt, 1); in phy_package_join()
1565 bus->shared[addr] = shared; in phy_package_join()
1567 ret = -EINVAL; in phy_package_join()
1568 if (priv_size && priv_size != shared->priv_size) in phy_package_join()
1570 refcount_inc(&shared->refcnt); in phy_package_join()
1572 mutex_unlock(&bus->shared_lock); in phy_package_join()
1574 phydev->shared = shared; in phy_package_join()
1581 mutex_unlock(&bus->shared_lock); in phy_package_join()
1587 * phy_package_leave - leave a common PHY group
1592 * freed. Resets the phydev->shared pointer to NULL.
1596 struct phy_package_shared *shared = phydev->shared; in phy_package_leave()
1597 struct mii_bus *bus = phydev->mdio.bus; in phy_package_leave()
1602 if (refcount_dec_and_mutex_lock(&shared->refcnt, &bus->shared_lock)) { in phy_package_leave()
1603 bus->shared[shared->addr] = NULL; in phy_package_leave()
1604 mutex_unlock(&bus->shared_lock); in phy_package_leave()
1605 kfree(shared->priv); in phy_package_leave()
1609 phydev->shared = NULL; in phy_package_leave()
1619 * devm_phy_package_join - resource managed phy_package_join()
1623 * @priv_size: if non-zero allocate this amount of bytes for private data
1638 return -ENOMEM; in devm_phy_package_join()
1654 * phy_detach - detach a PHY device from its network device
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()
1678 phydev->attached_dev->phydev = NULL; in phy_detach()
1679 phydev->attached_dev = NULL; in phy_detach()
1681 phydev->phylink = NULL; in phy_detach()
1685 if (phydev->mdio.dev.driver) in phy_detach()
1686 module_put(phydev->mdio.dev.driver->owner); in phy_detach()
1688 /* If the device had no specific driver before (i.e. - it in phy_detach()
1695 device_release_driver(&phydev->mdio.dev); in phy_detach()
1699 * a use-after-free bug by reading the underlying bus first. in phy_detach()
1701 bus = phydev->mdio.bus; in phy_detach()
1703 put_device(&phydev->mdio.dev); in phy_detach()
1705 ndev_owner = dev->dev.parent->driver->owner; in phy_detach()
1706 if (ndev_owner != bus->owner) in phy_detach()
1707 module_put(bus->owner); in phy_detach()
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()
1726 if (wol.wolopts || (netdev && netdev->wol_enabled)) in phy_suspend()
1727 return -EBUSY; in phy_suspend()
1729 if (!phydrv || !phydrv->suspend) in phy_suspend()
1732 ret = phydrv->suspend(phydev); in phy_suspend()
1734 phydev->suspended = true; in phy_suspend()
1742 struct phy_driver *phydrv = phydev->drv; in __phy_resume()
1745 WARN_ON(!mutex_is_locked(&phydev->lock)); in __phy_resume()
1747 if (!phydrv || !phydrv->resume) in __phy_resume()
1750 ret = phydrv->resume(phydev); in __phy_resume()
1752 phydev->suspended = false; in __phy_resume()
1762 mutex_lock(&phydev->lock); in phy_resume()
1764 mutex_unlock(&phydev->lock); in phy_resume()
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()
1778 ret = -EBUSY; in phy_loopback()
1782 if (!enable && !phydev->loopback_enabled) { in phy_loopback()
1783 ret = -EINVAL; in phy_loopback()
1787 if (phydev->drv && phydrv->set_loopback) in phy_loopback()
1788 ret = phydrv->set_loopback(phydev, enable); in phy_loopback()
1790 ret = -EOPNOTSUPP; in phy_loopback()
1795 phydev->loopback_enabled = enable; in phy_loopback()
1798 mutex_unlock(&phydev->lock); in phy_loopback()
1804 * phy_reset_after_clk_enable - perform a PHY reset if needed
1814 if (!phydev || !phydev->drv) in phy_reset_after_clk_enable()
1815 return -ENODEV; in phy_reset_after_clk_enable()
1817 if (phydev->drv->flags & PHY_RST_AFTER_CLK_EN) { in phy_reset_after_clk_enable()
1830 * genphy_config_advert - sanitize and advertise auto-negotiation parameters
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()
1863 /* Per 802.3-2008, Section 22.2.4.2.16 Extended status all in genphy_config_advert()
1870 adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); in genphy_config_advert()
1884 * genphy_c37_config_advert - sanitize and advertise auto-negotiation parameters
1891 * for Clause 37 1000Base-X mode.
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()
1918 * genphy_config_eee_advert - disable unwanted eee mode advertisement
1930 if (!phydev->eee_broken_modes) 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
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()
1972 if (!phydev->is_gigabit_capable) in genphy_setup_master_slave()
1975 switch (phydev->master_slave_set) { in genphy_setup_master_slave()
1992 return -EOPNOTSUPP; in genphy_setup_master_slave()
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()
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()
2053 * genphy_restart_aneg - Enable and Restart Autonegotiation
2065 * genphy_check_and_restart_aneg - Enable and restart auto-negotiation
2069 * Check, and restart auto-negotiation if needed.
2095 * __genphy_config_aneg - restart auto-negotiation or write BMCR
2099 * Description: If auto-negotiation is enabled, we configure the
2100 * advertising, and then restart auto-negotiation. If it is not
2116 if (AUTONEG_ENABLE != phydev->autoneg) in __genphy_config_aneg()
2130 * genphy_c37_config_aneg - restart auto-negotiation or write BMCR
2133 * Description: If auto-negotiation is enabled, we configure the
2134 * advertising, and then restart auto-negotiation. If it is not
2136 * for use with Clause 37 1000Base-X mode.
2142 if (phydev->autoneg != AUTONEG_ENABLE) in genphy_c37_config_aneg()
2178 * genphy_aneg_done - return auto-negotiation status
2182 * auto-negotiation is incomplete, or if there was an error.
2183 * Returns BMSR_ANEGCOMPLETE if auto-negotiation is done.
2194 * genphy_update_link - update link status in @phydev
2197 * Description: Update the value in phydev->link to reflect the
2216 * drops can be detected. Do not double-read the status in genphy_update_link()
2220 if (!phy_polling_mode(phydev) || !phydev->link) { 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()
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()
2273 return -ENOLINK; in genphy_read_lpa()
2276 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, 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()
2294 * genphy_read_status_fixed - read the link parameters for !aneg mode
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()
2324 * genphy_read_status - check the link status and update current link state
2334 int err, old_link = phydev->link; 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()
2358 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in genphy_read_status()
2360 } else if (phydev->autoneg == AUTONEG_DISABLE) { in genphy_read_status()
2371 * genphy_c37_read_status - check the link status and update current link state
2376 * advertises. This function is for Clause 37 1000Base-X mode.
2380 int lpa, err, old_link = phydev->link; 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()
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()
2411 } else if (phydev->autoneg == AUTONEG_DISABLE) { 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()
2428 * genphy_soft_reset - software reset the PHY via BMCR_RESET bit
2441 if (phydev->autoneg == AUTONEG_ENABLE) in genphy_soft_reset()
2452 phydev->suspended = 0; in genphy_soft_reset()
2459 if (phydev->autoneg == AUTONEG_DISABLE) in genphy_soft_reset()
2467 * genphy_read_abilities - read PHY abilities from Clause 22 registers
2471 * phydev->supported accordingly.
2481 phydev->supported); 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()
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()
2522 return -EOPNOTSUPP; in genphy_read_mmd_unsupported()
2529 return -EOPNOTSUPP; in genphy_write_mmd_unsupported()
2553 * phy_remove_link_mode - Remove a supported link mode
2563 linkmode_clear_bit(link_mode, phydev->supported); in phy_remove_link_mode()
2577 * phy_advertise_supported - Advertise all supported modes
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()
2594 * phy_support_sym_pause - Enable support of symmetrical pause
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()
2608 * phy_support_asym_pause - Enable support of asym pause
2615 phy_copy_pause_bits(phydev->advertising, phydev->supported); in phy_support_asym_pause()
2620 * phy_set_sym_pause - Configure symmetric Pause
2623 * @tx: Transmit Pause is supported
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()
2635 if (rx && tx && autoneg) 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()
2644 * phy_set_asym_pause - Configure Pause and Asym Pause
2647 * @tx: Transmit Pause is supported
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()
2668 * phy_validate_pause - Test if the PHY/MAC support the pause configuration
2680 phydev->supported) && pp->rx_pause) in phy_validate_pause()
2684 phydev->supported) && in phy_validate_pause()
2685 pp->rx_pause != pp->tx_pause) in phy_validate_pause()
2693 * phy_get_pause - resolve negotiated pause modes
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()
2733 return -EINVAL; in phy_get_int_delay_property()
2738 * phy_get_delay_index - returns the index of the internal delay
2742 * @size: the size of the delay array
2743 * @is_rx: boolean to indicate to get the rx internal delay
2745 * Returns the index within the array of internal delay passed in.
2747 * if the interface defines use of internal delay then a 1 is returned otherwise
2750 * array then size = 0 and the value of the delay property is returned.
2751 * Return -EINVAL if the delay is invalid or cannot be found.
2756 s32 delay; in phy_get_internal_delay() local
2760 delay = phy_get_int_delay_property(dev, "rx-internal-delay-ps"); in phy_get_internal_delay()
2761 if (delay < 0 && size == 0) { in phy_get_internal_delay()
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()
2770 delay = phy_get_int_delay_property(dev, "tx-internal-delay-ps"); in phy_get_internal_delay()
2771 if (delay < 0 && size == 0) { 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()
2780 if (delay < 0) in phy_get_internal_delay()
2781 return delay; in phy_get_internal_delay()
2783 if (delay && size == 0) in phy_get_internal_delay()
2784 return delay; in phy_get_internal_delay()
2786 if (delay < delay_values[0] || delay > delay_values[size - 1]) { in phy_get_internal_delay()
2787 phydev_err(phydev, "Delay %d is out of range\n", delay); in phy_get_internal_delay()
2788 return -EINVAL; in phy_get_internal_delay()
2791 if (delay == delay_values[0]) in phy_get_internal_delay()
2795 if (delay == delay_values[i]) in phy_get_internal_delay()
2799 if (delay > delay_values[i - 1] && in phy_get_internal_delay()
2800 delay < delay_values[i]) { in phy_get_internal_delay()
2801 if (delay - delay_values[i - 1] < in phy_get_internal_delay()
2802 delay_values[i] - delay) in phy_get_internal_delay()
2803 return i - 1; in phy_get_internal_delay()
2809 phydev_err(phydev, "error finding internal delay index for %d\n", in phy_get_internal_delay()
2810 delay); in phy_get_internal_delay()
2812 return -EINVAL; in phy_get_internal_delay()
2818 return phydrv->config_intr && phydrv->ack_interrupt; in phy_drv_supports_irq()
2822 * phy_probe - probe and init a PHY device
2832 struct device_driver *drv = phydev->mdio.dev.driver; in phy_probe()
2836 phydev->drv = phydrv; in phy_probe()
2842 phydev->irq = PHY_POLL; in phy_probe()
2844 if (phydrv->flags & PHY_IS_INTERNAL) in phy_probe()
2845 phydev->is_internal = true; in phy_probe()
2847 mutex_lock(&phydev->lock); in phy_probe()
2852 if (phydev->drv->probe) { in phy_probe()
2853 err = phydev->drv->probe(phydev); in phy_probe()
2862 if (phydrv->features) { in phy_probe()
2863 linkmode_copy(phydev->supported, phydrv->features); in phy_probe()
2864 } else if (phydrv->get_features) { in phy_probe()
2865 err = phydrv->get_features(phydev); in phy_probe()
2866 } else if (phydev->is_c45) { 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()
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()
2921 mutex_unlock(&phydev->lock); in phy_probe()
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()
2945 phydev->drv = NULL; in phy_remove()
2951 * phy_driver_register - register a phy_driver with the PHY layer
2962 if (WARN_ON(new_driver->features && new_driver->get_features)) { in phy_driver_register()
2964 new_driver->name); in phy_driver_register()
2965 return -EINVAL; in phy_driver_register()
2968 new_driver->mdiodrv.flags |= MDIO_DEVICE_IS_PHY; in phy_driver_register()
2969 new_driver->mdiodrv.driver.name = new_driver->name; in phy_driver_register()
2970 new_driver->mdiodrv.driver.bus = &mdio_bus_type; in phy_driver_register()
2971 new_driver->mdiodrv.driver.probe = phy_probe; in phy_driver_register()
2972 new_driver->mdiodrv.driver.remove = phy_remove; in phy_driver_register()
2973 new_driver->mdiodrv.driver.owner = owner; in phy_driver_register()
2974 new_driver->mdiodrv.driver.probe_type = PROBE_FORCE_SYNCHRONOUS; in phy_driver_register()
2976 retval = driver_register(&new_driver->mdiodrv.driver); in phy_driver_register()
2979 new_driver->name, retval); in phy_driver_register()
2984 pr_debug("%s: Registered new driver\n", new_driver->name); in phy_driver_register()
2998 while (i-- > 0) in phy_drivers_register()
3009 driver_unregister(&drv->mdiodrv.driver); in phy_driver_unregister()