aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMitch Williams <mitch.a.williams@intel.com>2008-01-29 15:43:02 -0500
committerDavid S. Miller <davem@davemloft.net>2008-02-03 07:26:27 -0500
commitefb90e43ffee4045efe76de90773c4a5963515a3 (patch)
tree64c78531adb5fecde14bdb5904b81f0f731775c0
parent4a51c0d02c18ea2fea7611bcaf028e69201580d4 (diff)
e1000e: add new wakeup cababilities
Ethtool supports wake-on-ARP and wake-on-link, and so does the hardware supported by e1000e. This patch just introduces the two. Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> Signed-off-by: Jeff Garzik <jeff@garzik.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/e1000e/defines.h1
-rw-r--r--drivers/net/e1000e/ethtool.c13
2 files changed, 12 insertions, 2 deletions
diff --git a/drivers/net/e1000e/defines.h b/drivers/net/e1000e/defines.h
index f2175ea46b83..6232c3e96689 100644
--- a/drivers/net/e1000e/defines.h
+++ b/drivers/net/e1000e/defines.h
@@ -63,6 +63,7 @@
63#define E1000_WUFC_EX 0x00000004 /* Directed Exact Wakeup Enable */ 63#define E1000_WUFC_EX 0x00000004 /* Directed Exact Wakeup Enable */
64#define E1000_WUFC_MC 0x00000008 /* Directed Multicast Wakeup Enable */ 64#define E1000_WUFC_MC 0x00000008 /* Directed Multicast Wakeup Enable */
65#define E1000_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */ 65#define E1000_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */
66#define E1000_WUFC_ARP 0x00000020 /* ARP Request Packet Wakeup Enable */
66 67
67/* Extended Device Control */ 68/* Extended Device Control */
68#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Defineable Pin 7 */ 69#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Defineable Pin 7 */
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c
index 6d9c27fd0b53..9fab44463573 100644
--- a/drivers/net/e1000e/ethtool.c
+++ b/drivers/net/e1000e/ethtool.c
@@ -1632,7 +1632,8 @@ static void e1000_get_wol(struct net_device *netdev,
1632 return; 1632 return;
1633 1633
1634 wol->supported = WAKE_UCAST | WAKE_MCAST | 1634 wol->supported = WAKE_UCAST | WAKE_MCAST |
1635 WAKE_BCAST | WAKE_MAGIC; 1635 WAKE_BCAST | WAKE_MAGIC |
1636 WAKE_PHY | WAKE_ARP;
1636 1637
1637 /* apply any specific unsupported masks here */ 1638 /* apply any specific unsupported masks here */
1638 if (adapter->flags & FLAG_NO_WAKE_UCAST) { 1639 if (adapter->flags & FLAG_NO_WAKE_UCAST) {
@@ -1651,6 +1652,10 @@ static void e1000_get_wol(struct net_device *netdev,
1651 wol->wolopts |= WAKE_BCAST; 1652 wol->wolopts |= WAKE_BCAST;
1652 if (adapter->wol & E1000_WUFC_MAG) 1653 if (adapter->wol & E1000_WUFC_MAG)
1653 wol->wolopts |= WAKE_MAGIC; 1654 wol->wolopts |= WAKE_MAGIC;
1655 if (adapter->wol & E1000_WUFC_LNKC)
1656 wol->wolopts |= WAKE_PHY;
1657 if (adapter->wol & E1000_WUFC_ARP)
1658 wol->wolopts |= WAKE_ARP;
1654} 1659}
1655 1660
1656static int e1000_set_wol(struct net_device *netdev, 1661static int e1000_set_wol(struct net_device *netdev,
@@ -1658,7 +1663,7 @@ static int e1000_set_wol(struct net_device *netdev,
1658{ 1663{
1659 struct e1000_adapter *adapter = netdev_priv(netdev); 1664 struct e1000_adapter *adapter = netdev_priv(netdev);
1660 1665
1661 if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE)) 1666 if (wol->wolopts & WAKE_MAGICSECURE)
1662 return -EOPNOTSUPP; 1667 return -EOPNOTSUPP;
1663 1668
1664 if (!(adapter->flags & FLAG_HAS_WOL)) 1669 if (!(adapter->flags & FLAG_HAS_WOL))
@@ -1675,6 +1680,10 @@ static int e1000_set_wol(struct net_device *netdev,
1675 adapter->wol |= E1000_WUFC_BC; 1680 adapter->wol |= E1000_WUFC_BC;
1676 if (wol->wolopts & WAKE_MAGIC) 1681 if (wol->wolopts & WAKE_MAGIC)
1677 adapter->wol |= E1000_WUFC_MAG; 1682 adapter->wol |= E1000_WUFC_MAG;
1683 if (wol->wolopts & WAKE_PHY)
1684 adapter->wol |= E1000_WUFC_LNKC;
1685 if (wol->wolopts & WAKE_ARP)
1686 adapter->wol |= E1000_WUFC_ARP;
1678 1687
1679 return 0; 1688 return 0;
1680} 1689}