
Intel listed total 28 commits that need us to back port. There are 9 commits that are already included in our code base. The commit "ice: Add support for E825-C TS PLL handling" will not be back ported since we're not dealing with E825 for 24.09. So we need back port 18 commits. These commits were introduced in linux-6.9.y and linux-6.10.y. To back port these 18 commits successfully, we totally back ported 37 upstream commits. 1) The patches 1-15 are cherry picked to fix the conflicts for patch 16 ("ice: introduce PTP state machine") and patch 36 "ice: Introduce ice_ptp_hw struct". Also will be helpful for the subsequent commits back porting. 2) The patches 24-27 are cherry picked to fix the conflicts for patch 28 ("ice: Fix debugfs with devlink reload") 3) The minor adjust was done for the patches 17, 21, 23 and 33 to fit with the context change. Verification: - installs from iso succeed on servers with ice(Intel Ethernet Controller E810-XXVDA4T Westport Channel) and i40e hw(Intel Ethernet Controller X710) for rt and std. - interfaces are up and pass packets for rt and std. - create vfs, ensure that they are picked up by the new iavf driver and that the interface can come up and pass packets on rt and std system. - Check dmesg to see DDP package is loaded successfully and the version is 1.3.36.0 for rt and std. Story: 2011056 Task: 50950 Change-Id: I9aef0378ea01451684341093a167eaead3edc458 Signed-off-by: Jiping Ma <jiping.ma2@windriver.com>
317 lines
9.5 KiB
Diff
317 lines
9.5 KiB
Diff
From 5c6115d27a377927d6392b3bfbe9739188c8153c Mon Sep 17 00:00:00 2001
|
|
From: Jacob Keller <jacob.e.keller@intel.com>
|
|
Date: Thu, 25 Jan 2024 13:57:49 -0800
|
|
Subject: [PATCH 16/36] ice: introduce PTP state machine
|
|
|
|
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: Jacob Keller <jacob.e.keller@intel.com>
|
|
Co-developed-by: Karol Kolacinski <karol.kolacinski@intel.com>
|
|
Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com>
|
|
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
|
|
Reviewed-by: Simon Horman <horms@kernel.org>
|
|
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
|
|
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
|
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|
(cherry picked from commit 8293e4cb2ff54b1ec4f7206dcb74c908f62a3fb8)
|
|
Signed-off-by: Jiping Ma <jiping.ma2@windriver.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 | 110 +++++++++++--------
|
|
drivers/net/ethernet/intel/ice/ice_ptp.h | 10 ++
|
|
4 files changed, 74 insertions(+), 49 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
|
|
index ee42a504c2f4..3278d032a2bd 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice.h
|
|
+++ b/drivers/net/ethernet/intel/ice/ice.h
|
|
@@ -492,7 +492,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 057453d589d5..9e949c493c38 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
|
|
@@ -3276,7 +3276,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 (pf->ptp.state != ICE_PTP_READY)
|
|
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 8fc6905b0f79..36c81c5ee83b 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
|
|
@@ -1430,7 +1430,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))
|
|
@@ -2148,7 +2148,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;
|
|
@@ -2218,7 +2218,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)))
|
|
@@ -2606,7 +2606,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);
|
|
@@ -2618,6 +2618,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_READY)
|
|
+ return;
|
|
+
|
|
+ ptp->state = ICE_PTP_RESETTING;
|
|
+
|
|
+ /* Disable timestamping for both Tx and Rx */
|
|
+ ice_ptp_disable_timestamp_mode(pf);
|
|
+
|
|
+ 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
|
|
@@ -2630,6 +2666,14 @@ void ice_ptp_reset(struct ice_pf *pf)
|
|
int err, itr = 1;
|
|
u64 time_diff;
|
|
|
|
+ if (ptp->state == ICE_PTP_READY) {
|
|
+ ice_ptp_prepare_for_reset(pf);
|
|
+ } else if (ptp->state != ICE_PTP_RESETTING) {
|
|
+ err = -EINVAL;
|
|
+ dev_err(ice_pf_to_dev(pf), "PTP was not initialized\n");
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
if (test_bit(ICE_PFR_REQ, pf->state) ||
|
|
!ice_pf_src_tmr_owned(pf))
|
|
goto pfr;
|
|
@@ -2690,7 +2734,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;
|
|
|
|
/* Restart the PHY timestamping block */
|
|
if (!test_bit(ICE_PFR_REQ, pf->state) &&
|
|
@@ -2704,6 +2748,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);
|
|
}
|
|
|
|
@@ -2910,39 +2955,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_disable_timestamp_mode(pf);
|
|
-
|
|
- 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
|
|
@@ -3181,6 +3193,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);
|
|
@@ -3205,12 +3219,13 @@ void ice_ptp_init(struct ice_pf *pf)
|
|
/* Configure initial Tx interrupt settings */
|
|
ice_ptp_cfg_tx_interrupt(pf);
|
|
|
|
- set_bit(ICE_FLAG_PTP, pf->flags);
|
|
- err = ice_ptp_init_work(pf, ptp);
|
|
+ err = ice_ptp_create_auxbus_device(pf);
|
|
if (err)
|
|
goto err;
|
|
|
|
- err = ice_ptp_create_auxbus_device(pf);
|
|
+ ptp->state = ICE_PTP_READY;
|
|
+
|
|
+ err = ice_ptp_init_work(pf, ptp);
|
|
if (err)
|
|
goto err;
|
|
|
|
@@ -3223,7 +3238,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);
|
|
}
|
|
|
|
@@ -3236,9 +3251,11 @@ 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_READY)
|
|
return;
|
|
|
|
+ pf->ptp.state = ICE_PTP_UNINIT;
|
|
+
|
|
/* Disable timestamping for both Tx and Rx */
|
|
ice_ptp_disable_timestamp_mode(pf);
|
|
|
|
@@ -3246,8 +3263,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);
|
|
@@ -3257,6 +3272,9 @@ void ice_ptp_release(struct ice_pf *pf)
|
|
pf->ptp.kworker = NULL;
|
|
}
|
|
|
|
+ if (ice_pf_src_tmr_owned(pf))
|
|
+ ice_ptp_unregister_auxbus_driver(pf);
|
|
+
|
|
if (!pf->ptp.clock)
|
|
return;
|
|
|
|
@@ -3266,7 +3284,5 @@ void ice_ptp_release(struct ice_pf *pf)
|
|
ptp_clock_unregister(pf->ptp.clock);
|
|
pf->ptp.clock = NULL;
|
|
|
|
- ice_ptp_unregister_auxbus_driver(pf);
|
|
-
|
|
dev_info(ice_pf_to_dev(pf), "Removed PTP clock\n");
|
|
}
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
|
|
index 130e6d2ae9a5..e3cc69692405 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
|
|
@@ -203,8 +203,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
|
|
@@ -227,6 +236,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.43.0
|
|
|