aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/mlx5/main.c11
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en.h2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c16
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_main.c48
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_rep.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_selftest.c27
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/main.c28
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/uar.c14
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/vport.c22
-rw-r--r--include/linux/mlx5/driver.h19
-rw-r--r--include/linux/mlx5/mlx5_ifc.h5
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);
896void mlx5e_enable_cvlan_filter(struct mlx5e_priv *priv); 896void mlx5e_enable_cvlan_filter(struct mlx5e_priv *priv);
897void mlx5e_disable_cvlan_filter(struct mlx5e_priv *priv); 897void mlx5e_disable_cvlan_filter(struct mlx5e_priv *priv);
898void mlx5e_timestamp_set(struct mlx5e_priv *priv); 898void mlx5e_timestamp_init(struct mlx5e_priv *priv);
899 899
900struct mlx5e_redirect_rqt_param { 900struct 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
923static void mlx5e_ets_init(struct mlx5e_priv *priv) 923static 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
946enum { 952enum {
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
2672void mlx5e_timestamp_set(struct mlx5e_priv *priv) 2672void 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
3230typedef int (*mlx5e_feature_handler)(struct net_device *netdev, bool enable); 3229typedef 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
3349static int mlx5e_handle_feature(struct net_device *netdev, 3348static 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
3372static int mlx5e_set_features(struct net_device *netdev, 3372static 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
3398static netdev_features_t mlx5e_fix_features(struct net_device *netdev, 3404static 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
4144static void mlx5e_set_netdev_dev_addr(struct net_device *netdev) 4152static 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
882static int mlx5e_init_rep_rx(struct mlx5e_priv *priv) 884static 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
266out:
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
262static void mlx5e_test_loopback_cleanup(struct mlx5e_priv *priv, 273static 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
343err_free_msix: 346err_free_irq_info:
344 kfree(priv->irq_info); 347 kfree(priv->irq_info);
345 return -ENOMEM; 348 return err;
346} 349}
347 350
348static void mlx5_free_irq_vectors(struct mlx5_core_dev *dev) 351static 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);
183out: 181out:
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 {
1231static inline const struct cpumask * 1232static inline const struct cpumask *
1232mlx5_get_vector_affinity(struct mlx5_core_dev *dev, int vector) 1233mlx5_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];