> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf
> Of Jedrzej Jagielski
> Sent: Thursday, July 2, 2026 11:16 AM
> To: [email protected]
> Cc: Nguyen, Anthony L <[email protected]>;
> [email protected]; Jagielski, Jedrzej
> <[email protected]>
> Subject: [Intel-wired-lan] [PATCH iwl-next v1 5/6] ixgbe: E610: add
> MAC address runtime refresh
> 
> Whenever MGMT requests MAC addr change and FW does it, driver does not
> get aligned to that change. Current - legacy approach doesn't handle
> such scenario.
> 
> Poll RAR0 (Receive Address Register) each service task cycle and
> update driver and netdev structs once new MAC addr is detected. It may
> happen that FW updates MAC address stored in RAR0 during runtime so SW
> shall fetch the new address.
> 
> Refresh addr also during reset path to ensure the address survives
> RAR0 clearing during init_hw().
> 
> Signed-off-by: Jedrzej Jagielski <[email protected]>
> ---
>  drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 37
> +++++++++++++++++++
>  1 file changed, 37 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> index d1cfe913081f..ce2b1e208c0f 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
> @@ -6499,6 +6499,36 @@ void ixgbe_disable_tx(struct ixgbe_adapter
> *adapter)
>       }
>  }
> 
> +static void ixgbe_mac_addr_refresh(struct ixgbe_adapter *adapter) {
> +     struct net_device *netdev = adapter->netdev;
> +     struct ixgbe_hw *hw = &adapter->hw;
> +     int err;
> +
> +     if (hw->mac.type != ixgbe_mac_e610)
> +             return;
> +
> +     /* fetch address stored currently in RAR0 in case the addr has
> been
> +      * altered by FW; if so, use it as the default one
> +      */
> +     err = hw->mac.ops.get_mac_addr(hw, hw->mac.addr);
> +     if (err) {
> +             e_dev_warn("Cannot get MAC address\n");
> +             return;
> +     }
> +
> +     if (ether_addr_equal(netdev->dev_addr, hw->mac.addr) ||
> +         !is_valid_ether_addr(hw->mac.addr))
> +             return;
> +
> +     ASSERT_RTNL();
> +
> +     eth_hw_addr_set(netdev, hw->mac.addr);
> +     ether_addr_copy(adapter->mac_table[0].addr, hw->mac.addr);
> +
> +     call_netdevice_notifiers(NETDEV_CHANGEADDR, netdev); }
> +
>  void ixgbe_reset(struct ixgbe_adapter *adapter)  {
>       struct ixgbe_hw *hw = &adapter->hw;
> @@ -6516,6 +6546,8 @@ void ixgbe_reset(struct ixgbe_adapter *adapter)
>                            IXGBE_FLAG2_SFP_NEEDS_RESET);
>       adapter->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;
> 
> +     ixgbe_mac_addr_refresh(adapter);
> +
>       err = hw->mac.ops.init_hw(hw);
>       switch (err) {
>       case 0:
> @@ -8701,6 +8733,11 @@ static void ixgbe_service_task(struct
> work_struct *work)
>                       ixgbe_handle_fw_event(adapter);
>               ixgbe_check_media_subtask(adapter);
>       }
> +
> +     rtnl_lock();
> +     ixgbe_mac_addr_refresh(adapter);
> +     rtnl_unlock();
> +
>       ixgbe_reset_subtask(adapter);
>       ixgbe_phy_interrupt_subtask(adapter);
>       ixgbe_sfp_detection_subtask(adapter);
> --
> 2.31.1


Reviewed-by: Aleksandr Loktionov <[email protected]>

Reply via email to