struct sk_buff *tx_skb;
 
        /* Current timestamp configuration */
-       struct hwtstamp_config tstamp_config;
+       struct kernel_hwtstamp_config tstamp_config;
 };
 
 struct hellcreek_port {
 
  * the user requested what is actually available or not
  */
 static int hellcreek_set_hwtstamp_config(struct hellcreek *hellcreek, int port,
-                                        struct hwtstamp_config *config)
+                                        struct kernel_hwtstamp_config *config)
 {
        struct hellcreek_port_hwtstamp *ps =
                &hellcreek->ports[port].port_hwtstamp;
 }
 
 int hellcreek_port_hwtstamp_set(struct dsa_switch *ds, int port,
-                               struct ifreq *ifr)
+                               struct kernel_hwtstamp_config *config,
+                               struct netlink_ext_ack *extack)
 {
        struct hellcreek *hellcreek = ds->priv;
        struct hellcreek_port_hwtstamp *ps;
-       struct hwtstamp_config config;
        int err;
 
        ps = &hellcreek->ports[port].port_hwtstamp;
 
-       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-               return -EFAULT;
-
-       err = hellcreek_set_hwtstamp_config(hellcreek, port, &config);
+       err = hellcreek_set_hwtstamp_config(hellcreek, port, config);
        if (err)
                return err;
 
        /* Save the chosen configuration to be returned later */
-       memcpy(&ps->tstamp_config, &config, sizeof(config));
+       ps->tstamp_config = *config;
 
-       return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
-               -EFAULT : 0;
+       return 0;
 }
 
 int hellcreek_port_hwtstamp_get(struct dsa_switch *ds, int port,
-                               struct ifreq *ifr)
+                               struct kernel_hwtstamp_config *config)
 {
        struct hellcreek *hellcreek = ds->priv;
        struct hellcreek_port_hwtstamp *ps;
-       struct hwtstamp_config *config;
 
        ps = &hellcreek->ports[port].port_hwtstamp;
-       config = &ps->tstamp_config;
+       *config = ps->tstamp_config;
 
-       return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ?
-               -EFAULT : 0;
+       return 0;
 }
 
 /* Returns a pointer to the PTP header if the caller should time stamp, or NULL
 
 #define TX_TSTAMP_TIMEOUT      msecs_to_jiffies(40)
 
 int hellcreek_port_hwtstamp_set(struct dsa_switch *ds, int port,
-                               struct ifreq *ifr);
+                               struct kernel_hwtstamp_config *config,
+                               struct netlink_ext_ack *extack);
 int hellcreek_port_hwtstamp_get(struct dsa_switch *ds, int port,
-                               struct ifreq *ifr);
+                               struct kernel_hwtstamp_config *config);
 
 bool hellcreek_port_rxtstamp(struct dsa_switch *ds, int port,
                             struct sk_buff *clone, unsigned int type);
 
        struct ksz_irq pirq;
        u8 num;
 #if IS_ENABLED(CONFIG_NET_DSA_MICROCHIP_KSZ_PTP)
-       struct hwtstamp_config tstamp_config;
+       struct kernel_hwtstamp_config tstamp_config;
        bool hwts_tx_en;
        bool hwts_rx_en;
        struct ksz_irq ptpirq;
 
        return 0;
 }
 
-int ksz_hwtstamp_get(struct dsa_switch *ds, int port, struct ifreq *ifr)
+int ksz_hwtstamp_get(struct dsa_switch *ds, int port,
+                    struct kernel_hwtstamp_config *config)
 {
        struct ksz_device *dev = ds->priv;
-       struct hwtstamp_config *config;
        struct ksz_port *prt;
 
        prt = &dev->ports[port];
-       config = &prt->tstamp_config;
+       *config = prt->tstamp_config;
 
-       return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ?
-               -EFAULT : 0;
+       return 0;
 }
 
 static int ksz_set_hwtstamp_config(struct ksz_device *dev,
                                   struct ksz_port *prt,
-                                  struct hwtstamp_config *config)
+                                  struct kernel_hwtstamp_config *config)
 {
        int ret;
 
        return ksz_ptp_enable_mode(dev);
 }
 
-int ksz_hwtstamp_set(struct dsa_switch *ds, int port, struct ifreq *ifr)
+int ksz_hwtstamp_set(struct dsa_switch *ds, int port,
+                    struct kernel_hwtstamp_config *config,
+                    struct netlink_ext_ack *extack)
 {
        struct ksz_device *dev = ds->priv;
-       struct hwtstamp_config config;
        struct ksz_port *prt;
        int ret;
 
        prt = &dev->ports[port];
 
-       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-               return -EFAULT;
-
-       ret = ksz_set_hwtstamp_config(dev, prt, &config);
+       ret = ksz_set_hwtstamp_config(dev, prt, config);
        if (ret)
                return ret;
 
-       memcpy(&prt->tstamp_config, &config, sizeof(config));
-
-       if (copy_to_user(ifr->ifr_data, &config, sizeof(config)))
-               return -EFAULT;
+       prt->tstamp_config = *config;
 
        return 0;
 }
 
 
 int ksz_get_ts_info(struct dsa_switch *ds, int port,
                    struct kernel_ethtool_ts_info *ts);
-int ksz_hwtstamp_get(struct dsa_switch *ds, int port, struct ifreq *ifr);
-int ksz_hwtstamp_set(struct dsa_switch *ds, int port, struct ifreq *ifr);
+int ksz_hwtstamp_get(struct dsa_switch *ds, int port,
+                    struct kernel_hwtstamp_config *config);
+int ksz_hwtstamp_set(struct dsa_switch *ds, int port,
+                    struct kernel_hwtstamp_config *config,
+                    struct netlink_ext_ack *extack);
 void ksz_port_txtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb);
 void ksz_port_deferred_xmit(struct kthread_work *work);
 bool ksz_port_rxtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb,
 
        u16 tx_seq_id;
 
        /* Current timestamp configuration */
-       struct hwtstamp_config tstamp_config;
+       struct kernel_hwtstamp_config tstamp_config;
 };
 
 enum mv88e6xxx_policy_mapping {
 
 }
 
 static int mv88e6xxx_set_hwtstamp_config(struct mv88e6xxx_chip *chip, int port,
-                                        struct hwtstamp_config *config)
+                                        struct kernel_hwtstamp_config *config)
 {
        const struct mv88e6xxx_ptp_ops *ptp_ops = chip->info->ops->ptp_ops;
        struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
 }
 
 int mv88e6xxx_port_hwtstamp_set(struct dsa_switch *ds, int port,
-                               struct ifreq *ifr)
+                               struct kernel_hwtstamp_config *config,
+                               struct netlink_ext_ack *extack)
 {
        struct mv88e6xxx_chip *chip = ds->priv;
        struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
-       struct hwtstamp_config config;
        int err;
 
        if (!chip->info->ptp_support)
                return -EOPNOTSUPP;
 
-       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-               return -EFAULT;
-
-       err = mv88e6xxx_set_hwtstamp_config(chip, port, &config);
+       err = mv88e6xxx_set_hwtstamp_config(chip, port, config);
        if (err)
                return err;
 
        /* Save the chosen configuration to be returned later. */
-       memcpy(&ps->tstamp_config, &config, sizeof(config));
+       ps->tstamp_config = *config;
 
-       return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
-               -EFAULT : 0;
+       return 0;
 }
 
 int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds, int port,
-                               struct ifreq *ifr)
+                               struct kernel_hwtstamp_config *config)
 {
        struct mv88e6xxx_chip *chip = ds->priv;
        struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
-       struct hwtstamp_config *config = &ps->tstamp_config;
 
        if (!chip->info->ptp_support)
                return -EOPNOTSUPP;
 
-       return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ?
-               -EFAULT : 0;
+       *config = ps->tstamp_config;
+
+       return 0;
 }
 
 /* Returns a pointer to the PTP header if the caller should time stamp,
 
 #ifdef CONFIG_NET_DSA_MV88E6XXX_PTP
 
 int mv88e6xxx_port_hwtstamp_set(struct dsa_switch *ds, int port,
-                               struct ifreq *ifr);
+                               struct kernel_hwtstamp_config *cfg,
+                               struct netlink_ext_ack *extack);
 int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds, int port,
-                               struct ifreq *ifr);
+                               struct kernel_hwtstamp_config *cfg);
 
 bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
                             struct sk_buff *clone, unsigned int type);
 
 #else /* !CONFIG_NET_DSA_MV88E6XXX_PTP */
 
-static inline int mv88e6xxx_port_hwtstamp_set(struct dsa_switch *ds,
-                                             int port, struct ifreq *ifr)
+static inline int
+mv88e6xxx_port_hwtstamp_set(struct dsa_switch *ds, int port,
+                           struct kernel_hwtstamp_config *config,
+                           struct netlink_ext_ack *extack)
 {
        return -EOPNOTSUPP;
 }
 
-static inline int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds,
-                                             int port, struct ifreq *ifr)
+static inline int
+mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds, int port,
+                           struct kernel_hwtstamp_config *config)
 {
        return -EOPNOTSUPP;
 }
 
 }
 
 static int felix_hwtstamp_get(struct dsa_switch *ds, int port,
-                             struct ifreq *ifr)
+                             struct kernel_hwtstamp_config *config)
 {
        struct ocelot *ocelot = ds->priv;
 
-       return ocelot_hwstamp_get(ocelot, port, ifr);
+       ocelot_hwstamp_get(ocelot, port, config);
+
+       return 0;
 }
 
 static int felix_hwtstamp_set(struct dsa_switch *ds, int port,
-                             struct ifreq *ifr)
+                             struct kernel_hwtstamp_config *config,
+                             struct netlink_ext_ack *extack)
 {
        struct ocelot *ocelot = ds->priv;
        struct felix *felix = ocelot_to_felix(ocelot);
        bool using_tag_8021q;
        int err;
 
-       err = ocelot_hwstamp_set(ocelot, port, ifr);
+       err = ocelot_hwstamp_set(ocelot, port, config, extack);
        if (err)
                return err;
 
 
 #define ptp_data_to_sja1105(d) \
                container_of((d), struct sja1105_private, ptp_data)
 
-int sja1105_hwtstamp_set(struct dsa_switch *ds, int port, struct ifreq *ifr)
+int sja1105_hwtstamp_set(struct dsa_switch *ds, int port,
+                        struct kernel_hwtstamp_config *config,
+                        struct netlink_ext_ack *extack)
 {
        struct sja1105_private *priv = ds->priv;
        unsigned long hwts_tx_en, hwts_rx_en;
-       struct hwtstamp_config config;
-
-       if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
-               return -EFAULT;
 
        hwts_tx_en = priv->hwts_tx_en;
        hwts_rx_en = priv->hwts_rx_en;
 
-       switch (config.tx_type) {
+       switch (config->tx_type) {
        case HWTSTAMP_TX_OFF:
                hwts_tx_en &= ~BIT(port);
                break;
                return -ERANGE;
        }
 
-       switch (config.rx_filter) {
+       switch (config->rx_filter) {
        case HWTSTAMP_FILTER_NONE:
                hwts_rx_en &= ~BIT(port);
                break;
                return -ERANGE;
        }
 
-       if (copy_to_user(ifr->ifr_data, &config, sizeof(config)))
-               return -EFAULT;
-
        priv->hwts_tx_en = hwts_tx_en;
        priv->hwts_rx_en = hwts_rx_en;
 
        return 0;
 }
 
-int sja1105_hwtstamp_get(struct dsa_switch *ds, int port, struct ifreq *ifr)
+int sja1105_hwtstamp_get(struct dsa_switch *ds, int port,
+                        struct kernel_hwtstamp_config *config)
 {
        struct sja1105_private *priv = ds->priv;
-       struct hwtstamp_config config;
 
-       config.flags = 0;
+       config->flags = 0;
        if (priv->hwts_tx_en & BIT(port))
-               config.tx_type = HWTSTAMP_TX_ON;
+               config->tx_type = HWTSTAMP_TX_ON;
        else
-               config.tx_type = HWTSTAMP_TX_OFF;
+               config->tx_type = HWTSTAMP_TX_OFF;
        if (priv->hwts_rx_en & BIT(port))
-               config.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
+               config->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
        else
-               config.rx_filter = HWTSTAMP_FILTER_NONE;
+               config->rx_filter = HWTSTAMP_FILTER_NONE;
 
-       return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
-               -EFAULT : 0;
+       return 0;
 }
 
 int sja1105_get_ts_info(struct dsa_switch *ds, int port,
 
 void sja1105_port_txtstamp(struct dsa_switch *ds, int port,
                           struct sk_buff *skb);
 
-int sja1105_hwtstamp_get(struct dsa_switch *ds, int port, struct ifreq *ifr);
+int sja1105_hwtstamp_get(struct dsa_switch *ds, int port,
+                        struct kernel_hwtstamp_config *config);
 
-int sja1105_hwtstamp_set(struct dsa_switch *ds, int port, struct ifreq *ifr);
+int sja1105_hwtstamp_set(struct dsa_switch *ds, int port,
+                        struct kernel_hwtstamp_config *config,
+                        struct netlink_ext_ack *extack);
 
 int __sja1105_ptp_gettimex(struct dsa_switch *ds, u64 *ns,
                           struct ptp_system_timestamp *sts);
 
 }
 
 static int ocelot_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       return phy_mii_ioctl(dev->phydev, ifr, cmd);
+}
+
+static int ocelot_port_hwtstamp_get(struct net_device *dev,
+                                   struct kernel_hwtstamp_config *cfg)
 {
        struct ocelot_port_private *priv = netdev_priv(dev);
        struct ocelot *ocelot = priv->port.ocelot;
        int port = priv->port.index;
 
-       /* If the attached PHY device isn't capable of timestamping operations,
-        * use our own (when possible).
-        */
-       if (!phy_has_hwtstamp(dev->phydev) && ocelot->ptp) {
-               switch (cmd) {
-               case SIOCSHWTSTAMP:
-                       return ocelot_hwstamp_set(ocelot, port, ifr);
-               case SIOCGHWTSTAMP:
-                       return ocelot_hwstamp_get(ocelot, port, ifr);
-               }
-       }
+       ocelot_hwstamp_get(ocelot, port, cfg);
 
-       return phy_mii_ioctl(dev->phydev, ifr, cmd);
+       return 0;
+}
+
+static int ocelot_port_hwtstamp_set(struct net_device *dev,
+                                   struct kernel_hwtstamp_config *cfg,
+                                   struct netlink_ext_ack *extack)
+{
+       struct ocelot_port_private *priv = netdev_priv(dev);
+       struct ocelot *ocelot = priv->port.ocelot;
+       int port = priv->port.index;
+
+       return ocelot_hwstamp_set(ocelot, port, cfg, extack);
 }
 
 static int ocelot_change_mtu(struct net_device *dev, int new_mtu)
        .ndo_set_features               = ocelot_set_features,
        .ndo_setup_tc                   = ocelot_setup_tc,
        .ndo_eth_ioctl                  = ocelot_ioctl,
+       .ndo_hwtstamp_get               = ocelot_port_hwtstamp_get,
+       .ndo_hwtstamp_set               = ocelot_port_hwtstamp_set,
 };
 
 struct net_device *ocelot_port_to_netdev(struct ocelot *ocelot, int port)
 
        return 0;
 }
 
-int ocelot_hwstamp_get(struct ocelot *ocelot, int port, struct ifreq *ifr)
+void ocelot_hwstamp_get(struct ocelot *ocelot, int port,
+                       struct kernel_hwtstamp_config *cfg)
 {
        struct ocelot_port *ocelot_port = ocelot->ports[port];
-       struct hwtstamp_config cfg = {};
 
        switch (ocelot_port->ptp_cmd) {
        case IFH_REW_OP_TWO_STEP_PTP:
-               cfg.tx_type = HWTSTAMP_TX_ON;
+               cfg->tx_type = HWTSTAMP_TX_ON;
                break;
        case IFH_REW_OP_ORIGIN_PTP:
-               cfg.tx_type = HWTSTAMP_TX_ONESTEP_SYNC;
+               cfg->tx_type = HWTSTAMP_TX_ONESTEP_SYNC;
                break;
        default:
-               cfg.tx_type = HWTSTAMP_TX_OFF;
+               cfg->tx_type = HWTSTAMP_TX_OFF;
                break;
        }
 
-       cfg.rx_filter = ocelot_traps_to_ptp_rx_filter(ocelot_port->trap_proto);
-
-       return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0;
+       cfg->rx_filter = ocelot_traps_to_ptp_rx_filter(ocelot_port->trap_proto);
 }
 EXPORT_SYMBOL(ocelot_hwstamp_get);
 
-int ocelot_hwstamp_set(struct ocelot *ocelot, int port, struct ifreq *ifr)
+int ocelot_hwstamp_set(struct ocelot *ocelot, int port,
+                      struct kernel_hwtstamp_config *cfg,
+                      struct netlink_ext_ack *extack)
 {
        struct ocelot_port *ocelot_port = ocelot->ports[port];
-       int ptp_cmd, old_ptp_cmd = ocelot_port->ptp_cmd;
        bool l2 = false, l4 = false;
-       struct hwtstamp_config cfg;
-       bool old_l2, old_l4;
+       int ptp_cmd;
        int err;
 
-       if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
-               return -EFAULT;
-
        /* Tx type sanity check */
-       err = ocelot_ptp_tx_type_to_cmd(cfg.tx_type, &ptp_cmd);
+       err = ocelot_ptp_tx_type_to_cmd(cfg->tx_type, &ptp_cmd);
        if (err)
                return err;
 
-       switch (cfg.rx_filter) {
+       switch (cfg->rx_filter) {
        case HWTSTAMP_FILTER_NONE:
                break;
        case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
                return -ERANGE;
        }
 
-       old_l2 = ocelot_port->trap_proto & OCELOT_PROTO_PTP_L2;
-       old_l4 = ocelot_port->trap_proto & OCELOT_PROTO_PTP_L4;
-
        err = ocelot_setup_ptp_traps(ocelot, port, l2, l4);
        if (err)
                return err;
 
        ocelot_port->ptp_cmd = ptp_cmd;
 
-       cfg.rx_filter = ocelot_traps_to_ptp_rx_filter(ocelot_port->trap_proto);
-
-       if (copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg))) {
-               err = -EFAULT;
-               goto out_restore_ptp_traps;
-       }
+       cfg->rx_filter = ocelot_traps_to_ptp_rx_filter(ocelot_port->trap_proto);
 
        return 0;
-out_restore_ptp_traps:
-       ocelot_setup_ptp_traps(ocelot, port, old_l2, old_l4);
-       ocelot_port->ptp_cmd = old_ptp_cmd;
-       return err;
 }
 EXPORT_SYMBOL(ocelot_hwstamp_set);
 
 
         * PTP functionality
         */
        int     (*port_hwtstamp_get)(struct dsa_switch *ds, int port,
-                                    struct ifreq *ifr);
+                                    struct kernel_hwtstamp_config *config);
        int     (*port_hwtstamp_set)(struct dsa_switch *ds, int port,
-                                    struct ifreq *ifr);
+                                    struct kernel_hwtstamp_config *config,
+                                    struct netlink_ext_ack *extack);
        void    (*port_txtstamp)(struct dsa_switch *ds, int port,
                                 struct sk_buff *skb);
        bool    (*port_rxtstamp)(struct dsa_switch *ds, int port,
 
 int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid,
                    bool untagged);
 int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid);
-int ocelot_hwstamp_get(struct ocelot *ocelot, int port, struct ifreq *ifr);
-int ocelot_hwstamp_set(struct ocelot *ocelot, int port, struct ifreq *ifr);
+void ocelot_hwstamp_get(struct ocelot *ocelot, int port,
+                       struct kernel_hwtstamp_config *cfg);
+int ocelot_hwstamp_set(struct ocelot *ocelot, int port,
+                      struct kernel_hwtstamp_config *cfg,
+                      struct netlink_ext_ack *extack);
 int ocelot_port_txtstamp_request(struct ocelot *ocelot, int port,
                                 struct sk_buff *skb,
                                 struct sk_buff **clone);
 
 
 bool dsa_port_supports_hwtstamp(struct dsa_port *dp)
 {
+       struct kernel_hwtstamp_config config = {};
        struct dsa_switch *ds = dp->ds;
-       struct ifreq ifr = {};
        int err;
 
        if (!ds->ops->port_hwtstamp_get || !ds->ops->port_hwtstamp_set)
                return false;
 
-       /* "See through" shim implementations of the "get" method.
-        * Since we can't cook up a complete ioctl request structure, this will
-        * fail in copy_to_user() with -EFAULT, which hopefully is enough to
-        * detect a valid implementation.
-        */
-       err = ds->ops->port_hwtstamp_get(ds, dp->index, &ifr);
+       /* "See through" shim implementations of the "get" method. */
+       err = ds->ops->port_hwtstamp_get(ds, dp->index, &config);
        return err != -EOPNOTSUPP;
 }
 
 
 static int dsa_user_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
        struct dsa_user_priv *p = netdev_priv(dev);
-       struct dsa_switch *ds = p->dp->ds;
-       int port = p->dp->index;
-
-       /* Pass through to switch driver if it supports timestamping */
-       switch (cmd) {
-       case SIOCGHWTSTAMP:
-               if (ds->ops->port_hwtstamp_get)
-                       return ds->ops->port_hwtstamp_get(ds, port, ifr);
-               break;
-       case SIOCSHWTSTAMP:
-               if (ds->ops->port_hwtstamp_set)
-                       return ds->ops->port_hwtstamp_set(ds, port, ifr);
-               break;
-       }
 
        return phylink_mii_ioctl(p->dp->pl, ifr, cmd);
 }
        return 0;
 }
 
+static int dsa_user_hwtstamp_get(struct net_device *dev,
+                                struct kernel_hwtstamp_config *cfg)
+{
+       struct dsa_port *dp = dsa_user_to_port(dev);
+       struct dsa_switch *ds = dp->ds;
+
+       if (!ds->ops->port_hwtstamp_get)
+               return -EOPNOTSUPP;
+
+       return ds->ops->port_hwtstamp_get(ds, dp->index, cfg);
+}
+
+static int dsa_user_hwtstamp_set(struct net_device *dev,
+                                struct kernel_hwtstamp_config *cfg,
+                                struct netlink_ext_ack *extack)
+{
+       struct dsa_port *dp = dsa_user_to_port(dev);
+       struct dsa_switch *ds = dp->ds;
+
+       if (!ds->ops->port_hwtstamp_set)
+               return -EOPNOTSUPP;
+
+       return ds->ops->port_hwtstamp_set(ds, dp->index, cfg, extack);
+}
+
 static const struct net_device_ops dsa_user_netdev_ops = {
        .ndo_open               = dsa_user_open,
        .ndo_stop               = dsa_user_close,
        .ndo_vlan_rx_kill_vid   = dsa_user_vlan_rx_kill_vid,
        .ndo_change_mtu         = dsa_user_change_mtu,
        .ndo_fill_forward_path  = dsa_user_fill_forward_path,
+       .ndo_hwtstamp_get       = dsa_user_hwtstamp_get,
+       .ndo_hwtstamp_set       = dsa_user_hwtstamp_set,
 };
 
 static const struct device_type dsa_type = {