Commit 3fbf6120 authored by Jakub Kicinski's avatar Jakub Kicinski

Revert "mlx5 updates 2023-12-20"

Revert "net/mlx5: Implement management PF Ethernet profile"
This reverts commit 22c46406.
Revert "net/mlx5: Enable SD feature"
This reverts commit c88c49ac.
Revert "net/mlx5e: Block TLS device offload on combined SD netdev"
This reverts commit 83a59ce0.
Revert "net/mlx5e: Support per-mdev queue counter"
This reverts commit d72baceb.
Revert "net/mlx5e: Support cross-vhca RSS"
This reverts commit c73a3ab8.
Revert "net/mlx5e: Let channels be SD-aware"
This reverts commit e4f9686b.
Revert "net/mlx5e: Create EN core HW resources for all secondary devices"
This reverts commit c4fb94aa.
Revert "net/mlx5e: Create single netdev per SD group"
This reverts commit e2578b4f.
Revert "net/mlx5: SD, Add informative prints in kernel log"
This reverts commit c82d3603.
Revert "net/mlx5: SD, Implement steering for primary and secondaries"
This reverts commit 605fcce3.
Revert "net/mlx5: SD, Implement devcom communication and primary election"
This reverts commit a45af9a9.
Revert "net/mlx5: SD, Implement basic query and instantiation"
This reverts commit 63b9ce94.
Revert "net/mlx5: SD, Introduce SD lib"
This reverts commit 4a04a31f.
Revert "net/mlx5: Fix query of sd_group field"
This reverts commit e04984a3.
Revert "net/mlx5e: Use the correct lag ports number when creating TISes"
This reverts commit a7e7b40c.

There are some unanswered questions on the list, and we don't
have any docs. Given the lack of replies so far and the fact
that v6.8 merge window has started - let's revert this and
revisit for v6.9.

Link: https://lore.kernel.org/all/20231221005721.186607-1-saeed@kernel.org/Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent e9ee9102
...@@ -29,7 +29,7 @@ mlx5_core-$(CONFIG_MLX5_CORE_EN) += en/rqt.o en/tir.o en/rss.o en/rx_res.o \ ...@@ -29,7 +29,7 @@ mlx5_core-$(CONFIG_MLX5_CORE_EN) += en/rqt.o en/tir.o en/rss.o en/rx_res.o \
en/reporter_tx.o en/reporter_rx.o en/params.o en/xsk/pool.o \ en/reporter_tx.o en/reporter_rx.o en/params.o en/xsk/pool.o \
en/xsk/setup.o en/xsk/rx.o en/xsk/tx.o en/devlink.o en/ptp.o \ en/xsk/setup.o en/xsk/rx.o en/xsk/tx.o en/devlink.o en/ptp.o \
en/qos.o en/htb.o en/trap.o en/fs_tt_redirect.o en/selq.o \ en/qos.o en/htb.o en/trap.o en/fs_tt_redirect.o en/selq.o \
en/mgmt_pf.o lib/crypto.o lib/sd.o lib/crypto.o
# #
# Netdev extra # Netdev extra
......
...@@ -190,9 +190,6 @@ bool mlx5_rdma_supported(struct mlx5_core_dev *dev) ...@@ -190,9 +190,6 @@ bool mlx5_rdma_supported(struct mlx5_core_dev *dev)
if (is_mp_supported(dev)) if (is_mp_supported(dev))
return false; return false;
if (mlx5_core_is_mgmt_pf(dev))
return false;
return true; return true;
} }
......
...@@ -75,9 +75,6 @@ int mlx5_ec_init(struct mlx5_core_dev *dev) ...@@ -75,9 +75,6 @@ int mlx5_ec_init(struct mlx5_core_dev *dev)
if (!mlx5_core_is_ecpf(dev)) if (!mlx5_core_is_ecpf(dev))
return 0; return 0;
if (mlx5_core_is_mgmt_pf(dev))
return 0;
return mlx5_host_pf_init(dev); return mlx5_host_pf_init(dev);
} }
...@@ -88,9 +85,6 @@ void mlx5_ec_cleanup(struct mlx5_core_dev *dev) ...@@ -88,9 +85,6 @@ void mlx5_ec_cleanup(struct mlx5_core_dev *dev)
if (!mlx5_core_is_ecpf(dev)) if (!mlx5_core_is_ecpf(dev))
return; return;
if (mlx5_core_is_mgmt_pf(dev))
return;
mlx5_host_pf_cleanup(dev); mlx5_host_pf_cleanup(dev);
err = mlx5_wait_for_pages(dev, &dev->priv.page_counters[MLX5_HOST_PF]); err = mlx5_wait_for_pages(dev, &dev->priv.page_counters[MLX5_HOST_PF]);
......
...@@ -60,10 +60,8 @@ ...@@ -60,10 +60,8 @@
#include "lib/clock.h" #include "lib/clock.h"
#include "en/rx_res.h" #include "en/rx_res.h"
#include "en/selq.h" #include "en/selq.h"
#include "lib/sd.h"
extern const struct net_device_ops mlx5e_netdev_ops; extern const struct net_device_ops mlx5e_netdev_ops;
extern const struct net_device_ops mlx5e_mgmt_netdev_ops;
struct page_pool; struct page_pool;
#define MLX5E_METADATA_ETHER_TYPE (0x8CE4) #define MLX5E_METADATA_ETHER_TYPE (0x8CE4)
...@@ -793,8 +791,6 @@ struct mlx5e_channel { ...@@ -793,8 +791,6 @@ struct mlx5e_channel {
struct hwtstamp_config *tstamp; struct hwtstamp_config *tstamp;
DECLARE_BITMAP(state, MLX5E_CHANNEL_NUM_STATES); DECLARE_BITMAP(state, MLX5E_CHANNEL_NUM_STATES);
int ix; int ix;
int vec_ix;
int sd_ix;
int cpu; int cpu;
/* Sync between icosq recovery and XSK enable/disable. */ /* Sync between icosq recovery and XSK enable/disable. */
struct mutex icosq_recovery_lock; struct mutex icosq_recovery_lock;
...@@ -918,7 +914,7 @@ struct mlx5e_priv { ...@@ -918,7 +914,7 @@ struct mlx5e_priv {
bool tx_ptp_opened; bool tx_ptp_opened;
bool rx_ptp_opened; bool rx_ptp_opened;
struct hwtstamp_config tstamp; struct hwtstamp_config tstamp;
u16 q_counter[MLX5_SD_MAX_GROUP_SZ]; u16 q_counter;
u16 drop_rq_q_counter; u16 drop_rq_q_counter;
struct notifier_block events_nb; struct notifier_block events_nb;
struct notifier_block blocking_events_nb; struct notifier_block blocking_events_nb;
...@@ -1033,12 +1029,12 @@ struct mlx5e_xsk_param; ...@@ -1033,12 +1029,12 @@ struct mlx5e_xsk_param;
struct mlx5e_rq_param; struct mlx5e_rq_param;
int mlx5e_open_rq(struct mlx5e_params *params, struct mlx5e_rq_param *param, int mlx5e_open_rq(struct mlx5e_params *params, struct mlx5e_rq_param *param,
struct mlx5e_xsk_param *xsk, int node, u16 q_counter, struct mlx5e_xsk_param *xsk, int node,
struct mlx5e_rq *rq); struct mlx5e_rq *rq);
#define MLX5E_RQ_WQES_TIMEOUT 20000 /* msecs */ #define MLX5E_RQ_WQES_TIMEOUT 20000 /* msecs */
int mlx5e_wait_for_min_rx_wqes(struct mlx5e_rq *rq, int wait_time); int mlx5e_wait_for_min_rx_wqes(struct mlx5e_rq *rq, int wait_time);
void mlx5e_close_rq(struct mlx5e_rq *rq); void mlx5e_close_rq(struct mlx5e_rq *rq);
int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param, u16 q_counter); int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param);
void mlx5e_destroy_rq(struct mlx5e_rq *rq); void mlx5e_destroy_rq(struct mlx5e_rq *rq);
struct mlx5e_sq_param; struct mlx5e_sq_param;
...@@ -1126,10 +1122,9 @@ static inline bool mlx5_tx_swp_supported(struct mlx5_core_dev *mdev) ...@@ -1126,10 +1122,9 @@ static inline bool mlx5_tx_swp_supported(struct mlx5_core_dev *mdev)
} }
extern const struct ethtool_ops mlx5e_ethtool_ops; extern const struct ethtool_ops mlx5e_ethtool_ops;
extern const struct mlx5e_profile mlx5e_mgmt_pf_nic_profile;
int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, u32 *mkey); int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, u32 *mkey);
int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev, bool create_tises); int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev);
void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev); void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev);
int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb, int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb,
bool enable_mc_lb); bool enable_mc_lb);
...@@ -1232,8 +1227,6 @@ netdev_features_t mlx5e_features_check(struct sk_buff *skb, ...@@ -1232,8 +1227,6 @@ netdev_features_t mlx5e_features_check(struct sk_buff *skb,
struct net_device *netdev, struct net_device *netdev,
netdev_features_t features); netdev_features_t features);
int mlx5e_set_features(struct net_device *netdev, netdev_features_t features); int mlx5e_set_features(struct net_device *netdev, netdev_features_t features);
void mlx5e_nic_set_rx_mode(struct mlx5e_priv *priv);
#ifdef CONFIG_MLX5_ESWITCH #ifdef CONFIG_MLX5_ESWITCH
int mlx5e_set_vf_mac(struct net_device *dev, int vf, u8 *mac); int mlx5e_set_vf_mac(struct net_device *dev, int vf, u8 *mac);
int mlx5e_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate, int max_tx_rate); int mlx5e_set_vf_rate(struct net_device *dev, int vf, int min_tx_rate, int max_tx_rate);
......
...@@ -23,26 +23,20 @@ bool mlx5e_channels_is_xsk(struct mlx5e_channels *chs, unsigned int ix) ...@@ -23,26 +23,20 @@ bool mlx5e_channels_is_xsk(struct mlx5e_channels *chs, unsigned int ix)
return test_bit(MLX5E_CHANNEL_STATE_XSK, c->state); return test_bit(MLX5E_CHANNEL_STATE_XSK, c->state);
} }
void mlx5e_channels_get_regular_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn, void mlx5e_channels_get_regular_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn)
u32 *vhca_id)
{ {
struct mlx5e_channel *c = mlx5e_channels_get(chs, ix); struct mlx5e_channel *c = mlx5e_channels_get(chs, ix);
*rqn = c->rq.rqn; *rqn = c->rq.rqn;
if (vhca_id)
*vhca_id = MLX5_CAP_GEN(c->mdev, vhca_id);
} }
void mlx5e_channels_get_xsk_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn, void mlx5e_channels_get_xsk_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn)
u32 *vhca_id)
{ {
struct mlx5e_channel *c = mlx5e_channels_get(chs, ix); struct mlx5e_channel *c = mlx5e_channels_get(chs, ix);
WARN_ON_ONCE(!test_bit(MLX5E_CHANNEL_STATE_XSK, c->state)); WARN_ON_ONCE(!test_bit(MLX5E_CHANNEL_STATE_XSK, c->state));
*rqn = c->xskrq.rqn; *rqn = c->xskrq.rqn;
if (vhca_id)
*vhca_id = MLX5_CAP_GEN(c->mdev, vhca_id);
} }
bool mlx5e_channels_get_ptp_rqn(struct mlx5e_channels *chs, u32 *rqn) bool mlx5e_channels_get_ptp_rqn(struct mlx5e_channels *chs, u32 *rqn)
......
...@@ -10,10 +10,8 @@ struct mlx5e_channels; ...@@ -10,10 +10,8 @@ struct mlx5e_channels;
unsigned int mlx5e_channels_get_num(struct mlx5e_channels *chs); unsigned int mlx5e_channels_get_num(struct mlx5e_channels *chs);
bool mlx5e_channels_is_xsk(struct mlx5e_channels *chs, unsigned int ix); bool mlx5e_channels_is_xsk(struct mlx5e_channels *chs, unsigned int ix);
void mlx5e_channels_get_regular_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn, void mlx5e_channels_get_regular_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn);
u32 *vhca_id); void mlx5e_channels_get_xsk_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn);
void mlx5e_channels_get_xsk_rqn(struct mlx5e_channels *chs, unsigned int ix, u32 *rqn,
u32 *vhca_id);
bool mlx5e_channels_get_ptp_rqn(struct mlx5e_channels *chs, u32 *rqn); bool mlx5e_channels_get_ptp_rqn(struct mlx5e_channels *chs, u32 *rqn);
#endif /* __MLX5_EN_CHANNELS_H__ */ #endif /* __MLX5_EN_CHANNELS_H__ */
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
// Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
#include <linux/kernel.h>
#include "en/params.h"
#include "en/health.h"
#include "lib/eq.h"
#include "en/dcbnl.h"
#include "en_accel/ipsec.h"
#include "en_accel/en_accel.h"
#include "en/trap.h"
#include "en/monitor_stats.h"
#include "en/hv_vhca_stats.h"
#include "en_rep.h"
#include "en.h"
static int mgmt_pf_async_event(struct notifier_block *nb, unsigned long event, void *data)
{
struct mlx5e_priv *priv = container_of(nb, struct mlx5e_priv, events_nb);
struct mlx5_eqe *eqe = data;
if (event != MLX5_EVENT_TYPE_PORT_CHANGE)
return NOTIFY_DONE;
switch (eqe->sub_type) {
case MLX5_PORT_CHANGE_SUBTYPE_DOWN:
case MLX5_PORT_CHANGE_SUBTYPE_ACTIVE:
queue_work(priv->wq, &priv->update_carrier_work);
break;
default:
return NOTIFY_DONE;
}
return NOTIFY_OK;
}
static void mlx5e_mgmt_pf_enable_async_events(struct mlx5e_priv *priv)
{
priv->events_nb.notifier_call = mgmt_pf_async_event;
mlx5_notifier_register(priv->mdev, &priv->events_nb);
}
static void mlx5e_disable_mgmt_pf_async_events(struct mlx5e_priv *priv)
{
mlx5_notifier_unregister(priv->mdev, &priv->events_nb);
}
static void mlx5e_modify_mgmt_pf_admin_state(struct mlx5_core_dev *mdev,
enum mlx5_port_status state)
{
struct mlx5_eswitch *esw = mdev->priv.eswitch;
int vport_admin_state;
mlx5_set_port_admin_status(mdev, state);
if (state == MLX5_PORT_UP)
vport_admin_state = MLX5_VPORT_ADMIN_STATE_AUTO;
else
vport_admin_state = MLX5_VPORT_ADMIN_STATE_DOWN;
mlx5_eswitch_set_vport_state(esw, MLX5_VPORT_UPLINK, vport_admin_state);
}
static void mlx5e_build_mgmt_pf_nic_params(struct mlx5e_priv *priv, u16 mtu)
{
struct mlx5e_params *params = &priv->channels.params;
struct mlx5_core_dev *mdev = priv->mdev;
u8 rx_cq_period_mode;
params->sw_mtu = mtu;
params->hard_mtu = MLX5E_ETH_HARD_MTU;
params->num_channels = 1;
/* SQ */
params->log_sq_size = is_kdump_kernel() ?
MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE :
MLX5E_PARAMS_DEFAULT_LOG_SQ_SIZE;
MLX5E_SET_PFLAG(params, MLX5E_PFLAG_SKB_TX_MPWQE, mlx5e_tx_mpwqe_supported(mdev));
MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_NO_CSUM_COMPLETE, false);
/* RQ */
mlx5e_build_rq_params(mdev, params);
/* CQ moderation params */
rx_cq_period_mode = MLX5_CAP_GEN(mdev, cq_period_start_from_cqe) ?
MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
params->tx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
mlx5e_set_rx_cq_mode_params(params, rx_cq_period_mode);
mlx5e_set_tx_cq_mode_params(params, MLX5_CQ_PERIOD_MODE_START_FROM_EQE);
/* TX inline */
mlx5_query_min_inline(mdev, &params->tx_min_inline_mode);
}
static int mlx5e_mgmt_pf_init(struct mlx5_core_dev *mdev,
struct net_device *netdev)
{
struct mlx5e_priv *priv = netdev_priv(netdev);
struct mlx5e_flow_steering *fs;
int err;
mlx5e_build_mgmt_pf_nic_params(priv, netdev->mtu);
mlx5e_timestamp_init(priv);
fs = mlx5e_fs_init(priv->profile, mdev,
!test_bit(MLX5E_STATE_DESTROYING, &priv->state),
priv->dfs_root);
if (!fs) {
err = -ENOMEM;
mlx5_core_err(mdev, "FS initialization failed, %d\n", err);
return err;
}
priv->fs = fs;
mlx5e_health_create_reporters(priv);
return 0;
}
static void mlx5e_mgmt_pf_cleanup(struct mlx5e_priv *priv)
{
mlx5e_health_destroy_reporters(priv);
mlx5e_fs_cleanup(priv->fs);
priv->fs = NULL;
}
static int mlx5e_mgmt_pf_init_rx(struct mlx5e_priv *priv)
{
struct mlx5_core_dev *mdev = priv->mdev;
int err;
priv->rx_res = mlx5e_rx_res_create(mdev, 0, priv->max_nch, priv->drop_rq.rqn,
&priv->channels.params.packet_merge,
priv->channels.params.num_channels);
if (!priv->rx_res)
return -ENOMEM;
mlx5e_create_q_counters(priv);
err = mlx5e_open_drop_rq(priv, &priv->drop_rq);
if (err) {
mlx5_core_err(mdev, "open drop rq failed, %d\n", err);
goto err_destroy_q_counters;
}
err = mlx5e_create_flow_steering(priv->fs, priv->rx_res, priv->profile,
priv->netdev);
if (err) {
mlx5_core_warn(mdev, "create flow steering failed, %d\n", err);
goto err_destroy_rx_res;
}
return 0;
err_destroy_rx_res:
mlx5e_rx_res_destroy(priv->rx_res);
priv->rx_res = NULL;
mlx5e_close_drop_rq(&priv->drop_rq);
err_destroy_q_counters:
mlx5e_destroy_q_counters(priv);
return err;
}
static void mlx5e_mgmt_pf_cleanup_rx(struct mlx5e_priv *priv)
{
mlx5e_destroy_flow_steering(priv->fs, !!(priv->netdev->hw_features & NETIF_F_NTUPLE),
priv->profile);
mlx5e_rx_res_destroy(priv->rx_res);
priv->rx_res = NULL;
mlx5e_close_drop_rq(&priv->drop_rq);
mlx5e_destroy_q_counters(priv);
}
static int mlx5e_mgmt_pf_init_tx(struct mlx5e_priv *priv)
{
return 0;
}
static void mlx5e_mgmt_pf_cleanup_tx(struct mlx5e_priv *priv)
{
}
static void mlx5e_mgmt_pf_enable(struct mlx5e_priv *priv)
{
struct net_device *netdev = priv->netdev;
struct mlx5_core_dev *mdev = priv->mdev;
mlx5e_fs_init_l2_addr(priv->fs, netdev);
/* Marking the link as currently not needed by the Driver */
if (!netif_running(netdev))
mlx5e_modify_mgmt_pf_admin_state(mdev, MLX5_PORT_DOWN);
mlx5e_set_netdev_mtu_boundaries(priv);
mlx5e_set_dev_port_mtu(priv);
mlx5e_mgmt_pf_enable_async_events(priv);
if (mlx5e_monitor_counter_supported(priv))
mlx5e_monitor_counter_init(priv);
mlx5e_hv_vhca_stats_create(priv);
if (netdev->reg_state != NETREG_REGISTERED)
return;
mlx5e_dcbnl_init_app(priv);
mlx5e_nic_set_rx_mode(priv);
rtnl_lock();
if (netif_running(netdev))
mlx5e_open(netdev);
udp_tunnel_nic_reset_ntf(priv->netdev);
netif_device_attach(netdev);
rtnl_unlock();
}
static void mlx5e_mgmt_pf_disable(struct mlx5e_priv *priv)
{
if (priv->netdev->reg_state == NETREG_REGISTERED)
mlx5e_dcbnl_delete_app(priv);
rtnl_lock();
if (netif_running(priv->netdev))
mlx5e_close(priv->netdev);
netif_device_detach(priv->netdev);
rtnl_unlock();
mlx5e_nic_set_rx_mode(priv);
mlx5e_hv_vhca_stats_destroy(priv);
if (mlx5e_monitor_counter_supported(priv))
mlx5e_monitor_counter_cleanup(priv);
mlx5e_disable_mgmt_pf_async_events(priv);
mlx5e_ipsec_cleanup(priv);
}
static int mlx5e_mgmt_pf_update_rx(struct mlx5e_priv *priv)
{
return mlx5e_refresh_tirs(priv, false, false);
}
static int mlx5e_mgmt_pf_max_nch_limit(struct mlx5_core_dev *mdev)
{
return 1;
}
const struct mlx5e_profile mlx5e_mgmt_pf_nic_profile = {
.init = mlx5e_mgmt_pf_init,
.cleanup = mlx5e_mgmt_pf_cleanup,
.init_rx = mlx5e_mgmt_pf_init_rx,
.cleanup_rx = mlx5e_mgmt_pf_cleanup_rx,
.init_tx = mlx5e_mgmt_pf_init_tx,
.cleanup_tx = mlx5e_mgmt_pf_cleanup_tx,
.enable = mlx5e_mgmt_pf_enable,
.disable = mlx5e_mgmt_pf_disable,
.update_rx = mlx5e_mgmt_pf_update_rx,
.update_stats = mlx5e_stats_update_ndo_stats,
.update_carrier = mlx5e_update_carrier,
.rx_handlers = &mlx5e_rx_handlers_nic,
.max_tc = 1,
.max_nch_limit = mlx5e_mgmt_pf_max_nch_limit,
.stats_grps = mlx5e_nic_stats_grps,
.stats_grps_num = mlx5e_nic_stats_grps_num
};
...@@ -20,8 +20,10 @@ ...@@ -20,8 +20,10 @@
#define NUM_REQ_PPCNT_COUNTER_S1 MLX5_CMD_SET_MONITOR_NUM_PPCNT_COUNTER_SET1 #define NUM_REQ_PPCNT_COUNTER_S1 MLX5_CMD_SET_MONITOR_NUM_PPCNT_COUNTER_SET1
#define NUM_REQ_Q_COUNTERS_S1 MLX5_CMD_SET_MONITOR_NUM_Q_COUNTERS_SET1 #define NUM_REQ_Q_COUNTERS_S1 MLX5_CMD_SET_MONITOR_NUM_Q_COUNTERS_SET1
static int mlx5e_monitor_counter_cap(struct mlx5_core_dev *mdev) int mlx5e_monitor_counter_supported(struct mlx5e_priv *priv)
{ {
struct mlx5_core_dev *mdev = priv->mdev;
if (!MLX5_CAP_GEN(mdev, max_num_of_monitor_counters)) if (!MLX5_CAP_GEN(mdev, max_num_of_monitor_counters))
return false; return false;
if (MLX5_CAP_PCAM_REG(mdev, ppcnt) && if (MLX5_CAP_PCAM_REG(mdev, ppcnt) &&
...@@ -34,38 +36,24 @@ static int mlx5e_monitor_counter_cap(struct mlx5_core_dev *mdev) ...@@ -34,38 +36,24 @@ static int mlx5e_monitor_counter_cap(struct mlx5_core_dev *mdev)
return true; return true;
} }
int mlx5e_monitor_counter_supported(struct mlx5e_priv *priv) static void mlx5e_monitor_counter_arm(struct mlx5e_priv *priv)
{
struct mlx5_core_dev *pos;
int i;
mlx5_sd_for_each_dev(i, priv->mdev, pos)
if (!mlx5e_monitor_counter_cap(pos))
return false;
return true;
}
static void mlx5e_monitor_counter_arm(struct mlx5_core_dev *mdev)
{ {
u32 in[MLX5_ST_SZ_DW(arm_monitor_counter_in)] = {}; u32 in[MLX5_ST_SZ_DW(arm_monitor_counter_in)] = {};
MLX5_SET(arm_monitor_counter_in, in, opcode, MLX5_SET(arm_monitor_counter_in, in, opcode,
MLX5_CMD_OP_ARM_MONITOR_COUNTER); MLX5_CMD_OP_ARM_MONITOR_COUNTER);
mlx5_cmd_exec_in(mdev, arm_monitor_counter, in); mlx5_cmd_exec_in(priv->mdev, arm_monitor_counter, in);
} }
static void mlx5e_monitor_counters_work(struct work_struct *work) static void mlx5e_monitor_counters_work(struct work_struct *work)
{ {
struct mlx5e_priv *priv = container_of(work, struct mlx5e_priv, struct mlx5e_priv *priv = container_of(work, struct mlx5e_priv,
monitor_counters_work); monitor_counters_work);
struct mlx5_core_dev *pos;
int i;
mutex_lock(&priv->state_lock); mutex_lock(&priv->state_lock);
mlx5e_stats_update_ndo_stats(priv); mlx5e_stats_update_ndo_stats(priv);
mutex_unlock(&priv->state_lock); mutex_unlock(&priv->state_lock);
mlx5_sd_for_each_dev(i, priv->mdev, pos) mlx5e_monitor_counter_arm(priv);
mlx5e_monitor_counter_arm(pos);
} }
static int mlx5e_monitor_event_handler(struct notifier_block *nb, static int mlx5e_monitor_event_handler(struct notifier_block *nb,
...@@ -109,13 +97,15 @@ static int fill_monitor_counter_q_counter_set1(int cnt, int q_counter, u32 *in) ...@@ -109,13 +97,15 @@ static int fill_monitor_counter_q_counter_set1(int cnt, int q_counter, u32 *in)
} }
/* check if mlx5e_monitor_counter_supported before calling this function*/ /* check if mlx5e_monitor_counter_supported before calling this function*/
static void mlx5e_set_monitor_counter(struct mlx5_core_dev *mdev, int q_counter) static void mlx5e_set_monitor_counter(struct mlx5e_priv *priv)
{ {
struct mlx5_core_dev *mdev = priv->mdev;
int max_num_of_counters = MLX5_CAP_GEN(mdev, max_num_of_monitor_counters); int max_num_of_counters = MLX5_CAP_GEN(mdev, max_num_of_monitor_counters);
int num_q_counters = MLX5_CAP_GEN(mdev, num_q_monitor_counters); int num_q_counters = MLX5_CAP_GEN(mdev, num_q_monitor_counters);
int num_ppcnt_counters = !MLX5_CAP_PCAM_REG(mdev, ppcnt) ? 0 : int num_ppcnt_counters = !MLX5_CAP_PCAM_REG(mdev, ppcnt) ? 0 :
MLX5_CAP_GEN(mdev, num_ppcnt_monitor_counters); MLX5_CAP_GEN(mdev, num_ppcnt_monitor_counters);
u32 in[MLX5_ST_SZ_DW(set_monitor_counter_in)] = {}; u32 in[MLX5_ST_SZ_DW(set_monitor_counter_in)] = {};
int q_counter = priv->q_counter;
int cnt = 0; int cnt = 0;
if (num_ppcnt_counters >= NUM_REQ_PPCNT_COUNTER_S1 && if (num_ppcnt_counters >= NUM_REQ_PPCNT_COUNTER_S1 &&
...@@ -137,17 +127,13 @@ static void mlx5e_set_monitor_counter(struct mlx5_core_dev *mdev, int q_counter) ...@@ -137,17 +127,13 @@ static void mlx5e_set_monitor_counter(struct mlx5_core_dev *mdev, int q_counter)
/* check if mlx5e_monitor_counter_supported before calling this function*/ /* check if mlx5e_monitor_counter_supported before calling this function*/
void mlx5e_monitor_counter_init(struct mlx5e_priv *priv) void mlx5e_monitor_counter_init(struct mlx5e_priv *priv)
{ {
struct mlx5_core_dev *pos;
int i;
INIT_WORK(&priv->monitor_counters_work, mlx5e_monitor_counters_work); INIT_WORK(&priv->monitor_counters_work, mlx5e_monitor_counters_work);
MLX5_NB_INIT(&priv->monitor_counters_nb, mlx5e_monitor_event_handler, MLX5_NB_INIT(&priv->monitor_counters_nb, mlx5e_monitor_event_handler,
MONITOR_COUNTER); MONITOR_COUNTER);
mlx5_sd_for_each_dev(i, priv->mdev, pos) { mlx5_eq_notifier_register(priv->mdev, &priv->monitor_counters_nb);
mlx5_eq_notifier_register(pos, &priv->monitor_counters_nb);
mlx5e_set_monitor_counter(pos, priv->q_counter[i]); mlx5e_set_monitor_counter(priv);
mlx5e_monitor_counter_arm(pos); mlx5e_monitor_counter_arm(priv);
}
queue_work(priv->wq, &priv->update_stats_work); queue_work(priv->wq, &priv->update_stats_work);
} }
...@@ -155,15 +141,11 @@ void mlx5e_monitor_counter_init(struct mlx5e_priv *priv) ...@@ -155,15 +141,11 @@ void mlx5e_monitor_counter_init(struct mlx5e_priv *priv)
void mlx5e_monitor_counter_cleanup(struct mlx5e_priv *priv) void mlx5e_monitor_counter_cleanup(struct mlx5e_priv *priv)
{ {
u32 in[MLX5_ST_SZ_DW(set_monitor_counter_in)] = {}; u32 in[MLX5_ST_SZ_DW(set_monitor_counter_in)] = {};
struct mlx5_core_dev *pos;
int i;
MLX5_SET(set_monitor_counter_in, in, opcode, MLX5_SET(set_monitor_counter_in, in, opcode,
MLX5_CMD_OP_SET_MONITOR_COUNTER); MLX5_CMD_OP_SET_MONITOR_COUNTER);
mlx5_sd_for_each_dev(i, priv->mdev, pos) { mlx5_cmd_exec_in(priv->mdev, set_monitor_counter, in);
mlx5_cmd_exec_in(pos, set_monitor_counter, in); mlx5_eq_notifier_unregister(priv->mdev, &priv->monitor_counters_nb);
mlx5_eq_notifier_unregister(pos, &priv->monitor_counters_nb);
}
cancel_work_sync(&priv->monitor_counters_work); cancel_work_sync(&priv->monitor_counters_work);
} }
...@@ -674,7 +674,7 @@ void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e ...@@ -674,7 +674,7 @@ void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e
.napi = &c->napi, .napi = &c->napi,
.ch_stats = c->stats, .ch_stats = c->stats,
.node = cpu_to_node(c->cpu), .node = cpu_to_node(c->cpu),
.ix = c->vec_ix, .ix = c->ix,
}; };
} }
...@@ -945,6 +945,7 @@ static u8 rq_end_pad_mode(struct mlx5_core_dev *mdev, struct mlx5e_params *param ...@@ -945,6 +945,7 @@ static u8 rq_end_pad_mode(struct mlx5_core_dev *mdev, struct mlx5e_params *param
int mlx5e_build_rq_param(struct mlx5_core_dev *mdev, int mlx5e_build_rq_param(struct mlx5_core_dev *mdev,
struct mlx5e_params *params, struct mlx5e_params *params,
struct mlx5e_xsk_param *xsk, struct mlx5e_xsk_param *xsk,
u16 q_counter,
struct mlx5e_rq_param *param) struct mlx5e_rq_param *param)
{ {
void *rqc = param->rqc; void *rqc = param->rqc;
...@@ -1006,6 +1007,7 @@ int mlx5e_build_rq_param(struct mlx5_core_dev *mdev, ...@@ -1006,6 +1007,7 @@ int mlx5e_build_rq_param(struct mlx5_core_dev *mdev,
MLX5_SET(wq, wq, log_wq_stride, MLX5_SET(wq, wq, log_wq_stride,
mlx5e_get_rqwq_log_stride(params->rq_wq_type, ndsegs)); mlx5e_get_rqwq_log_stride(params->rq_wq_type, ndsegs));
MLX5_SET(wq, wq, pd, mdev->mlx5e_res.hw_objs.pdn); MLX5_SET(wq, wq, pd, mdev->mlx5e_res.hw_objs.pdn);
MLX5_SET(rqc, rqc, counter_set_id, q_counter);
MLX5_SET(rqc, rqc, vsd, params->vlan_strip_disable); MLX5_SET(rqc, rqc, vsd, params->vlan_strip_disable);
MLX5_SET(rqc, rqc, scatter_fcs, params->scatter_fcs_en); MLX5_SET(rqc, rqc, scatter_fcs, params->scatter_fcs_en);
...@@ -1016,6 +1018,7 @@ int mlx5e_build_rq_param(struct mlx5_core_dev *mdev, ...@@ -1016,6 +1018,7 @@ int mlx5e_build_rq_param(struct mlx5_core_dev *mdev,
} }
void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev, void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev,
u16 q_counter,
struct mlx5e_rq_param *param) struct mlx5e_rq_param *param)
{ {
void *rqc = param->rqc; void *rqc = param->rqc;
...@@ -1024,6 +1027,7 @@ void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev, ...@@ -1024,6 +1027,7 @@ void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev,
MLX5_SET(wq, wq, wq_type, MLX5_WQ_TYPE_CYCLIC); MLX5_SET(wq, wq, wq_type, MLX5_WQ_TYPE_CYCLIC);
MLX5_SET(wq, wq, log_wq_stride, MLX5_SET(wq, wq, log_wq_stride,
mlx5e_get_rqwq_log_stride(MLX5_WQ_TYPE_CYCLIC, 1)); mlx5e_get_rqwq_log_stride(MLX5_WQ_TYPE_CYCLIC, 1));
MLX5_SET(rqc, rqc, counter_set_id, q_counter);
param->wq.buf_numa_node = dev_to_node(mlx5_core_dma_dev(mdev)); param->wq.buf_numa_node = dev_to_node(mlx5_core_dma_dev(mdev));
} }
...@@ -1288,12 +1292,13 @@ void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev, ...@@ -1288,12 +1292,13 @@ void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
int mlx5e_build_channel_param(struct mlx5_core_dev *mdev, int mlx5e_build_channel_param(struct mlx5_core_dev *mdev,
struct mlx5e_params *params, struct mlx5e_params *params,
u16 q_counter,
struct mlx5e_channel_param *cparam) struct mlx5e_channel_param *cparam)
{ {
u8 icosq_log_wq_sz, async_icosq_log_wq_sz; u8 icosq_log_wq_sz, async_icosq_log_wq_sz;
int err; int err;
err = mlx5e_build_rq_param(mdev, params, NULL, &cparam->rq); err = mlx5e_build_rq_param(mdev, params, NULL, q_counter, &cparam->rq);
if (err) if (err)
return err; return err;
......
...@@ -130,8 +130,10 @@ void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e ...@@ -130,8 +130,10 @@ void mlx5e_build_create_cq_param(struct mlx5e_create_cq_param *ccp, struct mlx5e
int mlx5e_build_rq_param(struct mlx5_core_dev *mdev, int mlx5e_build_rq_param(struct mlx5_core_dev *mdev,
struct mlx5e_params *params, struct mlx5e_params *params,
struct mlx5e_xsk_param *xsk, struct mlx5e_xsk_param *xsk,
u16 q_counter,
struct mlx5e_rq_param *param); struct mlx5e_rq_param *param);
void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev, void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev,
u16 q_counter,
struct mlx5e_rq_param *param); struct mlx5e_rq_param *param);
void mlx5e_build_sq_param_common(struct mlx5_core_dev *mdev, void mlx5e_build_sq_param_common(struct mlx5_core_dev *mdev,
struct mlx5e_sq_param *param); struct mlx5e_sq_param *param);
...@@ -147,6 +149,7 @@ void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev, ...@@ -147,6 +149,7 @@ void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
struct mlx5e_sq_param *param); struct mlx5e_sq_param *param);
int mlx5e_build_channel_param(struct mlx5_core_dev *mdev, int mlx5e_build_channel_param(struct mlx5_core_dev *mdev,
struct mlx5e_params *params, struct mlx5e_params *params,
u16 q_counter,
struct mlx5e_channel_param *cparam); struct mlx5e_channel_param *cparam);
u16 mlx5e_calc_sq_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params); u16 mlx5e_calc_sq_stop_room(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
......
...@@ -646,6 +646,7 @@ static void mlx5e_ptp_build_sq_param(struct mlx5_core_dev *mdev, ...@@ -646,6 +646,7 @@ static void mlx5e_ptp_build_sq_param(struct mlx5_core_dev *mdev,
static void mlx5e_ptp_build_rq_param(struct mlx5_core_dev *mdev, static void mlx5e_ptp_build_rq_param(struct mlx5_core_dev *mdev,
struct net_device *netdev, struct net_device *netdev,
u16 q_counter,
struct mlx5e_ptp_params *ptp_params) struct mlx5e_ptp_params *ptp_params)
{ {
struct mlx5e_rq_param *rq_params = &ptp_params->rq_param; struct mlx5e_rq_param *rq_params = &ptp_params->rq_param;
...@@ -654,7 +655,7 @@ static void mlx5e_ptp_build_rq_param(struct mlx5_core_dev *mdev, ...@@ -654,7 +655,7 @@ static void mlx5e_ptp_build_rq_param(struct mlx5_core_dev *mdev,
params->rq_wq_type = MLX5_WQ_TYPE_CYCLIC; params->rq_wq_type = MLX5_WQ_TYPE_CYCLIC;
mlx5e_init_rq_type_params(mdev, params); mlx5e_init_rq_type_params(mdev, params);
params->sw_mtu = netdev->max_mtu; params->sw_mtu = netdev->max_mtu;
mlx5e_build_rq_param(mdev, params, NULL, rq_params); mlx5e_build_rq_param(mdev, params, NULL, q_counter, rq_params);
} }
static void mlx5e_ptp_build_params(struct mlx5e_ptp *c, static void mlx5e_ptp_build_params(struct mlx5e_ptp *c,
...@@ -680,7 +681,7 @@ static void mlx5e_ptp_build_params(struct mlx5e_ptp *c, ...@@ -680,7 +681,7 @@ static void mlx5e_ptp_build_params(struct mlx5e_ptp *c,
/* RQ */ /* RQ */
if (test_bit(MLX5E_PTP_STATE_RX, c->state)) { if (test_bit(MLX5E_PTP_STATE_RX, c->state)) {
params->vlan_strip_disable = orig->vlan_strip_disable; params->vlan_strip_disable = orig->vlan_strip_disable;
mlx5e_ptp_build_rq_param(c->mdev, c->netdev, cparams); mlx5e_ptp_build_rq_param(c->mdev, c->netdev, c->priv->q_counter, cparams);
} }
} }
...@@ -713,16 +714,13 @@ static int mlx5e_ptp_open_rq(struct mlx5e_ptp *c, struct mlx5e_params *params, ...@@ -713,16 +714,13 @@ static int mlx5e_ptp_open_rq(struct mlx5e_ptp *c, struct mlx5e_params *params,
struct mlx5e_rq_param *rq_param) struct mlx5e_rq_param *rq_param)
{ {
int node = dev_to_node(c->mdev->device); int node = dev_to_node(c->mdev->device);
int err, sd_ix; int err;
u16 q_counter;
err = mlx5e_init_ptp_rq(c, params, &c->rq); err = mlx5e_init_ptp_rq(c, params, &c->rq);
if (err) if (err)
return err; return err;
sd_ix = mlx5_sd_ch_ix_get_dev_ix(c->mdev, MLX5E_PTP_CHANNEL_IX); return mlx5e_open_rq(params, rq_param, NULL, node, &c->rq);
q_counter = c->priv->q_counter[sd_ix];
return mlx5e_open_rq(params, rq_param, NULL, node, q_counter, &c->rq);
} }
static int mlx5e_ptp_open_queues(struct mlx5e_ptp *c, static int mlx5e_ptp_open_queues(struct mlx5e_ptp *c,
......
...@@ -122,8 +122,8 @@ int mlx5e_open_qos_sq(struct mlx5e_priv *priv, struct mlx5e_channels *chs, ...@@ -122,8 +122,8 @@ int mlx5e_open_qos_sq(struct mlx5e_priv *priv, struct mlx5e_channels *chs,
memset(&param_sq, 0, sizeof(param_sq)); memset(&param_sq, 0, sizeof(param_sq));
memset(&param_cq, 0, sizeof(param_cq)); memset(&param_cq, 0, sizeof(param_cq));
mlx5e_build_sq_param(c->mdev, params, &param_sq); mlx5e_build_sq_param(priv->mdev, params, &param_sq);
mlx5e_build_tx_cq_param(c->mdev, params, &param_cq); mlx5e_build_tx_cq_param(priv->mdev, params, &param_cq);
err = mlx5e_open_cq(c->mdev, params->tx_cq_moderation, &param_cq, &ccp, &sq->cq); err = mlx5e_open_cq(c->mdev, params->tx_cq_moderation, &param_cq, &ccp, &sq->cq);
if (err) if (err)
goto err_free_sq; goto err_free_sq;
...@@ -176,7 +176,7 @@ int mlx5e_activate_qos_sq(void *data, u16 node_qid, u32 hw_id) ...@@ -176,7 +176,7 @@ int mlx5e_activate_qos_sq(void *data, u16 node_qid, u32 hw_id)
*/ */
smp_wmb(); smp_wmb();
qos_dbg(sq->mdev, "Activate QoS SQ qid %u\n", node_qid); qos_dbg(priv->mdev, "Activate QoS SQ qid %u\n", node_qid);
mlx5e_activate_txqsq(sq); mlx5e_activate_txqsq(sq);
return 0; return 0;
...@@ -190,7 +190,7 @@ void mlx5e_deactivate_qos_sq(struct mlx5e_priv *priv, u16 qid) ...@@ -190,7 +190,7 @@ void mlx5e_deactivate_qos_sq(struct mlx5e_priv *priv, u16 qid)
if (!sq) /* Handle the case when the SQ failed to open. */ if (!sq) /* Handle the case when the SQ failed to open. */
return; return;
qos_dbg(sq->mdev, "Deactivate QoS SQ qid %u\n", qid); qos_dbg(priv->mdev, "Deactivate QoS SQ qid %u\n", qid);
mlx5e_deactivate_txqsq(sq); mlx5e_deactivate_txqsq(sq);
priv->txq2sq[mlx5e_qid_from_qos(&priv->channels, qid)] = NULL; priv->txq2sq[mlx5e_qid_from_qos(&priv->channels, qid)] = NULL;
......
...@@ -294,8 +294,8 @@ static void mlx5e_rx_reporter_diagnose_generic_rq(struct mlx5e_rq *rq, ...@@ -294,8 +294,8 @@ static void mlx5e_rx_reporter_diagnose_generic_rq(struct mlx5e_rq *rq,
params = &priv->channels.params; params = &priv->channels.params;
rq_sz = mlx5e_rqwq_get_size(rq); rq_sz = mlx5e_rqwq_get_size(rq);
real_time = mlx5_is_real_time_rq(rq->mdev); real_time = mlx5_is_real_time_rq(priv->mdev);
rq_stride = BIT(mlx5e_mpwqe_get_log_stride_size(rq->mdev, params, NULL)); rq_stride = BIT(mlx5e_mpwqe_get_log_stride_size(priv->mdev, params, NULL));
mlx5e_health_fmsg_named_obj_nest_start(fmsg, "RQ"); mlx5e_health_fmsg_named_obj_nest_start(fmsg, "RQ");
devlink_fmsg_u8_pair_put(fmsg, "type", params->rq_wq_type); devlink_fmsg_u8_pair_put(fmsg, "type", params->rq_wq_type);
......
...@@ -219,6 +219,7 @@ mlx5e_tx_reporter_build_diagnose_output_sq_common(struct devlink_fmsg *fmsg, ...@@ -219,6 +219,7 @@ mlx5e_tx_reporter_build_diagnose_output_sq_common(struct devlink_fmsg *fmsg,
struct mlx5e_txqsq *sq, int tc) struct mlx5e_txqsq *sq, int tc)
{ {
bool stopped = netif_xmit_stopped(sq->txq); bool stopped = netif_xmit_stopped(sq->txq);
struct mlx5e_priv *priv = sq->priv;
u8 state; u8 state;
int err; int err;
...@@ -226,7 +227,7 @@ mlx5e_tx_reporter_build_diagnose_output_sq_common(struct devlink_fmsg *fmsg, ...@@ -226,7 +227,7 @@ mlx5e_tx_reporter_build_diagnose_output_sq_common(struct devlink_fmsg *fmsg,
devlink_fmsg_u32_pair_put(fmsg, "txq ix", sq->txq_ix); devlink_fmsg_u32_pair_put(fmsg, "txq ix", sq->txq_ix);
devlink_fmsg_u32_pair_put(fmsg, "sqn", sq->sqn); devlink_fmsg_u32_pair_put(fmsg, "sqn", sq->sqn);
err = mlx5_core_query_sq_state(sq->mdev, sq->sqn, &state); err = mlx5_core_query_sq_state(priv->mdev, sq->sqn, &state);
if (!err) if (!err)
devlink_fmsg_u8_pair_put(fmsg, "HW state", state); devlink_fmsg_u8_pair_put(fmsg, "HW state", state);
......
...@@ -4,33 +4,6 @@ ...@@ -4,33 +4,6 @@
#include "rqt.h" #include "rqt.h"
#include <linux/mlx5/transobj.h> #include <linux/mlx5/transobj.h>
static bool verify_num_vhca_ids(struct mlx5_core_dev *mdev, u32 *vhca_ids,
unsigned int size)
{
unsigned int max_num_vhca_id = MLX5_CAP_GEN_2(mdev, max_rqt_vhca_id);
int i;
/* Verify that all vhca_ids are in range [0, max_num_vhca_ids - 1] */
for (i = 0; i < size; i++)
if (vhca_ids[i] >= max_num_vhca_id)
return false;
return true;
}
static bool rqt_verify_vhca_ids(struct mlx5_core_dev *mdev, u32 *vhca_ids,
unsigned int size)
{
if (!vhca_ids)
return true;
if (!MLX5_CAP_GEN(mdev, cross_vhca_rqt))
return false;
if (!verify_num_vhca_ids(mdev, vhca_ids, size))
return false;
return true;
}
void mlx5e_rss_params_indir_init_uniform(struct mlx5e_rss_params_indir *indir, void mlx5e_rss_params_indir_init_uniform(struct mlx5e_rss_params_indir *indir,
unsigned int num_channels) unsigned int num_channels)
{ {
...@@ -40,38 +13,19 @@ void mlx5e_rss_params_indir_init_uniform(struct mlx5e_rss_params_indir *indir, ...@@ -40,38 +13,19 @@ void mlx5e_rss_params_indir_init_uniform(struct mlx5e_rss_params_indir *indir,
indir->table[i] = i % num_channels; indir->table[i] = i % num_channels;
} }
static void fill_rqn_list(void *rqtc, u32 *rqns, u32 *vhca_ids, unsigned int size)
{
unsigned int i;
if (vhca_ids) {
MLX5_SET(rqtc, rqtc, rq_vhca_id_format, 1);
for (i = 0; i < size; i++) {
MLX5_SET(rqtc, rqtc, rq_vhca[i].rq_num, rqns[i]);
MLX5_SET(rqtc, rqtc, rq_vhca[i].rq_vhca_id, vhca_ids[i]);
}
} else {
for (i = 0; i < size; i++)
MLX5_SET(rqtc, rqtc, rq_num[i], rqns[i]);
}
}
static int mlx5e_rqt_init(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev, static int mlx5e_rqt_init(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev,
u16 max_size, u32 *init_rqns, u32 *init_vhca_ids, u16 init_size) u16 max_size, u32 *init_rqns, u16 init_size)
{ {
int entry_sz;
void *rqtc; void *rqtc;
int inlen; int inlen;
int err; int err;
u32 *in; u32 *in;
int i;
if (!rqt_verify_vhca_ids(mdev, init_vhca_ids, init_size))
return -EOPNOTSUPP;
rqt->mdev = mdev; rqt->mdev = mdev;
rqt->size = max_size; rqt->size = max_size;
entry_sz = init_vhca_ids ? MLX5_ST_SZ_BYTES(rq_vhca) : MLX5_ST_SZ_BYTES(rq_num); inlen = MLX5_ST_SZ_BYTES(create_rqt_in) + sizeof(u32) * init_size;
inlen = MLX5_ST_SZ_BYTES(create_rqt_in) + entry_sz * init_size;
in = kvzalloc(inlen, GFP_KERNEL); in = kvzalloc(inlen, GFP_KERNEL);
if (!in) if (!in)
return -ENOMEM; return -ENOMEM;
...@@ -79,9 +33,10 @@ static int mlx5e_rqt_init(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev, ...@@ -79,9 +33,10 @@ static int mlx5e_rqt_init(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev,
rqtc = MLX5_ADDR_OF(create_rqt_in, in, rqt_context); rqtc = MLX5_ADDR_OF(create_rqt_in, in, rqt_context);
MLX5_SET(rqtc, rqtc, rqt_max_size, rqt->size); MLX5_SET(rqtc, rqtc, rqt_max_size, rqt->size);
MLX5_SET(rqtc, rqtc, rqt_actual_size, init_size);
fill_rqn_list(rqtc, init_rqns, init_vhca_ids, init_size); MLX5_SET(rqtc, rqtc, rqt_actual_size, init_size);
for (i = 0; i < init_size; i++)
MLX5_SET(rqtc, rqtc, rq_num[i], init_rqns[i]);
err = mlx5_core_create_rqt(rqt->mdev, in, inlen, &rqt->rqtn); err = mlx5_core_create_rqt(rqt->mdev, in, inlen, &rqt->rqtn);
...@@ -94,7 +49,7 @@ int mlx5e_rqt_init_direct(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev, ...@@ -94,7 +49,7 @@ int mlx5e_rqt_init_direct(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev,
{ {
u16 max_size = indir_enabled ? indir_table_size : 1; u16 max_size = indir_enabled ? indir_table_size : 1;
return mlx5e_rqt_init(rqt, mdev, max_size, &init_rqn, NULL, 1); return mlx5e_rqt_init(rqt, mdev, max_size, &init_rqn, 1);
} }
static int mlx5e_bits_invert(unsigned long a, int size) static int mlx5e_bits_invert(unsigned long a, int size)
...@@ -108,8 +63,7 @@ static int mlx5e_bits_invert(unsigned long a, int size) ...@@ -108,8 +63,7 @@ static int mlx5e_bits_invert(unsigned long a, int size)
return inv; return inv;
} }
static int mlx5e_calc_indir_rqns(u32 *rss_rqns, u32 *rqns, u32 *rss_vhca_ids, u32 *vhca_ids, static int mlx5e_calc_indir_rqns(u32 *rss_rqns, u32 *rqns, unsigned int num_rqns,
unsigned int num_rqns,
u8 hfunc, struct mlx5e_rss_params_indir *indir) u8 hfunc, struct mlx5e_rss_params_indir *indir)
{ {
unsigned int i; unsigned int i;
...@@ -128,42 +82,30 @@ static int mlx5e_calc_indir_rqns(u32 *rss_rqns, u32 *rqns, u32 *rss_vhca_ids, u3 ...@@ -128,42 +82,30 @@ static int mlx5e_calc_indir_rqns(u32 *rss_rqns, u32 *rqns, u32 *rss_vhca_ids, u3
*/ */
return -EINVAL; return -EINVAL;
rss_rqns[i] = rqns[ix]; rss_rqns[i] = rqns[ix];
if (vhca_ids)
rss_vhca_ids[i] = vhca_ids[ix];
} }
return 0; return 0;
} }
int mlx5e_rqt_init_indir(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev, int mlx5e_rqt_init_indir(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev,
u32 *rqns, u32 *vhca_ids, unsigned int num_rqns, u32 *rqns, unsigned int num_rqns,
u8 hfunc, struct mlx5e_rss_params_indir *indir) u8 hfunc, struct mlx5e_rss_params_indir *indir)
{ {
u32 *rss_rqns, *rss_vhca_ids = NULL; u32 *rss_rqns;
int err; int err;
rss_rqns = kvmalloc_array(indir->actual_table_size, sizeof(*rss_rqns), GFP_KERNEL); rss_rqns = kvmalloc_array(indir->actual_table_size, sizeof(*rss_rqns), GFP_KERNEL);
if (!rss_rqns) if (!rss_rqns)
return -ENOMEM; return -ENOMEM;
if (vhca_ids) { err = mlx5e_calc_indir_rqns(rss_rqns, rqns, num_rqns, hfunc, indir);
rss_vhca_ids = kvmalloc_array(indir->actual_table_size, sizeof(*rss_vhca_ids),
GFP_KERNEL);
if (!rss_vhca_ids) {
kvfree(rss_rqns);
return -ENOMEM;
}
}
err = mlx5e_calc_indir_rqns(rss_rqns, rqns, rss_vhca_ids, vhca_ids, num_rqns, hfunc, indir);
if (err) if (err)
goto out; goto out;
err = mlx5e_rqt_init(rqt, mdev, indir->max_table_size, rss_rqns, rss_vhca_ids, err = mlx5e_rqt_init(rqt, mdev, indir->max_table_size, rss_rqns,
indir->actual_table_size); indir->actual_table_size);
out: out:
kvfree(rss_vhca_ids);
kvfree(rss_rqns); kvfree(rss_rqns);
return err; return err;
} }
...@@ -184,20 +126,15 @@ void mlx5e_rqt_destroy(struct mlx5e_rqt *rqt) ...@@ -184,20 +126,15 @@ void mlx5e_rqt_destroy(struct mlx5e_rqt *rqt)
mlx5_core_destroy_rqt(rqt->mdev, rqt->rqtn); mlx5_core_destroy_rqt(rqt->mdev, rqt->rqtn);
} }
static int mlx5e_rqt_redirect(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids, static int mlx5e_rqt_redirect(struct mlx5e_rqt *rqt, u32 *rqns, unsigned int size)
unsigned int size)
{ {
int entry_sz; unsigned int i;
void *rqtc; void *rqtc;
int inlen; int inlen;
u32 *in; u32 *in;
int err; int err;
if (!rqt_verify_vhca_ids(rqt->mdev, vhca_ids, size)) inlen = MLX5_ST_SZ_BYTES(modify_rqt_in) + sizeof(u32) * size;
return -EINVAL;
entry_sz = vhca_ids ? MLX5_ST_SZ_BYTES(rq_vhca) : MLX5_ST_SZ_BYTES(rq_num);
inlen = MLX5_ST_SZ_BYTES(modify_rqt_in) + entry_sz * size;
in = kvzalloc(inlen, GFP_KERNEL); in = kvzalloc(inlen, GFP_KERNEL);
if (!in) if (!in)
return -ENOMEM; return -ENOMEM;
...@@ -206,8 +143,8 @@ static int mlx5e_rqt_redirect(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids, ...@@ -206,8 +143,8 @@ static int mlx5e_rqt_redirect(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids,
MLX5_SET(modify_rqt_in, in, bitmask.rqn_list, 1); MLX5_SET(modify_rqt_in, in, bitmask.rqn_list, 1);
MLX5_SET(rqtc, rqtc, rqt_actual_size, size); MLX5_SET(rqtc, rqtc, rqt_actual_size, size);
for (i = 0; i < size; i++)
fill_rqn_list(rqtc, rqns, vhca_ids, size); MLX5_SET(rqtc, rqtc, rq_num[i], rqns[i]);
err = mlx5_core_modify_rqt(rqt->mdev, rqt->rqtn, in, inlen); err = mlx5_core_modify_rqt(rqt->mdev, rqt->rqtn, in, inlen);
...@@ -215,21 +152,17 @@ static int mlx5e_rqt_redirect(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids, ...@@ -215,21 +152,17 @@ static int mlx5e_rqt_redirect(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids,
return err; return err;
} }
int mlx5e_rqt_redirect_direct(struct mlx5e_rqt *rqt, u32 rqn, u32 *vhca_id) int mlx5e_rqt_redirect_direct(struct mlx5e_rqt *rqt, u32 rqn)
{ {
return mlx5e_rqt_redirect(rqt, &rqn, vhca_id, 1); return mlx5e_rqt_redirect(rqt, &rqn, 1);
} }
int mlx5e_rqt_redirect_indir(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids, int mlx5e_rqt_redirect_indir(struct mlx5e_rqt *rqt, u32 *rqns, unsigned int num_rqns,
unsigned int num_rqns,
u8 hfunc, struct mlx5e_rss_params_indir *indir) u8 hfunc, struct mlx5e_rss_params_indir *indir)
{ {
u32 *rss_rqns, *rss_vhca_ids = NULL; u32 *rss_rqns;
int err; int err;
if (!rqt_verify_vhca_ids(rqt->mdev, vhca_ids, num_rqns))
return -EINVAL;
if (WARN_ON(rqt->size != indir->max_table_size)) if (WARN_ON(rqt->size != indir->max_table_size))
return -EINVAL; return -EINVAL;
...@@ -237,23 +170,13 @@ int mlx5e_rqt_redirect_indir(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids, ...@@ -237,23 +170,13 @@ int mlx5e_rqt_redirect_indir(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids,
if (!rss_rqns) if (!rss_rqns)
return -ENOMEM; return -ENOMEM;
if (vhca_ids) { err = mlx5e_calc_indir_rqns(rss_rqns, rqns, num_rqns, hfunc, indir);
rss_vhca_ids = kvmalloc_array(indir->actual_table_size, sizeof(*rss_vhca_ids),
GFP_KERNEL);
if (!rss_vhca_ids) {
kvfree(rss_rqns);
return -ENOMEM;
}
}
err = mlx5e_calc_indir_rqns(rss_rqns, rqns, rss_vhca_ids, vhca_ids, num_rqns, hfunc, indir);
if (err) if (err)
goto out; goto out;
err = mlx5e_rqt_redirect(rqt, rss_rqns, rss_vhca_ids, indir->actual_table_size); err = mlx5e_rqt_redirect(rqt, rss_rqns, indir->actual_table_size);
out: out:
kvfree(rss_vhca_ids);
kvfree(rss_rqns); kvfree(rss_rqns);
return err; return err;
} }
...@@ -20,7 +20,7 @@ void mlx5e_rss_params_indir_init_uniform(struct mlx5e_rss_params_indir *indir, ...@@ -20,7 +20,7 @@ void mlx5e_rss_params_indir_init_uniform(struct mlx5e_rss_params_indir *indir,
unsigned int num_channels); unsigned int num_channels);
struct mlx5e_rqt { struct mlx5e_rqt {
struct mlx5_core_dev *mdev; /* primary */ struct mlx5_core_dev *mdev;
u32 rqtn; u32 rqtn;
u16 size; u16 size;
}; };
...@@ -28,7 +28,7 @@ struct mlx5e_rqt { ...@@ -28,7 +28,7 @@ struct mlx5e_rqt {
int mlx5e_rqt_init_direct(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev, int mlx5e_rqt_init_direct(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev,
bool indir_enabled, u32 init_rqn, u32 indir_table_size); bool indir_enabled, u32 init_rqn, u32 indir_table_size);
int mlx5e_rqt_init_indir(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev, int mlx5e_rqt_init_indir(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev,
u32 *rqns, u32 *vhca_ids, unsigned int num_rqns, u32 *rqns, unsigned int num_rqns,
u8 hfunc, struct mlx5e_rss_params_indir *indir); u8 hfunc, struct mlx5e_rss_params_indir *indir);
void mlx5e_rqt_destroy(struct mlx5e_rqt *rqt); void mlx5e_rqt_destroy(struct mlx5e_rqt *rqt);
...@@ -38,9 +38,8 @@ static inline u32 mlx5e_rqt_get_rqtn(struct mlx5e_rqt *rqt) ...@@ -38,9 +38,8 @@ static inline u32 mlx5e_rqt_get_rqtn(struct mlx5e_rqt *rqt)
} }
u32 mlx5e_rqt_size(struct mlx5_core_dev *mdev, unsigned int num_channels); u32 mlx5e_rqt_size(struct mlx5_core_dev *mdev, unsigned int num_channels);
int mlx5e_rqt_redirect_direct(struct mlx5e_rqt *rqt, u32 rqn, u32 *vhca_id); int mlx5e_rqt_redirect_direct(struct mlx5e_rqt *rqt, u32 rqn);
int mlx5e_rqt_redirect_indir(struct mlx5e_rqt *rqt, u32 *rqns, u32 *vhca_ids, int mlx5e_rqt_redirect_indir(struct mlx5e_rqt *rqt, u32 *rqns, unsigned int num_rqns,
unsigned int num_rqns,
u8 hfunc, struct mlx5e_rss_params_indir *indir); u8 hfunc, struct mlx5e_rss_params_indir *indir);
#endif /* __MLX5_EN_RQT_H__ */ #endif /* __MLX5_EN_RQT_H__ */
...@@ -74,7 +74,7 @@ struct mlx5e_rss { ...@@ -74,7 +74,7 @@ struct mlx5e_rss {
struct mlx5e_tir *tir[MLX5E_NUM_INDIR_TIRS]; struct mlx5e_tir *tir[MLX5E_NUM_INDIR_TIRS];
struct mlx5e_tir *inner_tir[MLX5E_NUM_INDIR_TIRS]; struct mlx5e_tir *inner_tir[MLX5E_NUM_INDIR_TIRS];
struct mlx5e_rqt rqt; struct mlx5e_rqt rqt;
struct mlx5_core_dev *mdev; /* primary */ struct mlx5_core_dev *mdev;
u32 drop_rqn; u32 drop_rqn;
bool inner_ft_support; bool inner_ft_support;
bool enabled; bool enabled;
...@@ -473,22 +473,21 @@ int mlx5e_rss_obtain_tirn(struct mlx5e_rss *rss, ...@@ -473,22 +473,21 @@ int mlx5e_rss_obtain_tirn(struct mlx5e_rss *rss,
return 0; return 0;
} }
static int mlx5e_rss_apply(struct mlx5e_rss *rss, u32 *rqns, u32 *vhca_ids, unsigned int num_rqns) static int mlx5e_rss_apply(struct mlx5e_rss *rss, u32 *rqns, unsigned int num_rqns)
{ {
int err; int err;
err = mlx5e_rqt_redirect_indir(&rss->rqt, rqns, vhca_ids, num_rqns, rss->hash.hfunc, err = mlx5e_rqt_redirect_indir(&rss->rqt, rqns, num_rqns, rss->hash.hfunc, &rss->indir);
&rss->indir);
if (err) if (err)
mlx5e_rss_warn(rss->mdev, "Failed to redirect RQT %#x to channels: err = %d\n", mlx5e_rss_warn(rss->mdev, "Failed to redirect RQT %#x to channels: err = %d\n",
mlx5e_rqt_get_rqtn(&rss->rqt), err); mlx5e_rqt_get_rqtn(&rss->rqt), err);
return err; return err;
} }
void mlx5e_rss_enable(struct mlx5e_rss *rss, u32 *rqns, u32 *vhca_ids, unsigned int num_rqns) void mlx5e_rss_enable(struct mlx5e_rss *rss, u32 *rqns, unsigned int num_rqns)
{ {
rss->enabled = true; rss->enabled = true;
mlx5e_rss_apply(rss, rqns, vhca_ids, num_rqns); mlx5e_rss_apply(rss, rqns, num_rqns);
} }
void mlx5e_rss_disable(struct mlx5e_rss *rss) void mlx5e_rss_disable(struct mlx5e_rss *rss)
...@@ -496,7 +495,7 @@ void mlx5e_rss_disable(struct mlx5e_rss *rss) ...@@ -496,7 +495,7 @@ void mlx5e_rss_disable(struct mlx5e_rss *rss)
int err; int err;
rss->enabled = false; rss->enabled = false;
err = mlx5e_rqt_redirect_direct(&rss->rqt, rss->drop_rqn, NULL); err = mlx5e_rqt_redirect_direct(&rss->rqt, rss->drop_rqn);
if (err) if (err)
mlx5e_rss_warn(rss->mdev, "Failed to redirect RQT %#x to drop RQ %#x: err = %d\n", mlx5e_rss_warn(rss->mdev, "Failed to redirect RQT %#x to drop RQ %#x: err = %d\n",
mlx5e_rqt_get_rqtn(&rss->rqt), rss->drop_rqn, err); mlx5e_rqt_get_rqtn(&rss->rqt), rss->drop_rqn, err);
...@@ -569,7 +568,7 @@ int mlx5e_rss_get_rxfh(struct mlx5e_rss *rss, u32 *indir, u8 *key, u8 *hfunc) ...@@ -569,7 +568,7 @@ int mlx5e_rss_get_rxfh(struct mlx5e_rss *rss, u32 *indir, u8 *key, u8 *hfunc)
int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir, int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir,
const u8 *key, const u8 *hfunc, const u8 *key, const u8 *hfunc,
u32 *rqns, u32 *vhca_ids, unsigned int num_rqns) u32 *rqns, unsigned int num_rqns)
{ {
bool changed_indir = false; bool changed_indir = false;
bool changed_hash = false; bool changed_hash = false;
...@@ -609,7 +608,7 @@ int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir, ...@@ -609,7 +608,7 @@ int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir,
} }
if (changed_indir && rss->enabled) { if (changed_indir && rss->enabled) {
err = mlx5e_rss_apply(rss, rqns, vhca_ids, num_rqns); err = mlx5e_rss_apply(rss, rqns, num_rqns);
if (err) { if (err) {
mlx5e_rss_copy(rss, old_rss); mlx5e_rss_copy(rss, old_rss);
goto out; goto out;
......
...@@ -39,7 +39,7 @@ int mlx5e_rss_obtain_tirn(struct mlx5e_rss *rss, ...@@ -39,7 +39,7 @@ int mlx5e_rss_obtain_tirn(struct mlx5e_rss *rss,
const struct mlx5e_packet_merge_param *init_pkt_merge_param, const struct mlx5e_packet_merge_param *init_pkt_merge_param,
bool inner, u32 *tirn); bool inner, u32 *tirn);
void mlx5e_rss_enable(struct mlx5e_rss *rss, u32 *rqns, u32 *vhca_ids, unsigned int num_rqns); void mlx5e_rss_enable(struct mlx5e_rss *rss, u32 *rqns, unsigned int num_rqns);
void mlx5e_rss_disable(struct mlx5e_rss *rss); void mlx5e_rss_disable(struct mlx5e_rss *rss);
int mlx5e_rss_packet_merge_set_param(struct mlx5e_rss *rss, int mlx5e_rss_packet_merge_set_param(struct mlx5e_rss *rss,
...@@ -47,7 +47,7 @@ int mlx5e_rss_packet_merge_set_param(struct mlx5e_rss *rss, ...@@ -47,7 +47,7 @@ int mlx5e_rss_packet_merge_set_param(struct mlx5e_rss *rss,
int mlx5e_rss_get_rxfh(struct mlx5e_rss *rss, u32 *indir, u8 *key, u8 *hfunc); int mlx5e_rss_get_rxfh(struct mlx5e_rss *rss, u32 *indir, u8 *key, u8 *hfunc);
int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir, int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir,
const u8 *key, const u8 *hfunc, const u8 *key, const u8 *hfunc,
u32 *rqns, u32 *vhca_ids, unsigned int num_rqns); u32 *rqns, unsigned int num_rqns);
struct mlx5e_rss_params_hash mlx5e_rss_get_hash(struct mlx5e_rss *rss); struct mlx5e_rss_params_hash mlx5e_rss_get_hash(struct mlx5e_rss *rss);
u8 mlx5e_rss_get_hash_fields(struct mlx5e_rss *rss, enum mlx5_traffic_types tt); u8 mlx5e_rss_get_hash_fields(struct mlx5e_rss *rss, enum mlx5_traffic_types tt);
int mlx5e_rss_set_hash_fields(struct mlx5e_rss *rss, enum mlx5_traffic_types tt, int mlx5e_rss_set_hash_fields(struct mlx5e_rss *rss, enum mlx5_traffic_types tt,
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#define MLX5E_MAX_NUM_RSS 16 #define MLX5E_MAX_NUM_RSS 16
struct mlx5e_rx_res { struct mlx5e_rx_res {
struct mlx5_core_dev *mdev; /* primary */ struct mlx5_core_dev *mdev;
enum mlx5e_rx_res_features features; enum mlx5e_rx_res_features features;
unsigned int max_nch; unsigned int max_nch;
u32 drop_rqn; u32 drop_rqn;
...@@ -19,7 +19,6 @@ struct mlx5e_rx_res { ...@@ -19,7 +19,6 @@ struct mlx5e_rx_res {
struct mlx5e_rss *rss[MLX5E_MAX_NUM_RSS]; struct mlx5e_rss *rss[MLX5E_MAX_NUM_RSS];
bool rss_active; bool rss_active;
u32 *rss_rqns; u32 *rss_rqns;
u32 *rss_vhca_ids;
unsigned int rss_nch; unsigned int rss_nch;
struct { struct {
...@@ -35,13 +34,6 @@ struct mlx5e_rx_res { ...@@ -35,13 +34,6 @@ struct mlx5e_rx_res {
/* API for rx_res_rss_* */ /* API for rx_res_rss_* */
static u32 *get_vhca_ids(struct mlx5e_rx_res *res, int offset)
{
bool multi_vhca = res->features & MLX5E_RX_RES_FEATURE_MULTI_VHCA;
return multi_vhca ? res->rss_vhca_ids + offset : NULL;
}
void mlx5e_rx_res_rss_update_num_channels(struct mlx5e_rx_res *res, u32 nch) void mlx5e_rx_res_rss_update_num_channels(struct mlx5e_rx_res *res, u32 nch)
{ {
int i; int i;
...@@ -93,11 +85,8 @@ int mlx5e_rx_res_rss_init(struct mlx5e_rx_res *res, u32 *rss_idx, unsigned int i ...@@ -93,11 +85,8 @@ int mlx5e_rx_res_rss_init(struct mlx5e_rx_res *res, u32 *rss_idx, unsigned int i
return PTR_ERR(rss); return PTR_ERR(rss);
mlx5e_rss_set_indir_uniform(rss, init_nch); mlx5e_rss_set_indir_uniform(rss, init_nch);
if (res->rss_active) { if (res->rss_active)
u32 *vhca_ids = get_vhca_ids(res, 0); mlx5e_rss_enable(rss, res->rss_rqns, res->rss_nch);
mlx5e_rss_enable(rss, res->rss_rqns, vhca_ids, res->rss_nch);
}
res->rss[i] = rss; res->rss[i] = rss;
*rss_idx = i; *rss_idx = i;
...@@ -164,12 +153,10 @@ static void mlx5e_rx_res_rss_enable(struct mlx5e_rx_res *res) ...@@ -164,12 +153,10 @@ static void mlx5e_rx_res_rss_enable(struct mlx5e_rx_res *res)
for (i = 0; i < MLX5E_MAX_NUM_RSS; i++) { for (i = 0; i < MLX5E_MAX_NUM_RSS; i++) {
struct mlx5e_rss *rss = res->rss[i]; struct mlx5e_rss *rss = res->rss[i];
u32 *vhca_ids;
if (!rss) if (!rss)
continue; continue;
vhca_ids = get_vhca_ids(res, 0); mlx5e_rss_enable(rss, res->rss_rqns, res->rss_nch);
mlx5e_rss_enable(rss, res->rss_rqns, vhca_ids, res->rss_nch);
} }
} }
...@@ -213,7 +200,6 @@ int mlx5e_rx_res_rss_get_rxfh(struct mlx5e_rx_res *res, u32 rss_idx, ...@@ -213,7 +200,6 @@ int mlx5e_rx_res_rss_get_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx, int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
const u32 *indir, const u8 *key, const u8 *hfunc) const u32 *indir, const u8 *key, const u8 *hfunc)
{ {
u32 *vhca_ids = get_vhca_ids(res, 0);
struct mlx5e_rss *rss; struct mlx5e_rss *rss;
if (rss_idx >= MLX5E_MAX_NUM_RSS) if (rss_idx >= MLX5E_MAX_NUM_RSS)
...@@ -223,8 +209,7 @@ int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx, ...@@ -223,8 +209,7 @@ int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
if (!rss) if (!rss)
return -ENOENT; return -ENOENT;
return mlx5e_rss_set_rxfh(rss, indir, key, hfunc, res->rss_rqns, vhca_ids, return mlx5e_rss_set_rxfh(rss, indir, key, hfunc, res->rss_rqns, res->rss_nch);
res->rss_nch);
} }
int mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx, int mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
...@@ -295,13 +280,11 @@ struct mlx5e_rss *mlx5e_rx_res_rss_get(struct mlx5e_rx_res *res, u32 rss_idx) ...@@ -295,13 +280,11 @@ struct mlx5e_rss *mlx5e_rx_res_rss_get(struct mlx5e_rx_res *res, u32 rss_idx)
static void mlx5e_rx_res_free(struct mlx5e_rx_res *res) static void mlx5e_rx_res_free(struct mlx5e_rx_res *res)
{ {
kvfree(res->rss_vhca_ids);
kvfree(res->rss_rqns); kvfree(res->rss_rqns);
kvfree(res); kvfree(res);
} }
static struct mlx5e_rx_res *mlx5e_rx_res_alloc(struct mlx5_core_dev *mdev, unsigned int max_nch, static struct mlx5e_rx_res *mlx5e_rx_res_alloc(struct mlx5_core_dev *mdev, unsigned int max_nch)
bool multi_vhca)
{ {
struct mlx5e_rx_res *rx_res; struct mlx5e_rx_res *rx_res;
...@@ -315,15 +298,6 @@ static struct mlx5e_rx_res *mlx5e_rx_res_alloc(struct mlx5_core_dev *mdev, unsig ...@@ -315,15 +298,6 @@ static struct mlx5e_rx_res *mlx5e_rx_res_alloc(struct mlx5_core_dev *mdev, unsig
return NULL; return NULL;
} }
if (multi_vhca) {
rx_res->rss_vhca_ids = kvcalloc(max_nch, sizeof(*rx_res->rss_vhca_ids), GFP_KERNEL);
if (!rx_res->rss_vhca_ids) {
kvfree(rx_res->rss_rqns);
kvfree(rx_res);
return NULL;
}
}
return rx_res; return rx_res;
} }
...@@ -450,11 +424,10 @@ mlx5e_rx_res_create(struct mlx5_core_dev *mdev, enum mlx5e_rx_res_features featu ...@@ -450,11 +424,10 @@ mlx5e_rx_res_create(struct mlx5_core_dev *mdev, enum mlx5e_rx_res_features featu
const struct mlx5e_packet_merge_param *init_pkt_merge_param, const struct mlx5e_packet_merge_param *init_pkt_merge_param,
unsigned int init_nch) unsigned int init_nch)
{ {
bool multi_vhca = features & MLX5E_RX_RES_FEATURE_MULTI_VHCA;
struct mlx5e_rx_res *res; struct mlx5e_rx_res *res;
int err; int err;
res = mlx5e_rx_res_alloc(mdev, max_nch, multi_vhca); res = mlx5e_rx_res_alloc(mdev, max_nch);
if (!res) if (!res)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -531,11 +504,10 @@ static void mlx5e_rx_res_channel_activate_direct(struct mlx5e_rx_res *res, ...@@ -531,11 +504,10 @@ static void mlx5e_rx_res_channel_activate_direct(struct mlx5e_rx_res *res,
struct mlx5e_channels *chs, struct mlx5e_channels *chs,
unsigned int ix) unsigned int ix)
{ {
u32 *vhca_id = get_vhca_ids(res, ix);
u32 rqn = res->rss_rqns[ix]; u32 rqn = res->rss_rqns[ix];
int err; int err;
err = mlx5e_rqt_redirect_direct(&res->channels[ix].direct_rqt, rqn, vhca_id); err = mlx5e_rqt_redirect_direct(&res->channels[ix].direct_rqt, rqn);
if (err) if (err)
mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to RQ %#x (channel %u): err = %d\n", mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to RQ %#x (channel %u): err = %d\n",
mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt), mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt),
...@@ -547,7 +519,7 @@ static void mlx5e_rx_res_channel_deactivate_direct(struct mlx5e_rx_res *res, ...@@ -547,7 +519,7 @@ static void mlx5e_rx_res_channel_deactivate_direct(struct mlx5e_rx_res *res,
{ {
int err; int err;
err = mlx5e_rqt_redirect_direct(&res->channels[ix].direct_rqt, res->drop_rqn, NULL); err = mlx5e_rqt_redirect_direct(&res->channels[ix].direct_rqt, res->drop_rqn);
if (err) if (err)
mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to drop RQ %#x (channel %u): err = %d\n", mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to drop RQ %#x (channel %u): err = %d\n",
mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt), mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt),
...@@ -562,12 +534,10 @@ void mlx5e_rx_res_channels_activate(struct mlx5e_rx_res *res, struct mlx5e_chann ...@@ -562,12 +534,10 @@ void mlx5e_rx_res_channels_activate(struct mlx5e_rx_res *res, struct mlx5e_chann
nch = mlx5e_channels_get_num(chs); nch = mlx5e_channels_get_num(chs);
for (ix = 0; ix < chs->num; ix++) { for (ix = 0; ix < chs->num; ix++) {
u32 *vhca_id = get_vhca_ids(res, ix);
if (mlx5e_channels_is_xsk(chs, ix)) if (mlx5e_channels_is_xsk(chs, ix))
mlx5e_channels_get_xsk_rqn(chs, ix, &res->rss_rqns[ix], vhca_id); mlx5e_channels_get_xsk_rqn(chs, ix, &res->rss_rqns[ix]);
else else
mlx5e_channels_get_regular_rqn(chs, ix, &res->rss_rqns[ix], vhca_id); mlx5e_channels_get_regular_rqn(chs, ix, &res->rss_rqns[ix]);
} }
res->rss_nch = chs->num; res->rss_nch = chs->num;
...@@ -584,7 +554,7 @@ void mlx5e_rx_res_channels_activate(struct mlx5e_rx_res *res, struct mlx5e_chann ...@@ -584,7 +554,7 @@ void mlx5e_rx_res_channels_activate(struct mlx5e_rx_res *res, struct mlx5e_chann
if (!mlx5e_channels_get_ptp_rqn(chs, &rqn)) if (!mlx5e_channels_get_ptp_rqn(chs, &rqn))
rqn = res->drop_rqn; rqn = res->drop_rqn;
err = mlx5e_rqt_redirect_direct(&res->ptp.rqt, rqn, NULL); err = mlx5e_rqt_redirect_direct(&res->ptp.rqt, rqn);
if (err) if (err)
mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to RQ %#x (PTP): err = %d\n", mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to RQ %#x (PTP): err = %d\n",
mlx5e_rqt_get_rqtn(&res->ptp.rqt), mlx5e_rqt_get_rqtn(&res->ptp.rqt),
...@@ -603,7 +573,7 @@ void mlx5e_rx_res_channels_deactivate(struct mlx5e_rx_res *res) ...@@ -603,7 +573,7 @@ void mlx5e_rx_res_channels_deactivate(struct mlx5e_rx_res *res)
mlx5e_rx_res_channel_deactivate_direct(res, ix); mlx5e_rx_res_channel_deactivate_direct(res, ix);
if (res->features & MLX5E_RX_RES_FEATURE_PTP) { if (res->features & MLX5E_RX_RES_FEATURE_PTP) {
err = mlx5e_rqt_redirect_direct(&res->ptp.rqt, res->drop_rqn, NULL); err = mlx5e_rqt_redirect_direct(&res->ptp.rqt, res->drop_rqn);
if (err) if (err)
mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to drop RQ %#x (PTP): err = %d\n", mlx5_core_warn(res->mdev, "Failed to redirect direct RQT %#x to drop RQ %#x (PTP): err = %d\n",
mlx5e_rqt_get_rqtn(&res->ptp.rqt), mlx5e_rqt_get_rqtn(&res->ptp.rqt),
...@@ -614,12 +584,10 @@ void mlx5e_rx_res_channels_deactivate(struct mlx5e_rx_res *res) ...@@ -614,12 +584,10 @@ void mlx5e_rx_res_channels_deactivate(struct mlx5e_rx_res *res)
void mlx5e_rx_res_xsk_update(struct mlx5e_rx_res *res, struct mlx5e_channels *chs, void mlx5e_rx_res_xsk_update(struct mlx5e_rx_res *res, struct mlx5e_channels *chs,
unsigned int ix, bool xsk) unsigned int ix, bool xsk)
{ {
u32 *vhca_id = get_vhca_ids(res, ix);
if (xsk) if (xsk)
mlx5e_channels_get_xsk_rqn(chs, ix, &res->rss_rqns[ix], vhca_id); mlx5e_channels_get_xsk_rqn(chs, ix, &res->rss_rqns[ix]);
else else
mlx5e_channels_get_regular_rqn(chs, ix, &res->rss_rqns[ix], vhca_id); mlx5e_channels_get_regular_rqn(chs, ix, &res->rss_rqns[ix]);
mlx5e_rx_res_rss_enable(res); mlx5e_rx_res_rss_enable(res);
......
...@@ -18,7 +18,6 @@ struct mlx5e_rss_params_hash; ...@@ -18,7 +18,6 @@ struct mlx5e_rss_params_hash;
enum mlx5e_rx_res_features { enum mlx5e_rx_res_features {
MLX5E_RX_RES_FEATURE_INNER_FT = BIT(0), MLX5E_RX_RES_FEATURE_INNER_FT = BIT(0),
MLX5E_RX_RES_FEATURE_PTP = BIT(1), MLX5E_RX_RES_FEATURE_PTP = BIT(1),
MLX5E_RX_RES_FEATURE_MULTI_VHCA = BIT(2),
}; };
/* Setup */ /* Setup */
......
...@@ -63,12 +63,10 @@ static int mlx5e_open_trap_rq(struct mlx5e_priv *priv, struct mlx5e_trap *t) ...@@ -63,12 +63,10 @@ static int mlx5e_open_trap_rq(struct mlx5e_priv *priv, struct mlx5e_trap *t)
struct mlx5e_create_cq_param ccp = {}; struct mlx5e_create_cq_param ccp = {};
struct dim_cq_moder trap_moder = {}; struct dim_cq_moder trap_moder = {};
struct mlx5e_rq *rq = &t->rq; struct mlx5e_rq *rq = &t->rq;
u16 q_counter;
int node; int node;
int err; int err;
node = dev_to_node(mdev->device); node = dev_to_node(mdev->device);
q_counter = priv->q_counter[0];
ccp.netdev = priv->netdev; ccp.netdev = priv->netdev;
ccp.wq = priv->wq; ccp.wq = priv->wq;
...@@ -81,7 +79,7 @@ static int mlx5e_open_trap_rq(struct mlx5e_priv *priv, struct mlx5e_trap *t) ...@@ -81,7 +79,7 @@ static int mlx5e_open_trap_rq(struct mlx5e_priv *priv, struct mlx5e_trap *t)
return err; return err;
mlx5e_init_trap_rq(t, &t->params, rq); mlx5e_init_trap_rq(t, &t->params, rq);
err = mlx5e_open_rq(&t->params, rq_param, NULL, node, q_counter, rq); err = mlx5e_open_rq(&t->params, rq_param, NULL, node, rq);
if (err) if (err)
goto err_destroy_cq; goto err_destroy_cq;
...@@ -118,14 +116,15 @@ static int mlx5e_create_trap_direct_rq_tir(struct mlx5_core_dev *mdev, struct ml ...@@ -118,14 +116,15 @@ static int mlx5e_create_trap_direct_rq_tir(struct mlx5_core_dev *mdev, struct ml
} }
static void mlx5e_build_trap_params(struct mlx5_core_dev *mdev, static void mlx5e_build_trap_params(struct mlx5_core_dev *mdev,
int max_mtu, struct mlx5e_trap *t) int max_mtu, u16 q_counter,
struct mlx5e_trap *t)
{ {
struct mlx5e_params *params = &t->params; struct mlx5e_params *params = &t->params;
params->rq_wq_type = MLX5_WQ_TYPE_CYCLIC; params->rq_wq_type = MLX5_WQ_TYPE_CYCLIC;
mlx5e_init_rq_type_params(mdev, params); mlx5e_init_rq_type_params(mdev, params);
params->sw_mtu = max_mtu; params->sw_mtu = max_mtu;
mlx5e_build_rq_param(mdev, params, NULL, &t->rq_param); mlx5e_build_rq_param(mdev, params, NULL, q_counter, &t->rq_param);
} }
static struct mlx5e_trap *mlx5e_open_trap(struct mlx5e_priv *priv) static struct mlx5e_trap *mlx5e_open_trap(struct mlx5e_priv *priv)
...@@ -139,7 +138,7 @@ static struct mlx5e_trap *mlx5e_open_trap(struct mlx5e_priv *priv) ...@@ -139,7 +138,7 @@ static struct mlx5e_trap *mlx5e_open_trap(struct mlx5e_priv *priv)
if (!t) if (!t)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
mlx5e_build_trap_params(priv->mdev, netdev->max_mtu, t); mlx5e_build_trap_params(priv->mdev, netdev->max_mtu, priv->q_counter, t);
t->priv = priv; t->priv = priv;
t->mdev = priv->mdev; t->mdev = priv->mdev;
......
...@@ -6,10 +6,10 @@ ...@@ -6,10 +6,10 @@
#include "setup.h" #include "setup.h"
#include "en/params.h" #include "en/params.h"
static int mlx5e_xsk_map_pool(struct mlx5_core_dev *mdev, static int mlx5e_xsk_map_pool(struct mlx5e_priv *priv,
struct xsk_buff_pool *pool) struct xsk_buff_pool *pool)
{ {
struct device *dev = mlx5_core_dma_dev(mdev); struct device *dev = mlx5_core_dma_dev(priv->mdev);
return xsk_pool_dma_map(pool, dev, DMA_ATTR_SKIP_CPU_SYNC); return xsk_pool_dma_map(pool, dev, DMA_ATTR_SKIP_CPU_SYNC);
} }
...@@ -89,7 +89,7 @@ static int mlx5e_xsk_enable_locked(struct mlx5e_priv *priv, ...@@ -89,7 +89,7 @@ static int mlx5e_xsk_enable_locked(struct mlx5e_priv *priv,
if (unlikely(!mlx5e_xsk_is_pool_sane(pool))) if (unlikely(!mlx5e_xsk_is_pool_sane(pool)))
return -EINVAL; return -EINVAL;
err = mlx5e_xsk_map_pool(mlx5_sd_ch_ix_get_dev(priv->mdev, ix), pool); err = mlx5e_xsk_map_pool(priv, pool);
if (unlikely(err)) if (unlikely(err))
return err; return err;
......
...@@ -49,9 +49,10 @@ bool mlx5e_validate_xsk_param(struct mlx5e_params *params, ...@@ -49,9 +49,10 @@ bool mlx5e_validate_xsk_param(struct mlx5e_params *params,
static void mlx5e_build_xsk_cparam(struct mlx5_core_dev *mdev, static void mlx5e_build_xsk_cparam(struct mlx5_core_dev *mdev,
struct mlx5e_params *params, struct mlx5e_params *params,
struct mlx5e_xsk_param *xsk, struct mlx5e_xsk_param *xsk,
u16 q_counter,
struct mlx5e_channel_param *cparam) struct mlx5e_channel_param *cparam)
{ {
mlx5e_build_rq_param(mdev, params, xsk, &cparam->rq); mlx5e_build_rq_param(mdev, params, xsk, q_counter, &cparam->rq);
mlx5e_build_xdpsq_param(mdev, params, xsk, &cparam->xdp_sq); mlx5e_build_xdpsq_param(mdev, params, xsk, &cparam->xdp_sq);
} }
...@@ -92,7 +93,6 @@ static int mlx5e_open_xsk_rq(struct mlx5e_channel *c, struct mlx5e_params *param ...@@ -92,7 +93,6 @@ static int mlx5e_open_xsk_rq(struct mlx5e_channel *c, struct mlx5e_params *param
struct mlx5e_rq_param *rq_params, struct xsk_buff_pool *pool, struct mlx5e_rq_param *rq_params, struct xsk_buff_pool *pool,
struct mlx5e_xsk_param *xsk) struct mlx5e_xsk_param *xsk)
{ {
u16 q_counter = c->priv->q_counter[c->sd_ix];
struct mlx5e_rq *xskrq = &c->xskrq; struct mlx5e_rq *xskrq = &c->xskrq;
int err; int err;
...@@ -100,7 +100,7 @@ static int mlx5e_open_xsk_rq(struct mlx5e_channel *c, struct mlx5e_params *param ...@@ -100,7 +100,7 @@ static int mlx5e_open_xsk_rq(struct mlx5e_channel *c, struct mlx5e_params *param
if (err) if (err)
return err; return err;
err = mlx5e_open_rq(params, rq_params, xsk, cpu_to_node(c->cpu), q_counter, xskrq); err = mlx5e_open_rq(params, rq_params, xsk, cpu_to_node(c->cpu), xskrq);
if (err) if (err)
return err; return err;
...@@ -125,7 +125,7 @@ int mlx5e_open_xsk(struct mlx5e_priv *priv, struct mlx5e_params *params, ...@@ -125,7 +125,7 @@ int mlx5e_open_xsk(struct mlx5e_priv *priv, struct mlx5e_params *params,
if (!cparam) if (!cparam)
return -ENOMEM; return -ENOMEM;
mlx5e_build_xsk_cparam(priv->mdev, params, xsk, cparam); mlx5e_build_xsk_cparam(priv->mdev, params, xsk, priv->q_counter, cparam);
err = mlx5e_open_cq(c->mdev, params->rx_cq_moderation, &cparam->rq.cqp, &ccp, err = mlx5e_open_cq(c->mdev, params->rx_cq_moderation, &cparam->rq.cqp, &ccp,
&c->xskrq.cq); &c->xskrq.cq);
......
...@@ -96,7 +96,7 @@ bool mlx5e_is_ktls_rx(struct mlx5_core_dev *mdev) ...@@ -96,7 +96,7 @@ bool mlx5e_is_ktls_rx(struct mlx5_core_dev *mdev)
{ {
u8 max_sq_wqebbs = mlx5e_get_max_sq_wqebbs(mdev); u8 max_sq_wqebbs = mlx5e_get_max_sq_wqebbs(mdev);
if (is_kdump_kernel() || !MLX5_CAP_GEN(mdev, tls_rx) || mlx5_get_sd(mdev)) if (is_kdump_kernel() || !MLX5_CAP_GEN(mdev, tls_rx))
return false; return false;
/* Check the possibility to post the required ICOSQ WQEs. */ /* Check the possibility to post the required ICOSQ WQEs. */
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#ifdef CONFIG_MLX5_EN_TLS #ifdef CONFIG_MLX5_EN_TLS
#include "lib/crypto.h" #include "lib/crypto.h"
#include "lib/mlx5.h"
struct mlx5_crypto_dek *mlx5_ktls_create_key(struct mlx5_crypto_dek_pool *dek_pool, struct mlx5_crypto_dek *mlx5_ktls_create_key(struct mlx5_crypto_dek_pool *dek_pool,
struct tls_crypto_info *crypto_info); struct tls_crypto_info *crypto_info);
...@@ -62,8 +61,7 @@ void mlx5e_ktls_rx_resync_destroy_resp_list(struct mlx5e_ktls_resync_resp *resp_ ...@@ -62,8 +61,7 @@ void mlx5e_ktls_rx_resync_destroy_resp_list(struct mlx5e_ktls_resync_resp *resp_
static inline bool mlx5e_is_ktls_tx(struct mlx5_core_dev *mdev) static inline bool mlx5e_is_ktls_tx(struct mlx5_core_dev *mdev)
{ {
return !is_kdump_kernel() && MLX5_CAP_GEN(mdev, tls_tx) && return !is_kdump_kernel() && MLX5_CAP_GEN(mdev, tls_tx);
!mlx5_get_sd(mdev);
} }
bool mlx5e_is_ktls_rx(struct mlx5_core_dev *mdev); bool mlx5e_is_ktls_rx(struct mlx5_core_dev *mdev);
......
...@@ -267,7 +267,7 @@ resync_post_get_progress_params(struct mlx5e_icosq *sq, ...@@ -267,7 +267,7 @@ resync_post_get_progress_params(struct mlx5e_icosq *sq,
goto err_out; goto err_out;
} }
pdev = mlx5_core_dma_dev(sq->channel->mdev); pdev = mlx5_core_dma_dev(sq->channel->priv->mdev);
buf->dma_addr = dma_map_single(pdev, &buf->progress, buf->dma_addr = dma_map_single(pdev, &buf->progress,
PROGRESS_PARAMS_PADDED_SIZE, DMA_FROM_DEVICE); PROGRESS_PARAMS_PADDED_SIZE, DMA_FROM_DEVICE);
if (unlikely(dma_mapping_error(pdev, buf->dma_addr))) { if (unlikely(dma_mapping_error(pdev, buf->dma_addr))) {
...@@ -425,12 +425,14 @@ void mlx5e_ktls_handle_get_psv_completion(struct mlx5e_icosq_wqe_info *wi, ...@@ -425,12 +425,14 @@ void mlx5e_ktls_handle_get_psv_completion(struct mlx5e_icosq_wqe_info *wi,
{ {
struct mlx5e_ktls_rx_resync_buf *buf = wi->tls_get_params.buf; struct mlx5e_ktls_rx_resync_buf *buf = wi->tls_get_params.buf;
struct mlx5e_ktls_offload_context_rx *priv_rx; struct mlx5e_ktls_offload_context_rx *priv_rx;
struct mlx5e_ktls_rx_resync_ctx *resync;
u8 tracker_state, auth_state, *ctx; u8 tracker_state, auth_state, *ctx;
struct device *dev; struct device *dev;
u32 hw_seq; u32 hw_seq;
priv_rx = buf->priv_rx; priv_rx = buf->priv_rx;
dev = mlx5_core_dma_dev(sq->channel->mdev); resync = &priv_rx->resync;
dev = mlx5_core_dma_dev(resync->priv->mdev);
if (unlikely(test_bit(MLX5E_PRIV_RX_FLAG_DELETING, priv_rx->flags))) if (unlikely(test_bit(MLX5E_PRIV_RX_FLAG_DELETING, priv_rx->flags)))
goto out; goto out;
......
...@@ -95,7 +95,7 @@ static void mlx5e_destroy_tises(struct mlx5_core_dev *mdev, u32 tisn[MLX5_MAX_PO ...@@ -95,7 +95,7 @@ static void mlx5e_destroy_tises(struct mlx5_core_dev *mdev, u32 tisn[MLX5_MAX_PO
{ {
int tc, i; int tc, i;
for (i = 0; i < mlx5e_get_num_lag_ports(mdev); i++) for (i = 0; i < MLX5_MAX_PORTS; i++)
for (tc = 0; tc < MLX5_MAX_NUM_TC; tc++) for (tc = 0; tc < MLX5_MAX_NUM_TC; tc++)
mlx5e_destroy_tis(mdev, tisn[i][tc]); mlx5e_destroy_tis(mdev, tisn[i][tc]);
} }
...@@ -110,7 +110,7 @@ static int mlx5e_create_tises(struct mlx5_core_dev *mdev, u32 tisn[MLX5_MAX_PORT ...@@ -110,7 +110,7 @@ static int mlx5e_create_tises(struct mlx5_core_dev *mdev, u32 tisn[MLX5_MAX_PORT
int tc, i; int tc, i;
int err; int err;
for (i = 0; i < mlx5e_get_num_lag_ports(mdev); i++) { for (i = 0; i < MLX5_MAX_PORTS; i++) {
for (tc = 0; tc < MLX5_MAX_NUM_TC; tc++) { for (tc = 0; tc < MLX5_MAX_NUM_TC; tc++) {
u32 in[MLX5_ST_SZ_DW(create_tis_in)] = {}; u32 in[MLX5_ST_SZ_DW(create_tis_in)] = {};
void *tisc; void *tisc;
...@@ -140,7 +140,7 @@ static int mlx5e_create_tises(struct mlx5_core_dev *mdev, u32 tisn[MLX5_MAX_PORT ...@@ -140,7 +140,7 @@ static int mlx5e_create_tises(struct mlx5_core_dev *mdev, u32 tisn[MLX5_MAX_PORT
return err; return err;
} }
int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev, bool create_tises) int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
{ {
struct mlx5e_hw_objs *res = &mdev->mlx5e_res.hw_objs; struct mlx5e_hw_objs *res = &mdev->mlx5e_res.hw_objs;
int err; int err;
...@@ -169,15 +169,11 @@ int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev, bool create_tises) ...@@ -169,15 +169,11 @@ int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev, bool create_tises)
goto err_destroy_mkey; goto err_destroy_mkey;
} }
if (create_tises) { err = mlx5e_create_tises(mdev, res->tisn);
err = mlx5e_create_tises(mdev, res->tisn); if (err) {
if (err) { mlx5_core_err(mdev, "alloc tises failed, %d\n", err);
mlx5_core_err(mdev, "alloc tises failed, %d\n", err); goto err_destroy_bfreg;
goto err_destroy_bfreg;
}
res->tisn_valid = true;
} }
INIT_LIST_HEAD(&res->td.tirs_list); INIT_LIST_HEAD(&res->td.tirs_list);
mutex_init(&res->td.list_lock); mutex_init(&res->td.list_lock);
...@@ -207,8 +203,7 @@ void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev) ...@@ -207,8 +203,7 @@ void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
mlx5_crypto_dek_cleanup(mdev->mlx5e_res.dek_priv); mlx5_crypto_dek_cleanup(mdev->mlx5e_res.dek_priv);
mdev->mlx5e_res.dek_priv = NULL; mdev->mlx5e_res.dek_priv = NULL;
if (res->tisn_valid) mlx5e_destroy_tises(mdev, res->tisn);
mlx5e_destroy_tises(mdev, res->tisn);
mlx5_free_bfreg(mdev, &res->bfreg); mlx5_free_bfreg(mdev, &res->bfreg);
mlx5_core_destroy_mkey(mdev, res->mkey); mlx5_core_destroy_mkey(mdev, res->mkey);
mlx5_core_dealloc_transport_domain(mdev, res->td.tdn); mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
......
...@@ -561,23 +561,11 @@ static const struct counter_desc drop_rq_stats_desc[] = { ...@@ -561,23 +561,11 @@ static const struct counter_desc drop_rq_stats_desc[] = {
#define NUM_Q_COUNTERS ARRAY_SIZE(q_stats_desc) #define NUM_Q_COUNTERS ARRAY_SIZE(q_stats_desc)
#define NUM_DROP_RQ_COUNTERS ARRAY_SIZE(drop_rq_stats_desc) #define NUM_DROP_RQ_COUNTERS ARRAY_SIZE(drop_rq_stats_desc)
static bool q_counter_any(struct mlx5e_priv *priv)
{
struct mlx5_core_dev *pos;
int i;
mlx5_sd_for_each_dev(i, priv->mdev, pos)
if (priv->q_counter[i++])
return true;
return false;
}
static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qcnt) static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qcnt)
{ {
int num_stats = 0; int num_stats = 0;
if (q_counter_any(priv)) if (priv->q_counter)
num_stats += NUM_Q_COUNTERS; num_stats += NUM_Q_COUNTERS;
if (priv->drop_rq_q_counter) if (priv->drop_rq_q_counter)
...@@ -590,7 +578,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qcnt) ...@@ -590,7 +578,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qcnt)
{ {
int i; int i;
for (i = 0; i < NUM_Q_COUNTERS && q_counter_any(priv); i++) for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
strcpy(data + (idx++) * ETH_GSTRING_LEN, strcpy(data + (idx++) * ETH_GSTRING_LEN,
q_stats_desc[i].format); q_stats_desc[i].format);
...@@ -605,7 +593,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt) ...@@ -605,7 +593,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt)
{ {
int i; int i;
for (i = 0; i < NUM_Q_COUNTERS && q_counter_any(priv); i++) for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt, data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
q_stats_desc, i); q_stats_desc, i);
for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++) for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
...@@ -619,23 +607,18 @@ static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qcnt) ...@@ -619,23 +607,18 @@ static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qcnt)
struct mlx5e_qcounter_stats *qcnt = &priv->stats.qcnt; struct mlx5e_qcounter_stats *qcnt = &priv->stats.qcnt;
u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {}; u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {};
u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {}; u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {};
struct mlx5_core_dev *pos; int ret;
u32 rx_out_of_buffer = 0;
int ret, i;
MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER); MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER);
mlx5_sd_for_each_dev(i, priv->mdev, pos) { if (priv->q_counter) {
if (priv->q_counter[i]) { MLX5_SET(query_q_counter_in, in, counter_set_id,
MLX5_SET(query_q_counter_in, in, counter_set_id, priv->q_counter);
priv->q_counter[i]); ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out);
ret = mlx5_cmd_exec_inout(pos, query_q_counter, in, out); if (!ret)
if (!ret) qcnt->rx_out_of_buffer = MLX5_GET(query_q_counter_out,
rx_out_of_buffer += MLX5_GET(query_q_counter_out, out, out_of_buffer);
out, out_of_buffer);
}
} }
qcnt->rx_out_of_buffer = rx_out_of_buffer;
if (priv->drop_rq_q_counter) { if (priv->drop_rq_q_counter) {
MLX5_SET(query_q_counter_in, in, counter_set_id, MLX5_SET(query_q_counter_in, in, counter_set_id,
......
...@@ -766,7 +766,7 @@ static int mlx5e_hairpin_create_indirect_rqt(struct mlx5e_hairpin *hp) ...@@ -766,7 +766,7 @@ static int mlx5e_hairpin_create_indirect_rqt(struct mlx5e_hairpin *hp)
return err; return err;
mlx5e_rss_params_indir_init_uniform(&indir, hp->num_channels); mlx5e_rss_params_indir_init_uniform(&indir, hp->num_channels);
err = mlx5e_rqt_init_indir(&hp->indir_rqt, mdev, hp->pair->rqn, NULL, hp->num_channels, err = mlx5e_rqt_init_indir(&hp->indir_rqt, mdev, hp->pair->rqn, hp->num_channels,
mlx5e_rx_res_get_current_hash(priv->rx_res).hfunc, mlx5e_rx_res_get_current_hash(priv->rx_res).hfunc,
&indir); &indir);
...@@ -1169,7 +1169,7 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv, ...@@ -1169,7 +1169,7 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv,
MLX5_CAP_GEN(priv->mdev, log_min_hairpin_wq_data_sz), MLX5_CAP_GEN(priv->mdev, log_min_hairpin_wq_data_sz),
MLX5_CAP_GEN(priv->mdev, log_max_hairpin_wq_data_sz)); MLX5_CAP_GEN(priv->mdev, log_max_hairpin_wq_data_sz));
params.q_counter = priv->q_counter[0]; params.q_counter = priv->q_counter;
err = devl_param_driverinit_value_get( err = devl_param_driverinit_value_get(
devlink, MLX5_DEVLINK_PARAM_ID_HAIRPIN_NUM_QUEUES, &val); devlink, MLX5_DEVLINK_PARAM_ID_HAIRPIN_NUM_QUEUES, &val);
if (err) { if (err) {
......
...@@ -1665,7 +1665,7 @@ int mlx5_esw_sf_max_hpf_functions(struct mlx5_core_dev *dev, u16 *max_sfs, u16 * ...@@ -1665,7 +1665,7 @@ int mlx5_esw_sf_max_hpf_functions(struct mlx5_core_dev *dev, u16 *max_sfs, u16 *
void *hca_caps; void *hca_caps;
int err; int err;
if (!mlx5_core_is_ecpf(dev) || mlx5_core_is_mgmt_pf(dev)) { if (!mlx5_core_is_ecpf(dev)) {
*max_sfs = 0; *max_sfs = 0;
return 0; return 0;
} }
......
...@@ -783,7 +783,7 @@ static int mlx5_rdma_setup_rn(struct ib_device *ibdev, u32 port_num, ...@@ -783,7 +783,7 @@ static int mlx5_rdma_setup_rn(struct ib_device *ibdev, u32 port_num,
} }
/* This should only be called once per mdev */ /* This should only be called once per mdev */
err = mlx5e_create_mdev_resources(mdev, false); err = mlx5e_create_mdev_resources(mdev);
if (err) if (err)
goto destroy_ht; goto destroy_ht;
} }
......
...@@ -10,7 +10,6 @@ enum mlx5_devcom_component { ...@@ -10,7 +10,6 @@ enum mlx5_devcom_component {
MLX5_DEVCOM_ESW_OFFLOADS, MLX5_DEVCOM_ESW_OFFLOADS,
MLX5_DEVCOM_MPV, MLX5_DEVCOM_MPV,
MLX5_DEVCOM_HCA_PORTS, MLX5_DEVCOM_HCA_PORTS,
MLX5_DEVCOM_SD_GROUP,
MLX5_DEVCOM_NUM_COMPONENTS, MLX5_DEVCOM_NUM_COMPONENTS,
}; };
......
...@@ -54,16 +54,4 @@ static inline struct net_device *mlx5_uplink_netdev_get(struct mlx5_core_dev *md ...@@ -54,16 +54,4 @@ static inline struct net_device *mlx5_uplink_netdev_get(struct mlx5_core_dev *md
{ {
return mdev->mlx5e_res.uplink_netdev; return mdev->mlx5e_res.uplink_netdev;
} }
struct mlx5_sd;
static inline struct mlx5_sd *mlx5_get_sd(struct mlx5_core_dev *dev)
{
return dev->sd;
}
static inline void mlx5_set_sd(struct mlx5_core_dev *dev, struct mlx5_sd *sd)
{
dev->sd = sd;
}
#endif #endif
This diff is collapsed.
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
/* Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */
#ifndef __MLX5_LIB_SD_H__
#define __MLX5_LIB_SD_H__
#define MLX5_SD_MAX_GROUP_SZ 2
struct mlx5_sd;
struct mlx5_core_dev *mlx5_sd_primary_get_peer(struct mlx5_core_dev *primary, int idx);
int mlx5_sd_ch_ix_get_dev_ix(struct mlx5_core_dev *dev, int ch_ix);
int mlx5_sd_ch_ix_get_vec_ix(struct mlx5_core_dev *dev, int ch_ix);
struct mlx5_core_dev *mlx5_sd_ch_ix_get_dev(struct mlx5_core_dev *primary, int ch_ix);
struct auxiliary_device *mlx5_sd_get_adev(struct mlx5_core_dev *dev,
struct auxiliary_device *adev,
int idx);
int mlx5_sd_init(struct mlx5_core_dev *dev);
void mlx5_sd_cleanup(struct mlx5_core_dev *dev);
#define mlx5_sd_for_each_dev_from_to(i, primary, ix_from, to, pos) \
for (i = ix_from; \
(pos = mlx5_sd_primary_get_peer(primary, i)) && pos != (to); i++)
#define mlx5_sd_for_each_dev(i, primary, pos) \
mlx5_sd_for_each_dev_from_to(i, primary, 0, NULL, pos)
#define mlx5_sd_for_each_dev_to(i, primary, to, pos) \
mlx5_sd_for_each_dev_from_to(i, primary, 0, to, pos)
#define mlx5_sd_for_each_secondary(i, primary, pos) \
mlx5_sd_for_each_dev_from_to(i, primary, 1, NULL, pos)
#define mlx5_sd_for_each_secondary_to(i, primary, to, pos) \
mlx5_sd_for_each_dev_from_to(i, primary, 1, to, pos)
#endif /* __MLX5_LIB_SD_H__ */
...@@ -440,27 +440,6 @@ int mlx5_query_nic_vport_system_image_guid(struct mlx5_core_dev *mdev, ...@@ -440,27 +440,6 @@ int mlx5_query_nic_vport_system_image_guid(struct mlx5_core_dev *mdev,
} }
EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_system_image_guid); EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_system_image_guid);
int mlx5_query_nic_vport_sd_group(struct mlx5_core_dev *mdev, u8 *sd_group)
{
int outlen = MLX5_ST_SZ_BYTES(query_nic_vport_context_out);
u32 *out;
int err;
out = kvzalloc(outlen, GFP_KERNEL);
if (!out)
return -ENOMEM;
err = mlx5_query_nic_vport_context(mdev, 0, out);
if (err)
goto out;
*sd_group = MLX5_GET(query_nic_vport_context_out, out,
nic_vport_context.sd_group);
out:
kvfree(out);
return err;
}
int mlx5_query_nic_vport_node_guid(struct mlx5_core_dev *mdev, u64 *node_guid) int mlx5_query_nic_vport_node_guid(struct mlx5_core_dev *mdev, u64 *node_guid)
{ {
u32 *out; u32 *out;
......
...@@ -681,7 +681,6 @@ struct mlx5e_resources { ...@@ -681,7 +681,6 @@ struct mlx5e_resources {
struct mlx5_sq_bfreg bfreg; struct mlx5_sq_bfreg bfreg;
#define MLX5_MAX_NUM_TC 8 #define MLX5_MAX_NUM_TC 8
u32 tisn[MLX5_MAX_PORTS][MLX5_MAX_NUM_TC]; u32 tisn[MLX5_MAX_PORTS][MLX5_MAX_NUM_TC];
bool tisn_valid;
} hw_objs; } hw_objs;
struct net_device *uplink_netdev; struct net_device *uplink_netdev;
struct mutex uplink_netdev_lock; struct mutex uplink_netdev_lock;
...@@ -822,7 +821,6 @@ struct mlx5_core_dev { ...@@ -822,7 +821,6 @@ struct mlx5_core_dev {
struct blocking_notifier_head macsec_nh; struct blocking_notifier_head macsec_nh;
#endif #endif
u64 num_ipsec_offloads; u64 num_ipsec_offloads;
struct mlx5_sd *sd;
}; };
struct mlx5_db { struct mlx5_db {
...@@ -1224,14 +1222,6 @@ static inline bool mlx5_core_is_ecpf(const struct mlx5_core_dev *dev) ...@@ -1224,14 +1222,6 @@ static inline bool mlx5_core_is_ecpf(const struct mlx5_core_dev *dev)
return dev->caps.embedded_cpu; return dev->caps.embedded_cpu;
} }
static inline bool mlx5_core_is_mgmt_pf(const struct mlx5_core_dev *dev)
{
if (!MLX5_CAP_GEN_2(dev, local_mng_port_valid))
return false;
return MLX5_CAP_GEN_2(dev, local_mng_port);
}
static inline bool static inline bool
mlx5_core_is_ecpf_esw_manager(const struct mlx5_core_dev *dev) mlx5_core_is_ecpf_esw_manager(const struct mlx5_core_dev *dev)
{ {
......
...@@ -1954,10 +1954,8 @@ enum { ...@@ -1954,10 +1954,8 @@ enum {
struct mlx5_ifc_cmd_hca_cap_2_bits { struct mlx5_ifc_cmd_hca_cap_2_bits {
u8 reserved_at_0[0x80]; u8 reserved_at_0[0x80];
u8 migratable[0x1]; u8 migratable[0x1];
u8 reserved_at_81[0x19]; u8 reserved_at_81[0x1f];
u8 local_mng_port[0x1];
u8 reserved_at_9b[0x5];
u8 max_reformat_insert_size[0x8]; u8 max_reformat_insert_size[0x8];
u8 max_reformat_insert_offset[0x8]; u8 max_reformat_insert_offset[0x8];
...@@ -1975,13 +1973,7 @@ struct mlx5_ifc_cmd_hca_cap_2_bits { ...@@ -1975,13 +1973,7 @@ struct mlx5_ifc_cmd_hca_cap_2_bits {
u8 allowed_object_for_other_vhca_access[0x40]; u8 allowed_object_for_other_vhca_access[0x40];
u8 reserved_at_140[0x20]; u8 reserved_at_140[0x60];
u8 reserved_at_160[0xa];
u8 local_mng_port_valid[0x1];
u8 reserved_at_16b[0x15];
u8 reserved_at_180[0x20];
u8 flow_table_type_2_type[0x8]; u8 flow_table_type_2_type[0x8];
u8 reserved_at_1a8[0x3]; u8 reserved_at_1a8[0x3];
...@@ -4038,13 +4030,8 @@ struct mlx5_ifc_nic_vport_context_bits { ...@@ -4038,13 +4030,8 @@ struct mlx5_ifc_nic_vport_context_bits {
u8 affiliation_criteria[0x4]; u8 affiliation_criteria[0x4];
u8 affiliated_vhca_id[0x10]; u8 affiliated_vhca_id[0x10];
u8 reserved_at_60[0xa0]; u8 reserved_at_60[0xd0];
u8 reserved_at_100[0x1];
u8 sd_group[0x3];
u8 reserved_at_104[0x1c];
u8 reserved_at_120[0x10];
u8 mtu[0x10]; u8 mtu[0x10];
u8 system_image_guid[0x40]; u8 system_image_guid[0x40];
...@@ -10129,7 +10116,8 @@ struct mlx5_ifc_mpir_reg_bits { ...@@ -10129,7 +10116,8 @@ struct mlx5_ifc_mpir_reg_bits {
u8 reserved_at_20[0x20]; u8 reserved_at_20[0x20];
u8 local_port[0x8]; u8 local_port[0x8];
u8 reserved_at_28[0x18]; u8 reserved_at_28[0x15];
u8 sd_group[0x3];
u8 reserved_at_60[0x20]; u8 reserved_at_60[0x20];
}; };
......
...@@ -72,7 +72,6 @@ int mlx5_query_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 *mtu); ...@@ -72,7 +72,6 @@ int mlx5_query_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 *mtu);
int mlx5_modify_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 mtu); int mlx5_modify_nic_vport_mtu(struct mlx5_core_dev *mdev, u16 mtu);
int mlx5_query_nic_vport_system_image_guid(struct mlx5_core_dev *mdev, int mlx5_query_nic_vport_system_image_guid(struct mlx5_core_dev *mdev,
u64 *system_image_guid); u64 *system_image_guid);
int mlx5_query_nic_vport_sd_group(struct mlx5_core_dev *mdev, u8 *sd_group);
int mlx5_query_nic_vport_node_guid(struct mlx5_core_dev *mdev, u64 *node_guid); int mlx5_query_nic_vport_node_guid(struct mlx5_core_dev *mdev, u64 *node_guid);
int mlx5_modify_nic_vport_node_guid(struct mlx5_core_dev *mdev, int mlx5_modify_nic_vport_node_guid(struct mlx5_core_dev *mdev,
u16 vport, u64 node_guid); u16 vport, u64 node_guid);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment