diff options
Diffstat (limited to 'drivers/net/e1000e')
-rw-r--r-- | drivers/net/e1000e/defines.h | 2 | ||||
-rw-r--r-- | drivers/net/e1000e/netdev.c | 14 |
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; |