Skip to content

Commit 24be090

Browse files
committed
Merge branch 'mlx5-misc-fixes-2025-08-25'
Mark Bloch says: ==================== mlx5 misc fixes 2025-08-25 This patchset provides misc bug fixes from the team to the mlx5 core and Eth drivers. v1: https://lore.kernel.org/[email protected] ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents aa125f0 + aca0c31 commit 24be090

File tree

12 files changed

+136
-67
lines changed

12 files changed

+136
-67
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ static int mlx5_devlink_reload_fw_activate(struct devlink *devlink, struct netli
160160
if (err)
161161
return err;
162162

163-
mlx5_unload_one_devl_locked(dev, true);
163+
mlx5_sync_reset_unload_flow(dev, true);
164164
err = mlx5_health_wait_pci_up(dev);
165165
if (err)
166166
NL_SET_ERR_MSG_MOD(extack, "FW activate aborted, PCI reads fail after reset");

drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,6 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
575575
if (err)
576576
return err;
577577
}
578-
priv->dcbx.xoff = xoff;
579578

580579
/* Apply the settings */
581580
if (update_buffer) {
@@ -584,6 +583,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
584583
return err;
585584
}
586585

586+
priv->dcbx.xoff = xoff;
587+
587588
if (update_prio2buffer)
588589
err = mlx5e_port_set_priority2buffer(priv->mdev, prio2buffer);
589590

drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,23 @@ struct mlx5e_port_buffer {
6666
struct mlx5e_bufferx_reg buffer[MLX5E_MAX_NETWORK_BUFFER];
6767
};
6868

69+
#ifdef CONFIG_MLX5_CORE_EN_DCB
6970
int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
7071
u32 change, unsigned int mtu,
7172
struct ieee_pfc *pfc,
7273
u32 *buffer_size,
7374
u8 *prio2buffer);
75+
#else
76+
static inline int
77+
mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
78+
u32 change, unsigned int mtu,
79+
void *pfc,
80+
u32 *buffer_size,
81+
u8 *prio2buffer)
82+
{
83+
return 0;
84+
}
85+
#endif
7486

7587
int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
7688
struct mlx5e_port_buffer *port_buffer);

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "en.h"
5050
#include "en/dim.h"
5151
#include "en/txrx.h"
52+
#include "en/port_buffer.h"
5253
#include "en_tc.h"
5354
#include "en_rep.h"
5455
#include "en_accel/ipsec.h"
@@ -138,6 +139,8 @@ void mlx5e_update_carrier(struct mlx5e_priv *priv)
138139
if (up) {
139140
netdev_info(priv->netdev, "Link up\n");
140141
netif_carrier_on(priv->netdev);
142+
mlx5e_port_manual_buffer_config(priv, 0, priv->netdev->mtu,
143+
NULL, NULL, NULL);
141144
} else {
142145
netdev_info(priv->netdev, "Link down\n");
143146
netif_carrier_off(priv->netdev);
@@ -3040,9 +3043,11 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
30403043
struct mlx5e_params *params = &priv->channels.params;
30413044
struct net_device *netdev = priv->netdev;
30423045
struct mlx5_core_dev *mdev = priv->mdev;
3043-
u16 mtu;
3046+
u16 mtu, prev_mtu;
30443047
int err;
30453048

3049+
mlx5e_query_mtu(mdev, params, &prev_mtu);
3050+
30463051
err = mlx5e_set_mtu(mdev, params, params->sw_mtu);
30473052
if (err)
30483053
return err;
@@ -3052,6 +3057,18 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
30523057
netdev_warn(netdev, "%s: VPort MTU %d is different than netdev mtu %d\n",
30533058
__func__, mtu, params->sw_mtu);
30543059

3060+
if (mtu != prev_mtu && MLX5_BUFFER_SUPPORTED(mdev)) {
3061+
err = mlx5e_port_manual_buffer_config(priv, 0, mtu,
3062+
NULL, NULL, NULL);
3063+
if (err) {
3064+
netdev_warn(netdev, "%s: Failed to set Xon/Xoff values with MTU %d (err %d), setting back to previous MTU %d\n",
3065+
__func__, mtu, err, prev_mtu);
3066+
3067+
mlx5e_set_mtu(mdev, params, prev_mtu);
3068+
return err;
3069+
}
3070+
}
3071+
30553072
params->sw_mtu = mtu;
30563073
return 0;
30573074
}

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3734,6 +3734,13 @@ static int mlx5_fs_mode_validate(struct devlink *devlink, u32 id,
37343734
char *value = val.vstr;
37353735
u8 eswitch_mode;
37363736

3737+
eswitch_mode = mlx5_eswitch_mode(dev);
3738+
if (eswitch_mode == MLX5_ESWITCH_OFFLOADS) {
3739+
NL_SET_ERR_MSG_FMT_MOD(extack,
3740+
"Changing fs mode is not supported when eswitch offloads enabled.");
3741+
return -EOPNOTSUPP;
3742+
}
3743+
37373744
if (!strcmp(value, "dmfs"))
37383745
return 0;
37393746

@@ -3759,14 +3766,6 @@ static int mlx5_fs_mode_validate(struct devlink *devlink, u32 id,
37593766
return -EINVAL;
37603767
}
37613768

3762-
eswitch_mode = mlx5_eswitch_mode(dev);
3763-
if (eswitch_mode == MLX5_ESWITCH_OFFLOADS) {
3764-
NL_SET_ERR_MSG_FMT_MOD(extack,
3765-
"Moving to %s is not supported when eswitch offloads enabled.",
3766-
value);
3767-
return -EOPNOTSUPP;
3768-
}
3769-
37703769
return 0;
37713770
}
37723771

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

Lines changed: 73 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66
#include "fw_reset.h"
77
#include "diag/fw_tracer.h"
88
#include "lib/tout.h"
9+
#include "sf/sf.h"
910

1011
enum {
1112
MLX5_FW_RESET_FLAGS_RESET_REQUESTED,
1213
MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST,
1314
MLX5_FW_RESET_FLAGS_PENDING_COMP,
1415
MLX5_FW_RESET_FLAGS_DROP_NEW_REQUESTS,
15-
MLX5_FW_RESET_FLAGS_RELOAD_REQUIRED
16+
MLX5_FW_RESET_FLAGS_RELOAD_REQUIRED,
17+
MLX5_FW_RESET_FLAGS_UNLOAD_EVENT,
1618
};
1719

1820
struct mlx5_fw_reset {
@@ -219,7 +221,7 @@ int mlx5_fw_reset_set_live_patch(struct mlx5_core_dev *dev)
219221
return mlx5_reg_mfrl_set(dev, MLX5_MFRL_REG_RESET_LEVEL0, 0, 0, false);
220222
}
221223

222-
static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev, bool unloaded)
224+
static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev)
223225
{
224226
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
225227
struct devlink *devlink = priv_to_devlink(dev);
@@ -228,8 +230,7 @@ static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev, bool unload
228230
if (test_bit(MLX5_FW_RESET_FLAGS_PENDING_COMP, &fw_reset->reset_flags)) {
229231
complete(&fw_reset->done);
230232
} else {
231-
if (!unloaded)
232-
mlx5_unload_one(dev, false);
233+
mlx5_sync_reset_unload_flow(dev, false);
233234
if (mlx5_health_wait_pci_up(dev))
234235
mlx5_core_err(dev, "reset reload flow aborted, PCI reads still not working\n");
235236
else
@@ -272,7 +273,7 @@ static void mlx5_sync_reset_reload_work(struct work_struct *work)
272273

273274
mlx5_sync_reset_clear_reset_requested(dev, false);
274275
mlx5_enter_error_state(dev, true);
275-
mlx5_fw_reset_complete_reload(dev, false);
276+
mlx5_fw_reset_complete_reload(dev);
276277
}
277278

278279
#define MLX5_RESET_POLL_INTERVAL (HZ / 10)
@@ -428,6 +429,11 @@ static bool mlx5_is_reset_now_capable(struct mlx5_core_dev *dev,
428429
return false;
429430
}
430431

432+
if (!mlx5_core_is_ecpf(dev) && !mlx5_sf_table_empty(dev)) {
433+
mlx5_core_warn(dev, "SFs should be removed before reset\n");
434+
return false;
435+
}
436+
431437
#if IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE)
432438
if (reset_method != MLX5_MFRL_REG_PCI_RESET_METHOD_HOT_RESET) {
433439
err = mlx5_check_hotplug_interrupt(dev, bridge);
@@ -586,6 +592,65 @@ static int mlx5_sync_pci_reset(struct mlx5_core_dev *dev, u8 reset_method)
586592
return err;
587593
}
588594

595+
void mlx5_sync_reset_unload_flow(struct mlx5_core_dev *dev, bool locked)
596+
{
597+
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
598+
unsigned long timeout;
599+
int poll_freq = 20;
600+
bool reset_action;
601+
u8 rst_state;
602+
int err;
603+
604+
if (locked)
605+
mlx5_unload_one_devl_locked(dev, false);
606+
else
607+
mlx5_unload_one(dev, false);
608+
609+
if (!test_bit(MLX5_FW_RESET_FLAGS_UNLOAD_EVENT, &fw_reset->reset_flags))
610+
return;
611+
612+
mlx5_set_fw_rst_ack(dev);
613+
mlx5_core_warn(dev, "Sync Reset Unload done, device reset expected\n");
614+
615+
reset_action = false;
616+
timeout = jiffies + msecs_to_jiffies(mlx5_tout_ms(dev, RESET_UNLOAD));
617+
do {
618+
rst_state = mlx5_get_fw_rst_state(dev);
619+
if (rst_state == MLX5_FW_RST_STATE_TOGGLE_REQ ||
620+
rst_state == MLX5_FW_RST_STATE_IDLE) {
621+
reset_action = true;
622+
break;
623+
}
624+
if (rst_state == MLX5_FW_RST_STATE_DROP_MODE) {
625+
mlx5_core_info(dev, "Sync Reset Drop mode ack\n");
626+
mlx5_set_fw_rst_ack(dev);
627+
poll_freq = 1000;
628+
}
629+
msleep(poll_freq);
630+
} while (!time_after(jiffies, timeout));
631+
632+
if (!reset_action) {
633+
mlx5_core_err(dev, "Got timeout waiting for sync reset action, state = %u\n",
634+
rst_state);
635+
fw_reset->ret = -ETIMEDOUT;
636+
goto done;
637+
}
638+
639+
mlx5_core_warn(dev, "Sync Reset, got reset action. rst_state = %u\n",
640+
rst_state);
641+
if (rst_state == MLX5_FW_RST_STATE_TOGGLE_REQ) {
642+
err = mlx5_sync_pci_reset(dev, fw_reset->reset_method);
643+
if (err) {
644+
mlx5_core_warn(dev, "mlx5_sync_pci_reset failed, err %d\n",
645+
err);
646+
fw_reset->ret = err;
647+
}
648+
}
649+
650+
done:
651+
clear_bit(MLX5_FW_RESET_FLAGS_UNLOAD_EVENT, &fw_reset->reset_flags);
652+
}
653+
589654
static void mlx5_sync_reset_now_event(struct work_struct *work)
590655
{
591656
struct mlx5_fw_reset *fw_reset = container_of(work, struct mlx5_fw_reset,
@@ -613,17 +678,13 @@ static void mlx5_sync_reset_now_event(struct work_struct *work)
613678
mlx5_enter_error_state(dev, true);
614679
done:
615680
fw_reset->ret = err;
616-
mlx5_fw_reset_complete_reload(dev, false);
681+
mlx5_fw_reset_complete_reload(dev);
617682
}
618683

619684
static void mlx5_sync_reset_unload_event(struct work_struct *work)
620685
{
621686
struct mlx5_fw_reset *fw_reset;
622687
struct mlx5_core_dev *dev;
623-
unsigned long timeout;
624-
int poll_freq = 20;
625-
bool reset_action;
626-
u8 rst_state;
627688
int err;
628689

629690
fw_reset = container_of(work, struct mlx5_fw_reset, reset_unload_work);
@@ -632,6 +693,7 @@ static void mlx5_sync_reset_unload_event(struct work_struct *work)
632693
if (mlx5_sync_reset_clear_reset_requested(dev, false))
633694
return;
634695

696+
set_bit(MLX5_FW_RESET_FLAGS_UNLOAD_EVENT, &fw_reset->reset_flags);
635697
mlx5_core_warn(dev, "Sync Reset Unload. Function is forced down.\n");
636698

637699
err = mlx5_cmd_fast_teardown_hca(dev);
@@ -640,49 +702,7 @@ static void mlx5_sync_reset_unload_event(struct work_struct *work)
640702
else
641703
mlx5_enter_error_state(dev, true);
642704

643-
if (test_bit(MLX5_FW_RESET_FLAGS_PENDING_COMP, &fw_reset->reset_flags))
644-
mlx5_unload_one_devl_locked(dev, false);
645-
else
646-
mlx5_unload_one(dev, false);
647-
648-
mlx5_set_fw_rst_ack(dev);
649-
mlx5_core_warn(dev, "Sync Reset Unload done, device reset expected\n");
650-
651-
reset_action = false;
652-
timeout = jiffies + msecs_to_jiffies(mlx5_tout_ms(dev, RESET_UNLOAD));
653-
do {
654-
rst_state = mlx5_get_fw_rst_state(dev);
655-
if (rst_state == MLX5_FW_RST_STATE_TOGGLE_REQ ||
656-
rst_state == MLX5_FW_RST_STATE_IDLE) {
657-
reset_action = true;
658-
break;
659-
}
660-
if (rst_state == MLX5_FW_RST_STATE_DROP_MODE) {
661-
mlx5_core_info(dev, "Sync Reset Drop mode ack\n");
662-
mlx5_set_fw_rst_ack(dev);
663-
poll_freq = 1000;
664-
}
665-
msleep(poll_freq);
666-
} while (!time_after(jiffies, timeout));
667-
668-
if (!reset_action) {
669-
mlx5_core_err(dev, "Got timeout waiting for sync reset action, state = %u\n",
670-
rst_state);
671-
fw_reset->ret = -ETIMEDOUT;
672-
goto done;
673-
}
674-
675-
mlx5_core_warn(dev, "Sync Reset, got reset action. rst_state = %u\n", rst_state);
676-
if (rst_state == MLX5_FW_RST_STATE_TOGGLE_REQ) {
677-
err = mlx5_sync_pci_reset(dev, fw_reset->reset_method);
678-
if (err) {
679-
mlx5_core_warn(dev, "mlx5_sync_pci_reset failed, err %d\n", err);
680-
fw_reset->ret = err;
681-
}
682-
}
683-
684-
done:
685-
mlx5_fw_reset_complete_reload(dev, true);
705+
mlx5_fw_reset_complete_reload(dev);
686706
}
687707

688708
static void mlx5_sync_reset_abort_event(struct work_struct *work)

drivers/net/ethernet/mellanox/mlx5/core/fw_reset.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ int mlx5_fw_reset_set_reset_sync(struct mlx5_core_dev *dev, u8 reset_type_sel,
1212
int mlx5_fw_reset_set_live_patch(struct mlx5_core_dev *dev);
1313

1414
int mlx5_fw_reset_wait_reset_done(struct mlx5_core_dev *dev);
15+
void mlx5_sync_reset_unload_flow(struct mlx5_core_dev *dev, bool locked);
1516
int mlx5_fw_reset_verify_fw_complete(struct mlx5_core_dev *dev,
1617
struct netlink_ext_ack *extack);
1718
void mlx5_fw_reset_events_start(struct mlx5_core_dev *dev);

drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,3 +518,13 @@ void mlx5_sf_table_cleanup(struct mlx5_core_dev *dev)
518518
WARN_ON(!xa_empty(&table->function_ids));
519519
kfree(table);
520520
}
521+
522+
bool mlx5_sf_table_empty(const struct mlx5_core_dev *dev)
523+
{
524+
struct mlx5_sf_table *table = dev->priv.sf_table;
525+
526+
if (!table)
527+
return true;
528+
529+
return xa_empty(&table->function_ids);
530+
}

drivers/net/ethernet/mellanox/mlx5/core/sf/sf.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ void mlx5_sf_hw_table_destroy(struct mlx5_core_dev *dev);
1717

1818
int mlx5_sf_table_init(struct mlx5_core_dev *dev);
1919
void mlx5_sf_table_cleanup(struct mlx5_core_dev *dev);
20+
bool mlx5_sf_table_empty(const struct mlx5_core_dev *dev);
2021

2122
int mlx5_devlink_sf_port_new(struct devlink *devlink,
2223
const struct devlink_port_new_attrs *add_attr,
@@ -61,6 +62,11 @@ static inline void mlx5_sf_table_cleanup(struct mlx5_core_dev *dev)
6162
{
6263
}
6364

65+
static inline bool mlx5_sf_table_empty(const struct mlx5_core_dev *dev)
66+
{
67+
return true;
68+
}
69+
6470
#endif
6571

6672
#endif

drivers/net/ethernet/mellanox/mlx5/core/steering/hws/action.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ static int hws_action_get_shared_stc_nic(struct mlx5hws_context *ctx,
117117
mlx5hws_err(ctx, "No such stc_type: %d\n", stc_type);
118118
pr_warn("HWS: Invalid stc_type: %d\n", stc_type);
119119
ret = -EINVAL;
120-
goto unlock_and_out;
120+
goto free_shared_stc;
121121
}
122122

123123
ret = mlx5hws_action_alloc_single_stc(ctx, &stc_attr, tbl_type,

0 commit comments

Comments
 (0)