Use the only working sourceforge.net mirror for gentext2fs, the others are ever not...
[openwrt.git] / package / libertas / src / ethtool.c
index 98757f1..21e6f98 100644 (file)
@@ -8,6 +8,8 @@
 #include "dev.h"
 #include "join.h"
 #include "wext.h"
+#include "cmd.h"
+
 static const char * mesh_stat_strings[]= {
                        "drop_duplicate_bcast",
                        "drop_ttl_zero",
@@ -142,6 +144,16 @@ static void lbs_ethtool_get_stats(struct net_device * dev,
        lbs_deb_enter(LBS_DEB_ETHTOOL);
 }
 
+static int lbs_ethtool_get_sset_count(struct net_device * dev, int sset)
+{
+       switch (sset) {
+       case ETH_SS_STATS:
+               return MESH_STATS_NUM;
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
 static void lbs_ethtool_get_strings(struct net_device *dev,
                                          u32 stringset,
                                          u8 * s)
@@ -162,11 +174,57 @@ static void lbs_ethtool_get_strings(struct net_device *dev,
        lbs_deb_enter(LBS_DEB_ETHTOOL);
 }
 
+static void lbs_ethtool_get_wol(struct net_device *dev,
+                               struct ethtool_wolinfo *wol)
+{
+       struct lbs_private *priv = dev->priv;
+
+       if (priv->wol_criteria == 0xffffffff) {
+               /* Interface driver didn't configure wake */
+               wol->supported = wol->wolopts = 0;
+               return;
+       }
+
+       wol->supported = WAKE_UCAST|WAKE_MCAST|WAKE_BCAST|WAKE_PHY;
+
+       if (priv->wol_criteria & EHS_WAKE_ON_UNICAST_DATA)
+               wol->wolopts |= WAKE_UCAST;
+       if (priv->wol_criteria & EHS_WAKE_ON_MULTICAST_DATA)
+               wol->wolopts |= WAKE_MCAST;
+       if (priv->wol_criteria & EHS_WAKE_ON_BROADCAST_DATA)
+               wol->wolopts |= WAKE_BCAST;
+       if (priv->wol_criteria & EHS_WAKE_ON_MAC_EVENT)
+               wol->wolopts |= WAKE_PHY;
+}
+
+static int lbs_ethtool_set_wol(struct net_device *dev,
+                              struct ethtool_wolinfo *wol)
+{
+       struct lbs_private *priv = dev->priv;
+       uint32_t criteria = 0;
+
+       if (priv->wol_criteria == 0xffffffff && wol->wolopts)
+               return -EOPNOTSUPP;
+
+       if (wol->wolopts & ~(WAKE_UCAST|WAKE_MCAST|WAKE_BCAST|WAKE_PHY))
+               return -EOPNOTSUPP;
+
+       if (wol->wolopts & WAKE_UCAST) criteria |= EHS_WAKE_ON_UNICAST_DATA;
+       if (wol->wolopts & WAKE_MCAST) criteria |= EHS_WAKE_ON_MULTICAST_DATA;
+       if (wol->wolopts & WAKE_BCAST) criteria |= EHS_WAKE_ON_BROADCAST_DATA;
+       if (wol->wolopts & WAKE_PHY)   criteria |= EHS_WAKE_ON_MAC_EVENT;
+
+       return lbs_host_sleep_cfg(priv, criteria);
+}
+
 struct ethtool_ops lbs_ethtool_ops = {
        .get_drvinfo = lbs_ethtool_get_drvinfo,
        .get_eeprom =  lbs_ethtool_get_eeprom,
        .get_eeprom_len = lbs_ethtool_get_eeprom_len,
+       .get_sset_count = lbs_ethtool_get_sset_count,
        .get_ethtool_stats = lbs_ethtool_get_stats,
        .get_strings = lbs_ethtool_get_strings,
+       .get_wol = lbs_ethtool_get_wol,
+       .set_wol = lbs_ethtool_set_wol,
 };
 
This page took 0.025912 seconds and 4 git commands to generate.