ethernet: use net core MTU range checking in more drivers
authorJarod Wilson <jarod@redhat.com>
Thu, 20 Oct 2016 17:55:16 +0000 (13:55 -0400)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Oct 2016 18:51:08 +0000 (14:51 -0400)
Somehow, I missed a healthy number of ethernet drivers in the last pass.
Most of these drivers either were in need of an updated max_mtu to make
jumbo frames possible to enable again. In a few cases, also setting a
different min_mtu to match previous lower bounds. There are also a few
drivers that had no upper bounds checking, so they're getting a brand new
ETH_MAX_MTU that is identical to IP_MAX_MTU, but accessible by includes
all ethernet and ethernet-like drivers all have already.

acenic:
- min_mtu = 0, max_mtu = 9000

amazon/ena:
- min_mtu = 128, max_mtu = adapter->max_mtu

amd/xgbe:
- min_mtu = 0, max_mtu = 9000

sb1250:
- min_mtu = 0, max_mtu = 1518

cxgb3:
- min_mtu = 81, max_mtu = 65535

cxgb4:
- min_mtu = 81, max_mtu = 9600

cxgb4vf:
- min_mtu = 81, max_mtu = 65535

benet:
- min_mtu = 256, max_mtu = 9000

ibmveth:
- min_mtu = 68, max_mtu = 65535

ibmvnic:
- min_mtu = adapter->min_mtu, max_mtu = adapter->max_mtu
- remove now redundant ibmvnic_change_mtu

jme:
- min_mtu = 1280, max_mtu = 9202

mv643xx_eth:
- min_mtu = 64, max_mtu = 9500

mlxsw:
- min_mtu = 0, max_mtu = 65535
- Basically bypassing the core checks, and instead relying on dynamic
  checks in the respective switch drivers' ndo_change_mtu functions

ns83820:
- min_mtu = 0
- remove redundant ns83820_change_mtu, only checked for mtu > 1500

netxen:
- min_mtu = 0, max_mtu = 8000 (P2), max_mtu = 9600 (P3)

qlge:
- min_mtu = 1500, max_mtu = 9000
- driver only supports setting mtu to 1500 or 9000, so the core check only
  rules out < 1500 and > 9000, qlge_change_mtu still needs to check that
  the value is 1500 or 9000

qualcomm/emac:
- min_mtu = 46, max_mtu = 9194

xilinx_axienet:
- min_mtu = 64, max_mtu = 9000

Fixes: 61e84623ace3 ("net: centralize net_device min/max MTU checking")
CC: netdev@vger.kernel.org
CC: Jes Sorensen <jes@trained-monkey.org>
CC: Netanel Belgazal <netanel@annapurnalabs.com>
CC: Tom Lendacky <thomas.lendacky@amd.com>
CC: Santosh Raspatur <santosh@chelsio.com>
CC: Hariprasad S <hariprasad@chelsio.com>
CC: Sathya Perla <sathya.perla@broadcom.com>
CC: Ajit Khaparde <ajit.khaparde@broadcom.com>
CC: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
CC: Somnath Kotur <somnath.kotur@broadcom.com>
CC: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
CC: John Allen <jallen@linux.vnet.ibm.com>
CC: Guo-Fu Tseng <cooldavid@cooldavid.org>
CC: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
CC: Jiri Pirko <jiri@mellanox.com>
CC: Ido Schimmel <idosch@mellanox.com>
CC: Manish Chopra <manish.chopra@qlogic.com>
CC: Sony Chacko <sony.chacko@qlogic.com>
CC: Rajesh Borundia <rajesh.borundia@qlogic.com>
CC: Timur Tabi <timur@codeaurora.org>
CC: Anirudha Sarangi <anirudh@xilinx.com>
CC: John Linn <John.Linn@xilinx.com>
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
22 files changed:
drivers/net/ethernet/alteon/acenic.c
drivers/net/ethernet/amazon/ena/ena_netdev.c
drivers/net/ethernet/amd/xgbe/xgbe-drv.c
drivers/net/ethernet/amd/xgbe/xgbe-main.c
drivers/net/ethernet/broadcom/sb1250-mac.c
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/ibm/ibmveth.c
drivers/net/ethernet/ibm/ibmvnic.c
drivers/net/ethernet/jme.c
drivers/net/ethernet/marvell/mv643xx_eth.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/switchx2.c
drivers/net/ethernet/natsemi/ns83820.c
drivers/net/ethernet/qlogic/netxen/netxen_nic_hw.c
drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
drivers/net/ethernet/qlogic/qlge/qlge_main.c
drivers/net/ethernet/qualcomm/emac/emac.c
drivers/net/ethernet/xilinx/xilinx_axienet_main.c
include/uapi/linux/if_ether.h

index b90a26b13fdf22a61b08b311a4f53dbd77f81a6b..a5c1e290677a44bf8445c065c2e1cb154d714830 100644 (file)
@@ -474,6 +474,8 @@ static int acenic_probe_one(struct pci_dev *pdev,
        dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
 
        dev->watchdog_timeo = 5*HZ;
+       dev->min_mtu = 0;
+       dev->max_mtu = ACE_JUMBO_MTU;
 
        dev->netdev_ops = &ace_netdev_ops;
        dev->ethtool_ops = &ace_ethtool_ops;
@@ -2548,9 +2550,6 @@ static int ace_change_mtu(struct net_device *dev, int new_mtu)
        struct ace_private *ap = netdev_priv(dev);
        struct ace_regs __iomem *regs = ap->regs;
 
-       if (new_mtu > ACE_JUMBO_MTU)
-               return -EINVAL;
-
        writel(new_mtu + ETH_HLEN + 4, &regs->IfMtu);
        dev->mtu = new_mtu;
 
index bfeaec5bd7b90098076286f4b8763cfbefd6db56..2a55ab00686a4771df3cd373e59ecde38e9053ab 100644 (file)
@@ -103,13 +103,6 @@ static int ena_change_mtu(struct net_device *dev, int new_mtu)
        struct ena_adapter *adapter = netdev_priv(dev);
        int ret;
 
-       if ((new_mtu > adapter->max_mtu) || (new_mtu < ENA_MIN_MTU)) {
-               netif_err(adapter, drv, dev,
-                         "Invalid MTU setting. new_mtu: %d\n", new_mtu);
-
-               return -EINVAL;
-       }
-
        ret = ena_com_set_dev_mtu(adapter->ena_dev, new_mtu);
        if (!ret) {
                netif_dbg(adapter, drv, dev, "set MTU to %d\n", new_mtu);
@@ -2755,6 +2748,8 @@ static void ena_set_conf_feat_params(struct ena_adapter *adapter,
        ena_set_dev_offloads(feat, netdev);
 
        adapter->max_mtu = feat->dev_attr.max_mtu;
+       netdev->max_mtu = adapter->max_mtu;
+       netdev->min_mtu = ENA_MIN_MTU;
 }
 
 static int ena_rss_init_default(struct ena_adapter *adapter)
index 7f9216db026fa2ee8abe1cf695415ad0be237dc8..c4e668208e0474eed26292626fdfeafbc048314a 100644 (file)
@@ -257,11 +257,6 @@ static int xgbe_calc_rx_buf_size(struct net_device *netdev, unsigned int mtu)
 {
        unsigned int rx_buf_size;
 
-       if (mtu > XGMAC_JUMBO_PACKET_MTU) {
-               netdev_alert(netdev, "MTU exceeds maximum supported value\n");
-               return -EINVAL;
-       }
-
        rx_buf_size = mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
        rx_buf_size = clamp_val(rx_buf_size, XGBE_RX_MIN_BUF_SIZE, PAGE_SIZE);
 
index 9de078819aa676525d4fae65a6a47e3df448dc1e..667e1209a2f57ad853a62eca07d1ba0796c1effa 100644 (file)
@@ -738,6 +738,8 @@ static int xgbe_probe(struct platform_device *pdev)
        pdata->netdev_features = netdev->features;
 
        netdev->priv_flags |= IFF_UNICAST_FLT;
+       netdev->min_mtu = 0;
+       netdev->max_mtu = XGMAC_JUMBO_PACKET_MTU;
 
        /* Use default watchdog timeout */
        netdev->watchdog_timeo = 0;
index f1b81187a20101eca9d491a61c08bf1e4e7af30c..cb312e4c89f46ef8e29fda76d107093b72ae9d3a 100644 (file)
@@ -2147,15 +2147,6 @@ static void sbmac_setmulti(struct sbmac_softc *sc)
        }
 }
 
-static int sb1250_change_mtu(struct net_device *_dev, int new_mtu)
-{
-       if (new_mtu >  ENET_PACKET_SIZE)
-               return -EINVAL;
-       _dev->mtu = new_mtu;
-       pr_info("changing the mtu to %d\n", new_mtu);
-       return 0;
-}
-
 static const struct net_device_ops sbmac_netdev_ops = {
        .ndo_open               = sbmac_open,
        .ndo_stop               = sbmac_close,
@@ -2163,7 +2154,6 @@ static const struct net_device_ops sbmac_netdev_ops = {
        .ndo_set_rx_mode        = sbmac_set_rx_mode,
        .ndo_tx_timeout         = sbmac_tx_timeout,
        .ndo_do_ioctl           = sbmac_mii_ioctl,
-       .ndo_change_mtu         = sb1250_change_mtu,
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_set_mac_address    = eth_mac_addr,
 #ifdef CONFIG_NET_POLL_CONTROLLER
@@ -2229,6 +2219,8 @@ static int sbmac_init(struct platform_device *pldev, long long base)
 
        dev->netdev_ops = &sbmac_netdev_ops;
        dev->watchdog_timeo = TX_TIMEOUT;
+       dev->max_mtu = 0;
+       dev->max_mtu = ENET_PACKET_SIZE;
 
        netif_napi_add(dev, &sc->napi, sbmac_poll, 16);
 
index 43da891fab97e7f16b572dd67f3fc6aa9020a1fb..092b3c16440bcf2f4f6186cb8af0e1eed8ca1354 100644 (file)
@@ -2531,8 +2531,6 @@ static int cxgb_change_mtu(struct net_device *dev, int new_mtu)
        struct adapter *adapter = pi->adapter;
        int ret;
 
-       if (new_mtu < 81)       /* accommodate SACK */
-               return -EINVAL;
        if ((ret = t3_mac_set_mtu(&pi->mac, new_mtu)))
                return ret;
        dev->mtu = new_mtu;
@@ -3295,6 +3293,8 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
                netdev->netdev_ops = &cxgb_netdev_ops;
                netdev->ethtool_ops = &cxgb_ethtool_ops;
+               netdev->min_mtu = 81;
+               netdev->max_mtu = ETH_MAX_MTU;
        }
 
        pci_set_drvdata(pdev, adapter);
index f320497368f401deb36a3c1b93d0e288208a7fec..b0bb23f95beb4c036d0f5e9ea720ac2153fcc337 100644 (file)
@@ -2502,8 +2502,6 @@ static int cxgb_change_mtu(struct net_device *dev, int new_mtu)
        int ret;
        struct port_info *pi = netdev_priv(dev);
 
-       if (new_mtu < 81 || new_mtu > MAX_MTU)         /* accommodate SACK */
-               return -EINVAL;
        ret = t4_set_rxmode(pi->adapter, pi->adapter->pf, pi->viid, new_mtu, -1,
                            -1, -1, -1, true);
        if (!ret)
@@ -4803,6 +4801,10 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
                netdev->priv_flags |= IFF_UNICAST_FLT;
 
+               /* MTU range: 81 - 9600 */
+               netdev->min_mtu = 81;
+               netdev->max_mtu = MAX_MTU;
+
                netdev->netdev_ops = &cxgb4_netdev_ops;
 #ifdef CONFIG_CHELSIO_T4_DCB
                netdev->dcbnl_ops = &cxgb4_dcb_ops;
index 100b2cc064a34cafe8faac0e16e9ce44aa1a4f95..5d4da0e8acaa5895c4a649c32608287af1afda74 100644 (file)
@@ -1108,10 +1108,6 @@ static int cxgb4vf_change_mtu(struct net_device *dev, int new_mtu)
        int ret;
        struct port_info *pi = netdev_priv(dev);
 
-       /* accommodate SACK */
-       if (new_mtu < 81)
-               return -EINVAL;
-
        ret = t4vf_set_rxmode(pi->adapter, pi->viid, new_mtu,
                              -1, -1, -1, -1, true);
        if (!ret)
@@ -2966,6 +2962,8 @@ static int cxgb4vf_pci_probe(struct pci_dev *pdev,
                        netdev->features |= NETIF_F_HIGHDMA;
 
                netdev->priv_flags |= IFF_UNICAST_FLT;
+               netdev->min_mtu = 81;
+               netdev->max_mtu = ETH_MAX_MTU;
 
                netdev->netdev_ops = &cxgb4vf_netdev_ops;
                netdev->ethtool_ops = &cxgb4vf_ethtool_ops;
index cece8a08edca1de45c4c56f89704ddd8523d7a3f..3f6152cc648c86feb94a85edbe8924bd2a95ea90 100644 (file)
@@ -1406,23 +1406,6 @@ drop:
        return NETDEV_TX_OK;
 }
 
-static int be_change_mtu(struct net_device *netdev, int new_mtu)
-{
-       struct be_adapter *adapter = netdev_priv(netdev);
-       struct device *dev = &adapter->pdev->dev;
-
-       if (new_mtu < BE_MIN_MTU || new_mtu > BE_MAX_MTU) {
-               dev_info(dev, "MTU must be between %d and %d bytes\n",
-                        BE_MIN_MTU, BE_MAX_MTU);
-               return -EINVAL;
-       }
-
-       dev_info(dev, "MTU changed from %d to %d bytes\n",
-                netdev->mtu, new_mtu);
-       netdev->mtu = new_mtu;
-       return 0;
-}
-
 static inline bool be_in_all_promisc(struct be_adapter *adapter)
 {
        return (adapter->if_flags & BE_IF_FLAGS_ALL_PROMISCUOUS) ==
@@ -5216,7 +5199,6 @@ static const struct net_device_ops be_netdev_ops = {
        .ndo_start_xmit         = be_xmit,
        .ndo_set_rx_mode        = be_set_rx_mode,
        .ndo_set_mac_address    = be_mac_addr_set,
-       .ndo_change_mtu         = be_change_mtu,
        .ndo_get_stats64        = be_get_stats64,
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_vlan_rx_add_vid    = be_vlan_add_vid,
@@ -5266,6 +5248,10 @@ static void be_netdev_init(struct net_device *netdev)
        netdev->netdev_ops = &be_netdev_ops;
 
        netdev->ethtool_ops = &be_ethtool_ops;
+
+       /* MTU range: 256 - 9000 */
+       netdev->min_mtu = BE_MIN_MTU;
+       netdev->max_mtu = BE_MAX_MTU;
 }
 
 static void be_cleanup(struct be_adapter *adapter)
index ebe60719e489cd1fbdc12248ee48eed6d0979fd4..29c05d0d79a9897894b8c9952411e48bbdfc40e3 100644 (file)
@@ -1349,9 +1349,6 @@ static int ibmveth_change_mtu(struct net_device *dev, int new_mtu)
        int i, rc;
        int need_restart = 0;
 
-       if (new_mtu < IBMVETH_MIN_MTU)
-               return -EINVAL;
-
        for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++)
                if (new_mtu_oh <= adapter->rx_buff_pool[i].buff_size)
                        break;
@@ -1551,6 +1548,9 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id)
                netdev->hw_features |= NETIF_F_TSO;
        }
 
+       netdev->min_mtu = IBMVETH_MIN_MTU;
+       netdev->min_mtu = ETH_MAX_MTU;
+
        memcpy(netdev->dev_addr, mac_addr_p, ETH_ALEN);
 
        if (firmware_has_feature(FW_FEATURE_CMO))
index bfe17d9c022df9ac8932c1cef9e4eac94cf23d77..657206be7ba99b20a31c839ad2a3a23fa966c300 100644 (file)
@@ -902,17 +902,6 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p)
        return 0;
 }
 
-static int ibmvnic_change_mtu(struct net_device *netdev, int new_mtu)
-{
-       struct ibmvnic_adapter *adapter = netdev_priv(netdev);
-
-       if (new_mtu > adapter->req_mtu || new_mtu < adapter->min_mtu)
-               return -EINVAL;
-
-       netdev->mtu = new_mtu;
-       return 0;
-}
-
 static void ibmvnic_tx_timeout(struct net_device *dev)
 {
        struct ibmvnic_adapter *adapter = netdev_priv(dev);
@@ -1029,7 +1018,6 @@ static const struct net_device_ops ibmvnic_netdev_ops = {
        .ndo_set_rx_mode        = ibmvnic_set_multi,
        .ndo_set_mac_address    = ibmvnic_set_mac,
        .ndo_validate_addr      = eth_validate_addr,
-       .ndo_change_mtu         = ibmvnic_change_mtu,
        .ndo_tx_timeout         = ibmvnic_tx_timeout,
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller    = ibmvnic_netpoll_controller,
@@ -2638,10 +2626,12 @@ static void handle_query_cap_rsp(union ibmvnic_crq *crq,
                break;
        case MIN_MTU:
                adapter->min_mtu = be64_to_cpu(crq->query_capability.number);
+               netdev->min_mtu = adapter->min_mtu;
                netdev_dbg(netdev, "min_mtu = %lld\n", adapter->min_mtu);
                break;
        case MAX_MTU:
                adapter->max_mtu = be64_to_cpu(crq->query_capability.number);
+               netdev->max_mtu = adapter->max_mtu;
                netdev_dbg(netdev, "max_mtu = %lld\n", adapter->max_mtu);
                break;
        case MAX_MULTICAST_FILTERS:
@@ -3654,6 +3644,8 @@ static void handle_crq_init_rsp(struct work_struct *work)
                goto task_failed;
 
        netdev->real_num_tx_queues = adapter->req_tx_queues;
+       netdev->min_mtu = adapter->min_mtu;
+       netdev->max_mtu = adapter->max_mtu;
 
        if (adapter->failover) {
                adapter->failover = false;
index 836ebd8ee768fc8083da04a45192eff81742a644..f9fcab54783c45b0ff49b3d3edc5077cf18401fa 100644 (file)
@@ -2357,14 +2357,6 @@ jme_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct jme_adapter *jme = netdev_priv(netdev);
 
-       if (new_mtu == jme->old_mtu)
-               return 0;
-
-       if (((new_mtu + ETH_HLEN) > MAX_ETHERNET_JUMBO_PACKET_SIZE) ||
-               ((new_mtu) < IPV6_MIN_MTU))
-               return -EINVAL;
-
-
        netdev->mtu = new_mtu;
        netdev_update_features(netdev);
 
@@ -3063,6 +3055,10 @@ jme_init_one(struct pci_dev *pdev,
        if (using_dac)
                netdev->features        |=      NETIF_F_HIGHDMA;
 
+       /* MTU range: 1280 - 9202*/
+       netdev->min_mtu = IPV6_MIN_MTU;
+       netdev->max_mtu = MAX_ETHERNET_JUMBO_PACKET_SIZE - ETH_HLEN;
+
        SET_NETDEV_DEV(netdev, &pdev->dev);
        pci_set_drvdata(pdev, netdev);
 
index 18e6bb6e386728ae5ae52019555a623f7facd8a3..68675d83bdc56c83a17f95fa81263624e12c9e6a 100644 (file)
@@ -2585,9 +2585,6 @@ static int mv643xx_eth_change_mtu(struct net_device *dev, int new_mtu)
 {
        struct mv643xx_eth_private *mp = netdev_priv(dev);
 
-       if (new_mtu < 64 || new_mtu > 9500)
-               return -EINVAL;
-
        dev->mtu = new_mtu;
        mv643xx_eth_recalc_skb_size(mp);
        tx_set_rate(mp, 1000000000, 16777216);
@@ -3206,6 +3203,10 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
        dev->priv_flags |= IFF_UNICAST_FLT;
        dev->gso_max_segs = MV643XX_MAX_TSO_SEGS;
 
+       /* MTU range: 64 - 9500 */
+       dev->min_mtu = 64;
+       dev->max_mtu = 9500;
+
        SET_NETDEV_DEV(dev, &pdev->dev);
 
        if (mp->shared->win_protect)
index 99805fd3d1109ee7490ecc2aee50eb2986e180c0..6d8cb22579ee7f0a87fb2de9f3f5c9c376215afc 100644 (file)
@@ -2284,6 +2284,9 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port,
                         NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC;
        dev->hw_features |= NETIF_F_HW_TC;
 
+       dev->min_mtu = 0;
+       dev->max_mtu = ETH_MAX_MTU;
+
        /* Each packet needs to have a Tx header (metadata) on top all other
         * headers.
         */
index c0c23e2f3275ae4b64f7f3444e4321811b4c6fa8..66af63d99b8b05deca7e8e23cafcf3a22d725ac4 100644 (file)
@@ -994,6 +994,9 @@ static int mlxsw_sx_port_create(struct mlxsw_sx *mlxsw_sx, u8 local_port)
        dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_LLTX | NETIF_F_SG |
                         NETIF_F_VLAN_CHALLENGED;
 
+       dev->min_mtu = 0;
+       dev->max_mtu = ETH_MAX_MTU;
+
        /* Each packet needs to have a Tx header (metadata) on top all other
         * headers.
         */
index 569ade6cf85c56e564269e4639d007fbbd2deb6f..a34631ed741df4a66bd7948199602f068f8d77a4 100644 (file)
@@ -1679,14 +1679,6 @@ static void ns83820_getmac(struct ns83820 *dev, u8 *mac)
        }
 }
 
-static int ns83820_change_mtu(struct net_device *ndev, int new_mtu)
-{
-       if (new_mtu > RX_BUF_SIZE)
-               return -EINVAL;
-       ndev->mtu = new_mtu;
-       return 0;
-}
-
 static void ns83820_set_multicast(struct net_device *ndev)
 {
        struct ns83820 *dev = PRIV(ndev);
@@ -1933,7 +1925,6 @@ static const struct net_device_ops netdev_ops = {
        .ndo_stop               = ns83820_stop,
        .ndo_start_xmit         = ns83820_hard_start_xmit,
        .ndo_get_stats          = ns83820_get_stats,
-       .ndo_change_mtu         = ns83820_change_mtu,
        .ndo_set_rx_mode        = ns83820_set_multicast,
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_set_mac_address    = eth_mac_addr,
@@ -2190,6 +2181,8 @@ static int ns83820_init_one(struct pci_dev *pci_dev,
        ndev->features |= NETIF_F_SG;
        ndev->features |= NETIF_F_IP_CSUM;
 
+       ndev->min_mtu = 0;
+
 #ifdef NS83820_VLAN_ACCEL_SUPPORT
        /* We also support hardware vlan acceleration */
        ndev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
index 2b10f1bcd1517458b2cfcb22e6ce4677995181a8..a996801d442dd87ed47e572355e497bde8f6c846 100644 (file)
@@ -987,20 +987,8 @@ int netxen_send_lro_cleanup(struct netxen_adapter *adapter)
 int netxen_nic_change_mtu(struct net_device *netdev, int mtu)
 {
        struct netxen_adapter *adapter = netdev_priv(netdev);
-       int max_mtu;
        int rc = 0;
 
-       if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
-               max_mtu = P3_MAX_MTU;
-       else
-               max_mtu = P2_MAX_MTU;
-
-       if (mtu > max_mtu) {
-               printk(KERN_ERR "%s: mtu > %d bytes unsupported\n",
-                               netdev->name, max_mtu);
-               return -EINVAL;
-       }
-
        if (adapter->set_mtu)
                rc = adapter->set_mtu(adapter, mtu);
 
index 7a0281a36c2818a002a8fc2bc00ceb6ae7221921..561fb94c72670ecf51db5eb51a963de4d8030eb6 100644 (file)
@@ -1572,6 +1572,13 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                        adapter->physical_port = i;
        }
 
+       /* MTU range: 0 - 8000 (P2) or 9600 (P3) */
+       netdev->min_mtu = 0;
+       if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
+               netdev->max_mtu = P3_MAX_MTU;
+       else
+               netdev->max_mtu = P2_MAX_MTU;
+
        netxen_nic_clear_stats(adapter);
 
        err = netxen_setup_intr(adapter);
index fd4a8e473f11180b75bf7949845cdbcdd84486f6..1409412ab39da7a7a58e3100fdd8461b8b87992b 100644 (file)
@@ -4788,6 +4788,13 @@ static int qlge_probe(struct pci_dev *pdev,
        ndev->ethtool_ops = &qlge_ethtool_ops;
        ndev->watchdog_timeo = 10 * HZ;
 
+       /* MTU range: this driver only supports 1500 or 9000, so this only
+        * filters out values above or below, and we'll rely on
+        * qlge_change_mtu to make sure only 1500 or 9000 are allowed
+        */
+       ndev->min_mtu = ETH_DATA_LEN;
+       ndev->max_mtu = 9000;
+
        err = register_netdev(ndev);
        if (err) {
                dev_err(&pdev->dev, "net device registration failed.\n");
index 9bf3b2b82e9532e2662727a31d0846447ee64b39..e4e1925d18a48475a8dbaa4bc37bc2eafa65d4a8 100644 (file)
@@ -239,15 +239,8 @@ static void emac_rx_mode_set(struct net_device *netdev)
 /* Change the Maximum Transfer Unit (MTU) */
 static int emac_change_mtu(struct net_device *netdev, int new_mtu)
 {
-       unsigned int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
        struct emac_adapter *adpt = netdev_priv(netdev);
 
-       if ((max_frame < EMAC_MIN_ETH_FRAME_SIZE) ||
-           (max_frame > EMAC_MAX_ETH_FRAME_SIZE)) {
-               netdev_err(adpt->netdev, "error: invalid MTU setting\n");
-               return -EINVAL;
-       }
-
        netif_info(adpt, hw, adpt->netdev,
                   "changing MTU from %d to %d\n", netdev->mtu,
                   new_mtu);
@@ -679,6 +672,12 @@ static int emac_probe(struct platform_device *pdev)
        netdev->vlan_features |= NETIF_F_SG | NETIF_F_HW_CSUM |
                                 NETIF_F_TSO | NETIF_F_TSO6;
 
+       /* MTU range: 46 - 9194 */
+       netdev->min_mtu = EMAC_MIN_ETH_FRAME_SIZE -
+                         (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN);
+       netdev->max_mtu = EMAC_MAX_ETH_FRAME_SIZE -
+                         (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN);
+
        INIT_WORK(&adpt->work_thread, emac_work_thread);
 
        /* Initialize queues */
index c688d68c39aaa75c832b2c4bb949f2676dd23aa8..c9c8a3be9f1ba9c045c49b0b1365a2655d467701 100644 (file)
@@ -1034,9 +1034,6 @@ static int axienet_change_mtu(struct net_device *ndev, int new_mtu)
                XAE_TRL_SIZE) > lp->rxmem)
                return -EINVAL;
 
-       if ((new_mtu > XAE_JUMBO_MTU) || (new_mtu < 64))
-               return -EINVAL;
-
        ndev->mtu = new_mtu;
 
        return 0;
@@ -1475,6 +1472,10 @@ static int axienet_probe(struct platform_device *pdev)
        ndev->netdev_ops = &axienet_netdev_ops;
        ndev->ethtool_ops = &axienet_ethtool_ops;
 
+       /* MTU range: 64 - 9000 */
+       ndev->min_mtu = 64;
+       ndev->max_mtu = XAE_JUMBO_MTU;
+
        lp = netdev_priv(ndev);
        lp->ndev = ndev;
        lp->dev = &pdev->dev;
index 864d6f2b2cb0ff2cc33733340f5e3661804301a6..3e5185e9ef03d612a971cd0a6e7577d58648a20d 100644 (file)
@@ -36,6 +36,7 @@
 #define ETH_FCS_LEN    4               /* Octets in the FCS             */
 
 #define ETH_MIN_MTU    68              /* Min IPv4 MTU per RFC791      */
+#define ETH_MAX_MTU    0xFFFFU         /* 65535, same as IP_MAX_MTU    */
 
 /*
  *     These are the defined Ethernet Protocol ID's.