]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - drivers/net/e1000/e1000_main.c
[PATCH] e1000:Adjust flow control watermarks for Jumbo Frames
[linux-2.6.git] / 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;