All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vadim Fedorenko <vadim.fedorenko@linux.dev>
To: Thomas Gleixner <tglx@linutronix.de>,
	LKML <linux-kernel@vger.kernel.org>
Cc: Richard Cochran <richardcochran@gmail.com>, netdev@vger.kernel.org
Subject: Re: [patch 02/13] ptp: Split out PTP_EXTTS_REQUEST ioctl code
Date: Sat, 21 Jun 2025 21:24:05 +0100	[thread overview]
Message-ID: <ccc601ef-4ee7-4f72-b2d8-64155d1bd324@linux.dev> (raw)
In-Reply-To: <20250620131943.842871495@linutronix.de>

On 20/06/2025 14:24, Thomas Gleixner wrote:
> 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>
> ---
>   drivers/ptp/ptp_chardev.c |  105 +++++++++++++++++++++-------------------------
>   1 file changed, 50 insertions(+), 55 deletions(-)
> 
> --- a/drivers/ptp/ptp_chardev.c
> +++ b/drivers/ptp/ptp_chardev.c
> @@ -177,12 +177,57 @@ static long ptp_clock_getcaps(struct ptp
>   	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_contex
>   	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_contex
>   
>   	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:
> 
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>

  reply	other threads:[~2025-06-21 20:24 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-20 13:24 [patch 00/13] ptp: Belated spring cleaning of the chardev driver Thomas Gleixner
2025-06-20 13:24 ` [patch 01/13] ptp: Split out PTP_CLOCK_GETCAPS ioctl code Thomas Gleixner
2025-06-21 20:22   ` Vadim Fedorenko
2025-06-20 13:24 ` [patch 02/13] ptp: Split out PTP_EXTTS_REQUEST " Thomas Gleixner
2025-06-21 20:24   ` Vadim Fedorenko [this message]
2025-06-20 13:24 ` [patch 03/13] ptp: Split out PTP_PEROUT_REQUEST " Thomas Gleixner
2025-06-21 20:24   ` Vadim Fedorenko
2025-06-20 13:24 ` [patch 04/13] ptp: Split out PTP_ENABLE_PPS " Thomas Gleixner
2025-06-21 20:25   ` Vadim Fedorenko
2025-06-20 13:24 ` [patch 05/13] ptp: Split out PTP_SYS_OFFSET_PRECISE " Thomas Gleixner
2025-06-21 20:27   ` Vadim Fedorenko
2025-06-20 13:24 ` [patch 06/13] ptp: Split out PTP_SYS_OFFSET_EXTENDED " Thomas Gleixner
2025-06-21 20:29   ` Vadim Fedorenko
2025-06-20 13:24 ` [patch 07/13] ptp: Split out PTP_SYS_OFFSET " Thomas Gleixner
2025-06-21 20:14   ` Vadim Fedorenko
2025-06-21 20:42     ` Thomas Gleixner
2025-06-21 20:58       ` Vadim Fedorenko
2025-06-20 13:24 ` [patch 08/13] ptp: Split out PTP_PIN_GETFUNC " Thomas Gleixner
2025-06-21 20:29   ` Vadim Fedorenko
2025-06-24  9:22   ` Paolo Abeni
2025-06-24 13:39     ` Thomas Gleixner
2025-06-25  8:19       ` Thomas Gleixner
2025-06-20 13:24 ` [patch 09/13] ptp: Split out PTP_PIN_SETFUNC " Thomas Gleixner
2025-06-21 20:30   ` Vadim Fedorenko
2025-06-20 13:24 ` [patch 10/13] ptp: Split out PTP_MASK_CLEAR_ALL " Thomas Gleixner
2025-06-21 20:36   ` Vadim Fedorenko
2025-06-21 20:44     ` Thomas Gleixner
2025-06-21 20:59       ` Vadim Fedorenko
2025-06-20 13:24 ` [patch 11/13] ptp: Split out PTP_MASK_EN_SINGLE " Thomas Gleixner
2025-06-21 20:32   ` Vadim Fedorenko
2025-06-20 13:24 ` [patch 12/13] ptp: Convert chardev code to lock guards Thomas Gleixner
2025-06-20 13:24 ` [patch 13/13] ptp: Convert ptp_open/read() to __free() Thomas Gleixner
2025-06-24  9:48   ` Paolo Abeni
2025-06-24 13:38     ` Thomas Gleixner
2025-06-24 16:36   ` Jakub Kicinski
2025-06-25 10:33     ` Thomas Gleixner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ccc601ef-4ee7-4f72-b2d8-64155d1bd324@linux.dev \
    --to=vadim.fedorenko@linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=richardcochran@gmail.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.