* [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process
@ 2023-08-07 10:36 Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 1/9] ice: use ice_pf_src_tmr_owned where available Karol Kolacinski
` (8 more replies)
0 siblings, 9 replies; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
PTP reset process has multiple places where timestamping can end up in
an incorrect state.
This series introduces a proper state machine for PTP and refactors
a large part of the code to ensure that timestamping does not break.
Karol Kolacinski (9):
ice: use ice_pf_src_tmr_owned where available
ice: introduce PTP state machine
ice: pass reset type to PTP reset functions
ice: rename PTP functions and fields
ice: factor out ice_ptp_rebuild_owner()
ice: remove ptp_tx ring parameter flag
ice: modify tstamp_config only during TS mode set
ice: restore timestamp configuration after reset
ice: stop destroying and reinitalizing Tx tracker during reset
drivers/net/ethernet/intel/ice/ice.h | 1 -
drivers/net/ethernet/intel/ice/ice_ethtool.c | 2 +-
drivers/net/ethernet/intel/ice/ice_main.c | 16 +-
drivers/net/ethernet/intel/ice/ice_ptp.c | 331 ++++++++++++-------
drivers/net/ethernet/intel/ice/ice_ptp.h | 36 +-
drivers/net/ethernet/intel/ice/ice_txrx.c | 3 -
drivers/net/ethernet/intel/ice/ice_txrx.h | 1 -
7 files changed, 247 insertions(+), 143 deletions(-)
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 1/9] ice: use ice_pf_src_tmr_owned where available
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
@ 2023-08-07 10:36 ` Karol Kolacinski
2023-08-07 10:59 ` Przemek Kitszel
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 2/9] ice: introduce PTP state machine Karol Kolacinski
` (7 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
The ice_pf_src_tmr_owned() macro exists to check the function capability
bit indicating if the current function owns the PTP hardware clock.
This is slightly shorter than the more verbose access via
hw.func_caps.ts_func_info.src_tmr_owned. Be consistent and use this
where possible rather than open coding its equivalent.
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
drivers/net/ethernet/intel/ice/ice_main.c | 2 +-
drivers/net/ethernet/intel/ice/ice_ptp.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index a73895483e6c..1ac37a3f8de5 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -3158,7 +3158,7 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
ena_mask &= ~PFINT_OICR_TSYN_EVNT_M;
- if (hw->func_caps.ts_func_info.src_tmr_owned) {
+ if (ice_pf_src_tmr_owned(pf)) {
/* Save EVENTs from GLTSYN register */
pf->ptp.ext_ts_irq |= gltsyn_stat &
(GLTSYN_STAT_EVENT0_M |
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index 97b8581ae931..0669ca905c46 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -2447,7 +2447,7 @@ void ice_ptp_reset(struct ice_pf *pf)
if (test_bit(ICE_PFR_REQ, pf->state))
goto pfr;
- if (!hw->func_caps.ts_func_info.src_tmr_owned)
+ if (!ice_pf_src_tmr_owned(pf))
goto reset_ts;
err = ice_ptp_init_phc(hw);
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 2/9] ice: introduce PTP state machine
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 1/9] ice: use ice_pf_src_tmr_owned where available Karol Kolacinski
@ 2023-08-07 10:36 ` Karol Kolacinski
2023-08-07 11:12 ` Przemek Kitszel
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 3/9] ice: pass reset type to PTP reset functions Karol Kolacinski
` (6 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
Add PTP state machine so that the driver can correctly identify PTP
state around resets.
When the driver got information about ungraceful reset, PTP was not
prepared for reset and it returned error. When this situation occurs,
prepare PTP before rebuilding its structures.
Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
---
drivers/net/ethernet/intel/ice/ice.h | 1 -
drivers/net/ethernet/intel/ice/ice_ethtool.c | 2 +-
drivers/net/ethernet/intel/ice/ice_ptp.c | 131 +++++++++++++------
drivers/net/ethernet/intel/ice/ice_ptp.h | 10 ++
4 files changed, 99 insertions(+), 45 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
index 34be1cb1e28f..86f6f94da535 100644
--- a/drivers/net/ethernet/intel/ice/ice.h
+++ b/drivers/net/ethernet/intel/ice/ice.h
@@ -490,7 +490,6 @@ enum ice_pf_flags {
ICE_FLAG_DCB_ENA,
ICE_FLAG_FD_ENA,
ICE_FLAG_PTP_SUPPORTED, /* PTP is supported by NVM */
- ICE_FLAG_PTP, /* PTP is enabled by software */
ICE_FLAG_ADV_FEATURES,
ICE_FLAG_TC_MQPRIO, /* support for Multi queue TC */
ICE_FLAG_CLS_FLOWER,
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
index d3cb08e66dcb..7d57ecf48da0 100644
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
@@ -3275,7 +3275,7 @@ ice_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
struct ice_pf *pf = ice_netdev_to_pf(dev);
/* only report timestamping if PTP is enabled */
- if (!test_bit(ICE_FLAG_PTP, pf->flags))
+ if (!test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
return ethtool_op_get_ts_info(dev, info);
info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index 0669ca905c46..a6ea90b9461e 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -255,6 +255,31 @@ ice_verify_pin_e810t(struct ptp_clock_info *info, unsigned int pin,
return ice_ptp_set_sma_e810t(info, pin, func);
}
+/**
+ * ice_ptp_state_str - Convert PTP state to readable string
+ * @state: PTP state to convert
+ *
+ * Returns: the human readable string representation of the provided PTP
+ * state, used for printing error messages.
+ */
+static const char *ice_ptp_state_str(enum ice_ptp_state state)
+{
+ switch (state) {
+ case ICE_PTP_UNINIT:
+ return "UNINITIALIZED";
+ case ICE_PTP_INITIALIZING:
+ return "INITIALIZING";
+ case ICE_PTP_READY:
+ return "READY";
+ case ICE_PTP_RESETTING:
+ return "RESETTING";
+ case ICE_PTP_ERROR:
+ return "ERROR";
+ }
+
+ return "UNKNOWN";
+}
+
/**
* ice_ptp_configure_tx_tstamp - Enable or disable Tx timestamp interrupt
* @pf: The PF pointer to search in
@@ -1285,7 +1310,7 @@ void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)
struct ice_ptp_port *ptp_port;
struct ice_hw *hw = &pf->hw;
- if (!test_bit(ICE_FLAG_PTP, pf->flags))
+ if (pf->ptp.state != ICE_PTP_READY)
return;
if (WARN_ON_ONCE(port >= ICE_NUM_EXTERNAL_PORTS))
@@ -2020,7 +2045,7 @@ int ice_ptp_get_ts_config(struct ice_pf *pf, struct ifreq *ifr)
{
struct hwtstamp_config *config;
- if (!test_bit(ICE_FLAG_PTP, pf->flags))
+ if (pf->ptp.state != ICE_PTP_READY)
return -EIO;
config = &pf->ptp.tstamp_config;
@@ -2087,7 +2112,7 @@ int ice_ptp_set_ts_config(struct ice_pf *pf, struct ifreq *ifr)
struct hwtstamp_config config;
int err;
- if (!test_bit(ICE_FLAG_PTP, pf->flags))
+ if (pf->ptp.state != ICE_PTP_READY)
return -EAGAIN;
if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
@@ -2422,7 +2447,7 @@ static void ice_ptp_periodic_work(struct kthread_work *work)
struct ice_pf *pf = container_of(ptp, struct ice_pf, ptp);
int err;
- if (!test_bit(ICE_FLAG_PTP, pf->flags))
+ if (pf->ptp.state != ICE_PTP_READY)
return;
err = ice_ptp_update_cached_phctime(pf);
@@ -2432,6 +2457,42 @@ static void ice_ptp_periodic_work(struct kthread_work *work)
msecs_to_jiffies(err ? 10 : 500));
}
+/**
+ * ice_ptp_prepare_for_reset - Prepare PTP for reset
+ * @pf: Board private structure
+ */
+void ice_ptp_prepare_for_reset(struct ice_pf *pf)
+{
+ struct ice_ptp *ptp = &pf->ptp;
+ u8 src_tmr;
+
+ if (ptp->state == ICE_PTP_RESETTING)
+ return;
+
+ ptp->state = ICE_PTP_RESETTING;
+
+ /* Disable timestamping for both Tx and Rx */
+ ice_ptp_cfg_timestamp(pf, false);
+
+ kthread_cancel_delayed_work_sync(&ptp->work);
+
+ if (test_bit(ICE_PFR_REQ, pf->state))
+ return;
+
+ ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
+
+ /* Disable periodic outputs */
+ ice_ptp_disable_all_clkout(pf);
+
+ src_tmr = ice_get_ptp_src_clock_index(&pf->hw);
+
+ /* Disable source clock */
+ wr32(&pf->hw, GLTSYN_ENA(src_tmr), (u32)~GLTSYN_ENA_TSYN_ENA_M);
+
+ /* Acquire PHC and system timer to restore after reset */
+ ptp->reset_time = ktime_get_real_ns();
+}
+
/**
* ice_ptp_reset - Initialize PTP hardware clock support after reset
* @pf: Board private structure
@@ -2444,6 +2505,16 @@ void ice_ptp_reset(struct ice_pf *pf)
int err, itr = 1;
u64 time_diff;
+ if (ptp->state != ICE_PTP_RESETTING) {
+ if (ptp->state == ICE_PTP_READY) {
+ ice_ptp_prepare_for_reset(pf);
+ } else {
+ err = -EINVAL;
+ dev_err(ice_pf_to_dev(pf), "PTP was not initialized\n");
+ goto err;
+ }
+ }
+
if (test_bit(ICE_PFR_REQ, pf->state))
goto pfr;
@@ -2510,7 +2581,7 @@ void ice_ptp_reset(struct ice_pf *pf)
if (err)
goto err;
- set_bit(ICE_FLAG_PTP, pf->flags);
+ ptp->state = ICE_PTP_READY;
/* Start periodic work going */
kthread_queue_delayed_work(ptp->kworker, &ptp->work, 0);
@@ -2519,6 +2590,7 @@ void ice_ptp_reset(struct ice_pf *pf)
return;
err:
+ ptp->state = ICE_PTP_ERROR;
dev_err(ice_pf_to_dev(pf), "PTP reset failed %d\n", err);
}
@@ -2725,39 +2797,6 @@ int ice_ptp_clock_index(struct ice_pf *pf)
return clock ? ptp_clock_index(clock) : -1;
}
-/**
- * ice_ptp_prepare_for_reset - Prepare PTP for reset
- * @pf: Board private structure
- */
-void ice_ptp_prepare_for_reset(struct ice_pf *pf)
-{
- struct ice_ptp *ptp = &pf->ptp;
- u8 src_tmr;
-
- clear_bit(ICE_FLAG_PTP, pf->flags);
-
- /* Disable timestamping for both Tx and Rx */
- ice_ptp_cfg_timestamp(pf, false);
-
- kthread_cancel_delayed_work_sync(&ptp->work);
-
- if (test_bit(ICE_PFR_REQ, pf->state))
- return;
-
- ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
-
- /* Disable periodic outputs */
- ice_ptp_disable_all_clkout(pf);
-
- src_tmr = ice_get_ptp_src_clock_index(&pf->hw);
-
- /* Disable source clock */
- wr32(&pf->hw, GLTSYN_ENA(src_tmr), (u32)~GLTSYN_ENA_TSYN_ENA_M);
-
- /* Acquire PHC and system timer to restore after reset */
- ptp->reset_time = ktime_get_real_ns();
-}
-
/**
* ice_ptp_init_owner - Initialize PTP_1588_CLOCK device
* @pf: Board private structure
@@ -3011,6 +3050,8 @@ void ice_ptp_init(struct ice_pf *pf)
struct ice_hw *hw = &pf->hw;
int err;
+ ptp->state = ICE_PTP_INITIALIZING;
+
ice_ptp_init_phy_model(hw);
ice_ptp_init_tx_interrupt_mode(pf);
@@ -3032,7 +3073,6 @@ void ice_ptp_init(struct ice_pf *pf)
/* Start the PHY timestamping block */
ice_ptp_reset_phy_timestamping(pf);
- set_bit(ICE_FLAG_PTP, pf->flags);
err = ice_ptp_init_work(pf, ptp);
if (err)
goto err;
@@ -3041,6 +3081,7 @@ void ice_ptp_init(struct ice_pf *pf)
if (err)
goto err;
+ ptp->state = ICE_PTP_READY;
dev_info(ice_pf_to_dev(pf), "PTP init successful\n");
return;
@@ -3050,7 +3091,7 @@ void ice_ptp_init(struct ice_pf *pf)
ptp_clock_unregister(ptp->clock);
pf->ptp.clock = NULL;
}
- clear_bit(ICE_FLAG_PTP, pf->flags);
+ ptp->state = ICE_PTP_ERROR;
dev_err(ice_pf_to_dev(pf), "PTP failed %d\n", err);
}
@@ -3063,9 +3104,15 @@ void ice_ptp_init(struct ice_pf *pf)
*/
void ice_ptp_release(struct ice_pf *pf)
{
- if (!test_bit(ICE_FLAG_PTP, pf->flags))
+ if (pf->ptp.state == ICE_PTP_UNINIT)
return;
+ if (pf->ptp.state != ICE_PTP_READY)
+ dev_warn(ice_pf_to_dev(pf), "PTP state machine is %s, tearing down PTP anyways\n",
+ ice_ptp_state_str(pf->ptp.state));
+
+ pf->ptp.state = ICE_PTP_UNINIT;
+
/* Disable timestamping for both Tx and Rx */
ice_ptp_cfg_timestamp(pf, false);
@@ -3073,8 +3120,6 @@ void ice_ptp_release(struct ice_pf *pf)
ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
- clear_bit(ICE_FLAG_PTP, pf->flags);
-
kthread_cancel_delayed_work_sync(&pf->ptp.work);
ice_ptp_port_phy_stop(&pf->ptp.port);
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
index 8f6f94392756..674a0abe3cdd 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
@@ -201,8 +201,17 @@ struct ice_ptp_port_owner {
#define GLTSYN_TGT_H_IDX_MAX 4
+enum ice_ptp_state {
+ ICE_PTP_UNINIT = 0,
+ ICE_PTP_INITIALIZING,
+ ICE_PTP_READY,
+ ICE_PTP_RESETTING,
+ ICE_PTP_ERROR,
+};
+
/**
* struct ice_ptp - data used for integrating with CONFIG_PTP_1588_CLOCK
+ * @state: current state of PTP state machine
* @tx_interrupt_mode: the TX interrupt mode for the PTP clock
* @port: data for the PHY port initialization procedure
* @ports_owner: data for the auxiliary driver owner
@@ -225,6 +234,7 @@ struct ice_ptp_port_owner {
* @late_cached_phc_updates: number of times cached PHC update is late
*/
struct ice_ptp {
+ enum ice_ptp_state state;
enum ice_ptp_tx_interrupt tx_interrupt_mode;
struct ice_ptp_port port;
struct ice_ptp_port_owner ports_owner;
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 3/9] ice: pass reset type to PTP reset functions
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 1/9] ice: use ice_pf_src_tmr_owned where available Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 2/9] ice: introduce PTP state machine Karol Kolacinski
@ 2023-08-07 10:36 ` Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 4/9] ice: rename PTP functions and fields Karol Kolacinski
` (5 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
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>
---
drivers/net/ethernet/intel/ice/ice_main.c | 4 ++--
drivers/net/ethernet/intel/ice/ice_ptp.c | 17 ++++++++---------
drivers/net/ethernet/intel/ice/ice_ptp.h | 16 ++++++++++++----
3 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 1ac37a3f8de5..47e598e1bc4d 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -611,7 +611,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);
@@ -7355,7 +7355,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 a6ea90b9461e..0ee971f8c2e2 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -2460,8 +2460,10 @@ 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;
@@ -2476,7 +2478,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);
@@ -2496,8 +2498,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;
@@ -2507,7 +2510,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");
@@ -2515,12 +2518,9 @@ void ice_ptp_reset(struct ice_pf *pf)
}
}
- if (test_bit(ICE_PFR_REQ, pf->state))
+ if (reset_type == ICE_RESET_PFR || !ice_pf_src_tmr_owned(pf))
goto pfr;
- if (!ice_pf_src_tmr_owned(pf))
- goto reset_ts;
-
err = ice_ptp_init_phc(hw);
if (err)
goto err;
@@ -2564,7 +2564,6 @@ void ice_ptp_reset(struct ice_pf *pf)
goto err;
}
-reset_ts:
/* Restart the PHY timestamping block */
ice_ptp_reset_phy_timestamping(pf);
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
index 674a0abe3cdd..48c0d56c0568 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
@@ -311,8 +311,9 @@ enum ice_tx_tstamp_work ice_ptp_process_ts(struct ice_pf *pf);
void
ice_ptp_rx_hwtstamp(struct ice_rx_ring *rx_ring,
union ice_32b_rx_flex_desc *rx_desc, struct sk_buff *skb);
-void ice_ptp_reset(struct ice_pf *pf);
-void ice_ptp_prepare_for_reset(struct ice_pf *pf);
+void ice_ptp_reset(struct ice_pf *pf, enum ice_reset_req reset_type);
+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);
@@ -343,8 +344,15 @@ static inline bool ice_ptp_process_ts(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) { }
-static inline void ice_ptp_prepare_for_reset(struct ice_pf *pf) { }
+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)
+{
+}
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)
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 4/9] ice: rename PTP functions and fields
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
` (2 preceding siblings ...)
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 3/9] ice: pass reset type to PTP reset functions Karol Kolacinski
@ 2023-08-07 10:36 ` Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 5/9] ice: factor out ice_ptp_rebuild_owner() Karol Kolacinski
` (4 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
The tx->verify_cached flag is used to inform the Tx timestamp tracking
code whether it needs to verify the cached Tx timestamp value against
a previous captured value. This is necessary on E810 hardware which does
not have a Tx timestamp ready bitmap.
In addition, we currently rely on the fact that the
ice_get_phy_tx_tstamp_ready() function returns all 1s for E810 hardware.
Instead of introducing a brand new flag, rename and verify_cached to
has_ready_bitmap, inverting the relevant checks.
The ice_ptp_tx_cfg_intr() function sends a control queue message to
configure the PHY timestamp interrupt block. This is a very similar name
to a function which is used to configure the MAC Other Interrupt Cause
Enable register.
Rename this function to ice_ptp_cfg_phy_interrupt in order to make it
more obvious to the reader what action it performs, and distinguish it
from other similarly named functions.
The ice_ptp_configure_tx_tstamp function writes to PFINT_OICR_ENA to
configure it with the PFINT_OICR_TX_TSYN_M bit. The name of this
function is confusing because there are multiple other functions with
almost identical names.
Rename it to ice_ptp_cfg_tx_interrupt in order to make it more obvious
to the reader what action it performs.
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
---
drivers/net/ethernet/intel/ice/ice_ptp.c | 62 ++++++++++++++++--------
drivers/net/ethernet/intel/ice/ice_ptp.h | 6 ++-
2 files changed, 48 insertions(+), 20 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index 0ee971f8c2e2..0c88a2efb38c 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -281,11 +281,11 @@ static const char *ice_ptp_state_str(enum ice_ptp_state state)
}
/**
- * ice_ptp_configure_tx_tstamp - Enable or disable Tx timestamp interrupt
- * @pf: The PF pointer to search in
+ * ice_ptp_cfg_tx_interrupt - Configure Tx timestamp interrupt for the device
+ * @pf: Board private structure
* @on: bool value for whether timestamp interrupt is enabled or disabled
*/
-static void ice_ptp_configure_tx_tstamp(struct ice_pf *pf, bool on)
+static void ice_ptp_cfg_tx_interrupt(struct ice_pf *pf, bool on)
{
u32 val;
@@ -320,7 +320,7 @@ static void ice_set_tx_tstamp(struct ice_pf *pf, bool on)
}
if (pf->ptp.tx_interrupt_mode == ICE_PTP_TX_INTERRUPT_SELF)
- ice_ptp_configure_tx_tstamp(pf, on);
+ ice_ptp_cfg_tx_interrupt(pf, on);
pf->ptp.tstamp_config.tx_type = on ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
}
@@ -591,9 +591,11 @@ static void ice_ptp_process_tx_tstamp(struct ice_ptp_tx *tx)
hw = &pf->hw;
/* Read the Tx ready status first */
- err = ice_get_phy_tx_tstamp_ready(hw, tx->block, &tstamp_ready);
- if (err)
- return;
+ if (tx->has_ready_bitmap) {
+ err = ice_get_phy_tx_tstamp_ready(hw, tx->block, &tstamp_ready);
+ if (err)
+ return;
+ }
/* Drop packets if the link went down */
link_up = ptp_port->link_up;
@@ -621,7 +623,8 @@ static void ice_ptp_process_tx_tstamp(struct ice_ptp_tx *tx)
* If we do not, the hardware logic for generating a new
* interrupt can get stuck on some devices.
*/
- if (!(tstamp_ready & BIT_ULL(phy_idx))) {
+ if (tx->has_ready_bitmap &&
+ !(tstamp_ready & BIT_ULL(phy_idx))) {
if (drop_ts)
goto skip_ts_read;
@@ -641,7 +644,7 @@ static void ice_ptp_process_tx_tstamp(struct ice_ptp_tx *tx)
* from the last cached timestamp. If it is not, skip this for
* now assuming it hasn't yet been captured by hardware.
*/
- if (!drop_ts && tx->verify_cached &&
+ if (!drop_ts && !tx->has_ready_bitmap &&
raw_tstamp == tx->tstamps[idx].cached_tstamp)
continue;
@@ -651,7 +654,7 @@ static void ice_ptp_process_tx_tstamp(struct ice_ptp_tx *tx)
skip_ts_read:
spin_lock(&tx->lock);
- if (tx->verify_cached && raw_tstamp)
+ if (!tx->has_ready_bitmap && raw_tstamp)
tx->tstamps[idx].cached_tstamp = raw_tstamp;
clear_bit(idx, tx->in_use);
skb = tx->tstamps[idx].skb;
@@ -847,6 +850,22 @@ ice_ptp_mark_tx_tracker_stale(struct ice_ptp_tx *tx)
spin_unlock(&tx->lock);
}
+/**
+ * ice_ptp_flush_all_tx_tracker - Flush all timestamp trackers on this clock
+ * @pf: Board private structure
+ *
+ * Called by the clock owner to flush all the Tx timestamp trackers associated
+ * with the clock.
+ */
+static void
+ice_ptp_flush_all_tx_tracker(struct ice_pf *pf)
+{
+ struct ice_ptp_port *port;
+
+ list_for_each_entry(port, &pf->ptp.ports_owner.ports, list_member)
+ ice_ptp_flush_tx_tracker(ptp_port_to_pf(port), &port->tx);
+}
+
/**
* ice_ptp_release_tx_tracker - Release allocated memory for Tx tracker
* @pf: Board private structure
@@ -895,7 +914,7 @@ ice_ptp_init_tx_e822(struct ice_pf *pf, struct ice_ptp_tx *tx, u8 port)
tx->block = port / ICE_PORTS_PER_QUAD;
tx->offset = (port % ICE_PORTS_PER_QUAD) * INDEX_PER_PORT_E822;
tx->len = INDEX_PER_PORT_E822;
- tx->verify_cached = 0;
+ tx->has_ready_bitmap = 1;
return ice_ptp_alloc_tx_tracker(tx);
}
@@ -918,7 +937,7 @@ ice_ptp_init_tx_e810(struct ice_pf *pf, struct ice_ptp_tx *tx)
* verify new timestamps against cached copy of the last read
* timestamp.
*/
- tx->verify_cached = 1;
+ tx->has_ready_bitmap = 0;
return ice_ptp_alloc_tx_tracker(tx);
}
@@ -1338,14 +1357,14 @@ void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)
}
/**
- * ice_ptp_tx_ena_intr - Enable or disable the Tx timestamp interrupt
+ * ice_ptp_cfg_phy_interrupt - Configure PHY interrupt settings
* @pf: PF private structure
* @ena: bool value to enable or disable interrupt
* @threshold: Minimum number of packets at which intr is triggered
*
* Utility function to enable or disable Tx timestamp interrupt and threshold
*/
-static int ice_ptp_tx_ena_intr(struct ice_pf *pf, bool ena, u32 threshold)
+static int ice_ptp_cfg_phy_interrupt(struct ice_pf *pf, bool ena, u32 threshold)
{
struct ice_hw *hw = &pf->hw;
int err = 0;
@@ -2505,8 +2524,8 @@ 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;
struct timespec64 ts;
- int err, itr = 1;
u64 time_diff;
+ int err;
if (ptp->state != ICE_PTP_RESETTING) {
if (ptp->state == ICE_PTP_READY) {
@@ -2557,9 +2576,14 @@ void ice_ptp_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
/* Release the global hardware lock */
ice_ptp_unlock(hw);
+ /* Flush software tracking of any outstanding timestamps since we're
+ * about to flush the PHY timestamp block.
+ */
+ ice_ptp_flush_all_tx_tracker(pf);
+
if (!ice_is_e810(hw)) {
/* Enable quad interrupts */
- err = ice_ptp_tx_ena_intr(pf, true, itr);
+ err = ice_ptp_cfg_phy_interrupt(pf, true, 1);
if (err)
goto err;
}
@@ -2845,13 +2869,13 @@ static int ice_ptp_init_owner(struct ice_pf *pf)
/* The clock owner for this device type handles the timestamp
* interrupt for all ports.
*/
- ice_ptp_configure_tx_tstamp(pf, true);
+ ice_ptp_cfg_tx_interrupt(pf, true);
/* React on all quads interrupts for E82x */
wr32(hw, PFINT_TSYN_MSK + (0x4 * hw->pf_id), (u32)0x1f);
/* Enable quad interrupts */
- err = ice_ptp_tx_ena_intr(pf, true, itr);
+ err = ice_ptp_cfg_phy_interrupt(pf, true, itr);
if (err)
goto err_exit;
}
@@ -2923,7 +2947,7 @@ static int ice_ptp_init_port(struct ice_pf *pf, struct ice_ptp_port *ptp_port)
* neither on own quad nor on others
*/
if (!ice_ptp_pf_handles_tx_interrupt(pf)) {
- ice_ptp_configure_tx_tstamp(pf, false);
+ ice_ptp_cfg_tx_interrupt(pf, false);
wr32(hw, PFINT_TSYN_MSK + (0x4 * hw->pf_id), (u32)0x0);
}
kthread_init_delayed_work(&ptp_port->ov_work,
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
index 48c0d56c0568..30ad714a2a21 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
@@ -100,7 +100,7 @@ struct ice_perout_channel {
* the last timestamp we read for a given index. If the current timestamp
* value is the same as the cached value, we assume a new timestamp hasn't
* been captured. This avoids reporting stale timestamps to the stack. This is
- * only done if the verify_cached flag is set in ice_ptp_tx structure.
+ * only done if the has_ready_bitmap flag is not set in ice_ptp_tx structure.
*/
struct ice_tx_tstamp {
struct sk_buff *skb;
@@ -131,6 +131,9 @@ enum ice_tx_tstamp_work {
* @calibrating: if true, the PHY is calibrating the Tx offset. During this
* window, timestamps are temporarily disabled.
* @verify_cached: if true, verify new timestamp differs from last read value
+ * @has_ready_bitmap: if true, the hardware has a valid Tx timestamp ready
+ * bitmap register. If false, fall back to verifying new
+ * timestamp values against previously cached copy.
*/
struct ice_ptp_tx {
spinlock_t lock; /* lock protecting in_use bitmap */
@@ -143,6 +146,7 @@ struct ice_ptp_tx {
u8 init : 1;
u8 calibrating : 1;
u8 verify_cached : 1;
+ u8 has_ready_bitmap : 1;
};
/* Quad and port information for initializing timestamp blocks */
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 5/9] ice: factor out ice_ptp_rebuild_owner()
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
` (3 preceding siblings ...)
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 4/9] ice: rename PTP functions and fields Karol Kolacinski
@ 2023-08-07 10:36 ` Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 6/9] ice: remove ptp_tx ring parameter flag Karol Kolacinski
` (3 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
The ice_ptp_reset() function uses a goto to skip past clock owner
operations if performing a PF reset or if the device is not the clock
owner. This is a bit confusing. Factor this out into
ice_ptp_rebuild_owner() instead.
The ice_ptp_reset() function is called by ice_rebuild() to restore PTP
functionality after a device reset. Follow the convention set by the
ice_main.c file and rename this function to ice_ptp_rebuild(), in the
same way that we have ice_prepare_for_reset() and
ice_ptp_prepare_for_reset().
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
---
drivers/net/ethernet/intel/ice/ice_main.c | 2 +-
drivers/net/ethernet/intel/ice/ice_ptp.c | 60 ++++++++++++++---------
drivers/net/ethernet/intel/ice/ice_ptp.h | 6 +--
3 files changed, 41 insertions(+), 27 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 47e598e1bc4d..bb3e908593d0 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -7355,7 +7355,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, reset_type);
+ ice_ptp_rebuild(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 0c88a2efb38c..c2ced7df87ad 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -2500,6 +2500,7 @@ ice_ptp_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
if (reset_type == ICE_RESET_PFR)
return;
+ kthread_cancel_delayed_work_sync(&pf->ptp.port.ov_work);
ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
/* Disable periodic outputs */
@@ -2515,11 +2516,13 @@ ice_ptp_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
}
/**
- * ice_ptp_reset - Initialize PTP hardware clock support after reset
+ * ice_ptp_rebuild_owner - Initialize PTP clock owner after reset
* @pf: Board private structure
- * @reset_type: the reset type being performed
+ *
+ * Companion function for ice_ptp_rebuild() which handles tasks that only the
+ * PTP clock owner instance should perform.
*/
-void ice_ptp_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
+static int ice_ptp_rebuild_owner(struct ice_pf *pf)
{
struct ice_ptp *ptp = &pf->ptp;
struct ice_hw *hw = &pf->hw;
@@ -2527,34 +2530,21 @@ void ice_ptp_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
u64 time_diff;
int err;
- if (ptp->state != ICE_PTP_RESETTING) {
- if (ptp->state == ICE_PTP_READY) {
- ice_ptp_prepare_for_reset(pf, reset_type);
- } else {
- err = -EINVAL;
- dev_err(ice_pf_to_dev(pf), "PTP was not initialized\n");
- goto err;
- }
- }
-
- if (reset_type == ICE_RESET_PFR || !ice_pf_src_tmr_owned(pf))
- goto pfr;
-
err = ice_ptp_init_phc(hw);
if (err)
- goto err;
+ return err;
/* Acquire the global hardware lock */
if (!ice_ptp_lock(hw)) {
err = -EBUSY;
- goto err;
+ return err;
}
/* Write the increment time value to PHY and LAN */
err = ice_ptp_write_incval(hw, ice_base_incval(pf));
if (err) {
ice_ptp_unlock(hw);
- goto err;
+ return err;
}
/* Write the initial Time value to PHY and LAN using the cached PHC
@@ -2570,7 +2560,7 @@ void ice_ptp_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
err = ice_ptp_write_init(pf, &ts);
if (err) {
ice_ptp_unlock(hw);
- goto err;
+ return err;
}
/* Release the global hardware lock */
@@ -2585,13 +2575,37 @@ void ice_ptp_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
/* Enable quad interrupts */
err = ice_ptp_cfg_phy_interrupt(pf, true, 1);
if (err)
+ return err;
+
+ ice_ptp_restart_all_phy(pf);
+ }
+
+ return 0;
+}
+
+/**
+ * ice_ptp_rebuild - Initialize PTP hardware clock support after reset
+ * @pf: Board private structure
+ * @reset_type: the reset type being performed
+ */
+void ice_ptp_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
+{
+ struct ice_ptp *ptp = &pf->ptp;
+ int err;
+
+ if (ptp->state != ICE_PTP_RESETTING) {
+ if (ptp->state == ICE_PTP_READY) {
+ ice_ptp_prepare_for_reset(pf, reset_type);
+ } else {
+ err = -EINVAL;
+ dev_err(ice_pf_to_dev(pf), "PTP was not initialized\n");
goto err;
+ }
}
- /* Restart the PHY timestamping block */
- ice_ptp_reset_phy_timestamping(pf);
+ if (ice_pf_src_tmr_owned(pf) && reset_type != ICE_RESET_PFR)
+ ice_ptp_rebuild_owner(pf);
-pfr:
/* Init Tx structures */
if (ice_is_e810(&pf->hw)) {
err = ice_ptp_init_tx_e810(pf, &ptp->port.tx);
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
index 30ad714a2a21..210e2a1b35a5 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
@@ -315,7 +315,7 @@ enum ice_tx_tstamp_work ice_ptp_process_ts(struct ice_pf *pf);
void
ice_ptp_rx_hwtstamp(struct ice_rx_ring *rx_ring,
union ice_32b_rx_flex_desc *rx_desc, struct sk_buff *skb);
-void ice_ptp_reset(struct ice_pf *pf, enum ice_reset_req reset_type);
+void ice_ptp_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type);
void ice_ptp_prepare_for_reset(struct ice_pf *pf,
enum ice_reset_req reset_type);
void ice_ptp_init(struct ice_pf *pf);
@@ -348,8 +348,8 @@ static inline bool ice_ptp_process_ts(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_rebuild(struct ice_pf *pf,
+ enum ice_reset_req reset_type)
{
}
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 6/9] ice: remove ptp_tx ring parameter flag
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
` (4 preceding siblings ...)
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 5/9] ice: factor out ice_ptp_rebuild_owner() Karol Kolacinski
@ 2023-08-07 10:36 ` Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 7/9] ice: modify tstamp_config only during TS mode set Karol Kolacinski
` (2 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
Before performing a Tx timestamp in ice_stamp(), the driver checks
a ptp_tx ring variable to see if timestamping is enabled on that ring.
This value is set for all rings whenever userspace configures Tx
timestamping.
Ostensibly this was done to avoid wasting cycles checking other fields
when timestamping has not been enabled. However, for Tx timestamps we
already get an individual per-SKB flag indicating whether userspace
wants to request a timestamp on that packet. We do not gain much by also
having a separate flag to check for whether timestamping was enabled.
In fact, the driver currently fails to restore the field after a PF
reset. Because of this, if a PF reset occurs, timestamps will be
disabled.
Since this flag doesn't add value in the hotpath, remove it and always
provide a timestamp if the SKB flag has been set.
Testing hints:
We never noticed this before because our usual method of validating Tx
timestamps, ptp4l, will restore timestamp settings on the socket as
part of its fault recovery logic. Thus, the ptp4l program might notice
a missing timestamp, but will quickly recover. Other timestamping
applications may not be doing such fault checks, and will expect that
a PF reset restores the timestamp configuration properly.
To test this, use a standalone application such as the timestamping
utility from applications.commandline.ptp.utilities, etc.
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
drivers/net/ethernet/intel/ice/ice_ptp.c | 14 --------------
drivers/net/ethernet/intel/ice/ice_txrx.c | 3 ---
drivers/net/ethernet/intel/ice/ice_txrx.h | 1 -
3 files changed, 18 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index c2ced7df87ad..726ea2c5010b 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -305,20 +305,6 @@ static void ice_ptp_cfg_tx_interrupt(struct ice_pf *pf, bool on)
*/
static void ice_set_tx_tstamp(struct ice_pf *pf, bool on)
{
- struct ice_vsi *vsi;
- u16 i;
-
- vsi = ice_get_main_vsi(pf);
- if (!vsi)
- return;
-
- /* Set the timestamp enable flag for all the Tx rings */
- ice_for_each_txq(vsi, i) {
- if (!vsi->tx_rings[i])
- continue;
- vsi->tx_rings[i]->ptp_tx = on;
- }
-
if (pf->ptp.tx_interrupt_mode == ICE_PTP_TX_INTERRUPT_SELF)
ice_ptp_cfg_tx_interrupt(pf, on);
diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c
index 52d0a126eb61..9e97ea863068 100644
--- a/drivers/net/ethernet/intel/ice/ice_txrx.c
+++ b/drivers/net/ethernet/intel/ice/ice_txrx.c
@@ -2306,9 +2306,6 @@ ice_tstamp(struct ice_tx_ring *tx_ring, struct sk_buff *skb,
if (likely(!(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)))
return;
- if (!tx_ring->ptp_tx)
- return;
-
/* Tx timestamps cannot be sampled when doing TSO */
if (first->tx_flags & ICE_TX_FLAGS_TSO)
return;
diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.h b/drivers/net/ethernet/intel/ice/ice_txrx.h
index 166413fc33f4..daf7b9dbb143 100644
--- a/drivers/net/ethernet/intel/ice/ice_txrx.h
+++ b/drivers/net/ethernet/intel/ice/ice_txrx.h
@@ -380,7 +380,6 @@ struct ice_tx_ring {
#define ICE_TX_FLAGS_RING_VLAN_L2TAG2 BIT(2)
u8 flags;
u8 dcb_tc; /* Traffic class of ring */
- u8 ptp_tx;
} ____cacheline_internodealigned_in_smp;
static inline bool ice_ring_uses_build_skb(struct ice_rx_ring *ring)
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 7/9] ice: modify tstamp_config only during TS mode set
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
` (5 preceding siblings ...)
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 6/9] ice: remove ptp_tx ring parameter flag Karol Kolacinski
@ 2023-08-07 10:36 ` Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 8/9] ice: restore timestamp configuration after reset Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 9/9] ice: stop destroying and reinitalizing Tx tracker during reset Karol Kolacinski
8 siblings, 0 replies; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
The driver stores the current Tx and Rx timestamping configuration in
pf->ptp.tstamp_config. This structure is supposed to represent the
currently requested configuration from userspace that we've applied to
the device.
The values of this structure are modified within the low level
ice_set_tx_tstamp() and ice_set_rx_tstamp() functions. These functions
*are* called by ice_ptp_set_timestamp_mode. However, they are also
called during the driver reset and rebuild flow. Because of this, the
driver overwrites user configuration during reset, preventing itself
from being able to properly restore the configuration after a reset.
Instead, stop modifying this saved configuration state outside of
ice_ptp_set_timestamp_mode. Instead, set the values directly within this
function. This avoids losing the configuration data.
A following change will refactor the rebuild flow to properly restore
the configuration after a PF reset.
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
drivers/net/ethernet/intel/ice/ice_ptp.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index 726ea2c5010b..34a271e657d4 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -307,8 +307,6 @@ static void ice_set_tx_tstamp(struct ice_pf *pf, bool on)
{
if (pf->ptp.tx_interrupt_mode == ICE_PTP_TX_INTERRUPT_SELF)
ice_ptp_cfg_tx_interrupt(pf, on);
-
- pf->ptp.tstamp_config.tx_type = on ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
}
/**
@@ -331,9 +329,6 @@ static void ice_set_rx_tstamp(struct ice_pf *pf, bool on)
continue;
vsi->rx_rings[i]->ptp_rx = on;
}
-
- pf->ptp.tstamp_config.rx_filter = on ? HWTSTAMP_FILTER_ALL :
- HWTSTAMP_FILTER_NONE;
}
/**
@@ -2070,9 +2065,11 @@ ice_ptp_set_timestamp_mode(struct ice_pf *pf, struct hwtstamp_config *config)
switch (config->tx_type) {
case HWTSTAMP_TX_OFF:
ice_set_tx_tstamp(pf, false);
+ pf->ptp.tstamp_config.tx_type = HWTSTAMP_TX_OFF;
break;
case HWTSTAMP_TX_ON:
ice_set_tx_tstamp(pf, true);
+ pf->ptp.tstamp_config.tx_type = HWTSTAMP_TX_ON;
break;
default:
return -ERANGE;
@@ -2081,6 +2078,7 @@ ice_ptp_set_timestamp_mode(struct ice_pf *pf, struct hwtstamp_config *config)
switch (config->rx_filter) {
case HWTSTAMP_FILTER_NONE:
ice_set_rx_tstamp(pf, false);
+ pf->ptp.tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE;
break;
case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
@@ -2097,6 +2095,7 @@ ice_ptp_set_timestamp_mode(struct ice_pf *pf, struct hwtstamp_config *config)
case HWTSTAMP_FILTER_NTP_ALL:
case HWTSTAMP_FILTER_ALL:
ice_set_rx_tstamp(pf, true);
+ pf->ptp.tstamp_config.rx_filter = HWTSTAMP_FILTER_ALL;
break;
default:
return -ERANGE;
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 8/9] ice: restore timestamp configuration after reset
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
` (6 preceding siblings ...)
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 7/9] ice: modify tstamp_config only during TS mode set Karol Kolacinski
@ 2023-08-07 10:36 ` Karol Kolacinski
2023-10-27 23:50 ` Jacob Keller
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 9/9] ice: stop destroying and reinitalizing Tx tracker during reset Karol Kolacinski
8 siblings, 1 reply; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
The driver calls ice_ptp_cfg_timestamp() during
ice_ptp_prepare_for_reset() to disable timestamping while the device is
resetting. It then attempts to restore timestamp configuration at the
end of ice_rebuild(). However, it currently forcibly calls
ice_ptp_cfg_timestamp() with a value of true when the device is not E810
and is the clock owner, while calling ice_ptp_cfg_timestamp() with a
value of false for all other devices.
This incorrectly forcibly disables timestamping on all ports except the
clock owner.
This was not detected previously due to a quirk of the LinuxPTP ptp4l
application. If ptp4l detects a missing timestamp, it enters a fault
state and performs recovery logic which includes executing SIOCSHWTSTAMP
again, restoring the now accidentally cleared configuration.
Not every application does this, and for these applications, timestamps
will mysteriously stop after a PF reset, without being restored until an
application restart.
Fix this by replacing ice_ptp_cfg_timestamp() with two new functions:
1) ice_ptp_disable_timestamp_mode() which unconditionally disables the
timestamping logic in ice_ptp_prepare_for_reset() and
ice_ptp_release()
2) ice_ptp_restore_timestamp_mode() which calls
ice_ptp_restore_tx_interrupt() to restore Tx timestamping
configuration, calls ice_set_rx_tstamp() to restore Rx timestamping
configuration, and issues an immediate TSYN_TX interrupt to ensure
that timestamps which may have occurred during the device reset get
processed.
This obsoletes the ice_set_tx_tstamp() function which can now be safely
removed.
With this change, all devices should now restore Tx and Rx timestamping
functionality correctly after a PF reset without application
intervention.
Change-type: DefectResolution
HSDES-number: 22018443364
HSDES-tenant: server_platf_lan.bug
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
drivers/net/ethernet/intel/ice/ice_main.c | 10 +---
drivers/net/ethernet/intel/ice/ice_ptp.c | 72 +++++++++++++++++------
drivers/net/ethernet/intel/ice/ice_ptp.h | 4 +-
3 files changed, 59 insertions(+), 27 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index bb3e908593d0..1dde628662e7 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -7367,14 +7367,8 @@ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
goto err_vsi_rebuild;
}
- /* configure PTP timestamping after VSI rebuild */
- if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags)) {
- if (pf->ptp.tx_interrupt_mode == ICE_PTP_TX_INTERRUPT_SELF)
- ice_ptp_cfg_timestamp(pf, false);
- else if (pf->ptp.tx_interrupt_mode == ICE_PTP_TX_INTERRUPT_ALL)
- /* for E82x PHC owner always need to have interrupts */
- ice_ptp_cfg_timestamp(pf, true);
- }
+ /* Restore timestamp mode settings after VSI rebuild */
+ ice_ptp_restore_timestamp_mode(pf);
err = ice_vsi_rebuild_by_type(pf, ICE_VSI_SWITCHDEV_CTRL);
if (err) {
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index 34a271e657d4..5dc0c9a27180 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -299,14 +299,27 @@ static void ice_ptp_cfg_tx_interrupt(struct ice_pf *pf, bool on)
}
/**
- * ice_set_tx_tstamp - Enable or disable Tx timestamping
- * @pf: The PF pointer to search in
- * @on: bool value for whether timestamps are enabled or disabled
+ * ice_ptp_restore_tx_interrupt - Restore Tx timestamp interrupt after reset
+ * @pf: Board private structure
*/
-static void ice_set_tx_tstamp(struct ice_pf *pf, bool on)
+static void ice_ptp_restore_tx_interrupt(struct ice_pf *pf)
{
- if (pf->ptp.tx_interrupt_mode == ICE_PTP_TX_INTERRUPT_SELF)
- ice_ptp_cfg_tx_interrupt(pf, on);
+ bool enable;
+
+ switch (pf->ptp.tx_interrupt_mode) {
+ case ICE_PTP_TX_INTERRUPT_ALL:
+ enable = true;
+ break;
+ case ICE_PTP_TX_INTERRUPT_NONE:
+ enable = false;
+ break;
+ case ICE_PTP_TX_INTERRUPT_SELF:
+ default:
+ enable = pf->ptp.tstamp_config.tx_type == HWTSTAMP_TX_ON;
+ break;
+ }
+
+ ice_ptp_cfg_tx_interrupt(pf, enable);
}
/**
@@ -332,17 +345,41 @@ static void ice_set_rx_tstamp(struct ice_pf *pf, bool on)
}
/**
- * ice_ptp_cfg_timestamp - Configure timestamp for init/deinit
+ * ice_ptp_disable_timestamp_mode - Disable current timestamp mode
* @pf: Board private structure
- * @ena: bool value to enable or disable time stamp
*
- * This function will configure timestamping during PTP initialization
- * and deinitialization
+ * Called during preparation for reset to temporarily disable timestamping on
+ * the device. Called during remove to disable timestamping while cleaning up
+ * driver resources.
*/
-void ice_ptp_cfg_timestamp(struct ice_pf *pf, bool ena)
+static void ice_ptp_disable_timestamp_mode(struct ice_pf *pf)
{
- ice_set_tx_tstamp(pf, ena);
- ice_set_rx_tstamp(pf, ena);
+ ice_ptp_cfg_tx_interrupt(pf, false);
+ ice_set_rx_tstamp(pf, false);
+}
+
+/**
+ * ice_ptp_restore_timestamp_mode - Restore timestamp configuration
+ * @pf: Board private structure
+ *
+ * Called at the end of rebuild to restore timestamp configuration after
+ * a device reset.
+ */
+void ice_ptp_restore_timestamp_mode(struct ice_pf *pf)
+{
+ struct ice_hw *hw = &pf->hw;
+ bool enable_rx;
+
+ ice_ptp_restore_tx_interrupt(pf);
+
+ enable_rx = pf->ptp.tstamp_config.rx_filter == HWTSTAMP_FILTER_ALL;
+ ice_set_rx_tstamp(pf, enable_rx);
+
+ /* Trigger an immediate software interrupt to ensure that timestamps
+ * which occurred during reset are handled now.
+ */
+ wr32(hw, PFINT_OICR, PFINT_OICR_TSYN_TX_M);
+ ice_flush(hw);
}
/**
@@ -2064,11 +2101,9 @@ ice_ptp_set_timestamp_mode(struct ice_pf *pf, struct hwtstamp_config *config)
{
switch (config->tx_type) {
case HWTSTAMP_TX_OFF:
- ice_set_tx_tstamp(pf, false);
pf->ptp.tstamp_config.tx_type = HWTSTAMP_TX_OFF;
break;
case HWTSTAMP_TX_ON:
- ice_set_tx_tstamp(pf, true);
pf->ptp.tstamp_config.tx_type = HWTSTAMP_TX_ON;
break;
default:
@@ -2101,6 +2136,9 @@ ice_ptp_set_timestamp_mode(struct ice_pf *pf, struct hwtstamp_config *config)
return -ERANGE;
}
+ /* Make sure interrupt settings are restored */
+ ice_ptp_restore_tx_interrupt(pf);
+
return 0;
}
@@ -2478,7 +2516,7 @@ ice_ptp_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
ptp->state = ICE_PTP_RESETTING;
/* Disable timestamping for both Tx and Rx */
- ice_ptp_cfg_timestamp(pf, false);
+ ice_ptp_disable_timestamp_mode(pf);
kthread_cancel_delayed_work_sync(&ptp->work);
@@ -3136,7 +3174,7 @@ void ice_ptp_release(struct ice_pf *pf)
pf->ptp.state = ICE_PTP_UNINIT;
/* Disable timestamping for both Tx and Rx */
- ice_ptp_cfg_timestamp(pf, false);
+ ice_ptp_disable_timestamp_mode(pf);
ice_ptp_remove_auxbus_device(pf);
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
index 210e2a1b35a5..bd5826ba3576 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
@@ -306,7 +306,7 @@ int ice_ptp_clock_index(struct ice_pf *pf);
struct ice_pf;
int ice_ptp_set_ts_config(struct ice_pf *pf, struct ifreq *ifr);
int ice_ptp_get_ts_config(struct ice_pf *pf, struct ifreq *ifr);
-void ice_ptp_cfg_timestamp(struct ice_pf *pf, bool ena);
+void ice_ptp_restore_timestamp_mode(struct ice_pf *pf);
void ice_ptp_extts_event(struct ice_pf *pf);
s8 ice_ptp_request_ts(struct ice_ptp_tx *tx, struct sk_buff *skb);
@@ -332,7 +332,7 @@ static inline int ice_ptp_get_ts_config(struct ice_pf *pf, struct ifreq *ifr)
return -EOPNOTSUPP;
}
-static inline void ice_ptp_cfg_timestamp(struct ice_pf *pf, bool ena) { }
+static inline void ice_ptp_restore_timestamp_mode(struct ice_pf *pf) { }
static inline void ice_ptp_extts_event(struct ice_pf *pf) { }
static inline s8
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 9/9] ice: stop destroying and reinitalizing Tx tracker during reset
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
` (7 preceding siblings ...)
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 8/9] ice: restore timestamp configuration after reset Karol Kolacinski
@ 2023-08-07 10:36 ` Karol Kolacinski
2023-08-07 12:20 ` Przemek Kitszel
8 siblings, 1 reply; 17+ messages in thread
From: Karol Kolacinski @ 2023-08-07 10:36 UTC (permalink / raw)
To: intel-wired-lan; +Cc: Karol Kolacinski
The ice driver currently attempts to destroy and re-initialize the Tx
timestamp tracker during the reset flow. The release of the Tx tracker
only happened during CORE reset or GLOBAL reset. The ice_ptp_rebuild()
function always calls the ice_ptp_init_tx function which will allocate
a new tracker data structure, resulting in memory leaks during PF reset.
Certainly the driver should not be allocating a new tracker without
removing the old tracker data, as this results in a memory leak.
Additionally, there's no reason to remove the tracker memory during a
reset. Remove this logic from the reset and rebuild flow. Instead of
releasing the Tx tracker, flush outstanding timestamps just before we
reset the PHY timestamp block in ice_ptp_cfg_phy_interrupt().
Change-type: ImplementationChange
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
drivers/net/ethernet/intel/ice/ice_ptp.c | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
index 5dc0c9a27180..d10c43f9266b 100644
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
@@ -2629,18 +2629,6 @@ void ice_ptp_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
if (ice_pf_src_tmr_owned(pf) && reset_type != ICE_RESET_PFR)
ice_ptp_rebuild_owner(pf);
- /* Init Tx structures */
- if (ice_is_e810(&pf->hw)) {
- err = ice_ptp_init_tx_e810(pf, &ptp->port.tx);
- } else {
- kthread_init_delayed_work(&ptp->port.ov_work,
- ice_ptp_wait_for_offsets);
- err = ice_ptp_init_tx_e822(pf, &ptp->port.tx,
- ptp->port.port_num);
- }
- if (err)
- goto err;
-
ptp->state = ICE_PTP_READY;
/* Start periodic work going */
--
2.39.2
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [Intel-wired-lan] [PATCH 1/9] ice: use ice_pf_src_tmr_owned where available
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 1/9] ice: use ice_pf_src_tmr_owned where available Karol Kolacinski
@ 2023-08-07 10:59 ` Przemek Kitszel
0 siblings, 0 replies; 17+ messages in thread
From: Przemek Kitszel @ 2023-08-07 10:59 UTC (permalink / raw)
To: Karol Kolacinski, intel-wired-lan
On 8/7/23 12:36, Karol Kolacinski wrote:
> The ice_pf_src_tmr_owned() macro exists to check the function capability
> bit indicating if the current function owns the PTP hardware clock.
>
> This is slightly shorter than the more verbose access via
> hw.func_caps.ts_func_info.src_tmr_owned. Be consistent and use this
> where possible rather than open coding its equivalent.
>
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Hi Karol,
sorry for not reaching you during internal review phase ("e1000").
For future submissions, please ensure to set target tree via subject
prefix/tag, here it could be "iwl-next".
For IWL submissions, you should also CC netdev ML.
You should also CC anyone mentioned in the patch and/or last author of
given area of the code, +our maintainers Tony and Jesse.
For this particular patch - Who is the author, you or Jake?
If Jake, you should send it in a way that it is properly accounted
(here, and cover letter),
if it's yours, then what is his Signed-off-by doing here?
For any case, all patches that you send, should be decorated with your
S-o-b, as a last tag.
Przemek
> ---
> drivers/net/ethernet/intel/ice/ice_main.c | 2 +-
> drivers/net/ethernet/intel/ice/ice_ptp.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
> index a73895483e6c..1ac37a3f8de5 100644
> --- a/drivers/net/ethernet/intel/ice/ice_main.c
> +++ b/drivers/net/ethernet/intel/ice/ice_main.c
> @@ -3158,7 +3158,7 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
>
> ena_mask &= ~PFINT_OICR_TSYN_EVNT_M;
>
> - if (hw->func_caps.ts_func_info.src_tmr_owned) {
> + if (ice_pf_src_tmr_owned(pf)) {
> /* Save EVENTs from GLTSYN register */
> pf->ptp.ext_ts_irq |= gltsyn_stat &
> (GLTSYN_STAT_EVENT0_M |
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index 97b8581ae931..0669ca905c46 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -2447,7 +2447,7 @@ void ice_ptp_reset(struct ice_pf *pf)
> if (test_bit(ICE_PFR_REQ, pf->state))
> goto pfr;
>
> - if (!hw->func_caps.ts_func_info.src_tmr_owned)
> + if (!ice_pf_src_tmr_owned(pf))
> goto reset_ts;
>
> err = ice_ptp_init_phc(hw);
codewise, this patch is fine
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Intel-wired-lan] [PATCH 2/9] ice: introduce PTP state machine
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 2/9] ice: introduce PTP state machine Karol Kolacinski
@ 2023-08-07 11:12 ` Przemek Kitszel
2023-08-07 17:32 ` Jacob Keller
2023-08-17 14:04 ` Kolacinski, Karol
0 siblings, 2 replies; 17+ messages in thread
From: Przemek Kitszel @ 2023-08-07 11:12 UTC (permalink / raw)
To: Karol Kolacinski, intel-wired-lan
On 8/7/23 12:36, Karol Kolacinski wrote:
> Add PTP state machine so that the driver can correctly identify PTP
> state around resets.
> When the driver got information about ungraceful reset, PTP was not
> prepared for reset and it returned error. When this situation occurs,
> prepare PTP before rebuilding its structures.
>
> Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
> ---
> drivers/net/ethernet/intel/ice/ice.h | 1 -
> drivers/net/ethernet/intel/ice/ice_ethtool.c | 2 +-
> drivers/net/ethernet/intel/ice/ice_ptp.c | 131 +++++++++++++------
> drivers/net/ethernet/intel/ice/ice_ptp.h | 10 ++
> 4 files changed, 99 insertions(+), 45 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
> index 34be1cb1e28f..86f6f94da535 100644
> --- a/drivers/net/ethernet/intel/ice/ice.h
> +++ b/drivers/net/ethernet/intel/ice/ice.h
> @@ -490,7 +490,6 @@ enum ice_pf_flags {
> ICE_FLAG_DCB_ENA,
> ICE_FLAG_FD_ENA,
> ICE_FLAG_PTP_SUPPORTED, /* PTP is supported by NVM */
> - ICE_FLAG_PTP, /* PTP is enabled by software */
> ICE_FLAG_ADV_FEATURES,
> ICE_FLAG_TC_MQPRIO, /* support for Multi queue TC */
> ICE_FLAG_CLS_FLOWER,
> diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
> index d3cb08e66dcb..7d57ecf48da0 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
> @@ -3275,7 +3275,7 @@ ice_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
> struct ice_pf *pf = ice_netdev_to_pf(dev);
>
> /* only report timestamping if PTP is enabled */
> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
> + if (!test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
> return ethtool_op_get_ts_info(dev, info);
>
> info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index 0669ca905c46..a6ea90b9461e 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -255,6 +255,31 @@ ice_verify_pin_e810t(struct ptp_clock_info *info, unsigned int pin,
> return ice_ptp_set_sma_e810t(info, pin, func);
> }
>
> +/**
> + * ice_ptp_state_str - Convert PTP state to readable string
> + * @state: PTP state to convert
> + *
> + * Returns: the human readable string representation of the provided PTP
> + * state, used for printing error messages.
> + */
> +static const char *ice_ptp_state_str(enum ice_ptp_state state)
> +{
> + switch (state) {
> + case ICE_PTP_UNINIT:
> + return "UNINITIALIZED";
> + case ICE_PTP_INITIALIZING:
> + return "INITIALIZING";
> + case ICE_PTP_READY:
> + return "READY";
> + case ICE_PTP_RESETTING:
> + return "RESETTING";
> + case ICE_PTP_ERROR:
> + return "ERROR";
> + }
> +
> + return "UNKNOWN";
> +}
> +
> /**
> * ice_ptp_configure_tx_tstamp - Enable or disable Tx timestamp interrupt
> * @pf: The PF pointer to search in
> @@ -1285,7 +1310,7 @@ void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)
> struct ice_ptp_port *ptp_port;
> struct ice_hw *hw = &pf->hw;
>
> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
> + if (pf->ptp.state != ICE_PTP_READY)
test_bit() is atomic API, but "just reading/using variable" is rather not.
Please extend commit message to say something about why transition here
(here=whole commit) is safe.
> return;
>
> if (WARN_ON_ONCE(port >= ICE_NUM_EXTERNAL_PORTS))
> @@ -2020,7 +2045,7 @@ int ice_ptp_get_ts_config(struct ice_pf *pf, struct ifreq *ifr)
> {
> struct hwtstamp_config *config;
>
> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
> + if (pf->ptp.state != ICE_PTP_READY)
> return -EIO;
>
> config = &pf->ptp.tstamp_config;
> @@ -2087,7 +2112,7 @@ int ice_ptp_set_ts_config(struct ice_pf *pf, struct ifreq *ifr)
> struct hwtstamp_config config;
> int err;
>
> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
> + if (pf->ptp.state != ICE_PTP_READY)
> return -EAGAIN;
>
> if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
> @@ -2422,7 +2447,7 @@ static void ice_ptp_periodic_work(struct kthread_work *work)
> struct ice_pf *pf = container_of(ptp, struct ice_pf, ptp);
> int err;
>
> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
> + if (pf->ptp.state != ICE_PTP_READY)
> return;
>
> err = ice_ptp_update_cached_phctime(pf);
> @@ -2432,6 +2457,42 @@ static void ice_ptp_periodic_work(struct kthread_work *work)
> msecs_to_jiffies(err ? 10 : 500));
> }
>
> +/**
> + * ice_ptp_prepare_for_reset - Prepare PTP for reset
> + * @pf: Board private structure
> + */
> +void ice_ptp_prepare_for_reset(struct ice_pf *pf)
> +{
> + struct ice_ptp *ptp = &pf->ptp;
> + u8 src_tmr;
> +
> + if (ptp->state == ICE_PTP_RESETTING)
> + return;
> +
> + ptp->state = ICE_PTP_RESETTING;
> +
> + /* Disable timestamping for both Tx and Rx */
> + ice_ptp_cfg_timestamp(pf, false);
> +
> + kthread_cancel_delayed_work_sync(&ptp->work);
> +
> + if (test_bit(ICE_PFR_REQ, pf->state))
> + return;
> +
> + ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
> +
> + /* Disable periodic outputs */
> + ice_ptp_disable_all_clkout(pf);
> +
> + src_tmr = ice_get_ptp_src_clock_index(&pf->hw);
> +
> + /* Disable source clock */
> + wr32(&pf->hw, GLTSYN_ENA(src_tmr), (u32)~GLTSYN_ENA_TSYN_ENA_M);
> +
> + /* Acquire PHC and system timer to restore after reset */
> + ptp->reset_time = ktime_get_real_ns();
> +}
> +
> /**
> * ice_ptp_reset - Initialize PTP hardware clock support after reset
> * @pf: Board private structure
> @@ -2444,6 +2505,16 @@ void ice_ptp_reset(struct ice_pf *pf)
> int err, itr = 1;
> u64 time_diff;
>
> + if (ptp->state != ICE_PTP_RESETTING) {
> + if (ptp->state == ICE_PTP_READY) {
> + ice_ptp_prepare_for_reset(pf);
> + } else {
> + err = -EINVAL;
> + dev_err(ice_pf_to_dev(pf), "PTP was not initialized\n");
> + goto err;
> + }
> + }
> +
> if (test_bit(ICE_PFR_REQ, pf->state))
> goto pfr;
>
> @@ -2510,7 +2581,7 @@ void ice_ptp_reset(struct ice_pf *pf)
> if (err)
> goto err;
>
> - set_bit(ICE_FLAG_PTP, pf->flags);
> + ptp->state = ICE_PTP_READY;
>
> /* Start periodic work going */
> kthread_queue_delayed_work(ptp->kworker, &ptp->work, 0);
> @@ -2519,6 +2590,7 @@ void ice_ptp_reset(struct ice_pf *pf)
> return;
>
> err:
> + ptp->state = ICE_PTP_ERROR;
> dev_err(ice_pf_to_dev(pf), "PTP reset failed %d\n", err);
> }
>
> @@ -2725,39 +2797,6 @@ int ice_ptp_clock_index(struct ice_pf *pf)
> return clock ? ptp_clock_index(clock) : -1;
> }
>
> -/**
> - * ice_ptp_prepare_for_reset - Prepare PTP for reset
> - * @pf: Board private structure
> - */
> -void ice_ptp_prepare_for_reset(struct ice_pf *pf)
> -{
> - struct ice_ptp *ptp = &pf->ptp;
> - u8 src_tmr;
> -
> - clear_bit(ICE_FLAG_PTP, pf->flags);
> -
> - /* Disable timestamping for both Tx and Rx */
> - ice_ptp_cfg_timestamp(pf, false);
> -
> - kthread_cancel_delayed_work_sync(&ptp->work);
> -
> - if (test_bit(ICE_PFR_REQ, pf->state))
> - return;
> -
> - ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
> -
> - /* Disable periodic outputs */
> - ice_ptp_disable_all_clkout(pf);
> -
> - src_tmr = ice_get_ptp_src_clock_index(&pf->hw);
> -
> - /* Disable source clock */
> - wr32(&pf->hw, GLTSYN_ENA(src_tmr), (u32)~GLTSYN_ENA_TSYN_ENA_M);
> -
> - /* Acquire PHC and system timer to restore after reset */
> - ptp->reset_time = ktime_get_real_ns();
> -}
> -
> /**
> * ice_ptp_init_owner - Initialize PTP_1588_CLOCK device
> * @pf: Board private structure
> @@ -3011,6 +3050,8 @@ void ice_ptp_init(struct ice_pf *pf)
> struct ice_hw *hw = &pf->hw;
> int err;
>
> + ptp->state = ICE_PTP_INITIALIZING;
> +
> ice_ptp_init_phy_model(hw);
>
> ice_ptp_init_tx_interrupt_mode(pf);
> @@ -3032,7 +3073,6 @@ void ice_ptp_init(struct ice_pf *pf)
> /* Start the PHY timestamping block */
> ice_ptp_reset_phy_timestamping(pf);
>
> - set_bit(ICE_FLAG_PTP, pf->flags);
> err = ice_ptp_init_work(pf, ptp);
> if (err)
> goto err;
> @@ -3041,6 +3081,7 @@ void ice_ptp_init(struct ice_pf *pf)
> if (err)
> goto err;
>
> + ptp->state = ICE_PTP_READY;
> dev_info(ice_pf_to_dev(pf), "PTP init successful\n");
> return;
>
> @@ -3050,7 +3091,7 @@ void ice_ptp_init(struct ice_pf *pf)
> ptp_clock_unregister(ptp->clock);
> pf->ptp.clock = NULL;
> }
> - clear_bit(ICE_FLAG_PTP, pf->flags);
> + ptp->state = ICE_PTP_ERROR;
> dev_err(ice_pf_to_dev(pf), "PTP failed %d\n", err);
> }
>
> @@ -3063,9 +3104,15 @@ void ice_ptp_init(struct ice_pf *pf)
> */
> void ice_ptp_release(struct ice_pf *pf)
> {
> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
> + if (pf->ptp.state == ICE_PTP_UNINIT)
> return;
>
> + if (pf->ptp.state != ICE_PTP_READY)
> + dev_warn(ice_pf_to_dev(pf), "PTP state machine is %s, tearing down PTP anyways\n",
> + ice_ptp_state_str(pf->ptp.state));
> +
> + pf->ptp.state = ICE_PTP_UNINIT;
> +
> /* Disable timestamping for both Tx and Rx */
> ice_ptp_cfg_timestamp(pf, false);
>
> @@ -3073,8 +3120,6 @@ void ice_ptp_release(struct ice_pf *pf)
>
> ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx);
>
> - clear_bit(ICE_FLAG_PTP, pf->flags);
> -
> kthread_cancel_delayed_work_sync(&pf->ptp.work);
>
> ice_ptp_port_phy_stop(&pf->ptp.port);
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
> index 8f6f94392756..674a0abe3cdd 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.h
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
> @@ -201,8 +201,17 @@ struct ice_ptp_port_owner {
>
> #define GLTSYN_TGT_H_IDX_MAX 4
>
> +enum ice_ptp_state {
> + ICE_PTP_UNINIT = 0,
> + ICE_PTP_INITIALIZING,
> + ICE_PTP_READY,
> + ICE_PTP_RESETTING,
> + ICE_PTP_ERROR,
> +};
> +
> /**
> * struct ice_ptp - data used for integrating with CONFIG_PTP_1588_CLOCK
> + * @state: current state of PTP state machine
> * @tx_interrupt_mode: the TX interrupt mode for the PTP clock
> * @port: data for the PHY port initialization procedure
> * @ports_owner: data for the auxiliary driver owner
> @@ -225,6 +234,7 @@ struct ice_ptp_port_owner {
> * @late_cached_phc_updates: number of times cached PHC update is late
> */
> struct ice_ptp {
> + enum ice_ptp_state state;
> enum ice_ptp_tx_interrupt tx_interrupt_mode;
> struct ice_ptp_port port;
> struct ice_ptp_port_owner ports_owner;
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Intel-wired-lan] [PATCH 9/9] ice: stop destroying and reinitalizing Tx tracker during reset
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 9/9] ice: stop destroying and reinitalizing Tx tracker during reset Karol Kolacinski
@ 2023-08-07 12:20 ` Przemek Kitszel
0 siblings, 0 replies; 17+ messages in thread
From: Przemek Kitszel @ 2023-08-07 12:20 UTC (permalink / raw)
To: Karol Kolacinski, intel-wired-lan
On 8/7/23 12:36, Karol Kolacinski wrote:
> The ice driver currently attempts to destroy and re-initialize the Tx
> timestamp tracker during the reset flow. The release of the Tx tracker
> only happened during CORE reset or GLOBAL reset. The ice_ptp_rebuild()
> function always calls the ice_ptp_init_tx function which will allocate
> a new tracker data structure, resulting in memory leaks during PF reset.
>
> Certainly the driver should not be allocating a new tracker without
> removing the old tracker data, as this results in a memory leak.
> Additionally, there's no reason to remove the tracker memory during a
> reset. Remove this logic from the reset and rebuild flow. Instead of
> releasing the Tx tracker, flush outstanding timestamps just before we
> reset the PHY timestamp block in ice_ptp_cfg_phy_interrupt().
Looks like you are missing some part of this patch or it went into other
(perhaps 4/9, ice_ptp_flush_all_tx_tracker)
Anyway, either fix wording here or bring it back here.
>
> Change-type: ImplementationChange
Haha, sure :)
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> ---
> drivers/net/ethernet/intel/ice/ice_ptp.c | 12 ------------
> 1 file changed, 12 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index 5dc0c9a27180..d10c43f9266b 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -2629,18 +2629,6 @@ void ice_ptp_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
> if (ice_pf_src_tmr_owned(pf) && reset_type != ICE_RESET_PFR)
> ice_ptp_rebuild_owner(pf);
>
> - /* Init Tx structures */
> - if (ice_is_e810(&pf->hw)) {
> - err = ice_ptp_init_tx_e810(pf, &ptp->port.tx);
> - } else {
> - kthread_init_delayed_work(&ptp->port.ov_work,
> - ice_ptp_wait_for_offsets);
> - err = ice_ptp_init_tx_e822(pf, &ptp->port.tx,
> - ptp->port.port_num);
> - }
> - if (err)
> - goto err;
> -
> ptp->state = ICE_PTP_READY;
>
> /* Start periodic work going */
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Intel-wired-lan] [PATCH 2/9] ice: introduce PTP state machine
2023-08-07 11:12 ` Przemek Kitszel
@ 2023-08-07 17:32 ` Jacob Keller
2023-08-08 8:47 ` Przemek Kitszel
2023-08-17 14:04 ` Kolacinski, Karol
1 sibling, 1 reply; 17+ messages in thread
From: Jacob Keller @ 2023-08-07 17:32 UTC (permalink / raw)
To: intel-wired-lan
On 8/7/2023 4:12 AM, Przemek Kitszel wrote:
> On 8/7/23 12:36, Karol Kolacinski wrote:
>> Add PTP state machine so that the driver can correctly identify PTP
>> state around resets.
>> When the driver got information about ungraceful reset, PTP was not
>> prepared for reset and it returned error. When this situation occurs,
>> prepare PTP before rebuilding its structures.
>>
>> Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
>> ---
>> drivers/net/ethernet/intel/ice/ice.h | 1 -
>> drivers/net/ethernet/intel/ice/ice_ethtool.c | 2 +-
>> drivers/net/ethernet/intel/ice/ice_ptp.c | 131 +++++++++++++------
>> drivers/net/ethernet/intel/ice/ice_ptp.h | 10 ++
>> 4 files changed, 99 insertions(+), 45 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
>> index 34be1cb1e28f..86f6f94da535 100644
>> --- a/drivers/net/ethernet/intel/ice/ice.h
>> +++ b/drivers/net/ethernet/intel/ice/ice.h
>> @@ -490,7 +490,6 @@ enum ice_pf_flags {
>> ICE_FLAG_DCB_ENA,
>> ICE_FLAG_FD_ENA,
>> ICE_FLAG_PTP_SUPPORTED, /* PTP is supported by NVM */
>> - ICE_FLAG_PTP, /* PTP is enabled by software */
>> ICE_FLAG_ADV_FEATURES,
>> ICE_FLAG_TC_MQPRIO, /* support for Multi queue TC */
>> ICE_FLAG_CLS_FLOWER,
>> diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
>> index d3cb08e66dcb..7d57ecf48da0 100644
>> --- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
>> +++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
>> @@ -3275,7 +3275,7 @@ ice_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
>> struct ice_pf *pf = ice_netdev_to_pf(dev);
>>
>> /* only report timestamping if PTP is enabled */
>> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
>> + if (!test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
>> return ethtool_op_get_ts_info(dev, info);
>>
>> info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
>> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
>> index 0669ca905c46..a6ea90b9461e 100644
>> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
>> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
>> @@ -255,6 +255,31 @@ ice_verify_pin_e810t(struct ptp_clock_info *info, unsigned int pin,
>> return ice_ptp_set_sma_e810t(info, pin, func);
>> }
>>
>> +/**
>> + * ice_ptp_state_str - Convert PTP state to readable string
>> + * @state: PTP state to convert
>> + *
>> + * Returns: the human readable string representation of the provided PTP
>> + * state, used for printing error messages.
>> + */
>> +static const char *ice_ptp_state_str(enum ice_ptp_state state)
>> +{
>> + switch (state) {
>> + case ICE_PTP_UNINIT:
>> + return "UNINITIALIZED";
>> + case ICE_PTP_INITIALIZING:
>> + return "INITIALIZING";
>> + case ICE_PTP_READY:
>> + return "READY";
>> + case ICE_PTP_RESETTING:
>> + return "RESETTING";
>> + case ICE_PTP_ERROR:
>> + return "ERROR";
>> + }
>> +
>> + return "UNKNOWN";
>> +}
>> +
>> /**
>> * ice_ptp_configure_tx_tstamp - Enable or disable Tx timestamp interrupt
>> * @pf: The PF pointer to search in
>> @@ -1285,7 +1310,7 @@ void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)
>> struct ice_ptp_port *ptp_port;
>> struct ice_hw *hw = &pf->hw;
>>
>> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
>> + if (pf->ptp.state != ICE_PTP_READY)
>
> test_bit() is atomic API, but "just reading/using variable" is rather not.
> Please extend commit message to say something about why transition here
> (here=whole commit) is safe.
>
Just use of "test_bit()" doesn't really provide much more than
potentially some memory barriers. On its own, it doesn't actually
provide any synchronization mechanism. I guess this could be "READ_ONCE"
or use some barrier to make sure this doesn't re-order the read, but
otherwise its about as atomic as before. Either we see the value as
being ready or we don't. That's essentially no different than the bit flag.
Unless we were using something like "test_and_set" or "test_and_clear"
the use of atomic flags here isn't providing any actual protection or
synchronization beyond avoiding screwing up the flags variable itself.
I considered swapping to an atomic value like using atomic_set or
something but it really felt like overkill when writing it in the
out-of-tree driver. (Yes, the lack of proper synchronization primitives
in ice is rather annoying...)
In my understanding this should be no worse than before since the state
field is always either directly assigned or directly read. We're not
replacing something like "test_and_set_bit" so we aren't any worse than
before.
This could be clarified better in the commit message. Note that
originally we kept the flag and introduced the state field, then later
removed the flag. Some of this detail was lost when squashing everything
together.
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Intel-wired-lan] [PATCH 2/9] ice: introduce PTP state machine
2023-08-07 17:32 ` Jacob Keller
@ 2023-08-08 8:47 ` Przemek Kitszel
0 siblings, 0 replies; 17+ messages in thread
From: Przemek Kitszel @ 2023-08-08 8:47 UTC (permalink / raw)
To: Jacob Keller, intel-wired-lan
On 8/7/23 19:32, Jacob Keller wrote:
>
>
> On 8/7/2023 4:12 AM, Przemek Kitszel wrote:
>> On 8/7/23 12:36, Karol Kolacinski wrote:
>>> Add PTP state machine so that the driver can correctly identify PTP
>>> state around resets.
>>> When the driver got information about ungraceful reset, PTP was not
>>> prepared for reset and it returned error. When this situation occurs,
>>> prepare PTP before rebuilding its structures.
>>>
>>> Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
>>> ---
>>> drivers/net/ethernet/intel/ice/ice.h | 1 -
>>> drivers/net/ethernet/intel/ice/ice_ethtool.c | 2 +-
>>> drivers/net/ethernet/intel/ice/ice_ptp.c | 131 +++++++++++++------
>>> drivers/net/ethernet/intel/ice/ice_ptp.h | 10 ++
>>> 4 files changed, 99 insertions(+), 45 deletions(-)
>>>
>>> diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
>>> index 34be1cb1e28f..86f6f94da535 100644
>>> --- a/drivers/net/ethernet/intel/ice/ice.h
>>> +++ b/drivers/net/ethernet/intel/ice/ice.h
>>> @@ -490,7 +490,6 @@ enum ice_pf_flags {
>>> ICE_FLAG_DCB_ENA,
>>> ICE_FLAG_FD_ENA,
>>> ICE_FLAG_PTP_SUPPORTED, /* PTP is supported by NVM */
>>> - ICE_FLAG_PTP, /* PTP is enabled by software */
>>> ICE_FLAG_ADV_FEATURES,
>>> ICE_FLAG_TC_MQPRIO, /* support for Multi queue TC */
>>> ICE_FLAG_CLS_FLOWER,
>>> diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
>>> index d3cb08e66dcb..7d57ecf48da0 100644
>>> --- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
>>> +++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
>>> @@ -3275,7 +3275,7 @@ ice_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
>>> struct ice_pf *pf = ice_netdev_to_pf(dev);
>>>
>>> /* only report timestamping if PTP is enabled */
>>> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
>>> + if (!test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
>>> return ethtool_op_get_ts_info(dev, info);
>>>
>>> info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
>>> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
>>> index 0669ca905c46..a6ea90b9461e 100644
>>> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
>>> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
>>> @@ -255,6 +255,31 @@ ice_verify_pin_e810t(struct ptp_clock_info *info, unsigned int pin,
>>> return ice_ptp_set_sma_e810t(info, pin, func);
>>> }
>>>
>>> +/**
>>> + * ice_ptp_state_str - Convert PTP state to readable string
>>> + * @state: PTP state to convert
>>> + *
>>> + * Returns: the human readable string representation of the provided PTP
>>> + * state, used for printing error messages.
>>> + */
>>> +static const char *ice_ptp_state_str(enum ice_ptp_state state)
>>> +{
>>> + switch (state) {
>>> + case ICE_PTP_UNINIT:
>>> + return "UNINITIALIZED";
>>> + case ICE_PTP_INITIALIZING:
>>> + return "INITIALIZING";
>>> + case ICE_PTP_READY:
>>> + return "READY";
>>> + case ICE_PTP_RESETTING:
>>> + return "RESETTING";
>>> + case ICE_PTP_ERROR:
>>> + return "ERROR";
>>> + }
>>> +
>>> + return "UNKNOWN";
>>> +}
>>> +
>>> /**
>>> * ice_ptp_configure_tx_tstamp - Enable or disable Tx timestamp interrupt
>>> * @pf: The PF pointer to search in
>>> @@ -1285,7 +1310,7 @@ void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)
>>> struct ice_ptp_port *ptp_port;
>>> struct ice_hw *hw = &pf->hw;
>>>
>>> - if (!test_bit(ICE_FLAG_PTP, pf->flags))
>>> + if (pf->ptp.state != ICE_PTP_READY)
>>
>> test_bit() is atomic API, but "just reading/using variable" is rather not.
>> Please extend commit message to say something about why transition here
>> (here=whole commit) is safe.
>>
>
> Just use of "test_bit()" doesn't really provide much more than
> potentially some memory barriers. On its own, it doesn't actually
> provide any synchronization mechanism. I guess this could be "READ_ONCE"
> or use some barrier to make sure this doesn't re-order the read, but
> otherwise its about as atomic as before. Either we see the value as
> being ready or we don't. That's essentially no different than the bit flag.
>
> Unless we were using something like "test_and_set" or "test_and_clear"
> the use of atomic flags here isn't providing any actual protection or
> synchronization beyond avoiding screwing up the flags variable itself.
>
> I considered swapping to an atomic value like using atomic_set or
> something but it really felt like overkill when writing it in the
> out-of-tree driver. (Yes, the lack of proper synchronization primitives
> in ice is rather annoying...)
>
> In my understanding this should be no worse than before since the state
> field is always either directly assigned or directly read. We're not
> replacing something like "test_and_set_bit" so we aren't any worse than
> before.
>
> This could be clarified better in the commit message. Note that
> originally we kept the flag and introduced the state field, then later
> removed the flag. Some of this detail was lost when squashing everything
> together.
Thank you :)
As a whole this series makes things better, so it's not an issue.
Some part of the question originates in me not knowing the driver well,
what only proves the need for clarification/s everywhere ;)
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 2/9] ice: introduce PTP state machine
2023-08-07 11:12 ` Przemek Kitszel
2023-08-07 17:32 ` Jacob Keller
@ 2023-08-17 14:04 ` Kolacinski, Karol
1 sibling, 0 replies; 17+ messages in thread
From: Kolacinski, Karol @ 2023-08-17 14:04 UTC (permalink / raw)
To: Kitszel, Przemyslaw, intel-wired-lan@lists.osuosl.org
On 8/7/23 13:12, Przemyslaw Kitszel wrote:
> > /**
> > * ice_ptp_configure_tx_tstamp - Enable or disable Tx timestamp interrupt
> > * @pf: The PF pointer to search in
> > @@ -1285,7 +1310,7 @@ void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)
> > struct ice_ptp_port *ptp_port;
> > struct ice_hw *hw = &pf->hw;
> >
> > - if (!test_bit(ICE_FLAG_PTP, pf->flags))
> > + if (pf->ptp.state != ICE_PTP_READY)
>
> test_bit() is atomic API, but "just reading/using variable" is rather not.
> Please extend commit message to say something about why transition here
> (here=whole commit) is safe.
There is only one instance changing the state of PTP and this state
cannot have multiple values like pf->flags.
Thanks,
Karol
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Intel-wired-lan] [PATCH 8/9] ice: restore timestamp configuration after reset
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 8/9] ice: restore timestamp configuration after reset Karol Kolacinski
@ 2023-10-27 23:50 ` Jacob Keller
0 siblings, 0 replies; 17+ messages in thread
From: Jacob Keller @ 2023-10-27 23:50 UTC (permalink / raw)
To: Karol Kolacinski, intel-wired-lan
On 8/7/2023 3:36 AM, Karol Kolacinski wrote:
> The driver calls ice_ptp_cfg_timestamp() during
> ice_ptp_prepare_for_reset() to disable timestamping while the device is
> resetting. It then attempts to restore timestamp configuration at the
> end of ice_rebuild(). However, it currently forcibly calls
> ice_ptp_cfg_timestamp() with a value of true when the device is not E810
> and is the clock owner, while calling ice_ptp_cfg_timestamp() with a
> value of false for all other devices.
>
> This incorrectly forcibly disables timestamping on all ports except the
> clock owner.
>
> This was not detected previously due to a quirk of the LinuxPTP ptp4l
> application. If ptp4l detects a missing timestamp, it enters a fault
> state and performs recovery logic which includes executing SIOCSHWTSTAMP
> again, restoring the now accidentally cleared configuration.
>
> Not every application does this, and for these applications, timestamps
> will mysteriously stop after a PF reset, without being restored until an
> application restart.
>
> Fix this by replacing ice_ptp_cfg_timestamp() with two new functions:
>
> 1) ice_ptp_disable_timestamp_mode() which unconditionally disables the
> timestamping logic in ice_ptp_prepare_for_reset() and
> ice_ptp_release()
>
> 2) ice_ptp_restore_timestamp_mode() which calls
> ice_ptp_restore_tx_interrupt() to restore Tx timestamping
> configuration, calls ice_set_rx_tstamp() to restore Rx timestamping
> configuration, and issues an immediate TSYN_TX interrupt to ensure
> that timestamps which may have occurred during the device reset get
> processed.
>
> This obsoletes the ice_set_tx_tstamp() function which can now be safely
> removed.
>
> With this change, all devices should now restore Tx and Rx timestamping
> functionality correctly after a PF reset without application
> intervention.
>
> Change-type: DefectResolution
> HSDES-number: 22018443364
> HSDES-tenant: server_platf_lan.bug
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> ---
I'm sending a version of this patch directly to net-next along with the
related fix for PFINT_TSYN_MSK, so that may cause a conflict with this
series. I think it should be fixable by Tony or myself when we rebase
IWL, but it could lead to needing a new version of the series.
Thanks,
Jake
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2023-10-27 23:50 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-07 10:36 [Intel-wired-lan] [PATCH 0/9] ice: fix timestamping in reset process Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 1/9] ice: use ice_pf_src_tmr_owned where available Karol Kolacinski
2023-08-07 10:59 ` Przemek Kitszel
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 2/9] ice: introduce PTP state machine Karol Kolacinski
2023-08-07 11:12 ` Przemek Kitszel
2023-08-07 17:32 ` Jacob Keller
2023-08-08 8:47 ` Przemek Kitszel
2023-08-17 14:04 ` Kolacinski, Karol
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 3/9] ice: pass reset type to PTP reset functions Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 4/9] ice: rename PTP functions and fields Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 5/9] ice: factor out ice_ptp_rebuild_owner() Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 6/9] ice: remove ptp_tx ring parameter flag Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 7/9] ice: modify tstamp_config only during TS mode set Karol Kolacinski
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 8/9] ice: restore timestamp configuration after reset Karol Kolacinski
2023-10-27 23:50 ` Jacob Keller
2023-08-07 10:36 ` [Intel-wired-lan] [PATCH 9/9] ice: stop destroying and reinitalizing Tx tracker during reset Karol Kolacinski
2023-08-07 12:20 ` Przemek Kitszel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox