netxen: advertise wake-on-lan support
authorDhananjay Phadke <dhananjay@netxen.com>
Wed, 25 Feb 2009 00:38:44 +0000 (16:38 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 25 Feb 2009 00:38:44 +0000 (16:38 -0800)
Add ethtool wake on lan support.

Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/netxen/netxen_nic_ethtool.c
drivers/net/netxen/netxen_nic_hdr.h

index 0894a7be02259cdd3e495405558a23ee7a39e5de..0012b3172f90eaf58de62689b25341e13912aab0 100644 (file)
@@ -810,6 +810,53 @@ static int netxen_nic_set_tso(struct net_device *dev, u32 data)
        return 0;
 }
 
+static void
+netxen_nic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+       struct netxen_adapter *adapter = netdev_priv(dev);
+       u32 wol_cfg = 0;
+
+       wol->supported = 0;
+       wol->wolopts = 0;
+
+       if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
+               return;
+
+       wol_cfg = netxen_nic_reg_read(adapter, NETXEN_WOL_CONFIG_NV);
+       if (wol_cfg & (1UL << adapter->portnum))
+               wol->supported |= WAKE_MAGIC;
+
+       wol_cfg = netxen_nic_reg_read(adapter, NETXEN_WOL_CONFIG);
+       if (wol_cfg & (1UL << adapter->portnum))
+               wol->wolopts |= WAKE_MAGIC;
+}
+
+static int
+netxen_nic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+       struct netxen_adapter *adapter = netdev_priv(dev);
+       u32 wol_cfg = 0;
+
+       if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
+               return -EOPNOTSUPP;
+
+       if (wol->wolopts & ~WAKE_MAGIC)
+               return -EOPNOTSUPP;
+
+       wol_cfg = netxen_nic_reg_read(adapter, NETXEN_WOL_CONFIG_NV);
+       if (!(wol_cfg & (1 << adapter->portnum)))
+               return -EOPNOTSUPP;
+
+       wol_cfg = netxen_nic_reg_read(adapter, NETXEN_WOL_CONFIG);
+       if (wol->wolopts & WAKE_MAGIC)
+               wol_cfg |= 1UL << adapter->portnum;
+       else
+               wol_cfg &= ~(1UL << adapter->portnum);
+       netxen_nic_reg_write(adapter, NETXEN_WOL_CONFIG, wol_cfg);
+
+       return 0;
+}
+
 /*
  * Set the coalescing parameters. Currently only normal is supported.
  * If rx_coalesce_usecs == 0 or rx_max_coalesced_frames == 0 then set the
@@ -916,6 +963,8 @@ struct ethtool_ops netxen_nic_ethtool_ops = {
        .set_sg = ethtool_op_set_sg,
        .get_tso = netxen_nic_get_tso,
        .set_tso = netxen_nic_set_tso,
+       .get_wol = netxen_nic_get_wol,
+       .set_wol = netxen_nic_set_wol,
        .self_test = netxen_nic_diag_test,
        .get_strings = netxen_nic_get_strings,
        .get_ethtool_stats = netxen_nic_get_ethtool_stats,
index 269a1f706889688695ed8b4391372966b932f537..4695246072f61e5d7c28fe50e2b81b0f2275b71c 100644 (file)
@@ -858,6 +858,9 @@ enum {
 #define NETXEN_PORT_MODE_ADDR          (NETXEN_CAM_RAM(0x24))
 #define NETXEN_WOL_PORT_MODE           (NETXEN_CAM_RAM(0x198))
 
+#define NETXEN_WOL_CONFIG_NV           (NETXEN_CAM_RAM(0x184))
+#define NETXEN_WOL_CONFIG              (NETXEN_CAM_RAM(0x188))
+
 #define NX_PEG_TUNE_MN_PRESENT         0x1
 #define NX_PEG_TUNE_CAPABILITY         (NETXEN_CAM_RAM(0x02c))