NVIDIA: SAUCE: net: phy: realtek: Ack WOL interrupt

BugLink: https://bugs.launchpad.net/bugs/2072591

- toggle the WOL specific register bits on WOL interrupt
  to enable PME pin to be ready for next WOL trigger.
- used phy_write_paged() api for all phy writes to WOL
  specific registers.
- updated error codes check as per their API return values.

http://nvbugs/3574718

Signed-off-by: Sushil Singh <sushilkumars@nvidia.com>
Signed-off-by: Revanth Kumar Uppala <ruppala@nvidia.com>
Tested-by: Abhilash G <abhilashg@nvidia.com>
Reviewed-by: Abhilash G <abhilashg@nvidia.com>
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Acked-by: Jacob Martin <jacob.martin@canonical.com>
Acked-by: Noah Wager <noah.wager@canonical.com>
Signed-off-by: Noah Wager <noah.wager@canonical.com>
This commit is contained in:
Sushil Singh
2022-07-06 08:24:41 +05:30
committed by Noah Wager
parent 01de2c3559
commit 52edf67725
+28 -12
View File
@@ -128,24 +128,24 @@ static int rtl8211f_wol_settings(struct phy_device *phydev, bool enable)
/* Set WoL events and packet length */
if (enable) {
ret = phy_modify_paged_changed(phydev, RTL8211F_WOL_SETTING_PAGE, RTL8211F_WOL_REG_PACKET_LEN, 0x0,
ret = phy_write_paged(phydev, RTL8211F_WOL_SETTING_PAGE, RTL8211F_WOL_REG_PACKET_LEN,
(RTL8211F_WOL_PACKET_LEN |
RTL8211F_WOL_SET_PACKET_LEN));
if (ret)
if (ret < 0)
return ret;
ret = phy_modify_paged_changed(phydev, RTL8211F_WOL_SETTING_PAGE, RTL8211F_WOL_REG_FRAME_EVENT, 0x0,
ret = phy_write_paged(phydev, RTL8211F_WOL_SETTING_PAGE, RTL8211F_WOL_REG_FRAME_EVENT,
RTL8211F_WOL_ENABLE_MAGIC_PACKET);
if (ret)
if (ret < 0)
return ret;
} else {
ret = phy_modify_paged_changed(phydev, RTL8211F_WOL_SETTING_PAGE, RTL8211F_WOL_REG_PACKET_LEN, 0x0,
ret = phy_write_paged(phydev, RTL8211F_WOL_SETTING_PAGE, RTL8211F_WOL_REG_PACKET_LEN,
RTL8211F_WOL_PACKET_LEN);
if (ret)
if (ret < 0)
return ret;
ret = phy_modify_paged_changed(phydev, RTL8211F_WOL_SETTING_PAGE, RTL8211F_WOL_REG_FRAME_EVENT, 0x0, 0x0);
if (ret)
ret = phy_write_paged(phydev, RTL8211F_WOL_SETTING_PAGE, RTL8211F_WOL_REG_FRAME_EVENT, 0x0);
if (ret < 0)
return ret;
}
return 0;
@@ -221,10 +221,26 @@ static int rtl821x_ack_interrupt(struct phy_device *phydev)
static int rtl8211f_ack_interrupt(struct phy_device *phydev)
{
int err;
int err, ret;
err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR);
/* ack the WOL interrupt and toggle the WOL specific registers
* to enable PME pin for WOL trigger events for next time
* until disabled from ethtool ioctl
*/
if (err & RTL8211F_WOL_ENABLE_PMEB_EVENT) {
ret = rtl8211f_wol_settings(phydev, false);
if (ret < 0)
return ret;
ret = rtl8211f_wol_settings(phydev, true);
if (ret < 0)
return ret;
return 0;
}
return (err < 0) ? err : 0;
}
@@ -523,21 +539,21 @@ static int rtl8211f_config_init(struct phy_device *phydev)
phydev->attached_dev->dev_addr[MAC_ADDRESS_BYTE_0] |
(phydev->attached_dev->dev_addr[MAC_ADDRESS_BYTE_1]
<< BIT_SHIFT_8));
if (ret)
if (ret < 0)
return ret;
ret = phy_modify_paged_changed(phydev, RTL8211F_WOL_MAC_PAGE, RTL8211F_WOL_REG_MAC_WORD_1, 0x0,
phydev->attached_dev->dev_addr[MAC_ADDRESS_BYTE_2] |
(phydev->attached_dev->dev_addr[MAC_ADDRESS_BYTE_3]
<< BIT_SHIFT_8));
if (ret)
if (ret < 0)
return ret;
ret = phy_modify_paged_changed(phydev, RTL8211F_WOL_MAC_PAGE, RTL8211F_WOL_REG_MAC_WORD_2, 0x0,
phydev->attached_dev->dev_addr[MAC_ADDRESS_BYTE_4] |
(phydev->attached_dev->dev_addr[MAC_ADDRESS_BYTE_5]
<< BIT_SHIFT_8));
if (ret)
if (ret < 0)
return ret;
return genphy_soft_reset(phydev);