mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
mlx4: convert to ndo_hwtstamp API
Convert driver to use .ndo_hwtstamp_get()/.ndo_hwtstamp_set() callbacks. mlx4_en_ioctl() becomes empty, remove it. Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Reviewed-by: Tariq Toukan <tariqt@nvidia.com> Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev> Link: https://patch.msgid.link/20251023220457.3201122-3-vadim.fedorenko@linux.dev Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
a5c12b060e
commit
7a07dc723f
@@ -2420,21 +2420,22 @@ static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx4_en_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
|
||||
static int mlx4_en_hwtstamp_set(struct net_device *dev,
|
||||
struct kernel_hwtstamp_config *config,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||
struct mlx4_en_dev *mdev = priv->mdev;
|
||||
struct hwtstamp_config config;
|
||||
|
||||
if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
|
||||
return -EFAULT;
|
||||
|
||||
/* device doesn't support time stamping */
|
||||
if (!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS))
|
||||
if (!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"device doesn't support time stamping");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* TX HW timestamp */
|
||||
switch (config.tx_type) {
|
||||
switch (config->tx_type) {
|
||||
case HWTSTAMP_TX_OFF:
|
||||
case HWTSTAMP_TX_ON:
|
||||
break;
|
||||
@@ -2443,7 +2444,7 @@ static int mlx4_en_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
|
||||
}
|
||||
|
||||
/* RX HW timestamp */
|
||||
switch (config.rx_filter) {
|
||||
switch (config->rx_filter) {
|
||||
case HWTSTAMP_FILTER_NONE:
|
||||
break;
|
||||
case HWTSTAMP_FILTER_ALL:
|
||||
@@ -2461,39 +2462,27 @@ static int mlx4_en_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
|
||||
case HWTSTAMP_FILTER_PTP_V2_SYNC:
|
||||
case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
|
||||
case HWTSTAMP_FILTER_NTP_ALL:
|
||||
config.rx_filter = HWTSTAMP_FILTER_ALL;
|
||||
config->rx_filter = HWTSTAMP_FILTER_ALL;
|
||||
break;
|
||||
default:
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
if (mlx4_en_reset_config(dev, config, dev->features)) {
|
||||
config.tx_type = HWTSTAMP_TX_OFF;
|
||||
config.rx_filter = HWTSTAMP_FILTER_NONE;
|
||||
config->tx_type = HWTSTAMP_TX_OFF;
|
||||
config->rx_filter = HWTSTAMP_FILTER_NONE;
|
||||
}
|
||||
|
||||
return copy_to_user(ifr->ifr_data, &config,
|
||||
sizeof(config)) ? -EFAULT : 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx4_en_hwtstamp_get(struct net_device *dev, struct ifreq *ifr)
|
||||
static int mlx4_en_hwtstamp_get(struct net_device *dev,
|
||||
struct kernel_hwtstamp_config *config)
|
||||
{
|
||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||
|
||||
return copy_to_user(ifr->ifr_data, &priv->hwtstamp_config,
|
||||
sizeof(priv->hwtstamp_config)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
static int mlx4_en_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
{
|
||||
switch (cmd) {
|
||||
case SIOCSHWTSTAMP:
|
||||
return mlx4_en_hwtstamp_set(dev, ifr);
|
||||
case SIOCGHWTSTAMP:
|
||||
return mlx4_en_hwtstamp_get(dev, ifr);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
*config = priv->hwtstamp_config;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static netdev_features_t mlx4_en_fix_features(struct net_device *netdev,
|
||||
@@ -2560,7 +2549,7 @@ static int mlx4_en_set_features(struct net_device *netdev,
|
||||
}
|
||||
|
||||
if (reset) {
|
||||
ret = mlx4_en_reset_config(netdev, priv->hwtstamp_config,
|
||||
ret = mlx4_en_reset_config(netdev, &priv->hwtstamp_config,
|
||||
features);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -2844,7 +2833,6 @@ static const struct net_device_ops mlx4_netdev_ops = {
|
||||
.ndo_set_mac_address = mlx4_en_set_mac,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_change_mtu = mlx4_en_change_mtu,
|
||||
.ndo_eth_ioctl = mlx4_en_ioctl,
|
||||
.ndo_tx_timeout = mlx4_en_tx_timeout,
|
||||
.ndo_vlan_rx_add_vid = mlx4_en_vlan_rx_add_vid,
|
||||
.ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid,
|
||||
@@ -2858,6 +2846,8 @@ static const struct net_device_ops mlx4_netdev_ops = {
|
||||
.ndo_features_check = mlx4_en_features_check,
|
||||
.ndo_set_tx_maxrate = mlx4_en_set_tx_maxrate,
|
||||
.ndo_bpf = mlx4_xdp,
|
||||
.ndo_hwtstamp_get = mlx4_en_hwtstamp_get,
|
||||
.ndo_hwtstamp_set = mlx4_en_hwtstamp_set,
|
||||
};
|
||||
|
||||
static const struct net_device_ops mlx4_netdev_ops_master = {
|
||||
@@ -3512,7 +3502,7 @@ out:
|
||||
}
|
||||
|
||||
int mlx4_en_reset_config(struct net_device *dev,
|
||||
struct hwtstamp_config ts_config,
|
||||
struct kernel_hwtstamp_config *ts_config,
|
||||
netdev_features_t features)
|
||||
{
|
||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||
@@ -3522,8 +3512,8 @@ int mlx4_en_reset_config(struct net_device *dev,
|
||||
int port_up = 0;
|
||||
int err = 0;
|
||||
|
||||
if (priv->hwtstamp_config.tx_type == ts_config.tx_type &&
|
||||
priv->hwtstamp_config.rx_filter == ts_config.rx_filter &&
|
||||
if (priv->hwtstamp_config.tx_type == ts_config->tx_type &&
|
||||
priv->hwtstamp_config.rx_filter == ts_config->rx_filter &&
|
||||
!DEV_FEATURE_CHANGED(dev, features, NETIF_F_HW_VLAN_CTAG_RX) &&
|
||||
!DEV_FEATURE_CHANGED(dev, features, NETIF_F_RXFCS))
|
||||
return 0; /* Nothing to change */
|
||||
@@ -3542,7 +3532,7 @@ int mlx4_en_reset_config(struct net_device *dev,
|
||||
mutex_lock(&mdev->state_lock);
|
||||
|
||||
memcpy(&new_prof, priv->prof, sizeof(struct mlx4_en_port_profile));
|
||||
memcpy(&new_prof.hwtstamp_config, &ts_config, sizeof(ts_config));
|
||||
memcpy(&new_prof.hwtstamp_config, ts_config, sizeof(*ts_config));
|
||||
|
||||
err = mlx4_en_try_alloc_resources(priv, tmp, &new_prof, true);
|
||||
if (err)
|
||||
@@ -3560,7 +3550,7 @@ int mlx4_en_reset_config(struct net_device *dev,
|
||||
dev->features |= NETIF_F_HW_VLAN_CTAG_RX;
|
||||
else
|
||||
dev->features &= ~NETIF_F_HW_VLAN_CTAG_RX;
|
||||
} else if (ts_config.rx_filter == HWTSTAMP_FILTER_NONE) {
|
||||
} else if (ts_config->rx_filter == HWTSTAMP_FILTER_NONE) {
|
||||
/* RX time-stamping is OFF, update the RX vlan offload
|
||||
* to the latest wanted state
|
||||
*/
|
||||
@@ -3581,7 +3571,7 @@ int mlx4_en_reset_config(struct net_device *dev,
|
||||
* Regardless of the caller's choice,
|
||||
* Turn Off RX vlan offload in case of time-stamping is ON
|
||||
*/
|
||||
if (ts_config.rx_filter != HWTSTAMP_FILTER_NONE) {
|
||||
if (ts_config->rx_filter != HWTSTAMP_FILTER_NONE) {
|
||||
if (dev->features & NETIF_F_HW_VLAN_CTAG_RX)
|
||||
en_warn(priv, "Turning off RX vlan offload since RX time-stamping is ON\n");
|
||||
dev->features &= ~NETIF_F_HW_VLAN_CTAG_RX;
|
||||
|
||||
@@ -388,7 +388,7 @@ struct mlx4_en_port_profile {
|
||||
u8 num_up;
|
||||
int rss_rings;
|
||||
int inline_thold;
|
||||
struct hwtstamp_config hwtstamp_config;
|
||||
struct kernel_hwtstamp_config hwtstamp_config;
|
||||
};
|
||||
|
||||
struct mlx4_en_profile {
|
||||
@@ -612,7 +612,7 @@ struct mlx4_en_priv {
|
||||
bool wol;
|
||||
struct device *ddev;
|
||||
struct hlist_head mac_hash[MLX4_EN_MAC_HASH_SIZE];
|
||||
struct hwtstamp_config hwtstamp_config;
|
||||
struct kernel_hwtstamp_config hwtstamp_config;
|
||||
u32 counter_index;
|
||||
|
||||
#ifdef CONFIG_MLX4_EN_DCB
|
||||
@@ -780,7 +780,7 @@ void mlx4_en_ptp_overflow_check(struct mlx4_en_dev *mdev);
|
||||
|
||||
int mlx4_en_moderation_update(struct mlx4_en_priv *priv);
|
||||
int mlx4_en_reset_config(struct net_device *dev,
|
||||
struct hwtstamp_config ts_config,
|
||||
struct kernel_hwtstamp_config *ts_config,
|
||||
netdev_features_t new_features);
|
||||
void mlx4_en_update_pfc_stats_bitmap(struct mlx4_dev *dev,
|
||||
struct mlx4_en_stats_bitmap *stats_bitmap,
|
||||
|
||||
Reference in New Issue
Block a user