#define ALX_MAX_JUMBO_PKT_SIZE (9*1024)
 #define ALX_MAX_TSO_PKT_SIZE   (7*1024)
 #define ALX_MAX_FRAME_SIZE     ALX_MAX_JUMBO_PKT_SIZE
-#define ALX_MIN_FRAME_SIZE     (ETH_ZLEN + ETH_FCS_LEN + VLAN_HLEN)
 
 #define ALX_MAX_RX_QUEUES      8
 #define ALX_MAX_TX_QUEUES      4
 
        hw->smb_timer = 400;
        hw->mtu = alx->dev->mtu;
        alx->rxbuf_size = ALX_MAX_FRAME_LEN(hw->mtu);
+       /* MTU range: 34 - 9256 */
+       alx->dev->min_mtu = 34;
+       alx->dev->max_mtu = ALX_MAX_FRAME_LEN(ALX_MAX_FRAME_SIZE);
        alx->tx_ringsz = 256;
        alx->rx_ringsz = 512;
        hw->imt = 200;
        struct alx_priv *alx = netdev_priv(netdev);
        int max_frame = ALX_MAX_FRAME_LEN(mtu);
 
-       if ((max_frame < ALX_MIN_FRAME_SIZE) ||
-           (max_frame > ALX_MAX_FRAME_SIZE))
-               return -EINVAL;
-
-       if (netdev->mtu == mtu)
-               return 0;
-
        netdev->mtu = mtu;
        alx->hw.mtu = mtu;
        alx->rxbuf_size = max(max_frame, ALX_DEF_RXBUF_SIZE);
 
        return 0;
 }
 
+static void atl1c_set_max_mtu(struct net_device *netdev)
+{
+       struct atl1c_adapter *adapter = netdev_priv(netdev);
+       struct atl1c_hw *hw = &adapter->hw;
+
+       switch (hw->nic_type) {
+       /* These (GbE) devices support jumbo packets, max_mtu 6122 */
+       case athr_l1c:
+       case athr_l1d:
+       case athr_l1d_2:
+               netdev->max_mtu = MAX_JUMBO_FRAME_SIZE -
+                                 (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN);
+               break;
+       /* The 10/100 devices don't support jumbo packets, max_mtu 1500 */
+       default:
+               netdev->max_mtu = ETH_DATA_LEN;
+               break;
+       }
+}
+
 /**
  * atl1c_change_mtu - Change the Maximum Transfer Unit
  * @netdev: network interface device structure
 static int atl1c_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct atl1c_adapter *adapter = netdev_priv(netdev);
-       struct atl1c_hw *hw = &adapter->hw;
-       int old_mtu   = netdev->mtu;
-       int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
-
-       /* Fast Ethernet controller doesn't support jumbo packet */
-       if (((hw->nic_type == athr_l2c ||
-             hw->nic_type == athr_l2c_b ||
-             hw->nic_type == athr_l2c_b2) && new_mtu > ETH_DATA_LEN) ||
-             max_frame < ETH_ZLEN + ETH_FCS_LEN ||
-             max_frame > MAX_JUMBO_FRAME_SIZE) {
-               if (netif_msg_link(adapter))
-                       dev_warn(&adapter->pdev->dev, "invalid MTU setting\n");
-               return -EINVAL;
-       }
+
        /* set MTU */
-       if (old_mtu != new_mtu && netif_running(netdev)) {
+       if (netif_running(netdev)) {
                while (test_and_set_bit(__AT_RESETTING, &adapter->flags))
                        msleep(1);
                netdev->mtu = new_mtu;
 
        netdev->netdev_ops = &atl1c_netdev_ops;
        netdev->watchdog_timeo = AT_TX_WATCHDOG;
+       netdev->min_mtu = ETH_ZLEN - (ETH_HLEN + VLAN_HLEN);
        atl1c_set_ethtool_ops(netdev);
 
        /* TODO: add when ready */
                dev_err(&pdev->dev, "net device private data init failed\n");
                goto err_sw_init;
        }
+       /* set max MTU */
+       atl1c_set_max_mtu(netdev);
+
        atl1c_reset_pcie(&adapter->hw, ATL1C_PCIE_L0S_L1_DISABLE);
 
        /* Init GPHY as early as possible due to power saving issue  */
 
 static int atl1e_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct atl1e_adapter *adapter = netdev_priv(netdev);
-       int old_mtu   = netdev->mtu;
        int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
 
-       if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
-                       (max_frame > MAX_JUMBO_FRAME_SIZE)) {
-               netdev_warn(adapter->netdev, "invalid MTU setting\n");
-               return -EINVAL;
-       }
        /* set MTU */
-       if (old_mtu != new_mtu && netif_running(netdev)) {
+       if (netif_running(netdev)) {
                while (test_and_set_bit(__AT_RESETTING, &adapter->flags))
                        msleep(1);
                netdev->mtu = new_mtu;
        netdev->netdev_ops = &atl1e_netdev_ops;
 
        netdev->watchdog_timeo = AT_TX_WATCHDOG;
+       /* MTU range: 42 - 8170 */
+       netdev->min_mtu = ETH_ZLEN - (ETH_HLEN + VLAN_HLEN);
+       netdev->max_mtu = MAX_JUMBO_FRAME_SIZE -
+                         (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN);
        atl1e_set_ethtool_ops(netdev);
 
        netdev->hw_features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO |
 
 static int atl1_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct atl1_adapter *adapter = netdev_priv(netdev);
-       int old_mtu = netdev->mtu;
        int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
 
-       if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
-           (max_frame > MAX_JUMBO_FRAME_SIZE)) {
-               if (netif_msg_link(adapter))
-                       dev_warn(&adapter->pdev->dev, "invalid MTU setting\n");
-               return -EINVAL;
-       }
-
        adapter->hw.max_frame_size = max_frame;
        adapter->hw.tx_jumbo_task_th = (max_frame + 7) >> 3;
        adapter->rx_buffer_len = (max_frame + 7) & ~7;
        adapter->hw.rx_jumbo_th = adapter->rx_buffer_len / 8;
 
        netdev->mtu = new_mtu;
-       if ((old_mtu != new_mtu) && netif_running(netdev)) {
+       if (netif_running(netdev)) {
                atl1_down(adapter);
                atl1_up(adapter);
        }
        /* is this valid? see atl1_setup_mac_ctrl() */
        netdev->features |= NETIF_F_RXCSUM;
 
+       /* MTU range: 42 - 10218 */
+       netdev->min_mtu = ETH_ZLEN - (ETH_HLEN + VLAN_HLEN);
+       netdev->max_mtu = MAX_JUMBO_FRAME_SIZE -
+                         (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN);
+
        /*
         * patch for some L1 of old version,
         * the final version of L1 may not need these
 
 
        /* set MTU */
        ATL2_WRITE_REG(hw, REG_MTU, adapter->netdev->mtu +
-               ENET_HEADER_SIZE + VLAN_SIZE + ETHERNET_FCS_SIZE);
+               ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN);
 
        /* 1590 */
        ATL2_WRITE_REG(hw, REG_TX_CUT_THRESH, 0x177);
        struct atl2_adapter *adapter = netdev_priv(netdev);
        struct atl2_hw *hw = &adapter->hw;
 
-       if ((new_mtu < 40) || (new_mtu > (ETH_DATA_LEN + VLAN_SIZE)))
-               return -EINVAL;
-
        /* set MTU */
-       if (hw->max_frame_size != new_mtu) {
-               netdev->mtu = new_mtu;
-               ATL2_WRITE_REG(hw, REG_MTU, new_mtu + ENET_HEADER_SIZE +
-                       VLAN_SIZE + ETHERNET_FCS_SIZE);
-       }
+       netdev->mtu = new_mtu;
+       hw->max_frame_size = new_mtu;
+       ATL2_WRITE_REG(hw, REG_MTU, new_mtu + ETH_HLEN +
+                      VLAN_HLEN + ETH_FCS_LEN);
 
        return 0;
 }
        netdev->netdev_ops = &atl2_netdev_ops;
        netdev->ethtool_ops = &atl2_ethtool_ops;
        netdev->watchdog_timeo = 5 * HZ;
+       netdev->min_mtu = 40;
+       netdev->max_mtu = ETH_DATA_LEN + VLAN_HLEN;
        strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
 
        netdev->mem_start = mmio_start;
 
 #define AUTONEG_ADVERTISE_SPEED_DEFAULT        0x000F  /* Everything */
 
 /* The size (in bytes) of a ethernet packet */
-#define ENET_HEADER_SIZE               14
 #define MAXIMUM_ETHERNET_FRAME_SIZE    1518    /* with FCS */
 #define MINIMUM_ETHERNET_FRAME_SIZE    64      /* with FCS */
-#define ETHERNET_FCS_SIZE              4
 #define MAX_JUMBO_FRAME_SIZE           0x2000
-#define VLAN_SIZE                                               4
 
 struct tx_pkt_header {
        unsigned pkt_size:11;