struct ptp_clock_info ptp_caps;
        struct sk_buff *ptp_tx_skb;
        unsigned long ptp_tx_start;
-       struct hwtstamp_config tstamp_config;
+       struct kernel_hwtstamp_config tstamp_config;
        struct timespec64 ptp_prev_hw_time;
        struct work_struct ptp_extts0_work;
        ktime_t ptp_reset_start;
 void i40e_ptp_tx_hwtstamp(struct i40e_pf *pf);
 void i40e_ptp_rx_hwtstamp(struct i40e_pf *pf, struct sk_buff *skb, u8 index);
 void i40e_ptp_set_increment(struct i40e_pf *pf);
-int i40e_ptp_set_ts_config(struct i40e_pf *pf, struct ifreq *ifr);
-int i40e_ptp_get_ts_config(struct i40e_pf *pf, struct ifreq *ifr);
+int i40e_ptp_hwtstamp_get(struct net_device *netdev,
+                         struct kernel_hwtstamp_config *config);
+int i40e_ptp_hwtstamp_set(struct net_device *netdev,
+                         struct kernel_hwtstamp_config *config,
+                         struct netlink_ext_ack *extack);
 void i40e_ptp_save_hw_time(struct i40e_pf *pf);
 void i40e_ptp_restore_hw_time(struct i40e_pf *pf);
 void i40e_ptp_init(struct i40e_pf *pf);
 
        return 0;
 }
 
-/**
- * i40e_ioctl - Access the hwtstamp interface
- * @netdev: network interface device structure
- * @ifr: interface request data
- * @cmd: ioctl command
- **/
-int i40e_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
-{
-       struct i40e_netdev_priv *np = netdev_priv(netdev);
-       struct i40e_pf *pf = np->vsi->back;
-
-       switch (cmd) {
-       case SIOCGHWTSTAMP:
-               return i40e_ptp_get_ts_config(pf, ifr);
-       case SIOCSHWTSTAMP:
-               return i40e_ptp_set_ts_config(pf, ifr);
-       default:
-               return -EOPNOTSUPP;
-       }
-}
-
 /**
  * i40e_vlan_stripping_enable - Turn on vlan stripping for the VSI
  * @vsi: the vsi being adjusted
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_set_mac_address    = i40e_set_mac,
        .ndo_change_mtu         = i40e_change_mtu,
-       .ndo_eth_ioctl          = i40e_ioctl,
        .ndo_tx_timeout         = i40e_tx_timeout,
        .ndo_vlan_rx_add_vid    = i40e_vlan_rx_add_vid,
        .ndo_vlan_rx_kill_vid   = i40e_vlan_rx_kill_vid,
        .ndo_xsk_wakeup         = i40e_xsk_wakeup,
        .ndo_dfwd_add_station   = i40e_fwd_add,
        .ndo_dfwd_del_station   = i40e_fwd_del,
+       .ndo_hwtstamp_get       = i40e_ptp_hwtstamp_get,
+       .ndo_hwtstamp_set       = i40e_ptp_hwtstamp_set,
 };
 
 /**
 
 }
 
 /**
- * i40e_ptp_get_ts_config - ioctl interface to read the HW timestamping
- * @pf: Board private structure
- * @ifr: ioctl data
+ * i40e_ptp_hwtstamp_get - interface to read the HW timestamping
+ * @netdev: Network device structure
+ * @config: Timestamping configuration structure
  *
  * Obtain the current hardware timestamping settigs as requested. To do this,
  * keep a shadow copy of the timestamp settings rather than attempting to
  * deconstruct it from the registers.
  **/
-int i40e_ptp_get_ts_config(struct i40e_pf *pf, struct ifreq *ifr)
+int i40e_ptp_hwtstamp_get(struct net_device *netdev,
+                         struct kernel_hwtstamp_config *config)
 {
-       struct hwtstamp_config *config = &pf->tstamp_config;
+       struct i40e_netdev_priv *np = netdev_priv(netdev);
+       struct i40e_pf *pf = np->vsi->back;
 
        if (!test_bit(I40E_FLAG_PTP_ENA, pf->flags))
                return -EOPNOTSUPP;
 
-       return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ?
-               -EFAULT : 0;
+       *config = pf->tstamp_config;
+
+       return 0;
 }
 
 /**
  * more broad if the specific filter is not directly supported.
  **/
 static int i40e_ptp_set_timestamp_mode(struct i40e_pf *pf,
-                                      struct hwtstamp_config *config)
+                                      struct kernel_hwtstamp_config *config)
 {
        struct i40e_hw *hw = &pf->hw;
        u32 tsyntype, regval;
 }
 
 /**
- * i40e_ptp_set_ts_config - ioctl interface to control the HW timestamping
- * @pf: Board private structure
- * @ifr: ioctl data
+ * i40e_ptp_hwtstamp_set - interface to control the HW timestamping
+ * @netdev: Network device structure
+ * @config: Timestamping configuration structure
+ * @extack: Netlink extended ack structure for error reporting
  *
  * Respond to the user filter requests and make the appropriate hardware
  * changes here. The XL710 cannot support splitting of the Tx/Rx timestamping
  * as the user receives the timestamps they care about and the user is notified
  * the filter has been broadened.
  **/
-int i40e_ptp_set_ts_config(struct i40e_pf *pf, struct ifreq *ifr)
+int i40e_ptp_hwtstamp_set(struct net_device *netdev,
+                         struct kernel_hwtstamp_config *config,
+                         struct netlink_ext_ack *extack)
 {
-       struct hwtstamp_config config;
+       struct i40e_netdev_priv *np = netdev_priv(netdev);
+       struct i40e_pf *pf = np->vsi->back;
        int err;
 
        if (!test_bit(I40E_FLAG_PTP_ENA, pf->flags))
                return -EOPNOTSUPP;
 
-       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-               return -EFAULT;
-
-       err = i40e_ptp_set_timestamp_mode(pf, &config);
+       err = i40e_ptp_set_timestamp_mode(pf, config);
        if (err)
                return err;
 
        /* save these settings for future reference */
-       pf->tstamp_config = config;
+       pf->tstamp_config = *config;
 
-       return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
-               -EFAULT : 0;
+       return 0;
 }
 
 /**