Skip to content

Commit c57fe00

Browse files
vladimirolteankuba-moo
authored andcommitted
net: mscc: ocelot: make use of all 63 PTP timestamp identifiers
At present, there is a problem when user space bombards a port with PTP event frames which have TX timestamping requests (or when a tc-taprio offload is installed on a port, which delays the TX timestamps by a significant amount of time). The driver will happily roll over the 2-bit timestamp ID and this will cause incorrect matches between an skb and the TX timestamp collected from the FIFO. The Ocelot switches have a 6-bit PTP timestamp identifier, and the value 63 is reserved, so that leaves identifiers 0-62 to be used. The timestamp identifiers are selected by the REW_OP packet field, and are actually shared between CPU-injected frames and frames which match a VCAP IS2 rule that modifies the REW_OP. The hardware supports partitioning between the two uses of the REW_OP field through the PTP_ID_LOW and PTP_ID_HIGH registers, and by default reserves the PTP IDs 0-3 for CPU-injected traffic and the rest for VCAP IS2. The driver does not use VCAP IS2 to set REW_OP for 2-step timestamping, and it also writes 0xffffffff to both PTP_ID_HIGH and PTP_ID_LOW in ocelot_init_timestamp() which makes all timestamp identifiers available to CPU injection. Therefore, we can make use of all 63 timestamp identifiers, which should allow more timestampable packets to be in flight on each port. This is only part of the solution, more issues will be addressed in future changes. Fixes: 4e3b046 ("net: mscc: PTP Hardware Clock (PHC) support") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 3af760e commit c57fe00

File tree

2 files changed

+5
-1
lines changed

2 files changed

+5
-1
lines changed

drivers/net/ethernet/mscc/ocelot.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,9 @@ static void ocelot_port_add_txtstamp_skb(struct ocelot *ocelot, int port,
579579
skb_shinfo(clone)->tx_flags |= SKBTX_IN_PROGRESS;
580580
/* Store timestamp ID in OCELOT_SKB_CB(clone)->ts_id */
581581
OCELOT_SKB_CB(clone)->ts_id = ocelot_port->ts_id;
582-
ocelot_port->ts_id = (ocelot_port->ts_id + 1) % 4;
582+
ocelot_port->ts_id++;
583+
if (ocelot_port->ts_id == OCELOT_MAX_PTP_ID)
584+
ocelot_port->ts_id = 0;
583585
skb_queue_tail(&ocelot_port->tx_skbs, clone);
584586

585587
spin_unlock(&ocelot_port->ts_id_lock);

include/soc/mscc/ocelot_ptp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#include <linux/ptp_clock_kernel.h>
1414
#include <soc/mscc/ocelot.h>
1515

16+
#define OCELOT_MAX_PTP_ID 63
17+
1618
#define PTP_PIN_CFG_RSZ 0x20
1719
#define PTP_PIN_TOD_SEC_MSB_RSZ PTP_PIN_CFG_RSZ
1820
#define PTP_PIN_TOD_SEC_LSB_RSZ PTP_PIN_CFG_RSZ

0 commit comments

Comments
 (0)