[net-next,v6,12/13] net: dsa: microchip: ptp: lan937x: add 2 step timestamping

Message ID 20230102050459.31023-13-arun.ramadoss@microchip.com
State New
Headers
Series net: dsa: microchip: add PTP support for KSZ9563/KSZ8563 and LAN937x |

Commit Message

Arun Ramadoss Jan. 2, 2023, 5:04 a.m. UTC
  LAN937x series of switches support 2 step timestamping mechanism. There
are timestamp correction calculation performed in ksz_rcv_timestamp and
ksz_xmit_timestamp which are applicable only for p2p1step. To check
whether the 2 step is enabled or not in tag_ksz.c introduced the helper
function in taggger_data to query it from ksz_ptp.c. Based on whether 2
step is enabled or not, timestamp calculation are performed.

Signed-off-by: Arun Ramadoss <arun.ramadoss@microchip.com>
---
v3 -> v4
- P2P_1step bit is set which is required for P2P. It is missed during
patch v3 regression.

v2 -> v3
- Reverted setting PTP_1Step bit as we are setting 802_1AS bit

v1 -> v2
- declard is_ptp_twostep as macro NULL for ptp disabled case
- Moved the patch in series to have continuity for lan937x updates 9/11
  to 12/13
- enable PTP_1STEP bit based on tx timestamping

Patch v1
- Patch is new.
---
 drivers/net/dsa/microchip/ksz_ptp.c | 37 ++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)
  

Comments

Vladimir Oltean Jan. 3, 2023, 5:47 p.m. UTC | #1
On Mon, Jan 02, 2023 at 10:34:58AM +0530, Arun Ramadoss wrote:
> ---
>  drivers/net/dsa/microchip/ksz_ptp.c | 37 ++++++++++++++++++++++++++++-
>  1 file changed, 36 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/dsa/microchip/ksz_ptp.c b/drivers/net/dsa/microchip/ksz_ptp.c
> index 2d52a3d4771e..c2d156002ee5 100644
> --- a/drivers/net/dsa/microchip/ksz_ptp.c
> +++ b/drivers/net/dsa/microchip/ksz_ptp.c
> @@ -283,6 +283,9 @@ int ksz_get_ts_info(struct dsa_switch *ds, int port, struct ethtool_ts_info *ts)
>  
>  	ts->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ONESTEP_P2P);
>  
> +	if (is_lan937x(dev))
> +		ts->tx_types |= BIT(HWTSTAMP_TX_ON);
> +
>  	ts->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
>  			 BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
>  			 BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
> @@ -310,6 +313,8 @@ static int ksz_set_hwtstamp_config(struct ksz_device *dev,
>  				   struct ksz_port *prt,
>  				   struct hwtstamp_config *config)
>  {
> +	int ret;
> +
>  	if (config->flags)
>  		return -EINVAL;
>  
> @@ -325,6 +330,25 @@ static int ksz_set_hwtstamp_config(struct ksz_device *dev,
>  		prt->ptpmsg_irq[KSZ_XDREQ_MSG].ts_en = 1;
>  		prt->ptpmsg_irq[KSZ_PDRES_MSG].ts_en = 0;
>  		prt->hwts_tx_en = true;
> +
> +		ret = ksz_rmw16(dev, REG_PTP_MSG_CONF1, PTP_1STEP, PTP_1STEP);
> +		if (ret)
> +			return ret;
> +
> +		break;
> +	case HWTSTAMP_TX_ON:
> +		if (!is_lan937x(dev))
> +			return -ERANGE;
> +
> +		prt->ptpmsg_irq[KSZ_SYNC_MSG].ts_en  = 1;
> +		prt->ptpmsg_irq[KSZ_XDREQ_MSG].ts_en = 1;
> +		prt->ptpmsg_irq[KSZ_PDRES_MSG].ts_en = 1;

s/1/true/ please

> +		prt->hwts_tx_en = true;
> +
> +		ret = ksz_rmw16(dev, REG_PTP_MSG_CONF1, PTP_1STEP, 0);
> +		if (ret)
> +			return ret;
> +
>  		break;
>  	default:
>  		return -ERANGE;
  

Patch

diff --git a/drivers/net/dsa/microchip/ksz_ptp.c b/drivers/net/dsa/microchip/ksz_ptp.c
index 2d52a3d4771e..c2d156002ee5 100644
--- a/drivers/net/dsa/microchip/ksz_ptp.c
+++ b/drivers/net/dsa/microchip/ksz_ptp.c
@@ -283,6 +283,9 @@  int ksz_get_ts_info(struct dsa_switch *ds, int port, struct ethtool_ts_info *ts)
 
 	ts->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ONESTEP_P2P);
 
+	if (is_lan937x(dev))
+		ts->tx_types |= BIT(HWTSTAMP_TX_ON);
+
 	ts->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
 			 BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
 			 BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
@@ -310,6 +313,8 @@  static int ksz_set_hwtstamp_config(struct ksz_device *dev,
 				   struct ksz_port *prt,
 				   struct hwtstamp_config *config)
 {
+	int ret;
+
 	if (config->flags)
 		return -EINVAL;
 
@@ -325,6 +330,25 @@  static int ksz_set_hwtstamp_config(struct ksz_device *dev,
 		prt->ptpmsg_irq[KSZ_XDREQ_MSG].ts_en = 1;
 		prt->ptpmsg_irq[KSZ_PDRES_MSG].ts_en = 0;
 		prt->hwts_tx_en = true;
+
+		ret = ksz_rmw16(dev, REG_PTP_MSG_CONF1, PTP_1STEP, PTP_1STEP);
+		if (ret)
+			return ret;
+
+		break;
+	case HWTSTAMP_TX_ON:
+		if (!is_lan937x(dev))
+			return -ERANGE;
+
+		prt->ptpmsg_irq[KSZ_SYNC_MSG].ts_en  = 1;
+		prt->ptpmsg_irq[KSZ_XDREQ_MSG].ts_en = 1;
+		prt->ptpmsg_irq[KSZ_PDRES_MSG].ts_en = 1;
+		prt->hwts_tx_en = true;
+
+		ret = ksz_rmw16(dev, REG_PTP_MSG_CONF1, PTP_1STEP, 0);
+		if (ret)
+			return ret;
+
 		break;
 	default:
 		return -ERANGE;
@@ -412,14 +436,20 @@  bool ksz_port_rxtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb,
 	struct skb_shared_hwtstamps *hwtstamps = skb_hwtstamps(skb);
 	struct ksz_device *dev = ds->priv;
 	struct ptp_header *ptp_hdr;
+	struct ksz_port *prt;
 	u8 ptp_msg_type;
 	ktime_t tstamp;
 	s64 correction;
 
+	prt = &dev->ports[port];
+
 	tstamp = KSZ_SKB_CB(skb)->tstamp;
 	memset(hwtstamps, 0, sizeof(*hwtstamps));
 	hwtstamps->hwtstamp = ksz_tstamp_reconstruct(dev, tstamp);
 
+	if (prt->tstamp_config.tx_type != HWTSTAMP_TX_ONESTEP_P2P)
+		goto out;
+
 	ptp_hdr = ptp_parse_header(skb, type);
 	if (!ptp_hdr)
 		goto out;
@@ -468,6 +498,10 @@  void ksz_port_txtstamp(struct dsa_switch *ds, int port,
 	ptp_msg_type = ptp_get_msgtype(hdr, type);
 
 	switch (ptp_msg_type) {
+	case PTP_MSGTYPE_SYNC:
+		if (prt->tstamp_config.tx_type == HWTSTAMP_TX_ONESTEP_P2P)
+			return;
+		 fallthrough;
 	case PTP_MSGTYPE_PDELAY_REQ:
 		 fallthrough;
 	case PTP_MSGTYPE_PDELAY_RESP:
@@ -484,7 +518,8 @@  void ksz_port_txtstamp(struct dsa_switch *ds, int port,
 	/* caching the value to be used in tag_ksz.c */
 	KSZ_SKB_CB(skb)->clone = clone;
 	KSZ_SKB_CB(clone)->ptp_type = type;
-	if (ptp_msg_type == PTP_MSGTYPE_PDELAY_RESP)
+	if (ptp_msg_type == PTP_MSGTYPE_PDELAY_RESP &&
+	    prt->tstamp_config.tx_type == HWTSTAMP_TX_ONESTEP_P2P)
 		KSZ_SKB_CB(clone)->update_correction = true;
 }