From: Karol Kolacinski <karol.kolacin...@intel.com>

TSPLL can fail when trying to lock to TIME_REF as a clock source, e.g.
when the external clock source is not stable or connected to the board.
To continue operation after failure, try to lock again to internal TCXO
and inform user about this.

Reviewed-by: Milena Olech <milena.ol...@intel.com>
Signed-off-by: Karol Kolacinski <karol.kolacin...@intel.com>
---
 drivers/net/ethernet/intel/ice/ice_tspll.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/intel/ice/ice_tspll.c 
b/drivers/net/ethernet/intel/ice/ice_tspll.c
index 
93016bf92256e658e3d794ccf117eb7cd03af6f8..d5db0bdbb36402c7e45f49cf55e1dbe0cac10df2
 100644
--- a/drivers/net/ethernet/intel/ice/ice_tspll.c
+++ b/drivers/net/ethernet/intel/ice/ice_tspll.c
@@ -497,5 +497,17 @@ int ice_tspll_init(struct ice_hw *hw)
        /* Configure the TSPLL using the parameters from the function
         * capabilities.
         */
-       return ice_tspll_cfg(hw, tspll_freq, clk_src);
+       err = ice_tspll_cfg(hw, tspll_freq, clk_src);
+       if (err) {
+               dev_warn(ice_hw_to_dev(hw), "Failed to lock TSPLL to predefined 
frequency. Retrying with fallback frequency.\n");
+
+               /* Try to lock to internal TCXO as a fallback. */
+               tspll_freq = ice_tspll_default_freq(hw->mac_type);
+               clk_src = ICE_CLK_SRC_TCXO;
+               err = ice_tspll_cfg(hw, tspll_freq, clk_src);
+               if (err)
+                       dev_warn(ice_hw_to_dev(hw), "Failed to lock TSPLL to 
fallback frequency.\n");
+       }
+
+       return err;
 }

-- 
2.48.1.397.gec9d649cc640

Reply via email to