Skip to content

Commit b70b152

Browse files
committed
Merge tag 'mlx5-fixes-2021-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== mlx5 fixes 2021-10-12 * tag 'mlx5-fixes-2021-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux: net/mlx5e: Fix division by 0 in mlx5e_select_queue for representors net/mlx5e: Mutually exclude RX-FCS and RX-port-timestamp net/mlx5e: Switchdev representors are not vlan challenged net/mlx5e: Fix memory leak in mlx5_core_destroy_cq() error path net/mlx5e: Allow only complete TXQs partition in MQPRIO channel mode net/mlx5: Fix cleanup of bridge delayed work ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 427f974 + 84c8a87 commit b70b152

File tree

5 files changed

+74
-18
lines changed

5 files changed

+74
-18
lines changed

drivers/net/ethernet/mellanox/mlx5/core/cq.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,23 +155,22 @@ int mlx5_core_destroy_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq)
155155
u32 in[MLX5_ST_SZ_DW(destroy_cq_in)] = {};
156156
int err;
157157

158+
mlx5_debug_cq_remove(dev, cq);
159+
158160
mlx5_eq_del_cq(mlx5_get_async_eq(dev), cq);
159161
mlx5_eq_del_cq(&cq->eq->core, cq);
160162

161163
MLX5_SET(destroy_cq_in, in, opcode, MLX5_CMD_OP_DESTROY_CQ);
162164
MLX5_SET(destroy_cq_in, in, cqn, cq->cqn);
163165
MLX5_SET(destroy_cq_in, in, uid, cq->uid);
164166
err = mlx5_cmd_exec_in(dev, destroy_cq, in);
165-
if (err)
166-
return err;
167167

168168
synchronize_irq(cq->irqn);
169169

170-
mlx5_debug_cq_remove(dev, cq);
171170
mlx5_cq_put(cq);
172171
wait_for_completion(&cq->free);
173172

174-
return 0;
173+
return err;
175174
}
176175
EXPORT_SYMBOL(mlx5_core_destroy_cq);
177176

drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -475,9 +475,6 @@ void mlx5e_rep_bridge_init(struct mlx5e_priv *priv)
475475
esw_warn(mdev, "Failed to allocate bridge offloads workqueue\n");
476476
goto err_alloc_wq;
477477
}
478-
INIT_DELAYED_WORK(&br_offloads->update_work, mlx5_esw_bridge_update_work);
479-
queue_delayed_work(br_offloads->wq, &br_offloads->update_work,
480-
msecs_to_jiffies(MLX5_ESW_BRIDGE_UPDATE_INTERVAL));
481478

482479
br_offloads->nb.notifier_call = mlx5_esw_bridge_switchdev_event;
483480
err = register_switchdev_notifier(&br_offloads->nb);
@@ -500,6 +497,9 @@ void mlx5e_rep_bridge_init(struct mlx5e_priv *priv)
500497
err);
501498
goto err_register_netdev;
502499
}
500+
INIT_DELAYED_WORK(&br_offloads->update_work, mlx5_esw_bridge_update_work);
501+
queue_delayed_work(br_offloads->wq, &br_offloads->update_work,
502+
msecs_to_jiffies(MLX5_ESW_BRIDGE_UPDATE_INTERVAL));
503503
return;
504504

505505
err_register_netdev:
@@ -523,10 +523,10 @@ void mlx5e_rep_bridge_cleanup(struct mlx5e_priv *priv)
523523
if (!br_offloads)
524524
return;
525525

526+
cancel_delayed_work_sync(&br_offloads->update_work);
526527
unregister_netdevice_notifier(&br_offloads->netdev_nb);
527528
unregister_switchdev_blocking_notifier(&br_offloads->nb_blk);
528529
unregister_switchdev_notifier(&br_offloads->nb);
529-
cancel_delayed_work(&br_offloads->update_work);
530530
destroy_workqueue(br_offloads->wq);
531531
rtnl_lock();
532532
mlx5_esw_bridge_cleanup(esw);

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2981,8 +2981,8 @@ static int mlx5e_mqprio_channel_validate(struct mlx5e_priv *priv,
29812981
agg_count += mqprio->qopt.count[i];
29822982
}
29832983

2984-
if (priv->channels.params.num_channels < agg_count) {
2985-
netdev_err(netdev, "Num of queues (%d) exceeds available (%d)\n",
2984+
if (priv->channels.params.num_channels != agg_count) {
2985+
netdev_err(netdev, "Num of queues (%d) does not match available (%d)\n",
29862986
agg_count, priv->channels.params.num_channels);
29872987
return -EINVAL;
29882988
}
@@ -3325,20 +3325,67 @@ static int set_feature_rx_all(struct net_device *netdev, bool enable)
33253325
return mlx5_set_port_fcs(mdev, !enable);
33263326
}
33273327

3328+
static int mlx5e_set_rx_port_ts(struct mlx5_core_dev *mdev, bool enable)
3329+
{
3330+
u32 in[MLX5_ST_SZ_DW(pcmr_reg)] = {};
3331+
bool supported, curr_state;
3332+
int err;
3333+
3334+
if (!MLX5_CAP_GEN(mdev, ports_check))
3335+
return 0;
3336+
3337+
err = mlx5_query_ports_check(mdev, in, sizeof(in));
3338+
if (err)
3339+
return err;
3340+
3341+
supported = MLX5_GET(pcmr_reg, in, rx_ts_over_crc_cap);
3342+
curr_state = MLX5_GET(pcmr_reg, in, rx_ts_over_crc);
3343+
3344+
if (!supported || enable == curr_state)
3345+
return 0;
3346+
3347+
MLX5_SET(pcmr_reg, in, local_port, 1);
3348+
MLX5_SET(pcmr_reg, in, rx_ts_over_crc, enable);
3349+
3350+
return mlx5_set_ports_check(mdev, in, sizeof(in));
3351+
}
3352+
33283353
static int set_feature_rx_fcs(struct net_device *netdev, bool enable)
33293354
{
33303355
struct mlx5e_priv *priv = netdev_priv(netdev);
3356+
struct mlx5e_channels *chs = &priv->channels;
3357+
struct mlx5_core_dev *mdev = priv->mdev;
33313358
int err;
33323359

33333360
mutex_lock(&priv->state_lock);
33343361

3335-
priv->channels.params.scatter_fcs_en = enable;
3336-
err = mlx5e_modify_channels_scatter_fcs(&priv->channels, enable);
3337-
if (err)
3338-
priv->channels.params.scatter_fcs_en = !enable;
3362+
if (enable) {
3363+
err = mlx5e_set_rx_port_ts(mdev, false);
3364+
if (err)
3365+
goto out;
33393366

3340-
mutex_unlock(&priv->state_lock);
3367+
chs->params.scatter_fcs_en = true;
3368+
err = mlx5e_modify_channels_scatter_fcs(chs, true);
3369+
if (err) {
3370+
chs->params.scatter_fcs_en = false;
3371+
mlx5e_set_rx_port_ts(mdev, true);
3372+
}
3373+
} else {
3374+
chs->params.scatter_fcs_en = false;
3375+
err = mlx5e_modify_channels_scatter_fcs(chs, false);
3376+
if (err) {
3377+
chs->params.scatter_fcs_en = true;
3378+
goto out;
3379+
}
3380+
err = mlx5e_set_rx_port_ts(mdev, true);
3381+
if (err) {
3382+
mlx5_core_warn(mdev, "Failed to set RX port timestamp %d\n", err);
3383+
err = 0;
3384+
}
3385+
}
33413386

3387+
out:
3388+
mutex_unlock(&priv->state_lock);
33423389
return err;
33433390
}
33443391

drivers/net/ethernet/mellanox/mlx5/core/en_rep.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,11 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
618618
params->mqprio.num_tc = 1;
619619
params->tunneled_offload_en = false;
620620

621+
/* Set an initial non-zero value, so that mlx5e_select_queue won't
622+
* divide by zero if called before first activating channels.
623+
*/
624+
priv->num_tc_x_num_ch = params->num_channels * params->mqprio.num_tc;
625+
621626
mlx5_query_min_inline(mdev, &params->tx_min_inline_mode);
622627
}
623628

@@ -643,7 +648,6 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev,
643648
netdev->hw_features |= NETIF_F_RXCSUM;
644649

645650
netdev->features |= netdev->hw_features;
646-
netdev->features |= NETIF_F_VLAN_CHALLENGED;
647651
netdev->features |= NETIF_F_NETNS_LOCAL;
648652
}
649653

include/linux/mlx5/mlx5_ifc.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9475,16 +9475,22 @@ struct mlx5_ifc_pcmr_reg_bits {
94759475
u8 reserved_at_0[0x8];
94769476
u8 local_port[0x8];
94779477
u8 reserved_at_10[0x10];
9478+
94789479
u8 entropy_force_cap[0x1];
94799480
u8 entropy_calc_cap[0x1];
94809481
u8 entropy_gre_calc_cap[0x1];
9481-
u8 reserved_at_23[0x1b];
9482+
u8 reserved_at_23[0xf];
9483+
u8 rx_ts_over_crc_cap[0x1];
9484+
u8 reserved_at_33[0xb];
94829485
u8 fcs_cap[0x1];
94839486
u8 reserved_at_3f[0x1];
9487+
94849488
u8 entropy_force[0x1];
94859489
u8 entropy_calc[0x1];
94869490
u8 entropy_gre_calc[0x1];
9487-
u8 reserved_at_43[0x1b];
9491+
u8 reserved_at_43[0xf];
9492+
u8 rx_ts_over_crc[0x1];
9493+
u8 reserved_at_53[0xb];
94889494
u8 fcs_chk[0x1];
94899495
u8 reserved_at_5f[0x1];
94909496
};

0 commit comments

Comments
 (0)