Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ethernet: use core min/max MTU checking

et131x: min_mtu 64, max_mtu 9216

altera_tse: min_mtu 64, max_mtu 1500

amd8111e: min_mtu 60, max_mtu 9000

bnad: min_mtu 46, max_mtu 9000

macb: min_mtu 68, max_mtu 1500 or 10240 depending on hardware capability

xgmac: min_mtu 46, max_mtu 9000

cxgb2: min_mtu 68, max_mtu 9582 (pm3393) or 9600 (vsc7326)

enic: min_mtu 68, max_mtu 9000

gianfar: min_mtu 50, max_mu 9586

hns_enet: min_mtu 68, max_mtu 9578 (v1) or 9706 (v2)

ksz884x: min_mtu 60, max_mtu 1894

myri10ge: min_mtu 68, max_mtu 9000

natsemi: min_mtu 64, max_mtu 2024

nfp: min_mtu 68, max_mtu hardware-specific

forcedeth: min_mtu 64, max_mtu 1500 or 9100, depending on hardware

pch_gbe: min_mtu 46, max_mtu 10300

pasemi_mac: min_mtu 64, max_mtu 9000

qcaspi: min_mtu 46, max_mtu 1500
- remove qcaspi_netdev_change_mtu as it is now redundant

rocker: min_mtu 68, max_mtu 9000

sxgbe: min_mtu 68, max_mtu 9000

stmmac: min_mtu 46, max_mtu depends on hardware

tehuti: min_mtu 60, max_mtu 16384
- driver had no max mtu checking, but product docs say 16k jumbo packets
are supported by the hardware

netcp: min_mtu 68, max_mtu 9486
- remove netcp_ndo_change_mtu as it is now redundant

via-velocity: min_mtu 64, max_mtu 9000

octeon: min_mtu 46, max_mtu 65370

CC: netdev@vger.kernel.org
CC: Mark Einon <mark.einon@gmail.com>
CC: Vince Bridgers <vbridger@opensource.altera.com>
CC: Rasesh Mody <rasesh.mody@qlogic.com>
CC: Nicolas Ferre <nicolas.ferre@atmel.com>
CC: Santosh Raspatur <santosh@chelsio.com>
CC: Hariprasad S <hariprasad@chelsio.com>
CC: Christian Benvenuti <benve@cisco.com>
CC: Sujith Sankar <ssujith@cisco.com>
CC: Govindarajulu Varadarajan <_govind@gmx.com>
CC: Neel Patel <neepatel@cisco.com>
CC: Claudiu Manoil <claudiu.manoil@freescale.com>
CC: Yisen Zhuang <yisen.zhuang@huawei.com>
CC: Salil Mehta <salil.mehta@huawei.com>
CC: Hyong-Youb Kim <hykim@myri.com>
CC: Jakub Kicinski <jakub.kicinski@netronome.com>
CC: Olof Johansson <olof@lixom.net>
CC: Jiri Pirko <jiri@resnulli.us>
CC: Byungho An <bh74.an@samsung.com>
CC: Girish K S <ks.giri@samsung.com>
CC: Vipul Pandya <vipul.pandya@samsung.com>
CC: Giuseppe Cavallaro <peppe.cavallaro@st.com>
CC: Alexandre Torgue <alexandre.torgue@st.com>
CC: Andy Gospodarek <andy@greyhouse.net>
CC: Wingman Kwok <w-kwok2@ti.com>
CC: Murali Karicheri <m-karicheri2@ti.com>
CC: Francois Romieu <romieu@fr.zoreil.com>
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jarod Wilson and committed by
David S. Miller
44770e11 1281a2c7

+169 -222
+4 -3
drivers/net/ethernet/agere/et131x.c
··· 176 176 #define NUM_FBRS 2 177 177 178 178 #define MAX_PACKETS_HANDLED 256 179 + #define ET131X_MIN_MTU 64 180 + #define ET131X_MAX_MTU 9216 179 181 180 182 #define ALCATEL_MULTICAST_PKT 0x01000000 181 183 #define ALCATEL_BROADCAST_PKT 0x02000000 ··· 3871 3869 int result = 0; 3872 3870 struct et131x_adapter *adapter = netdev_priv(netdev); 3873 3871 3874 - if (new_mtu < 64 || new_mtu > 9216) 3875 - return -EINVAL; 3876 - 3877 3872 et131x_disable_txrx(netdev); 3878 3873 3879 3874 netdev->mtu = new_mtu; ··· 3957 3958 3958 3959 netdev->watchdog_timeo = ET131X_TX_TIMEOUT; 3959 3960 netdev->netdev_ops = &et131x_netdev_ops; 3961 + netdev->min_mtu = ET131X_MIN_MTU; 3962 + netdev->max_mtu = ET131X_MAX_MTU; 3960 3963 3961 3964 SET_NETDEV_DEV(netdev, &pdev->dev); 3962 3965 netdev->ethtool_ops = &et131x_ethtool_ops;
-1
drivers/net/ethernet/altera/altera_tse.h
··· 443 443 /* RX/TX MAC FIFO configs */ 444 444 u32 tx_fifo_depth; 445 445 u32 rx_fifo_depth; 446 - u32 max_mtu; 447 446 448 447 /* Hash filter settings */ 449 448 u32 hash_filter;
+3 -11
drivers/net/ethernet/altera/altera_tse_main.c
··· 994 994 */ 995 995 static int tse_change_mtu(struct net_device *dev, int new_mtu) 996 996 { 997 - struct altera_tse_private *priv = netdev_priv(dev); 998 - unsigned int max_mtu = priv->max_mtu; 999 - unsigned int min_mtu = ETH_ZLEN + ETH_FCS_LEN; 1000 - 1001 997 if (netif_running(dev)) { 1002 998 netdev_err(dev, "must be stopped to change its MTU\n"); 1003 999 return -EBUSY; 1004 - } 1005 - 1006 - if ((new_mtu < min_mtu) || (new_mtu > max_mtu)) { 1007 - netdev_err(dev, "invalid MTU, max MTU is: %u\n", max_mtu); 1008 - return -EINVAL; 1009 1000 } 1010 1001 1011 1002 dev->mtu = new_mtu; ··· 1437 1446 of_property_read_bool(pdev->dev.of_node, 1438 1447 "altr,has-supplementary-unicast"); 1439 1448 1449 + priv->dev->min_mtu = ETH_ZLEN + ETH_FCS_LEN; 1440 1450 /* Max MTU is 1500, ETH_DATA_LEN */ 1441 - priv->max_mtu = ETH_DATA_LEN; 1451 + priv->dev->max_mtu = ETH_DATA_LEN; 1442 1452 1443 1453 /* Get the max mtu from the device tree. Note that the 1444 1454 * "max-frame-size" parameter is actually max mtu. Definition 1445 1455 * in the ePAPR v1.1 spec and usage differ, so go with usage. 1446 1456 */ 1447 1457 of_property_read_u32(pdev->dev.of_node, "max-frame-size", 1448 - &priv->max_mtu); 1458 + &priv->dev->max_mtu); 1449 1459 1450 1460 /* The DMA buffer size already accounts for an alignment bias 1451 1461 * to avoid unaligned access exceptions for the NIOS processor,
+2 -3
drivers/net/ethernet/amd/amd8111e.c
··· 1556 1556 struct amd8111e_priv *lp = netdev_priv(dev); 1557 1557 int err; 1558 1558 1559 - if ((new_mtu < AMD8111E_MIN_MTU) || (new_mtu > AMD8111E_MAX_MTU)) 1560 - return -EINVAL; 1561 - 1562 1559 if (!netif_running(dev)) { 1563 1560 /* new_mtu will be used 1564 1561 * when device starts netxt time ··· 1871 1874 dev->ethtool_ops = &ops; 1872 1875 dev->irq =pdev->irq; 1873 1876 dev->watchdog_timeo = AMD8111E_TX_TIMEOUT; 1877 + dev->min_mtu = AMD8111E_MIN_MTU; 1878 + dev->max_mtu = AMD8111E_MAX_MTU; 1874 1879 netif_napi_add(dev, &lp->napi, amd8111e_rx_poll, 32); 1875 1880 1876 1881 #if AMD8111E_VLAN_TAG_USED
+4 -3
drivers/net/ethernet/brocade/bna/bnad.c
··· 3296 3296 struct bnad *bnad = netdev_priv(netdev); 3297 3297 u32 rx_count = 0, frame, new_frame; 3298 3298 3299 - if (new_mtu + ETH_HLEN < ETH_ZLEN || new_mtu > BNAD_JUMBO_MTU) 3300 - return -EINVAL; 3301 - 3302 3299 mutex_lock(&bnad->conf_mutex); 3303 3300 3304 3301 mtu = netdev->mtu; ··· 3461 3464 3462 3465 netdev->mem_start = bnad->mmio_start; 3463 3466 netdev->mem_end = bnad->mmio_start + bnad->mmio_len - 1; 3467 + 3468 + /* MTU range: 46 - 9000 */ 3469 + netdev->min_mtu = ETH_ZLEN - ETH_HLEN; 3470 + netdev->max_mtu = BNAD_JUMBO_MTU; 3464 3471 3465 3472 netdev->netdev_ops = &bnad_netdev_ops; 3466 3473 bnad_set_ethtool_ops(netdev);
+8 -11
drivers/net/ethernet/cadence/macb.c
··· 56 56 #define MACB_MAX_TX_LEN ((unsigned int)((1 << MACB_TX_FRMLEN_SIZE) - 1)) 57 57 #define GEM_MAX_TX_LEN ((unsigned int)((1 << GEM_TX_FRMLEN_SIZE) - 1)) 58 58 59 - #define GEM_MTU_MIN_SIZE 68 59 + #define GEM_MTU_MIN_SIZE ETH_MIN_MTU 60 60 61 61 #define MACB_WOL_HAS_MAGIC_PACKET (0x1 << 0) 62 62 #define MACB_WOL_ENABLED (0x1 << 1) ··· 1986 1986 1987 1987 static int macb_change_mtu(struct net_device *dev, int new_mtu) 1988 1988 { 1989 - struct macb *bp = netdev_priv(dev); 1990 - u32 max_mtu; 1991 - 1992 1989 if (netif_running(dev)) 1993 1990 return -EBUSY; 1994 - 1995 - max_mtu = ETH_DATA_LEN; 1996 - if (bp->caps & MACB_CAPS_JUMBO) 1997 - max_mtu = gem_readl(bp, JML) - ETH_HLEN - ETH_FCS_LEN; 1998 - 1999 - if ((new_mtu > max_mtu) || (new_mtu < GEM_MTU_MIN_SIZE)) 2000 - return -EINVAL; 2001 1991 2002 1992 dev->mtu = new_mtu; 2003 1993 ··· 3016 3026 err = dev->irq; 3017 3027 goto err_out_free_netdev; 3018 3028 } 3029 + 3030 + /* MTU range: 68 - 1500 or 10240 */ 3031 + dev->min_mtu = GEM_MTU_MIN_SIZE; 3032 + if (bp->caps & MACB_CAPS_JUMBO) 3033 + dev->max_mtu = gem_readl(bp, JML) - ETH_HLEN - ETH_FCS_LEN; 3034 + else 3035 + dev->max_mtu = ETH_DATA_LEN; 3019 3036 3020 3037 mac = of_get_mac_address(np); 3021 3038 if (mac)
+5 -15
drivers/net/ethernet/calxeda/xgmac.c
··· 394 394 }; 395 395 396 396 /* XGMAC Configuration Settings */ 397 - #define MAX_MTU 9000 397 + #define XGMAC_MAX_MTU 9000 398 398 #define PAUSE_TIME 0x400 399 399 400 400 #define DMA_RX_RING_SZ 256 ··· 1360 1360 */ 1361 1361 static int xgmac_change_mtu(struct net_device *dev, int new_mtu) 1362 1362 { 1363 - struct xgmac_priv *priv = netdev_priv(dev); 1364 - int old_mtu; 1365 - 1366 - if ((new_mtu < 46) || (new_mtu > MAX_MTU)) { 1367 - netdev_err(priv->dev, "invalid MTU, max MTU is: %d\n", MAX_MTU); 1368 - return -EINVAL; 1369 - } 1370 - 1371 - old_mtu = dev->mtu; 1372 - 1373 - /* return early if the buffer sizes will not change */ 1374 - if (old_mtu == new_mtu) 1375 - return 0; 1376 - 1377 1363 /* Stop everything, get ready to change the MTU */ 1378 1364 if (!netif_running(dev)) 1379 1365 return 0; ··· 1789 1803 NETIF_F_RXCSUM; 1790 1804 ndev->features |= ndev->hw_features; 1791 1805 ndev->priv_flags |= IFF_UNICAST_FLT; 1806 + 1807 + /* MTU range: 46 - 9000 */ 1808 + ndev->min_mtu = ETH_ZLEN - ETH_HLEN; 1809 + ndev->max_mtu = XGMAC_MAX_MTU; 1792 1810 1793 1811 /* Get the MAC address */ 1794 1812 xgmac_get_mac_addr(priv->base, ndev->dev_addr, 0);
+5
drivers/net/ethernet/chelsio/cxgb/common.h
··· 85 85 #define SPEED_INVALID 0xffff 86 86 #define DUPLEX_INVALID 0xff 87 87 88 + /* Max frame size PM3393 can handle. Includes Ethernet header and CRC. */ 89 + #define PM3393_MAX_FRAME_SIZE 9600 90 + 91 + #define VSC7326_MAX_MTU 9600 92 + 88 93 enum { 89 94 CHBT_BOARD_N110, 90 95 CHBT_BOARD_N210,
+16 -2
drivers/net/ethernet/chelsio/cxgb/cxgb2.c
··· 825 825 826 826 if (!mac->ops->set_mtu) 827 827 return -EOPNOTSUPP; 828 - if (new_mtu < 68) 829 - return -EINVAL; 830 828 if ((ret = mac->ops->set_mtu(mac, new_mtu))) 831 829 return ret; 832 830 dev->mtu = new_mtu; ··· 1099 1101 netif_napi_add(netdev, &adapter->napi, t1_poll, 64); 1100 1102 1101 1103 netdev->ethtool_ops = &t1_ethtool_ops; 1104 + 1105 + switch (bi->board) { 1106 + case CHBT_BOARD_CHT110: 1107 + case CHBT_BOARD_N110: 1108 + case CHBT_BOARD_N210: 1109 + case CHBT_BOARD_CHT210: 1110 + netdev->max_mtu = PM3393_MAX_FRAME_SIZE - 1111 + (ETH_HLEN + ETH_FCS_LEN); 1112 + break; 1113 + case CHBT_BOARD_CHN204: 1114 + netdev->max_mtu = VSC7326_MAX_MTU; 1115 + break; 1116 + default: 1117 + netdev->max_mtu = ETH_DATA_LEN; 1118 + break; 1119 + } 1102 1120 } 1103 1121 1104 1122 if (t1_init_sw_modules(adapter, bi) < 0) {
+1 -7
drivers/net/ethernet/chelsio/cxgb/pm3393.c
··· 47 47 48 48 #define OFFSET(REG_ADDR) ((REG_ADDR) << 2) 49 49 50 - /* Max frame size PM3393 can handle. Includes Ethernet header and CRC. */ 51 - #define MAX_FRAME_SIZE 9600 52 - 53 50 #define IPG 12 54 51 #define TXXG_CONF1_VAL ((IPG << SUNI1x10GEXP_BITOFF_TXXG_IPGT) | \ 55 52 SUNI1x10GEXP_BITMSK_TXXG_32BIT_ALIGN | SUNI1x10GEXP_BITMSK_TXXG_CRCEN | \ ··· 328 331 { 329 332 int enabled = cmac->instance->enabled; 330 333 331 - /* MAX_FRAME_SIZE includes header + FCS, mtu doesn't */ 332 - mtu += 14 + 4; 333 - if (mtu > MAX_FRAME_SIZE) 334 - return -EINVAL; 334 + mtu += ETH_HLEN + ETH_FCS_LEN; 335 335 336 336 /* Disable Rx/Tx MAC before configuring it. */ 337 337 if (enabled)
-5
drivers/net/ethernet/chelsio/cxgb/vsc7326.c
··· 11 11 /* 30 minutes for full statistics update */ 12 12 #define MAJOR_UPDATE_TICKS (1800 / STATS_TICK_SECS) 13 13 14 - #define MAX_MTU 9600 15 - 16 14 /* The egress WM value 0x01a01fff should be used only when the 17 15 * interface is down (MAC port disabled). This is a workaround 18 16 * for disabling the T2/MAC flow-control. When the interface is ··· 449 451 static int mac_set_mtu(struct cmac *mac, int mtu) 450 452 { 451 453 int port = mac->instance->index; 452 - 453 - if (mtu > MAX_MTU) 454 - return -EINVAL; 455 454 456 455 /* max_len includes header and FCS */ 457 456 vsc_write(mac->adapter, REG_MAX_LEN(port), mtu + 14 + 4);
+4 -3
drivers/net/ethernet/cisco/enic/enic_main.c
··· 1843 1843 struct enic *enic = netdev_priv(netdev); 1844 1844 int running = netif_running(netdev); 1845 1845 1846 - if (new_mtu < ENIC_MIN_MTU || new_mtu > ENIC_MAX_MTU) 1847 - return -EINVAL; 1848 - 1849 1846 if (enic_is_dynamic(enic) || enic_is_sriov_vf(enic)) 1850 1847 return -EOPNOTSUPP; 1851 1848 ··· 2747 2750 netdev->features |= NETIF_F_HIGHDMA; 2748 2751 2749 2752 netdev->priv_flags |= IFF_UNICAST_FLT; 2753 + 2754 + /* MTU range: 68 - 9000 */ 2755 + netdev->min_mtu = ENIC_MIN_MTU; 2756 + netdev->max_mtu = ENIC_MAX_MTU; 2750 2757 2751 2758 err = register_netdev(netdev); 2752 2759 if (err) {
+1 -1
drivers/net/ethernet/cisco/enic/enic_res.h
··· 30 30 #define ENIC_MIN_RQ_DESCS 64 31 31 #define ENIC_MAX_RQ_DESCS 4096 32 32 33 - #define ENIC_MIN_MTU 68 33 + #define ENIC_MIN_MTU ETH_MIN_MTU 34 34 #define ENIC_MAX_MTU 9000 35 35 36 36 #define ENIC_MULTICAST_PERFECT_FILTERS 32
+3 -6
drivers/net/ethernet/freescale/gianfar.c
··· 1338 1338 1339 1339 /* Fill in the dev structure */ 1340 1340 dev->watchdog_timeo = TX_TIMEOUT; 1341 + /* MTU range: 50 - 9586 */ 1341 1342 dev->mtu = 1500; 1343 + dev->min_mtu = 50; 1344 + dev->max_mtu = GFAR_JUMBO_FRAME_SIZE - ETH_HLEN; 1342 1345 dev->netdev_ops = &gfar_netdev_ops; 1343 1346 dev->ethtool_ops = &gfar_ethtool_ops; 1344 1347 ··· 2595 2592 static int gfar_change_mtu(struct net_device *dev, int new_mtu) 2596 2593 { 2597 2594 struct gfar_private *priv = netdev_priv(dev); 2598 - int frame_size = new_mtu + ETH_HLEN; 2599 - 2600 - if ((frame_size < 64) || (frame_size > GFAR_JUMBO_FRAME_SIZE)) { 2601 - netif_err(priv, drv, dev, "Invalid MTU setting\n"); 2602 - return -EINVAL; 2603 - } 2604 2595 2605 2596 while (test_and_set_bit_lock(GFAR_RESETTING, &priv->state)) 2606 2597 cpu_relax();
+1 -2
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
··· 446 446 if (mac_cb->mac_type == HNAE_PORT_DEBUG) 447 447 max_frm = MAC_MAX_MTU_DBG; 448 448 449 - if ((new_mtu < MAC_MIN_MTU) || (new_frm > max_frm) || 450 - (new_frm > HNS_RCB_RING_MAX_BD_PER_PKT * buf_size)) 449 + if (new_frm > HNS_RCB_RING_MAX_BD_PER_PKT * buf_size) 451 450 return -EINVAL; 452 451 453 452 if (!drv->config_max_frame_length)
+7 -4
drivers/net/ethernet/hisilicon/hns/hns_enet.c
··· 22 22 23 23 #include "hnae.h" 24 24 #include "hns_enet.h" 25 + #include "hns_dsaf_mac.h" 25 26 26 27 #define NIC_MAX_Q_PER_VF 16 27 28 #define HNS_NIC_TX_TIMEOUT (5 * HZ) ··· 1406 1405 struct hnae_handle *h = priv->ae_handle; 1407 1406 int ret; 1408 1407 1409 - /* MTU < 68 is an error and causes problems on some kernels */ 1410 - if (new_mtu < 68) 1411 - return -EINVAL; 1412 - 1413 1408 if (!h->dev->ops->set_mtu) 1414 1409 return -ENOTSUPP; 1415 1410 ··· 1950 1953 NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM; 1951 1954 ndev->vlan_features |= NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO; 1952 1955 1956 + /* MTU range: 68 - 9578 (v1) or 9706 (v2) */ 1957 + ndev->min_mtu = MAC_MIN_MTU; 1953 1958 switch (priv->enet_ver) { 1954 1959 case AE_VERSION_2: 1955 1960 ndev->features |= NETIF_F_TSO | NETIF_F_TSO6; 1956 1961 ndev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1957 1962 NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO | 1958 1963 NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6; 1964 + ndev->max_mtu = MAC_MAX_MTU_V2 - 1965 + (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN); 1959 1966 break; 1960 1967 default: 1968 + ndev->max_mtu = MAC_MAX_MTU - 1969 + (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN); 1961 1970 break; 1962 1971 } 1963 1972
+17 -16
drivers/net/ethernet/micrel/ksz884x.c
··· 5807 5807 if (hw->dev_count > 1) 5808 5808 if (dev != hw_priv->dev) 5809 5809 return 0; 5810 - if (new_mtu < 60) 5811 - return -EINVAL; 5812 5810 5813 - if (dev->mtu != new_mtu) { 5814 - hw_mtu = new_mtu + ETHERNET_HEADER_SIZE + 4; 5815 - if (hw_mtu > MAX_RX_BUF_SIZE) 5816 - return -EINVAL; 5817 - if (hw_mtu > REGULAR_RX_BUF_SIZE) { 5818 - hw->features |= RX_HUGE_FRAME; 5819 - hw_mtu = MAX_RX_BUF_SIZE; 5820 - } else { 5821 - hw->features &= ~RX_HUGE_FRAME; 5822 - hw_mtu = REGULAR_RX_BUF_SIZE; 5823 - } 5824 - hw_mtu = (hw_mtu + 3) & ~3; 5825 - hw_priv->mtu = hw_mtu; 5826 - dev->mtu = new_mtu; 5811 + hw_mtu = new_mtu + ETHERNET_HEADER_SIZE + 4; 5812 + if (hw_mtu > REGULAR_RX_BUF_SIZE) { 5813 + hw->features |= RX_HUGE_FRAME; 5814 + hw_mtu = MAX_RX_BUF_SIZE; 5815 + } else { 5816 + hw->features &= ~RX_HUGE_FRAME; 5817 + hw_mtu = REGULAR_RX_BUF_SIZE; 5827 5818 } 5819 + hw_mtu = (hw_mtu + 3) & ~3; 5820 + hw_priv->mtu = hw_mtu; 5821 + dev->mtu = new_mtu; 5822 + 5828 5823 return 0; 5829 5824 } 5830 5825 ··· 7094 7099 7095 7100 dev->netdev_ops = &netdev_ops; 7096 7101 dev->ethtool_ops = &netdev_ethtool_ops; 7102 + 7103 + /* MTU range: 60 - 1894 */ 7104 + dev->min_mtu = ETH_ZLEN; 7105 + dev->max_mtu = MAX_RX_BUF_SIZE - 7106 + (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN); 7107 + 7097 7108 if (register_netdev(dev)) 7098 7109 goto pcidev_init_reg_err; 7099 7110 port_set_power_saving(port, true);
+11 -9
drivers/net/ethernet/myricom/myri10ge/myri10ge.c
··· 3232 3232 struct myri10ge_priv *mgp = netdev_priv(dev); 3233 3233 int error = 0; 3234 3234 3235 - if ((new_mtu < 68) || (ETH_HLEN + new_mtu > MYRI10GE_MAX_ETHER_MTU)) { 3236 - netdev_err(dev, "new mtu (%d) is not valid\n", new_mtu); 3237 - return -EINVAL; 3238 - } 3239 3235 netdev_info(dev, "changing mtu from %d to %d\n", dev->mtu, new_mtu); 3240 3236 if (mgp->running) { 3241 3237 /* if we change the mtu on an active device, we must ··· 4082 4086 myri10ge_setup_dca(mgp); 4083 4087 #endif 4084 4088 pci_set_drvdata(pdev, mgp); 4085 - if ((myri10ge_initial_mtu + ETH_HLEN) > MYRI10GE_MAX_ETHER_MTU) 4086 - myri10ge_initial_mtu = MYRI10GE_MAX_ETHER_MTU - ETH_HLEN; 4087 - if ((myri10ge_initial_mtu + ETH_HLEN) < 68) 4088 - myri10ge_initial_mtu = 68; 4089 + 4090 + /* MTU range: 68 - 9000 */ 4091 + netdev->min_mtu = ETH_MIN_MTU; 4092 + netdev->max_mtu = MYRI10GE_MAX_ETHER_MTU - ETH_HLEN; 4093 + 4094 + if (myri10ge_initial_mtu > netdev->max_mtu) 4095 + myri10ge_initial_mtu = netdev->max_mtu; 4096 + if (myri10ge_initial_mtu < netdev->min_mtu) 4097 + myri10ge_initial_mtu = netdev->min_mtu; 4098 + 4099 + netdev->mtu = myri10ge_initial_mtu; 4089 4100 4090 4101 netdev->netdev_ops = &myri10ge_netdev_ops; 4091 - netdev->mtu = myri10ge_initial_mtu; 4092 4102 netdev->hw_features = mgp->features | NETIF_F_RXCSUM; 4093 4103 4094 4104 /* fake NETIF_F_HW_VLAN_CTAG_RX for good GRO performance */
+4 -3
drivers/net/ethernet/natsemi/natsemi.c
··· 929 929 930 930 dev->ethtool_ops = &ethtool_ops; 931 931 932 + /* MTU range: 64 - 2024 */ 933 + dev->min_mtu = ETH_ZLEN + ETH_FCS_LEN; 934 + dev->max_mtu = NATSEMI_RX_LIMIT - NATSEMI_HEADERS; 935 + 932 936 if (mtu) 933 937 dev->mtu = mtu; 934 938 ··· 2530 2526 2531 2527 static int natsemi_change_mtu(struct net_device *dev, int new_mtu) 2532 2528 { 2533 - if (new_mtu < 64 || new_mtu > NATSEMI_RX_LIMIT-NATSEMI_HEADERS) 2534 - return -EINVAL; 2535 - 2536 2529 dev->mtu = new_mtu; 2537 2530 2538 2531 /* synchronized against open : rtnl_lock() held by caller */
+5 -5
drivers/net/ethernet/netronome/nfp/nfp_net_common.c
··· 2278 2278 struct nfp_net_rx_ring *tmp_rings; 2279 2279 int err; 2280 2280 2281 - if (new_mtu < 68 || new_mtu > nn->max_mtu) { 2282 - nn_err(nn, "New MTU (%d) is not valid\n", new_mtu); 2283 - return -EINVAL; 2284 - } 2285 - 2286 2281 old_mtu = netdev->mtu; 2287 2282 old_fl_bufsz = nn->fl_bufsz; 2288 2283 new_fl_bufsz = NFP_NET_MAX_PREPEND + ETH_HLEN + VLAN_HLEN * 2 + new_mtu; ··· 2925 2930 ether_setup(netdev); 2926 2931 netdev->netdev_ops = &nfp_net_netdev_ops; 2927 2932 netdev->watchdog_timeo = msecs_to_jiffies(5 * 1000); 2933 + 2934 + /* MTU range: 68 - hw-specific max */ 2935 + netdev->min_mtu = ETH_MIN_MTU; 2936 + netdev->max_mtu = nn->max_mtu; 2937 + 2928 2938 netif_carrier_off(netdev); 2929 2939 2930 2940 nfp_net_set_ethtool_ops(netdev);
+4 -5
drivers/net/ethernet/nvidia/forcedeth.c
··· 3008 3008 struct fe_priv *np = netdev_priv(dev); 3009 3009 int old_mtu; 3010 3010 3011 - if (new_mtu < 64 || new_mtu > np->pkt_limit) 3012 - return -EINVAL; 3013 - 3014 3011 old_mtu = dev->mtu; 3015 3012 dev->mtu = new_mtu; 3016 3013 3017 3014 /* return early if the buffer sizes will not change */ 3018 3015 if (old_mtu <= ETH_DATA_LEN && new_mtu <= ETH_DATA_LEN) 3019 - return 0; 3020 - if (old_mtu == new_mtu) 3021 3016 return 0; 3022 3017 3023 3018 /* synchronized against open : rtnl_lock() held by caller */ ··· 5713 5718 5714 5719 /* Add loopback capability to the device. */ 5715 5720 dev->hw_features |= NETIF_F_LOOPBACK; 5721 + 5722 + /* MTU range: 64 - 1500 or 9100 */ 5723 + dev->min_mtu = ETH_ZLEN + ETH_FCS_LEN; 5724 + dev->max_mtu = np->pkt_limit; 5716 5725 5717 5726 np->pause_flags = NV_PAUSEFRAME_RX_CAPABLE | NV_PAUSEFRAME_RX_REQ | NV_PAUSEFRAME_AUTONEG; 5718 5727 if ((id->driver_data & DEV_HAS_PAUSEFRAME_TX_V1) ||
+6 -7
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
··· 2260 2260 static int pch_gbe_change_mtu(struct net_device *netdev, int new_mtu) 2261 2261 { 2262 2262 struct pch_gbe_adapter *adapter = netdev_priv(netdev); 2263 - int max_frame; 2263 + int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; 2264 2264 unsigned long old_rx_buffer_len = adapter->rx_buffer_len; 2265 2265 int err; 2266 2266 2267 - max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; 2268 - if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) || 2269 - (max_frame > PCH_GBE_MAX_JUMBO_FRAME_SIZE)) { 2270 - netdev_err(netdev, "Invalid MTU setting\n"); 2271 - return -EINVAL; 2272 - } 2273 2267 if (max_frame <= PCH_GBE_FRAME_SIZE_2048) 2274 2268 adapter->rx_buffer_len = PCH_GBE_FRAME_SIZE_2048; 2275 2269 else if (max_frame <= PCH_GBE_FRAME_SIZE_4096) ··· 2626 2632 NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; 2627 2633 netdev->features = netdev->hw_features; 2628 2634 pch_gbe_set_ethtool_ops(netdev); 2635 + 2636 + /* MTU range: 46 - 10300 */ 2637 + netdev->min_mtu = ETH_ZLEN - ETH_HLEN; 2638 + netdev->max_mtu = PCH_GBE_MAX_JUMBO_FRAME_SIZE - 2639 + (ETH_HLEN + ETH_FCS_LEN); 2629 2640 2630 2641 pch_gbe_mac_load_mac_addr(&adapter->hw); 2631 2642 pch_gbe_mac_reset_hw(&adapter->hw);
+7 -5
drivers/net/ethernet/pasemi/pasemi_mac.c
··· 53 53 * - Multiqueue RX/TX 54 54 */ 55 55 56 - #define PE_MIN_MTU 64 56 + #define PE_MIN_MTU (ETH_ZLEN + ETH_HLEN) 57 57 #define PE_MAX_MTU 9000 58 58 #define PE_DEF_MTU ETH_DATA_LEN 59 59 ··· 1611 1611 int running; 1612 1612 int ret = 0; 1613 1613 1614 - if (new_mtu < PE_MIN_MTU || new_mtu > PE_MAX_MTU) 1615 - return -EINVAL; 1616 - 1617 1614 running = netif_running(dev); 1618 1615 1619 1616 if (running) { ··· 1632 1635 } 1633 1636 1634 1637 /* Setup checksum channels if large MTU and none already allocated */ 1635 - if (new_mtu > 1500 && !mac->num_cs) { 1638 + if (new_mtu > PE_DEF_MTU && !mac->num_cs) { 1636 1639 pasemi_mac_setup_csrings(mac); 1637 1640 if (!mac->num_cs) { 1638 1641 ret = -ENOMEM; ··· 1754 1757 1755 1758 dev->netdev_ops = &pasemi_netdev_ops; 1756 1759 dev->mtu = PE_DEF_MTU; 1760 + 1761 + /* MTU range: 64 - 9000 */ 1762 + dev->min_mtu = PE_MIN_MTU; 1763 + dev->max_mtu = PE_MAX_MTU; 1764 + 1757 1765 /* 1500 MTU + ETH_HLEN + VLAN_HLEN + 2 64B cachelines */ 1758 1766 mac->bufsz = dev->mtu + ETH_HLEN + ETH_FCS_LEN + LOCAL_SKB_ALIGN + 128; 1759 1767
+3 -3
drivers/net/ethernet/qualcomm/qca_framing.h
··· 43 43 /* Frame length is invalid */ 44 44 #define QCAFRM_INVFRAME (QCAFRM_ERR_BASE - 4) 45 45 46 - /* Min/Max Ethernet MTU */ 47 - #define QCAFRM_ETHMINMTU 46 48 - #define QCAFRM_ETHMAXMTU 1500 46 + /* Min/Max Ethernet MTU: 46/1500 */ 47 + #define QCAFRM_ETHMINMTU (ETH_ZLEN - ETH_HLEN) 48 + #define QCAFRM_ETHMAXMTU ETH_DATA_LEN 49 49 50 50 /* Min/Max frame lengths */ 51 51 #define QCAFRM_ETHMINLEN (QCAFRM_ETHMINMTU + ETH_HLEN)
+4 -12
drivers/net/ethernet/qualcomm/qca_spi.c
··· 780 780 dev_kfree_skb(qca->rx_skb); 781 781 } 782 782 783 - static int 784 - qcaspi_netdev_change_mtu(struct net_device *dev, int new_mtu) 785 - { 786 - if ((new_mtu < QCAFRM_ETHMINMTU) || (new_mtu > QCAFRM_ETHMAXMTU)) 787 - return -EINVAL; 788 - 789 - dev->mtu = new_mtu; 790 - 791 - return 0; 792 - } 793 - 794 783 static const struct net_device_ops qcaspi_netdev_ops = { 795 784 .ndo_init = qcaspi_netdev_init, 796 785 .ndo_uninit = qcaspi_netdev_uninit, 797 786 .ndo_open = qcaspi_netdev_open, 798 787 .ndo_stop = qcaspi_netdev_close, 799 788 .ndo_start_xmit = qcaspi_netdev_xmit, 800 - .ndo_change_mtu = qcaspi_netdev_change_mtu, 801 789 .ndo_set_mac_address = eth_mac_addr, 802 790 .ndo_tx_timeout = qcaspi_netdev_tx_timeout, 803 791 .ndo_validate_addr = eth_validate_addr, ··· 801 813 dev->watchdog_timeo = QCASPI_TX_TIMEOUT; 802 814 dev->priv_flags &= ~IFF_TX_SKB_SHARING; 803 815 dev->tx_queue_len = 100; 816 + 817 + /* MTU range: 46 - 1500 */ 818 + dev->min_mtu = QCAFRM_ETHMINMTU; 819 + dev->max_mtu = QCAFRM_ETHMAXMTU; 804 820 805 821 qca = netdev_priv(dev); 806 822 memset(qca, 0, sizeof(struct qcaspi));
+6 -6
drivers/net/ethernet/rocker/rocker_main.c
··· 1953 1953 int running = netif_running(dev); 1954 1954 int err; 1955 1955 1956 - #define ROCKER_PORT_MIN_MTU 68 1957 - #define ROCKER_PORT_MAX_MTU 9000 1958 - 1959 - if (new_mtu < ROCKER_PORT_MIN_MTU || new_mtu > ROCKER_PORT_MAX_MTU) 1960 - return -EINVAL; 1961 - 1962 1956 if (running) 1963 1957 rocker_port_stop(dev); 1964 1958 ··· 2530 2536 } 2531 2537 } 2532 2538 2539 + #define ROCKER_PORT_MIN_MTU ETH_MIN_MTU 2540 + #define ROCKER_PORT_MAX_MTU 9000 2533 2541 static int rocker_probe_port(struct rocker *rocker, unsigned int port_number) 2534 2542 { 2535 2543 const struct pci_dev *pdev = rocker->pdev; ··· 2565 2569 rocker_carrier_init(rocker_port); 2566 2570 2567 2571 dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_SG; 2572 + 2573 + /* MTU range: 68 - 9000 */ 2574 + dev->min_mtu = ROCKER_PORT_MIN_MTU; 2575 + dev->max_mtu = ROCKER_PORT_MAX_MTU; 2568 2576 2569 2577 err = rocker_world_port_pre_init(rocker_port); 2570 2578 if (err) {
+4 -13
drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
··· 1820 1820 */ 1821 1821 static int sxgbe_change_mtu(struct net_device *dev, int new_mtu) 1822 1822 { 1823 - /* RFC 791, page 25, "Every internet module must be able to forward 1824 - * a datagram of 68 octets without further fragmentation." 1825 - */ 1826 - if (new_mtu < MIN_MTU || (new_mtu > MAX_MTU)) { 1827 - netdev_err(dev, "invalid MTU, MTU should be in between %d and %d\n", 1828 - MIN_MTU, MAX_MTU); 1829 - return -EINVAL; 1830 - } 1831 - 1832 - /* Return if the buffer sizes will not change */ 1833 - if (dev->mtu == new_mtu) 1834 - return 0; 1835 - 1836 1823 dev->mtu = new_mtu; 1837 1824 1838 1825 if (!netif_running(dev)) ··· 2130 2143 2131 2144 /* assign filtering support */ 2132 2145 ndev->priv_flags |= IFF_UNICAST_FLT; 2146 + 2147 + /* MTU range: 68 - 9000 */ 2148 + ndev->min_mtu = MIN_MTU; 2149 + ndev->max_mtu = MAX_MTU; 2133 2150 2134 2151 priv->msg_enable = netif_msg_init(debug, default_msg_level); 2135 2152
+9 -16
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
··· 2715 2715 */ 2716 2716 static int stmmac_change_mtu(struct net_device *dev, int new_mtu) 2717 2717 { 2718 - struct stmmac_priv *priv = netdev_priv(dev); 2719 - int max_mtu; 2720 - 2721 2718 if (netif_running(dev)) { 2722 2719 pr_err("%s: must be stopped to change its MTU\n", dev->name); 2723 2720 return -EBUSY; 2724 - } 2725 - 2726 - if ((priv->plat->enh_desc) || (priv->synopsys_id >= DWMAC_CORE_4_00)) 2727 - max_mtu = JUMBO_LEN; 2728 - else 2729 - max_mtu = SKB_MAX_HEAD(NET_SKB_PAD + NET_IP_ALIGN); 2730 - 2731 - if (priv->plat->maxmtu < max_mtu) 2732 - max_mtu = priv->plat->maxmtu; 2733 - 2734 - if ((new_mtu < 46) || (new_mtu > max_mtu)) { 2735 - pr_err("%s: invalid MTU, max MTU is: %d\n", dev->name, max_mtu); 2736 - return -EINVAL; 2737 2721 } 2738 2722 2739 2723 dev->mtu = new_mtu; ··· 3300 3316 ndev->features |= NETIF_F_HW_VLAN_CTAG_RX; 3301 3317 #endif 3302 3318 priv->msg_enable = netif_msg_init(debug, default_msg_level); 3319 + 3320 + /* MTU range: 46 - hw-specific max */ 3321 + ndev->min_mtu = ETH_ZLEN - ETH_HLEN; 3322 + if ((priv->plat->enh_desc) || (priv->synopsys_id >= DWMAC_CORE_4_00)) 3323 + ndev->max_mtu = JUMBO_LEN; 3324 + else 3325 + ndev->max_mtu = SKB_MAX_HEAD(NET_SKB_PAD + NET_IP_ALIGN); 3326 + if (priv->plat->maxmtu < ndev->max_mtu) 3327 + ndev->max_mtu = priv->plat->maxmtu; 3303 3328 3304 3329 if (flow_ctrl) 3305 3330 priv->flow_ctrl = FLOW_AUTO; /* RX/TX pause on */
+4 -10
drivers/net/ethernet/tehuti/tehuti.c
··· 761 761 { 762 762 ENTER; 763 763 764 - if (new_mtu == ndev->mtu) 765 - RET(0); 766 - 767 - /* enforce minimum frame size */ 768 - if (new_mtu < ETH_ZLEN) { 769 - netdev_err(ndev, "mtu %d is less then minimal %d\n", 770 - new_mtu, ETH_ZLEN); 771 - RET(-EINVAL); 772 - } 773 - 774 764 ndev->mtu = new_mtu; 775 765 if (netif_running(ndev)) { 776 766 bdx_close(ndev); ··· 2047 2057 #ifdef BDX_LLTX 2048 2058 ndev->features |= NETIF_F_LLTX; 2049 2059 #endif 2060 + /* MTU range: 60 - 16384 */ 2061 + ndev->min_mtu = ETH_ZLEN; 2062 + ndev->max_mtu = BDX_MAX_MTU; 2063 + 2050 2064 spin_lock_init(&priv->tx_lock); 2051 2065 2052 2066 /*bdx_hw_reset(priv); */
+3
drivers/net/ethernet/tehuti/tehuti.h
··· 74 74 * ifcontig eth1 txqueuelen 3000 - to change it at runtime */ 75 75 #define BDX_NDEV_TXQ_LEN 3000 76 76 77 + /* Max MTU for Jumbo Frame mode, per tehutinetworks.net Features FAQ is 16k */ 78 + #define BDX_MAX_MTU (16 * 1024) 79 + 77 80 #define FIFO_SIZE 4096 78 81 #define FIFO_EXTRA_SPACE 1024 79 82
+4 -16
drivers/net/ethernet/ti/netcp_core.c
··· 1766 1766 return (ret == 0) ? 0 : err; 1767 1767 } 1768 1768 1769 - static int netcp_ndo_change_mtu(struct net_device *ndev, int new_mtu) 1770 - { 1771 - struct netcp_intf *netcp = netdev_priv(ndev); 1772 - 1773 - /* MTU < 68 is an error for IPv4 traffic */ 1774 - if ((new_mtu < 68) || 1775 - (new_mtu > (NETCP_MAX_FRAME_SIZE - ETH_HLEN - ETH_FCS_LEN))) { 1776 - dev_err(netcp->ndev_dev, "Invalid mtu size = %d\n", new_mtu); 1777 - return -EINVAL; 1778 - } 1779 - 1780 - ndev->mtu = new_mtu; 1781 - return 0; 1782 - } 1783 - 1784 1769 static void netcp_ndo_tx_timeout(struct net_device *ndev) 1785 1770 { 1786 1771 struct netcp_intf *netcp = netdev_priv(ndev); ··· 1871 1886 .ndo_start_xmit = netcp_ndo_start_xmit, 1872 1887 .ndo_set_rx_mode = netcp_set_rx_mode, 1873 1888 .ndo_do_ioctl = netcp_ndo_ioctl, 1874 - .ndo_change_mtu = netcp_ndo_change_mtu, 1875 1889 .ndo_set_mac_address = eth_mac_addr, 1876 1890 .ndo_validate_addr = eth_validate_addr, 1877 1891 .ndo_vlan_rx_add_vid = netcp_rx_add_vid, ··· 1906 1922 ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; 1907 1923 ndev->hw_features = ndev->features; 1908 1924 ndev->vlan_features |= NETIF_F_SG; 1925 + 1926 + /* MTU range: 68 - 9486 */ 1927 + ndev->min_mtu = ETH_MIN_MTU; 1928 + ndev->max_mtu = NETCP_MAX_FRAME_SIZE - (ETH_HLEN + ETH_FCS_LEN); 1909 1929 1910 1930 netcp = netdev_priv(ndev); 1911 1931 spin_lock_init(&netcp->lock);
+4 -7
drivers/net/ethernet/via/via-velocity.c
··· 2284 2284 struct velocity_info *vptr = netdev_priv(dev); 2285 2285 int ret = 0; 2286 2286 2287 - if ((new_mtu < VELOCITY_MIN_MTU) || new_mtu > (VELOCITY_MAX_MTU)) { 2288 - VELOCITY_PRT(MSG_LEVEL_ERR, KERN_NOTICE "%s: Invalid MTU.\n", 2289 - vptr->netdev->name); 2290 - ret = -EINVAL; 2291 - goto out_0; 2292 - } 2293 - 2294 2287 if (!netif_running(dev)) { 2295 2288 dev->mtu = new_mtu; 2296 2289 goto out_0; ··· 2856 2863 netdev->features |= NETIF_F_HW_VLAN_CTAG_TX | 2857 2864 NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_CTAG_RX | 2858 2865 NETIF_F_IP_CSUM; 2866 + 2867 + /* MTU range: 64 - 9000 */ 2868 + netdev->min_mtu = VELOCITY_MIN_MTU; 2869 + netdev->max_mtu = VELOCITY_MAX_MTU; 2859 2870 2860 2871 ret = register_netdev(netdev); 2861 2872 if (ret < 0)
+10 -12
drivers/staging/octeon/ethernet.c
··· 259 259 #endif 260 260 int mtu_overhead = ETH_HLEN + ETH_FCS_LEN + vlan_bytes; 261 261 262 - /* 263 - * Limit the MTU to make sure the ethernet packets are between 264 - * 64 bytes and 65535 bytes. 265 - */ 266 - if ((new_mtu + mtu_overhead < VLAN_ETH_ZLEN) || 267 - (new_mtu + mtu_overhead > OCTEON_MAX_MTU)) { 268 - pr_err("MTU must be between %d and %d.\n", 269 - VLAN_ETH_ZLEN - mtu_overhead, 270 - OCTEON_MAX_MTU - mtu_overhead); 271 - return -EINVAL; 272 - } 273 262 dev->mtu = new_mtu; 274 263 275 264 if ((interface < 2) && ··· 446 457 dev->ethtool_ops = &cvm_oct_ethtool_ops; 447 458 448 459 cvm_oct_set_mac_filter(dev); 449 - dev->netdev_ops->ndo_change_mtu(dev, dev->mtu); 460 + dev_set_mtu(dev, dev->mtu); 450 461 451 462 /* 452 463 * Zero out stats for port so we won't mistakenly show ··· 674 685 int fau = FAU_NUM_PACKET_BUFFERS_TO_FREE; 675 686 int qos; 676 687 struct device_node *pip; 688 + int mtu_overhead = ETH_HLEN + ETH_FCS_LEN; 689 + 690 + #if IS_ENABLED(CONFIG_VLAN_8021Q) 691 + mtu_overhead += VLAN_HLEN; 692 + #endif 677 693 678 694 octeon_mdiobus_force_mod_depencency(); 679 695 ··· 777 783 strcpy(dev->name, "pow%d"); 778 784 for (qos = 0; qos < 16; qos++) 779 785 skb_queue_head_init(&priv->tx_free_list[qos]); 786 + dev->min_mtu = VLAN_ETH_ZLEN - mtu_overhead; 787 + dev->max_mtu = OCTEON_MAX_MTU - mtu_overhead; 780 788 781 789 if (register_netdev(dev) < 0) { 782 790 pr_err("Failed to register ethernet device for POW\n"); ··· 832 836 for (qos = 0; qos < cvmx_pko_get_num_queues(port); 833 837 qos++) 834 838 cvmx_fau_atomic_write32(priv->fau + qos * 4, 0); 839 + dev->min_mtu = VLAN_ETH_ZLEN - mtu_overhead; 840 + dev->max_mtu = OCTEON_MAX_MTU - mtu_overhead; 835 841 836 842 switch (priv->imode) { 837 843 /* These types don't support ports to IPD/PKO */