From 973ac1a4ef76bfb5f473f0d0dc7970d5d436dc07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Wed, 3 May 2017 14:05:01 +0200 Subject: [PATCH] fix #1343: add MTU patches for intel drivers ported from upstream / in-tree commits 91c527a55664ddf4bee26673a35f91748dae4142 and 45693bcb00cbd379c373ab22ccd9a9d4755cc7ed --- Makefile | 3 +++ e1000e_4.10_max-mtu.patch | 37 ++++++++++++++++++++++++++++++ igb_4.10_max-mtu.patch | 47 +++++++++++++++++++++++++++++++++++++++ ixgbe_4.10_max-mtu.patch | 37 ++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 e1000e_4.10_max-mtu.patch create mode 100644 igb_4.10_max-mtu.patch create mode 100644 ixgbe_4.10_max-mtu.patch diff --git a/Makefile b/Makefile index 9f112ac..f86908a 100644 --- a/Makefile +++ b/Makefile @@ -293,6 +293,7 @@ e1000e.ko e1000e: .compile_mark ${E1000ESRC} # [ ! -e /lib/modules/${KVNAME}/build ] || rm /lib/modules/${KVNAME}/build cd ${E1000EDIR}; patch -p1 < ../intel-module-gcc6-compat.patch cd ${E1000EDIR}; patch -p1 < ../e1000e_4.10_compat.patch + cd ${E1000EDIR}; patch -p1 < ../e1000e_4.10_max-mtu.patch cd ${E1000EDIR}/src; make BUILD_KERNEL=${KVNAME} KSRC=${TOP}/${KERNEL_SRC} cp ${E1000EDIR}/src/e1000e.ko e1000e.ko @@ -303,6 +304,7 @@ igb.ko igb: .compile_mark ${IGBSRC} cd ${IGBDIR}; patch -p1 < ../intel-module-gcc6-compat.patch cd ${IGBDIR}; patch -p1 < ../igb_4.9_compat.patch cd ${IGBDIR}; patch -p1 < ../igb_4.10_compat.patch + cd ${IGBDIR}; patch -p1 < ../igb_4.10_max-mtu.patch cd ${IGBDIR}/src; make BUILD_KERNEL=${KVNAME} KSRC=${TOP}/${KERNEL_SRC} cp ${IGBDIR}/src/igb.ko igb.ko @@ -311,6 +313,7 @@ ixgbe.ko ixgbe: .compile_mark ${IXGBESRC} tar xf ${IXGBESRC} # [ ! -e /lib/modules/${KVNAME}/build ] || rm /lib/modules/${KVNAME}/build cd ${IXGBEDIR}; patch -p1 < ../ixgbe_4.10_compat.patch + cd ${IXGBEDIR}; patch -p1 < ../ixgbe_4.10_max-mtu.patch cd ${IXGBEDIR}/src; make CFLAGS_EXTRA="-DIXGBE_NO_LRO" BUILD_KERNEL=${KVNAME} KSRC=${TOP}/${KERNEL_SRC} cp ${IXGBEDIR}/src/ixgbe.ko ixgbe.ko diff --git a/e1000e_4.10_max-mtu.patch b/e1000e_4.10_max-mtu.patch new file mode 100644 index 0000000..69272d7 --- /dev/null +++ b/e1000e_4.10_max-mtu.patch @@ -0,0 +1,37 @@ +diff --git a/src/netdev.c b/src/netdev.c +index 73b0f9a..aef1bc2 100644 +--- a/src/netdev.c ++++ b/src/netdev.c +@@ -6724,19 +6724,12 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) + int max_frame = new_mtu + VLAN_ETH_HLEN + ETH_FCS_LEN; + + /* Jumbo frame support */ +- if ((max_frame > (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)) && ++ if ((new_mtu > ETH_DATA_LEN) && + !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) { + e_err("Jumbo Frames not supported.\n"); + return -EINVAL; + } + +- /* Supported frame sizes */ +- if ((new_mtu < (VLAN_ETH_ZLEN + ETH_FCS_LEN)) || +- (max_frame > adapter->max_hw_frame_size)) { +- e_err("Unsupported MTU setting\n"); +- return -EINVAL; +- } +- + /* Jumbo frame workaround on 82579 and newer requires CRC be stripped */ + if ((adapter->hw.mac.type >= e1000_pch2lan) && + !(adapter->flags2 & FLAG2_CRC_STRIPPING) && +@@ -8262,6 +8255,11 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + #endif /* HAVE_NETDEV_VLAN_FEATURES */ + } + ++ /* MTU range: 68 - max_hw_frame_size */ ++ netdev->min_mtu = ETH_MIN_MTU; ++ netdev->max_mtu = adapter->max_hw_frame_size - ++ (VLAN_ETH_HLEN + ETH_FCS_LEN); ++ + if (e1000e_enable_mng_pass_thru(&adapter->hw)) + adapter->flags |= FLAG_MNG_PT_ENABLED; + diff --git a/igb_4.10_max-mtu.patch b/igb_4.10_max-mtu.patch new file mode 100644 index 0000000..d04ead5 --- /dev/null +++ b/igb_4.10_max-mtu.patch @@ -0,0 +1,47 @@ +diff --git a/src/e1000_defines.h b/src/e1000_defines.h +index 6de3988..d58e12f 100644 +--- a/src/e1000_defines.h ++++ b/src/e1000_defines.h +@@ -423,7 +423,8 @@ + #define ETHERNET_IEEE_VLAN_TYPE 0x8100 /* 802.3ac packet */ + + #define ETHERNET_FCS_SIZE 4 +-#define MAX_JUMBO_FRAME_SIZE 0x3F00 ++#define MAX_JUMBO_FRAME_SIZE 0x2600 ++#define MAX_STD_JUMBO_FRAME_SIZE 9216 + /* The datasheet maximum supported RX size is 9.5KB (9728 bytes) */ + #define MAX_RX_JUMBO_FRAME_SIZE 0x2600 + #define E1000_TX_PTR_GAP 0x1F +diff --git a/src/igb_main.c b/src/igb_main.c +index 2dff0f4..bbfe87e 100644 +--- a/src/igb_main.c ++++ b/src/igb_main.c +@@ -2852,6 +2852,10 @@ static int igb_probe(struct pci_dev *pdev, + if (pci_using_dac) + netdev->features |= NETIF_F_HIGHDMA; + ++ /* MTU range: 68 - 9216 */ ++ netdev->min_mtu = ETH_MIN_MTU; ++ netdev->max_mtu = MAX_STD_JUMBO_FRAME_SIZE; ++ + adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw); + #ifdef DEBUG + if (adapter->dmac != IGB_DMAC_DISABLE) +@@ -5832,17 +5836,6 @@ static int igb_change_mtu(struct net_device *netdev, int new_mtu) + struct pci_dev *pdev = adapter->pdev; + int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN; + +- if ((new_mtu < 68) || (max_frame > MAX_JUMBO_FRAME_SIZE)) { +- dev_err(pci_dev_to_dev(pdev), "Invalid MTU setting\n"); +- return -EINVAL; +- } +- +-#define MAX_STD_JUMBO_FRAME_SIZE 9238 +- if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) { +- dev_err(pci_dev_to_dev(pdev), "MTU > 9216 not supported.\n"); +- return -EINVAL; +- } +- + /* adjust max frame to be at least the size of a standard frame */ + if (max_frame < (ETH_FRAME_LEN + ETH_FCS_LEN)) + max_frame = ETH_FRAME_LEN + ETH_FCS_LEN; diff --git a/ixgbe_4.10_max-mtu.patch b/ixgbe_4.10_max-mtu.patch new file mode 100644 index 0000000..c25203e --- /dev/null +++ b/ixgbe_4.10_max-mtu.patch @@ -0,0 +1,37 @@ +diff --git a/src/ixgbe_main.c b/src/ixgbe_main.c +index 83c6250..fe226cd 100644 +--- a/src/ixgbe_main.c ++++ b/src/ixgbe_main.c +@@ -6379,11 +6379,6 @@ static void ixgbe_free_all_rx_resources(struct ixgbe_adapter *adapter) + static int ixgbe_change_mtu(struct net_device *netdev, int new_mtu) + { + struct ixgbe_adapter *adapter = netdev_priv(netdev); +- int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; +- +- /* MTU < 68 is an error and causes problems on some kernels */ +- if ((new_mtu < 68) || (max_frame > IXGBE_MAX_JUMBO_FRAME_SIZE)) +- return -EINVAL; + + /* + * For 82599EB we cannot allow legacy VFs to enable their receive +@@ -6392,7 +6387,7 @@ static int ixgbe_change_mtu(struct net_device *netdev, int new_mtu) + */ + if ((adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) && + (adapter->hw.mac.type == ixgbe_mac_82599EB) && +- (max_frame > (ETH_FRAME_LEN + ETH_FCS_LEN))) ++ (new_mtu > ETH_DATA_LEN)) + e_warn(probe, "Setting MTU > 1500 will disable legacy VFs\n"); + + e_info(probe, "changing MTU from %d to %d\n", netdev->mtu, new_mtu); +@@ -10134,6 +10129,11 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, + #ifdef IFF_SUPP_NOFCS + netdev->priv_flags |= IFF_SUPP_NOFCS; + #endif ++ ++ /* MTU range: 68 - 9710 */ ++ netdev->min_mtu = ETH_MIN_MTU; ++ netdev->max_mtu = IXGBE_MAX_JUMBO_FRAME_SIZE - (ETH_HLEN + ETH_FCS_LEN); ++ + #if IS_ENABLED(CONFIG_DCB) + if (adapter->flags & IXGBE_FLAG_DCB_CAPABLE) + netdev->dcbnl_ops = &dcbnl_ops;