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 |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply |
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 --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)