e1000e: perform 10/100 adaptive IFS only on parts that support it
authorBruce Allan <bruce.w.allan@intel.com>
Thu, 7 Jan 2010 16:31:35 +0000 (16:31 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 8 Jan 2010 08:35:30 +0000 (00:35 -0800)
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: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/e1000e/82571.c
drivers/net/e1000e/es2lan.c
drivers/net/e1000e/hw.h
drivers/net/e1000e/ich8lan.c
drivers/net/e1000e/lib.c

index b979464091bb1cba01db7ebf477de6e442e4ab19..02d67d047d963854c1c5d8210d14c46d4bbcdf0d 100644 (file)
@@ -237,6 +237,8 @@ static s32 e1000_init_mac_params_82571(struct e1000_adapter *adapter)
        /* Set if manageability features are enabled. */
        mac->arc_subsystem_valid = (er32(FWSM) & E1000_FWSM_MODE_MASK)
                        ? true : false;
+       /* Adaptive IFS supported */
+       mac->adaptive_ifs = true;
 
        /* check for link */
        switch (hw->phy.media_type) {
index 3028f23da8918c306f1261a86221cab996380278..e2aa3b7885642375f49ff88c5977647f7f72f399 100644 (file)
@@ -224,6 +224,8 @@ static s32 e1000_init_mac_params_80003es2lan(struct e1000_adapter *adapter)
        /* Set if manageability features are enabled. */
        mac->arc_subsystem_valid = (er32(FWSM) & E1000_FWSM_MODE_MASK)
                         ? true : false;
+       /* Adaptive IFS not supported */
+       mac->adaptive_ifs = false;
 
        /* check for link */
        switch (hw->phy.media_type) {
index 2784cf44a6f3304e943068d8cb1b1e99e3e32c33..eccf29b75c41ed062551249f6552cdfc373a3d85 100644 (file)
@@ -818,6 +818,7 @@ struct e1000_mac_info {
 
        u8  forced_speed_duplex;
 
+       bool adaptive_ifs;
        bool arc_subsystem_valid;
        bool autoneg;
        bool autoneg_failed;
index 9b09246af064675fa5c973db55ca76e5b63823b8..ad08cf3f40c0ba830c350585b39dd8dae75df4fa 100644 (file)
@@ -454,6 +454,8 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter)
                mac->rar_entry_count--;
        /* Set if manageability features are enabled. */
        mac->arc_subsystem_valid = true;
+       /* Adaptive IFS supported */
+       mac->adaptive_ifs = true;
 
        /* LED operations */
        switch (mac->type) {
index a86c17548c1e4e18d004f2593efaa65355371cc7..56b59e4a6871e1957fafab62e3e8acb8abec0710 100644 (file)
@@ -1609,6 +1609,11 @@ void e1000e_reset_adaptive(struct e1000_hw *hw)
 {
        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->ifs_min_val = IFS_MIN;
        mac->ifs_max_val = IFS_MAX;
@@ -1617,6 +1622,8 @@ void e1000e_reset_adaptive(struct e1000_hw *hw)
 
        mac->in_ifs_mode = false;
        ew32(AIT, 0);
+out:
+       return;
 }
 
 /**
@@ -1630,6 +1637,11 @@ void e1000e_update_adaptive(struct e1000_hw *hw)
 {
        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->tx_packet_delta > MIN_NUM_XMITS) {
                        mac->in_ifs_mode = true;
@@ -1650,6 +1662,8 @@ void e1000e_update_adaptive(struct e1000_hw *hw)
                        ew32(AIT, 0);
                }
        }
+out:
+       return;
 }
 
 /**