Lines Matching full:phydev

156 static int dp83869_read_status(struct phy_device *phydev)  in dp83869_read_status()  argument
158 struct dp83869_private *dp83869 = phydev->priv; in dp83869_read_status()
161 ret = genphy_read_status(phydev); in dp83869_read_status()
165 if (linkmode_test_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, phydev->supported)) { in dp83869_read_status()
166 if (phydev->link) { in dp83869_read_status()
168 phydev->speed = SPEED_100; in dp83869_read_status()
170 phydev->speed = SPEED_UNKNOWN; in dp83869_read_status()
171 phydev->duplex = DUPLEX_UNKNOWN; in dp83869_read_status()
178 static int dp83869_ack_interrupt(struct phy_device *phydev) in dp83869_ack_interrupt() argument
180 int err = phy_read(phydev, MII_DP83869_ISR); in dp83869_ack_interrupt()
188 static int dp83869_config_intr(struct phy_device *phydev) in dp83869_config_intr() argument
192 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in dp83869_config_intr()
193 err = dp83869_ack_interrupt(phydev); in dp83869_config_intr()
197 micr_status = phy_read(phydev, MII_DP83869_MICR); in dp83869_config_intr()
209 err = phy_write(phydev, MII_DP83869_MICR, micr_status); in dp83869_config_intr()
211 err = phy_write(phydev, MII_DP83869_MICR, micr_status); in dp83869_config_intr()
215 err = dp83869_ack_interrupt(phydev); in dp83869_config_intr()
221 static irqreturn_t dp83869_handle_interrupt(struct phy_device *phydev) in dp83869_handle_interrupt() argument
225 irq_status = phy_read(phydev, MII_DP83869_ISR); in dp83869_handle_interrupt()
227 phy_error(phydev); in dp83869_handle_interrupt()
231 irq_enabled = phy_read(phydev, MII_DP83869_MICR); in dp83869_handle_interrupt()
233 phy_error(phydev); in dp83869_handle_interrupt()
240 phy_trigger_machine(phydev); in dp83869_handle_interrupt()
245 static int dp83869_set_wol(struct phy_device *phydev, in dp83869_set_wol() argument
248 struct net_device *ndev = phydev->attached_dev; in dp83869_set_wol()
253 val_rxcfg = phy_read_mmd(phydev, DP83869_DEVADDR, DP83869_RXFCFG); in dp83869_set_wol()
257 val_micr = phy_read(phydev, MII_DP83869_MICR); in dp83869_set_wol()
273 ret = phy_write_mmd(phydev, DP83869_DEVADDR, in dp83869_set_wol()
279 ret = phy_write_mmd(phydev, DP83869_DEVADDR, in dp83869_set_wol()
285 ret = phy_write_mmd(phydev, DP83869_DEVADDR, in dp83869_set_wol()
297 ret = phy_write_mmd(phydev, DP83869_DEVADDR, in dp83869_set_wol()
303 ret = phy_write_mmd(phydev, DP83869_DEVADDR, in dp83869_set_wol()
308 ret = phy_write_mmd(phydev, DP83869_DEVADDR, in dp83869_set_wol()
333 ret = phy_write_mmd(phydev, DP83869_DEVADDR, DP83869_RXFCFG, val_rxcfg); in dp83869_set_wol()
337 return phy_write(phydev, MII_DP83869_MICR, val_micr); in dp83869_set_wol()
340 static void dp83869_get_wol(struct phy_device *phydev, in dp83869_get_wol() argument
349 value = phy_read_mmd(phydev, DP83869_DEVADDR, DP83869_RXFCFG); in dp83869_get_wol()
351 phydev_err(phydev, "Failed to read RX CFG\n"); in dp83869_get_wol()
365 sopass_val = phy_read_mmd(phydev, DP83869_DEVADDR, in dp83869_get_wol()
368 phydev_err(phydev, "Failed to read RX SOP 1\n"); in dp83869_get_wol()
375 sopass_val = phy_read_mmd(phydev, DP83869_DEVADDR, in dp83869_get_wol()
378 phydev_err(phydev, "Failed to read RX SOP 2\n"); in dp83869_get_wol()
385 sopass_val = phy_read_mmd(phydev, DP83869_DEVADDR, in dp83869_get_wol()
388 phydev_err(phydev, "Failed to read RX SOP 3\n"); in dp83869_get_wol()
402 static int dp83869_get_downshift(struct phy_device *phydev, u8 *data) in dp83869_get_downshift() argument
406 val = phy_read(phydev, DP83869_CFG2); in dp83869_get_downshift()
435 static int dp83869_set_downshift(struct phy_device *phydev, u8 cnt) in dp83869_set_downshift() argument
443 return phy_clear_bits(phydev, DP83869_CFG2, in dp83869_set_downshift()
460 phydev_err(phydev, in dp83869_set_downshift()
468 return phy_modify(phydev, DP83869_CFG2, in dp83869_set_downshift()
473 static int dp83869_get_tunable(struct phy_device *phydev, in dp83869_get_tunable() argument
478 return dp83869_get_downshift(phydev, data); in dp83869_get_tunable()
484 static int dp83869_set_tunable(struct phy_device *phydev, in dp83869_set_tunable() argument
489 return dp83869_set_downshift(phydev, *(const u8 *)data); in dp83869_set_tunable()
495 static int dp83869_config_port_mirroring(struct phy_device *phydev) in dp83869_config_port_mirroring() argument
497 struct dp83869_private *dp83869 = phydev->priv; in dp83869_config_port_mirroring()
500 return phy_set_bits_mmd(phydev, DP83869_DEVADDR, in dp83869_config_port_mirroring()
504 return phy_clear_bits_mmd(phydev, DP83869_DEVADDR, in dp83869_config_port_mirroring()
509 static int dp83869_set_strapped_mode(struct phy_device *phydev) in dp83869_set_strapped_mode() argument
511 struct dp83869_private *dp83869 = phydev->priv; in dp83869_set_strapped_mode()
514 val = phy_read_mmd(phydev, DP83869_DEVADDR, DP83869_STRAP_STS1); in dp83869_set_strapped_mode()
528 static int dp83869_of_init(struct phy_device *phydev) in dp83869_of_init() argument
530 struct dp83869_private *dp83869 = phydev->priv; in dp83869_of_init()
531 struct device *dev = &phydev->mdio.dev; in dp83869_of_init()
553 ret = dp83869_set_strapped_mode(phydev); in dp83869_of_init()
567 ret = phy_read_mmd(phydev, DP83869_DEVADDR, DP83869_STRAP_STS1); in dp83869_of_init()
587 dp83869->rx_int_delay = phy_get_internal_delay(phydev, dev, in dp83869_of_init()
593 dp83869->tx_int_delay = phy_get_internal_delay(phydev, dev, in dp83869_of_init()
602 static int dp83869_of_init(struct phy_device *phydev) in dp83869_of_init() argument
604 return dp83869_set_strapped_mode(phydev); in dp83869_of_init()
608 static int dp83869_configure_rgmii(struct phy_device *phydev, in dp83869_configure_rgmii() argument
613 if (phy_interface_is_rgmii(phydev)) { in dp83869_configure_rgmii()
614 val = phy_read(phydev, MII_DP83869_PHYCTRL); in dp83869_configure_rgmii()
622 ret = phy_write(phydev, MII_DP83869_PHYCTRL, val); in dp83869_configure_rgmii()
628 ret = phy_modify_mmd(phydev, DP83869_DEVADDR, in dp83869_configure_rgmii()
637 static int dp83869_configure_fiber(struct phy_device *phydev, in dp83869_configure_fiber() argument
644 linkmode_and(phydev->advertising, phydev->advertising, in dp83869_configure_fiber()
645 phydev->supported); in dp83869_configure_fiber()
647 linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, phydev->supported); in dp83869_configure_fiber()
648 linkmode_set_bit(ADVERTISED_FIBRE, phydev->advertising); in dp83869_configure_fiber()
652 phydev->supported); in dp83869_configure_fiber()
655 phydev->supported); in dp83869_configure_fiber()
657 phydev->supported); in dp83869_configure_fiber()
660 bmcr = phy_read(phydev, MII_BMCR); in dp83869_configure_fiber()
664 phydev->autoneg = AUTONEG_DISABLE; in dp83869_configure_fiber()
665 linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported); in dp83869_configure_fiber()
666 linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->advertising); in dp83869_configure_fiber()
669 ret = phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0); in dp83869_configure_fiber()
676 linkmode_or(phydev->advertising, phydev->advertising, in dp83869_configure_fiber()
677 phydev->supported); in dp83869_configure_fiber()
682 static int dp83869_configure_mode(struct phy_device *phydev, in dp83869_configure_mode() argument
696 if (phydev->interface == PHY_INTERFACE_MODE_MII) { in dp83869_configure_mode()
701 phydev_err(phydev, "selected op-mode is not valid with MII mode\n"); in dp83869_configure_mode()
706 ret = phy_write_mmd(phydev, DP83869_DEVADDR, DP83869_OP_MODE, in dp83869_configure_mode()
711 ret = phy_write(phydev, MII_BMCR, MII_DP83869_BMCR_DEFAULT); in dp83869_configure_mode()
721 ret = phy_write(phydev, MII_DP83869_PHYCTRL, in dp83869_configure_mode()
726 ret = phy_write(phydev, MII_CTRL1000, DP83869_CFG1_DEFAULT); in dp83869_configure_mode()
730 ret = dp83869_configure_rgmii(phydev, dp83869); in dp83869_configure_mode()
735 ret = phy_modify_mmd(phydev, DP83869_DEVADDR, DP83869_OP_MODE, in dp83869_configure_mode()
741 ret = phy_write_mmd(phydev, DP83869_DEVADDR, in dp83869_configure_mode()
748 ret = phy_write(phydev, MII_DP83869_PHYCTRL, in dp83869_configure_mode()
753 ret = phy_write_mmd(phydev, DP83869_DEVADDR, in dp83869_configure_mode()
759 ret = phy_write(phydev, MII_DP83869_PHYCTRL, in dp83869_configure_mode()
765 ret = phy_write(phydev, MII_DP83869_PHYCTRL, in dp83869_configure_mode()
770 ret = phy_write(phydev, MII_CTRL1000, DP83869_CFG1_DEFAULT); in dp83869_configure_mode()
774 ret = phy_write_mmd(phydev, DP83869_DEVADDR, in dp83869_configure_mode()
782 ret = dp83869_configure_fiber(phydev, dp83869); in dp83869_configure_mode()
791 static int dp83869_config_init(struct phy_device *phydev) in dp83869_config_init() argument
793 struct dp83869_private *dp83869 = phydev->priv; in dp83869_config_init()
797 ret = phy_modify(phydev, DP83869_CFG2, DP83869_DOWNSHIFT_EN, in dp83869_config_init()
802 ret = dp83869_configure_mode(phydev, dp83869); in dp83869_config_init()
807 if (phy_interrupt_is_valid(phydev)) { in dp83869_config_init()
808 val = phy_read(phydev, DP83869_CFG4); in dp83869_config_init()
810 phy_write(phydev, DP83869_CFG4, val); in dp83869_config_init()
814 dp83869_config_port_mirroring(phydev); in dp83869_config_init()
818 ret = phy_modify_mmd(phydev, in dp83869_config_init()
824 if (phy_interface_is_rgmii(phydev)) { in dp83869_config_init()
825 ret = phy_write_mmd(phydev, DP83869_DEVADDR, DP83869_RGMIIDCTL, in dp83869_config_init()
831 val = phy_read_mmd(phydev, DP83869_DEVADDR, DP83869_RGMIICTL); in dp83869_config_init()
835 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) in dp83869_config_init()
839 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) in dp83869_config_init()
842 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) in dp83869_config_init()
845 ret = phy_write_mmd(phydev, DP83869_DEVADDR, DP83869_RGMIICTL, in dp83869_config_init()
852 static int dp83869_probe(struct phy_device *phydev) in dp83869_probe() argument
857 dp83869 = devm_kzalloc(&phydev->mdio.dev, sizeof(*dp83869), in dp83869_probe()
862 phydev->priv = dp83869; in dp83869_probe()
864 ret = dp83869_of_init(phydev); in dp83869_probe()
870 phydev->port = PORT_FIBRE; in dp83869_probe()
872 return dp83869_config_init(phydev); in dp83869_probe()
875 static int dp83869_phy_reset(struct phy_device *phydev) in dp83869_phy_reset() argument
879 ret = phy_write(phydev, DP83869_CTRL, DP83869_SW_RESET); in dp83869_phy_reset()
888 return dp83869_config_init(phydev); in dp83869_phy_reset()