Merge tag 'for-linus-5.9-rc1b-tag' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / include / linux / ethtool.h
index a23b26e..969a802 100644 (file)
@@ -86,6 +86,22 @@ struct net_device;
 u32 ethtool_op_get_link(struct net_device *dev);
 int ethtool_op_get_ts_info(struct net_device *dev, struct ethtool_ts_info *eti);
 
+
+/**
+ * struct ethtool_link_ext_state_info - link extended state and substate.
+ */
+struct ethtool_link_ext_state_info {
+       enum ethtool_link_ext_state link_ext_state;
+       union {
+               enum ethtool_link_ext_substate_autoneg autoneg;
+               enum ethtool_link_ext_substate_link_training link_training;
+               enum ethtool_link_ext_substate_link_logical_mismatch link_logical_mismatch;
+               enum ethtool_link_ext_substate_bad_signal_integrity bad_signal_integrity;
+               enum ethtool_link_ext_substate_cable_issue cable_issue;
+               u8 __link_ext_substate;
+       };
+};
+
 /**
  * ethtool_rxfh_indir_default - get default value for RX flow hash indirection
  * @index: Index in RX flow hash indirection table
@@ -245,6 +261,11 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
  * @get_link: Report whether physical link is up.  Will only be called if
  *     the netdev is up.  Should usually be set to ethtool_op_get_link(),
  *     which uses netif_carrier_ok().
+ * @get_link_ext_state: Report link extended state. Should set link_ext_state and
+ *     link_ext_substate (link_ext_substate of 0 means link_ext_substate is unknown,
+ *     do not attach ext_substate attribute to netlink message). If link_ext_state
+ *     and link_ext_substate are unknown, return -ENODATA. If not implemented,
+ *     link_ext_state and link_ext_substate will not be sent to userspace.
  * @get_eeprom: Read data from the device EEPROM.
  *     Should fill in the magic field.  Don't need to check len for zero
  *     or wraparound.  Fill in the data argument with the eeprom values
@@ -384,6 +405,8 @@ struct ethtool_ops {
        void    (*set_msglevel)(struct net_device *, u32);
        int     (*nway_reset)(struct net_device *);
        u32     (*get_link)(struct net_device *);
+       int     (*get_link_ext_state)(struct net_device *,
+                                     struct ethtool_link_ext_state_info *);
        int     (*get_eeprom_len)(struct net_device *);
        int     (*get_eeprom)(struct net_device *,
                              struct ethtool_eeprom *, u8 *);
@@ -479,5 +502,37 @@ int ethtool_virtdev_set_link_ksettings(struct net_device *dev,
                                       const struct ethtool_link_ksettings *cmd,
                                       u32 *dev_speed, u8 *dev_duplex);
 
+struct netlink_ext_ack;
+struct phy_device;
+struct phy_tdr_config;
+
+/**
+ * struct ethtool_phy_ops - Optional PHY device options
+ * @get_sset_count: Get number of strings that @get_strings will write.
+ * @get_strings: Return a set of strings that describe the requested objects
+ * @get_stats: Return extended statistics about the PHY device.
+ * @start_cable_test - Start a cable test
+ * @start_cable_test_tdr - Start a Time Domain Reflectometry cable test
+ *
+ * All operations are optional (i.e. the function pointer may be set to %NULL)
+ * and callers must take this into account. Callers must hold the RTNL lock.
+ */
+struct ethtool_phy_ops {
+       int (*get_sset_count)(struct phy_device *dev);
+       int (*get_strings)(struct phy_device *dev, u8 *data);
+       int (*get_stats)(struct phy_device *dev,
+                        struct ethtool_stats *stats, u64 *data);
+       int (*start_cable_test)(struct phy_device *phydev,
+                               struct netlink_ext_ack *extack);
+       int (*start_cable_test_tdr)(struct phy_device *phydev,
+                                   struct netlink_ext_ack *extack,
+                                   const struct phy_tdr_config *config);
+};
+
+/**
+ * ethtool_set_ethtool_phy_ops - Set the ethtool_phy_ops singleton
+ * @ops: Ethtool PHY operations to set
+ */
+void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops);
 
 #endif /* _LINUX_ETHTOOL_H */