> @@ -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.
 

Reply via email to