sfc-siena: Implement ndo_hwtstamp_(get|set)
authorAlex Austin <alex.austin@amd.com>
Thu, 30 Nov 2023 13:58:26 +0000 (13:58 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 5 Dec 2023 15:45:43 +0000 (07:45 -0800)
Update efx->ptp_data to use kernel_hwtstamp_config and implement
ndo_hwtstamp_(get|set). Remove SIOCGHWTSTAMP and SIOCSHWTSTAMP from
efx_ioctl.

Signed-off-by: Alex Austin <alex.austin@amd.com>
Acked-by: Martin Habets <habetsm.xilinx@gmail.com>
Reviewed-by: Edward Cree <ecree.xilinx@gmail.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://lore.kernel.org/r/20231130135826.19018-3-alex.austin@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/sfc/siena/efx.c
drivers/net/ethernet/sfc/siena/net_driver.h
drivers/net/ethernet/sfc/siena/ptp.c
drivers/net/ethernet/sfc/siena/ptp.h
drivers/net/ethernet/sfc/siena/siena.c

index 8c557f6a183c9c345691dfc6743747eb1f670300..59d3a60433798c48921d3f33e161703532832f27 100644 (file)
@@ -495,11 +495,6 @@ static int efx_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
        struct efx_nic *efx = netdev_priv(net_dev);
        struct mii_ioctl_data *data = if_mii(ifr);
 
-       if (cmd == SIOCSHWTSTAMP)
-               return efx_siena_ptp_set_ts_config(efx, ifr);
-       if (cmd == SIOCGHWTSTAMP)
-               return efx_siena_ptp_get_ts_config(efx, ifr);
-
        /* Convert phy_id from older PRTAD/DEVAD format */
        if ((cmd == SIOCGMIIREG || cmd == SIOCSMIIREG) &&
            (data->phy_id & 0xfc00) == 0x0400)
@@ -579,6 +574,23 @@ static int efx_vlan_rx_kill_vid(struct net_device *net_dev, __be16 proto, u16 vi
                return -EOPNOTSUPP;
 }
 
+static int efx_siena_hwtstamp_set(struct net_device *net_dev,
+                                 struct kernel_hwtstamp_config *config,
+                                 struct netlink_ext_ack *extack)
+{
+       struct efx_nic *efx = netdev_priv(net_dev);
+
+       return efx_siena_ptp_set_ts_config(efx, config, extack);
+}
+
+static int efx_siena_hwtstamp_get(struct net_device *net_dev,
+                                 struct kernel_hwtstamp_config *config)
+{
+       struct efx_nic *efx = netdev_priv(net_dev);
+
+       return efx_siena_ptp_get_ts_config(efx, config);
+}
+
 static const struct net_device_ops efx_netdev_ops = {
        .ndo_open               = efx_net_open,
        .ndo_stop               = efx_net_stop,
@@ -594,6 +606,8 @@ static const struct net_device_ops efx_netdev_ops = {
        .ndo_features_check     = efx_siena_features_check,
        .ndo_vlan_rx_add_vid    = efx_vlan_rx_add_vid,
        .ndo_vlan_rx_kill_vid   = efx_vlan_rx_kill_vid,
+       .ndo_hwtstamp_set       = efx_siena_hwtstamp_set,
+       .ndo_hwtstamp_get       = efx_siena_hwtstamp_get,
 #ifdef CONFIG_SFC_SIENA_SRIOV
        .ndo_set_vf_mac         = efx_sriov_set_vf_mac,
        .ndo_set_vf_vlan        = efx_sriov_set_vf_vlan,
index ff7bbc325952c3aa06dde79999ff27121f358ec1..94152f595acd3f4420d6109b0cb6d1dd0f6b52f8 100644 (file)
@@ -1424,7 +1424,7 @@ struct efx_nic_type {
        void (*ptp_write_host_time)(struct efx_nic *efx, u32 host_time);
        int (*ptp_set_ts_sync_events)(struct efx_nic *efx, bool en, bool temp);
        int (*ptp_set_ts_config)(struct efx_nic *efx,
-                                struct hwtstamp_config *init);
+                                struct kernel_hwtstamp_config *init);
        int (*sriov_configure)(struct efx_nic *efx, int num_vfs);
        int (*vlan_rx_add_vid)(struct efx_nic *efx, __be16 proto, u16 vid);
        int (*vlan_rx_kill_vid)(struct efx_nic *efx, __be16 proto, u16 vid);
index 38e666561bcd9ec989aec7d6968ffaf23039b6f6..4b5e2f0ba350b3fce063dd29258a2a1c7e1321c7 100644 (file)
@@ -297,7 +297,7 @@ struct efx_ptp_data {
        u32 rxfilter_event;
        u32 rxfilter_general;
        bool rxfilter_installed;
-       struct hwtstamp_config config;
+       struct kernel_hwtstamp_config config;
        bool enabled;
        unsigned int mode;
        void (*ns_to_nic_time)(s64 ns, u32 *nic_major, u32 *nic_minor);
@@ -1762,7 +1762,8 @@ int efx_siena_ptp_change_mode(struct efx_nic *efx, bool enable_wanted,
        return 0;
 }
 
-static int efx_ptp_ts_init(struct efx_nic *efx, struct hwtstamp_config *init)
+static int efx_ptp_ts_init(struct efx_nic *efx,
+                          struct kernel_hwtstamp_config *init)
 {
        int rc;
 
@@ -1799,33 +1800,26 @@ void efx_siena_ptp_get_ts_info(struct efx_nic *efx,
        ts_info->rx_filters = ptp->efx->type->hwtstamp_filters;
 }
 
-int efx_siena_ptp_set_ts_config(struct efx_nic *efx, struct ifreq *ifr)
+int efx_siena_ptp_set_ts_config(struct efx_nic *efx,
+                               struct kernel_hwtstamp_config *config,
+                               struct netlink_ext_ack __always_unused *extack)
 {
-       struct hwtstamp_config config;
-       int rc;
-
        /* Not a PTP enabled port */
        if (!efx->ptp_data)
                return -EOPNOTSUPP;
 
-       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-               return -EFAULT;
-
-       rc = efx_ptp_ts_init(efx, &config);
-       if (rc != 0)
-               return rc;
-
-       return copy_to_user(ifr->ifr_data, &config, sizeof(config))
-               ? -EFAULT : 0;
+       return efx_ptp_ts_init(efx, config);
 }
 
-int efx_siena_ptp_get_ts_config(struct efx_nic *efx, struct ifreq *ifr)
+int efx_siena_ptp_get_ts_config(struct efx_nic *efx,
+                               struct kernel_hwtstamp_config *config)
 {
+       /* Not a PTP enabled port */
        if (!efx->ptp_data)
                return -EOPNOTSUPP;
 
-       return copy_to_user(ifr->ifr_data, &efx->ptp_data->config,
-                           sizeof(efx->ptp_data->config)) ? -EFAULT : 0;
+       *config = efx->ptp_data->config;
+       return 0;
 }
 
 static void ptp_event_failure(struct efx_nic *efx, int expected_frag_len)
index 4172f90e9f6f99c7cdf6adeb4bb64206f0214ad5..6352f84424f63aec25b2b04018a0fbbb40442a20 100644 (file)
 struct ethtool_ts_info;
 void efx_siena_ptp_defer_probe_with_channel(struct efx_nic *efx);
 struct efx_channel *efx_siena_ptp_channel(struct efx_nic *efx);
-int efx_siena_ptp_set_ts_config(struct efx_nic *efx, struct ifreq *ifr);
-int efx_siena_ptp_get_ts_config(struct efx_nic *efx, struct ifreq *ifr);
+int efx_siena_ptp_set_ts_config(struct efx_nic *efx,
+                               struct kernel_hwtstamp_config *config,
+                               struct netlink_ext_ack *extack);
+int efx_siena_ptp_get_ts_config(struct efx_nic *efx,
+                               struct kernel_hwtstamp_config *config);
 void efx_siena_ptp_get_ts_info(struct efx_nic *efx,
                               struct ethtool_ts_info *ts_info);
 bool efx_siena_ptp_is_ptp_tx(struct efx_nic *efx, struct sk_buff *skb);
index a44c8fa257487289bcc01874c597d9e0b245ceb6..ca33dc08e555f2aa49da7d435ed689f1032dea32 100644 (file)
@@ -136,7 +136,7 @@ static void siena_ptp_write_host_time(struct efx_nic *efx, u32 host_time)
 }
 
 static int siena_ptp_set_ts_config(struct efx_nic *efx,
-                                  struct hwtstamp_config *init)
+                                  struct kernel_hwtstamp_config *init)
 {
        int rc;