dpll: extend lock_status_get() op by status error and expose to user
authorJiri Pirko <jiri@nvidia.com>
Tue, 30 Jan 2024 12:08:30 +0000 (13:08 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 1 Feb 2024 14:39:44 +0000 (15:39 +0100)
Pass additional argunent status_error over lock_status_get()
so drivers can fill it up. In case they do, expose the value over
previously introduced attribute to user. Do it only in case the
current lock_status is either "unlocked" or "holdover".

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Acked-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/dpll/dpll_netlink.c
drivers/net/ethernet/intel/ice/ice_dpll.c
drivers/net/ethernet/mellanox/mlx5/core/dpll.c
drivers/ptp/ptp_ocp.c
include/linux/dpll.h

index 314bb377546519ef25987b2e6f77827f590fe5fe..cf3313517ae17f82e7b42eaf905040b47097f5ff 100644 (file)
@@ -121,14 +121,21 @@ dpll_msg_add_lock_status(struct sk_buff *msg, struct dpll_device *dpll,
                         struct netlink_ext_ack *extack)
 {
        const struct dpll_device_ops *ops = dpll_device_ops(dpll);
+       enum dpll_lock_status_error status_error = 0;
        enum dpll_lock_status status;
        int ret;
 
-       ret = ops->lock_status_get(dpll, dpll_priv(dpll), &status, extack);
+       ret = ops->lock_status_get(dpll, dpll_priv(dpll), &status,
+                                  &status_error, extack);
        if (ret)
                return ret;
        if (nla_put_u32(msg, DPLL_A_LOCK_STATUS, status))
                return -EMSGSIZE;
+       if (status_error &&
+           (status == DPLL_LOCK_STATUS_UNLOCKED ||
+            status == DPLL_LOCK_STATUS_HOLDOVER) &&
+           nla_put_u32(msg, DPLL_A_LOCK_STATUS_ERROR, status_error))
+               return -EMSGSIZE;
 
        return 0;
 }
index b9c5eced6326f8fe3958c446f3e8b8bb0c517f90..c0256564e9986f2da7aa9379bfbd407ef486811d 100644 (file)
@@ -488,6 +488,7 @@ ice_dpll_hw_input_prio_set(struct ice_pf *pf, struct ice_dpll *dpll,
  * @dpll: registered dpll pointer
  * @dpll_priv: private data pointer passed on dpll registration
  * @status: on success holds dpll's lock status
+ * @status_error: status error value
  * @extack: error reporting
  *
  * Dpll subsystem callback, provides dpll's lock status.
@@ -500,6 +501,7 @@ ice_dpll_hw_input_prio_set(struct ice_pf *pf, struct ice_dpll *dpll,
 static int
 ice_dpll_lock_status_get(const struct dpll_device *dpll, void *dpll_priv,
                         enum dpll_lock_status *status,
+                        enum dpll_lock_status_error *status_error,
                         struct netlink_ext_ack *extack)
 {
        struct ice_dpll *d = dpll_priv;
index 18fed2b34fb1cad6319f972ca5b6d604701bbce5..07f43d5c90c6ebc4ed638da02a6cbcd045d44264 100644 (file)
@@ -118,10 +118,11 @@ mlx5_dpll_pin_ffo_get(struct mlx5_dpll_synce_status *synce_status,
        return 0;
 }
 
-static int mlx5_dpll_device_lock_status_get(const struct dpll_device *dpll,
-                                           void *priv,
-                                           enum dpll_lock_status *status,
-                                           struct netlink_ext_ack *extack)
+static int
+mlx5_dpll_device_lock_status_get(const struct dpll_device *dpll, void *priv,
+                                enum dpll_lock_status *status,
+                                enum dpll_lock_status_error *status_error,
+                                struct netlink_ext_ack *extack)
 {
        struct mlx5_dpll_synce_status synce_status;
        struct mlx5_dpll *mdpll = priv;
index 5f858e426bbd5119b64c59558e713e2be73e3db5..9507681e0d12aa709e53cfee114c9d5d3274601a 100644 (file)
@@ -4209,10 +4209,11 @@ ptp_ocp_detach(struct ptp_ocp *bp)
        device_unregister(&bp->dev);
 }
 
-static int ptp_ocp_dpll_lock_status_get(const struct dpll_device *dpll,
-                                       void *priv,
-                                       enum dpll_lock_status *status,
-                                       struct netlink_ext_ack *extack)
+static int
+ptp_ocp_dpll_lock_status_get(const struct dpll_device *dpll, void *priv,
+                            enum dpll_lock_status *status,
+                            enum dpll_lock_status_error *status_error,
+                            struct netlink_ext_ack *extack)
 {
        struct ptp_ocp *bp = priv;
 
index 9cf896ea1d4122f3bc7094e46a5af81b999937dc..9cb02ad73d51e97a21dc183bbf3a11bd8fc134e1 100644 (file)
@@ -19,6 +19,7 @@ struct dpll_device_ops {
                        enum dpll_mode *mode, struct netlink_ext_ack *extack);
        int (*lock_status_get)(const struct dpll_device *dpll, void *dpll_priv,
                               enum dpll_lock_status *status,
+                              enum dpll_lock_status_error *status_error,
                               struct netlink_ext_ack *extack);
        int (*temp_get)(const struct dpll_device *dpll, void *dpll_priv,
                        s32 *temp, struct netlink_ext_ack *extack);