[PATCH 12/18] net/txgbe: fix link stability for 25G NIC
Jiawen Wu
jiawenwu at trustnetic.com
Thu Apr 23 10:22:31 CEST 2026
> @@ -197,33 +204,80 @@ s32 txgbe_setup_mac_link_aml(struct txgbe_hw *hw,
> if (status)
> return status;
>
> + /* setup the highest link when no autoneg */
> + if (!autoneg) {
> + if (speed & TXGBE_LINK_SPEED_25GB_FULL)
> + speed = TXGBE_LINK_SPEED_25GB_FULL;
> + else if (speed & TXGBE_LINK_SPEED_10GB_FULL)
> + speed = TXGBE_LINK_SPEED_10GB_FULL;
> + }
> +
> speed &= link_capabilities;
> if (speed == TXGBE_LINK_SPEED_UNKNOWN)
> return TXGBE_ERR_LINK_SETUP;
>
> - value = rd32(hw, TXGBE_GPIOEXT);
> - if (value & (TXGBE_SFP1_MOD_ABS_LS | TXGBE_SFP1_RX_LOS_LS))
> + if (txgbe_gpio_ext_check(hw, TXGBE_SFP1_MOD_ABS_LS |
> + TXGBE_SFP1_RX_LOS_LS)) {
> + DEBUGOUT("RX LOS");
> return status;
> + }
>
> - status = hw->mac.check_link(hw, &link_speed, &link_up,
> - autoneg_wait_to_complete);
> + for (i = 0; i < 4; i++) {
> + txgbe_e56_check_phy_link(hw, &link_speed, &link_up);
> + if (link_up) {
> + DEBUGOUT("check phy link_up");
> + break;
> + }
> + msleep(250);
> + }
>
> - if (link_up && speed == TXGBE_LINK_SPEED_25GB_FULL)
> + if (speed == TXGBE_LINK_SPEED_25GB_FULL)
> hw->cur_fec_link = txgbe_phy_fec_get(hw);
>
> if (link_speed == speed && link_up &&
> - !(speed == TXGBE_LINK_SPEED_25GB_FULL &&
> - !(hw->fec_mode & hw->cur_fec_link)))
> - return status;
> + !(speed == TXGBE_LINK_SPEED_25GB_FULL &&
> + !(hw->fec_mode & hw->cur_fec_link)))
> + goto out;
>
> - if (speed & TXGBE_LINK_SPEED_25GB_FULL)
> - speed = 0x10;
> - else if (speed & TXGBE_LINK_SPEED_10GB_FULL)
> - speed = 0x08;
> + rte_spinlock_lock(&hw->phy_lock);
> + ret_status = txgbe_set_link_to_amlite(hw, speed);
> + rte_spinlock_unlock(&hw->phy_lock);
> +
> + if (ret_status == TXGBE_ERR_PHY_INIT_NOT_DONE)
> + goto out;
>
> - status = hw->phy.set_link_hostif(hw, (u8)speed, autoneg, true);
> + if (ret_status == TXGBE_ERR_TIMEOUT) {
> + hw->link_valid = false;
> + *need_reset = true;
> + goto out;
> + } else {
> + hw->link_valid = true;
> + }
> +
> + if (speed == TXGBE_LINK_SPEED_25GB_FULL) {
> + txgbe_e56_fec_polling(hw, &link_up);
> + } else {
> + for (i = 0; i < 4; i++) {
> + txgbe_e56_check_phy_link(hw, &link_speed, &link_up);
> + if (link_up)
> + goto out;
> + msleep(250);
> + }
> + }
>
> - txgbe_wait_for_link_up_aml(hw, speed);
> +out:
> + if (link_up) {
> + value = rd32(hw, TXGBE_PORTSTAT);
> + if (!(value & TXGBE_PORTSTAT_UP)) {
> + PMD_DRV_LOG(DEBUG, "MAC link 0x14404: 0x%x", value);
> + *need_reset = true;
> + value = rd32(hw, 0x110b0);
> + PMD_DRV_LOG(DEBUG, "MAC intr status 0x110b0: 0x%x", value);
> + }
> + } else {
> + *need_reset = true;
> + PMD_DRV_LOG(DEBUG, "Link reconfiguration required. Reset scheduled in 2000ms.");
> + }
>
DEBUGOUT() and PMD_DRV_LOG(DEBUG, ...) can be unified in this function.
More information about the stable
mailing list