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). ====================
Unified · Split
| @@ -43,6 +43,7 @@ · 42 unmodified lines | ||
| 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 | |
| @@ -2955,7 +2956,7 @@ static bool mlx4_valid_vf_state_change(struct mlx4_dev *dev, int port, · 2906 unmodified lines | ||
| 2955 | 2956 | return false; |
| 2956 | 2957 | } |
| 2957 | 2958 | |
| 2958 | −int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac) | |
| 2959 | +int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u8 *mac) | |
| 2959 | 2960 | { |
| 2960 | 2961 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 2961 | 2962 | struct mlx4_vport_state *s_info; |
| @@ -2964,13 +2965,22 @@ int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac) · 2 unmodified lines | ||
| 2964 | 2965 | if (!mlx4_is_master(dev)) |
| 2965 | 2966 | return -EPROTONOSUPPORT; |
| 2966 | 2967 | |
| 2968 | + if (is_multicast_ether_addr(mac)) | |
| 2969 | + return -EINVAL; | |
| 2970 | + | |
| 2967 | 2971 | slave = mlx4_get_slave_indx(dev, vf); |
| 2968 | 2972 | if (slave < 0) |
| 2969 | 2973 | return -EINVAL; |
| 2970 | 2974 | |
| 2971 | 2975 | port = mlx4_slaves_closest_port(dev, slave, port); |
| 2972 | 2976 | s_info = &priv->mfunc.master.vf_admin[slave].vport[port]; |
| 2973 | − s_info->mac = mac; | |
| 2977 | + | |
| 2978 | + if (s_info->spoofchk && is_zero_ether_addr(mac)) { | |
| 2979 | + mlx4_info(dev, "MAC invalidation is not allowed when spoofchk is on\n"); | |
| 2980 | + return -EPERM; | |
| 2981 | + } | |
| 2982 | + | |
| 2983 | + s_info->mac = mlx4_mac_to_u64(mac); | |
| 2974 | 2984 | mlx4_info(dev, "default mac on vf %d port %d to %llX will take effect only after vf restart\n", |
| 2975 | 2985 | vf, port, s_info->mac); |
| 2976 | 2986 | return 0; |
| @@ -3143,6 +3153,7 @@ int mlx4_set_vf_spoofchk(struct mlx4_dev *dev, int port, int vf, bool setting) · 166 unmodified lines | ||
| 3143 | 3153 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 3144 | 3154 | struct mlx4_vport_state *s_info; |
| 3145 | 3155 | int slave; |
| 3156 | + u8 mac[ETH_ALEN]; | |
| 3146 | 3157 | |
| 3147 | 3158 | if ((!mlx4_is_master(dev)) || |
| 3148 | 3159 | !(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_FSM)) |
| @@ -3154,6 +3165,13 @@ int mlx4_set_vf_spoofchk(struct mlx4_dev *dev, int port, int vf, bool setting) · 5 unmodified lines | ||
| 3154 | 3165 | |
| 3155 | 3166 | port = mlx4_slaves_closest_port(dev, slave, port); |
| 3156 | 3167 | s_info = &priv->mfunc.master.vf_admin[slave].vport[port]; |
| 3168 | + | |
| 3169 | + mlx4_u64_to_mac(mac, s_info->mac); | |
| 3170 | + if (setting && !is_valid_ether_addr(mac)) { | |
| 3171 | + mlx4_info(dev, "Illegal MAC with spoofchk\n"); | |
| 3172 | + return -EPERM; | |
| 3173 | + } | |
| 3174 | + | |
| 3157 | 3175 | s_info->spoofchk = setting; |
| 3158 | 3176 | |
| 3159 | 3177 | return 0; |
| @@ -319,7 +319,7 @@ static int mlx4_en_ets_validate(struct mlx4_en_priv *priv, struct ieee_ets *ets) · 318 unmodified lines | ||
| 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 | |
| @@ -2485,12 +2485,8 @@ static int mlx4_en_set_vf_mac(struct net_device *dev, int queue, u8 *mac) · 2484 unmodified lines | ||
| 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, |
| @@ -604,10 +604,10 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv, · 603 unmodified lines | ||
| 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 | } |
| @@ -1249,9 +1249,8 @@ int mlx4_init_eq_table(struct mlx4_dev *dev) · 1248 unmodified lines | ||
| 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); |
| @@ -2436,7 +2436,7 @@ int mlx4_config_dev_retrieval(struct mlx4_dev *dev, · 2435 unmodified lines | ||
| 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) |
| @@ -136,7 +136,7 @@ int mlx4_do_bond(struct mlx4_dev *dev, bool enable) · 135 unmodified lines | ||
| 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) { |
| @@ -841,8 +841,6 @@ static int mlx4_slave_cap(struct mlx4_dev *dev) · 840 unmodified lines | ||
| 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)); |
| @@ -1447,7 +1445,7 @@ int mlx4_port_map_set(struct mlx4_dev *dev, struct mlx4_port_map *v2p) · 598 unmodified lines | ||
| 1447 | 1445 | int err; |
| 1448 | 1446 | |
| 1449 | 1447 | if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_PORT_REMAP)) |
| 1450 | − return -ENOTSUPP; | |
| 1448 | + return -EOPNOTSUPP; | |
| 1451 | 1449 | |
| 1452 | 1450 | mutex_lock(&priv->bond_mutex); |
| 1453 | 1451 | |
| @@ -1884,7 +1882,7 @@ int mlx4_get_internal_clock_params(struct mlx4_dev *dev, · 430 unmodified lines | ||
| 1884 | 1882 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 1885 | 1883 | |
| 1886 | 1884 | if (mlx4_is_slave(dev)) |
| 1887 | − return -ENOTSUPP; | |
| 1885 | + return -EOPNOTSUPP; | |
| 1888 | 1886 | |
| 1889 | 1887 | if (!params) |
| 1890 | 1888 | return -EINVAL; |
| @@ -2384,7 +2382,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) · 493 unmodified lines | ||
| 2384 | 2382 | |
| 2385 | 2383 | /* Query CONFIG_DEV parameters */ |
| 2386 | 2384 | err = mlx4_config_dev_retrieval(dev, ¶ms); |
| 2387 | − if (err && err != -ENOTSUPP) { | |
| 2385 | + if (err && err != -EOPNOTSUPP) { | |
| 2388 | 2386 | mlx4_err(dev, "Failed to query CONFIG_DEV parameters\n"); |
| 2389 | 2387 | } else if (!err) { |
| 2390 | 2388 | dev->caps.rx_checksum_flags_port[1] = params.rx_csum_flags_port_1; |
| @@ -3503,6 +3501,8 @@ slave_start: · 1112 unmodified lines | ||
| 3503 | 3501 | goto err_disable_msix; |
| 3504 | 3502 | } |
| 3505 | 3503 | |
| 3504 | + mlx4_init_quotas(dev); | |
| 3505 | + | |
| 3506 | 3506 | err = mlx4_setup_hca(dev); |
| 3507 | 3507 | if (err == -EBUSY && (dev->flags & MLX4_FLAG_MSI_X) && |
| 3508 | 3508 | !mlx4_is_mfunc(dev)) { |
| @@ -3515,7 +3515,6 @@ slave_start: · 6 unmodified lines | ||
| 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 | */ |
| @@ -823,7 +823,7 @@ int mlx4_mw_alloc(struct mlx4_dev *dev, u32 pd, enum mlx4_mw_type type, · 822 unmodified lines | ||
| 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) |
| @@ -447,7 +447,7 @@ int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn, · 446 unmodified lines | ||
| 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 |= |
| @@ -4297,7 +4297,7 @@ int mlx4_UPDATE_QP_wrapper(struct mlx4_dev *dev, int slave, · 4296 unmodified lines | ||
| 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 */ |
| @@ -308,7 +308,7 @@ int mlx4_get_counter_stats(struct mlx4_dev *dev, int counter_index, · 307 unmodified lines | ||
| 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, |
| @@ -104,4 +104,14 @@ static inline u64 mlx4_mac_to_u64(u8 *addr) · 103 unmodified lines | ||
| 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 */ |