aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/e1000e')
-rw-r--r--drivers/net/e1000e/defines.h2
-rw-r--r--drivers/net/e1000e/netdev.c14
2 files changed, 10 insertions, 6 deletions
diff --git a/drivers/net/e1000e/defines.h b/drivers/net/e1000e/defines.h
index 243aa499fe90..9acfecddb273 100644
--- a/drivers/net/e1000e/defines.h
+++ b/drivers/net/e1000e/defines.h
@@ -469,6 +469,8 @@
469#define AUTO_READ_DONE_TIMEOUT 10 469#define AUTO_READ_DONE_TIMEOUT 10
470 470
471/* Flow Control */ 471/* Flow Control */
472#define E1000_FCRTH_RTH 0x0000FFF8 /* Mask Bits[15:3] for RTH */
473#define E1000_FCRTL_RTL 0x0000FFF8 /* Mask Bits[15:3] for RTL */
472#define E1000_FCRTL_XONE 0x80000000 /* Enable XON frame transmission */ 474#define E1000_FCRTL_XONE 0x80000000 /* Enable XON frame transmission */
473 475
474/* Transmit Configuration Word */ 476/* Transmit Configuration Word */
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index 7e412d1168ed..b7a46c513783 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -2751,23 +2751,25 @@ void e1000e_reset(struct e1000_adapter *adapter)
2751 /* 2751 /*
2752 * flow control settings 2752 * flow control settings
2753 * 2753 *
2754 * The high water mark must be low enough to fit one full frame 2754 * The high water mark must be low enough to fit two full frame
2755 * (or the size used for early receive) above it in the Rx FIFO. 2755 * (or the size used for early receive) above it in the Rx FIFO.
2756 * Set it to the lower of: 2756 * Set it to the lower of:
2757 * - 90% of the Rx FIFO size, and 2757 * - 90% of the Rx FIFO size, and
2758 * - the full Rx FIFO size minus the early receive size (for parts 2758 * - the full Rx FIFO size minus the early receive size (for parts
2759 * with ERT support assuming ERT set to E1000_ERT_2048), or 2759 * with ERT support assuming ERT set to E1000_ERT_2048), or
2760 * - the full Rx FIFO size minus one full frame 2760 * - the full Rx FIFO size minus two full frames
2761 */ 2761 */
2762 if (adapter->flags & FLAG_HAS_ERT) 2762 if ((adapter->flags & FLAG_HAS_ERT) &&
2763 (adapter->netdev->mtu > ETH_DATA_LEN))
2763 hwm = min(((pba << 10) * 9 / 10), 2764 hwm = min(((pba << 10) * 9 / 10),
2764 ((pba << 10) - (E1000_ERT_2048 << 3))); 2765 ((pba << 10) - (E1000_ERT_2048 << 3)));
2765 else 2766 else
2766 hwm = min(((pba << 10) * 9 / 10), 2767 hwm = min(((pba << 10) * 9 / 10),
2767 ((pba << 10) - adapter->max_frame_size)); 2768 ((pba << 10) - (2 * adapter->max_frame_size)));
2768 2769
2769 fc->high_water = hwm & 0xFFF8; /* 8-byte granularity */ 2770 fc->high_water = hwm & E1000_FCRTH_RTH; /* 8-byte granularity */
2770 fc->low_water = fc->high_water - 8; 2771 fc->low_water = (fc->high_water - (2 * adapter->max_frame_size));
2772 fc->low_water &= E1000_FCRTL_RTL; /* 8-byte granularity */
2771 2773
2772 if (adapter->flags & FLAG_DISABLE_FC_PAUSE_TIME) 2774 if (adapter->flags & FLAG_DISABLE_FC_PAUSE_TIME)
2773 fc->pause_time = 0xFFFF; 2775 fc->pause_time = 0xFFFF;