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

Arun Ramadoss
2022-12-09T07:28:14Z

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>
---
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 | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/drivers/net/dsa/microchip/ksz_ptp.c b/drivers/net/dsa/microchip/ksz_ptp.c
index 546211ae46a3..ccb635585721 100644
--- a/drivers/net/dsa/microchip/ksz_ptp.c
+++ b/drivers/net/dsa/microchip/ksz_ptp.c
@@ -331,6 +331,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) |
@@ -374,6 +377,15 @@ static int ksz_set_hwtstamp_config(struct ksz_device *dev,
prt->ptpmsg_irq[KSZ_PDRES_MSG].ts_en = 0;
prt->hwts_tx_en = true;
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;
+ break;
default:
return -ERANGE;
}
@@ -460,14 +472,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;
@@ -516,6 +534,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:
@@ -532,7 +554,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;
}

--
2.36.1