|
@@ -502,6 +502,7 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c,
|
|
|
rq->channel = c;
|
|
|
rq->ix = c->ix;
|
|
|
rq->mdev = mdev;
|
|
|
+ rq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu);
|
|
|
rq->stats = &c->priv->channel_stats[c->ix].rq;
|
|
|
|
|
|
rq->xdp_prog = params->xdp_prog ? bpf_prog_inc(params->xdp_prog) : NULL;
|
|
@@ -1623,13 +1624,15 @@ static int mlx5e_alloc_cq_common(struct mlx5_core_dev *mdev,
|
|
|
int err;
|
|
|
u32 i;
|
|
|
|
|
|
+ err = mlx5_vector2eqn(mdev, param->eq_ix, &eqn_not_used, &irqn);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
err = mlx5_cqwq_create(mdev, ¶m->wq, param->cqc, &cq->wq,
|
|
|
&cq->wq_ctrl);
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
|
- mlx5_vector2eqn(mdev, param->eq_ix, &eqn_not_used, &irqn);
|
|
|
-
|
|
|
mcq->cqe_sz = 64;
|
|
|
mcq->set_ci_db = cq->wq_ctrl.db.db;
|
|
|
mcq->arm_db = cq->wq_ctrl.db.db + 1;
|
|
@@ -1687,6 +1690,10 @@ static int mlx5e_create_cq(struct mlx5e_cq *cq, struct mlx5e_cq_param *param)
|
|
|
int eqn;
|
|
|
int err;
|
|
|
|
|
|
+ err = mlx5_vector2eqn(mdev, param->eq_ix, &eqn, &irqn_not_used);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
inlen = MLX5_ST_SZ_BYTES(create_cq_in) +
|
|
|
sizeof(u64) * cq->wq_ctrl.buf.npages;
|
|
|
in = kvzalloc(inlen, GFP_KERNEL);
|
|
@@ -1700,8 +1707,6 @@ static int mlx5e_create_cq(struct mlx5e_cq *cq, struct mlx5e_cq_param *param)
|
|
|
mlx5_fill_page_frag_array(&cq->wq_ctrl.buf,
|
|
|
(__be64 *)MLX5_ADDR_OF(create_cq_in, in, pas));
|
|
|
|
|
|
- mlx5_vector2eqn(mdev, param->eq_ix, &eqn, &irqn_not_used);
|
|
|
-
|
|
|
MLX5_SET(cqc, cqc, cq_period_mode, param->cq_period_mode);
|
|
|
MLX5_SET(cqc, cqc, c_eqn, eqn);
|
|
|
MLX5_SET(cqc, cqc, uar_page, mdev->priv.uar->index);
|
|
@@ -1921,6 +1926,10 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
|
|
|
int err;
|
|
|
int eqn;
|
|
|
|
|
|
+ err = mlx5_vector2eqn(priv->mdev, ix, &eqn, &irq);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
c = kvzalloc_node(sizeof(*c), GFP_KERNEL, cpu_to_node(cpu));
|
|
|
if (!c)
|
|
|
return -ENOMEM;
|
|
@@ -1937,7 +1946,6 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
|
|
|
c->xdp = !!params->xdp_prog;
|
|
|
c->stats = &priv->channel_stats[ix].ch;
|
|
|
|
|
|
- mlx5_vector2eqn(priv->mdev, ix, &eqn, &irq);
|
|
|
c->irq_desc = irq_to_desc(irq);
|
|
|
|
|
|
netif_napi_add(netdev, &c->napi, mlx5e_napi_poll, 64);
|
|
@@ -3574,6 +3582,7 @@ static int set_feature_cvlan_filter(struct net_device *netdev, bool enable)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_MLX5_ESWITCH
|
|
|
static int set_feature_tc_num_filters(struct net_device *netdev, bool enable)
|
|
|
{
|
|
|
struct mlx5e_priv *priv = netdev_priv(netdev);
|
|
@@ -3586,6 +3595,7 @@ static int set_feature_tc_num_filters(struct net_device *netdev, bool enable)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
static int set_feature_rx_all(struct net_device *netdev, bool enable)
|
|
|
{
|
|
@@ -3684,7 +3694,9 @@ static int mlx5e_set_features(struct net_device *netdev,
|
|
|
err |= MLX5E_HANDLE_FEATURE(NETIF_F_LRO, set_feature_lro);
|
|
|
err |= MLX5E_HANDLE_FEATURE(NETIF_F_HW_VLAN_CTAG_FILTER,
|
|
|
set_feature_cvlan_filter);
|
|
|
+#ifdef CONFIG_MLX5_ESWITCH
|
|
|
err |= MLX5E_HANDLE_FEATURE(NETIF_F_HW_TC, set_feature_tc_num_filters);
|
|
|
+#endif
|
|
|
err |= MLX5E_HANDLE_FEATURE(NETIF_F_RXALL, set_feature_rx_all);
|
|
|
err |= MLX5E_HANDLE_FEATURE(NETIF_F_RXFCS, set_feature_rx_fcs);
|
|
|
err |= MLX5E_HANDLE_FEATURE(NETIF_F_HW_VLAN_CTAG_RX, set_feature_rx_vlan);
|
|
@@ -3755,10 +3767,11 @@ int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
|
|
|
}
|
|
|
|
|
|
if (params->rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ) {
|
|
|
+ bool is_linear = mlx5e_rx_mpwqe_is_linear_skb(priv->mdev, &new_channels.params);
|
|
|
u8 ppw_old = mlx5e_mpwqe_log_pkts_per_wqe(params);
|
|
|
u8 ppw_new = mlx5e_mpwqe_log_pkts_per_wqe(&new_channels.params);
|
|
|
|
|
|
- reset = reset && (ppw_old != ppw_new);
|
|
|
+ reset = reset && (is_linear || (ppw_old != ppw_new));
|
|
|
}
|
|
|
|
|
|
if (!reset) {
|
|
@@ -4678,7 +4691,9 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
|
|
|
FT_CAP(modify_root) &&
|
|
|
FT_CAP(identified_miss_table_mode) &&
|
|
|
FT_CAP(flow_table_modify)) {
|
|
|
+#ifdef CONFIG_MLX5_ESWITCH
|
|
|
netdev->hw_features |= NETIF_F_HW_TC;
|
|
|
+#endif
|
|
|
#ifdef CONFIG_MLX5_EN_ARFS
|
|
|
netdev->hw_features |= NETIF_F_NTUPLE;
|
|
|
#endif
|
|
@@ -5004,11 +5019,21 @@ err_free_netdev:
|
|
|
int mlx5e_attach_netdev(struct mlx5e_priv *priv)
|
|
|
{
|
|
|
const struct mlx5e_profile *profile;
|
|
|
+ int max_nch;
|
|
|
int err;
|
|
|
|
|
|
profile = priv->profile;
|
|
|
clear_bit(MLX5E_STATE_DESTROYING, &priv->state);
|
|
|
|
|
|
+ /* max number of channels may have changed */
|
|
|
+ max_nch = mlx5e_get_max_num_channels(priv->mdev);
|
|
|
+ if (priv->channels.params.num_channels > max_nch) {
|
|
|
+ mlx5_core_warn(priv->mdev, "MLX5E: Reducing number of channels to %d\n", max_nch);
|
|
|
+ priv->channels.params.num_channels = max_nch;
|
|
|
+ mlx5e_build_default_indir_rqt(priv->channels.params.indirection_rqt,
|
|
|
+ MLX5E_INDIR_RQT_SIZE, max_nch);
|
|
|
+ }
|
|
|
+
|
|
|
err = profile->init_tx(priv);
|
|
|
if (err)
|
|
|
goto out;
|