mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 05:00:55 +07:00
ethtool: Factored out similar ethtool link settings for virtual devices to core
Three virtual devices (ibmveth, virtio_net, and netvsc) all have similar code to set link settings and validate ethtool command. To eliminate duplication of code, it is factored out into core/ethtool.c. Signed-off-by: Cris Forno <cforno12@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
68e2c37690
commit
70ae1e127b
@ -420,4 +420,10 @@ struct ethtool_rx_flow_rule *
|
||||
ethtool_rx_flow_rule_create(const struct ethtool_rx_flow_spec_input *input);
|
||||
void ethtool_rx_flow_rule_destroy(struct ethtool_rx_flow_rule *rule);
|
||||
|
||||
bool ethtool_virtdev_validate_cmd(const struct ethtool_link_ksettings *cmd);
|
||||
int ethtool_virtdev_set_link_ksettings(struct net_device *dev,
|
||||
const struct ethtool_link_ksettings *cmd,
|
||||
u32 *dev_speed, u8 *dev_duplex);
|
||||
|
||||
|
||||
#endif /* _LINUX_ETHTOOL_H */
|
||||
|
@ -459,6 +459,24 @@ static int load_link_ksettings_from_user(struct ethtool_link_ksettings *to,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check if the user is trying to change anything besides speed/duplex */
|
||||
bool ethtool_virtdev_validate_cmd(const struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
struct ethtool_link_settings base2 = {};
|
||||
|
||||
base2.speed = cmd->base.speed;
|
||||
base2.port = PORT_OTHER;
|
||||
base2.duplex = cmd->base.duplex;
|
||||
base2.cmd = cmd->base.cmd;
|
||||
base2.link_mode_masks_nwords = cmd->base.link_mode_masks_nwords;
|
||||
|
||||
return !memcmp(&base2, &cmd->base, sizeof(base2)) &&
|
||||
bitmap_empty(cmd->link_modes.supported,
|
||||
__ETHTOOL_LINK_MODE_MASK_NBITS) &&
|
||||
bitmap_empty(cmd->link_modes.lp_advertising,
|
||||
__ETHTOOL_LINK_MODE_MASK_NBITS);
|
||||
}
|
||||
|
||||
/* convert a kernel internal ethtool_link_ksettings to
|
||||
* ethtool_link_usettings in user space. return 0 on success, errno on
|
||||
* error.
|
||||
@ -581,6 +599,27 @@ static int ethtool_set_link_ksettings(struct net_device *dev,
|
||||
return err;
|
||||
}
|
||||
|
||||
int ethtool_virtdev_set_link_ksettings(struct net_device *dev,
|
||||
const struct ethtool_link_ksettings *cmd,
|
||||
u32 *dev_speed, u8 *dev_duplex)
|
||||
{
|
||||
u32 speed;
|
||||
u8 duplex;
|
||||
|
||||
speed = cmd->base.speed;
|
||||
duplex = cmd->base.duplex;
|
||||
/* don't allow custom speed and duplex */
|
||||
if (!ethtool_validate_speed(speed) ||
|
||||
!ethtool_validate_duplex(duplex) ||
|
||||
!ethtool_virtdev_validate_cmd(cmd))
|
||||
return -EINVAL;
|
||||
*dev_speed = speed;
|
||||
*dev_duplex = duplex;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ethtool_virtdev_set_link_ksettings);
|
||||
|
||||
/* Query device for its ethtool_cmd settings.
|
||||
*
|
||||
* Backward compatibility note: for compatibility with legacy ethtool, this is
|
||||
|
Loading…
Reference in New Issue
Block a user