]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ptp: Split out PTP_EXTTS_REQUEST ioctl code
authorThomas Gleixner <tglx@linutronix.de>
Wed, 25 Jun 2025 11:52:25 +0000 (13:52 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 27 Jun 2025 00:54:03 +0000 (17:54 -0700)
Continue the ptp_ioctl() cleanup by splitting out the PTP_EXTTS_REQUEST
ioctl code into a helper function. Convert to a lock guard while at it.

No functional change intended.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://patch.msgid.link/20250625115132.797588258@linutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/ptp/ptp_chardev.c

index a8d85d9dc0946fc305364e3588950ec5a6ebaaf1..0e9dc643fc22c1bf871d0321bb607d591c3ca28e 100644 (file)
@@ -177,12 +177,57 @@ static long ptp_clock_getcaps(struct ptp_clock *ptp, void __user *arg)
        return copy_to_user(arg, &caps, sizeof(caps)) ? -EFAULT : 0;
 }
 
+static long ptp_extts_request(struct ptp_clock *ptp, unsigned int cmd, void __user *arg)
+{
+       struct ptp_clock_request req = { .type = PTP_CLK_REQ_EXTTS };
+       struct ptp_clock_info *ops = ptp->info;
+       unsigned int supported_extts_flags;
+
+       if (copy_from_user(&req.extts, arg, sizeof(req.extts)))
+               return -EFAULT;
+
+       if (cmd == PTP_EXTTS_REQUEST2) {
+               /* Tell the drivers to check the flags carefully. */
+               req.extts.flags |= PTP_STRICT_FLAGS;
+               /* Make sure no reserved bit is set. */
+               if ((req.extts.flags & ~PTP_EXTTS_VALID_FLAGS) ||
+                   req.extts.rsv[0] || req.extts.rsv[1])
+                       return -EINVAL;
+
+               /* Ensure one of the rising/falling edge bits is set. */
+               if ((req.extts.flags & PTP_ENABLE_FEATURE) &&
+                   (req.extts.flags & PTP_EXTTS_EDGES) == 0)
+                       return -EINVAL;
+       } else {
+               req.extts.flags &= PTP_EXTTS_V1_VALID_FLAGS;
+               memset(req.extts.rsv, 0, sizeof(req.extts.rsv));
+       }
+
+       if (req.extts.index >= ops->n_ext_ts)
+               return -EINVAL;
+
+       supported_extts_flags = ptp->info->supported_extts_flags;
+       /* The PTP_ENABLE_FEATURE flag is always supported. */
+       supported_extts_flags |= PTP_ENABLE_FEATURE;
+       /* If the driver does not support strictly checking flags, the
+        * PTP_RISING_EDGE and PTP_FALLING_EDGE flags are merely hints
+        * which are not enforced.
+        */
+       if (!(supported_extts_flags & PTP_STRICT_FLAGS))
+               supported_extts_flags |= PTP_EXTTS_EDGES;
+       /* Reject unsupported flags */
+       if (req.extts.flags & ~supported_extts_flags)
+               return -EOPNOTSUPP;
+
+       scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &ptp->pincfg_mux)
+               return ops->enable(ops, &req, req.extts.flags & PTP_ENABLE_FEATURE ? 1 : 0);
+}
+
 long ptp_ioctl(struct posix_clock_context *pccontext, unsigned int cmd,
               unsigned long arg)
 {
        struct ptp_clock *ptp =
                container_of(pccontext->clk, struct ptp_clock, clock);
-       unsigned int i, pin_index, supported_extts_flags;
        struct ptp_sys_offset_extended *extoff = NULL;
        struct ptp_sys_offset_precise precise_offset;
        struct system_device_crosststamp xtstamp;
@@ -192,6 +237,7 @@ long ptp_ioctl(struct posix_clock_context *pccontext, unsigned int cmd,
        struct ptp_system_timestamp sts;
        struct ptp_clock_request req;
        struct ptp_clock_time *pct;
+       unsigned int i, pin_index;
        struct ptp_pin_desc pd;
        struct timespec64 ts;
        int enable, err = 0;
@@ -210,60 +256,9 @@ long ptp_ioctl(struct posix_clock_context *pccontext, unsigned int cmd,
 
        case PTP_EXTTS_REQUEST:
        case PTP_EXTTS_REQUEST2:
-               if ((pccontext->fp->f_mode & FMODE_WRITE) == 0) {
-                       err = -EACCES;
-                       break;
-               }
-               memset(&req, 0, sizeof(req));
-
-               if (copy_from_user(&req.extts, (void __user *)arg,
-                                  sizeof(req.extts))) {
-                       err = -EFAULT;
-                       break;
-               }
-               if (cmd == PTP_EXTTS_REQUEST2) {
-                       /* Tell the drivers to check the flags carefully. */
-                       req.extts.flags |= PTP_STRICT_FLAGS;
-                       /* Make sure no reserved bit is set. */
-                       if ((req.extts.flags & ~PTP_EXTTS_VALID_FLAGS) ||
-                           req.extts.rsv[0] || req.extts.rsv[1]) {
-                               err = -EINVAL;
-                               break;
-                       }
-                       /* Ensure one of the rising/falling edge bits is set. */
-                       if ((req.extts.flags & PTP_ENABLE_FEATURE) &&
-                           (req.extts.flags & PTP_EXTTS_EDGES) == 0) {
-                               err = -EINVAL;
-                               break;
-                       }
-               } else if (cmd == PTP_EXTTS_REQUEST) {
-                       req.extts.flags &= PTP_EXTTS_V1_VALID_FLAGS;
-                       req.extts.rsv[0] = 0;
-                       req.extts.rsv[1] = 0;
-               }
-               if (req.extts.index >= ops->n_ext_ts) {
-                       err = -EINVAL;
-                       break;
-               }
-               supported_extts_flags = ptp->info->supported_extts_flags;
-               /* The PTP_ENABLE_FEATURE flag is always supported. */
-               supported_extts_flags |= PTP_ENABLE_FEATURE;
-               /* If the driver does not support strictly checking flags, the
-                * PTP_RISING_EDGE and PTP_FALLING_EDGE flags are merely
-                * hints which are not enforced.
-                */
-               if (!(supported_extts_flags & PTP_STRICT_FLAGS))
-                       supported_extts_flags |= PTP_EXTTS_EDGES;
-               /* Reject unsupported flags */
-               if (req.extts.flags & ~supported_extts_flags)
-                       return -EOPNOTSUPP;
-               req.type = PTP_CLK_REQ_EXTTS;
-               enable = req.extts.flags & PTP_ENABLE_FEATURE ? 1 : 0;
-               if (mutex_lock_interruptible(&ptp->pincfg_mux))
-                       return -ERESTARTSYS;
-               err = ops->enable(ops, &req, enable);
-               mutex_unlock(&ptp->pincfg_mux);
-               break;
+               if ((pccontext->fp->f_mode & FMODE_WRITE) == 0)
+                       return -EACCES;
+               return ptp_extts_request(ptp, cmd, argptr);
 
        case PTP_PEROUT_REQUEST:
        case PTP_PEROUT_REQUEST2: