mirror of
https://github.com/torvalds/linux.git
synced 2024-11-19 18:41:48 +00:00
ixgbe: Make return values more direct
Make return values more direct, eliminating some gotos and otherwise unneeded conditionals. This also eliminates some local variables. Also a few minor cleanups in affected code so checkpatch won't complain. Signed-off-by: Mark Rustad <mark.d.rustad@intel.com> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
9f1fb8acd3
commit
e90dd26456
@ -122,7 +122,7 @@ static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
struct ixgbe_mac_info *mac = &hw->mac;
|
||||
struct ixgbe_phy_info *phy = &hw->phy;
|
||||
s32 ret_val = 0;
|
||||
s32 ret_val;
|
||||
u16 list_offset, data_offset;
|
||||
|
||||
/* Identify the PHY */
|
||||
@ -147,28 +147,23 @@ static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
|
||||
|
||||
/* Call SFP+ identify routine to get the SFP+ module type */
|
||||
ret_val = phy->ops.identify_sfp(hw);
|
||||
if (ret_val != 0)
|
||||
goto out;
|
||||
else if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) {
|
||||
ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
goto out;
|
||||
}
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
|
||||
/* Check to see if SFP+ module is supported */
|
||||
ret_val = ixgbe_get_sfp_init_sequence_offsets(hw,
|
||||
&list_offset,
|
||||
&data_offset);
|
||||
if (ret_val != 0) {
|
||||
ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
goto out;
|
||||
}
|
||||
if (ret_val)
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -183,7 +178,7 @@ static s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 regval;
|
||||
u32 i;
|
||||
s32 ret_val = 0;
|
||||
s32 ret_val;
|
||||
|
||||
ret_val = ixgbe_start_hw_generic(hw);
|
||||
|
||||
@ -203,11 +198,13 @@ static s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval);
|
||||
}
|
||||
|
||||
/* set the completion timeout for interface */
|
||||
if (ret_val == 0)
|
||||
ixgbe_set_pcie_completion_timeout(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
return ret_val;
|
||||
/* set the completion timeout for interface */
|
||||
ixgbe_set_pcie_completion_timeout(hw);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -222,7 +219,6 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed *speed,
|
||||
bool *autoneg)
|
||||
{
|
||||
s32 status = 0;
|
||||
u32 autoc = 0;
|
||||
|
||||
/*
|
||||
@ -262,11 +258,10 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
|
||||
break;
|
||||
|
||||
default:
|
||||
status = IXGBE_ERR_LINK_SETUP;
|
||||
break;
|
||||
return IXGBE_ERR_LINK_SETUP;
|
||||
}
|
||||
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -277,14 +272,12 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
|
||||
**/
|
||||
static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
enum ixgbe_media_type media_type;
|
||||
|
||||
/* Detect if there is a copper PHY attached. */
|
||||
switch (hw->phy.type) {
|
||||
case ixgbe_phy_cu_unknown:
|
||||
case ixgbe_phy_tn:
|
||||
media_type = ixgbe_media_type_copper;
|
||||
goto out;
|
||||
return ixgbe_media_type_copper;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -294,30 +287,27 @@ static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
|
||||
case IXGBE_DEV_ID_82598:
|
||||
case IXGBE_DEV_ID_82598_BX:
|
||||
/* Default device ID is mezzanine card KX/KX4 */
|
||||
media_type = ixgbe_media_type_backplane;
|
||||
break;
|
||||
return ixgbe_media_type_backplane;
|
||||
|
||||
case IXGBE_DEV_ID_82598AF_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
|
||||
case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM:
|
||||
case IXGBE_DEV_ID_82598EB_XF_LR:
|
||||
case IXGBE_DEV_ID_82598EB_SFP_LOM:
|
||||
media_type = ixgbe_media_type_fiber;
|
||||
break;
|
||||
return ixgbe_media_type_fiber;
|
||||
|
||||
case IXGBE_DEV_ID_82598EB_CX4:
|
||||
case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
|
||||
media_type = ixgbe_media_type_cx4;
|
||||
break;
|
||||
return ixgbe_media_type_cx4;
|
||||
|
||||
case IXGBE_DEV_ID_82598AT:
|
||||
case IXGBE_DEV_ID_82598AT2:
|
||||
media_type = ixgbe_media_type_copper;
|
||||
break;
|
||||
return ixgbe_media_type_copper;
|
||||
|
||||
default:
|
||||
media_type = ixgbe_media_type_unknown;
|
||||
break;
|
||||
return ixgbe_media_type_unknown;
|
||||
}
|
||||
out:
|
||||
return media_type;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -328,7 +318,6 @@ out:
|
||||
**/
|
||||
static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 ret_val = 0;
|
||||
u32 fctrl_reg;
|
||||
u32 rmcs_reg;
|
||||
u32 reg;
|
||||
@ -338,10 +327,8 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
|
||||
bool link_up;
|
||||
|
||||
/* Validate the water mark configuration */
|
||||
if (!hw->fc.pause_time) {
|
||||
ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
|
||||
goto out;
|
||||
}
|
||||
if (!hw->fc.pause_time)
|
||||
return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
||||
|
||||
/* Low water mark of zero causes XOFF floods */
|
||||
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
||||
@ -350,8 +337,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
|
||||
if (!hw->fc.low_water[i] ||
|
||||
hw->fc.low_water[i] >= hw->fc.high_water[i]) {
|
||||
hw_dbg(hw, "Invalid water mark configuration\n");
|
||||
ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
|
||||
goto out;
|
||||
return IXGBE_ERR_INVALID_LINK_SETTINGS;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -428,8 +414,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
|
||||
break;
|
||||
default:
|
||||
hw_dbg(hw, "Flow control param set incorrectly\n");
|
||||
ret_val = IXGBE_ERR_CONFIG;
|
||||
goto out;
|
||||
return IXGBE_ERR_CONFIG;
|
||||
}
|
||||
|
||||
/* Set 802.3x based flow control settings. */
|
||||
@ -460,8 +445,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
|
||||
/* Configure flow control refresh threshold value */
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -597,7 +581,7 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
|
||||
}
|
||||
|
||||
if (!*link_up)
|
||||
goto out;
|
||||
return 0;
|
||||
}
|
||||
|
||||
links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
|
||||
@ -628,7 +612,6 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
|
||||
(ixgbe_validate_link_ready(hw) != 0))
|
||||
*link_up = false;
|
||||
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -645,7 +628,6 @@ static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
|
||||
bool autoneg_wait_to_complete)
|
||||
{
|
||||
bool autoneg = false;
|
||||
s32 status = 0;
|
||||
ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN;
|
||||
u32 curr_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
|
||||
u32 autoc = curr_autoc;
|
||||
@ -656,7 +638,7 @@ static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
|
||||
speed &= link_capabilities;
|
||||
|
||||
if (speed == IXGBE_LINK_SPEED_UNKNOWN)
|
||||
status = IXGBE_ERR_LINK_SETUP;
|
||||
return IXGBE_ERR_LINK_SETUP;
|
||||
|
||||
/* Set KX4/KX support according to speed requested */
|
||||
else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN ||
|
||||
@ -670,17 +652,11 @@ static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
|
||||
IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc);
|
||||
}
|
||||
|
||||
if (status == 0) {
|
||||
/*
|
||||
* Setup and restart the link based on the new values in
|
||||
* ixgbe_hw This will write the AUTOC register based on the new
|
||||
* stored values
|
||||
*/
|
||||
status = ixgbe_start_mac_link_82598(hw,
|
||||
autoneg_wait_to_complete);
|
||||
}
|
||||
|
||||
return status;
|
||||
/* Setup and restart the link based on the new values in
|
||||
* ixgbe_hw This will write the AUTOC register based on the new
|
||||
* stored values
|
||||
*/
|
||||
return ixgbe_start_mac_link_82598(hw, autoneg_wait_to_complete);
|
||||
}
|
||||
|
||||
|
||||
@ -717,7 +693,7 @@ static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
|
||||
**/
|
||||
static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = 0;
|
||||
s32 status;
|
||||
s32 phy_status = 0;
|
||||
u32 ctrl;
|
||||
u32 gheccr;
|
||||
@ -727,8 +703,8 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
||||
|
||||
/* Call adapter stop to disable tx/rx and clear interrupts */
|
||||
status = hw->mac.ops.stop_adapter(hw);
|
||||
if (status != 0)
|
||||
goto reset_hw_out;
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
/*
|
||||
* Power up the Atlas Tx lanes if they are currently powered down.
|
||||
@ -770,7 +746,7 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
||||
/* Init PHY and function pointers, perform SFP setup */
|
||||
phy_status = hw->phy.ops.init(hw);
|
||||
if (phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
||||
goto reset_hw_out;
|
||||
return phy_status;
|
||||
if (phy_status == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto mac_reset_top;
|
||||
|
||||
@ -836,7 +812,6 @@ mac_reset_top:
|
||||
*/
|
||||
hw->mac.ops.init_rx_addrs(hw);
|
||||
|
||||
reset_hw_out:
|
||||
if (phy_status)
|
||||
status = phy_status;
|
||||
|
||||
|
@ -123,7 +123,7 @@ static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw)
|
||||
|
||||
static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 ret_val = 0;
|
||||
s32 ret_val;
|
||||
u16 list_offset, data_offset, data_value;
|
||||
|
||||
if (hw->phy.sfp_type != ixgbe_sfp_type_unknown) {
|
||||
@ -133,16 +133,14 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
|
||||
|
||||
ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset,
|
||||
&data_offset);
|
||||
if (ret_val != 0)
|
||||
goto setup_sfp_out;
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
/* PHY config will finish before releasing the semaphore */
|
||||
ret_val = hw->mac.ops.acquire_swfw_sync(hw,
|
||||
IXGBE_GSSR_MAC_CSR_SM);
|
||||
if (ret_val != 0) {
|
||||
ret_val = IXGBE_ERR_SWFW_SYNC;
|
||||
goto setup_sfp_out;
|
||||
}
|
||||
if (ret_val)
|
||||
return IXGBE_ERR_SWFW_SYNC;
|
||||
|
||||
if (hw->eeprom.ops.read(hw, ++data_offset, &data_value))
|
||||
goto setup_sfp_err;
|
||||
@ -169,13 +167,11 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
|
||||
|
||||
if (ret_val) {
|
||||
hw_dbg(hw, " sfp module setup not complete\n");
|
||||
ret_val = IXGBE_ERR_SFP_SETUP_NOT_COMPLETE;
|
||||
goto setup_sfp_out;
|
||||
return IXGBE_ERR_SFP_SETUP_NOT_COMPLETE;
|
||||
}
|
||||
}
|
||||
|
||||
setup_sfp_out:
|
||||
return ret_val;
|
||||
return 0;
|
||||
|
||||
setup_sfp_err:
|
||||
/* Release the semaphore */
|
||||
@ -294,7 +290,7 @@ static s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw)
|
||||
{
|
||||
struct ixgbe_mac_info *mac = &hw->mac;
|
||||
struct ixgbe_phy_info *phy = &hw->phy;
|
||||
s32 ret_val = 0;
|
||||
s32 ret_val;
|
||||
u32 esdp;
|
||||
|
||||
if (hw->device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP) {
|
||||
@ -355,7 +351,6 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed *speed,
|
||||
bool *autoneg)
|
||||
{
|
||||
s32 status = 0;
|
||||
u32 autoc = 0;
|
||||
|
||||
/* Determine 1G link capabilities off of SFP+ type */
|
||||
@ -367,7 +362,7 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) {
|
||||
*speed = IXGBE_LINK_SPEED_1GB_FULL;
|
||||
*autoneg = true;
|
||||
goto out;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -430,8 +425,7 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
|
||||
break;
|
||||
|
||||
default:
|
||||
status = IXGBE_ERR_LINK_SETUP;
|
||||
goto out;
|
||||
return IXGBE_ERR_LINK_SETUP;
|
||||
}
|
||||
|
||||
if (hw->phy.multispeed_fiber) {
|
||||
@ -445,8 +439,7 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
|
||||
*autoneg = true;
|
||||
}
|
||||
|
||||
out:
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -457,14 +450,12 @@ out:
|
||||
**/
|
||||
static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
|
||||
{
|
||||
enum ixgbe_media_type media_type;
|
||||
|
||||
/* Detect if there is a copper PHY attached. */
|
||||
switch (hw->phy.type) {
|
||||
case ixgbe_phy_cu_unknown:
|
||||
case ixgbe_phy_tn:
|
||||
media_type = ixgbe_media_type_copper;
|
||||
goto out;
|
||||
return ixgbe_media_type_copper;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -477,34 +468,31 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
|
||||
case IXGBE_DEV_ID_82599_BACKPLANE_FCOE:
|
||||
case IXGBE_DEV_ID_82599_XAUI_LOM:
|
||||
/* Default device ID is mezzanine card KX/KX4 */
|
||||
media_type = ixgbe_media_type_backplane;
|
||||
break;
|
||||
return ixgbe_media_type_backplane;
|
||||
|
||||
case IXGBE_DEV_ID_82599_SFP:
|
||||
case IXGBE_DEV_ID_82599_SFP_FCOE:
|
||||
case IXGBE_DEV_ID_82599_SFP_EM:
|
||||
case IXGBE_DEV_ID_82599_SFP_SF2:
|
||||
case IXGBE_DEV_ID_82599_SFP_SF_QP:
|
||||
case IXGBE_DEV_ID_82599EN_SFP:
|
||||
media_type = ixgbe_media_type_fiber;
|
||||
break;
|
||||
return ixgbe_media_type_fiber;
|
||||
|
||||
case IXGBE_DEV_ID_82599_CX4:
|
||||
media_type = ixgbe_media_type_cx4;
|
||||
break;
|
||||
return ixgbe_media_type_cx4;
|
||||
|
||||
case IXGBE_DEV_ID_82599_T3_LOM:
|
||||
media_type = ixgbe_media_type_copper;
|
||||
break;
|
||||
return ixgbe_media_type_copper;
|
||||
|
||||
case IXGBE_DEV_ID_82599_LS:
|
||||
media_type = ixgbe_media_type_fiber_lco;
|
||||
break;
|
||||
return ixgbe_media_type_fiber_lco;
|
||||
|
||||
case IXGBE_DEV_ID_82599_QSFP_SF_QP:
|
||||
media_type = ixgbe_media_type_fiber_qsfp;
|
||||
break;
|
||||
return ixgbe_media_type_fiber_qsfp;
|
||||
|
||||
default:
|
||||
media_type = ixgbe_media_type_unknown;
|
||||
break;
|
||||
return ixgbe_media_type_unknown;
|
||||
}
|
||||
out:
|
||||
return media_type;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -554,7 +542,7 @@ static s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw,
|
||||
status = hw->mac.ops.acquire_swfw_sync(hw,
|
||||
IXGBE_GSSR_MAC_CSR_SM);
|
||||
if (status)
|
||||
goto out;
|
||||
return status;
|
||||
|
||||
got_lock = true;
|
||||
}
|
||||
@ -591,7 +579,6 @@ static s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw,
|
||||
/* Add delay to filter out noises during initial link setup */
|
||||
msleep(50);
|
||||
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -958,7 +945,7 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
|
||||
bool autoneg_wait_to_complete)
|
||||
{
|
||||
bool autoneg = false;
|
||||
s32 status = 0;
|
||||
s32 status;
|
||||
u32 pma_pmd_1g, link_mode, links_reg, i;
|
||||
u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
|
||||
u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK;
|
||||
@ -974,15 +961,13 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
|
||||
/* Check to see if speed passed in is supported. */
|
||||
status = hw->mac.ops.get_link_capabilities(hw, &link_capabilities,
|
||||
&autoneg);
|
||||
if (status != 0)
|
||||
goto out;
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
speed &= link_capabilities;
|
||||
|
||||
if (speed == IXGBE_LINK_SPEED_UNKNOWN) {
|
||||
status = IXGBE_ERR_LINK_SETUP;
|
||||
goto out;
|
||||
}
|
||||
if (speed == IXGBE_LINK_SPEED_UNKNOWN)
|
||||
return IXGBE_ERR_LINK_SETUP;
|
||||
|
||||
/* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/
|
||||
if (hw->mac.orig_link_settings_stored)
|
||||
@ -1033,7 +1018,7 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
|
||||
/* Restart link */
|
||||
status = hw->mac.ops.prot_autoc_write(hw, autoc, false);
|
||||
if (status)
|
||||
goto out;
|
||||
return status;
|
||||
|
||||
/* Only poll for autoneg to complete if specified to do so */
|
||||
if (autoneg_wait_to_complete) {
|
||||
@ -1060,7 +1045,6 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
|
||||
msleep(50);
|
||||
}
|
||||
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -1105,8 +1089,8 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
||||
|
||||
/* Call adapter stop to disable tx/rx and clear interrupts */
|
||||
status = hw->mac.ops.stop_adapter(hw);
|
||||
if (status != 0)
|
||||
goto reset_hw_out;
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
/* flush pending Tx transactions */
|
||||
ixgbe_clear_tx_pending(hw);
|
||||
@ -1117,7 +1101,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
||||
status = hw->phy.ops.init(hw);
|
||||
|
||||
if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
||||
goto reset_hw_out;
|
||||
return status;
|
||||
|
||||
/* Setup SFP module if there is one present. */
|
||||
if (hw->phy.sfp_setup_needed) {
|
||||
@ -1126,7 +1110,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
||||
}
|
||||
|
||||
if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
||||
goto reset_hw_out;
|
||||
return status;
|
||||
|
||||
/* Reset PHY */
|
||||
if (hw->phy.reset_disable == false && hw->phy.ops.reset != NULL)
|
||||
@ -1216,7 +1200,7 @@ mac_reset_top:
|
||||
hw->mac.orig_autoc,
|
||||
false);
|
||||
if (status)
|
||||
goto reset_hw_out;
|
||||
return status;
|
||||
}
|
||||
|
||||
if ((autoc2 & IXGBE_AUTOC2_UPPER_MASK) !=
|
||||
@ -1258,7 +1242,6 @@ mac_reset_top:
|
||||
hw->mac.ops.get_wwn_prefix(hw, &hw->mac.wwnn_prefix,
|
||||
&hw->mac.wwpn_prefix);
|
||||
|
||||
reset_hw_out:
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -1927,20 +1910,20 @@ static s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw)
|
||||
s32 ret_val = 0;
|
||||
|
||||
ret_val = ixgbe_start_hw_generic(hw);
|
||||
if (ret_val != 0)
|
||||
goto out;
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
ret_val = ixgbe_start_hw_gen2(hw);
|
||||
if (ret_val != 0)
|
||||
goto out;
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
/* We need to run link autotry after the driver loads */
|
||||
hw->mac.autotry_restart = true;
|
||||
|
||||
if (ret_val == 0)
|
||||
ret_val = ixgbe_verify_fw_version_82599(hw);
|
||||
out:
|
||||
return ret_val;
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
return ixgbe_verify_fw_version_82599(hw);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1953,16 +1936,15 @@ out:
|
||||
**/
|
||||
static s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
|
||||
s32 status;
|
||||
|
||||
/* Detect PHY if not unknown - returns success if already detected. */
|
||||
status = ixgbe_identify_phy_generic(hw);
|
||||
if (status != 0) {
|
||||
if (status) {
|
||||
/* 82599 10GBASE-T requires an external PHY */
|
||||
if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper)
|
||||
goto out;
|
||||
else
|
||||
status = ixgbe_identify_module_generic(hw);
|
||||
return status;
|
||||
status = ixgbe_identify_module_generic(hw);
|
||||
}
|
||||
|
||||
/* Set PHY type none if no PHY detected */
|
||||
@ -1973,9 +1955,8 @@ static s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
|
||||
|
||||
/* Return error if SFP module has been detected but is not supported */
|
||||
if (hw->phy.type == ixgbe_phy_sfp_unsupported)
|
||||
status = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -2021,26 +2002,24 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
|
||||
u16 fw_version = 0;
|
||||
|
||||
/* firmware check is only necessary for SFI devices */
|
||||
if (hw->phy.media_type != ixgbe_media_type_fiber) {
|
||||
status = 0;
|
||||
goto fw_version_out;
|
||||
}
|
||||
if (hw->phy.media_type != ixgbe_media_type_fiber)
|
||||
return 0;
|
||||
|
||||
/* get the offset to the Firmware Module block */
|
||||
offset = IXGBE_FW_PTR;
|
||||
if (hw->eeprom.ops.read(hw, offset, &fw_offset))
|
||||
goto fw_version_err;
|
||||
|
||||
if ((fw_offset == 0) || (fw_offset == 0xFFFF))
|
||||
goto fw_version_out;
|
||||
if (fw_offset == 0 || fw_offset == 0xFFFF)
|
||||
return IXGBE_ERR_EEPROM_VERSION;
|
||||
|
||||
/* get the offset to the Pass Through Patch Configuration block */
|
||||
offset = fw_offset + IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR;
|
||||
if (hw->eeprom.ops.read(hw, offset, &fw_ptp_cfg_offset))
|
||||
goto fw_version_err;
|
||||
|
||||
if ((fw_ptp_cfg_offset == 0) || (fw_ptp_cfg_offset == 0xFFFF))
|
||||
goto fw_version_out;
|
||||
if (fw_ptp_cfg_offset == 0 || fw_ptp_cfg_offset == 0xFFFF)
|
||||
return IXGBE_ERR_EEPROM_VERSION;
|
||||
|
||||
/* get the firmware version */
|
||||
offset = fw_ptp_cfg_offset + IXGBE_FW_PATCH_VERSION_4;
|
||||
@ -2050,7 +2029,6 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
|
||||
if (fw_version > 0x5)
|
||||
status = 0;
|
||||
|
||||
fw_version_out:
|
||||
return status;
|
||||
|
||||
fw_version_err:
|
||||
@ -2067,37 +2045,33 @@ fw_version_err:
|
||||
**/
|
||||
static bool ixgbe_verify_lesm_fw_enabled_82599(struct ixgbe_hw *hw)
|
||||
{
|
||||
bool lesm_enabled = false;
|
||||
u16 fw_offset, fw_lesm_param_offset, fw_lesm_state;
|
||||
s32 status;
|
||||
|
||||
/* get the offset to the Firmware Module block */
|
||||
status = hw->eeprom.ops.read(hw, IXGBE_FW_PTR, &fw_offset);
|
||||
|
||||
if ((status != 0) ||
|
||||
(fw_offset == 0) || (fw_offset == 0xFFFF))
|
||||
goto out;
|
||||
if (status || fw_offset == 0 || fw_offset == 0xFFFF)
|
||||
return false;
|
||||
|
||||
/* get the offset to the LESM Parameters block */
|
||||
status = hw->eeprom.ops.read(hw, (fw_offset +
|
||||
IXGBE_FW_LESM_PARAMETERS_PTR),
|
||||
&fw_lesm_param_offset);
|
||||
|
||||
if ((status != 0) ||
|
||||
(fw_lesm_param_offset == 0) || (fw_lesm_param_offset == 0xFFFF))
|
||||
goto out;
|
||||
if (status ||
|
||||
fw_lesm_param_offset == 0 || fw_lesm_param_offset == 0xFFFF)
|
||||
return false;
|
||||
|
||||
/* get the lesm state word */
|
||||
status = hw->eeprom.ops.read(hw, (fw_lesm_param_offset +
|
||||
IXGBE_FW_LESM_STATE_1),
|
||||
&fw_lesm_state);
|
||||
|
||||
if ((status == 0) &&
|
||||
(fw_lesm_state & IXGBE_FW_LESM_STATE_ENABLED))
|
||||
lesm_enabled = true;
|
||||
if (!status && (fw_lesm_state & IXGBE_FW_LESM_STATE_ENABLED))
|
||||
return true;
|
||||
|
||||
out:
|
||||
return lesm_enabled;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2115,22 +2089,16 @@ static s32 ixgbe_read_eeprom_buffer_82599(struct ixgbe_hw *hw, u16 offset,
|
||||
u16 words, u16 *data)
|
||||
{
|
||||
struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
|
||||
s32 ret_val = IXGBE_ERR_CONFIG;
|
||||
|
||||
/*
|
||||
* If EEPROM is detected and can be addressed using 14 bits,
|
||||
/* If EEPROM is detected and can be addressed using 14 bits,
|
||||
* use EERD otherwise use bit bang
|
||||
*/
|
||||
if ((eeprom->type == ixgbe_eeprom_spi) &&
|
||||
(offset + (words - 1) <= IXGBE_EERD_MAX_ADDR))
|
||||
ret_val = ixgbe_read_eerd_buffer_generic(hw, offset, words,
|
||||
data);
|
||||
else
|
||||
ret_val = ixgbe_read_eeprom_buffer_bit_bang_generic(hw, offset,
|
||||
words,
|
||||
data);
|
||||
if (eeprom->type == ixgbe_eeprom_spi &&
|
||||
offset + (words - 1) <= IXGBE_EERD_MAX_ADDR)
|
||||
return ixgbe_read_eerd_buffer_generic(hw, offset, words, data);
|
||||
|
||||
return ret_val;
|
||||
return ixgbe_read_eeprom_buffer_bit_bang_generic(hw, offset, words,
|
||||
data);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2147,19 +2115,15 @@ static s32 ixgbe_read_eeprom_82599(struct ixgbe_hw *hw,
|
||||
u16 offset, u16 *data)
|
||||
{
|
||||
struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
|
||||
s32 ret_val = IXGBE_ERR_CONFIG;
|
||||
|
||||
/*
|
||||
* If EEPROM is detected and can be addressed using 14 bits,
|
||||
* use EERD otherwise use bit bang
|
||||
*/
|
||||
if ((eeprom->type == ixgbe_eeprom_spi) &&
|
||||
(offset <= IXGBE_EERD_MAX_ADDR))
|
||||
ret_val = ixgbe_read_eerd_generic(hw, offset, data);
|
||||
else
|
||||
ret_val = ixgbe_read_eeprom_bit_bang_generic(hw, offset, data);
|
||||
if (eeprom->type == ixgbe_eeprom_spi && offset <= IXGBE_EERD_MAX_ADDR)
|
||||
return ixgbe_read_eerd_generic(hw, offset, data);
|
||||
|
||||
return ret_val;
|
||||
return ixgbe_read_eeprom_bit_bang_generic(hw, offset, data);
|
||||
}
|
||||
|
||||
/**
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2013 Intel Corporation.
|
||||
Copyright(c) 1999 - 2014 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -87,7 +87,6 @@ s32 ixgbe_dcb_calculate_tc_credits(struct ixgbe_hw *hw,
|
||||
int min_credit;
|
||||
int min_multiplier;
|
||||
int min_percent = 100;
|
||||
s32 ret_val = 0;
|
||||
/* Initialization values default for Tx settings */
|
||||
u32 credit_refill = 0;
|
||||
u32 credit_max = 0;
|
||||
@ -95,10 +94,8 @@ s32 ixgbe_dcb_calculate_tc_credits(struct ixgbe_hw *hw,
|
||||
u8 bw_percent = 0;
|
||||
u8 i;
|
||||
|
||||
if (dcb_config == NULL) {
|
||||
ret_val = DCB_ERR_CONFIG;
|
||||
goto out;
|
||||
}
|
||||
if (!dcb_config)
|
||||
return DCB_ERR_CONFIG;
|
||||
|
||||
min_credit = ((max_frame / 2) + DCB_CREDIT_QUANTUM - 1) /
|
||||
DCB_CREDIT_QUANTUM;
|
||||
@ -174,8 +171,7 @@ s32 ixgbe_dcb_calculate_tc_credits(struct ixgbe_hw *hw,
|
||||
p->data_credits_max = (u16)credit_max;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ixgbe_dcb_unpack_pfc(struct ixgbe_dcb_config *cfg, u8 *pfc_en)
|
||||
@ -236,7 +232,7 @@ u8 ixgbe_dcb_get_tc_from_up(struct ixgbe_dcb_config *cfg, int direction, u8 up)
|
||||
|
||||
/* If tc is 0 then DCB is likely not enabled or supported */
|
||||
if (!tc)
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Test from maximum TC to 1 and report the first match we find. If
|
||||
@ -247,7 +243,7 @@ u8 ixgbe_dcb_get_tc_from_up(struct ixgbe_dcb_config *cfg, int direction, u8 up)
|
||||
if (prio_mask & tc_config[tc].path[direction].up_to_tc_bitmap)
|
||||
break;
|
||||
}
|
||||
out:
|
||||
|
||||
return tc;
|
||||
}
|
||||
|
||||
@ -269,7 +265,6 @@ void ixgbe_dcb_unpack_map(struct ixgbe_dcb_config *cfg, int direction, u8 *map)
|
||||
s32 ixgbe_dcb_hw_config(struct ixgbe_hw *hw,
|
||||
struct ixgbe_dcb_config *dcb_config)
|
||||
{
|
||||
s32 ret = 0;
|
||||
u8 pfc_en;
|
||||
u8 ptype[MAX_TRAFFIC_CLASS];
|
||||
u8 bwgid[MAX_TRAFFIC_CLASS];
|
||||
@ -287,37 +282,31 @@ s32 ixgbe_dcb_hw_config(struct ixgbe_hw *hw,
|
||||
|
||||
switch (hw->mac.type) {
|
||||
case ixgbe_mac_82598EB:
|
||||
ret = ixgbe_dcb_hw_config_82598(hw, pfc_en, refill, max,
|
||||
bwgid, ptype);
|
||||
break;
|
||||
return ixgbe_dcb_hw_config_82598(hw, pfc_en, refill, max,
|
||||
bwgid, ptype);
|
||||
case ixgbe_mac_82599EB:
|
||||
case ixgbe_mac_X540:
|
||||
ret = ixgbe_dcb_hw_config_82599(hw, pfc_en, refill, max,
|
||||
bwgid, ptype, prio_tc);
|
||||
break;
|
||||
return ixgbe_dcb_hw_config_82599(hw, pfc_en, refill, max,
|
||||
bwgid, ptype, prio_tc);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Helper routines to abstract HW specifics from DCB netlink ops */
|
||||
s32 ixgbe_dcb_hw_pfc_config(struct ixgbe_hw *hw, u8 pfc_en, u8 *prio_tc)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
||||
switch (hw->mac.type) {
|
||||
case ixgbe_mac_82598EB:
|
||||
ret = ixgbe_dcb_config_pfc_82598(hw, pfc_en);
|
||||
break;
|
||||
return ixgbe_dcb_config_pfc_82598(hw, pfc_en);
|
||||
case ixgbe_mac_82599EB:
|
||||
case ixgbe_mac_X540:
|
||||
ret = ixgbe_dcb_config_pfc_82599(hw, pfc_en, prio_tc);
|
||||
break;
|
||||
return ixgbe_dcb_config_pfc_82599(hw, pfc_en, prio_tc);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
s32 ixgbe_dcb_hw_ets(struct ixgbe_hw *hw, struct ieee_ets *ets, int max_frame)
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2013 Intel Corporation.
|
||||
Copyright(c) 1999 - 2014 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -153,7 +153,6 @@ static u8 ixgbe_dcbnl_get_state(struct net_device *netdev)
|
||||
static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
int err = 0;
|
||||
|
||||
/* Fail command if not in CEE mode */
|
||||
if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
|
||||
@ -161,12 +160,10 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
|
||||
|
||||
/* verify there is something to do, if not then exit */
|
||||
if (!state == !(adapter->flags & IXGBE_FLAG_DCB_ENABLED))
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
err = ixgbe_setup_tc(netdev,
|
||||
state ? adapter->dcb_cfg.num_tcs.pg_tcs : 0);
|
||||
out:
|
||||
return !!err;
|
||||
return !!ixgbe_setup_tc(netdev,
|
||||
state ? adapter->dcb_cfg.num_tcs.pg_tcs : 0);
|
||||
}
|
||||
|
||||
static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev,
|
||||
@ -331,12 +328,12 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
||||
|
||||
/* Fail command if not in CEE mode */
|
||||
if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
|
||||
return ret;
|
||||
return DCB_NO_HW_CHG;
|
||||
|
||||
adapter->dcb_set_bitmap |= ixgbe_copy_dcb_cfg(adapter,
|
||||
MAX_TRAFFIC_CLASS);
|
||||
if (!adapter->dcb_set_bitmap)
|
||||
return ret;
|
||||
return DCB_NO_HW_CHG;
|
||||
|
||||
if (adapter->dcb_set_bitmap & (BIT_PG_TX|BIT_PG_RX)) {
|
||||
u16 refill[MAX_TRAFFIC_CLASS], max[MAX_TRAFFIC_CLASS];
|
||||
@ -536,7 +533,7 @@ static int ixgbe_dcbnl_ieee_setets(struct net_device *dev,
|
||||
{
|
||||
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
||||
int max_frame = dev->mtu + ETH_HLEN + ETH_FCS_LEN;
|
||||
int i, err = 0;
|
||||
int i, err;
|
||||
__u8 max_tc = 0;
|
||||
__u8 map_chg = 0;
|
||||
|
||||
@ -573,17 +570,15 @@ static int ixgbe_dcbnl_ieee_setets(struct net_device *dev,
|
||||
if (max_tc > adapter->dcb_cfg.num_tcs.pg_tcs)
|
||||
return -EINVAL;
|
||||
|
||||
if (max_tc != netdev_get_num_tc(dev))
|
||||
if (max_tc != netdev_get_num_tc(dev)) {
|
||||
err = ixgbe_setup_tc(dev, max_tc);
|
||||
else if (map_chg)
|
||||
if (err)
|
||||
return err;
|
||||
} else if (map_chg) {
|
||||
ixgbe_dcbnl_devreset(dev);
|
||||
}
|
||||
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
err = ixgbe_dcb_hw_ets(&adapter->hw, ets, max_frame);
|
||||
err_out:
|
||||
return err;
|
||||
return ixgbe_dcb_hw_ets(&adapter->hw, ets, max_frame);
|
||||
}
|
||||
|
||||
static int ixgbe_dcbnl_ieee_getpfc(struct net_device *dev,
|
||||
@ -647,10 +642,10 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
|
||||
struct dcb_app *app)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
||||
int err = -EINVAL;
|
||||
int err;
|
||||
|
||||
if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
|
||||
return err;
|
||||
return -EINVAL;
|
||||
|
||||
err = dcb_ieee_setapp(dev, app);
|
||||
if (err)
|
||||
@ -662,7 +657,7 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
|
||||
u8 app_mask = dcb_ieee_getapp_mask(dev, app);
|
||||
|
||||
if (app_mask & (1 << adapter->fcoe.up))
|
||||
return err;
|
||||
return 0;
|
||||
|
||||
adapter->fcoe.up = app->priority;
|
||||
ixgbe_dcbnl_devreset(dev);
|
||||
@ -705,7 +700,7 @@ static int ixgbe_dcbnl_ieee_delapp(struct net_device *dev,
|
||||
u8 app_mask = dcb_ieee_getapp_mask(dev, app);
|
||||
|
||||
if (app_mask & (1 << adapter->fcoe.up))
|
||||
return err;
|
||||
return 0;
|
||||
|
||||
adapter->fcoe.up = app_mask ?
|
||||
ffs(app_mask) - 1 : IXGBE_FCOE_DEFTC;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2013 Intel Corporation.
|
||||
Copyright(c) 1999 - 2014 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -67,23 +67,23 @@ static inline void ixgbe_fcoe_clear_ddp(struct ixgbe_fcoe_ddp *ddp)
|
||||
*/
|
||||
int ixgbe_fcoe_ddp_put(struct net_device *netdev, u16 xid)
|
||||
{
|
||||
int len = 0;
|
||||
int len;
|
||||
struct ixgbe_fcoe *fcoe;
|
||||
struct ixgbe_adapter *adapter;
|
||||
struct ixgbe_fcoe_ddp *ddp;
|
||||
u32 fcbuff;
|
||||
|
||||
if (!netdev)
|
||||
goto out_ddp_put;
|
||||
return 0;
|
||||
|
||||
if (xid >= IXGBE_FCOE_DDP_MAX)
|
||||
goto out_ddp_put;
|
||||
return 0;
|
||||
|
||||
adapter = netdev_priv(netdev);
|
||||
fcoe = &adapter->fcoe;
|
||||
ddp = &fcoe->ddp[xid];
|
||||
if (!ddp->udl)
|
||||
goto out_ddp_put;
|
||||
return 0;
|
||||
|
||||
len = ddp->len;
|
||||
/* if there an error, force to invalidate ddp context */
|
||||
@ -114,7 +114,6 @@ int ixgbe_fcoe_ddp_put(struct net_device *netdev, u16 xid)
|
||||
|
||||
ixgbe_fcoe_clear_ddp(ddp);
|
||||
|
||||
out_ddp_put:
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -394,17 +393,17 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
|
||||
xid = be16_to_cpu(fh->fh_rx_id);
|
||||
|
||||
if (xid >= IXGBE_FCOE_DDP_MAX)
|
||||
goto ddp_out;
|
||||
return -EINVAL;
|
||||
|
||||
fcoe = &adapter->fcoe;
|
||||
ddp = &fcoe->ddp[xid];
|
||||
if (!ddp->udl)
|
||||
goto ddp_out;
|
||||
return -EINVAL;
|
||||
|
||||
ddp_err = ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_ERR_FCEOFE |
|
||||
IXGBE_RXDADV_ERR_FCERR);
|
||||
if (ddp_err)
|
||||
goto ddp_out;
|
||||
return -EINVAL;
|
||||
|
||||
switch (ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_STAT_FCSTAT)) {
|
||||
/* return 0 to bypass going to ULD for DDPed data */
|
||||
@ -447,7 +446,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
|
||||
crc = (struct fcoe_crc_eof *)skb_put(skb, sizeof(*crc));
|
||||
crc->fcoe_eof = FC_EOF_T;
|
||||
}
|
||||
ddp_out:
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -878,7 +877,6 @@ int ixgbe_fcoe_disable(struct net_device *netdev)
|
||||
*/
|
||||
int ixgbe_fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type)
|
||||
{
|
||||
int rc = -EINVAL;
|
||||
u16 prefix = 0xffff;
|
||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
struct ixgbe_mac_info *mac = &adapter->hw.mac;
|
||||
@ -903,9 +901,9 @@ int ixgbe_fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type)
|
||||
((u64) mac->san_addr[3] << 16) |
|
||||
((u64) mac->san_addr[4] << 8) |
|
||||
((u64) mac->san_addr[5]);
|
||||
rc = 0;
|
||||
return 0;
|
||||
}
|
||||
return rc;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -570,7 +570,7 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter)
|
||||
|
||||
/* Print TX Ring Summary */
|
||||
if (!netdev || !netif_running(netdev))
|
||||
goto exit;
|
||||
return;
|
||||
|
||||
dev_info(&adapter->pdev->dev, "TX Rings Summary\n");
|
||||
pr_info(" %s %s %s %s\n",
|
||||
@ -685,7 +685,7 @@ rx_ring_summary:
|
||||
|
||||
/* Print RX Rings */
|
||||
if (!netif_msg_rx_status(adapter))
|
||||
goto exit;
|
||||
return;
|
||||
|
||||
dev_info(&adapter->pdev->dev, "RX Rings Dump\n");
|
||||
|
||||
@ -787,9 +787,6 @@ rx_ring_summary:
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
static void ixgbe_release_hw_control(struct ixgbe_adapter *adapter)
|
||||
@ -1011,7 +1008,6 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_ring *tx_ring)
|
||||
u32 tx_done = ixgbe_get_tx_completed(tx_ring);
|
||||
u32 tx_done_old = tx_ring->tx_stats.tx_done_old;
|
||||
u32 tx_pending = ixgbe_get_tx_pending(tx_ring);
|
||||
bool ret = false;
|
||||
|
||||
clear_check_for_tx_hang(tx_ring);
|
||||
|
||||
@ -1027,18 +1023,16 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_ring *tx_ring)
|
||||
* run the check_tx_hang logic with a transmit completion
|
||||
* pending but without time to complete it yet.
|
||||
*/
|
||||
if ((tx_done_old == tx_done) && tx_pending) {
|
||||
if (tx_done_old == tx_done && tx_pending)
|
||||
/* make sure it is true for two checks in a row */
|
||||
ret = test_and_set_bit(__IXGBE_HANG_CHECK_ARMED,
|
||||
&tx_ring->state);
|
||||
} else {
|
||||
/* update completed stats and continue */
|
||||
tx_ring->tx_stats.tx_done_old = tx_done;
|
||||
/* reset the countdown */
|
||||
clear_bit(__IXGBE_HANG_CHECK_ARMED, &tx_ring->state);
|
||||
}
|
||||
return test_and_set_bit(__IXGBE_HANG_CHECK_ARMED,
|
||||
&tx_ring->state);
|
||||
/* update completed stats and continue */
|
||||
tx_ring->tx_stats.tx_done_old = tx_done;
|
||||
/* reset the countdown */
|
||||
clear_bit(__IXGBE_HANG_CHECK_ARMED, &tx_ring->state);
|
||||
|
||||
return ret;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -4701,18 +4695,18 @@ static int ixgbe_non_sfp_link_config(struct ixgbe_hw *hw)
|
||||
ret = hw->mac.ops.check_link(hw, &speed, &link_up, false);
|
||||
|
||||
if (ret)
|
||||
goto link_cfg_out;
|
||||
return ret;
|
||||
|
||||
speed = hw->phy.autoneg_advertised;
|
||||
if ((!speed) && (hw->mac.ops.get_link_capabilities))
|
||||
ret = hw->mac.ops.get_link_capabilities(hw, &speed,
|
||||
&autoneg);
|
||||
if (ret)
|
||||
goto link_cfg_out;
|
||||
return ret;
|
||||
|
||||
if (hw->mac.ops.setup_link)
|
||||
ret = hw->mac.ops.setup_link(hw, speed, link_up);
|
||||
link_cfg_out:
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -43,16 +43,15 @@
|
||||
s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
|
||||
{
|
||||
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
|
||||
/* limit read to size of mailbox */
|
||||
if (size > mbx->size)
|
||||
size = mbx->size;
|
||||
|
||||
if (mbx->ops.read)
|
||||
ret_val = mbx->ops.read(hw, msg, size, mbx_id);
|
||||
if (!mbx->ops.read)
|
||||
return IXGBE_ERR_MBX;
|
||||
|
||||
return ret_val;
|
||||
return mbx->ops.read(hw, msg, size, mbx_id);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -87,12 +86,11 @@ s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
|
||||
s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
|
||||
{
|
||||
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
|
||||
if (mbx->ops.check_for_msg)
|
||||
ret_val = mbx->ops.check_for_msg(hw, mbx_id);
|
||||
if (!mbx->ops.check_for_msg)
|
||||
return IXGBE_ERR_MBX;
|
||||
|
||||
return ret_val;
|
||||
return mbx->ops.check_for_msg(hw, mbx_id);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -105,12 +103,11 @@ s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
|
||||
s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
|
||||
{
|
||||
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
|
||||
if (mbx->ops.check_for_ack)
|
||||
ret_val = mbx->ops.check_for_ack(hw, mbx_id);
|
||||
if (!mbx->ops.check_for_ack)
|
||||
return IXGBE_ERR_MBX;
|
||||
|
||||
return ret_val;
|
||||
return mbx->ops.check_for_ack(hw, mbx_id);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -123,12 +120,11 @@ s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
|
||||
s32 ixgbe_check_for_rst(struct ixgbe_hw *hw, u16 mbx_id)
|
||||
{
|
||||
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
|
||||
if (mbx->ops.check_for_rst)
|
||||
ret_val = mbx->ops.check_for_rst(hw, mbx_id);
|
||||
if (!mbx->ops.check_for_rst)
|
||||
return IXGBE_ERR_MBX;
|
||||
|
||||
return ret_val;
|
||||
return mbx->ops.check_for_rst(hw, mbx_id);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -144,17 +140,16 @@ static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
|
||||
int countdown = mbx->timeout;
|
||||
|
||||
if (!countdown || !mbx->ops.check_for_msg)
|
||||
goto out;
|
||||
return IXGBE_ERR_MBX;
|
||||
|
||||
while (countdown && mbx->ops.check_for_msg(hw, mbx_id)) {
|
||||
while (mbx->ops.check_for_msg(hw, mbx_id)) {
|
||||
countdown--;
|
||||
if (!countdown)
|
||||
break;
|
||||
return IXGBE_ERR_MBX;
|
||||
udelay(mbx->usec_delay);
|
||||
}
|
||||
|
||||
out:
|
||||
return countdown ? 0 : IXGBE_ERR_MBX;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -170,17 +165,16 @@ static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
|
||||
int countdown = mbx->timeout;
|
||||
|
||||
if (!countdown || !mbx->ops.check_for_ack)
|
||||
goto out;
|
||||
return IXGBE_ERR_MBX;
|
||||
|
||||
while (countdown && mbx->ops.check_for_ack(hw, mbx_id)) {
|
||||
while (mbx->ops.check_for_ack(hw, mbx_id)) {
|
||||
countdown--;
|
||||
if (!countdown)
|
||||
break;
|
||||
return IXGBE_ERR_MBX;
|
||||
udelay(mbx->usec_delay);
|
||||
}
|
||||
|
||||
out:
|
||||
return countdown ? 0 : IXGBE_ERR_MBX;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -197,18 +191,17 @@ static s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,
|
||||
u16 mbx_id)
|
||||
{
|
||||
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
s32 ret_val;
|
||||
|
||||
if (!mbx->ops.read)
|
||||
goto out;
|
||||
return IXGBE_ERR_MBX;
|
||||
|
||||
ret_val = ixgbe_poll_for_msg(hw, mbx_id);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
/* if ack received read message, otherwise we timed out */
|
||||
if (!ret_val)
|
||||
ret_val = mbx->ops.read(hw, msg, size, mbx_id);
|
||||
out:
|
||||
return ret_val;
|
||||
/* if ack received read message */
|
||||
return mbx->ops.read(hw, msg, size, mbx_id);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -225,33 +218,31 @@ static s32 ixgbe_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,
|
||||
u16 mbx_id)
|
||||
{
|
||||
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
s32 ret_val;
|
||||
|
||||
/* exit if either we can't write or there isn't a defined timeout */
|
||||
if (!mbx->ops.write || !mbx->timeout)
|
||||
goto out;
|
||||
return IXGBE_ERR_MBX;
|
||||
|
||||
/* send msg */
|
||||
ret_val = mbx->ops.write(hw, msg, size, mbx_id);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
/* if msg sent wait until we receive an ack */
|
||||
if (!ret_val)
|
||||
ret_val = ixgbe_poll_for_ack(hw, mbx_id);
|
||||
out:
|
||||
return ret_val;
|
||||
return ixgbe_poll_for_ack(hw, mbx_id);
|
||||
}
|
||||
|
||||
static s32 ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, u32 mask, s32 index)
|
||||
{
|
||||
u32 mbvficr = IXGBE_READ_REG(hw, IXGBE_MBVFICR(index));
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
|
||||
if (mbvficr & mask) {
|
||||
ret_val = 0;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MBVFICR(index), mask);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
return IXGBE_ERR_MBX;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -263,17 +254,16 @@ static s32 ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, u32 mask, s32 index)
|
||||
**/
|
||||
static s32 ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, u16 vf_number)
|
||||
{
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
s32 index = IXGBE_MBVFICR_INDEX(vf_number);
|
||||
u32 vf_bit = vf_number % 16;
|
||||
|
||||
if (!ixgbe_check_for_bit_pf(hw, IXGBE_MBVFICR_VFREQ_VF1 << vf_bit,
|
||||
index)) {
|
||||
ret_val = 0;
|
||||
hw->mbx.stats.reqs++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
return IXGBE_ERR_MBX;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -285,17 +275,16 @@ static s32 ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, u16 vf_number)
|
||||
**/
|
||||
static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_number)
|
||||
{
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
s32 index = IXGBE_MBVFICR_INDEX(vf_number);
|
||||
u32 vf_bit = vf_number % 16;
|
||||
|
||||
if (!ixgbe_check_for_bit_pf(hw, IXGBE_MBVFICR_VFACK_VF1 << vf_bit,
|
||||
index)) {
|
||||
ret_val = 0;
|
||||
hw->mbx.stats.acks++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
return IXGBE_ERR_MBX;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -310,7 +299,6 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
|
||||
u32 reg_offset = (vf_number < 32) ? 0 : 1;
|
||||
u32 vf_shift = vf_number % 32;
|
||||
u32 vflre = 0;
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
|
||||
switch (hw->mac.type) {
|
||||
case ixgbe_mac_82599EB:
|
||||
@ -324,12 +312,12 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
|
||||
}
|
||||
|
||||
if (vflre & (1 << vf_shift)) {
|
||||
ret_val = 0;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VFLREC(reg_offset), (1 << vf_shift));
|
||||
hw->mbx.stats.rsts++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
return IXGBE_ERR_MBX;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -341,7 +329,6 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
|
||||
**/
|
||||
static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)
|
||||
{
|
||||
s32 ret_val = IXGBE_ERR_MBX;
|
||||
u32 p2v_mailbox;
|
||||
|
||||
/* Take ownership of the buffer */
|
||||
@ -350,9 +337,9 @@ static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)
|
||||
/* reserve mailbox for vf use */
|
||||
p2v_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_number));
|
||||
if (p2v_mailbox & IXGBE_PFMAILBOX_PFU)
|
||||
ret_val = 0;
|
||||
return 0;
|
||||
|
||||
return ret_val;
|
||||
return IXGBE_ERR_MBX;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -373,7 +360,7 @@ static s32 ixgbe_write_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
|
||||
/* lock the mailbox to prevent pf/vf race condition */
|
||||
ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number);
|
||||
if (ret_val)
|
||||
goto out_no_write;
|
||||
return ret_val;
|
||||
|
||||
/* flush msg and acks as we are overwriting the message buffer */
|
||||
ixgbe_check_for_msg_pf(hw, vf_number);
|
||||
@ -389,9 +376,7 @@ static s32 ixgbe_write_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
|
||||
/* update stats */
|
||||
hw->mbx.stats.msgs_tx++;
|
||||
|
||||
out_no_write:
|
||||
return ret_val;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -414,7 +399,7 @@ static s32 ixgbe_read_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
|
||||
/* lock the mailbox to prevent pf/vf race condition */
|
||||
ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number);
|
||||
if (ret_val)
|
||||
goto out_no_read;
|
||||
return ret_val;
|
||||
|
||||
/* copy the message to the mailbox memory buffer */
|
||||
for (i = 0; i < size; i++)
|
||||
@ -426,8 +411,7 @@ static s32 ixgbe_read_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
|
||||
/* update stats */
|
||||
hw->mbx.stats.msgs_rx++;
|
||||
|
||||
out_no_read:
|
||||
return ret_val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
|
@ -57,7 +57,6 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw);
|
||||
**/
|
||||
s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
|
||||
u32 phy_addr;
|
||||
u16 ext_ability = 0;
|
||||
|
||||
@ -84,18 +83,14 @@ s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
|
||||
ixgbe_phy_generic;
|
||||
}
|
||||
|
||||
status = 0;
|
||||
break;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/* clear value if nothing found */
|
||||
if (status != 0)
|
||||
hw->phy.mdio.prtad = 0;
|
||||
} else {
|
||||
status = 0;
|
||||
hw->phy.mdio.prtad = 0;
|
||||
return IXGBE_ERR_PHY_ADDR_INVALID;
|
||||
}
|
||||
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -192,16 +187,16 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
|
||||
status = ixgbe_identify_phy_generic(hw);
|
||||
|
||||
if (status != 0 || hw->phy.type == ixgbe_phy_none)
|
||||
goto out;
|
||||
return status;
|
||||
|
||||
/* Don't reset PHY if it's shut down due to overtemp. */
|
||||
if (!hw->phy.reset_if_overtemp &&
|
||||
(IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
/* Blocked by MNG FW so bail */
|
||||
if (ixgbe_check_reset_blocked(hw))
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Perform soft PHY reset to the PHY_XS.
|
||||
@ -227,12 +222,11 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
|
||||
}
|
||||
|
||||
if (ctrl & MDIO_CTRL1_RESET) {
|
||||
status = IXGBE_ERR_RESET_FAILED;
|
||||
hw_dbg(hw, "PHY reset polling failed to complete.\n");
|
||||
return IXGBE_ERR_RESET_FAILED;
|
||||
}
|
||||
|
||||
out:
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -333,7 +327,7 @@ s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
||||
phy_data);
|
||||
hw->mac.ops.release_swfw_sync(hw, gssr);
|
||||
} else {
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
return IXGBE_ERR_SWFW_SYNC;
|
||||
}
|
||||
|
||||
return status;
|
||||
@ -436,7 +430,7 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
||||
phy_data);
|
||||
hw->mac.ops.release_swfw_sync(hw, gssr);
|
||||
} else {
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
return IXGBE_ERR_SWFW_SYNC;
|
||||
}
|
||||
|
||||
return status;
|
||||
@ -509,7 +503,7 @@ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
|
||||
|
||||
/* Blocked by MNG FW so don't reset PHY */
|
||||
if (ixgbe_check_reset_blocked(hw))
|
||||
return status;
|
||||
return 0;
|
||||
|
||||
/* Restart PHY autonegotiation and wait for completion */
|
||||
hw->phy.ops.read_reg(hw, MDIO_CTRL1,
|
||||
@ -535,8 +529,8 @@ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
|
||||
}
|
||||
|
||||
if (time_out == max_time_out) {
|
||||
status = IXGBE_ERR_LINK_SETUP;
|
||||
hw_dbg(hw, "ixgbe_setup_phy_link_generic: time out\n");
|
||||
return IXGBE_ERR_LINK_SETUP;
|
||||
}
|
||||
|
||||
return status;
|
||||
@ -585,7 +579,7 @@ s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed *speed,
|
||||
bool *autoneg)
|
||||
{
|
||||
s32 status = IXGBE_ERR_LINK_SETUP;
|
||||
s32 status;
|
||||
u16 speed_ability;
|
||||
|
||||
*speed = 0;
|
||||
@ -616,7 +610,7 @@ s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
|
||||
s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
|
||||
bool *link_up)
|
||||
{
|
||||
s32 status = 0;
|
||||
s32 status;
|
||||
u32 time_out;
|
||||
u32 max_time_out = 10;
|
||||
u16 phy_link = 0;
|
||||
@ -662,7 +656,7 @@ s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
|
||||
**/
|
||||
s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = 0;
|
||||
s32 status;
|
||||
u32 time_out;
|
||||
u32 max_time_out = 10;
|
||||
u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
|
||||
@ -719,7 +713,7 @@ s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
|
||||
|
||||
/* Blocked by MNG FW so don't reset PHY */
|
||||
if (ixgbe_check_reset_blocked(hw))
|
||||
return status;
|
||||
return 0;
|
||||
|
||||
/* Restart PHY autonegotiation and wait for completion */
|
||||
hw->phy.ops.read_reg(hw, MDIO_CTRL1,
|
||||
@ -744,8 +738,8 @@ s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
|
||||
}
|
||||
|
||||
if (time_out == max_time_out) {
|
||||
status = IXGBE_ERR_LINK_SETUP;
|
||||
hw_dbg(hw, "ixgbe_setup_phy_link_tnx: time out\n");
|
||||
return IXGBE_ERR_LINK_SETUP;
|
||||
}
|
||||
|
||||
return status;
|
||||
@ -759,7 +753,7 @@ s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
|
||||
s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
|
||||
u16 *firmware_version)
|
||||
{
|
||||
s32 status = 0;
|
||||
s32 status;
|
||||
|
||||
status = hw->phy.ops.read_reg(hw, TNX_FW_REV,
|
||||
MDIO_MMD_VEND1,
|
||||
@ -776,7 +770,7 @@ s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
|
||||
s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw,
|
||||
u16 *firmware_version)
|
||||
{
|
||||
s32 status = 0;
|
||||
s32 status;
|
||||
|
||||
status = hw->phy.ops.read_reg(hw, AQ_FW_REV,
|
||||
MDIO_MMD_VEND1,
|
||||
@ -795,12 +789,12 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
|
||||
bool end_data = false;
|
||||
u16 list_offset, data_offset;
|
||||
u16 phy_data = 0;
|
||||
s32 ret_val = 0;
|
||||
s32 ret_val;
|
||||
u32 i;
|
||||
|
||||
/* Blocked by MNG FW so bail */
|
||||
if (ixgbe_check_reset_blocked(hw))
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
hw->phy.ops.read_reg(hw, MDIO_CTRL1, MDIO_MMD_PHYXS, &phy_data);
|
||||
|
||||
@ -818,15 +812,14 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
|
||||
|
||||
if ((phy_data & MDIO_CTRL1_RESET) != 0) {
|
||||
hw_dbg(hw, "PHY reset did not complete.\n");
|
||||
ret_val = IXGBE_ERR_PHY;
|
||||
goto out;
|
||||
return IXGBE_ERR_PHY;
|
||||
}
|
||||
|
||||
/* Get init offsets */
|
||||
ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset,
|
||||
&data_offset);
|
||||
if (ret_val != 0)
|
||||
goto out;
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc);
|
||||
data_offset++;
|
||||
@ -876,18 +869,15 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
|
||||
hw_dbg(hw, "SOL\n");
|
||||
} else {
|
||||
hw_dbg(hw, "Bad control value\n");
|
||||
ret_val = IXGBE_ERR_PHY;
|
||||
goto out;
|
||||
return IXGBE_ERR_PHY;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
hw_dbg(hw, "Bad control type\n");
|
||||
ret_val = IXGBE_ERR_PHY;
|
||||
goto out;
|
||||
return IXGBE_ERR_PHY;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
|
||||
err_eeprom:
|
||||
@ -903,34 +893,29 @@ err_eeprom:
|
||||
**/
|
||||
s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
|
||||
switch (hw->mac.ops.get_media_type(hw)) {
|
||||
case ixgbe_media_type_fiber:
|
||||
status = ixgbe_identify_sfp_module_generic(hw);
|
||||
break;
|
||||
return ixgbe_identify_sfp_module_generic(hw);
|
||||
case ixgbe_media_type_fiber_qsfp:
|
||||
status = ixgbe_identify_qsfp_module_generic(hw);
|
||||
break;
|
||||
return ixgbe_identify_qsfp_module_generic(hw);
|
||||
default:
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
||||
status = IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
break;
|
||||
return IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
}
|
||||
|
||||
return status;
|
||||
return IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_identify_sfp_module_generic - Identifies SFP modules
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
*
|
||||
* Searches for and identifies the SFP module and assigns appropriate PHY type.
|
||||
**/
|
||||
s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = hw->back;
|
||||
s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
|
||||
s32 status;
|
||||
u32 vendor_oui = 0;
|
||||
enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
|
||||
u8 identifier = 0;
|
||||
@ -943,15 +928,14 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
|
||||
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
||||
status = IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
goto out;
|
||||
return IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
}
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_IDENTIFIER,
|
||||
&identifier);
|
||||
|
||||
if (status != 0)
|
||||
if (status)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
/* LAN ID is needed for sfp_type determination */
|
||||
@ -959,239 +943,224 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
|
||||
if (identifier != IXGBE_SFF_IDENTIFIER_SFP) {
|
||||
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
||||
status = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
} else {
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_1GBE_COMP_CODES,
|
||||
&comp_codes_1g);
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
}
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_1GBE_COMP_CODES,
|
||||
&comp_codes_1g);
|
||||
|
||||
if (status != 0)
|
||||
goto err_read_i2c_eeprom;
|
||||
if (status)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_10GBE_COMP_CODES,
|
||||
&comp_codes_10g);
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_10GBE_COMP_CODES,
|
||||
&comp_codes_10g);
|
||||
|
||||
if (status != 0)
|
||||
goto err_read_i2c_eeprom;
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_CABLE_TECHNOLOGY,
|
||||
&cable_tech);
|
||||
if (status)
|
||||
goto err_read_i2c_eeprom;
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_CABLE_TECHNOLOGY,
|
||||
&cable_tech);
|
||||
|
||||
if (status != 0)
|
||||
goto err_read_i2c_eeprom;
|
||||
if (status)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
/* ID Module
|
||||
* =========
|
||||
* 0 SFP_DA_CU
|
||||
* 1 SFP_SR
|
||||
* 2 SFP_LR
|
||||
* 3 SFP_DA_CORE0 - 82599-specific
|
||||
* 4 SFP_DA_CORE1 - 82599-specific
|
||||
* 5 SFP_SR/LR_CORE0 - 82599-specific
|
||||
* 6 SFP_SR/LR_CORE1 - 82599-specific
|
||||
* 7 SFP_act_lmt_DA_CORE0 - 82599-specific
|
||||
* 8 SFP_act_lmt_DA_CORE1 - 82599-specific
|
||||
* 9 SFP_1g_cu_CORE0 - 82599-specific
|
||||
* 10 SFP_1g_cu_CORE1 - 82599-specific
|
||||
* 11 SFP_1g_sx_CORE0 - 82599-specific
|
||||
* 12 SFP_1g_sx_CORE1 - 82599-specific
|
||||
*/
|
||||
if (hw->mac.type == ixgbe_mac_82598EB) {
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
|
||||
else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_sr;
|
||||
else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_lr;
|
||||
/* ID Module
|
||||
* =========
|
||||
* 0 SFP_DA_CU
|
||||
* 1 SFP_SR
|
||||
* 2 SFP_LR
|
||||
* 3 SFP_DA_CORE0 - 82599-specific
|
||||
* 4 SFP_DA_CORE1 - 82599-specific
|
||||
* 5 SFP_SR/LR_CORE0 - 82599-specific
|
||||
* 6 SFP_SR/LR_CORE1 - 82599-specific
|
||||
* 7 SFP_act_lmt_DA_CORE0 - 82599-specific
|
||||
* 8 SFP_act_lmt_DA_CORE1 - 82599-specific
|
||||
* 9 SFP_1g_cu_CORE0 - 82599-specific
|
||||
* 10 SFP_1g_cu_CORE1 - 82599-specific
|
||||
* 11 SFP_1g_sx_CORE0 - 82599-specific
|
||||
* 12 SFP_1g_sx_CORE1 - 82599-specific
|
||||
*/
|
||||
if (hw->mac.type == ixgbe_mac_82598EB) {
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
|
||||
else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_sr;
|
||||
else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_lr;
|
||||
else
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
|
||||
} else if (hw->mac.type == ixgbe_mac_82599EB) {
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_cu_core0;
|
||||
else
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
|
||||
} else if (hw->mac.type == ixgbe_mac_82599EB) {
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_cu_core1;
|
||||
} else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) {
|
||||
hw->phy.ops.read_i2c_eeprom(
|
||||
hw, IXGBE_SFF_CABLE_SPEC_COMP,
|
||||
&cable_spec);
|
||||
if (cable_spec &
|
||||
IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_cu_core0;
|
||||
ixgbe_sfp_type_da_act_lmt_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_cu_core1;
|
||||
} else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) {
|
||||
hw->phy.ops.read_i2c_eeprom(
|
||||
hw, IXGBE_SFF_CABLE_SPEC_COMP,
|
||||
&cable_spec);
|
||||
if (cable_spec &
|
||||
IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_act_lmt_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_act_lmt_core1;
|
||||
} else {
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_unknown;
|
||||
}
|
||||
} else if (comp_codes_10g &
|
||||
(IXGBE_SFF_10GBASESR_CAPABLE |
|
||||
IXGBE_SFF_10GBASELR_CAPABLE)) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core1;
|
||||
} else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_cu_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_cu_core1;
|
||||
} else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_sx_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_sx_core1;
|
||||
} else if (comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_lx_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_lx_core1;
|
||||
ixgbe_sfp_type_da_act_lmt_core1;
|
||||
} else {
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw->phy.sfp_type != stored_sfp_type)
|
||||
hw->phy.sfp_setup_needed = true;
|
||||
|
||||
/* Determine if the SFP+ PHY is dual speed or not. */
|
||||
hw->phy.multispeed_fiber = false;
|
||||
if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
|
||||
(comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
|
||||
((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
|
||||
(comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
|
||||
hw->phy.multispeed_fiber = true;
|
||||
|
||||
/* Determine PHY vendor */
|
||||
if (hw->phy.type != ixgbe_phy_nl) {
|
||||
hw->phy.id = identifier;
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_VENDOR_OUI_BYTE0,
|
||||
&oui_bytes[0]);
|
||||
|
||||
if (status != 0)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_VENDOR_OUI_BYTE1,
|
||||
&oui_bytes[1]);
|
||||
|
||||
if (status != 0)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_VENDOR_OUI_BYTE2,
|
||||
&oui_bytes[2]);
|
||||
|
||||
if (status != 0)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
vendor_oui =
|
||||
((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
|
||||
(oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
|
||||
(oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
|
||||
|
||||
switch (vendor_oui) {
|
||||
case IXGBE_SFF_VENDOR_OUI_TYCO:
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_passive_tyco;
|
||||
break;
|
||||
case IXGBE_SFF_VENDOR_OUI_FTL:
|
||||
if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
||||
hw->phy.type = ixgbe_phy_sfp_ftl_active;
|
||||
else
|
||||
hw->phy.type = ixgbe_phy_sfp_ftl;
|
||||
break;
|
||||
case IXGBE_SFF_VENDOR_OUI_AVAGO:
|
||||
hw->phy.type = ixgbe_phy_sfp_avago;
|
||||
break;
|
||||
case IXGBE_SFF_VENDOR_OUI_INTEL:
|
||||
hw->phy.type = ixgbe_phy_sfp_intel;
|
||||
break;
|
||||
default:
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_passive_unknown;
|
||||
else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_active_unknown;
|
||||
else
|
||||
hw->phy.type = ixgbe_phy_sfp_unknown;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allow any DA cable vendor */
|
||||
if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
|
||||
IXGBE_SFF_DA_ACTIVE_CABLE)) {
|
||||
status = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Verify supported 1G SFP modules */
|
||||
if (comp_codes_10g == 0 &&
|
||||
!(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
|
||||
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
||||
status = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Anything else 82598-based is supported */
|
||||
if (hw->mac.type == ixgbe_mac_82598EB) {
|
||||
status = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
hw->mac.ops.get_device_caps(hw, &enforce_sfp);
|
||||
if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) &&
|
||||
!(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
|
||||
/* Make sure we're a supported PHY type */
|
||||
if (hw->phy.type == ixgbe_phy_sfp_intel) {
|
||||
status = 0;
|
||||
} else {
|
||||
if (hw->allow_unsupported_sfp) {
|
||||
e_warn(drv, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules.\n");
|
||||
status = 0;
|
||||
} else {
|
||||
hw_dbg(hw,
|
||||
"SFP+ module not supported\n");
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_unsupported;
|
||||
status = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
}
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_unknown;
|
||||
}
|
||||
} else if (comp_codes_10g &
|
||||
(IXGBE_SFF_10GBASESR_CAPABLE |
|
||||
IXGBE_SFF_10GBASELR_CAPABLE)) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core1;
|
||||
} else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_cu_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_cu_core1;
|
||||
} else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_sx_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_sx_core1;
|
||||
} else if (comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_lx_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_lx_core1;
|
||||
} else {
|
||||
status = 0;
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
return status;
|
||||
if (hw->phy.sfp_type != stored_sfp_type)
|
||||
hw->phy.sfp_setup_needed = true;
|
||||
|
||||
/* Determine if the SFP+ PHY is dual speed or not. */
|
||||
hw->phy.multispeed_fiber = false;
|
||||
if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
|
||||
(comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
|
||||
((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
|
||||
(comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
|
||||
hw->phy.multispeed_fiber = true;
|
||||
|
||||
/* Determine PHY vendor */
|
||||
if (hw->phy.type != ixgbe_phy_nl) {
|
||||
hw->phy.id = identifier;
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_VENDOR_OUI_BYTE0,
|
||||
&oui_bytes[0]);
|
||||
|
||||
if (status != 0)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_VENDOR_OUI_BYTE1,
|
||||
&oui_bytes[1]);
|
||||
|
||||
if (status != 0)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_VENDOR_OUI_BYTE2,
|
||||
&oui_bytes[2]);
|
||||
|
||||
if (status != 0)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
vendor_oui =
|
||||
((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
|
||||
(oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
|
||||
(oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
|
||||
|
||||
switch (vendor_oui) {
|
||||
case IXGBE_SFF_VENDOR_OUI_TYCO:
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_passive_tyco;
|
||||
break;
|
||||
case IXGBE_SFF_VENDOR_OUI_FTL:
|
||||
if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
||||
hw->phy.type = ixgbe_phy_sfp_ftl_active;
|
||||
else
|
||||
hw->phy.type = ixgbe_phy_sfp_ftl;
|
||||
break;
|
||||
case IXGBE_SFF_VENDOR_OUI_AVAGO:
|
||||
hw->phy.type = ixgbe_phy_sfp_avago;
|
||||
break;
|
||||
case IXGBE_SFF_VENDOR_OUI_INTEL:
|
||||
hw->phy.type = ixgbe_phy_sfp_intel;
|
||||
break;
|
||||
default:
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_passive_unknown;
|
||||
else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_active_unknown;
|
||||
else
|
||||
hw->phy.type = ixgbe_phy_sfp_unknown;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allow any DA cable vendor */
|
||||
if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
|
||||
IXGBE_SFF_DA_ACTIVE_CABLE))
|
||||
return 0;
|
||||
|
||||
/* Verify supported 1G SFP modules */
|
||||
if (comp_codes_10g == 0 &&
|
||||
!(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
|
||||
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
/* Anything else 82598-based is supported */
|
||||
if (hw->mac.type == ixgbe_mac_82598EB)
|
||||
return 0;
|
||||
|
||||
hw->mac.ops.get_device_caps(hw, &enforce_sfp);
|
||||
if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) &&
|
||||
!(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
|
||||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
|
||||
/* Make sure we're a supported PHY type */
|
||||
if (hw->phy.type == ixgbe_phy_sfp_intel)
|
||||
return 0;
|
||||
if (hw->allow_unsupported_sfp) {
|
||||
e_warn(drv, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules.\n");
|
||||
return 0;
|
||||
}
|
||||
hw_dbg(hw, "SFP+ module not supported\n");
|
||||
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_read_i2c_eeprom:
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
||||
@ -1211,7 +1180,7 @@ err_read_i2c_eeprom:
|
||||
static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = hw->back;
|
||||
s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
|
||||
s32 status;
|
||||
u32 vendor_oui = 0;
|
||||
enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
|
||||
u8 identifier = 0;
|
||||
@ -1226,8 +1195,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
||||
|
||||
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber_qsfp) {
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
||||
status = IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
goto out;
|
||||
return IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
}
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER,
|
||||
@ -1238,8 +1206,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
||||
|
||||
if (identifier != IXGBE_SFF_IDENTIFIER_QSFP_PLUS) {
|
||||
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
||||
status = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
goto out;
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
hw->phy.id = identifier;
|
||||
@ -1310,8 +1277,7 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
||||
} else {
|
||||
/* unsupported module type */
|
||||
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
||||
status = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
goto out;
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1363,27 +1329,19 @@ static s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
||||
hw->mac.ops.get_device_caps(hw, &enforce_sfp);
|
||||
if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP)) {
|
||||
/* Make sure we're a supported PHY type */
|
||||
if (hw->phy.type == ixgbe_phy_qsfp_intel) {
|
||||
status = 0;
|
||||
} else {
|
||||
if (hw->allow_unsupported_sfp == true) {
|
||||
e_warn(drv, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules.\n");
|
||||
status = 0;
|
||||
} else {
|
||||
hw_dbg(hw,
|
||||
"QSFP module not supported\n");
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_unsupported;
|
||||
status = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
}
|
||||
if (hw->phy.type == ixgbe_phy_qsfp_intel)
|
||||
return 0;
|
||||
if (hw->allow_unsupported_sfp) {
|
||||
e_warn(drv, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules.\n");
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
status = 0;
|
||||
hw_dbg(hw, "QSFP module not supported\n");
|
||||
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
out:
|
||||
return status;
|
||||
return 0;
|
||||
|
||||
err_read_i2c_eeprom:
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
||||
@ -1544,7 +1502,7 @@ s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
u8 dev_addr, u8 *data)
|
||||
{
|
||||
s32 status = 0;
|
||||
s32 status;
|
||||
u32 max_retry = 10;
|
||||
u32 retry = 0;
|
||||
u16 swfw_mask = 0;
|
||||
@ -1557,10 +1515,8 @@ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
swfw_mask = IXGBE_GSSR_PHY0_SM;
|
||||
|
||||
do {
|
||||
if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) != 0) {
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
goto read_byte_out;
|
||||
}
|
||||
if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
|
||||
return IXGBE_ERR_SWFW_SYNC;
|
||||
|
||||
ixgbe_i2c_start(hw);
|
||||
|
||||
@ -1617,7 +1573,6 @@ fail:
|
||||
|
||||
hw->mac.ops.release_swfw_sync(hw, swfw_mask);
|
||||
|
||||
read_byte_out:
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -1633,7 +1588,7 @@ read_byte_out:
|
||||
s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
u8 dev_addr, u8 data)
|
||||
{
|
||||
s32 status = 0;
|
||||
s32 status;
|
||||
u32 max_retry = 1;
|
||||
u32 retry = 0;
|
||||
u16 swfw_mask = 0;
|
||||
@ -1643,10 +1598,8 @@ s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
else
|
||||
swfw_mask = IXGBE_GSSR_PHY0_SM;
|
||||
|
||||
if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) != 0) {
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
goto write_byte_out;
|
||||
}
|
||||
if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
|
||||
return IXGBE_ERR_SWFW_SYNC;
|
||||
|
||||
do {
|
||||
ixgbe_i2c_start(hw);
|
||||
@ -1689,7 +1642,6 @@ fail:
|
||||
|
||||
hw->mac.ops.release_swfw_sync(hw, swfw_mask);
|
||||
|
||||
write_byte_out:
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -1774,7 +1726,7 @@ static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data)
|
||||
**/
|
||||
static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data)
|
||||
{
|
||||
s32 status = 0;
|
||||
s32 status;
|
||||
s32 i;
|
||||
u32 i2cctl;
|
||||
bool bit = false;
|
||||
@ -1893,11 +1845,11 @@ static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
|
||||
*/
|
||||
udelay(IXGBE_I2C_T_LOW);
|
||||
} else {
|
||||
status = IXGBE_ERR_I2C;
|
||||
hw_dbg(hw, "I2C data was not set to %X\n", data);
|
||||
return IXGBE_ERR_I2C;
|
||||
}
|
||||
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
* ixgbe_raise_i2c_clk - Raises the I2C SCL clock
|
||||
@ -1954,8 +1906,6 @@ static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
|
||||
**/
|
||||
static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
|
||||
{
|
||||
s32 status = 0;
|
||||
|
||||
if (data)
|
||||
*i2cctl |= IXGBE_I2C_DATA_OUT;
|
||||
else
|
||||
@ -1970,11 +1920,11 @@ static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
|
||||
/* Verify data was set correctly */
|
||||
*i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
|
||||
if (data != ixgbe_get_i2c_data(i2cctl)) {
|
||||
status = IXGBE_ERR_I2C;
|
||||
hw_dbg(hw, "Error - I2C data was not set to %X.\n", data);
|
||||
return IXGBE_ERR_I2C;
|
||||
}
|
||||
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1986,14 +1936,9 @@ static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
|
||||
**/
|
||||
static bool ixgbe_get_i2c_data(u32 *i2cctl)
|
||||
{
|
||||
bool data;
|
||||
|
||||
if (*i2cctl & IXGBE_I2C_DATA_IN)
|
||||
data = true;
|
||||
else
|
||||
data = false;
|
||||
|
||||
return data;
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2038,20 +1983,17 @@ static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
|
||||
**/
|
||||
s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = 0;
|
||||
u16 phy_data = 0;
|
||||
|
||||
if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM)
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
/* Check that the LASI temp alarm status was triggered */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
|
||||
MDIO_MMD_PMAPMD, &phy_data);
|
||||
|
||||
if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
status = IXGBE_ERR_OVERTEMP;
|
||||
out:
|
||||
return status;
|
||||
return IXGBE_ERR_OVERTEMP;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2013 Intel Corporation.
|
||||
Copyright(c) 1999 - 2014 Intel Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
@ -245,10 +245,10 @@ static int ixgbe_pci_sriov_enable(struct pci_dev *dev, int num_vfs)
|
||||
if (pre_existing_vfs && pre_existing_vfs != num_vfs)
|
||||
err = ixgbe_disable_sriov(adapter);
|
||||
else if (pre_existing_vfs && pre_existing_vfs == num_vfs)
|
||||
goto out;
|
||||
return num_vfs;
|
||||
|
||||
if (err)
|
||||
goto err_out;
|
||||
return err;
|
||||
|
||||
/* While the SR-IOV capability structure reports total VFs to be
|
||||
* 64 we limit the actual number that can be allocated to 63 so
|
||||
@ -256,16 +256,14 @@ static int ixgbe_pci_sriov_enable(struct pci_dev *dev, int num_vfs)
|
||||
* PF. The PCI bus driver already checks for other values out of
|
||||
* range.
|
||||
*/
|
||||
if (num_vfs > IXGBE_MAX_VFS_DRV_LIMIT) {
|
||||
err = -EPERM;
|
||||
goto err_out;
|
||||
}
|
||||
if (num_vfs > IXGBE_MAX_VFS_DRV_LIMIT)
|
||||
return -EPERM;
|
||||
|
||||
adapter->num_vfs = num_vfs;
|
||||
|
||||
err = __ixgbe_enable_sriov(adapter);
|
||||
if (err)
|
||||
goto err_out;
|
||||
return err;
|
||||
|
||||
for (i = 0; i < adapter->num_vfs; i++)
|
||||
ixgbe_vf_configuration(dev, (i | 0x10000000));
|
||||
@ -273,17 +271,14 @@ static int ixgbe_pci_sriov_enable(struct pci_dev *dev, int num_vfs)
|
||||
err = pci_enable_sriov(dev, num_vfs);
|
||||
if (err) {
|
||||
e_dev_warn("Failed to enable PCI sriov: %d\n", err);
|
||||
goto err_out;
|
||||
return err;
|
||||
}
|
||||
ixgbe_sriov_reinit(adapter);
|
||||
|
||||
out:
|
||||
return num_vfs;
|
||||
|
||||
err_out:
|
||||
return err;
|
||||
#endif
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int ixgbe_pci_sriov_disable(struct pci_dev *dev)
|
||||
@ -807,7 +802,7 @@ static int ixgbe_set_vf_vlan_msg(struct ixgbe_adapter *adapter,
|
||||
if (!add && adapter->netdev->flags & IFF_PROMISC) {
|
||||
reg_ndx = ixgbe_find_vlvf_entry(hw, vid);
|
||||
if (reg_ndx < 0)
|
||||
goto out;
|
||||
return err;
|
||||
vlvf = IXGBE_READ_REG(hw, IXGBE_VLVF(reg_ndx));
|
||||
/* See if any other pools are set for this VLAN filter
|
||||
* entry other than the PF.
|
||||
@ -833,8 +828,6 @@ static int ixgbe_set_vf_vlan_msg(struct ixgbe_adapter *adapter,
|
||||
ixgbe_set_vf_vlan(adapter, add, vid, VMDQ_P(0));
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -951,7 +944,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
||||
|
||||
/* this is a message we already processed, do nothing */
|
||||
if (msgbuf[0] & (IXGBE_VT_MSGTYPE_ACK | IXGBE_VT_MSGTYPE_NACK))
|
||||
return retval;
|
||||
return 0;
|
||||
|
||||
/* flush the ack before we write any messages back */
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
@ -966,7 +959,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
||||
if (!adapter->vfinfo[vf].clear_to_send) {
|
||||
msgbuf[0] |= IXGBE_VT_MSGTYPE_NACK;
|
||||
ixgbe_write_mbx(hw, msgbuf, 1, vf);
|
||||
return retval;
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch ((msgbuf[0] & 0xFFFF)) {
|
||||
|
@ -99,8 +99,8 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
|
||||
|
||||
/* Call adapter stop to disable tx/rx and clear interrupts */
|
||||
status = hw->mac.ops.stop_adapter(hw);
|
||||
if (status != 0)
|
||||
goto reset_hw_out;
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
/* flush pending Tx transactions */
|
||||
ixgbe_clear_tx_pending(hw);
|
||||
@ -168,7 +168,6 @@ mac_reset_top:
|
||||
hw->mac.ops.get_wwn_prefix(hw, &hw->mac.wwnn_prefix,
|
||||
&hw->mac.wwpn_prefix);
|
||||
|
||||
reset_hw_out:
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -182,15 +181,13 @@ reset_hw_out:
|
||||
**/
|
||||
static s32 ixgbe_start_hw_X540(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 ret_val = 0;
|
||||
s32 ret_val;
|
||||
|
||||
ret_val = ixgbe_start_hw_generic(hw);
|
||||
if (ret_val != 0)
|
||||
goto out;
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
ret_val = ixgbe_start_hw_gen2(hw);
|
||||
out:
|
||||
return ret_val;
|
||||
return ixgbe_start_hw_gen2(hw);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -483,12 +480,12 @@ static s32 ixgbe_update_eeprom_checksum_X540(struct ixgbe_hw *hw)
|
||||
static s32 ixgbe_update_flash_X540(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 flup;
|
||||
s32 status = IXGBE_ERR_EEPROM;
|
||||
s32 status;
|
||||
|
||||
status = ixgbe_poll_flash_update_done_X540(hw);
|
||||
if (status == IXGBE_ERR_EEPROM) {
|
||||
hw_dbg(hw, "Flash update time out\n");
|
||||
goto out;
|
||||
return status;
|
||||
}
|
||||
|
||||
flup = IXGBE_READ_REG(hw, IXGBE_EEC) | IXGBE_EEC_FLUP;
|
||||
@ -514,7 +511,7 @@ static s32 ixgbe_update_flash_X540(struct ixgbe_hw *hw)
|
||||
else
|
||||
hw_dbg(hw, "Flash update time out\n");
|
||||
}
|
||||
out:
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -529,17 +526,14 @@ static s32 ixgbe_poll_flash_update_done_X540(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 i;
|
||||
u32 reg;
|
||||
s32 status = IXGBE_ERR_EEPROM;
|
||||
|
||||
for (i = 0; i < IXGBE_FLUDONE_ATTEMPTS; i++) {
|
||||
reg = IXGBE_READ_REG(hw, IXGBE_EEC);
|
||||
if (reg & IXGBE_EEC_FLUDONE) {
|
||||
status = 0;
|
||||
break;
|
||||
}
|
||||
if (reg & IXGBE_EEC_FLUDONE)
|
||||
return 0;
|
||||
udelay(5);
|
||||
}
|
||||
return status;
|
||||
return IXGBE_ERR_EEPROM;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user