mlx5-fixes-2018-01-11
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJaV/8zAAoJEEg/ir3gV/o+Ui0IAJWzQe1HHNJeWUykLNYMbjbQ vxnnsbYd5Y2j/Q+tJdi6FJxEvC8kF78BJvDp37plV+lqZAXsvaGlLgyWcnY/XkFs byVjueQVyil/JUyIw5ciK8DqOOI/tdo5v51ZJ05JZYRdyP0E1KVwy9jXHEpVJKmm QlIfjrzbv5p6ydysKi6Z9NFKJ9CjSIyHh4Ew8VQKuzJ+AtoZ8L6XWGDHvoZl8DAb jweJwRU9bhBqyoWjRRGtTqfcNmwvhYcJwuzER9vKK4l4JAvzhl8PGzeWsE8wPYBW uKNRAPET7HQQsZblPU2l66oZVFMXhBsBnuY90jlPlmeHB/KLBLZp/m4EIzHEsoM= =EiuX -----END PGP SIGNATURE----- Merge tag 'mlx5-fixes-2018-01-11' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux Saeed Mahameed says: ==================== Mellanox, mlx5 fixes 2018-01-11 The following series includes fixes to mlx5 core and netdev driver. To highlight we have two critical fixes in this series: 1st patch from Eran to address a fix for Host2BMC Breakage. 2nd patch from Saeed to address the RDMA IRQ vector affinity settings query issue, the patch provides the correct mlx5_core implementation for RDMA to correctly query vector affinity. I sent this patch privately to Sagi a week a go, so he could to test it but I didn't hear from him. All other patches are trivial misc fixes. Please pull and let me know if there's any problem. for -stable v4.14-y and later: ("net/mlx5: Fix get vector affinity helper function") ("{net,ib}/mlx5: Don't disable local loopback multicast traffic when needed") Note: Merging this series with net-next will produce the following conflict: <<<<<<< HEAD u8 disable_local_lb[0x1]; u8 reserved_at_3e2[0x1]; u8 log_min_hairpin_wq_data_sz[0x5]; u8 reserved_at_3e8[0x3]; ======= u8 disable_local_lb_uc[0x1]; u8 disable_local_lb_mc[0x1]; u8 reserved_at_3e3[0x8]; >>>>>>> 359c96447ac2297fabe15ef30b60f3b4b71e7fd0 To resolve, use the following hunk: i.e: <<<<<< u8 disable_local_lb_uc[0x1]; u8 disable_local_lb_mc[0x1]; u8 log_min_hairpin_wq_data_sz[0x5]; u8 reserved_at_3e8[0x3]; >>>>>> ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
5dd966c680
|
@ -1324,7 +1324,8 @@ static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn)
|
|||
return err;
|
||||
|
||||
if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) ||
|
||||
!MLX5_CAP_GEN(dev->mdev, disable_local_lb))
|
||||
(!MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) &&
|
||||
!MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc)))
|
||||
return err;
|
||||
|
||||
mutex_lock(&dev->lb_mutex);
|
||||
|
@ -1342,7 +1343,8 @@ static void mlx5_ib_dealloc_transport_domain(struct mlx5_ib_dev *dev, u32 tdn)
|
|||
mlx5_core_dealloc_transport_domain(dev->mdev, tdn);
|
||||
|
||||
if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) ||
|
||||
!MLX5_CAP_GEN(dev->mdev, disable_local_lb))
|
||||
(!MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) &&
|
||||
!MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc)))
|
||||
return;
|
||||
|
||||
mutex_lock(&dev->lb_mutex);
|
||||
|
@ -4158,7 +4160,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
|
|||
goto err_cnt;
|
||||
|
||||
dev->mdev->priv.uar = mlx5_get_uars_page(dev->mdev);
|
||||
if (!dev->mdev->priv.uar)
|
||||
if (IS_ERR(dev->mdev->priv.uar))
|
||||
goto err_cong;
|
||||
|
||||
err = mlx5_alloc_bfreg(dev->mdev, &dev->bfreg, false, false);
|
||||
|
@ -4187,7 +4189,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
|
|||
}
|
||||
|
||||
if ((MLX5_CAP_GEN(mdev, port_type) == MLX5_CAP_PORT_TYPE_ETH) &&
|
||||
MLX5_CAP_GEN(mdev, disable_local_lb))
|
||||
(MLX5_CAP_GEN(mdev, disable_local_lb_uc) ||
|
||||
MLX5_CAP_GEN(mdev, disable_local_lb_mc)))
|
||||
mutex_init(&dev->lb_mutex);
|
||||
|
||||
dev->ib_active = true;
|
||||
|
|
|
@ -895,7 +895,7 @@ int mlx5e_vlan_rx_kill_vid(struct net_device *dev, __always_unused __be16 proto,
|
|||
u16 vid);
|
||||
void mlx5e_enable_cvlan_filter(struct mlx5e_priv *priv);
|
||||
void mlx5e_disable_cvlan_filter(struct mlx5e_priv *priv);
|
||||
void mlx5e_timestamp_set(struct mlx5e_priv *priv);
|
||||
void mlx5e_timestamp_init(struct mlx5e_priv *priv);
|
||||
|
||||
struct mlx5e_redirect_rqt_param {
|
||||
bool is_rss;
|
||||
|
|
|
@ -922,8 +922,9 @@ static void mlx5e_dcbnl_query_dcbx_mode(struct mlx5e_priv *priv,
|
|||
|
||||
static void mlx5e_ets_init(struct mlx5e_priv *priv)
|
||||
{
|
||||
int i;
|
||||
struct ieee_ets ets;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
if (!MLX5_CAP_GEN(priv->mdev, ets))
|
||||
return;
|
||||
|
@ -936,11 +937,16 @@ static void mlx5e_ets_init(struct mlx5e_priv *priv)
|
|||
ets.prio_tc[i] = i;
|
||||
}
|
||||
|
||||
/* tclass[prio=0]=1, tclass[prio=1]=0, tclass[prio=i]=i (for i>1) */
|
||||
ets.prio_tc[0] = 1;
|
||||
ets.prio_tc[1] = 0;
|
||||
if (ets.ets_cap > 1) {
|
||||
/* tclass[prio=0]=1, tclass[prio=1]=0, tclass[prio=i]=i (for i>1) */
|
||||
ets.prio_tc[0] = 1;
|
||||
ets.prio_tc[1] = 0;
|
||||
}
|
||||
|
||||
mlx5e_dcbnl_ieee_setets_core(priv, &ets);
|
||||
err = mlx5e_dcbnl_ieee_setets_core(priv, &ets);
|
||||
if (err)
|
||||
netdev_err(priv->netdev,
|
||||
"%s, Failed to init ETS: %d\n", __func__, err);
|
||||
}
|
||||
|
||||
enum {
|
||||
|
|
|
@ -207,8 +207,7 @@ void mlx5e_ethtool_get_ethtool_stats(struct mlx5e_priv *priv,
|
|||
return;
|
||||
|
||||
mutex_lock(&priv->state_lock);
|
||||
if (test_bit(MLX5E_STATE_OPENED, &priv->state))
|
||||
mlx5e_update_stats(priv, true);
|
||||
mlx5e_update_stats(priv, true);
|
||||
mutex_unlock(&priv->state_lock);
|
||||
|
||||
for (i = 0; i < mlx5e_num_stats_grps; i++)
|
||||
|
|
|
@ -2669,7 +2669,7 @@ void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
|
|||
netif_carrier_on(netdev);
|
||||
}
|
||||
|
||||
void mlx5e_timestamp_set(struct mlx5e_priv *priv)
|
||||
void mlx5e_timestamp_init(struct mlx5e_priv *priv)
|
||||
{
|
||||
priv->tstamp.tx_type = HWTSTAMP_TX_OFF;
|
||||
priv->tstamp.rx_filter = HWTSTAMP_FILTER_NONE;
|
||||
|
@ -2690,7 +2690,6 @@ int mlx5e_open_locked(struct net_device *netdev)
|
|||
mlx5e_activate_priv_channels(priv);
|
||||
if (priv->profile->update_carrier)
|
||||
priv->profile->update_carrier(priv);
|
||||
mlx5e_timestamp_set(priv);
|
||||
|
||||
if (priv->profile->update_stats)
|
||||
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)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define MLX5E_SET_FEATURE(netdev, feature, enable) \
|
||||
#define MLX5E_SET_FEATURE(features, feature, enable) \
|
||||
do { \
|
||||
if (enable) \
|
||||
netdev->features |= feature; \
|
||||
*features |= feature; \
|
||||
else \
|
||||
netdev->features &= ~feature; \
|
||||
*features &= ~feature; \
|
||||
} while (0)
|
||||
|
||||
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)
|
|||
#endif
|
||||
|
||||
static int mlx5e_handle_feature(struct net_device *netdev,
|
||||
netdev_features_t *features,
|
||||
netdev_features_t wanted_features,
|
||||
netdev_features_t feature,
|
||||
mlx5e_feature_handler feature_handler)
|
||||
|
@ -3365,34 +3365,40 @@ static int mlx5e_handle_feature(struct net_device *netdev,
|
|||
return err;
|
||||
}
|
||||
|
||||
MLX5E_SET_FEATURE(netdev, feature, enable);
|
||||
MLX5E_SET_FEATURE(features, feature, enable);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5e_set_features(struct net_device *netdev,
|
||||
netdev_features_t features)
|
||||
{
|
||||
netdev_features_t oper_features = netdev->features;
|
||||
int err;
|
||||
|
||||
err = mlx5e_handle_feature(netdev, features, NETIF_F_LRO,
|
||||
set_feature_lro);
|
||||
err |= mlx5e_handle_feature(netdev, features,
|
||||
err = mlx5e_handle_feature(netdev, &oper_features, features,
|
||||
NETIF_F_LRO, set_feature_lro);
|
||||
err |= mlx5e_handle_feature(netdev, &oper_features, features,
|
||||
NETIF_F_HW_VLAN_CTAG_FILTER,
|
||||
set_feature_cvlan_filter);
|
||||
err |= mlx5e_handle_feature(netdev, features, NETIF_F_HW_TC,
|
||||
set_feature_tc_num_filters);
|
||||
err |= mlx5e_handle_feature(netdev, features, NETIF_F_RXALL,
|
||||
set_feature_rx_all);
|
||||
err |= mlx5e_handle_feature(netdev, features, NETIF_F_RXFCS,
|
||||
set_feature_rx_fcs);
|
||||
err |= mlx5e_handle_feature(netdev, features, NETIF_F_HW_VLAN_CTAG_RX,
|
||||
set_feature_rx_vlan);
|
||||
err |= mlx5e_handle_feature(netdev, &oper_features, features,
|
||||
NETIF_F_HW_TC, set_feature_tc_num_filters);
|
||||
err |= mlx5e_handle_feature(netdev, &oper_features, features,
|
||||
NETIF_F_RXALL, set_feature_rx_all);
|
||||
err |= mlx5e_handle_feature(netdev, &oper_features, features,
|
||||
NETIF_F_RXFCS, set_feature_rx_fcs);
|
||||
err |= mlx5e_handle_feature(netdev, &oper_features, features,
|
||||
NETIF_F_HW_VLAN_CTAG_RX, set_feature_rx_vlan);
|
||||
#ifdef CONFIG_RFS_ACCEL
|
||||
err |= mlx5e_handle_feature(netdev, features, NETIF_F_NTUPLE,
|
||||
set_feature_arfs);
|
||||
err |= mlx5e_handle_feature(netdev, &oper_features, features,
|
||||
NETIF_F_NTUPLE, set_feature_arfs);
|
||||
#endif
|
||||
|
||||
return err ? -EINVAL : 0;
|
||||
if (err) {
|
||||
netdev->features = oper_features;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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,
|
|||
INIT_WORK(&priv->set_rx_mode_work, mlx5e_set_rx_mode_work);
|
||||
INIT_WORK(&priv->tx_timeout_work, mlx5e_tx_timeout_work);
|
||||
INIT_DELAYED_WORK(&priv->update_stats_work, mlx5e_update_stats_work);
|
||||
|
||||
mlx5e_timestamp_init(priv);
|
||||
}
|
||||
|
||||
static void mlx5e_set_netdev_dev_addr(struct net_device *netdev)
|
||||
|
|
|
@ -877,6 +877,8 @@ static void mlx5e_init_rep(struct mlx5_core_dev *mdev,
|
|||
|
||||
mlx5e_build_rep_params(mdev, &priv->channels.params);
|
||||
mlx5e_build_rep_netdev(netdev);
|
||||
|
||||
mlx5e_timestamp_init(priv);
|
||||
}
|
||||
|
||||
static int mlx5e_init_rep_rx(struct mlx5e_priv *priv)
|
||||
|
|
|
@ -238,15 +238,19 @@ static int mlx5e_test_loopback_setup(struct mlx5e_priv *priv,
|
|||
int err = 0;
|
||||
|
||||
/* Temporarily enable local_lb */
|
||||
if (MLX5_CAP_GEN(priv->mdev, disable_local_lb)) {
|
||||
mlx5_nic_vport_query_local_lb(priv->mdev, &lbtp->local_lb);
|
||||
if (!lbtp->local_lb)
|
||||
mlx5_nic_vport_update_local_lb(priv->mdev, true);
|
||||
err = mlx5_nic_vport_query_local_lb(priv->mdev, &lbtp->local_lb);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!lbtp->local_lb) {
|
||||
err = mlx5_nic_vport_update_local_lb(priv->mdev, true);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = mlx5e_refresh_tirs(priv, true);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
|
||||
lbtp->loopback_ok = false;
|
||||
init_completion(&lbtp->comp);
|
||||
|
@ -256,16 +260,21 @@ static int mlx5e_test_loopback_setup(struct mlx5e_priv *priv,
|
|||
lbtp->pt.dev = priv->netdev;
|
||||
lbtp->pt.af_packet_priv = lbtp;
|
||||
dev_add_pack(&lbtp->pt);
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
if (!lbtp->local_lb)
|
||||
mlx5_nic_vport_update_local_lb(priv->mdev, false);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void mlx5e_test_loopback_cleanup(struct mlx5e_priv *priv,
|
||||
struct mlx5e_lbt_priv *lbtp)
|
||||
{
|
||||
if (MLX5_CAP_GEN(priv->mdev, disable_local_lb)) {
|
||||
if (!lbtp->local_lb)
|
||||
mlx5_nic_vport_update_local_lb(priv->mdev, false);
|
||||
}
|
||||
if (!lbtp->local_lb)
|
||||
mlx5_nic_vport_update_local_lb(priv->mdev, false);
|
||||
|
||||
dev_remove_pack(&lbtp->pt);
|
||||
mlx5e_refresh_tirs(priv, false);
|
||||
|
|
|
@ -86,6 +86,8 @@ void mlx5i_init(struct mlx5_core_dev *mdev,
|
|||
mlx5e_build_nic_params(mdev, &priv->channels.params, profile->max_nch(mdev));
|
||||
mlx5i_build_nic_params(mdev, &priv->channels.params);
|
||||
|
||||
mlx5e_timestamp_init(priv);
|
||||
|
||||
/* netdev init */
|
||||
netdev->hw_features |= NETIF_F_SG;
|
||||
netdev->hw_features |= NETIF_F_IP_CSUM;
|
||||
|
@ -450,7 +452,6 @@ static int mlx5i_open(struct net_device *netdev)
|
|||
|
||||
mlx5e_refresh_tirs(epriv, false);
|
||||
mlx5e_activate_priv_channels(epriv);
|
||||
mlx5e_timestamp_set(epriv);
|
||||
|
||||
mutex_unlock(&epriv->state_lock);
|
||||
return 0;
|
||||
|
|
|
@ -423,9 +423,13 @@ void mlx5_pps_event(struct mlx5_core_dev *mdev,
|
|||
|
||||
switch (clock->ptp_info.pin_config[pin].func) {
|
||||
case PTP_PF_EXTTS:
|
||||
ptp_event.index = pin;
|
||||
ptp_event.timestamp = timecounter_cyc2time(&clock->tc,
|
||||
be64_to_cpu(eqe->data.pps.time_stamp));
|
||||
if (clock->pps_info.enabled) {
|
||||
ptp_event.type = PTP_CLOCK_PPSUSR;
|
||||
ptp_event.pps_times.ts_real = ns_to_timespec64(eqe->data.pps.time_stamp);
|
||||
ptp_event.pps_times.ts_real =
|
||||
ns_to_timespec64(ptp_event.timestamp);
|
||||
} else {
|
||||
ptp_event.type = PTP_CLOCK_EXTTS;
|
||||
}
|
||||
|
|
|
@ -319,6 +319,7 @@ static int mlx5_alloc_irq_vectors(struct mlx5_core_dev *dev)
|
|||
struct mlx5_eq_table *table = &priv->eq_table;
|
||||
int num_eqs = 1 << MLX5_CAP_GEN(dev, log_max_eq);
|
||||
int nvec;
|
||||
int err;
|
||||
|
||||
nvec = MLX5_CAP_GEN(dev, num_ports) * num_online_cpus() +
|
||||
MLX5_EQ_VEC_COMP_BASE;
|
||||
|
@ -328,21 +329,23 @@ static int mlx5_alloc_irq_vectors(struct mlx5_core_dev *dev)
|
|||
|
||||
priv->irq_info = kcalloc(nvec, sizeof(*priv->irq_info), GFP_KERNEL);
|
||||
if (!priv->irq_info)
|
||||
goto err_free_msix;
|
||||
return -ENOMEM;
|
||||
|
||||
nvec = pci_alloc_irq_vectors(dev->pdev,
|
||||
MLX5_EQ_VEC_COMP_BASE + 1, nvec,
|
||||
PCI_IRQ_MSIX);
|
||||
if (nvec < 0)
|
||||
return nvec;
|
||||
if (nvec < 0) {
|
||||
err = nvec;
|
||||
goto err_free_irq_info;
|
||||
}
|
||||
|
||||
table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE;
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_msix:
|
||||
err_free_irq_info:
|
||||
kfree(priv->irq_info);
|
||||
return -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
|
||||
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)
|
|||
int ret = 0;
|
||||
|
||||
/* Disable local_lb by default */
|
||||
if ((MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_ETH) &&
|
||||
MLX5_CAP_GEN(dev, disable_local_lb))
|
||||
if (MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_ETH)
|
||||
ret = mlx5_nic_vport_update_local_lb(dev, false);
|
||||
|
||||
return ret;
|
||||
|
@ -1121,9 +1123,12 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
|
|||
goto err_stop_poll;
|
||||
}
|
||||
|
||||
if (boot && mlx5_init_once(dev, priv)) {
|
||||
dev_err(&pdev->dev, "sw objs init failed\n");
|
||||
goto err_stop_poll;
|
||||
if (boot) {
|
||||
err = mlx5_init_once(dev, priv);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "sw objs init failed\n");
|
||||
goto err_stop_poll;
|
||||
}
|
||||
}
|
||||
|
||||
err = mlx5_alloc_irq_vectors(dev);
|
||||
|
@ -1133,8 +1138,9 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
|
|||
}
|
||||
|
||||
dev->priv.uar = mlx5_get_uars_page(dev);
|
||||
if (!dev->priv.uar) {
|
||||
if (IS_ERR(dev->priv.uar)) {
|
||||
dev_err(&pdev->dev, "Failed allocating uar, aborting\n");
|
||||
err = PTR_ERR(dev->priv.uar);
|
||||
goto err_disable_msix;
|
||||
}
|
||||
|
||||
|
|
|
@ -168,18 +168,16 @@ struct mlx5_uars_page *mlx5_get_uars_page(struct mlx5_core_dev *mdev)
|
|||
struct mlx5_uars_page *ret;
|
||||
|
||||
mutex_lock(&mdev->priv.bfregs.reg_head.lock);
|
||||
if (list_empty(&mdev->priv.bfregs.reg_head.list)) {
|
||||
ret = alloc_uars_page(mdev, false);
|
||||
if (IS_ERR(ret)) {
|
||||
ret = NULL;
|
||||
goto out;
|
||||
}
|
||||
list_add(&ret->list, &mdev->priv.bfregs.reg_head.list);
|
||||
} else {
|
||||
if (!list_empty(&mdev->priv.bfregs.reg_head.list)) {
|
||||
ret = list_first_entry(&mdev->priv.bfregs.reg_head.list,
|
||||
struct mlx5_uars_page, list);
|
||||
kref_get(&ret->ref_count);
|
||||
goto out;
|
||||
}
|
||||
ret = alloc_uars_page(mdev, false);
|
||||
if (IS_ERR(ret))
|
||||
goto out;
|
||||
list_add(&ret->list, &mdev->priv.bfregs.reg_head.list);
|
||||
out:
|
||||
mutex_unlock(&mdev->priv.bfregs.reg_head.lock);
|
||||
|
||||
|
|
|
@ -908,23 +908,33 @@ int mlx5_nic_vport_update_local_lb(struct mlx5_core_dev *mdev, bool enable)
|
|||
void *in;
|
||||
int err;
|
||||
|
||||
mlx5_core_dbg(mdev, "%s local_lb\n", enable ? "enable" : "disable");
|
||||
if (!MLX5_CAP_GEN(mdev, disable_local_lb_mc) &&
|
||||
!MLX5_CAP_GEN(mdev, disable_local_lb_uc))
|
||||
return 0;
|
||||
|
||||
in = kvzalloc(inlen, GFP_KERNEL);
|
||||
if (!in)
|
||||
return -ENOMEM;
|
||||
|
||||
MLX5_SET(modify_nic_vport_context_in, in,
|
||||
field_select.disable_mc_local_lb, 1);
|
||||
MLX5_SET(modify_nic_vport_context_in, in,
|
||||
nic_vport_context.disable_mc_local_lb, !enable);
|
||||
|
||||
MLX5_SET(modify_nic_vport_context_in, in,
|
||||
field_select.disable_uc_local_lb, 1);
|
||||
MLX5_SET(modify_nic_vport_context_in, in,
|
||||
nic_vport_context.disable_uc_local_lb, !enable);
|
||||
|
||||
if (MLX5_CAP_GEN(mdev, disable_local_lb_mc))
|
||||
MLX5_SET(modify_nic_vport_context_in, in,
|
||||
field_select.disable_mc_local_lb, 1);
|
||||
|
||||
if (MLX5_CAP_GEN(mdev, disable_local_lb_uc))
|
||||
MLX5_SET(modify_nic_vport_context_in, in,
|
||||
field_select.disable_uc_local_lb, 1);
|
||||
|
||||
err = mlx5_modify_nic_vport_context(mdev, in, inlen);
|
||||
|
||||
if (!err)
|
||||
mlx5_core_dbg(mdev, "%s local_lb\n",
|
||||
enable ? "enable" : "disable");
|
||||
|
||||
kvfree(in);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/spinlock_types.h>
|
||||
#include <linux/semaphore.h>
|
||||
#include <linux/slab.h>
|
||||
|
@ -1231,7 +1232,23 @@ enum {
|
|||
static inline const struct cpumask *
|
||||
mlx5_get_vector_affinity(struct mlx5_core_dev *dev, int vector)
|
||||
{
|
||||
return pci_irq_get_affinity(dev->pdev, MLX5_EQ_VEC_COMP_BASE + vector);
|
||||
const struct cpumask *mask;
|
||||
struct irq_desc *desc;
|
||||
unsigned int irq;
|
||||
int eqn;
|
||||
int err;
|
||||
|
||||
err = mlx5_vector2eqn(dev, vector, &eqn, &irq);
|
||||
if (err)
|
||||
return NULL;
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
|
||||
mask = irq_data_get_effective_affinity_mask(&desc->irq_data);
|
||||
#else
|
||||
mask = desc->irq_common_data.affinity;
|
||||
#endif
|
||||
return mask;
|
||||
}
|
||||
|
||||
#endif /* MLX5_DRIVER_H */
|
||||
|
|
|
@ -1027,8 +1027,9 @@ struct mlx5_ifc_cmd_hca_cap_bits {
|
|||
u8 log_max_wq_sz[0x5];
|
||||
|
||||
u8 nic_vport_change_event[0x1];
|
||||
u8 disable_local_lb[0x1];
|
||||
u8 reserved_at_3e2[0x9];
|
||||
u8 disable_local_lb_uc[0x1];
|
||||
u8 disable_local_lb_mc[0x1];
|
||||
u8 reserved_at_3e3[0x8];
|
||||
u8 log_max_vlan_list[0x5];
|
||||
u8 reserved_at_3f0[0x3];
|
||||
u8 log_max_current_mc_list[0x5];
|
||||
|
|
Loading…
Reference in New Issue