net: atlantic: add set_power to fw_ops for atl2 to fix wol
Subsystems (3)
PATCH 1/1 net: atlantic: add set_power to fw_ops for atl2 to fix wol
Aquantia AQC113(C) using ATL2FW doesn't properly prepare the NIC for enabling wake-on-lan. The FW operation set_power was only implemented for hw_atl and not hw_atl2. Implement the set_power functionality for hw_atl2.
Tested with both AQC113 and AQC113C devices. Confirmed you can shutdown the system and wake from S5 using magic packets. NIC was previously powered off when entering S5. If the NIC was configured for WOL by the Windows driver, loading the atlantic driver would disable WOL.
Partially cherry-picks changes from commit,
https://github.com/Aquantia/AQtion/commit/37bd5cc
Attributing original authors from Marvell for the referenced commit.
---
Notes:
The changes within this patch were originally written by developers from Marvell (formerly Aquantia) as mentioned in the patch trailer using Co-developed-by. Adding the set_power function for ATL2FW was one of many changes that were released as part of the v2.4.7 update for the vendor atlantic driver. I have only copied the functions necessary to enable WoL and modified the required functions to work with the upstream Linux kernel and followed netdev conventions (reverse xmas).
The latest driver from Marvell can be obtained from the following page,
https://www.marvell.com/support/downloads.html, resulting in the link,
https://www.marvell.com/content/dam/marvell/en/drivers/07-18-24_Marvell_Linux_2.5.12.zip
An earlier version of the driver was published by Aquantia on GitHub at
https://github.com/aquantia/AQtion. The community has been using this GitHub project to discuss issues with the atlantic driver (even those not present in the GitHub repo), including the lack of WoL support in the upstream Linux kernel.
.../net/ethernet/aquantia/atlantic/aq_hw.h | 2 + .../atlantic/hw_atl2/hw_atl2_utils_fw.c | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+)
drivers/net/ethernet/aquantia/atlantic/aq_hw.h +2 -0
@@ -113,6 +113,8 @@ struct aq_stats_s {#define AQ_HW_POWER_STATE_D0 0U#define AQ_HW_POWER_STATE_D3 3U +#define AQ_FW_WAKE_ON_LINK_RTPM BIT(10) +#define AQ_HW_FLAG_STARTED 0x00000004U#define AQ_HW_FLAG_STOPPING 0x00000008U#define AQ_HW_FLAG_RESETTING 0x00000010U
drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c +39 -0
@@ -462,6 +462,44 @@ static int aq_a2_fw_get_mac_temp(struct aq_hw_s *self, int *temp)return aq_a2_fw_get_phy_temp (self, temp); } +static int aq_a2_fw_set_wol_params (struct aq_hw_s *self,const u8 *mac,u32 wol) +{ +struct mac_address_aligned_s mac_address; +struct link_control_s link_control; +struct wake_on_lan_s wake_on_lan; + +memcpy (mac_address.aligned.mac_address, mac,ETH_ALEN ); +hw_atl2_shared_buffer_write (self, mac_address, mac_address); + +memset (&wake_on_lan,0 ,sizeof (wake_on_lan)); + +if (wol &WAKE_MAGIC ) + wake_on_lan.wake_on_magic_packet =1U ; + +if (wol & (WAKE_PHY |AQ_FW_WAKE_ON_LINK_RTPM )) + wake_on_lan.wake_on_link_up =1U ; + +hw_atl2_shared_buffer_write (self, sleep_proxy, wake_on_lan); + +hw_atl2_shared_buffer_get (self, link_control, link_control); + link_control.mode =AQ_HOST_MODE_SLEEP_PROXY ; +hw_atl2_shared_buffer_write (self, link_control, link_control); + +return hw_atl2_shared_buffer_finish_ack (self); +} + +static int aq_a2_fw_set_power (struct aq_hw_s *self,unsigned int power_state, +const u8 *mac) +{ +u32 wol = self->aq_nic_cfg->wol; +int err =0 ; + +if (wol) + err =aq_a2_fw_set_wol_params (self, mac, wol); + +return err; +} +static int aq_a2_fw_set_eee_rate (struct aq_hw_s *self,u32 speed) {struct link_options_s link_options;
@@ -605,6 +643,7 @@ const struct aq_fw_ops aq_a2_fw_ops = { .set_state = aq_a2_fw_set_state, .update_link_status = aq_a2_fw_update_link_status, .update_stats = aq_a2_fw_update_stats, + .set_power = aq_a2_fw_set_power, .get_mac_temp = aq_a2_fw_get_mac_temp, .get_phy_temp = aq_a2_fw_get_phy_temp, .set_eee_rate = aq_a2_fw_set_eee_rate,
Signature · 1 line
2.49.0
Quoted 1 line
Aquantia AQC113(C) using ATL2FW doesn't properly prepare the NIC for enabling wake-on-lan. The FW operation
set_powerwas only implemented forhw_atland nothw_atl2. Implement theset_powerfunctionality forhw_atl2. Tested with both
Hi Eric,
Thanks for noticing this and working on this.
This patch was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Hello:
This patch was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Quoted 11 lines · On Sat, 28 Jun 2025 22:15:28 -0700 you wrote:
Aquantia AQC113(C) using ATL2FW doesn't properly prepare the NIC for enabling wake-on-lan. The FW operation
set_powerwas only implemented forhw_atland nothw_atl2. Implement theset_powerfunctionality forhw_atl2.Tested with both AQC113 and AQC113C devices. Confirmed you can shutdown the system and wake from S5 using magic packets. NIC was previously powered off when entering S5. If the NIC was configured for WOL by the Windows driver, loading the atlantic driver would disable WOL.
[...]
Here is the summary with links:
- [net-next] net: atlantic: add set_power to fw_ops for atl2 to fix wol
https://git.kernel.org/netdev/net-next/c/fad9cf216597
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html