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:
+28
-12
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user