* switch in the tree that is PTP capable.
                 */
                list_for_each_entry(dp, &dst->ports, list)
-                       if (dsa_port_supports_hwtstamp(dp, ifr))
+                       if (dsa_port_supports_hwtstamp(dp))
                                return -EBUSY;
                break;
        }
 
        return !err;
 }
 
-bool dsa_port_supports_hwtstamp(struct dsa_port *dp, struct ifreq *ifr)
+bool dsa_port_supports_hwtstamp(struct dsa_port *dp)
 {
        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.
-        * This will clobber the ifreq structure, but we will either return an
-        * error, or the master will overwrite it with proper values.
+        * 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);
+       err = ds->ops->port_hwtstamp_get(ds, dp->index, &ifr);
        return err != -EOPNOTSUPP;
 }
 
 
 struct switchdev_vlan_msti;
 struct phy_device;
 
-bool dsa_port_supports_hwtstamp(struct dsa_port *dp, struct ifreq *ifr);
+bool dsa_port_supports_hwtstamp(struct dsa_port *dp);
 void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp,
                               const struct dsa_device_ops *tag_ops);
 int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age);