Commit f464ba87 authored by Bruce Allan's avatar Bruce Allan Committed by David S. Miller

e1000e: perform 10/100 adaptive IFS only on parts that support it

Adaptive IFS which involves writing to the Adaptive IFS Throttle register
was being done for all devices supported by the driver even though it is
not supported (i.e. the register doesn't even exist) on some devices.  The
feature is supported on 8257x/82583 and ICH/PCH based devices, but not
on ESB2.
Signed-off-by: default avatarBruce Allan <bruce.w.allan@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 29477e24
...@@ -237,6 +237,8 @@ static s32 e1000_init_mac_params_82571(struct e1000_adapter *adapter) ...@@ -237,6 +237,8 @@ static s32 e1000_init_mac_params_82571(struct e1000_adapter *adapter)
/* Set if manageability features are enabled. */ /* Set if manageability features are enabled. */
mac->arc_subsystem_valid = (er32(FWSM) & E1000_FWSM_MODE_MASK) mac->arc_subsystem_valid = (er32(FWSM) & E1000_FWSM_MODE_MASK)
? true : false; ? true : false;
/* Adaptive IFS supported */
mac->adaptive_ifs = true;
/* check for link */ /* check for link */
switch (hw->phy.media_type) { switch (hw->phy.media_type) {
......
...@@ -224,6 +224,8 @@ static s32 e1000_init_mac_params_80003es2lan(struct e1000_adapter *adapter) ...@@ -224,6 +224,8 @@ static s32 e1000_init_mac_params_80003es2lan(struct e1000_adapter *adapter)
/* Set if manageability features are enabled. */ /* Set if manageability features are enabled. */
mac->arc_subsystem_valid = (er32(FWSM) & E1000_FWSM_MODE_MASK) mac->arc_subsystem_valid = (er32(FWSM) & E1000_FWSM_MODE_MASK)
? true : false; ? true : false;
/* Adaptive IFS not supported */
mac->adaptive_ifs = false;
/* check for link */ /* check for link */
switch (hw->phy.media_type) { switch (hw->phy.media_type) {
......
...@@ -818,6 +818,7 @@ struct e1000_mac_info { ...@@ -818,6 +818,7 @@ struct e1000_mac_info {
u8 forced_speed_duplex; u8 forced_speed_duplex;
bool adaptive_ifs;
bool arc_subsystem_valid; bool arc_subsystem_valid;
bool autoneg; bool autoneg;
bool autoneg_failed; bool autoneg_failed;
......
...@@ -454,6 +454,8 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter) ...@@ -454,6 +454,8 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter)
mac->rar_entry_count--; mac->rar_entry_count--;
/* Set if manageability features are enabled. */ /* Set if manageability features are enabled. */
mac->arc_subsystem_valid = true; mac->arc_subsystem_valid = true;
/* Adaptive IFS supported */
mac->adaptive_ifs = true;
/* LED operations */ /* LED operations */
switch (mac->type) { switch (mac->type) {
......
...@@ -1609,6 +1609,11 @@ void e1000e_reset_adaptive(struct e1000_hw *hw) ...@@ -1609,6 +1609,11 @@ void e1000e_reset_adaptive(struct e1000_hw *hw)
{ {
struct e1000_mac_info *mac = &hw->mac; struct e1000_mac_info *mac = &hw->mac;
if (!mac->adaptive_ifs) {
e_dbg("Not in Adaptive IFS mode!\n");
goto out;
}
mac->current_ifs_val = 0; mac->current_ifs_val = 0;
mac->ifs_min_val = IFS_MIN; mac->ifs_min_val = IFS_MIN;
mac->ifs_max_val = IFS_MAX; mac->ifs_max_val = IFS_MAX;
...@@ -1617,6 +1622,8 @@ void e1000e_reset_adaptive(struct e1000_hw *hw) ...@@ -1617,6 +1622,8 @@ void e1000e_reset_adaptive(struct e1000_hw *hw)
mac->in_ifs_mode = false; mac->in_ifs_mode = false;
ew32(AIT, 0); ew32(AIT, 0);
out:
return;
} }
/** /**
...@@ -1630,6 +1637,11 @@ void e1000e_update_adaptive(struct e1000_hw *hw) ...@@ -1630,6 +1637,11 @@ void e1000e_update_adaptive(struct e1000_hw *hw)
{ {
struct e1000_mac_info *mac = &hw->mac; struct e1000_mac_info *mac = &hw->mac;
if (!mac->adaptive_ifs) {
e_dbg("Not in Adaptive IFS mode!\n");
goto out;
}
if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) { if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) {
if (mac->tx_packet_delta > MIN_NUM_XMITS) { if (mac->tx_packet_delta > MIN_NUM_XMITS) {
mac->in_ifs_mode = true; mac->in_ifs_mode = true;
...@@ -1650,6 +1662,8 @@ void e1000e_update_adaptive(struct e1000_hw *hw) ...@@ -1650,6 +1662,8 @@ void e1000e_update_adaptive(struct e1000_hw *hw)
ew32(AIT, 0); ew32(AIT, 0);
} }
} }
out:
return;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment