| From 7652796845de9d17ec6c5eb5c7d4bb7f9e0a5a7d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 17 Mar 2026 19:08:06 +0200 |
| Subject: ionic: fix persistent MAC address override on PF |
| |
| From: Mohammad Heib <mheib@redhat.com> |
| |
| [ Upstream commit cbcb3cfcdc436d6f91a3d95ecfa9c831abe14aed ] |
| |
| The use of IONIC_CMD_LIF_SETATTR in the MAC address update path causes |
| the ionic firmware to update the LIF's identity in its persistent state. |
| Since the firmware state is maintained across host warm boots and driver |
| reloads, any MAC change on the Physical Function (PF) becomes "sticky. |
| |
| This is problematic because it causes ethtool -P to report the |
| user-configured MAC as the permanent factory address, which breaks |
| system management tools that rely on a stable hardware identity. |
| |
| While Virtual Functions (VFs) need this hardware-level programming to |
| properly handle MAC assignments in guest environments, the PF should |
| maintain standard transient behavior. This patch gates the |
| ionic_program_mac call using is_virtfn so that PF MAC changes remain |
| local to the netdev filters and do not overwrite the firmware's |
| permanent identity block. |
| |
| Fixes: 19058be7c48c ("ionic: VF initial random MAC address if no assigned mac") |
| Signed-off-by: Mohammad Heib <mheib@redhat.com> |
| Reviewed-by: Simon Horman <horms@kernel.org> |
| Reviewed-by: Brett Creeley <brett.creeley@amd.com> |
| Link: https://patch.msgid.link/20260317170806.35390-1-mheib@redhat.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/pensando/ionic/ionic_lif.c | 17 +++++++++++------ |
| 1 file changed, 11 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c |
| index cdc3c55fab6ac..0e44e616c6da1 100644 |
| --- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c |
| +++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c |
| @@ -1763,13 +1763,18 @@ static int ionic_set_mac_address(struct net_device *netdev, void *sa) |
| if (ether_addr_equal(netdev->dev_addr, mac)) |
| return 0; |
| |
| - err = ionic_program_mac(lif, mac); |
| - if (err < 0) |
| - return err; |
| + /* Only program macs for virtual functions to avoid losing the permanent |
| + * Mac across warm reset/reboot. |
| + */ |
| + if (lif->ionic->pdev->is_virtfn) { |
| + err = ionic_program_mac(lif, mac); |
| + if (err < 0) |
| + return err; |
| |
| - if (err > 0) |
| - netdev_dbg(netdev, "%s: SET and GET ATTR Mac are not equal-due to old FW running\n", |
| - __func__); |
| + if (err > 0) |
| + netdev_dbg(netdev, "%s: SET and GET ATTR Mac are not equal-due to old FW running\n", |
| + __func__); |
| + } |
| |
| err = eth_prepare_mac_addr_change(netdev, addr); |
| if (err) |
| -- |
| 2.51.0 |
| |