Lines Matching defs:phydev

63 static int mv2222_tx_enable(struct phy_device *phydev)
65 return phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_TXDIS,
70 static int mv2222_tx_disable(struct phy_device *phydev)
72 return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_TXDIS,
76 static int mv2222_soft_reset(struct phy_device *phydev)
80 ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PORT_RST,
85 return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND2, MV_PORT_RST,
90 static int mv2222_disable_aneg(struct phy_device *phydev)
92 int ret = phy_clear_bits_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_CTRL,
97 return mv2222_soft_reset(phydev);
100 static int mv2222_enable_aneg(struct phy_device *phydev)
102 int ret = phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_CTRL,
107 return mv2222_soft_reset(phydev);
110 static int mv2222_set_sgmii_speed(struct phy_device *phydev)
112 struct mv2222_data *priv = phydev->priv;
114 switch (phydev->speed) {
121 return phy_modify_mmd(phydev, MDIO_MMD_PCS,
132 return phy_modify_mmd(phydev, MDIO_MMD_PCS,
142 return phy_modify_mmd(phydev, MDIO_MMD_PCS,
151 static bool mv2222_is_10g_capable(struct phy_device *phydev)
153 struct mv2222_data *priv = phydev->priv;
169 static bool mv2222_is_1gbx_capable(struct phy_device *phydev)
171 struct mv2222_data *priv = phydev->priv;
177 static bool mv2222_is_sgmii_capable(struct phy_device *phydev)
179 struct mv2222_data *priv = phydev->priv;
195 static int mv2222_config_line(struct phy_device *phydev)
197 struct mv2222_data *priv = phydev->priv;
201 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PCS_CONFIG,
204 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PCS_CONFIG,
207 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PCS_CONFIG,
215 static int mv2222_swap_line_type(struct phy_device *phydev)
217 struct mv2222_data *priv = phydev->priv;
223 if (mv2222_is_1gbx_capable(phydev)) {
228 if (mv2222_is_sgmii_capable(phydev)) {
236 if (mv2222_is_10g_capable(phydev)) {
247 ret = mv2222_config_line(phydev);
255 static int mv2222_setup_forced(struct phy_device *phydev)
257 struct mv2222_data *priv = phydev->priv;
261 if (phydev->speed < SPEED_10000 &&
262 phydev->speed != SPEED_UNKNOWN) {
263 ret = mv2222_swap_line_type(phydev);
270 ret = mv2222_set_sgmii_speed(phydev);
275 return mv2222_disable_aneg(phydev);
278 static int mv2222_config_aneg(struct phy_device *phydev)
280 struct mv2222_data *priv = phydev->priv;
287 if (phydev->autoneg == AUTONEG_DISABLE ||
289 return mv2222_setup_forced(phydev);
294 ret = phy_modify_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_ADVERTISE,
301 return mv2222_enable_aneg(phydev);
304 static int mv2222_aneg_done(struct phy_device *phydev)
308 if (mv2222_is_10g_capable(phydev)) {
309 ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_STAT1);
317 ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_STAT);
325 static int mv2222_read_status_10g(struct phy_device *phydev)
330 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_STAT1);
338 phydev->autoneg = AUTONEG_DISABLE;
339 phydev->speed = SPEED_10000;
340 phydev->duplex = DUPLEX_FULL;
342 if (phydev->autoneg == AUTONEG_ENABLE) {
348 val = mv2222_swap_line_type(phydev);
352 return mv2222_config_aneg(phydev);
361 static int mv2222_read_status_1g(struct phy_device *phydev)
366 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_STAT);
370 if (phydev->autoneg == AUTONEG_ENABLE &&
377 val = mv2222_swap_line_type(phydev);
381 return mv2222_config_aneg(phydev);
392 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_PHY_STAT);
398 phydev->duplex = DUPLEX_FULL;
400 phydev->duplex = DUPLEX_HALF;
403 phydev->speed = SPEED_1000;
405 phydev->speed = SPEED_100;
407 phydev->speed = SPEED_10;
413 static bool mv2222_link_is_operational(struct phy_device *phydev)
415 struct mv2222_data *priv = phydev->priv;
418 val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_RX_SIGNAL_DETECT);
422 if (phydev->sfp_bus && !priv->sfp_link)
428 static int mv2222_read_status(struct phy_device *phydev)
430 struct mv2222_data *priv = phydev->priv;
433 phydev->link = 0;
434 phydev->speed = SPEED_UNKNOWN;
435 phydev->duplex = DUPLEX_UNKNOWN;
437 if (!mv2222_link_is_operational(phydev))
441 link = mv2222_read_status_10g(phydev);
443 link = mv2222_read_status_1g(phydev);
448 phydev->link = link;
453 static int mv2222_resume(struct phy_device *phydev)
455 return mv2222_tx_enable(phydev);
458 static int mv2222_suspend(struct phy_device *phydev)
460 return mv2222_tx_disable(phydev);
463 static int mv2222_get_features(struct phy_device *phydev)
470 static int mv2222_config_init(struct phy_device *phydev)
472 if (phydev->interface != PHY_INTERFACE_MODE_XAUI)
481 struct phy_device *phydev = upstream;
489 priv = phydev->priv;
490 dev = &phydev->mdio.dev;
492 sfp_parse_support(phydev->sfp_bus, id, sfp_supported, interfaces);
493 phydev->port = sfp_parse_port(phydev->sfp_bus, id, sfp_supported);
494 sfp_interface = sfp_select_interface(phydev->sfp_bus, sfp_supported);
507 linkmode_and(priv->supported, phydev->supported, sfp_supported);
509 ret = mv2222_config_line(phydev);
513 if (mutex_trylock(&phydev->lock)) {
514 ret = mv2222_config_aneg(phydev);
515 mutex_unlock(&phydev->lock);
523 struct phy_device *phydev = upstream;
526 priv = phydev->priv;
530 phydev->port = PORT_NONE;
535 struct phy_device *phydev = upstream;
538 priv = phydev->priv;
544 struct phy_device *phydev = upstream;
547 priv = phydev->priv;
560 static int mv2222_probe(struct phy_device *phydev)
562 struct device *dev = &phydev->mdio.dev;
586 linkmode_copy(phydev->supported, supported);
593 phydev->priv = priv;
595 return phy_sfp_probe(phydev, &sfp_phy_ops);