Commit 7f9048f1 authored by Jacob Keller's avatar Jacob Keller Committed by David S. Miller

net: reject PTP periodic output requests with unsupported flags

Commit 823eb2a3 ("PTP: add support for one-shot output") introduced
a new flag for the PTP periodic output request ioctl. This flag is not
currently supported by any driver.

Fix all drivers which implement the periodic output request ioctl to
explicitly reject any request with flags they do not understand. This
ensures that the driver does not accidentally misinterpret the
PTP_PEROUT_ONE_SHOT flag, or any new flag introduced in the future.

This is important for forward compatibility: if a new flag is
introduced, the driver should reject requests to enable the flag until
the driver has actually been modified to support the flag in question.

Cc: Felipe Balbi <felipe.balbi@linux.intel.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Christopher Hall <christopher.s.hall@intel.com>
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Signed-off-by: default avatarRichard Cochran <richardcochran@gmail.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Reviewed-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cd734d54
...@@ -6280,6 +6280,10 @@ static int tg3_ptp_enable(struct ptp_clock_info *ptp, ...@@ -6280,6 +6280,10 @@ static int tg3_ptp_enable(struct ptp_clock_info *ptp,
switch (rq->type) { switch (rq->type) {
case PTP_CLK_REQ_PEROUT: case PTP_CLK_REQ_PEROUT:
/* Reject requests with unsupported flags */
if (rq->perout.flags)
return -EOPNOTSUPP;
if (rq->perout.index != 0) if (rq->perout.index != 0)
return -EINVAL; return -EINVAL;
......
...@@ -551,6 +551,10 @@ static int igb_ptp_feature_enable_i210(struct ptp_clock_info *ptp, ...@@ -551,6 +551,10 @@ static int igb_ptp_feature_enable_i210(struct ptp_clock_info *ptp,
return 0; return 0;
case PTP_CLK_REQ_PEROUT: case PTP_CLK_REQ_PEROUT:
/* Reject requests with unsupported flags */
if (rq->perout.flags)
return -EOPNOTSUPP;
if (on) { if (on) {
pin = ptp_find_pin(igb->ptp_clock, PTP_PF_PEROUT, pin = ptp_find_pin(igb->ptp_clock, PTP_PF_PEROUT,
rq->perout.index); rq->perout.index);
......
...@@ -290,6 +290,10 @@ static int mlx5_perout_configure(struct ptp_clock_info *ptp, ...@@ -290,6 +290,10 @@ static int mlx5_perout_configure(struct ptp_clock_info *ptp,
if (!MLX5_PPS_CAP(mdev)) if (!MLX5_PPS_CAP(mdev))
return -EOPNOTSUPP; return -EOPNOTSUPP;
/* Reject requests with unsupported flags */
if (rq->perout.flags)
return -EOPNOTSUPP;
if (rq->perout.index >= clock->ptp_info.n_pins) if (rq->perout.index >= clock->ptp_info.n_pins)
return -EINVAL; return -EINVAL;
......
...@@ -429,6 +429,10 @@ static int lan743x_ptp_perout(struct lan743x_adapter *adapter, int on, ...@@ -429,6 +429,10 @@ static int lan743x_ptp_perout(struct lan743x_adapter *adapter, int on,
int pulse_width = 0; int pulse_width = 0;
int perout_bit = 0; int perout_bit = 0;
/* Reject requests with unsupported flags */
if (perout->flags)
return -EOPNOTSUPP;
if (!on) { if (!on) {
lan743x_ptp_perout_off(adapter); lan743x_ptp_perout_off(adapter);
return 0; return 0;
......
...@@ -211,6 +211,10 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp, ...@@ -211,6 +211,10 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp,
unsigned long flags; unsigned long flags;
int error = 0; int error = 0;
/* Reject requests with unsupported flags */
if (req->flags)
return -EOPNOTSUPP;
if (req->index) if (req->index)
return -EINVAL; return -EINVAL;
......
...@@ -140,6 +140,10 @@ static int stmmac_enable(struct ptp_clock_info *ptp, ...@@ -140,6 +140,10 @@ static int stmmac_enable(struct ptp_clock_info *ptp,
switch (rq->type) { switch (rq->type) {
case PTP_CLK_REQ_PEROUT: case PTP_CLK_REQ_PEROUT:
/* Reject requests with unsupported flags */
if (rq->perout.flags)
return -EOPNOTSUPP;
cfg = &priv->pps[rq->perout.index]; cfg = &priv->pps[rq->perout.index];
cfg->start.tv_sec = rq->perout.start.sec; cfg->start.tv_sec = rq->perout.start.sec;
......
...@@ -491,6 +491,9 @@ static int ptp_dp83640_enable(struct ptp_clock_info *ptp, ...@@ -491,6 +491,9 @@ static int ptp_dp83640_enable(struct ptp_clock_info *ptp,
return 0; return 0;
case PTP_CLK_REQ_PEROUT: case PTP_CLK_REQ_PEROUT:
/* Reject requests with unsupported flags */
if (rq->perout.flags)
return -EOPNOTSUPP;
if (rq->perout.index >= N_PER_OUT) if (rq->perout.index >= N_PER_OUT)
return -EINVAL; return -EINVAL;
return periodic_output(clock, rq, on, rq->perout.index); return periodic_output(clock, rq, on, rq->perout.index);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment