Lines Matching refs:phydev

65 void phy_print_status(struct phy_device *phydev)  in phy_print_status()  argument
67 if (phydev->link) { in phy_print_status()
68 netdev_info(phydev->attached_dev, in phy_print_status()
70 phy_speed_to_str(phydev->speed), in phy_print_status()
71 DUPLEX_FULL == phydev->duplex ? "Full" : "Half", in phy_print_status()
72 phydev->pause ? "rx/tx" : "off"); in phy_print_status()
74 netdev_info(phydev->attached_dev, "Link is Down\n"); in phy_print_status()
88 static int phy_clear_interrupt(struct phy_device *phydev) in phy_clear_interrupt() argument
90 if (phydev->drv->ack_interrupt) in phy_clear_interrupt()
91 return phydev->drv->ack_interrupt(phydev); in phy_clear_interrupt()
103 static int phy_config_interrupt(struct phy_device *phydev, u32 interrupts) in phy_config_interrupt() argument
105 phydev->interrupts = interrupts; in phy_config_interrupt()
106 if (phydev->drv->config_intr) in phy_config_interrupt()
107 return phydev->drv->config_intr(phydev); in phy_config_interrupt()
121 static inline int phy_aneg_done(struct phy_device *phydev) in phy_aneg_done() argument
123 if (phydev->drv->aneg_done) in phy_aneg_done()
124 return phydev->drv->aneg_done(phydev); in phy_aneg_done()
126 return genphy_aneg_done(phydev); in phy_aneg_done()
265 static void phy_sanitize_settings(struct phy_device *phydev) in phy_sanitize_settings() argument
267 u32 features = phydev->supported; in phy_sanitize_settings()
272 phydev->autoneg = AUTONEG_DISABLE; in phy_sanitize_settings()
274 idx = phy_find_valid(phy_find_setting(phydev->speed, phydev->duplex), in phy_sanitize_settings()
277 phydev->speed = settings[idx].speed; in phy_sanitize_settings()
278 phydev->duplex = settings[idx].duplex; in phy_sanitize_settings()
293 int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd) in phy_ethtool_sset() argument
297 if (cmd->phy_address != phydev->addr) in phy_ethtool_sset()
301 cmd->advertising &= phydev->supported; in phy_ethtool_sset()
318 phydev->autoneg = cmd->autoneg; in phy_ethtool_sset()
320 phydev->speed = speed; in phy_ethtool_sset()
322 phydev->advertising = cmd->advertising; in phy_ethtool_sset()
325 phydev->advertising |= ADVERTISED_Autoneg; in phy_ethtool_sset()
327 phydev->advertising &= ~ADVERTISED_Autoneg; in phy_ethtool_sset()
329 phydev->duplex = cmd->duplex; in phy_ethtool_sset()
332 phy_start_aneg(phydev); in phy_ethtool_sset()
338 int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd) in phy_ethtool_gset() argument
340 cmd->supported = phydev->supported; in phy_ethtool_gset()
342 cmd->advertising = phydev->advertising; in phy_ethtool_gset()
343 cmd->lp_advertising = phydev->lp_advertising; in phy_ethtool_gset()
345 ethtool_cmd_speed_set(cmd, phydev->speed); in phy_ethtool_gset()
346 cmd->duplex = phydev->duplex; in phy_ethtool_gset()
347 if (phydev->interface == PHY_INTERFACE_MODE_MOCA) in phy_ethtool_gset()
351 cmd->phy_address = phydev->addr; in phy_ethtool_gset()
352 cmd->transceiver = phy_is_internal(phydev) ? in phy_ethtool_gset()
354 cmd->autoneg = phydev->autoneg; in phy_ethtool_gset()
370 int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) in phy_mii_ioctl() argument
378 mii_data->phy_id = phydev->addr; in phy_mii_ioctl()
382 mii_data->val_out = mdiobus_read(phydev->bus, mii_data->phy_id, in phy_mii_ioctl()
387 if (mii_data->phy_id == phydev->addr) { in phy_mii_ioctl()
391 if (phydev->autoneg == AUTONEG_ENABLE) in phy_mii_ioctl()
393 phydev->autoneg = AUTONEG_DISABLE; in phy_mii_ioctl()
395 phydev->duplex = DUPLEX_FULL; in phy_mii_ioctl()
397 phydev->duplex = DUPLEX_HALF; in phy_mii_ioctl()
399 phydev->speed = SPEED_1000; in phy_mii_ioctl()
401 phydev->speed = SPEED_100; in phy_mii_ioctl()
402 else phydev->speed = SPEED_10; in phy_mii_ioctl()
405 if (phydev->autoneg == AUTONEG_DISABLE) in phy_mii_ioctl()
407 phydev->autoneg = AUTONEG_ENABLE; in phy_mii_ioctl()
411 phydev->advertising = mii_adv_to_ethtool_adv_t(val); in phy_mii_ioctl()
420 mdiobus_write(phydev->bus, mii_data->phy_id, in phy_mii_ioctl()
425 return phy_init_hw(phydev); in phy_mii_ioctl()
428 return phy_start_aneg(phydev); in phy_mii_ioctl()
433 if (phydev->drv->hwtstamp) in phy_mii_ioctl()
434 return phydev->drv->hwtstamp(phydev, ifr); in phy_mii_ioctl()
452 int phy_start_aneg(struct phy_device *phydev) in phy_start_aneg() argument
456 mutex_lock(&phydev->lock); in phy_start_aneg()
458 if (AUTONEG_DISABLE == phydev->autoneg) in phy_start_aneg()
459 phy_sanitize_settings(phydev); in phy_start_aneg()
462 phydev->lp_advertising = 0; in phy_start_aneg()
464 err = phydev->drv->config_aneg(phydev); in phy_start_aneg()
468 if (phydev->state != PHY_HALTED) { in phy_start_aneg()
469 if (AUTONEG_ENABLE == phydev->autoneg) { in phy_start_aneg()
470 phydev->state = PHY_AN; in phy_start_aneg()
471 phydev->link_timeout = PHY_AN_TIMEOUT; in phy_start_aneg()
473 phydev->state = PHY_FORCING; in phy_start_aneg()
474 phydev->link_timeout = PHY_FORCE_TIMEOUT; in phy_start_aneg()
479 mutex_unlock(&phydev->lock); in phy_start_aneg()
494 void phy_start_machine(struct phy_device *phydev) in phy_start_machine() argument
496 queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, HZ); in phy_start_machine()
507 void phy_stop_machine(struct phy_device *phydev) in phy_stop_machine() argument
509 cancel_delayed_work_sync(&phydev->state_queue); in phy_stop_machine()
511 mutex_lock(&phydev->lock); in phy_stop_machine()
512 if (phydev->state > PHY_UP) in phy_stop_machine()
513 phydev->state = PHY_UP; in phy_stop_machine()
514 mutex_unlock(&phydev->lock); in phy_stop_machine()
526 static void phy_error(struct phy_device *phydev) in phy_error() argument
528 mutex_lock(&phydev->lock); in phy_error()
529 phydev->state = PHY_HALTED; in phy_error()
530 mutex_unlock(&phydev->lock); in phy_error()
543 struct phy_device *phydev = phy_dat; in phy_interrupt() local
545 if (PHY_HALTED == phydev->state) in phy_interrupt()
554 atomic_inc(&phydev->irq_disable); in phy_interrupt()
556 queue_work(system_power_efficient_wq, &phydev->phy_queue); in phy_interrupt()
565 static int phy_enable_interrupts(struct phy_device *phydev) in phy_enable_interrupts() argument
567 int err = phy_clear_interrupt(phydev); in phy_enable_interrupts()
572 return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED); in phy_enable_interrupts()
579 static int phy_disable_interrupts(struct phy_device *phydev) in phy_disable_interrupts() argument
584 err = phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); in phy_disable_interrupts()
589 err = phy_clear_interrupt(phydev); in phy_disable_interrupts()
596 phy_error(phydev); in phy_disable_interrupts()
611 int phy_start_interrupts(struct phy_device *phydev) in phy_start_interrupts() argument
613 atomic_set(&phydev->irq_disable, 0); in phy_start_interrupts()
614 if (request_irq(phydev->irq, phy_interrupt, 0, "phy_interrupt", in phy_start_interrupts()
615 phydev) < 0) { in phy_start_interrupts()
617 phydev->bus->name, phydev->irq); in phy_start_interrupts()
618 phydev->irq = PHY_POLL; in phy_start_interrupts()
622 return phy_enable_interrupts(phydev); in phy_start_interrupts()
630 int phy_stop_interrupts(struct phy_device *phydev) in phy_stop_interrupts() argument
632 int err = phy_disable_interrupts(phydev); in phy_stop_interrupts()
635 phy_error(phydev); in phy_stop_interrupts()
637 free_irq(phydev->irq, phydev); in phy_stop_interrupts()
644 cancel_work_sync(&phydev->phy_queue); in phy_stop_interrupts()
649 while (atomic_dec_return(&phydev->irq_disable) >= 0) in phy_stop_interrupts()
650 enable_irq(phydev->irq); in phy_stop_interrupts()
662 struct phy_device *phydev = in phy_change() local
665 if (phydev->drv->did_interrupt && in phy_change()
666 !phydev->drv->did_interrupt(phydev)) in phy_change()
669 if (phy_disable_interrupts(phydev)) in phy_change()
672 mutex_lock(&phydev->lock); in phy_change()
673 if ((PHY_RUNNING == phydev->state) || (PHY_NOLINK == phydev->state)) in phy_change()
674 phydev->state = PHY_CHANGELINK; in phy_change()
675 mutex_unlock(&phydev->lock); in phy_change()
677 atomic_dec(&phydev->irq_disable); in phy_change()
678 enable_irq(phydev->irq); in phy_change()
681 if (PHY_HALTED != phydev->state && in phy_change()
682 phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED)) in phy_change()
686 cancel_delayed_work_sync(&phydev->state_queue); in phy_change()
687 queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, 0); in phy_change()
691 atomic_dec(&phydev->irq_disable); in phy_change()
692 enable_irq(phydev->irq); in phy_change()
696 disable_irq(phydev->irq); in phy_change()
697 atomic_inc(&phydev->irq_disable); in phy_change()
699 phy_error(phydev); in phy_change()
706 void phy_stop(struct phy_device *phydev) in phy_stop() argument
708 mutex_lock(&phydev->lock); in phy_stop()
710 if (PHY_HALTED == phydev->state) in phy_stop()
713 if (phy_interrupt_is_valid(phydev)) { in phy_stop()
715 phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); in phy_stop()
718 phy_clear_interrupt(phydev); in phy_stop()
721 phydev->state = PHY_HALTED; in phy_stop()
724 mutex_unlock(&phydev->lock); in phy_stop()
743 void phy_start(struct phy_device *phydev) in phy_start() argument
748 mutex_lock(&phydev->lock); in phy_start()
750 switch (phydev->state) { in phy_start()
752 phydev->state = PHY_PENDING; in phy_start()
755 phydev->state = PHY_UP; in phy_start()
759 err = phy_enable_interrupts(phydev); in phy_start()
763 phydev->state = PHY_RESUMING; in phy_start()
769 mutex_unlock(&phydev->lock); in phy_start()
773 phy_resume(phydev); in phy_start()
784 struct phy_device *phydev = in phy_state_machine() local
789 mutex_lock(&phydev->lock); in phy_state_machine()
791 if (phydev->drv->link_change_notify) in phy_state_machine()
792 phydev->drv->link_change_notify(phydev); in phy_state_machine()
794 switch (phydev->state) { in phy_state_machine()
803 phydev->link_timeout = PHY_AN_TIMEOUT; in phy_state_machine()
807 err = phy_read_status(phydev); in phy_state_machine()
812 if (!phydev->link) { in phy_state_machine()
813 phydev->state = PHY_NOLINK; in phy_state_machine()
814 netif_carrier_off(phydev->attached_dev); in phy_state_machine()
815 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
820 err = phy_aneg_done(phydev); in phy_state_machine()
826 phydev->state = PHY_RUNNING; in phy_state_machine()
827 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
828 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
830 } else if (0 == phydev->link_timeout--) in phy_state_machine()
834 err = phy_read_status(phydev); in phy_state_machine()
838 if (phydev->link) { in phy_state_machine()
839 if (AUTONEG_ENABLE == phydev->autoneg) { in phy_state_machine()
840 err = phy_aneg_done(phydev); in phy_state_machine()
845 phydev->state = PHY_AN; in phy_state_machine()
846 phydev->link_timeout = PHY_AN_TIMEOUT; in phy_state_machine()
850 phydev->state = PHY_RUNNING; in phy_state_machine()
851 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
852 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
856 err = genphy_update_link(phydev); in phy_state_machine()
860 if (phydev->link) { in phy_state_machine()
861 phydev->state = PHY_RUNNING; in phy_state_machine()
862 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
864 if (0 == phydev->link_timeout--) in phy_state_machine()
868 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
874 if (!phy_interrupt_is_valid(phydev)) in phy_state_machine()
875 phydev->state = PHY_CHANGELINK; in phy_state_machine()
878 err = phy_read_status(phydev); in phy_state_machine()
882 if (phydev->link) { in phy_state_machine()
883 phydev->state = PHY_RUNNING; in phy_state_machine()
884 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
886 phydev->state = PHY_NOLINK; in phy_state_machine()
887 netif_carrier_off(phydev->attached_dev); in phy_state_machine()
890 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
892 if (phy_interrupt_is_valid(phydev)) in phy_state_machine()
893 err = phy_config_interrupt(phydev, in phy_state_machine()
897 if (phydev->link) { in phy_state_machine()
898 phydev->link = 0; in phy_state_machine()
899 netif_carrier_off(phydev->attached_dev); in phy_state_machine()
900 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
905 if (AUTONEG_ENABLE == phydev->autoneg) { in phy_state_machine()
906 err = phy_aneg_done(phydev); in phy_state_machine()
914 err = phy_read_status(phydev); in phy_state_machine()
918 if (phydev->link) { in phy_state_machine()
919 phydev->state = PHY_RUNNING; in phy_state_machine()
920 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
922 phydev->state = PHY_NOLINK; in phy_state_machine()
924 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
926 phydev->state = PHY_AN; in phy_state_machine()
927 phydev->link_timeout = PHY_AN_TIMEOUT; in phy_state_machine()
930 err = phy_read_status(phydev); in phy_state_machine()
934 if (phydev->link) { in phy_state_machine()
935 phydev->state = PHY_RUNNING; in phy_state_machine()
936 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
938 phydev->state = PHY_NOLINK; in phy_state_machine()
940 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
945 mutex_unlock(&phydev->lock); in phy_state_machine()
948 err = phy_start_aneg(phydev); in phy_state_machine()
950 phy_suspend(phydev); in phy_state_machine()
953 phy_error(phydev); in phy_state_machine()
955 queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, in phy_state_machine()
959 void phy_mac_interrupt(struct phy_device *phydev, int new_link) in phy_mac_interrupt() argument
961 cancel_work_sync(&phydev->phy_queue); in phy_mac_interrupt()
962 phydev->link = new_link; in phy_mac_interrupt()
963 schedule_work(&phydev->phy_queue); in phy_mac_interrupt()
995 int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, in phy_read_mmd_indirect() argument
998 struct phy_driver *phydrv = phydev->drv; in phy_read_mmd_indirect()
1002 mmd_phy_indirect(phydev->bus, prtad, devad, addr); in phy_read_mmd_indirect()
1005 value = phydev->bus->read(phydev->bus, addr, MII_MMD_DATA); in phy_read_mmd_indirect()
1007 value = phydrv->read_mmd_indirect(phydev, prtad, devad, addr); in phy_read_mmd_indirect()
1029 void phy_write_mmd_indirect(struct phy_device *phydev, int prtad, in phy_write_mmd_indirect() argument
1032 struct phy_driver *phydrv = phydev->drv; in phy_write_mmd_indirect()
1035 mmd_phy_indirect(phydev->bus, prtad, devad, addr); in phy_write_mmd_indirect()
1038 phydev->bus->write(phydev->bus, addr, MII_MMD_DATA, data); in phy_write_mmd_indirect()
1040 phydrv->write_mmd_indirect(phydev, prtad, devad, addr, data); in phy_write_mmd_indirect()
1055 int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) in phy_init_eee() argument
1062 if ((phydev->duplex == DUPLEX_FULL) && in phy_init_eee()
1063 ((phydev->interface == PHY_INTERFACE_MODE_MII) || in phy_init_eee()
1064 (phydev->interface == PHY_INTERFACE_MODE_GMII) || in phy_init_eee()
1065 (phydev->interface >= PHY_INTERFACE_MODE_RGMII && in phy_init_eee()
1066 phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID) || in phy_init_eee()
1067 phy_is_internal(phydev))) { in phy_init_eee()
1073 status = phy_read_status(phydev); in phy_init_eee()
1078 eee_cap = phy_read_mmd_indirect(phydev, MDIO_PCS_EEE_ABLE, in phy_init_eee()
1079 MDIO_MMD_PCS, phydev->addr); in phy_init_eee()
1090 eee_lp = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_LPABLE, in phy_init_eee()
1091 MDIO_MMD_AN, phydev->addr); in phy_init_eee()
1095 eee_adv = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_ADV, in phy_init_eee()
1096 MDIO_MMD_AN, phydev->addr); in phy_init_eee()
1102 if (!phy_check_valid(phydev->speed, phydev->duplex, lp & adv)) in phy_init_eee()
1109 int val = phy_read_mmd_indirect(phydev, MDIO_CTRL1, in phy_init_eee()
1111 phydev->addr); in phy_init_eee()
1116 phy_write_mmd_indirect(phydev, MDIO_CTRL1, in phy_init_eee()
1117 MDIO_MMD_PCS, phydev->addr, in phy_init_eee()
1135 int phy_get_eee_err(struct phy_device *phydev) in phy_get_eee_err() argument
1137 return phy_read_mmd_indirect(phydev, MDIO_PCS_EEE_WK_ERR, in phy_get_eee_err()
1138 MDIO_MMD_PCS, phydev->addr); in phy_get_eee_err()
1150 int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_get_eee() argument
1155 val = phy_read_mmd_indirect(phydev, MDIO_PCS_EEE_ABLE, in phy_ethtool_get_eee()
1156 MDIO_MMD_PCS, phydev->addr); in phy_ethtool_get_eee()
1162 val = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_ADV, in phy_ethtool_get_eee()
1163 MDIO_MMD_AN, phydev->addr); in phy_ethtool_get_eee()
1169 val = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_LPABLE, in phy_ethtool_get_eee()
1170 MDIO_MMD_AN, phydev->addr); in phy_ethtool_get_eee()
1186 int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_set_eee() argument
1190 phy_write_mmd_indirect(phydev, MDIO_AN_EEE_ADV, MDIO_MMD_AN, in phy_ethtool_set_eee()
1191 phydev->addr, val); in phy_ethtool_set_eee()
1197 int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_set_wol() argument
1199 if (phydev->drv->set_wol) in phy_ethtool_set_wol()
1200 return phydev->drv->set_wol(phydev, wol); in phy_ethtool_set_wol()
1206 void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_get_wol() argument
1208 if (phydev->drv->get_wol) in phy_ethtool_get_wol()
1209 phydev->drv->get_wol(phydev, wol); in phy_ethtool_get_wol()