FAILED: patch "[PATCH] net: mscc: ocelot: deny TX timestamping of non-PTP packets" failed to apply to 5.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From fba01283d85a09e0e2ef552c6e764b903111d90a Mon Sep 17 00:00:00 2001
From: Vladimir Oltean <[email protected]>
Date: Tue, 12 Oct 2021 14:40:38 +0300
Subject: [PATCH] net: mscc: ocelot: deny TX timestamping of non-PTP packets
It appears that Ocelot switches cannot timestamp non-PTP frames, I tested this using the isochron program at:
https://github.com/vladimiroltean/tsn-scripts
with the result that the driver increments the ocelot_port->ts_id counter as expected, puts it in the REW_OP, but the hardware seems to not timestamp these packets at all, since no IRQ is emitted.
Therefore check whether we are sending PTP frames, and refuse to populate REW_OP otherwise.
drivers/net/ethernet/mscc/ocelot.c +12 -7
@@ -618,16 +618,12 @@ u32 ocelot_ptp_rew_op(struct sk_buff *skb) }EXPORT_SYMBOL (ocelot_ptp_rew_op); -static bool ocelot_ptp_is_onestep_sync (struct sk_buff *skb) +static bool ocelot_ptp_is_onestep_sync (struct sk_buff *skb, +unsigned int ptp_class) {struct ptp_header *hdr; -unsigned int ptp_class;u8 msgtype, twostep; - ptp_class =ptp_classify_raw (skb); -if (ptp_class ==PTP_CLASS_NONE ) -return false; - hdr =ptp_parse_header (skb, ptp_class);if (!hdr)return false;
@@ -647,11 +643,20 @@ int ocelot_port_txtstamp_request(struct ocelot *ocelot, int port, {struct ocelot_port *ocelot_port = ocelot->ports[port];u8 ptp_cmd = ocelot_port->ptp_cmd; +unsigned int ptp_class;int err; +/* Don't do anything if PTP timestamping not enabled */ +if (!ptp_cmd) +return 0 ; + + ptp_class =ptp_classify_raw (skb); +if (ptp_class ==PTP_CLASS_NONE ) +return -EINVAL ; +/* Store ptp_cmd in OCELOT_SKB_CB(skb)->ptp_cmd */ if (ptp_cmd ==IFH_REW_OP_ORIGIN_PTP ) { -if (ocelot_ptp_is_onestep_sync (skb)) { +if (ocelot_ptp_is_onestep_sync (skb, ptp_class)) {OCELOT_SKB_CB (skb)->ptp_cmd = ptp_cmd;return 0 ; }