|
@@ -470,8 +470,6 @@ static void ixgbe_enable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw)
|
|
|
**/
|
|
|
static void ixgbe_flap_tx_laser_multispeed_fiber(struct ixgbe_hw *hw)
|
|
|
{
|
|
|
- hw_dbg(hw, "ixgbe_flap_tx_laser_multispeed_fiber\n");
|
|
|
-
|
|
|
if (hw->mac.autotry_restart) {
|
|
|
ixgbe_disable_tx_laser_multispeed_fiber(hw);
|
|
|
ixgbe_enable_tx_laser_multispeed_fiber(hw);
|
|
@@ -494,17 +492,21 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
|
|
bool autoneg_wait_to_complete)
|
|
|
{
|
|
|
s32 status = 0;
|
|
|
- ixgbe_link_speed phy_link_speed;
|
|
|
+ ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN;
|
|
|
ixgbe_link_speed highest_link_speed = IXGBE_LINK_SPEED_UNKNOWN;
|
|
|
u32 speedcnt = 0;
|
|
|
u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP);
|
|
|
+ u32 i = 0;
|
|
|
bool link_up = false;
|
|
|
bool negotiation;
|
|
|
- int i;
|
|
|
|
|
|
/* Mask off requested but non-supported speeds */
|
|
|
- hw->mac.ops.get_link_capabilities(hw, &phy_link_speed, &negotiation);
|
|
|
- speed &= phy_link_speed;
|
|
|
+ status = hw->mac.ops.get_link_capabilities(hw, &link_speed,
|
|
|
+ &negotiation);
|
|
|
+ if (status != 0)
|
|
|
+ return status;
|
|
|
+
|
|
|
+ speed &= link_speed;
|
|
|
|
|
|
/*
|
|
|
* Try each speed one by one, highest priority first. We do this in
|
|
@@ -515,9 +517,12 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
|
|
highest_link_speed = IXGBE_LINK_SPEED_10GB_FULL;
|
|
|
|
|
|
/* If we already have link at this speed, just jump out */
|
|
|
- hw->mac.ops.check_link(hw, &phy_link_speed, &link_up, false);
|
|
|
+ status = hw->mac.ops.check_link(hw, &link_speed, &link_up,
|
|
|
+ false);
|
|
|
+ if (status != 0)
|
|
|
+ return status;
|
|
|
|
|
|
- if ((phy_link_speed == IXGBE_LINK_SPEED_10GB_FULL) && link_up)
|
|
|
+ if ((link_speed == IXGBE_LINK_SPEED_10GB_FULL) && link_up)
|
|
|
goto out;
|
|
|
|
|
|
/* Set the module link speed */
|
|
@@ -529,9 +534,9 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
|
|
msleep(40);
|
|
|
|
|
|
status = ixgbe_setup_mac_link_82599(hw,
|
|
|
- IXGBE_LINK_SPEED_10GB_FULL,
|
|
|
- autoneg,
|
|
|
- autoneg_wait_to_complete);
|
|
|
+ IXGBE_LINK_SPEED_10GB_FULL,
|
|
|
+ autoneg,
|
|
|
+ autoneg_wait_to_complete);
|
|
|
if (status != 0)
|
|
|
return status;
|
|
|
|
|
@@ -548,8 +553,11 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
|
|
msleep(100);
|
|
|
|
|
|
/* If we have link, just jump out */
|
|
|
- hw->mac.ops.check_link(hw, &phy_link_speed,
|
|
|
- &link_up, false);
|
|
|
+ status = hw->mac.ops.check_link(hw, &link_speed,
|
|
|
+ &link_up, false);
|
|
|
+ if (status != 0)
|
|
|
+ return status;
|
|
|
+
|
|
|
if (link_up)
|
|
|
goto out;
|
|
|
}
|
|
@@ -561,9 +569,12 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
|
|
highest_link_speed = IXGBE_LINK_SPEED_1GB_FULL;
|
|
|
|
|
|
/* If we already have link at this speed, just jump out */
|
|
|
- hw->mac.ops.check_link(hw, &phy_link_speed, &link_up, false);
|
|
|
+ status = hw->mac.ops.check_link(hw, &link_speed, &link_up,
|
|
|
+ false);
|
|
|
+ if (status != 0)
|
|
|
+ return status;
|
|
|
|
|
|
- if ((phy_link_speed == IXGBE_LINK_SPEED_1GB_FULL) && link_up)
|
|
|
+ if ((link_speed == IXGBE_LINK_SPEED_1GB_FULL) && link_up)
|
|
|
goto out;
|
|
|
|
|
|
/* Set the module link speed */
|
|
@@ -576,9 +587,9 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
|
|
msleep(40);
|
|
|
|
|
|
status = ixgbe_setup_mac_link_82599(hw,
|
|
|
- IXGBE_LINK_SPEED_1GB_FULL,
|
|
|
- autoneg,
|
|
|
- autoneg_wait_to_complete);
|
|
|
+ IXGBE_LINK_SPEED_1GB_FULL,
|
|
|
+ autoneg,
|
|
|
+ autoneg_wait_to_complete);
|
|
|
if (status != 0)
|
|
|
return status;
|
|
|
|
|
@@ -589,7 +600,11 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
|
|
msleep(100);
|
|
|
|
|
|
/* If we have link, just jump out */
|
|
|
- hw->mac.ops.check_link(hw, &phy_link_speed, &link_up, false);
|
|
|
+ status = hw->mac.ops.check_link(hw, &link_speed, &link_up,
|
|
|
+ false);
|
|
|
+ if (status != 0)
|
|
|
+ return status;
|
|
|
+
|
|
|
if (link_up)
|
|
|
goto out;
|
|
|
}
|
|
@@ -632,13 +647,10 @@ static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw,
|
|
|
bool autoneg_wait_to_complete)
|
|
|
{
|
|
|
s32 status = 0;
|
|
|
- ixgbe_link_speed link_speed;
|
|
|
+ ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN;
|
|
|
s32 i, j;
|
|
|
bool link_up = false;
|
|
|
u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
|
|
|
- struct ixgbe_adapter *adapter = hw->back;
|
|
|
-
|
|
|
- hw_dbg(hw, "ixgbe_setup_mac_link_smartspeed.\n");
|
|
|
|
|
|
/* Set autoneg_advertised value based on input link speed */
|
|
|
hw->phy.autoneg_advertised = 0;
|
|
@@ -664,7 +676,7 @@ static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw,
|
|
|
for (j = 0; j < IXGBE_SMARTSPEED_MAX_RETRIES; j++) {
|
|
|
status = ixgbe_setup_mac_link_82599(hw, speed, autoneg,
|
|
|
autoneg_wait_to_complete);
|
|
|
- if (status)
|
|
|
+ if (status != 0)
|
|
|
goto out;
|
|
|
|
|
|
/*
|
|
@@ -677,8 +689,11 @@ static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw,
|
|
|
mdelay(100);
|
|
|
|
|
|
/* If we have link, just jump out */
|
|
|
- hw->mac.ops.check_link(hw, &link_speed,
|
|
|
- &link_up, false);
|
|
|
+ status = hw->mac.ops.check_link(hw, &link_speed,
|
|
|
+ &link_up, false);
|
|
|
+ if (status != 0)
|
|
|
+ goto out;
|
|
|
+
|
|
|
if (link_up)
|
|
|
goto out;
|
|
|
}
|
|
@@ -696,7 +711,7 @@ static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw,
|
|
|
hw->phy.smart_speed_active = true;
|
|
|
status = ixgbe_setup_mac_link_82599(hw, speed, autoneg,
|
|
|
autoneg_wait_to_complete);
|
|
|
- if (status)
|
|
|
+ if (status != 0)
|
|
|
goto out;
|
|
|
|
|
|
/*
|
|
@@ -709,8 +724,11 @@ static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw,
|
|
|
mdelay(100);
|
|
|
|
|
|
/* If we have link, just jump out */
|
|
|
- hw->mac.ops.check_link(hw, &link_speed,
|
|
|
- &link_up, false);
|
|
|
+ status = hw->mac.ops.check_link(hw, &link_speed,
|
|
|
+ &link_up, false);
|
|
|
+ if (status != 0)
|
|
|
+ goto out;
|
|
|
+
|
|
|
if (link_up)
|
|
|
goto out;
|
|
|
}
|
|
@@ -722,7 +740,7 @@ static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw,
|
|
|
|
|
|
out:
|
|
|
if (link_up && (link_speed == IXGBE_LINK_SPEED_1GB_FULL))
|
|
|
- e_info(hw, "Smartspeed has downgraded the link speed from "
|
|
|
+ hw_dbg(hw, "Smartspeed has downgraded the link speed from "
|
|
|
"the maximum advertised\n");
|
|
|
return status;
|
|
|
}
|
|
@@ -883,7 +901,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|
|
|
|
|
/* PHY ops must be identified and initialized prior to reset */
|
|
|
|
|
|
- /* Init PHY and function pointers, perform SFP setup */
|
|
|
+ /* Identify PHY and related function pointers */
|
|
|
status = hw->phy.ops.init(hw);
|
|
|
|
|
|
if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
@@ -895,6 +913,9 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|
|
hw->phy.sfp_setup_needed = false;
|
|
|
}
|
|
|
|
|
|
+ if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
|
+ goto reset_hw_out;
|
|
|
+
|
|
|
/* Reset PHY */
|
|
|
if (hw->phy.reset_disable == false && hw->phy.ops.reset != NULL)
|
|
|
hw->phy.ops.reset(hw);
|
|
@@ -2051,28 +2072,28 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
|
|
|
};
|
|
|
|
|
|
static struct ixgbe_eeprom_operations eeprom_ops_82599 = {
|
|
|
- .init_params = &ixgbe_init_eeprom_params_generic,
|
|
|
- .read = &ixgbe_read_eerd_generic,
|
|
|
- .write = &ixgbe_write_eeprom_generic,
|
|
|
- .calc_checksum = &ixgbe_calc_eeprom_checksum_generic,
|
|
|
- .validate_checksum = &ixgbe_validate_eeprom_checksum_generic,
|
|
|
- .update_checksum = &ixgbe_update_eeprom_checksum_generic,
|
|
|
+ .init_params = &ixgbe_init_eeprom_params_generic,
|
|
|
+ .read = &ixgbe_read_eerd_generic,
|
|
|
+ .write = &ixgbe_write_eeprom_generic,
|
|
|
+ .calc_checksum = &ixgbe_calc_eeprom_checksum_generic,
|
|
|
+ .validate_checksum = &ixgbe_validate_eeprom_checksum_generic,
|
|
|
+ .update_checksum = &ixgbe_update_eeprom_checksum_generic,
|
|
|
};
|
|
|
|
|
|
static struct ixgbe_phy_operations phy_ops_82599 = {
|
|
|
- .identify = &ixgbe_identify_phy_82599,
|
|
|
- .identify_sfp = &ixgbe_identify_sfp_module_generic,
|
|
|
- .init = &ixgbe_init_phy_ops_82599,
|
|
|
- .reset = &ixgbe_reset_phy_generic,
|
|
|
- .read_reg = &ixgbe_read_phy_reg_generic,
|
|
|
- .write_reg = &ixgbe_write_phy_reg_generic,
|
|
|
- .setup_link = &ixgbe_setup_phy_link_generic,
|
|
|
- .setup_link_speed = &ixgbe_setup_phy_link_speed_generic,
|
|
|
- .read_i2c_byte = &ixgbe_read_i2c_byte_generic,
|
|
|
- .write_i2c_byte = &ixgbe_write_i2c_byte_generic,
|
|
|
- .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic,
|
|
|
- .write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic,
|
|
|
- .check_overtemp = &ixgbe_tn_check_overtemp,
|
|
|
+ .identify = &ixgbe_identify_phy_82599,
|
|
|
+ .identify_sfp = &ixgbe_identify_sfp_module_generic,
|
|
|
+ .init = &ixgbe_init_phy_ops_82599,
|
|
|
+ .reset = &ixgbe_reset_phy_generic,
|
|
|
+ .read_reg = &ixgbe_read_phy_reg_generic,
|
|
|
+ .write_reg = &ixgbe_write_phy_reg_generic,
|
|
|
+ .setup_link = &ixgbe_setup_phy_link_generic,
|
|
|
+ .setup_link_speed = &ixgbe_setup_phy_link_speed_generic,
|
|
|
+ .read_i2c_byte = &ixgbe_read_i2c_byte_generic,
|
|
|
+ .write_i2c_byte = &ixgbe_write_i2c_byte_generic,
|
|
|
+ .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic,
|
|
|
+ .write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic,
|
|
|
+ .check_overtemp = &ixgbe_tn_check_overtemp,
|
|
|
};
|
|
|
|
|
|
struct ixgbe_info ixgbe_82599_info = {
|