#define ETHTOOL_PHY_FAST_LINK_DOWN_ON  0
 #define ETHTOOL_PHY_FAST_LINK_DOWN_OFF 0xff
 
+/* Energy Detect Power Down (EDPD) is a feature supported by some PHYs, where
+ * the PHY's RX & TX blocks are put into a low-power mode when there is no
+ * link detected (typically cable is un-plugged). For RX, only a minimal
+ * link-detection is available, and for TX the PHY wakes up to send link pulses
+ * to avoid any lock-ups in case the peer PHY may also be running in EDPD mode.
+ *
+ * Some PHYs may support configuration of the wake-up interval for TX pulses,
+ * and some PHYs may support only disabling TX pulses entirely. For the latter
+ * a special value is required (ETHTOOL_PHY_EDPD_NO_TX) so that this can be
+ * configured from userspace (should the user want it).
+ *
+ * The interval units for TX wake-up are in milliseconds, since this should
+ * cover a reasonable range of intervals:
+ *  - from 1 millisecond, which does not sound like much of a power-saver
+ *  - to ~65 seconds which is quite a lot to wait for a link to come up when
+ *    plugging a cable
+ */
+#define ETHTOOL_PHY_EDPD_DFLT_TX_MSECS         0xffff
+#define ETHTOOL_PHY_EDPD_NO_TX                 0xfffe
+#define ETHTOOL_PHY_EDPD_DISABLE               0
+
 enum phy_tunable_id {
        ETHTOOL_PHY_ID_UNSPEC,
        ETHTOOL_PHY_DOWNSHIFT,
        ETHTOOL_PHY_FAST_LINK_DOWN,
+       ETHTOOL_PHY_EDPD,
        /*
         * Add your fresh new phy tunable attribute above and remember to update
         * phy_tunable_strings[] in net/core/ethtool.c
 
        [ETHTOOL_ID_UNSPEC]     = "Unspec",
        [ETHTOOL_PHY_DOWNSHIFT] = "phy-downshift",
        [ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down",
+       [ETHTOOL_PHY_EDPD]      = "phy-energy-detect-power-down",
 };
 
 static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
                    tuna->type_id != ETHTOOL_TUNABLE_U8)
                        return -EINVAL;
                break;
+       case ETHTOOL_PHY_EDPD:
+               if (tuna->len != sizeof(u16) ||
+                   tuna->type_id != ETHTOOL_TUNABLE_U16)
+                       return -EINVAL;
+               break;
        default:
                return -EINVAL;
        }