Commit 7daed8dc authored by hayeswang's avatar hayeswang Committed by David S. Miller

r8152: fix wakeup settings

Avoid the driver to enable WOL if the device doesn't support it.
Signed-off-by: default avatarHayes Wang <hayeswang@realtek.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b214396f
...@@ -2378,6 +2378,13 @@ static void r8153_power_cut_en(struct r8152 *tp, bool enable) ...@@ -2378,6 +2378,13 @@ static void r8153_power_cut_en(struct r8152 *tp, bool enable)
ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data); ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data);
} }
static bool rtl_can_wakeup(struct r8152 *tp)
{
struct usb_device *udev = tp->udev;
return (udev->actconfig->desc.bmAttributes & USB_CONFIG_ATT_WAKEUP);
}
static void rtl_runtime_suspend_enable(struct r8152 *tp, bool enable) static void rtl_runtime_suspend_enable(struct r8152 *tp, bool enable)
{ {
if (enable) { if (enable) {
...@@ -3417,12 +3424,15 @@ static void rtl8152_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) ...@@ -3417,12 +3424,15 @@ static void rtl8152_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
if (usb_autopm_get_interface(tp->intf) < 0) if (usb_autopm_get_interface(tp->intf) < 0)
return; return;
mutex_lock(&tp->control); if (!rtl_can_wakeup(tp)) {
wol->supported = 0;
wol->supported = WAKE_ANY; wol->wolopts = 0;
wol->wolopts = __rtl_get_wol(tp); } else {
mutex_lock(&tp->control);
mutex_unlock(&tp->control); wol->supported = WAKE_ANY;
wol->wolopts = __rtl_get_wol(tp);
mutex_unlock(&tp->control);
}
usb_autopm_put_interface(tp->intf); usb_autopm_put_interface(tp->intf);
} }
...@@ -3432,6 +3442,9 @@ static int rtl8152_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) ...@@ -3432,6 +3442,9 @@ static int rtl8152_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
struct r8152 *tp = netdev_priv(dev); struct r8152 *tp = netdev_priv(dev);
int ret; int ret;
if (!rtl_can_wakeup(tp))
return -EOPNOTSUPP;
ret = usb_autopm_get_interface(tp->intf); ret = usb_autopm_get_interface(tp->intf);
if (ret < 0) if (ret < 0)
goto out_set_wol; goto out_set_wol;
...@@ -4073,6 +4086,9 @@ static int rtl8152_probe(struct usb_interface *intf, ...@@ -4073,6 +4086,9 @@ static int rtl8152_probe(struct usb_interface *intf,
goto out1; goto out1;
} }
if (!rtl_can_wakeup(tp))
__rtl_set_wol(tp, 0);
tp->saved_wolopts = __rtl_get_wol(tp); tp->saved_wolopts = __rtl_get_wol(tp);
if (tp->saved_wolopts) if (tp->saved_wolopts)
device_set_wakeup_enable(&udev->dev, true); device_set_wakeup_enable(&udev->dev, true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment