Lines Matching refs:phydev

44 void phy_device_free(struct phy_device *phydev)  in phy_device_free()  argument
46 put_device(&phydev->dev); in phy_device_free()
115 static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup) in phy_needs_fixup() argument
117 if (strcmp(fixup->bus_id, dev_name(&phydev->dev)) != 0) in phy_needs_fixup()
122 (phydev->phy_id & fixup->phy_uid_mask)) in phy_needs_fixup()
130 static int phy_scan_fixups(struct phy_device *phydev) in phy_scan_fixups() argument
136 if (phy_needs_fixup(phydev, fixup)) { in phy_scan_fixups()
137 int err = fixup->run(phydev); in phy_scan_fixups()
143 phydev->has_fixups = true; in phy_scan_fixups()
348 int phy_device_register(struct phy_device *phydev) in phy_device_register() argument
353 if (phydev->bus->phy_map[phydev->addr]) in phy_device_register()
355 phydev->bus->phy_map[phydev->addr] = phydev; in phy_device_register()
358 err = phy_scan_fixups(phydev); in phy_device_register()
360 pr_err("PHY %d failed to initialize\n", phydev->addr); in phy_device_register()
364 err = device_add(&phydev->dev); in phy_device_register()
366 pr_err("PHY %d failed to add\n", phydev->addr); in phy_device_register()
373 phydev->bus->phy_map[phydev->addr] = NULL; in phy_device_register()
406 static void phy_prepare_link(struct phy_device *phydev, in phy_prepare_link() argument
409 phydev->adjust_link = handler; in phy_prepare_link()
419 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, in phy_connect_direct() argument
425 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_connect_direct()
429 phy_prepare_link(phydev, handler); in phy_connect_direct()
430 phy_start_machine(phydev); in phy_connect_direct()
431 if (phydev->irq > 0) in phy_connect_direct()
432 phy_start_interrupts(phydev); in phy_connect_direct()
457 struct phy_device *phydev; in phy_connect() local
469 phydev = to_phy_device(d); in phy_connect()
471 rc = phy_connect_direct(dev, phydev, handler, interface); in phy_connect()
475 return phydev; in phy_connect()
484 void phy_disconnect(struct phy_device *phydev) in phy_disconnect() argument
486 if (phydev->irq > 0) in phy_disconnect()
487 phy_stop_interrupts(phydev); in phy_disconnect()
489 phy_stop_machine(phydev); in phy_disconnect()
491 phydev->adjust_link = NULL; in phy_disconnect()
493 phy_detach(phydev); in phy_disconnect()
515 static int phy_poll_reset(struct phy_device *phydev) in phy_poll_reset() argument
523 ret = phy_read(phydev, MII_BMCR); in phy_poll_reset()
537 int phy_init_hw(struct phy_device *phydev) in phy_init_hw() argument
541 if (!phydev->drv || !phydev->drv->config_init) in phy_init_hw()
544 if (phydev->drv->soft_reset) in phy_init_hw()
545 ret = phydev->drv->soft_reset(phydev); in phy_init_hw()
547 ret = genphy_soft_reset(phydev); in phy_init_hw()
552 ret = phy_scan_fixups(phydev); in phy_init_hw()
556 return phydev->drv->config_init(phydev); in phy_init_hw()
574 int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, in phy_attach_direct() argument
577 struct device *d = &phydev->dev; in phy_attach_direct()
585 if (phydev->is_c45) in phy_attach_direct()
598 if (phydev->attached_dev) { in phy_attach_direct()
604 bus_module = phydev->bus->dev.driver ? in phy_attach_direct()
605 phydev->bus->dev.driver->owner : NULL; in phy_attach_direct()
611 phydev->attached_dev = dev; in phy_attach_direct()
612 dev->phydev = phydev; in phy_attach_direct()
614 phydev->dev_flags = flags; in phy_attach_direct()
616 phydev->interface = interface; in phy_attach_direct()
618 phydev->state = PHY_READY; in phy_attach_direct()
624 err = phy_init_hw(phydev); in phy_attach_direct()
626 phy_detach(phydev); in phy_attach_direct()
628 phy_resume(phydev); in phy_attach_direct()
647 struct phy_device *phydev; in phy_attach() local
659 phydev = to_phy_device(d); in phy_attach()
661 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_attach()
665 return phydev; in phy_attach()
673 void phy_detach(struct phy_device *phydev) in phy_detach() argument
677 if (phydev->bus->dev.driver) in phy_detach()
678 module_put(phydev->bus->dev.driver->owner); in phy_detach()
680 phydev->attached_dev->phydev = NULL; in phy_detach()
681 phydev->attached_dev = NULL; in phy_detach()
682 phy_suspend(phydev); in phy_detach()
690 if (phydev->dev.driver == &genphy_driver[i].driver) { in phy_detach()
691 device_release_driver(&phydev->dev); in phy_detach()
698 int phy_suspend(struct phy_device *phydev) in phy_suspend() argument
700 struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); in phy_suspend()
705 phy_ethtool_get_wol(phydev, &wol); in phy_suspend()
710 ret = phydrv->suspend(phydev); in phy_suspend()
715 phydev->suspended = true; in phy_suspend()
721 int phy_resume(struct phy_device *phydev) in phy_resume() argument
723 struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); in phy_resume()
727 ret = phydrv->resume(phydev); in phy_resume()
732 phydev->suspended = false; in phy_resume()
749 static int genphy_config_advert(struct phy_device *phydev) in genphy_config_advert() argument
756 phydev->advertising &= phydev->supported; in genphy_config_advert()
757 advertise = phydev->advertising; in genphy_config_advert()
760 adv = phy_read(phydev, MII_ADVERTISE); in genphy_config_advert()
770 err = phy_write(phydev, MII_ADVERTISE, adv); in genphy_config_advert()
777 bmsr = phy_read(phydev, MII_BMSR); in genphy_config_advert()
789 adv = phy_read(phydev, MII_CTRL1000); in genphy_config_advert()
796 if (phydev->supported & (SUPPORTED_1000baseT_Half | in genphy_config_advert()
804 err = phy_write(phydev, MII_CTRL1000, adv); in genphy_config_advert()
819 int genphy_setup_forced(struct phy_device *phydev) in genphy_setup_forced() argument
823 phydev->pause = 0; in genphy_setup_forced()
824 phydev->asym_pause = 0; in genphy_setup_forced()
826 if (SPEED_1000 == phydev->speed) in genphy_setup_forced()
828 else if (SPEED_100 == phydev->speed) in genphy_setup_forced()
831 if (DUPLEX_FULL == phydev->duplex) in genphy_setup_forced()
834 return phy_write(phydev, MII_BMCR, ctl); in genphy_setup_forced()
842 int genphy_restart_aneg(struct phy_device *phydev) in genphy_restart_aneg() argument
844 int ctl = phy_read(phydev, MII_BMCR); in genphy_restart_aneg()
854 return phy_write(phydev, MII_BMCR, ctl); in genphy_restart_aneg()
866 int genphy_config_aneg(struct phy_device *phydev) in genphy_config_aneg() argument
870 if (AUTONEG_ENABLE != phydev->autoneg) in genphy_config_aneg()
871 return genphy_setup_forced(phydev); in genphy_config_aneg()
873 result = genphy_config_advert(phydev); in genphy_config_aneg()
880 int ctl = phy_read(phydev, MII_BMCR); in genphy_config_aneg()
893 result = genphy_restart_aneg(phydev); in genphy_config_aneg()
907 int genphy_aneg_done(struct phy_device *phydev) in genphy_aneg_done() argument
909 int retval = phy_read(phydev, MII_BMSR); in genphy_aneg_done()
915 static int gen10g_config_aneg(struct phy_device *phydev) in gen10g_config_aneg() argument
928 int genphy_update_link(struct phy_device *phydev) in genphy_update_link() argument
933 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
938 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
943 phydev->link = 0; in genphy_update_link()
945 phydev->link = 1; in genphy_update_link()
960 int genphy_read_status(struct phy_device *phydev) in genphy_read_status() argument
970 err = genphy_update_link(phydev); in genphy_read_status()
974 phydev->lp_advertising = 0; in genphy_read_status()
976 if (AUTONEG_ENABLE == phydev->autoneg) { in genphy_read_status()
977 if (phydev->supported & (SUPPORTED_1000baseT_Half in genphy_read_status()
979 lpagb = phy_read(phydev, MII_STAT1000); in genphy_read_status()
983 adv = phy_read(phydev, MII_CTRL1000); in genphy_read_status()
987 phydev->lp_advertising = in genphy_read_status()
992 lpa = phy_read(phydev, MII_LPA); in genphy_read_status()
996 phydev->lp_advertising |= mii_lpa_to_ethtool_lpa_t(lpa); in genphy_read_status()
998 adv = phy_read(phydev, MII_ADVERTISE); in genphy_read_status()
1004 phydev->speed = SPEED_10; in genphy_read_status()
1005 phydev->duplex = DUPLEX_HALF; in genphy_read_status()
1006 phydev->pause = 0; in genphy_read_status()
1007 phydev->asym_pause = 0; in genphy_read_status()
1010 phydev->speed = SPEED_1000; in genphy_read_status()
1013 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1015 phydev->speed = SPEED_100; in genphy_read_status()
1018 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1021 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1023 if (phydev->duplex == DUPLEX_FULL) { in genphy_read_status()
1024 phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0; in genphy_read_status()
1025 phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0; in genphy_read_status()
1028 int bmcr = phy_read(phydev, MII_BMCR); in genphy_read_status()
1034 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1036 phydev->duplex = DUPLEX_HALF; in genphy_read_status()
1039 phydev->speed = SPEED_1000; in genphy_read_status()
1041 phydev->speed = SPEED_100; in genphy_read_status()
1043 phydev->speed = SPEED_10; in genphy_read_status()
1045 phydev->pause = 0; in genphy_read_status()
1046 phydev->asym_pause = 0; in genphy_read_status()
1053 static int gen10g_read_status(struct phy_device *phydev) in gen10g_read_status() argument
1056 u32 mmd_mask = phydev->c45_ids.devices_in_package; in gen10g_read_status()
1058 phydev->link = 1; in gen10g_read_status()
1061 phydev->speed = SPEED_10000; in gen10g_read_status()
1062 phydev->duplex = DUPLEX_FULL; in gen10g_read_status()
1071 phy_read_mmd(phydev, devad, MDIO_STAT1); in gen10g_read_status()
1072 reg = phy_read_mmd(phydev, devad, MDIO_STAT1); in gen10g_read_status()
1074 phydev->link = 0; in gen10g_read_status()
1089 int genphy_soft_reset(struct phy_device *phydev) in genphy_soft_reset() argument
1093 ret = phy_write(phydev, MII_BMCR, BMCR_RESET); in genphy_soft_reset()
1097 return phy_poll_reset(phydev); in genphy_soft_reset()
1101 int genphy_config_init(struct phy_device *phydev) in genphy_config_init() argument
1111 val = phy_read(phydev, MII_BMSR); in genphy_config_init()
1128 val = phy_read(phydev, MII_ESTATUS); in genphy_config_init()
1138 phydev->supported &= features; in genphy_config_init()
1139 phydev->advertising &= features; in genphy_config_init()
1144 static int gen10g_soft_reset(struct phy_device *phydev) in gen10g_soft_reset() argument
1151 static int gen10g_config_init(struct phy_device *phydev) in gen10g_config_init() argument
1154 phydev->supported = SUPPORTED_10000baseT_Full; in gen10g_config_init()
1155 phydev->advertising = SUPPORTED_10000baseT_Full; in gen10g_config_init()
1160 int genphy_suspend(struct phy_device *phydev) in genphy_suspend() argument
1164 mutex_lock(&phydev->lock); in genphy_suspend()
1166 value = phy_read(phydev, MII_BMCR); in genphy_suspend()
1167 phy_write(phydev, MII_BMCR, value | BMCR_PDOWN); in genphy_suspend()
1169 mutex_unlock(&phydev->lock); in genphy_suspend()
1175 static int gen10g_suspend(struct phy_device *phydev) in gen10g_suspend() argument
1180 int genphy_resume(struct phy_device *phydev) in genphy_resume() argument
1184 mutex_lock(&phydev->lock); in genphy_resume()
1186 value = phy_read(phydev, MII_BMCR); in genphy_resume()
1187 phy_write(phydev, MII_BMCR, value & ~BMCR_PDOWN); in genphy_resume()
1189 mutex_unlock(&phydev->lock); in genphy_resume()
1195 static int gen10g_resume(struct phy_device *phydev) in gen10g_resume() argument
1200 static void of_set_phy_supported(struct phy_device *phydev) in of_set_phy_supported() argument
1202 struct device_node *node = phydev->dev.of_node; in of_set_phy_supported()
1216 phydev->supported &= PHY_DEFAULT_FEATURES; in of_set_phy_supported()
1223 phydev->supported |= PHY_1000BT_FEATURES; in of_set_phy_supported()
1225 phydev->supported |= PHY_100BT_FEATURES; in of_set_phy_supported()
1227 phydev->supported |= PHY_10BT_FEATURES; in of_set_phy_supported()
1242 struct phy_device *phydev = to_phy_device(dev); in phy_probe() local
1243 struct device_driver *drv = phydev->dev.driver; in phy_probe()
1247 phydev->drv = phydrv; in phy_probe()
1253 phy_interrupt_is_valid(phydev)) in phy_probe()
1254 phydev->irq = PHY_POLL; in phy_probe()
1257 phydev->is_internal = true; in phy_probe()
1259 mutex_lock(&phydev->lock); in phy_probe()
1265 phydev->supported = phydrv->features; in phy_probe()
1266 of_set_phy_supported(phydev); in phy_probe()
1267 phydev->advertising = phydev->supported; in phy_probe()
1270 phydev->state = PHY_READY; in phy_probe()
1272 if (phydev->drv->probe) in phy_probe()
1273 err = phydev->drv->probe(phydev); in phy_probe()
1275 mutex_unlock(&phydev->lock); in phy_probe()
1282 struct phy_device *phydev = to_phy_device(dev); in phy_remove() local
1284 mutex_lock(&phydev->lock); in phy_remove()
1285 phydev->state = PHY_DOWN; in phy_remove()
1286 mutex_unlock(&phydev->lock); in phy_remove()
1288 if (phydev->drv->remove) in phy_remove()
1289 phydev->drv->remove(phydev); in phy_remove()
1290 phydev->drv = NULL; in phy_remove()