]> git.hungrycats.org Git - linux/commitdiff
[e1000] flow control updates
authorScott Feldman <scott.feldman@intel.com>
Sat, 27 Sep 2003 01:51:21 +0000 (21:51 -0400)
committerStephen Hemminger <shemminger@osdl.org>
Sat, 27 Sep 2003 01:51:21 +0000 (21:51 -0400)
* handle ethtool force flow control
* correctly set flow control hi/low watermarks based on size of Rx FIFO
  area.  The size can change if doing Jumbo Frames or, in the case of
  82547, is smaller to start with.
* was not properly forcing flow control settings to fc_none if using
  strict IEEE flow control override.

drivers/net/e1000/e1000.h
drivers/net/e1000/e1000_ethtool.c
drivers/net/e1000/e1000_hw.c
drivers/net/e1000/e1000_main.c

index 0d356091478520b5a1e4afe34ca18815395562a9..7a5d52c4724f276521e7e6edf15834674c92be70 100644 (file)
@@ -107,11 +107,11 @@ struct e1000_adapter;
 #define E1000_TX_HEAD_ADDR_SHIFT 7
 #define E1000_PBA_TX_MASK 0xFFFF0000
 
-/* Flow Control High-Watermark: 43464 bytes */
-#define E1000_FC_HIGH_THRESH 0xA9C8
+/* Flow Control High-Watermark: 5688 bytes below Rx FIFO size */
+#define E1000_FC_HIGH_DIFF 0x1638
 
-/* Flow Control Low-Watermark: 43456 bytes */
-#define E1000_FC_LOW_THRESH 0xA9C0
+/* Flow Control Low-Watermark: 5696 bytes below Rx FIFO size */
+#define E1000_FC_LOW_DIFF 0x1640
 
 /* Flow Control Pause Time: 858 usec */
 #define E1000_FC_PAUSE_TIME 0x0680
index 3491d5fcb4fdf5c8d66ea9f3bdcc4a5e5ea5fbe3..7a045198f8b45ecb624c0da1cabdd76e6c22a781 100644 (file)
@@ -230,11 +230,15 @@ e1000_ethtool_spause(struct e1000_adapter *adapter,
 
        hw->original_fc = hw->fc;
 
-       if(netif_running(adapter->netdev)) {
-               e1000_down(adapter);
-               e1000_up(adapter);
-       } else
-               e1000_reset(adapter);
+       if(adapter->fc_autoneg == AUTONEG_ENABLE) {
+               if(netif_running(adapter->netdev)) {
+                       e1000_down(adapter);
+                       e1000_up(adapter);
+               } else
+                       e1000_reset(adapter);
+       }
+       else
+               return e1000_force_mac_fc(hw);
        
        return 0;
 }
index e71b1ea0157a6c6cebaebee8806ac6e9c7692d0b..62fd18527f6bcdc33e1acd4d724b6f7994701611 100644 (file)
@@ -1865,11 +1865,12 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw)
              * be asked to delay transmission of packets than asking
              * our link partner to pause transmission of frames.
              */
-            else if(hw->original_fc == e1000_fc_none ||
-                    hw->original_fc == e1000_fc_tx_pause) {
+            else if((hw->original_fc == e1000_fc_none ||
+                     hw->original_fc == e1000_fc_tx_pause) ||
+                    hw->fc_strict_ieee) {
                 hw->fc = e1000_fc_none;
                 DEBUGOUT("Flow Control = NONE.\r\n");
-            } else if(!hw->fc_strict_ieee) {
+            } else {
                 hw->fc = e1000_fc_rx_pause;
                 DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n");
             }
index 168d89fa8cb473c8cfb211b2a0782ac90492ffbc..c84fac4c2a34b83094adf448b74b26c690fe12f8 100644 (file)
@@ -318,7 +318,13 @@ e1000_reset(struct e1000_adapter *adapter)
        }
        E1000_WRITE_REG(&adapter->hw, PBA, pba);
 
+       /* flow control settings */
+       adapter->hw.fc_high_water = pba - E1000_FC_HIGH_DIFF;
+       adapter->hw.fc_low_water = pba - E1000_FC_LOW_DIFF;
+       adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME;
+       adapter->hw.fc_send_xon = 1;
        adapter->hw.fc = adapter->hw.original_fc;
+
        e1000_reset_hw(&adapter->hw);
        if(adapter->hw.mac_type >= e1000_82544)
                E1000_WRITE_REG(&adapter->hw, WUC, 0);
@@ -621,13 +627,6 @@ e1000_sw_init(struct e1000_adapter *adapter)
 
        e1000_init_eeprom_params(hw);
 
-       /* flow control settings */
-
-       hw->fc_high_water = E1000_FC_HIGH_THRESH;
-       hw->fc_low_water = E1000_FC_LOW_THRESH;
-       hw->fc_pause_time = E1000_FC_PAUSE_TIME;
-       hw->fc_send_xon = 1;
-
        if((hw->mac_type == e1000_82541) ||
           (hw->mac_type == e1000_82547) ||
           (hw->mac_type == e1000_82541_rev_2) ||