| 1 |
|
| 2 |
|
| 3 | #ifndef _ETHTOOL_COMMON_H
|
| 4 | #define _ETHTOOL_COMMON_H
|
| 5 |
|
| 6 | #include <linux/netdevice.h>
|
| 7 | #include <linux/ethtool.h>
|
| 8 |
|
| 9 | #define ETHTOOL_DEV_FEATURE_WORDS DIV_ROUND_UP(NETDEV_FEATURE_COUNT, 32)
|
| 10 |
|
| 11 |
|
| 12 | #define ETHTOOL_LINK_MODE(speed, type, duplex) \
|
| 13 | ETHTOOL_LINK_MODE_ ## speed ## base ## type ## _ ## duplex ## _BIT
|
| 14 |
|
| 15 | #define __SOF_TIMESTAMPING_CNT (const_ilog2(SOF_TIMESTAMPING_LAST) + 1)
|
| 16 | #define __HWTSTAMP_FLAG_CNT (const_ilog2(HWTSTAMP_FLAG_LAST) + 1)
|
| 17 |
|
| 18 | struct genl_info;
|
| 19 | struct hwtstamp_provider_desc;
|
| 20 |
|
| 21 | extern const char
|
| 22 | netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN];
|
| 23 | extern const char
|
| 24 | rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN];
|
| 25 | extern const char
|
| 26 | tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN];
|
| 27 | extern const char
|
| 28 | phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN];
|
| 29 | extern const char link_mode_names[][ETH_GSTRING_LEN];
|
| 30 | extern const char netif_msg_class_names[][ETH_GSTRING_LEN];
|
| 31 | extern const char wol_mode_names[][ETH_GSTRING_LEN];
|
| 32 | extern const char sof_timestamping_names[][ETH_GSTRING_LEN];
|
| 33 | extern const char ts_tx_type_names[][ETH_GSTRING_LEN];
|
| 34 | extern const char ts_rx_filter_names[][ETH_GSTRING_LEN];
|
| 35 | extern const char ts_flags_names[][ETH_GSTRING_LEN];
|
| 36 | extern const char udp_tunnel_type_names[][ETH_GSTRING_LEN];
|
| 37 |
|
| 38 | int __ethtool_get_link(struct net_device *dev);
|
| 39 |
|
| 40 | bool convert_legacy_settings_to_link_ksettings(
|
| 41 | struct ethtool_link_ksettings *link_ksettings,
|
| 42 | const struct ethtool_cmd *legacy_settings);
|
| 43 | int ethtool_check_max_channel(struct net_device *dev,
|
| 44 | struct ethtool_channels channels,
|
| 45 | struct genl_info *info);
|
| 46 | struct ethtool_rxfh_context *
|
| 47 | ethtool_rxfh_ctx_alloc(const struct ethtool_ops *ops,
|
| 48 | u32 indir_size, u32 key_size);
|
| 49 | int ethtool_check_rss_ctx_busy(struct net_device *dev, u32 rss_context);
|
| 50 | int ethtool_rxfh_config_is_sym(u64 rxfh);
|
| 51 |
|
| 52 | void ethtool_ringparam_get_cfg(struct net_device *dev,
|
| 53 | struct ethtool_ringparam *param,
|
| 54 | struct kernel_ethtool_ringparam *kparam,
|
| 55 | struct netlink_ext_ack *extack);
|
| 56 |
|
| 57 | int ethtool_get_rx_ring_count(struct net_device *dev);
|
| 58 |
|
| 59 | int __ethtool_get_ts_info(struct net_device *dev, struct kernel_ethtool_ts_info *info);
|
| 60 | int ethtool_get_ts_info_by_phc(struct net_device *dev,
|
| 61 | struct kernel_ethtool_ts_info *info,
|
| 62 | struct hwtstamp_provider_desc *hwprov_desc);
|
| 63 | int ethtool_net_get_ts_info_by_phc(struct net_device *dev,
|
| 64 | struct kernel_ethtool_ts_info *info,
|
| 65 | struct hwtstamp_provider_desc *hwprov_desc);
|
| 66 | struct phy_device *
|
| 67 | ethtool_phy_get_ts_info_by_phc(struct net_device *dev,
|
| 68 | struct kernel_ethtool_ts_info *info,
|
| 69 | struct hwtstamp_provider_desc *hwprov_desc);
|
| 70 | bool net_support_hwtstamp_qualifier(struct net_device *dev,
|
| 71 | enum hwtstamp_provider_qualifier qualifier);
|
| 72 |
|
| 73 | extern const struct ethtool_phy_ops *ethtool_phy_ops;
|
| 74 | extern const struct ethtool_pse_ops *ethtool_pse_ops;
|
| 75 |
|
| 76 | int ethtool_get_module_info_call(struct net_device *dev,
|
| 77 | struct ethtool_modinfo *modinfo);
|
| 78 | int ethtool_get_module_eeprom_call(struct net_device *dev,
|
| 79 | struct ethtool_eeprom *ee, u8 *data);
|
| 80 |
|
| 81 | bool __ethtool_dev_mm_supported(struct net_device *dev);
|
| 82 |
|
| 83 | |
| 84 | * ethtool_nl_msg_needs_rtnl() - does this Netlink cmd need rtnl_lock?
|
| 85 | * @dev: target device
|
| 86 | * @cmd: ETHTOOL_MSG_* Netlink command value
|
| 87 | *
|
| 88 | * Return: true if @cmd is a command for which @dev has opted-in to
|
| 89 | * keeping rtnl_lock held across the call (via op_needs_rtnl).
|
| 90 |
|
| 91 | static inline bool
|
| 92 | ethtool_nl_msg_needs_rtnl(const struct net_device *dev, u8 cmd)
|
| 93 | {
|
| 94 | const struct ethtool_ops *ops = dev->ethtool_ops;
|
| 95 |
|
| 96 | switch (cmd) {
|
| 97 | case ETHTOOL_MSG_LINKINFO_GET:
|
| 98 | case ETHTOOL_MSG_LINKINFO_SET:
|
| 99 | case ETHTOOL_MSG_LINKMODES_GET:
|
| 100 | case ETHTOOL_MSG_LINKMODES_SET:
|
| 101 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_LINKSETTINGS;
|
| 102 | case ETHTOOL_MSG_PRIVFLAGS_SET:
|
| 103 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SPFLAGS;
|
| 104 | case ETHTOOL_MSG_RINGS_SET:
|
| 105 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SRINGPARAM;
|
| 106 | case ETHTOOL_MSG_CHANNELS_SET:
|
| 107 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SCHANNELS;
|
| 108 | case ETHTOOL_MSG_COALESCE_SET:
|
| 109 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SCOALESCE;
|
| 110 | case ETHTOOL_MSG_PAUSE_GET:
|
| 111 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_GPAUSEPARAM;
|
| 112 | case ETHTOOL_MSG_PAUSE_SET:
|
| 113 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SPAUSEPARAM;
|
| 114 | case ETHTOOL_MSG_RSS_SET:
|
| 115 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_RSS;
|
| 116 | case ETHTOOL_MSG_LINKSTATE_GET:
|
| 117 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_GLINK;
|
| 118 | case ETHTOOL_MSG_TSCONFIG_GET:
|
| 119 | case ETHTOOL_MSG_TSCONFIG_SET:
|
| 120 | |
| 121 | * Also, there is no corresponding ethtool ioctl, therefore
|
| 122 | * these cases are Netlink-only.
|
| 123 |
|
| 124 | return true;
|
| 125 | }
|
| 126 | return false;
|
| 127 | }
|
| 128 |
|
| 129 | |
| 130 | * ethtool_ioctl_needs_rtnl() - does this legacy ioctl cmd need rtnl_lock?
|
| 131 | * @dev: target device
|
| 132 | * @ethcmd: ETHTOOL_* ioctl command value
|
| 133 | *
|
| 134 | * Return: true if @ethcmd is a command for which @dev has opted-in to
|
| 135 | * keeping rtnl_lock held across the call (via op_needs_rtnl).
|
| 136 |
|
| 137 | static inline bool
|
| 138 | ethtool_ioctl_needs_rtnl(const struct net_device *dev, u32 ethcmd)
|
| 139 | {
|
| 140 | const struct ethtool_ops *ops = dev->ethtool_ops;
|
| 141 |
|
| 142 | switch (ethcmd) {
|
| 143 | case ETHTOOL_GLINKSETTINGS:
|
| 144 | case ETHTOOL_GSET:
|
| 145 | case ETHTOOL_SLINKSETTINGS:
|
| 146 | case ETHTOOL_SSET:
|
| 147 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_LINKSETTINGS;
|
| 148 | case ETHTOOL_SPFLAGS:
|
| 149 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SPFLAGS;
|
| 150 | case ETHTOOL_SRINGPARAM:
|
| 151 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SRINGPARAM;
|
| 152 | case ETHTOOL_SCHANNELS:
|
| 153 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SCHANNELS;
|
| 154 | case ETHTOOL_SCOALESCE:
|
| 155 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SCOALESCE;
|
| 156 | case ETHTOOL_GPAUSEPARAM:
|
| 157 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_GPAUSEPARAM;
|
| 158 | case ETHTOOL_SPAUSEPARAM:
|
| 159 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_SPAUSEPARAM;
|
| 160 | case ETHTOOL_SRSSH:
|
| 161 | case ETHTOOL_SRXFH:
|
| 162 | case ETHTOOL_SRXFHINDIR:
|
| 163 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_RSS;
|
| 164 | case ETHTOOL_GLINK:
|
| 165 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_GLINK;
|
| 166 | case ETHTOOL_TEST:
|
| 167 | return ops->op_needs_rtnl & ETHTOOL_OP_NEEDS_RTNL_TEST;
|
| 168 | }
|
| 169 | return false;
|
| 170 | }
|
| 171 |
|
| 172 | #if IS_ENABLED(CONFIG_ETHTOOL_NETLINK)
|
| 173 | void ethtool_rss_notify(struct net_device *dev, u32 type, u32 rss_context);
|
| 174 | #else
|
| 175 | static inline void
|
| 176 | ethtool_rss_notify(struct net_device *dev, u32 type, u32 rss_context)
|
| 177 | {
|
| 178 | }
|
| 179 | #endif
|
| 180 |
|
| 181 | #endif
|