PTP: introduce new versions of IOCTLs
The current version of the IOCTL have a small problem which prevents us from extending the API by making use of reserved fields. In these new IOCTLs, we are now making sure that flags and rsv fields are zero which will allow us to extend the API in the future. Reviewed-by: Richard Cochran <richardcochran@gmail.com> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committad av
David S. Miller

förälder
6cd476d26b
incheckning
415606588c
@@ -126,7 +126,9 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
switch (cmd) {
|
||||
|
||||
case PTP_CLOCK_GETCAPS:
|
||||
case PTP_CLOCK_GETCAPS2:
|
||||
memset(&caps, 0, sizeof(caps));
|
||||
|
||||
caps.max_adj = ptp->info->max_adj;
|
||||
caps.n_alarm = ptp->info->n_alarm;
|
||||
caps.n_ext_ts = ptp->info->n_ext_ts;
|
||||
@@ -139,11 +141,24 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
|
||||
case PTP_EXTTS_REQUEST:
|
||||
case PTP_EXTTS_REQUEST2:
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
if (copy_from_user(&req.extts, (void __user *)arg,
|
||||
sizeof(req.extts))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if (((req.extts.flags & ~PTP_EXTTS_VALID_FLAGS) ||
|
||||
req.extts.rsv[0] || req.extts.rsv[1]) &&
|
||||
cmd == PTP_EXTTS_REQUEST2) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
} else if (cmd == PTP_EXTTS_REQUEST) {
|
||||
req.extts.flags &= ~PTP_EXTTS_VALID_FLAGS;
|
||||
req.extts.rsv[0] = 0;
|
||||
req.extts.rsv[1] = 0;
|
||||
}
|
||||
if (req.extts.index >= ops->n_ext_ts) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
@@ -154,11 +169,27 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
|
||||
case PTP_PEROUT_REQUEST:
|
||||
case PTP_PEROUT_REQUEST2:
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
if (copy_from_user(&req.perout, (void __user *)arg,
|
||||
sizeof(req.perout))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if (((req.perout.flags & ~PTP_PEROUT_VALID_FLAGS) ||
|
||||
req.perout.rsv[0] || req.perout.rsv[1] ||
|
||||
req.perout.rsv[2] || req.perout.rsv[3]) &&
|
||||
cmd == PTP_PEROUT_REQUEST2) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
} else if (cmd == PTP_PEROUT_REQUEST) {
|
||||
req.perout.flags &= ~PTP_PEROUT_VALID_FLAGS;
|
||||
req.perout.rsv[0] = 0;
|
||||
req.perout.rsv[1] = 0;
|
||||
req.perout.rsv[2] = 0;
|
||||
req.perout.rsv[3] = 0;
|
||||
}
|
||||
if (req.perout.index >= ops->n_per_out) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
@@ -169,6 +200,9 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
|
||||
case PTP_ENABLE_PPS:
|
||||
case PTP_ENABLE_PPS2:
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
if (!capable(CAP_SYS_TIME))
|
||||
return -EPERM;
|
||||
req.type = PTP_CLK_REQ_PPS;
|
||||
@@ -177,6 +211,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
|
||||
case PTP_SYS_OFFSET_PRECISE:
|
||||
case PTP_SYS_OFFSET_PRECISE2:
|
||||
if (!ptp->info->getcrosststamp) {
|
||||
err = -EOPNOTSUPP;
|
||||
break;
|
||||
@@ -201,6 +236,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
|
||||
case PTP_SYS_OFFSET_EXTENDED:
|
||||
case PTP_SYS_OFFSET_EXTENDED2:
|
||||
if (!ptp->info->gettimex64) {
|
||||
err = -EOPNOTSUPP;
|
||||
break;
|
||||
@@ -232,6 +268,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
|
||||
case PTP_SYS_OFFSET:
|
||||
case PTP_SYS_OFFSET2:
|
||||
sysoff = memdup_user((void __user *)arg, sizeof(*sysoff));
|
||||
if (IS_ERR(sysoff)) {
|
||||
err = PTR_ERR(sysoff);
|
||||
@@ -266,10 +303,23 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
|
||||
case PTP_PIN_GETFUNC:
|
||||
case PTP_PIN_GETFUNC2:
|
||||
if (copy_from_user(&pd, (void __user *)arg, sizeof(pd))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if ((pd.rsv[0] || pd.rsv[1] || pd.rsv[2]
|
||||
|| pd.rsv[3] || pd.rsv[4])
|
||||
&& cmd == PTP_PIN_GETFUNC2) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
} else if (cmd == PTP_PIN_GETFUNC) {
|
||||
pd.rsv[0] = 0;
|
||||
pd.rsv[1] = 0;
|
||||
pd.rsv[2] = 0;
|
||||
pd.rsv[3] = 0;
|
||||
pd.rsv[4] = 0;
|
||||
}
|
||||
pin_index = pd.index;
|
||||
if (pin_index >= ops->n_pins) {
|
||||
err = -EINVAL;
|
||||
@@ -285,10 +335,23 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
|
||||
case PTP_PIN_SETFUNC:
|
||||
case PTP_PIN_SETFUNC2:
|
||||
if (copy_from_user(&pd, (void __user *)arg, sizeof(pd))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if ((pd.rsv[0] || pd.rsv[1] || pd.rsv[2]
|
||||
|| pd.rsv[3] || pd.rsv[4])
|
||||
&& cmd == PTP_PIN_SETFUNC2) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
} else if (cmd == PTP_PIN_SETFUNC) {
|
||||
pd.rsv[0] = 0;
|
||||
pd.rsv[1] = 0;
|
||||
pd.rsv[2] = 0;
|
||||
pd.rsv[3] = 0;
|
||||
pd.rsv[4] = 0;
|
||||
}
|
||||
pin_index = pd.index;
|
||||
if (pin_index >= ops->n_pins) {
|
||||
err = -EINVAL;
|
||||
|
Referens i nytt ärende
Block a user