diff options
| -rw-r--r-- | drivers/infiniband/hw/mlx5/main.c | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 16 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 48 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c | 27 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/main.c | 28 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/uar.c | 14 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/vport.c | 22 | ||||
| -rw-r--r-- | include/linux/mlx5/driver.h | 19 | ||||
| -rw-r--r-- | include/linux/mlx5/mlx5_ifc.h | 5 |
14 files changed, 135 insertions, 71 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 8ac50de2b242..262c1aa2e028 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
| @@ -1324,7 +1324,8 @@ static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn) | |||
| 1324 | return err; | 1324 | return err; |
| 1325 | 1325 | ||
| 1326 | if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || | 1326 | if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || |
| 1327 | !MLX5_CAP_GEN(dev->mdev, disable_local_lb)) | 1327 | (!MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) && |
| 1328 | !MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc))) | ||
| 1328 | return err; | 1329 | return err; |
| 1329 | 1330 | ||
| 1330 | mutex_lock(&dev->lb_mutex); | 1331 | mutex_lock(&dev->lb_mutex); |
| @@ -1342,7 +1343,8 @@ static void mlx5_ib_dealloc_transport_domain(struct mlx5_ib_dev *dev, u32 tdn) | |||
| 1342 | mlx5_core_dealloc_transport_domain(dev->mdev, tdn); | 1343 | mlx5_core_dealloc_transport_domain(dev->mdev, tdn); |
| 1343 | 1344 | ||
| 1344 | if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || | 1345 | if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || |
| 1345 | !MLX5_CAP_GEN(dev->mdev, disable_local_lb)) | 1346 | (!MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) && |
| 1347 | !MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc))) | ||
| 1346 | return; | 1348 | return; |
| 1347 | 1349 | ||
| 1348 | mutex_lock(&dev->lb_mutex); | 1350 | mutex_lock(&dev->lb_mutex); |
| @@ -4158,7 +4160,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) | |||
| 4158 | goto err_cnt; | 4160 | goto err_cnt; |
| 4159 | 4161 | ||
| 4160 | dev->mdev->priv.uar = mlx5_get_uars_page(dev->mdev); | 4162 | dev->mdev->priv.uar = mlx5_get_uars_page(dev->mdev); |
| 4161 | if (!dev->mdev->priv.uar) | 4163 | if (IS_ERR(dev->mdev->priv.uar)) |
| 4162 | goto err_cong; | 4164 | goto err_cong; |
| 4163 | 4165 | ||
| 4164 | err = mlx5_alloc_bfreg(dev->mdev, &dev->bfreg, false, false); | 4166 | err = mlx5_alloc_bfreg(dev->mdev, &dev->bfreg, false, false); |
| @@ -4187,7 +4189,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) | |||
| 4187 | } | 4189 | } |
| 4188 | 4190 | ||
| 4189 | if ((MLX5_CAP_GEN(mdev, port_type) == MLX5_CAP_PORT_TYPE_ETH) && | 4191 | if ((MLX5_CAP_GEN(mdev, port_type) == MLX5_CAP_PORT_TYPE_ETH) && |
| 4190 | MLX5_CAP_GEN(mdev, disable_local_lb)) | 4192 | (MLX5_CAP_GEN(mdev, disable_local_lb_uc) || |
| 4193 | MLX5_CAP_GEN(mdev, disable_local_lb_mc))) | ||
| 4191 | mutex_init(&dev->lb_mutex); | 4194 | mutex_init(&dev->lb_mutex); |
| 4192 | 4195 | ||
| 4193 | dev->ib_active = true; | 4196 | dev->ib_active = true; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index 543060c305a0..c2d89bfa1a70 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h | |||
| @@ -895,7 +895,7 @@ int mlx5e_vlan_rx_kill_vid(struct net_device *dev, __always_unused __be16 proto, | |||
| 895 | u16 vid); | 895 | u16 vid); |
| 896 | void mlx5e_enable_cvlan_filter(struct mlx5e_priv *priv); | 896 | void mlx5e_enable_cvlan_filter(struct mlx5e_priv *priv); |
| 897 | void mlx5e_disable_cvlan_filter(struct mlx5e_priv *priv); | 897 | void mlx5e_disable_cvlan_filter(struct mlx5e_priv *priv); |
| 898 | void mlx5e_timestamp_set(struct mlx5e_priv *priv); | 898 | void mlx5e_timestamp_init(struct mlx5e_priv *priv); |
| 899 | 899 | ||
| 900 | struct mlx5e_redirect_rqt_param { | 900 | struct mlx5e_redirect_rqt_param { |
| 901 | bool is_rss; | 901 | bool is_rss; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c index 9bcf38f4123b..3d46ef48d5b8 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | |||
| @@ -922,8 +922,9 @@ static void mlx5e_dcbnl_query_dcbx_mode(struct mlx5e_priv *priv, | |||
| 922 | 922 | ||
| 923 | static void mlx5e_ets_init(struct mlx5e_priv *priv) | 923 | static void mlx5e_ets_init(struct mlx5e_priv *priv) |
| 924 | { | 924 | { |
| 925 | int i; | ||
| 926 | struct ieee_ets ets; | 925 | struct ieee_ets ets; |
| 926 | int err; | ||
| 927 | int i; | ||
| 927 | 928 | ||
| 928 | if (!MLX5_CAP_GEN(priv->mdev, ets)) | 929 | if (!MLX5_CAP_GEN(priv->mdev, ets)) |
| 929 | return; | 930 | return; |
| @@ -936,11 +937,16 @@ static void mlx5e_ets_init(struct mlx5e_priv *priv) | |||
| 936 | ets.prio_tc[i] = i; | 937 | ets.prio_tc[i] = i; |
| 937 | } | 938 | } |
| 938 | 939 | ||
| 939 | /* tclass[prio=0]=1, tclass[prio=1]=0, tclass[prio=i]=i (for i>1) */ | 940 | if (ets.ets_cap > 1) { |
| 940 | ets.prio_tc[0] = 1; | 941 | /* tclass[prio=0]=1, tclass[prio=1]=0, tclass[prio=i]=i (for i>1) */ |
| 941 | ets.prio_tc[1] = 0; | 942 | ets.prio_tc[0] = 1; |
| 943 | ets.prio_tc[1] = 0; | ||
| 944 | } | ||
| 942 | 945 | ||
| 943 | mlx5e_dcbnl_ieee_setets_core(priv, &ets); | 946 | err = mlx5e_dcbnl_ieee_setets_core(priv, &ets); |
| 947 | if (err) | ||
| 948 | netdev_err(priv->netdev, | ||
| 949 | "%s, Failed to init ETS: %d\n", __func__, err); | ||
| 944 | } | 950 | } |
| 945 | 951 | ||
| 946 | enum { | 952 | enum { |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c index 8f05efa5c829..ea5fff2c3143 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | |||
| @@ -207,8 +207,7 @@ void mlx5e_ethtool_get_ethtool_stats(struct mlx5e_priv *priv, | |||
| 207 | return; | 207 | return; |
| 208 | 208 | ||
| 209 | mutex_lock(&priv->state_lock); | 209 | mutex_lock(&priv->state_lock); |
| 210 | if (test_bit(MLX5E_STATE_OPENED, &priv->state)) | 210 | mlx5e_update_stats(priv, true); |
| 211 | mlx5e_update_stats(priv, true); | ||
| 212 | mutex_unlock(&priv->state_lock); | 211 | mutex_unlock(&priv->state_lock); |
| 213 | 212 | ||
| 214 | for (i = 0; i < mlx5e_num_stats_grps; i++) | 213 | for (i = 0; i < mlx5e_num_stats_grps; i++) |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index d9d8227f195f..d8aefeed124d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | |||
| @@ -2669,7 +2669,7 @@ void mlx5e_switch_priv_channels(struct mlx5e_priv *priv, | |||
| 2669 | netif_carrier_on(netdev); | 2669 | netif_carrier_on(netdev); |
| 2670 | } | 2670 | } |
| 2671 | 2671 | ||
| 2672 | void mlx5e_timestamp_set(struct mlx5e_priv *priv) | 2672 | void mlx5e_timestamp_init(struct mlx5e_priv *priv) |
| 2673 | { | 2673 | { |
| 2674 | priv->tstamp.tx_type = HWTSTAMP_TX_OFF; | 2674 | priv->tstamp.tx_type = HWTSTAMP_TX_OFF; |
| 2675 | priv->tstamp.rx_filter = HWTSTAMP_FILTER_NONE; | 2675 | priv->tstamp.rx_filter = HWTSTAMP_FILTER_NONE; |
| @@ -2690,7 +2690,6 @@ int mlx5e_open_locked(struct net_device *netdev) | |||
| 2690 | mlx5e_activate_priv_channels(priv); | 2690 | mlx5e_activate_priv_channels(priv); |
| 2691 | if (priv->profile->update_carrier) | 2691 | if (priv->profile->update_carrier) |
| 2692 | priv->profile->update_carrier(priv); | 2692 | priv->profile->update_carrier(priv); |
| 2693 | mlx5e_timestamp_set(priv); | ||
| 2694 | 2693 | ||
| 2695 | if (priv->profile->update_stats) | 2694 | if (priv->profile->update_stats) |
| 2696 | queue_delayed_work(priv->wq, &priv->update_stats_work, 0); | 2695 | queue_delayed_work(priv->wq, &priv->update_stats_work, 0); |
| @@ -3219,12 +3218,12 @@ static int mlx5e_set_mac(struct net_device *netdev, void *addr) | |||
| 3219 | return 0; | 3218 | return 0; |
| 3220 | } | 3219 | } |
| 3221 | 3220 | ||
| 3222 | #define MLX5E_SET_FEATURE(netdev, feature, enable) \ | 3221 | #define MLX5E_SET_FEATURE(features, feature, enable) \ |
| 3223 | do { \ | 3222 | do { \ |
| 3224 | if (enable) \ | 3223 | if (enable) \ |
| 3225 | netdev->features |= feature; \ | 3224 | *features |= feature; \ |
| 3226 | else \ | 3225 | else \ |
| 3227 | netdev->features &= ~feature; \ | 3226 | *features &= ~feature; \ |
| 3228 | } while (0) | 3227 | } while (0) |
| 3229 | 3228 | ||
| 3230 | typedef int (*mlx5e_feature_handler)(struct net_device *netdev, bool enable); | 3229 | typedef int (*mlx5e_feature_handler)(struct net_device *netdev, bool enable); |
| @@ -3347,6 +3346,7 @@ static int set_feature_arfs(struct net_device *netdev, bool enable) | |||
| 3347 | #endif | 3346 | #endif |
| 3348 | 3347 | ||
| 3349 | static int mlx5e_handle_feature(struct net_device *netdev, | 3348 | static int mlx5e_handle_feature(struct net_device *netdev, |
| 3349 | netdev_features_t *features, | ||
| 3350 | netdev_features_t wanted_features, | 3350 | netdev_features_t wanted_features, |
| 3351 | netdev_features_t feature, | 3351 | netdev_features_t feature, |
| 3352 | mlx5e_feature_handler feature_handler) | 3352 | mlx5e_feature_handler feature_handler) |
| @@ -3365,34 +3365,40 @@ static int mlx5e_handle_feature(struct net_device *netdev, | |||
| 3365 | return err; | 3365 | return err; |
| 3366 | } | 3366 | } |
| 3367 | 3367 | ||
| 3368 | MLX5E_SET_FEATURE(netdev, feature, enable); | 3368 | MLX5E_SET_FEATURE(features, feature, enable); |
| 3369 | return 0; | 3369 | return 0; |
| 3370 | } | 3370 | } |
| 3371 | 3371 | ||
| 3372 | static int mlx5e_set_features(struct net_device *netdev, | 3372 | static int mlx5e_set_features(struct net_device *netdev, |
| 3373 | netdev_features_t features) | 3373 | netdev_features_t features) |
| 3374 | { | 3374 | { |
| 3375 | netdev_features_t oper_features = netdev->features; | ||
| 3375 | int err; | 3376 | int err; |
| 3376 | 3377 | ||
| 3377 | err = mlx5e_handle_feature(netdev, features, NETIF_F_LRO, | 3378 | err = mlx5e_handle_feature(netdev, &oper_features, features, |
| 3378 | set_feature_lro); | 3379 | NETIF_F_LRO, set_feature_lro); |
| 3379 | err |= mlx5e_handle_feature(netdev, features, | 3380 | err |= mlx5e_handle_feature(netdev, &oper_features, features, |
| 3380 | NETIF_F_HW_VLAN_CTAG_FILTER, | 3381 | NETIF_F_HW_VLAN_CTAG_FILTER, |
| 3381 | set_feature_cvlan_filter); | 3382 | set_feature_cvlan_filter); |
| 3382 | err |= mlx5e_handle_feature(netdev, features, NETIF_F_HW_TC, | 3383 | err |= mlx5e_handle_feature(netdev, &oper_features, features, |
| 3383 | set_feature_tc_num_filters); | 3384 | NETIF_F_HW_TC, set_feature_tc_num_filters); |
| 3384 | err |= mlx5e_handle_feature(netdev, features, NETIF_F_RXALL, | 3385 | err |= mlx5e_handle_feature(netdev, &oper_features, features, |
| 3385 | set_feature_rx_all); | 3386 | NETIF_F_RXALL, set_feature_rx_all); |
| 3386 | err |= mlx5e_handle_feature(netdev, features, NETIF_F_RXFCS, | 3387 | err |= mlx5e_handle_feature(netdev, &oper_features, features, |
| 3387 | set_feature_rx_fcs); | 3388 | NETIF_F_RXFCS, set_feature_rx_fcs); |
| 3388 | err |= mlx5e_handle_feature(netdev, features, NETIF_F_HW_VLAN_CTAG_RX, | 3389 | err |= mlx5e_handle_feature(netdev, &oper_features, features, |
| 3389 | set_feature_rx_vlan); | 3390 | NETIF_F_HW_VLAN_CTAG_RX, set_feature_rx_vlan); |
| 3390 | #ifdef CONFIG_RFS_ACCEL | 3391 | #ifdef CONFIG_RFS_ACCEL |
| 3391 | err |= mlx5e_handle_feature(netdev, features, NETIF_F_NTUPLE, | 3392 | err |= mlx5e_handle_feature(netdev, &oper_features, features, |
| 3392 | set_feature_arfs); | 3393 | NETIF_F_NTUPLE, set_feature_arfs); |
| 3393 | #endif | 3394 | #endif |
| 3394 | 3395 | ||
| 3395 | return err ? -EINVAL : 0; | 3396 | if (err) { |
| 3397 | netdev->features = oper_features; | ||
| 3398 | return -EINVAL; | ||
| 3399 | } | ||
| 3400 | |||
| 3401 | return 0; | ||
| 3396 | } | 3402 | } |
| 3397 | 3403 | ||
| 3398 | static netdev_features_t mlx5e_fix_features(struct net_device *netdev, | 3404 | static netdev_features_t mlx5e_fix_features(struct net_device *netdev, |
| @@ -4139,6 +4145,8 @@ static void mlx5e_build_nic_netdev_priv(struct mlx5_core_dev *mdev, | |||
| 4139 | INIT_WORK(&priv->set_rx_mode_work, mlx5e_set_rx_mode_work); | 4145 | INIT_WORK(&priv->set_rx_mode_work, mlx5e_set_rx_mode_work); |
| 4140 | INIT_WORK(&priv->tx_timeout_work, mlx5e_tx_timeout_work); | 4146 | INIT_WORK(&priv->tx_timeout_work, mlx5e_tx_timeout_work); |
| 4141 | INIT_DELAYED_WORK(&priv->update_stats_work, mlx5e_update_stats_work); | 4147 | INIT_DELAYED_WORK(&priv->update_stats_work, mlx5e_update_stats_work); |
| 4148 | |||
| 4149 | mlx5e_timestamp_init(priv); | ||
| 4142 | } | 4150 | } |
| 4143 | 4151 | ||
| 4144 | static void mlx5e_set_netdev_dev_addr(struct net_device *netdev) | 4152 | static void mlx5e_set_netdev_dev_addr(struct net_device *netdev) |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 2c43606c26b5..3409d86eb06b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | |||
| @@ -877,6 +877,8 @@ static void mlx5e_init_rep(struct mlx5_core_dev *mdev, | |||
| 877 | 877 | ||
| 878 | mlx5e_build_rep_params(mdev, &priv->channels.params); | 878 | mlx5e_build_rep_params(mdev, &priv->channels.params); |
| 879 | mlx5e_build_rep_netdev(netdev); | 879 | mlx5e_build_rep_netdev(netdev); |
| 880 | |||
| 881 | mlx5e_timestamp_init(priv); | ||
| 880 | } | 882 | } |
| 881 | 883 | ||
| 882 | static int mlx5e_init_rep_rx(struct mlx5e_priv *priv) | 884 | static int mlx5e_init_rep_rx(struct mlx5e_priv *priv) |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c b/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c index 1f1f8af87d4d..5a4608281f38 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c | |||
| @@ -238,15 +238,19 @@ static int mlx5e_test_loopback_setup(struct mlx5e_priv *priv, | |||
| 238 | int err = 0; | 238 | int err = 0; |
| 239 | 239 | ||
| 240 | /* Temporarily enable local_lb */ | 240 | /* Temporarily enable local_lb */ |
| 241 | if (MLX5_CAP_GEN(priv->mdev, disable_local_lb)) { | 241 | err = mlx5_nic_vport_query_local_lb(priv->mdev, &lbtp->local_lb); |
| 242 | mlx5_nic_vport_query_local_lb(priv->mdev, &lbtp->local_lb); | 242 | if (err) |
| 243 | if (!lbtp->local_lb) | 243 | return err; |
| 244 | mlx5_nic_vport_update_local_lb(priv->mdev, true); | 244 | |
| 245 | if (!lbtp->local_lb) { | ||
| 246 | err = mlx5_nic_vport_update_local_lb(priv->mdev, true); | ||
| 247 | if (err) | ||
| 248 | return err; | ||
| 245 | } | 249 | } |
| 246 | 250 | ||
| 247 | err = mlx5e_refresh_tirs(priv, true); | 251 | err = mlx5e_refresh_tirs(priv, true); |
| 248 | if (err) | 252 | if (err) |
| 249 | return err; | 253 | goto out; |
| 250 | 254 | ||
| 251 | lbtp->loopback_ok = false; | 255 | lbtp->loopback_ok = false; |
| 252 | init_completion(&lbtp->comp); | 256 | init_completion(&lbtp->comp); |
| @@ -256,16 +260,21 @@ static int mlx5e_test_loopback_setup(struct mlx5e_priv *priv, | |||
| 256 | lbtp->pt.dev = priv->netdev; | 260 | lbtp->pt.dev = priv->netdev; |
| 257 | lbtp->pt.af_packet_priv = lbtp; | 261 | lbtp->pt.af_packet_priv = lbtp; |
| 258 | dev_add_pack(&lbtp->pt); | 262 | dev_add_pack(&lbtp->pt); |
| 263 | |||
| 264 | return 0; | ||
| 265 | |||
| 266 | out: | ||
| 267 | if (!lbtp->local_lb) | ||
| 268 | mlx5_nic_vport_update_local_lb(priv->mdev, false); | ||
| 269 | |||
| 259 | return err; | 270 | return err; |
| 260 | } | 271 | } |
| 261 | 272 | ||
| 262 | static void mlx5e_test_loopback_cleanup(struct mlx5e_priv *priv, | 273 | static void mlx5e_test_loopback_cleanup(struct mlx5e_priv *priv, |
| 263 | struct mlx5e_lbt_priv *lbtp) | 274 | struct mlx5e_lbt_priv *lbtp) |
| 264 | { | 275 | { |
| 265 | if (MLX5_CAP_GEN(priv->mdev, disable_local_lb)) { | 276 | if (!lbtp->local_lb) |
| 266 | if (!lbtp->local_lb) | 277 | mlx5_nic_vport_update_local_lb(priv->mdev, false); |
| 267 | mlx5_nic_vport_update_local_lb(priv->mdev, false); | ||
| 268 | } | ||
| 269 | 278 | ||
| 270 | dev_remove_pack(&lbtp->pt); | 279 | dev_remove_pack(&lbtp->pt); |
| 271 | mlx5e_refresh_tirs(priv, false); | 280 | mlx5e_refresh_tirs(priv, false); |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c index 8812d7208e8f..ee2f378c5030 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c | |||
| @@ -86,6 +86,8 @@ void mlx5i_init(struct mlx5_core_dev *mdev, | |||
| 86 | mlx5e_build_nic_params(mdev, &priv->channels.params, profile->max_nch(mdev)); | 86 | mlx5e_build_nic_params(mdev, &priv->channels.params, profile->max_nch(mdev)); |
| 87 | mlx5i_build_nic_params(mdev, &priv->channels.params); | 87 | mlx5i_build_nic_params(mdev, &priv->channels.params); |
| 88 | 88 | ||
| 89 | mlx5e_timestamp_init(priv); | ||
| 90 | |||
| 89 | /* netdev init */ | 91 | /* netdev init */ |
| 90 | netdev->hw_features |= NETIF_F_SG; | 92 | netdev->hw_features |= NETIF_F_SG; |
| 91 | netdev->hw_features |= NETIF_F_IP_CSUM; | 93 | netdev->hw_features |= NETIF_F_IP_CSUM; |
| @@ -450,7 +452,6 @@ static int mlx5i_open(struct net_device *netdev) | |||
| 450 | 452 | ||
| 451 | mlx5e_refresh_tirs(epriv, false); | 453 | mlx5e_refresh_tirs(epriv, false); |
| 452 | mlx5e_activate_priv_channels(epriv); | 454 | mlx5e_activate_priv_channels(epriv); |
| 453 | mlx5e_timestamp_set(epriv); | ||
| 454 | 455 | ||
| 455 | mutex_unlock(&epriv->state_lock); | 456 | mutex_unlock(&epriv->state_lock); |
| 456 | return 0; | 457 | return 0; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c index fa8aed62b231..5701f125e99c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c | |||
| @@ -423,9 +423,13 @@ void mlx5_pps_event(struct mlx5_core_dev *mdev, | |||
| 423 | 423 | ||
| 424 | switch (clock->ptp_info.pin_config[pin].func) { | 424 | switch (clock->ptp_info.pin_config[pin].func) { |
| 425 | case PTP_PF_EXTTS: | 425 | case PTP_PF_EXTTS: |
| 426 | ptp_event.index = pin; | ||
| 427 | ptp_event.timestamp = timecounter_cyc2time(&clock->tc, | ||
| 428 | be64_to_cpu(eqe->data.pps.time_stamp)); | ||
| 426 | if (clock->pps_info.enabled) { | 429 | if (clock->pps_info.enabled) { |
| 427 | ptp_event.type = PTP_CLOCK_PPSUSR; | 430 | ptp_event.type = PTP_CLOCK_PPSUSR; |
| 428 | ptp_event.pps_times.ts_real = ns_to_timespec64(eqe->data.pps.time_stamp); | 431 | ptp_event.pps_times.ts_real = |
| 432 | ns_to_timespec64(ptp_event.timestamp); | ||
| 429 | } else { | 433 | } else { |
| 430 | ptp_event.type = PTP_CLOCK_EXTTS; | 434 | ptp_event.type = PTP_CLOCK_EXTTS; |
| 431 | } | 435 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index 8a89c7e8cd63..0f88fd30a09a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
| @@ -319,6 +319,7 @@ static int mlx5_alloc_irq_vectors(struct mlx5_core_dev *dev) | |||
| 319 | struct mlx5_eq_table *table = &priv->eq_table; | 319 | struct mlx5_eq_table *table = &priv->eq_table; |
| 320 | int num_eqs = 1 << MLX5_CAP_GEN(dev, log_max_eq); | 320 | int num_eqs = 1 << MLX5_CAP_GEN(dev, log_max_eq); |
| 321 | int nvec; | 321 | int nvec; |
| 322 | int err; | ||
| 322 | 323 | ||
| 323 | nvec = MLX5_CAP_GEN(dev, num_ports) * num_online_cpus() + | 324 | nvec = MLX5_CAP_GEN(dev, num_ports) * num_online_cpus() + |
| 324 | MLX5_EQ_VEC_COMP_BASE; | 325 | MLX5_EQ_VEC_COMP_BASE; |
| @@ -328,21 +329,23 @@ static int mlx5_alloc_irq_vectors(struct mlx5_core_dev *dev) | |||
| 328 | 329 | ||
| 329 | priv->irq_info = kcalloc(nvec, sizeof(*priv->irq_info), GFP_KERNEL); | 330 | priv->irq_info = kcalloc(nvec, sizeof(*priv->irq_info), GFP_KERNEL); |
| 330 | if (!priv->irq_info) | 331 | if (!priv->irq_info) |
| 331 | goto err_free_msix; | 332 | return -ENOMEM; |
| 332 | 333 | ||
| 333 | nvec = pci_alloc_irq_vectors(dev->pdev, | 334 | nvec = pci_alloc_irq_vectors(dev->pdev, |
| 334 | MLX5_EQ_VEC_COMP_BASE + 1, nvec, | 335 | MLX5_EQ_VEC_COMP_BASE + 1, nvec, |
| 335 | PCI_IRQ_MSIX); | 336 | PCI_IRQ_MSIX); |
| 336 | if (nvec < 0) | 337 | if (nvec < 0) { |
| 337 | return nvec; | 338 | err = nvec; |
| 339 | goto err_free_irq_info; | ||
| 340 | } | ||
| 338 | 341 | ||
| 339 | table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; | 342 | table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; |
| 340 | 343 | ||
| 341 | return 0; | 344 | return 0; |
| 342 | 345 | ||
| 343 | err_free_msix: | 346 | err_free_irq_info: |
| 344 | kfree(priv->irq_info); | 347 | kfree(priv->irq_info); |
| 345 | return -ENOMEM; | 348 | return err; |
| 346 | } | 349 | } |
| 347 | 350 | ||
| 348 | static void mlx5_free_irq_vectors(struct mlx5_core_dev *dev) | 351 | static void mlx5_free_irq_vectors(struct mlx5_core_dev *dev) |
| @@ -578,8 +581,7 @@ static int mlx5_core_set_hca_defaults(struct mlx5_core_dev *dev) | |||
| 578 | int ret = 0; | 581 | int ret = 0; |
| 579 | 582 | ||
| 580 | /* Disable local_lb by default */ | 583 | /* Disable local_lb by default */ |
| 581 | if ((MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_ETH) && | 584 | if (MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_ETH) |
| 582 | MLX5_CAP_GEN(dev, disable_local_lb)) | ||
| 583 | ret = mlx5_nic_vport_update_local_lb(dev, false); | 585 | ret = mlx5_nic_vport_update_local_lb(dev, false); |
| 584 | 586 | ||
| 585 | return ret; | 587 | return ret; |
| @@ -1121,9 +1123,12 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv, | |||
| 1121 | goto err_stop_poll; | 1123 | goto err_stop_poll; |
| 1122 | } | 1124 | } |
| 1123 | 1125 | ||
| 1124 | if (boot && mlx5_init_once(dev, priv)) { | 1126 | if (boot) { |
| 1125 | dev_err(&pdev->dev, "sw objs init failed\n"); | 1127 | err = mlx5_init_once(dev, priv); |
| 1126 | goto err_stop_poll; | 1128 | if (err) { |
| 1129 | dev_err(&pdev->dev, "sw objs init failed\n"); | ||
| 1130 | goto err_stop_poll; | ||
| 1131 | } | ||
| 1127 | } | 1132 | } |
| 1128 | 1133 | ||
| 1129 | err = mlx5_alloc_irq_vectors(dev); | 1134 | err = mlx5_alloc_irq_vectors(dev); |
| @@ -1133,8 +1138,9 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv, | |||
| 1133 | } | 1138 | } |
| 1134 | 1139 | ||
| 1135 | dev->priv.uar = mlx5_get_uars_page(dev); | 1140 | dev->priv.uar = mlx5_get_uars_page(dev); |
| 1136 | if (!dev->priv.uar) { | 1141 | if (IS_ERR(dev->priv.uar)) { |
| 1137 | dev_err(&pdev->dev, "Failed allocating uar, aborting\n"); | 1142 | dev_err(&pdev->dev, "Failed allocating uar, aborting\n"); |
| 1143 | err = PTR_ERR(dev->priv.uar); | ||
| 1138 | goto err_disable_msix; | 1144 | goto err_disable_msix; |
| 1139 | } | 1145 | } |
| 1140 | 1146 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/uar.c b/drivers/net/ethernet/mellanox/mlx5/core/uar.c index 222b25908d01..8b97066dd1f1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/uar.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/uar.c | |||
| @@ -168,18 +168,16 @@ struct mlx5_uars_page *mlx5_get_uars_page(struct mlx5_core_dev *mdev) | |||
| 168 | struct mlx5_uars_page *ret; | 168 | struct mlx5_uars_page *ret; |
| 169 | 169 | ||
| 170 | mutex_lock(&mdev->priv.bfregs.reg_head.lock); | 170 | mutex_lock(&mdev->priv.bfregs.reg_head.lock); |
| 171 | if (list_empty(&mdev->priv.bfregs.reg_head.list)) { | 171 | if (!list_empty(&mdev->priv.bfregs.reg_head.list)) { |
| 172 | ret = alloc_uars_page(mdev, false); | ||
| 173 | if (IS_ERR(ret)) { | ||
| 174 | ret = NULL; | ||
| 175 | goto out; | ||
| 176 | } | ||
| 177 | list_add(&ret->list, &mdev->priv.bfregs.reg_head.list); | ||
| 178 | } else { | ||
| 179 | ret = list_first_entry(&mdev->priv.bfregs.reg_head.list, | 172 | ret = list_first_entry(&mdev->priv.bfregs.reg_head.list, |
| 180 | struct mlx5_uars_page, list); | 173 | struct mlx5_uars_page, list); |
| 181 | kref_get(&ret->ref_count); | 174 | kref_get(&ret->ref_count); |
| 175 | goto out; | ||
| 182 | } | 176 | } |
| 177 | ret = alloc_uars_page(mdev, false); | ||
| 178 | if (IS_ERR(ret)) | ||
| 179 | goto out; | ||
| 180 | list_add(&ret->list, &mdev->priv.bfregs.reg_head.list); | ||
| 183 | out: | 181 | out: |
| 184 | mutex_unlock(&mdev->priv.bfregs.reg_head.lock); | 182 | mutex_unlock(&mdev->priv.bfregs.reg_head.lock); |
| 185 | 183 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/vport.c b/drivers/net/ethernet/mellanox/mlx5/core/vport.c index d653b0025b13..a1296a62497d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/vport.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/vport.c | |||
| @@ -908,23 +908,33 @@ int mlx5_nic_vport_update_local_lb(struct mlx5_core_dev *mdev, bool enable) | |||
| 908 | void *in; | 908 | void *in; |
| 909 | int err; | 909 | int err; |
| 910 | 910 | ||
| 911 | mlx5_core_dbg(mdev, "%s local_lb\n", enable ? "enable" : "disable"); | 911 | if (!MLX5_CAP_GEN(mdev, disable_local_lb_mc) && |
| 912 | !MLX5_CAP_GEN(mdev, disable_local_lb_uc)) | ||
| 913 | return 0; | ||
| 914 | |||
| 912 | in = kvzalloc(inlen, GFP_KERNEL); | 915 | in = kvzalloc(inlen, GFP_KERNEL); |
| 913 | if (!in) | 916 | if (!in) |
| 914 | return -ENOMEM; | 917 | return -ENOMEM; |
| 915 | 918 | ||
| 916 | MLX5_SET(modify_nic_vport_context_in, in, | 919 | MLX5_SET(modify_nic_vport_context_in, in, |
| 917 | field_select.disable_mc_local_lb, 1); | ||
| 918 | MLX5_SET(modify_nic_vport_context_in, in, | ||
| 919 | nic_vport_context.disable_mc_local_lb, !enable); | 920 | nic_vport_context.disable_mc_local_lb, !enable); |
| 920 | |||
| 921 | MLX5_SET(modify_nic_vport_context_in, in, | ||
| 922 | field_select.disable_uc_local_lb, 1); | ||
| 923 | MLX5_SET(modify_nic_vport_context_in, in, | 921 | MLX5_SET(modify_nic_vport_context_in, in, |
| 924 | nic_vport_context.disable_uc_local_lb, !enable); | 922 | nic_vport_context.disable_uc_local_lb, !enable); |
| 925 | 923 | ||
| 924 | if (MLX5_CAP_GEN(mdev, disable_local_lb_mc)) | ||
| 925 | MLX5_SET(modify_nic_vport_context_in, in, | ||
| 926 | field_select.disable_mc_local_lb, 1); | ||
| 927 | |||
| 928 | if (MLX5_CAP_GEN(mdev, disable_local_lb_uc)) | ||
| 929 | MLX5_SET(modify_nic_vport_context_in, in, | ||
| 930 | field_select.disable_uc_local_lb, 1); | ||
| 931 | |||
| 926 | err = mlx5_modify_nic_vport_context(mdev, in, inlen); | 932 | err = mlx5_modify_nic_vport_context(mdev, in, inlen); |
| 927 | 933 | ||
| 934 | if (!err) | ||
| 935 | mlx5_core_dbg(mdev, "%s local_lb\n", | ||
| 936 | enable ? "enable" : "disable"); | ||
| 937 | |||
| 928 | kvfree(in); | 938 | kvfree(in); |
| 929 | return err; | 939 | return err; |
| 930 | } | 940 | } |
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h index 1f509d072026..a0610427e168 100644 --- a/include/linux/mlx5/driver.h +++ b/include/linux/mlx5/driver.h | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/kernel.h> | 36 | #include <linux/kernel.h> |
| 37 | #include <linux/completion.h> | 37 | #include <linux/completion.h> |
| 38 | #include <linux/pci.h> | 38 | #include <linux/pci.h> |
| 39 | #include <linux/irq.h> | ||
| 39 | #include <linux/spinlock_types.h> | 40 | #include <linux/spinlock_types.h> |
| 40 | #include <linux/semaphore.h> | 41 | #include <linux/semaphore.h> |
| 41 | #include <linux/slab.h> | 42 | #include <linux/slab.h> |
| @@ -1231,7 +1232,23 @@ enum { | |||
| 1231 | static inline const struct cpumask * | 1232 | static inline const struct cpumask * |
| 1232 | mlx5_get_vector_affinity(struct mlx5_core_dev *dev, int vector) | 1233 | mlx5_get_vector_affinity(struct mlx5_core_dev *dev, int vector) |
| 1233 | { | 1234 | { |
| 1234 | return pci_irq_get_affinity(dev->pdev, MLX5_EQ_VEC_COMP_BASE + vector); | 1235 | const struct cpumask *mask; |
| 1236 | struct irq_desc *desc; | ||
| 1237 | unsigned int irq; | ||
| 1238 | int eqn; | ||
| 1239 | int err; | ||
| 1240 | |||
| 1241 | err = mlx5_vector2eqn(dev, vector, &eqn, &irq); | ||
| 1242 | if (err) | ||
| 1243 | return NULL; | ||
| 1244 | |||
| 1245 | desc = irq_to_desc(irq); | ||
| 1246 | #ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK | ||
| 1247 | mask = irq_data_get_effective_affinity_mask(&desc->irq_data); | ||
| 1248 | #else | ||
| 1249 | mask = desc->irq_common_data.affinity; | ||
| 1250 | #endif | ||
| 1251 | return mask; | ||
| 1235 | } | 1252 | } |
| 1236 | 1253 | ||
| 1237 | #endif /* MLX5_DRIVER_H */ | 1254 | #endif /* MLX5_DRIVER_H */ |
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h index d44ec5f41d4a..1391a82da98e 100644 --- a/include/linux/mlx5/mlx5_ifc.h +++ b/include/linux/mlx5/mlx5_ifc.h | |||
| @@ -1027,8 +1027,9 @@ struct mlx5_ifc_cmd_hca_cap_bits { | |||
| 1027 | u8 log_max_wq_sz[0x5]; | 1027 | u8 log_max_wq_sz[0x5]; |
| 1028 | 1028 | ||
| 1029 | u8 nic_vport_change_event[0x1]; | 1029 | u8 nic_vport_change_event[0x1]; |
| 1030 | u8 disable_local_lb[0x1]; | 1030 | u8 disable_local_lb_uc[0x1]; |
| 1031 | u8 reserved_at_3e2[0x9]; | 1031 | u8 disable_local_lb_mc[0x1]; |
| 1032 | u8 reserved_at_3e3[0x8]; | ||
| 1032 | u8 log_max_vlan_list[0x5]; | 1033 | u8 log_max_vlan_list[0x5]; |
| 1033 | u8 reserved_at_3f0[0x3]; | 1034 | u8 reserved_at_3f0[0x3]; |
| 1034 | u8 log_max_current_mc_list[0x5]; | 1035 | u8 log_max_current_mc_list[0x5]; |
