Commit 3fd6c88ef875a14740801ebfc6b6e4e064a1cdd4

Authored by Jan Beulich
Committed by David S. Miller
1 parent 2cc6d2bf3d

3c59x: fix regression from patch "Add ethtool WOL support"

This patch (commit 690a1f2002a3091bd18a501f46c9530f10481463) added a
new call site for acpi_set_WOL() without checking that the function is
actually suitable to be called via

 vortex_set_wol+0xcd/0xe0 [3c59x]
 dev_ethtool+0xa5a/0xb70
 dev_ioctl+0x2e0/0x4b0
 T.961+0x49/0x50
 sock_ioctl+0x47/0x290
 do_vfs_ioctl+0x7f/0x340
 sys_ioctl+0x80/0xa0
 system_call_fastpath+0x16/0x1b

i.e. outside of code paths run when the device is not yet enabled or
already disabled. In particular, putting the device into D3hot is a
pretty bad idea when it was already brought up.

Furthermore, all prior callers of the function made sure they're
actually dealing with a PCI device, while the newly added one didn't.

In the same spirit, the .get_wol handler shouldn't indicate support
for WOL for non-PCI devices.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 10 additions and 0 deletions Side-by-side Diff

... ... @@ -2942,6 +2942,9 @@
2942 2942 {
2943 2943 struct vortex_private *vp = netdev_priv(dev);
2944 2944  
  2945 + if (!VORTEX_PCI(vp))
  2946 + return;
  2947 +
2945 2948 wol->supported = WAKE_MAGIC;
2946 2949  
2947 2950 wol->wolopts = 0;
... ... @@ -2952,6 +2955,10 @@
2952 2955 static int vortex_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
2953 2956 {
2954 2957 struct vortex_private *vp = netdev_priv(dev);
  2958 +
  2959 + if (!VORTEX_PCI(vp))
  2960 + return -EOPNOTSUPP;
  2961 +
2955 2962 if (wol->wolopts & ~WAKE_MAGIC)
2956 2963 return -EINVAL;
2957 2964  
... ... @@ -3200,6 +3207,9 @@
3200 3207 vp->enable_wol = 0;
3201 3208 return;
3202 3209 }
  3210 +
  3211 + if (VORTEX_PCI(vp)->current_state < PCI_D3hot)
  3212 + return;
3203 3213  
3204 3214 /* Change the power state to D3; RxEnable doesn't take effect. */
3205 3215 pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot);