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

ethernet/broadcom: use core min/max MTU checking

tg3: min_mtu 60, max_mtu 9000/1500

bnxt: min_mtu 60, max_mtu 9000

bnx2x: min_mtu 46, max_mtu 9600
- Fix up ETH_OVREHEAD -> ETH_OVERHEAD while we're in here, remove
duplicated defines from bnx2x_link.c.

bnx2: min_mtu 46, max_mtu 9000
- Use more standard ETH_* defines while we're at it.

bcm63xx_enet: min_mtu 46, max_mtu 2028
- compute_hw_mtu was made largely pointless, and thus merged back into
bcm_enet_change_mtu.

b44: min_mtu 60, max_mtu 1500

CC: netdev@vger.kernel.org
CC: Michael Chan <michael.chan@broadcom.com>
CC: Sony Chacko <sony.chacko@qlogic.com>
CC: Ariel Elior <ariel.elior@qlogic.com>
CC: Dept-HSGLinuxNICDev@qlogic.com
CC: Siva Reddy Kallam <siva.kallam@broadcom.com>
CC: Prashant Sreedharan <prashant@broadcom.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
e1c6dcca 67bef942

+51 -74
+4 -5
drivers/net/ethernet/broadcom/b44.c
··· 59 59 #define B44_TX_TIMEOUT (5 * HZ) 60 60 61 61 /* hardware minimum and maximum for a single frame's data payload */ 62 - #define B44_MIN_MTU 60 63 - #define B44_MAX_MTU 1500 62 + #define B44_MIN_MTU ETH_ZLEN 63 + #define B44_MAX_MTU ETH_DATA_LEN 64 64 65 65 #define B44_RX_RING_SIZE 512 66 66 #define B44_DEF_RX_RING_PENDING 200 ··· 1063 1063 static int b44_change_mtu(struct net_device *dev, int new_mtu) 1064 1064 { 1065 1065 struct b44 *bp = netdev_priv(dev); 1066 - 1067 - if (new_mtu < B44_MIN_MTU || new_mtu > B44_MAX_MTU) 1068 - return -EINVAL; 1069 1066 1070 1067 if (!netif_running(dev)) { 1071 1068 /* We'll just catch it later when the ··· 2374 2377 dev->netdev_ops = &b44_netdev_ops; 2375 2378 netif_napi_add(dev, &bp->napi, b44_poll, 64); 2376 2379 dev->watchdog_timeo = B44_TX_TIMEOUT; 2380 + dev->min_mtu = B44_MIN_MTU; 2381 + dev->max_mtu = B44_MAX_MTU; 2377 2382 dev->irq = sdev->irq; 2378 2383 dev->ethtool_ops = &b44_ethtool_ops; 2379 2384
+11 -24
drivers/net/ethernet/broadcom/bcm63xx_enet.c
··· 1622 1622 } 1623 1623 1624 1624 /* 1625 - * calculate actual hardware mtu 1625 + * adjust mtu, can't be called while device is running 1626 1626 */ 1627 - static int compute_hw_mtu(struct bcm_enet_priv *priv, int mtu) 1627 + static int bcm_enet_change_mtu(struct net_device *dev, int new_mtu) 1628 1628 { 1629 - int actual_mtu; 1629 + struct bcm_enet_priv *priv = netdev_priv(dev); 1630 + int actual_mtu = new_mtu; 1630 1631 1631 - actual_mtu = mtu; 1632 + if (netif_running(dev)) 1633 + return -EBUSY; 1632 1634 1633 1635 /* add ethernet header + vlan tag size */ 1634 1636 actual_mtu += VLAN_ETH_HLEN; 1635 - 1636 - if (actual_mtu < 64 || actual_mtu > BCMENET_MAX_MTU) 1637 - return -EINVAL; 1638 1637 1639 1638 /* 1640 1639 * setup maximum size before we get overflow mark in ··· 1649 1650 */ 1650 1651 priv->rx_skb_size = ALIGN(actual_mtu + ETH_FCS_LEN, 1651 1652 priv->dma_maxburst * 4); 1652 - return 0; 1653 - } 1654 1653 1655 - /* 1656 - * adjust mtu, can't be called while device is running 1657 - */ 1658 - static int bcm_enet_change_mtu(struct net_device *dev, int new_mtu) 1659 - { 1660 - int ret; 1661 - 1662 - if (netif_running(dev)) 1663 - return -EBUSY; 1664 - 1665 - ret = compute_hw_mtu(netdev_priv(dev), new_mtu); 1666 - if (ret) 1667 - return ret; 1668 1654 dev->mtu = new_mtu; 1669 1655 return 0; 1670 1656 } ··· 1739 1755 priv->enet_is_sw = false; 1740 1756 priv->dma_maxburst = BCMENET_DMA_MAXBURST; 1741 1757 1742 - ret = compute_hw_mtu(priv, dev->mtu); 1758 + ret = bcm_enet_change_mtu(dev, dev->mtu); 1743 1759 if (ret) 1744 1760 goto out; 1745 1761 ··· 1872 1888 netif_napi_add(dev, &priv->napi, bcm_enet_poll, 16); 1873 1889 1874 1890 dev->ethtool_ops = &bcm_enet_ethtool_ops; 1891 + /* MTU range: 46 - 2028 */ 1892 + dev->min_mtu = ETH_ZLEN - ETH_HLEN; 1893 + dev->max_mtu = BCMENET_MAX_MTU - VLAN_ETH_HLEN; 1875 1894 SET_NETDEV_DEV(dev, &pdev->dev); 1876 1895 1877 1896 ret = register_netdev(dev); ··· 2729 2742 priv->dma_chan_width = pd->dma_chan_width; 2730 2743 } 2731 2744 2732 - ret = compute_hw_mtu(priv, dev->mtu); 2745 + ret = bcm_enet_change_mtu(dev, dev->mtu); 2733 2746 if (ret) 2734 2747 goto out; 2735 2748
+7 -9
drivers/net/ethernet/broadcom/bnx2.c
··· 2298 2298 if (BNX2_CHIP(bp) == BNX2_CHIP_5706) 2299 2299 BNX2_WR(bp, BNX2_MISC_GP_HW_CTL0, 0x300); 2300 2300 2301 - if (bp->dev->mtu > 1500) { 2301 + if (bp->dev->mtu > ETH_DATA_LEN) { 2302 2302 u32 val; 2303 2303 2304 2304 /* Set extended packet length bit */ ··· 2352 2352 bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val); 2353 2353 } 2354 2354 2355 - if (bp->dev->mtu > 1500) { 2355 + if (bp->dev->mtu > ETH_DATA_LEN) { 2356 2356 /* Set extended packet length bit */ 2357 2357 bnx2_write_phy(bp, 0x18, 0x7); 2358 2358 bnx2_read_phy(bp, 0x18, &val); ··· 4985 4985 /* Program the MTU. Also include 4 bytes for CRC32. */ 4986 4986 mtu = bp->dev->mtu; 4987 4987 val = mtu + ETH_HLEN + ETH_FCS_LEN; 4988 - if (val > (MAX_ETHERNET_PACKET_SIZE + 4)) 4988 + if (val > (MAX_ETHERNET_PACKET_SIZE + ETH_HLEN + 4)) 4989 4989 val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA; 4990 4990 BNX2_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val); 4991 4991 4992 - if (mtu < 1500) 4993 - mtu = 1500; 4992 + if (mtu < ETH_DATA_LEN) 4993 + mtu = ETH_DATA_LEN; 4994 4994 4995 4995 bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG, BNX2_RBUF_CONFIG_VAL(mtu)); 4996 4996 bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG2, BNX2_RBUF_CONFIG2_VAL(mtu)); ··· 7896 7896 { 7897 7897 struct bnx2 *bp = netdev_priv(dev); 7898 7898 7899 - if (((new_mtu + ETH_HLEN) > MAX_ETHERNET_JUMBO_PACKET_SIZE) || 7900 - ((new_mtu + ETH_HLEN) < MIN_ETHERNET_PACKET_SIZE)) 7901 - return -EINVAL; 7902 - 7903 7899 dev->mtu = new_mtu; 7904 7900 return bnx2_change_ring_size(bp, bp->rx_ring_size, bp->tx_ring_size, 7905 7901 false); ··· 8585 8589 dev->hw_features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX; 8586 8590 dev->features |= dev->hw_features; 8587 8591 dev->priv_flags |= IFF_UNICAST_FLT; 8592 + dev->min_mtu = MIN_ETHERNET_PACKET_SIZE; 8593 + dev->max_mtu = MAX_ETHERNET_JUMBO_PACKET_SIZE; 8588 8594 8589 8595 if (!(bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)) 8590 8596 dev->hw_features &= ~NETIF_F_HW_VLAN_CTAG_RX;
+3 -3
drivers/net/ethernet/broadcom/bnx2.h
··· 6530 6530 #define MII_BNX2_AER_AER_AN_MMD 0x3800 6531 6531 #define MII_BNX2_BLK_ADDR_COMBO_IEEEB0 0xffe0 6532 6532 6533 - #define MIN_ETHERNET_PACKET_SIZE 60 6534 - #define MAX_ETHERNET_PACKET_SIZE 1514 6535 - #define MAX_ETHERNET_JUMBO_PACKET_SIZE 9014 6533 + #define MIN_ETHERNET_PACKET_SIZE (ETH_ZLEN - ETH_HLEN) 6534 + #define MAX_ETHERNET_PACKET_SIZE ETH_DATA_LEN 6535 + #define MAX_ETHERNET_JUMBO_PACKET_SIZE 9000 6536 6536 6537 6537 #define BNX2_RX_COPY_THRESH 128 6538 6538
+3 -3
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
··· 1396 1396 int tx_ring_size; 1397 1397 1398 1398 /* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */ 1399 - #define ETH_OVREHEAD (ETH_HLEN + 8 + 8) 1400 - #define ETH_MIN_PACKET_SIZE 60 1401 - #define ETH_MAX_PACKET_SIZE 1500 1399 + #define ETH_OVERHEAD (ETH_HLEN + 8 + 8) 1400 + #define ETH_MIN_PACKET_SIZE (ETH_ZLEN - ETH_HLEN) 1401 + #define ETH_MAX_PACKET_SIZE ETH_DATA_LEN 1402 1402 #define ETH_MAX_JUMBO_PACKET_SIZE 9600 1403 1403 /* TCP with Timestamp Option (32) + IPv6 (40) */ 1404 1404 #define ETH_MAX_TPA_HEADER_SIZE 72
+1 -7
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
··· 2023 2023 mtu = bp->dev->mtu; 2024 2024 fp->rx_buf_size = BNX2X_FW_RX_ALIGN_START + 2025 2025 IP_HEADER_ALIGNMENT_PADDING + 2026 - ETH_OVREHEAD + 2026 + ETH_OVERHEAD + 2027 2027 mtu + 2028 2028 BNX2X_FW_RX_ALIGN_END; 2029 2029 /* Note : rx_buf_size doesn't take into account NET_SKB_PAD */ ··· 4853 4853 if (bp->recovery_state != BNX2X_RECOVERY_DONE) { 4854 4854 BNX2X_ERR("Can't perform change MTU during parity recovery\n"); 4855 4855 return -EAGAIN; 4856 - } 4857 - 4858 - if ((new_mtu > ETH_MAX_JUMBO_PACKET_SIZE) || 4859 - ((new_mtu + ETH_HLEN) < ETH_MIN_PACKET_SIZE)) { 4860 - BNX2X_ERR("Can't support requested MTU size\n"); 4861 - return -EINVAL; 4862 4856 } 4863 4857 4864 4858 /* This does not race with packet allocation
+8 -14
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
··· 34 34 u8 dev_addr, u16 addr, u8 byte_cnt, 35 35 u8 *o_buf, u8); 36 36 /********************************************************/ 37 - #define ETH_HLEN 14 38 - /* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */ 39 - #define ETH_OVREHEAD (ETH_HLEN + 8 + 8) 40 - #define ETH_MIN_PACKET_SIZE 60 41 - #define ETH_MAX_PACKET_SIZE 1500 42 - #define ETH_MAX_JUMBO_PACKET_SIZE 9600 43 37 #define MDIO_ACCESS_TIMEOUT 1000 44 38 #define WC_LANE_MAX 4 45 39 #define I2C_SWITCH_WIDTH 2 ··· 1911 1917 /* Enable emac for jumbo packets */ 1912 1918 EMAC_WR(bp, EMAC_REG_EMAC_RX_MTU_SIZE, 1913 1919 (EMAC_RX_MTU_SIZE_JUMBO_ENA | 1914 - (ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD))); 1920 + (ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVERHEAD))); 1915 1921 1916 1922 /* Strip CRC */ 1917 1923 REG_WR(bp, NIG_REG_NIG_INGRESS_EMAC0_NO_CRC + port*4, 0x1); ··· 2308 2314 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_BMAC_CONTROL, wb_data, 2); 2309 2315 2310 2316 /* Set rx mtu */ 2311 - wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD; 2317 + wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVERHEAD; 2312 2318 wb_data[1] = 0; 2313 2319 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_RX_MAX_SIZE, wb_data, 2); 2314 2320 2315 2321 bnx2x_update_pfc_bmac1(params, vars); 2316 2322 2317 2323 /* Set tx mtu */ 2318 - wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD; 2324 + wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVERHEAD; 2319 2325 wb_data[1] = 0; 2320 2326 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_TX_MAX_SIZE, wb_data, 2); 2321 2327 2322 2328 /* Set cnt max size */ 2323 - wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD; 2329 + wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVERHEAD; 2324 2330 wb_data[1] = 0; 2325 2331 REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_CNT_MAX_SIZE, wb_data, 2); 2326 2332 ··· 2378 2384 udelay(30); 2379 2385 2380 2386 /* Set RX MTU */ 2381 - wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD; 2387 + wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVERHEAD; 2382 2388 wb_data[1] = 0; 2383 2389 REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_RX_MAX_SIZE, wb_data, 2); 2384 2390 udelay(30); 2385 2391 2386 2392 /* Set TX MTU */ 2387 - wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD; 2393 + wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVERHEAD; 2388 2394 wb_data[1] = 0; 2389 2395 REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_TX_MAX_SIZE, wb_data, 2); 2390 2396 udelay(30); 2391 2397 /* Set cnt max size */ 2392 - wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVREHEAD - 2; 2398 + wb_data[0] = ETH_MAX_JUMBO_PACKET_SIZE + ETH_OVERHEAD - 2; 2393 2399 wb_data[1] = 0; 2394 2400 REG_WR_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_CNT_MAX_SIZE, wb_data, 2); 2395 2401 udelay(30); ··· 2510 2516 2511 2517 } else { 2512 2518 u32 thresh = (ETH_MAX_JUMBO_PACKET_SIZE + 2513 - ETH_OVREHEAD)/16; 2519 + ETH_OVERHEAD)/16; 2514 2520 REG_WR(bp, PBF_REG_P0_PAUSE_ENABLE + port*4, 0); 2515 2521 /* Update threshold */ 2516 2522 REG_WR(bp, PBF_REG_P0_ARB_THRSH + port*4, thresh);
+5 -2
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
··· 12080 12080 mtu_size, mtu); 12081 12081 12082 12082 /* if valid: update device mtu */ 12083 - if (((mtu_size + ETH_HLEN) >= 12084 - ETH_MIN_PACKET_SIZE) && 12083 + if ((mtu_size >= ETH_MIN_PACKET_SIZE) && 12085 12084 (mtu_size <= 12086 12085 ETH_MAX_JUMBO_PACKET_SIZE)) 12087 12086 bp->dev->mtu = mtu_size; ··· 13313 13314 #ifdef BCM_DCBNL 13314 13315 dev->dcbnl_ops = &bnx2x_dcbnl_ops; 13315 13316 #endif 13317 + 13318 + /* MTU range, 46 - 9600 */ 13319 + dev->min_mtu = ETH_MIN_PACKET_SIZE; 13320 + dev->max_mtu = ETH_MAX_JUMBO_PACKET_SIZE; 13316 13321 13317 13322 /* get_port_hwinfo() will set prtad and mmds properly */ 13318 13323 bp->mdio.prtad = MDIO_PRTAD_NONE;
+4 -3
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 6290 6290 { 6291 6291 struct bnxt *bp = netdev_priv(dev); 6292 6292 6293 - if (new_mtu < 60 || new_mtu > 9500) 6294 - return -EINVAL; 6295 - 6296 6293 if (netif_running(dev)) 6297 6294 bnxt_close_nic(bp, false, false); 6298 6295 ··· 6866 6869 NETIF_F_HW_VLAN_STAG_RX | NETIF_F_HW_VLAN_STAG_TX; 6867 6870 dev->features |= dev->hw_features | NETIF_F_HIGHDMA; 6868 6871 dev->priv_flags |= IFF_UNICAST_FLT; 6872 + 6873 + /* MTU range: 60 - 9500 */ 6874 + dev->min_mtu = ETH_ZLEN; 6875 + dev->max_mtu = 9500; 6869 6876 6870 6877 #ifdef CONFIG_BNXT_SRIOV 6871 6878 init_waitqueue_head(&bp->sriov_cfg_wait);
+5 -4
drivers/net/ethernet/broadcom/tg3.c
··· 124 124 #define TG3_TX_TIMEOUT (5 * HZ) 125 125 126 126 /* hardware minimum and maximum for a single frame's data payload */ 127 - #define TG3_MIN_MTU 60 127 + #define TG3_MIN_MTU ETH_ZLEN 128 128 #define TG3_MAX_MTU(tp) \ 129 129 (tg3_flag(tp, JUMBO_CAPABLE) ? 9000 : 1500) 130 130 ··· 14199 14199 int err; 14200 14200 bool reset_phy = false; 14201 14201 14202 - if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp)) 14203 - return -EINVAL; 14204 - 14205 14202 if (!netif_running(dev)) { 14206 14203 /* We'll just catch it later when the 14207 14204 * device is up'd. ··· 17795 17798 17796 17799 dev->hw_features |= features; 17797 17800 dev->priv_flags |= IFF_UNICAST_FLT; 17801 + 17802 + /* MTU range: 60 - 9000 or 1500, depending on hardware */ 17803 + dev->min_mtu = TG3_MIN_MTU; 17804 + dev->max_mtu = TG3_MAX_MTU(tp); 17798 17805 17799 17806 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A1 && 17800 17807 !tg3_flag(tp, TSO_CAPABLE) &&