3.19.8-ckt4 -stable review patch.  If anyone has any objections, please let me 
know.

------------------

From: Alexander Duyck <alexander.h.du...@redhat.com>

commit 8084b86dcfbc4b4822868c1dbdb429b5c08154e2 upstream.

When the VLAN_HLEN was added to the calculation for the maximum frame size
there seems to have been a number of issues added to the driver.

The first issue is that in some cases the maximum frame size for a device
never really reached the actual maximum frame size as the VLAN header
length was not included the calculation for that value.  As a result some
parts only supported a maximum frame size of either 1496 in the case of
parts that didn't support jumbo frames, and 8996 in the case of the parts
that do.

The second issue is the fact that there were several checks that weren't
updated so as a result setting an MTU of 1500 was treated as enabling jumbo
frames as the calculated value was 1522 instead of 1518.  I have addressed
those by replacing ETH_FRAME_LEN with VLAN_ETH_FRAME_LEN where appropriate.

The final issue was the fact that lowering the MTU below 1500 would cause
the driver to allocate 2K buffers for the rings.  This is an old issue that
was fixed several years ago in igb/ixgbe and I am addressing now by just
replacing == with a <= so that we always just round up to 1522 for anything
that isn't a jumbo frame.

Fixes: c751a3d58cf2d ("e1000e: Correctly include VLAN_HLEN when changing 
interface MTU")
Signed-off-by: Alexander Duyck <alexander.h.du...@redhat.com>
Tested-by: Aaron Brown <aaron.f.br...@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirs...@intel.com>
[ luis: backported to 3.16:
  - dropped changes to struct e1000_pch_spt_info as i219 isn't supported ]
Signed-off-by: Luis Henriques <luis.henriq...@canonical.com>
Signed-off-by: Kamal Mostafa <ka...@canonical.com>
---
 drivers/net/ethernet/intel/e1000e/82571.c   |  2 +-
 drivers/net/ethernet/intel/e1000e/ich8lan.c |  8 ++++----
 drivers/net/ethernet/intel/e1000e/netdev.c  | 18 ++++++++----------
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/drivers/net/ethernet/intel/e1000e/82571.c 
b/drivers/net/ethernet/intel/e1000e/82571.c
index dc79ed8..32e7775 100644
--- a/drivers/net/ethernet/intel/e1000e/82571.c
+++ b/drivers/net/ethernet/intel/e1000e/82571.c
@@ -2010,7 +2010,7 @@ const struct e1000_info e1000_82573_info = {
        .flags2                 = FLAG2_DISABLE_ASPM_L1
                                  | FLAG2_DISABLE_ASPM_L0S,
        .pba                    = 20,
-       .max_hw_frame_size      = ETH_FRAME_LEN + ETH_FCS_LEN,
+       .max_hw_frame_size      = VLAN_ETH_FRAME_LEN + ETH_FCS_LEN,
        .get_variants           = e1000_get_variants_82571,
        .mac_ops                = &e82571_mac_ops,
        .phy_ops                = &e82_phy_ops_m88,
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c 
b/drivers/net/ethernet/intel/e1000e/ich8lan.c
index 48b74a5..c067c84 100644
--- a/drivers/net/ethernet/intel/e1000e/ich8lan.c
+++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c
@@ -1494,7 +1494,7 @@ static s32 e1000_get_variants_ich8lan(struct 
e1000_adapter *adapter)
            ((adapter->hw.mac.type >= e1000_pch2lan) &&
             (!(er32(CTRL_EXT) & E1000_CTRL_EXT_LSECCK)))) {
                adapter->flags &= ~FLAG_HAS_JUMBO_FRAMES;
-               adapter->max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN;
+               adapter->max_hw_frame_size = VLAN_ETH_FRAME_LEN + ETH_FCS_LEN;
 
                hw->mac.ops.blink_led = NULL;
        }
@@ -5067,7 +5067,7 @@ const struct e1000_info e1000_ich8_info = {
                                  | FLAG_HAS_FLASH
                                  | FLAG_APME_IN_WUC,
        .pba                    = 8,
-       .max_hw_frame_size      = ETH_FRAME_LEN + ETH_FCS_LEN,
+       .max_hw_frame_size      = VLAN_ETH_FRAME_LEN + ETH_FCS_LEN,
        .get_variants           = e1000_get_variants_ich8lan,
        .mac_ops                = &ich8_mac_ops,
        .phy_ops                = &ich8_phy_ops,
@@ -5140,7 +5140,7 @@ const struct e1000_info e1000_pch2_info = {
        .flags2                 = FLAG2_HAS_PHY_STATS
                                  | FLAG2_HAS_EEE,
        .pba                    = 26,
-       .max_hw_frame_size      = 9018,
+       .max_hw_frame_size      = 9022,
        .get_variants           = e1000_get_variants_ich8lan,
        .mac_ops                = &ich8_mac_ops,
        .phy_ops                = &ich8_phy_ops,
@@ -5160,7 +5160,7 @@ const struct e1000_info e1000_pch_lpt_info = {
        .flags2                 = FLAG2_HAS_PHY_STATS
                                  | FLAG2_HAS_EEE,
        .pba                    = 26,
-       .max_hw_frame_size      = 9018,
+       .max_hw_frame_size      = 9022,
        .get_variants           = e1000_get_variants_ich8lan,
        .mac_ops                = &ich8_mac_ops,
        .phy_ops                = &ich8_phy_ops,
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c 
b/drivers/net/ethernet/intel/e1000e/netdev.c
index e14fd85..b5d98be 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -3784,7 +3784,7 @@ void e1000e_reset(struct e1000_adapter *adapter)
        /* reset Packet Buffer Allocation to default */
        ew32(PBA, pba);
 
-       if (adapter->max_frame_size > ETH_FRAME_LEN + ETH_FCS_LEN) {
+       if (adapter->max_frame_size > (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)) {
                /* To maintain wire speed transmits, the Tx FIFO should be
                 * large enough to accommodate two full transmit packets,
                 * rounded up to the next 1KB and expressed in KB.  Likewise,
@@ -4172,9 +4172,9 @@ static int e1000_sw_init(struct e1000_adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
 
-       adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN;
+       adapter->rx_buffer_len = VLAN_ETH_FRAME_LEN + ETH_FCS_LEN;
        adapter->rx_ps_bsize0 = 128;
-       adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
+       adapter->max_frame_size = netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
        adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
        adapter->tx_ring_count = E1000_DEFAULT_TXD;
        adapter->rx_ring_count = E1000_DEFAULT_RXD;
@@ -5749,17 +5749,17 @@ struct rtnl_link_stats64 *e1000e_get_stats64(struct 
net_device *netdev,
 static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
-       int max_frame = new_mtu + VLAN_HLEN + ETH_HLEN + ETH_FCS_LEN;
+       int max_frame = new_mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
 
        /* Jumbo frame support */
-       if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) &&
+       if ((max_frame > (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)) &&
            !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
                e_err("Jumbo Frames not supported.\n");
                return -EINVAL;
        }
 
        /* Supported frame sizes */
-       if ((new_mtu < ETH_ZLEN + ETH_FCS_LEN + VLAN_HLEN) ||
+       if ((new_mtu < (VLAN_ETH_ZLEN + ETH_FCS_LEN)) ||
            (max_frame > adapter->max_hw_frame_size)) {
                e_err("Unsupported MTU setting\n");
                return -EINVAL;
@@ -5799,10 +5799,8 @@ static int e1000_change_mtu(struct net_device *netdev, 
int new_mtu)
                adapter->rx_buffer_len = 4096;
 
        /* adjust allocation if LPE protects us, and we aren't using SBP */
-       if ((max_frame == ETH_FRAME_LEN + ETH_FCS_LEN) ||
-           (max_frame == ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN))
-               adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN
-                   + ETH_FCS_LEN;
+       if (max_frame <= (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN))
+               adapter->rx_buffer_len = VLAN_ETH_FRAME_LEN + ETH_FCS_LEN;
 
        if (netif_running(netdev))
                e1000e_up(adapter);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to