[PATCH] e1000:Adjust flow control watermarks for Jumbo Frames
authorMalli Chilakala <mallikarjuna.chilakala@intel.com>
Fri, 29 Apr 2005 02:44:25 +0000 (19:44 -0700)
committerJeff Garzik <jgarzik@pobox.com>
Fri, 13 May 2005 00:48:55 +0000 (20:48 -0400)
Adjust flow control watermarks for Jumbo Frames

Signed-off-by: Mallikarjuna R Chilakala <mallikarjuna.chilakala@intel.com>
Signed-off-by: Ganesh Venkatesan <ganesh.venkatesan@intel.com>
Signed-off-by: John Ronciak <john.ronciak@intel.com>
diff -up net-drivers-2.6/drivers/net/e1000/e1000_main.c net-drivers-2.6/drivers/net/e1000.new/e1000_main.c

drivers/net/e1000/e1000_main.c

index 13bde9090537255a4e7758ffce8fab2b7060558d..24d96c02b5094dcf5f0e971b6f3f9be4a699508e 100644 (file)
@@ -409,7 +409,10 @@ e1000_down(struct e1000_adapter *adapter)
 void
 e1000_reset(struct e1000_adapter *adapter)
 {
+       struct net_device *netdev = adapter->netdev;
        uint32_t pba, manc;
+       uint16_t fc_high_water_mark = E1000_FC_HIGH_DIFF;
+       uint16_t fc_low_water_mark = E1000_FC_LOW_DIFF;
 
        /* Repartition Pba for greater than 9k mtu
         * To take effect CTRL.RST is required.
@@ -428,6 +431,16 @@ e1000_reset(struct e1000_adapter *adapter)
                break;
        }
 
+       if((adapter->hw.mac_type != e1000_82573) &&
+          (adapter->rx_buffer_len > E1000_RXBUFFER_8192)) {
+               pba -= 8; /* allocate more FIFO for Tx */
+               /* send an XOFF when there is enough space in the
+                * Rx FIFO to hold one extra full size Rx packet 
+               */
+               fc_high_water_mark = netdev->mtu + ENET_HEADER_SIZE + 
+                                       ETHERNET_FCS_SIZE + 1;
+               fc_low_water_mark = fc_high_water_mark + 8;
+       }
 
 
        if(adapter->hw.mac_type == e1000_82547) {
@@ -442,9 +455,9 @@ e1000_reset(struct e1000_adapter *adapter)
 
        /* flow control settings */
        adapter->hw.fc_high_water = (pba << E1000_PBA_BYTES_SHIFT) -
-                                   E1000_FC_HIGH_DIFF;
+                                   fc_high_water_mark;
        adapter->hw.fc_low_water = (pba << E1000_PBA_BYTES_SHIFT) -
-                                  E1000_FC_LOW_DIFF;
+                                  fc_low_water_mark;
        adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME;
        adapter->hw.fc_send_xon = 1;
        adapter->hw.fc = adapter->hw.original_fc;