[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