MCPcopy Create free account
hub / github.com/F-Stack/f-stack / txgbe_setup_phy_link

Function txgbe_setup_phy_link

dpdk/drivers/net/txgbe/base/txgbe_phy.c:428–506  ·  view source on GitHub ↗

* txgbe_setup_phy_link - Set and restart auto-neg * @hw: pointer to hardware structure * * Restart auto-negotiation and PHY and waits for completion. **/

Source from the content-addressed store, hash-verified

426 * Restart auto-negotiation and PHY and waits for completion.
427 **/
428s32 txgbe_setup_phy_link(struct txgbe_hw *hw)
429{
430 s32 err = 0;
431 u16 autoneg_reg = TXGBE_MII_AUTONEG_REG;
432 bool autoneg = false;
433 u32 speed;
434
435 txgbe_get_copper_link_capabilities(hw, &speed, &autoneg);
436
437 /* Set or unset auto-negotiation 10G advertisement */
438 hw->phy.read_reg(hw, TXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
439 TXGBE_MD_DEV_AUTO_NEG,
440 &autoneg_reg);
441
442 autoneg_reg &= ~TXGBE_MII_10GBASE_T_ADVERTISE;
443 if ((hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_10GB_FULL) &&
444 (speed & TXGBE_LINK_SPEED_10GB_FULL))
445 autoneg_reg |= TXGBE_MII_10GBASE_T_ADVERTISE;
446
447 hw->phy.write_reg(hw, TXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
448 TXGBE_MD_DEV_AUTO_NEG,
449 autoneg_reg);
450
451 hw->phy.read_reg(hw, TXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
452 TXGBE_MD_DEV_AUTO_NEG,
453 &autoneg_reg);
454
455 /* Set or unset auto-negotiation 5G advertisement */
456 autoneg_reg &= ~TXGBE_MII_5GBASE_T_ADVERTISE;
457 if ((hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_5GB_FULL) &&
458 (speed & TXGBE_LINK_SPEED_5GB_FULL))
459 autoneg_reg |= TXGBE_MII_5GBASE_T_ADVERTISE;
460
461 /* Set or unset auto-negotiation 2.5G advertisement */
462 autoneg_reg &= ~TXGBE_MII_2_5GBASE_T_ADVERTISE;
463 if ((hw->phy.autoneg_advertised &
464 TXGBE_LINK_SPEED_2_5GB_FULL) &&
465 (speed & TXGBE_LINK_SPEED_2_5GB_FULL))
466 autoneg_reg |= TXGBE_MII_2_5GBASE_T_ADVERTISE;
467 /* Set or unset auto-negotiation 1G advertisement */
468 autoneg_reg &= ~TXGBE_MII_1GBASE_T_ADVERTISE;
469 if ((hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_1GB_FULL) &&
470 (speed & TXGBE_LINK_SPEED_1GB_FULL))
471 autoneg_reg |= TXGBE_MII_1GBASE_T_ADVERTISE;
472
473 hw->phy.write_reg(hw, TXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
474 TXGBE_MD_DEV_AUTO_NEG,
475 autoneg_reg);
476
477 /* Set or unset auto-negotiation 100M advertisement */
478 hw->phy.read_reg(hw, TXGBE_MII_AUTONEG_ADVERTISE_REG,
479 TXGBE_MD_DEV_AUTO_NEG,
480 &autoneg_reg);
481
482 autoneg_reg &= ~(TXGBE_MII_100BASE_T_ADVERTISE |
483 TXGBE_MII_100BASE_T_ADVERTISE_HALF);
484 if ((hw->phy.autoneg_advertised & TXGBE_LINK_SPEED_100M_FULL) &&
485 (speed & TXGBE_LINK_SPEED_100M_FULL))

Callers

nothing calls this directly

Tested by

no test coverage detected