* txgbe_setup_phy_link - Set and restart auto-neg * @hw: pointer to hardware structure * * Restart auto-negotiation and PHY and waits for completion. **/
| 426 | * Restart auto-negotiation and PHY and waits for completion. |
| 427 | **/ |
| 428 | s32 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)) |
nothing calls this directly
no test coverage detected