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

Merge branch 'mlx4-misc-fixes'

Tariq Toukan says:

====================
mlx4 misc fixes

This patchset contains misc bug fixes from Eric Dumazet and our team
to the mlx4 Core and Eth drivers.

Series generated against net commit:
eee2faabc63d tcp: account for ts offset only if tsecr not zero

v3:
* Rebased, conflict solved.

v2:
* Added Eric's fix (patch 5/5).
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+49 -27
+20 -2
drivers/net/ethernet/mellanox/mlx4/cmd.c
··· 43 43 #include <linux/semaphore.h> 44 44 #include <rdma/ib_smi.h> 45 45 #include <linux/delay.h> 46 + #include <linux/etherdevice.h> 46 47 47 48 #include <asm/io.h> 48 49 ··· 2956 2955 return false; 2957 2956 } 2958 2957 2959 - int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac) 2958 + int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u8 *mac) 2960 2959 { 2961 2960 struct mlx4_priv *priv = mlx4_priv(dev); 2962 2961 struct mlx4_vport_state *s_info; ··· 2965 2964 if (!mlx4_is_master(dev)) 2966 2965 return -EPROTONOSUPPORT; 2967 2966 2967 + if (is_multicast_ether_addr(mac)) 2968 + return -EINVAL; 2969 + 2968 2970 slave = mlx4_get_slave_indx(dev, vf); 2969 2971 if (slave < 0) 2970 2972 return -EINVAL; 2971 2973 2972 2974 port = mlx4_slaves_closest_port(dev, slave, port); 2973 2975 s_info = &priv->mfunc.master.vf_admin[slave].vport[port]; 2974 - s_info->mac = mac; 2976 + 2977 + if (s_info->spoofchk && is_zero_ether_addr(mac)) { 2978 + mlx4_info(dev, "MAC invalidation is not allowed when spoofchk is on\n"); 2979 + return -EPERM; 2980 + } 2981 + 2982 + s_info->mac = mlx4_mac_to_u64(mac); 2975 2983 mlx4_info(dev, "default mac on vf %d port %d to %llX will take effect only after vf restart\n", 2976 2984 vf, port, s_info->mac); 2977 2985 return 0; ··· 3153 3143 struct mlx4_priv *priv = mlx4_priv(dev); 3154 3144 struct mlx4_vport_state *s_info; 3155 3145 int slave; 3146 + u8 mac[ETH_ALEN]; 3156 3147 3157 3148 if ((!mlx4_is_master(dev)) || 3158 3149 !(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_FSM)) ··· 3165 3154 3166 3155 port = mlx4_slaves_closest_port(dev, slave, port); 3167 3156 s_info = &priv->mfunc.master.vf_admin[slave].vport[port]; 3157 + 3158 + mlx4_u64_to_mac(mac, s_info->mac); 3159 + if (setting && !is_valid_ether_addr(mac)) { 3160 + mlx4_info(dev, "Illegal MAC with spoofchk\n"); 3161 + return -EPERM; 3162 + } 3163 + 3168 3164 s_info->spoofchk = setting; 3169 3165 3170 3166 return 0;
+1 -1
drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c
··· 319 319 default: 320 320 en_err(priv, "TC[%d]: Not supported TSA: %d\n", 321 321 i, ets->tc_tsa[i]); 322 - return -ENOTSUPP; 322 + return -EOPNOTSUPP; 323 323 } 324 324 } 325 325
+1 -5
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
··· 2485 2485 { 2486 2486 struct mlx4_en_priv *en_priv = netdev_priv(dev); 2487 2487 struct mlx4_en_dev *mdev = en_priv->mdev; 2488 - u64 mac_u64 = mlx4_mac_to_u64(mac); 2489 2488 2490 - if (is_multicast_ether_addr(mac)) 2491 - return -EINVAL; 2492 - 2493 - return mlx4_set_vf_mac(mdev->dev, en_priv->port, queue, mac_u64); 2489 + return mlx4_set_vf_mac(mdev->dev, en_priv->port, queue, mac); 2494 2490 } 2495 2491 2496 2492 static int mlx4_en_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos,
+4 -4
drivers/net/ethernet/mellanox/mlx4/en_rx.c
··· 604 604 dma_sync_single_for_cpu(priv->ddev, dma, frag_info->frag_size, 605 605 DMA_FROM_DEVICE); 606 606 607 - /* Save page reference in skb */ 608 - __skb_frag_set_page(&skb_frags_rx[nr], frags[nr].page); 609 - skb_frag_size_set(&skb_frags_rx[nr], frag_info->frag_size); 610 - skb_frags_rx[nr].page_offset = frags[nr].page_offset; 607 + __skb_fill_page_desc(skb, nr, frags[nr].page, 608 + frags[nr].page_offset, 609 + frag_info->frag_size); 610 + 611 611 skb->truesize += frag_info->frag_stride; 612 612 frags[nr].page = NULL; 613 613 }
+2 -3
drivers/net/ethernet/mellanox/mlx4/eq.c
··· 1249 1249 mlx4_warn(dev, "Failed adding irq rmap\n"); 1250 1250 } 1251 1251 #endif 1252 - err = mlx4_create_eq(dev, dev->caps.num_cqs - 1253 - dev->caps.reserved_cqs + 1254 - MLX4_NUM_SPARE_EQE, 1252 + err = mlx4_create_eq(dev, dev->quotas.cq + 1253 + MLX4_NUM_SPARE_EQE, 1255 1254 (dev->flags & MLX4_FLAG_MSI_X) ? 1256 1255 i + 1 - !!(i > MLX4_EQ_ASYNC) : 0, 1257 1256 eq);
+1 -1
drivers/net/ethernet/mellanox/mlx4/fw.c
··· 2436 2436 #define CONFIG_DEV_RX_CSUM_MODE_PORT2_BIT_OFFSET 4 2437 2437 2438 2438 if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_CONFIG_DEV)) 2439 - return -ENOTSUPP; 2439 + return -EOPNOTSUPP; 2440 2440 2441 2441 err = mlx4_CONFIG_DEV_get(dev, &config_dev); 2442 2442 if (err)
+1 -1
drivers/net/ethernet/mellanox/mlx4/intf.c
··· 136 136 LIST_HEAD(bond_list); 137 137 138 138 if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_PORT_REMAP)) 139 - return -ENOTSUPP; 139 + return -EOPNOTSUPP; 140 140 141 141 ret = mlx4_disable_rx_port_check(dev, enable); 142 142 if (ret) {
+5 -6
drivers/net/ethernet/mellanox/mlx4/main.c
··· 841 841 return -EINVAL; 842 842 } 843 843 844 - mlx4_log_num_mgm_entry_size = hca_param.log_mc_entry_sz; 845 - 846 844 dev->caps.hca_core_clock = hca_param.hca_core_clock; 847 845 848 846 memset(&dev_cap, 0, sizeof(dev_cap)); ··· 1445 1447 int err; 1446 1448 1447 1449 if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_PORT_REMAP)) 1448 - return -ENOTSUPP; 1450 + return -EOPNOTSUPP; 1449 1451 1450 1452 mutex_lock(&priv->bond_mutex); 1451 1453 ··· 1882 1884 struct mlx4_priv *priv = mlx4_priv(dev); 1883 1885 1884 1886 if (mlx4_is_slave(dev)) 1885 - return -ENOTSUPP; 1887 + return -EOPNOTSUPP; 1886 1888 1887 1889 if (!params) 1888 1890 return -EINVAL; ··· 2382 2384 2383 2385 /* Query CONFIG_DEV parameters */ 2384 2386 err = mlx4_config_dev_retrieval(dev, &params); 2385 - if (err && err != -ENOTSUPP) { 2387 + if (err && err != -EOPNOTSUPP) { 2386 2388 mlx4_err(dev, "Failed to query CONFIG_DEV parameters\n"); 2387 2389 } else if (!err) { 2388 2390 dev->caps.rx_checksum_flags_port[1] = params.rx_csum_flags_port_1; ··· 3501 3503 goto err_disable_msix; 3502 3504 } 3503 3505 3506 + mlx4_init_quotas(dev); 3507 + 3504 3508 err = mlx4_setup_hca(dev); 3505 3509 if (err == -EBUSY && (dev->flags & MLX4_FLAG_MSI_X) && 3506 3510 !mlx4_is_mfunc(dev)) { ··· 3515 3515 if (err) 3516 3516 goto err_steer; 3517 3517 3518 - mlx4_init_quotas(dev); 3519 3518 /* When PF resources are ready arm its comm channel to enable 3520 3519 * getting commands 3521 3520 */
+1 -1
drivers/net/ethernet/mellanox/mlx4/mr.c
··· 823 823 !(dev->caps.flags & MLX4_DEV_CAP_FLAG_MEM_WINDOW)) || 824 824 (type == MLX4_MW_TYPE_2 && 825 825 !(dev->caps.bmme_flags & MLX4_BMME_FLAG_TYPE_2_WIN))) 826 - return -ENOTSUPP; 826 + return -EOPNOTSUPP; 827 827 828 828 index = mlx4_mpt_reserve(dev); 829 829 if (index == -1)
+1 -1
drivers/net/ethernet/mellanox/mlx4/qp.c
··· 447 447 & MLX4_DEV_CAP_FLAG2_UPDATE_QP_SRC_CHECK_LB)) { 448 448 mlx4_warn(dev, 449 449 "Trying to set src check LB, but it isn't supported\n"); 450 - err = -ENOTSUPP; 450 + err = -EOPNOTSUPP; 451 451 goto out; 452 452 } 453 453 pri_addr_path_mask |=
+1 -1
drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
··· 4297 4297 MLX4_DEV_CAP_FLAG2_UPDATE_QP_SRC_CHECK_LB)) { 4298 4298 mlx4_warn(dev, "Src check LB for slave %d isn't supported\n", 4299 4299 slave); 4300 - return -ENOTSUPP; 4300 + return -EOPNOTSUPP; 4301 4301 } 4302 4302 4303 4303 /* Just change the smac for the QP */
+1 -1
include/linux/mlx4/cmd.h
··· 308 308 int mlx4_get_vf_stats(struct mlx4_dev *dev, int port, int vf_idx, 309 309 struct ifla_vf_stats *vf_stats); 310 310 u32 mlx4_comm_get_version(void); 311 - int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac); 311 + int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u8 *mac); 312 312 int mlx4_set_vf_vlan(struct mlx4_dev *dev, int port, int vf, u16 vlan, 313 313 u8 qos, __be16 proto); 314 314 int mlx4_set_vf_rate(struct mlx4_dev *dev, int port, int vf, int min_tx_rate,
+10
include/linux/mlx4/driver.h
··· 104 104 return mac; 105 105 } 106 106 107 + static inline void mlx4_u64_to_mac(u8 *addr, u64 mac) 108 + { 109 + int i; 110 + 111 + for (i = ETH_ALEN; i > 0; i--) { 112 + addr[i - 1] = mac && 0xFF; 113 + mac >>= 8; 114 + } 115 + } 116 + 107 117 #endif /* MLX4_DRIVER_H */