diff mbox series

[v3,iwl-next,2/6] ice: pass reset type to PTP reset functions

Message ID 20231220104323.974456-3-karol.kolacinski@intel.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series ice: fix timestamping in reset process | expand

Checks

Context Check Description
netdev/tree_selection success Guessing tree name failed - patch did not apply

Commit Message

Karol Kolacinski Dec. 20, 2023, 10:43 a.m. UTC
From: Jacob Keller <jacob.e.keller@intel.com>

The ice_ptp_prepare_for_reset() and ice_ptp_reset() functions currently
check the pf->flags ICE_FLAG_PFR_REQ bit to determine if the current
reset is a PF reset or not.

This is problematic, because it is possible that a PF reset and a higher
level reset (CORE reset, GLOBAL reset, EMP reset) are requested
simultaneously. In that case, the driver performs the highest level
reset requested. However, the ICE_FLAG_PFR_REQ flag will still be set.

The main driver reset functions take an enum ice_reset_req indicating
which reset is actually being performed. Pass this data into the PTP
functions and rely on this instead of relying on the driver flags.

This ensures that the PTP code performs the proper level of reset that
the driver is actually undergoing.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
---
 drivers/net/ethernet/intel/ice/ice_main.c |  4 ++--
 drivers/net/ethernet/intel/ice/ice_ptp.c  | 13 +++++++------
 drivers/net/ethernet/intel/ice/ice_ptp.h  | 19 +++++++++++++++++--
 3 files changed, 26 insertions(+), 10 deletions(-)

Comments

Vadim Fedorenko Dec. 20, 2023, 11:18 a.m. UTC | #1
On 20/12/2023 10:43, Karol Kolacinski wrote:
> From: Jacob Keller <jacob.e.keller@intel.com>
> 
> The ice_ptp_prepare_for_reset() and ice_ptp_reset() functions currently
> check the pf->flags ICE_FLAG_PFR_REQ bit to determine if the current
> reset is a PF reset or not.
> 
> This is problematic, because it is possible that a PF reset and a higher
> level reset (CORE reset, GLOBAL reset, EMP reset) are requested
> simultaneously. In that case, the driver performs the highest level
> reset requested. However, the ICE_FLAG_PFR_REQ flag will still be set.
> 
> The main driver reset functions take an enum ice_reset_req indicating
> which reset is actually being performed. Pass this data into the PTP
> functions and rely on this instead of relying on the driver flags.
> 
> This ensures that the PTP code performs the proper level of reset that
> the driver is actually undergoing.
> 
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
> ---
>   drivers/net/ethernet/intel/ice/ice_main.c |  4 ++--
>   drivers/net/ethernet/intel/ice/ice_ptp.c  | 13 +++++++------
>   drivers/net/ethernet/intel/ice/ice_ptp.h  | 19 +++++++++++++++++--
>   3 files changed, 26 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
> index 77ba737a50df..a14e8734cc27 100644
> --- a/drivers/net/ethernet/intel/ice/ice_main.c
> +++ b/drivers/net/ethernet/intel/ice/ice_main.c
> @@ -613,7 +613,7 @@ ice_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
>   	ice_pf_dis_all_vsi(pf, false);
>   
>   	if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
> -		ice_ptp_prepare_for_reset(pf);
> +		ice_ptp_prepare_for_reset(pf, reset_type);
>   
>   	if (ice_is_feature_supported(pf, ICE_F_GNSS))
>   		ice_gnss_exit(pf);
> @@ -7554,7 +7554,7 @@ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
>   	 * fail.
>   	 */
>   	if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
> -		ice_ptp_reset(pf);
> +		ice_ptp_reset(pf, reset_type);
>   
>   	if (ice_is_feature_supported(pf, ICE_F_GNSS))
>   		ice_gnss_init(pf);
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index d7de65f8dd53..c309d3fd5a4e 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -2631,8 +2631,9 @@ static void ice_ptp_periodic_work(struct kthread_work *work)
>   /**
>    * ice_ptp_prepare_for_reset - Prepare PTP for reset
>    * @pf: Board private structure
> + * @reset_type: the reset type being performed
>    */
> -void ice_ptp_prepare_for_reset(struct ice_pf *pf)
> +void ice_ptp_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
>   {
>   	struct ice_ptp *ptp = &pf->ptp;
>   	u8 src_tmr;
> @@ -2647,7 +2648,7 @@ void ice_ptp_prepare_for_reset(struct ice_pf *pf)
>   
>   	kthread_cancel_delayed_work_sync(&ptp->work);
>   
> -	if (test_bit(ICE_PFR_REQ, pf->state))
> +	if (reset_type == ICE_RESET_PFR)
>   		return;
>   
>   	ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
> @@ -2667,8 +2668,9 @@ void ice_ptp_prepare_for_reset(struct ice_pf *pf)
>   /**
>    * ice_ptp_reset - Initialize PTP hardware clock support after reset
>    * @pf: Board private structure
> + * @reset_type: the reset type being performed
>    */
> -void ice_ptp_reset(struct ice_pf *pf)
> +void ice_ptp_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
>   {
>   	struct ice_ptp *ptp = &pf->ptp;
>   	struct ice_hw *hw = &pf->hw;
> @@ -2678,7 +2680,7 @@ void ice_ptp_reset(struct ice_pf *pf)
>   
>   	if (ptp->state != ICE_PTP_RESETTING) {
>   		if (ptp->state == ICE_PTP_READY) {
> -			ice_ptp_prepare_for_reset(pf);
> +			ice_ptp_prepare_for_reset(pf, reset_type);
>   		} else {
>   			err = -EINVAL;
>   			dev_err(ice_pf_to_dev(pf), "PTP was not initialized\n");
> @@ -2686,8 +2688,7 @@ void ice_ptp_reset(struct ice_pf *pf)
>   		}
>   	}
>   
> -	if (test_bit(ICE_PFR_REQ, pf->state) ||
> -	    !ice_pf_src_tmr_owned(pf))
> +	if (reset_type == ICE_RESET_PFR || !ice_pf_src_tmr_owned(pf))
>   		goto pfr;
>   
>   	err = ice_ptp_init_phc(hw);
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
> index 2457380142e1..7b748f22e6f7 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.h
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
> @@ -314,8 +314,8 @@ enum ice_tx_tstamp_work ice_ptp_process_ts(struct ice_pf *pf);
>   
>   u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
>   			const struct ice_pkt_ctx *pkt_ctx);
> -void ice_ptp_reset(struct ice_pf *pf);
> -void ice_ptp_prepare_for_reset(struct ice_pf *pf);
> +void ice_ptp_prepare_for_reset(struct ice_pf *pf,
> +			       enum ice_reset_req reset_type);
>   void ice_ptp_init(struct ice_pf *pf);
>   void ice_ptp_release(struct ice_pf *pf);
>   void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup);
> @@ -347,6 +347,7 @@ static inline bool ice_ptp_process_ts(struct ice_pf *pf)
>   {
>   	return true;
>   }
> +<<<<<<< HEAD

    ^^^^^^^^^^^^ - looks like some mess from internal merge?

>   
>   static inline u64
>   ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
> @@ -357,6 +358,20 @@ ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
>   
>   static inline void ice_ptp_reset(struct ice_pf *pf) { }
>   static inline void ice_ptp_prepare_for_reset(struct ice_pf *pf) { }
> +=======

    ^^^^^^^ here again

> +static inline void
> +ice_ptp_rx_hwtstamp(struct ice_rx_ring *rx_ring,
> +		    union ice_32b_rx_flex_desc *rx_desc, struct sk_buff *skb) { }
> +static inline void ice_ptp_reset(struct ice_pf *pf,
> +				 enum ice_reset_req reset_type)
> +{
> +}
> +
> +static inline void ice_ptp_prepare_for_reset(struct ice_pf *pf,
> +					     enum ice_reset_req reset_type)
> +{
> +}
> +>>>>>>> 86982aff2a40 (ice: pass reset type to PTP reset functions)

    and again...

>   static inline void ice_ptp_init(struct ice_pf *pf) { }
>   static inline void ice_ptp_release(struct ice_pf *pf) { }
>   static inline void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)

pw-bot: cr
diff mbox series

Patch

diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 77ba737a50df..a14e8734cc27 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -613,7 +613,7 @@  ice_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
 	ice_pf_dis_all_vsi(pf, false);
 
 	if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
-		ice_ptp_prepare_for_reset(pf);
+		ice_ptp_prepare_for_reset(pf, reset_type);
 
 	if (ice_is_feature_supported(pf, ICE_F_GNSS))
 		ice_gnss_exit(pf);
@@ -7554,7 +7554,7 @@  static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
 	 * fail.
 	 */
 	if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
-		ice_ptp_reset(pf);
+		ice_ptp_reset(pf, reset_type);
 
 	if (ice_is_feature_supported(pf, ICE_F_GNSS))
 		ice_gnss_init(pf);
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index d7de65f8dd53..c309d3fd5a4e 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -2631,8 +2631,9 @@  static void ice_ptp_periodic_work(struct kthread_work *work)
 /**
  * ice_ptp_prepare_for_reset - Prepare PTP for reset
  * @pf: Board private structure
+ * @reset_type: the reset type being performed
  */
-void ice_ptp_prepare_for_reset(struct ice_pf *pf)
+void ice_ptp_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
 {
 	struct ice_ptp *ptp = &pf->ptp;
 	u8 src_tmr;
@@ -2647,7 +2648,7 @@  void ice_ptp_prepare_for_reset(struct ice_pf *pf)
 
 	kthread_cancel_delayed_work_sync(&ptp->work);
 
-	if (test_bit(ICE_PFR_REQ, pf->state))
+	if (reset_type == ICE_RESET_PFR)
 		return;
 
 	ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
@@ -2667,8 +2668,9 @@  void ice_ptp_prepare_for_reset(struct ice_pf *pf)
 /**
  * ice_ptp_reset - Initialize PTP hardware clock support after reset
  * @pf: Board private structure
+ * @reset_type: the reset type being performed
  */
-void ice_ptp_reset(struct ice_pf *pf)
+void ice_ptp_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
 {
 	struct ice_ptp *ptp = &pf->ptp;
 	struct ice_hw *hw = &pf->hw;
@@ -2678,7 +2680,7 @@  void ice_ptp_reset(struct ice_pf *pf)
 
 	if (ptp->state != ICE_PTP_RESETTING) {
 		if (ptp->state == ICE_PTP_READY) {
-			ice_ptp_prepare_for_reset(pf);
+			ice_ptp_prepare_for_reset(pf, reset_type);
 		} else {
 			err = -EINVAL;
 			dev_err(ice_pf_to_dev(pf), "PTP was not initialized\n");
@@ -2686,8 +2688,7 @@  void ice_ptp_reset(struct ice_pf *pf)
 		}
 	}
 
-	if (test_bit(ICE_PFR_REQ, pf->state) ||
-	    !ice_pf_src_tmr_owned(pf))
+	if (reset_type == ICE_RESET_PFR || !ice_pf_src_tmr_owned(pf))
 		goto pfr;
 
 	err = ice_ptp_init_phc(hw);
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
index 2457380142e1..7b748f22e6f7 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
@@ -314,8 +314,8 @@  enum ice_tx_tstamp_work ice_ptp_process_ts(struct ice_pf *pf);
 
 u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
 			const struct ice_pkt_ctx *pkt_ctx);
-void ice_ptp_reset(struct ice_pf *pf);
-void ice_ptp_prepare_for_reset(struct ice_pf *pf);
+void ice_ptp_prepare_for_reset(struct ice_pf *pf,
+			       enum ice_reset_req reset_type);
 void ice_ptp_init(struct ice_pf *pf);
 void ice_ptp_release(struct ice_pf *pf);
 void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup);
@@ -347,6 +347,7 @@  static inline bool ice_ptp_process_ts(struct ice_pf *pf)
 {
 	return true;
 }
+<<<<<<< HEAD
 
 static inline u64
 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
@@ -357,6 +358,20 @@  ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
 
 static inline void ice_ptp_reset(struct ice_pf *pf) { }
 static inline void ice_ptp_prepare_for_reset(struct ice_pf *pf) { }
+=======
+static inline void
+ice_ptp_rx_hwtstamp(struct ice_rx_ring *rx_ring,
+		    union ice_32b_rx_flex_desc *rx_desc, struct sk_buff *skb) { }
+static inline void ice_ptp_reset(struct ice_pf *pf,
+				 enum ice_reset_req reset_type)
+{
+}
+
+static inline void ice_ptp_prepare_for_reset(struct ice_pf *pf,
+					     enum ice_reset_req reset_type)
+{
+}
+>>>>>>> 86982aff2a40 (ice: pass reset type to PTP reset functions)
 static inline void ice_ptp_init(struct ice_pf *pf) { }
 static inline void ice_ptp_release(struct ice_pf *pf) { }
 static inline void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)