Skip to content

Commit 2edcfcb

Browse files
vladimirolteanPaolo Abeni
authored andcommitted
net: dsa: felix: don't drop PTP frames with tag_8021q when RX timestamping is disabled
The driver implements a workaround for the fact that it doesn't have an IRQ source to tell it whether PTP frames are available through the extraction registers, for those frames to be processed and passed towards the network stack. That workaround is to configure the switch, through felix_hwtstamp_set() -> felix_update_trapping_destinations(), to create two copies of PTP packets: one sent over Ethernet to the DSA master, and one to be consumed through the aforementioned CPU extraction queue registers. The reason why we want PTP packets to be consumed through the CPU extraction registers in the first place is because we want to see their hardware RX timestamp. With tag_8021q, that is only visible that way, and it isn't visible with the copy of the packet that's transmitted over Ethernet. The problem with the workaround implementation is that it drops the packet received over Ethernet, in expectation of its copy being present in the CPU extraction registers. However, if felix_hwtstamp_set() hasn't run (aka PTP RX timestamping is disabled), the driver will drop the original PTP frame and there will be no copy of it in the CPU extraction registers. So, the network stack will simply not see any PTP frame. Look at the port's trapping configuration to see whether the driver has previously enabled the CPU extraction registers. If it hasn't, just don't RX timestamp the frame and let it be passed up the stack by DSA, which is perfectly fine. Fixes: 0a6f17c ("net: dsa: tag_ocelot_8021q: add support for PTP timestamping") Signed-off-by: Vladimir Oltean <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 45d0fcb commit 2edcfcb

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

drivers/net/dsa/ocelot/felix.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1725,6 +1725,18 @@ static bool felix_rxtstamp(struct dsa_switch *ds, int port,
17251725
u32 tstamp_hi;
17261726
u64 tstamp;
17271727

1728+
switch (type & PTP_CLASS_PMASK) {
1729+
case PTP_CLASS_L2:
1730+
if (!(ocelot->ports[port]->trap_proto & OCELOT_PROTO_PTP_L2))
1731+
return false;
1732+
break;
1733+
case PTP_CLASS_IPV4:
1734+
case PTP_CLASS_IPV6:
1735+
if (!(ocelot->ports[port]->trap_proto & OCELOT_PROTO_PTP_L4))
1736+
return false;
1737+
break;
1738+
}
1739+
17281740
/* If the "no XTR IRQ" workaround is in use, tell DSA to defer this skb
17291741
* for RX timestamping. Then free it, and poll for its copy through
17301742
* MMIO in the CPU port module, and inject that into the stack from

0 commit comments

Comments
 (0)