net: stmmac: fix ptp timestamping on Rx on gmac4
authorIlias Apalodimas <ilias.apalodimas@linaro.org>
Tue, 5 Feb 2019 12:15:20 +0000 (14:15 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 7 Feb 2019 01:28:15 +0000 (17:28 -0800)
The current driver only enables Pdelay_Req and Pdelay_Resp when
HWTSTAMP_FILTER_PTP_V2_EVENT, HWTSTAMP_FILTER_PTP_V1_L4_EVENT or
HWTSTAMP_FILTER_PTP_V2_L4_EVENT is requested. This results in ptp sync on
slave mode to report 'received SYNC without timestamp' when using ptp4l.

Although the hardware can support Sync, Pdelay_Req and Pdelay_resp by
setting bit14 annd bits 17/16 to 01 this leaves Delay_Req timestamps out.

Fix this by enabling all event and general messages timestamps.
This includes SYNC, Follow_Up, Delay_Req, Delay_Resp, Pdelay_Req,
Pdelay_Resp and Pdelay_Resp_Follow_Up messages.

Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Acked-by: Jose Abreu <joabreu@synopsys.com>
Tested-by: Alexandre TORGUE <alexandre.torgue@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h

index 517555bcfa449273cbbeb78c134a6b28b5f8b949..effff171d2505b0a8be89837a341c4d24c80820f 100644 (file)
@@ -597,12 +597,13 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
                case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
                        /* PTP v1, UDP, any kind of event packet */
                        config.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
-                       /* take time stamp for all event messages */
-                       if (xmac)
-                               snap_type_sel = PTP_GMAC4_TCR_SNAPTYPSEL_1;
-                       else
-                               snap_type_sel = PTP_TCR_SNAPTYPSEL_1;
-
+                       /* 'xmac' hardware can support Sync, Pdelay_Req and
+                        * Pdelay_resp by setting bit14 and bits17/16 to 01
+                        * This leaves Delay_Req timestamps out.
+                        * Enable all events *and* general purpose message
+                        * timestamping
+                        */
+                       snap_type_sel = PTP_TCR_SNAPTYPSEL_1;
                        ptp_over_ipv4_udp = PTP_TCR_TSIPV4ENA;
                        ptp_over_ipv6_udp = PTP_TCR_TSIPV6ENA;
                        break;
@@ -633,10 +634,7 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
                        config.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
                        ptp_v2 = PTP_TCR_TSVER2ENA;
                        /* take time stamp for all event messages */
-                       if (xmac)
-                               snap_type_sel = PTP_GMAC4_TCR_SNAPTYPSEL_1;
-                       else
-                               snap_type_sel = PTP_TCR_SNAPTYPSEL_1;
+                       snap_type_sel = PTP_TCR_SNAPTYPSEL_1;
 
                        ptp_over_ipv4_udp = PTP_TCR_TSIPV4ENA;
                        ptp_over_ipv6_udp = PTP_TCR_TSIPV6ENA;
@@ -669,12 +667,7 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
                        /* PTP v2/802.AS1 any layer, any kind of event packet */
                        config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
                        ptp_v2 = PTP_TCR_TSVER2ENA;
-                       /* take time stamp for all event messages */
-                       if (xmac)
-                               snap_type_sel = PTP_GMAC4_TCR_SNAPTYPSEL_1;
-                       else
-                               snap_type_sel = PTP_TCR_SNAPTYPSEL_1;
-
+                       snap_type_sel = PTP_TCR_SNAPTYPSEL_1;
                        ptp_over_ipv4_udp = PTP_TCR_TSIPV4ENA;
                        ptp_over_ipv6_udp = PTP_TCR_TSIPV6ENA;
                        ptp_over_ethernet = PTP_TCR_TSIPENA;
index ecccf895fd7e44f3f8f1cd544e861e919e9b952b..e852821289cfcc0bcc91c6bf8ef7ff1eced3e47a 100644 (file)
 #define        PTP_TCR_TSEVNTENA       BIT(14)
 /* Enable Snapshot for Messages Relevant to Master */
 #define        PTP_TCR_TSMSTRENA       BIT(15)
-/* Select PTP packets for Taking Snapshots */
+/* Select PTP packets for Taking Snapshots
+ * On gmac4 specifically:
+ * Enable SYNC, Pdelay_Req, Pdelay_Resp when TSEVNTENA is enabled.
+ * or
+ * Enable  SYNC, Follow_Up, Delay_Req, Delay_Resp, Pdelay_Req, Pdelay_Resp,
+ * Pdelay_Resp_Follow_Up if TSEVNTENA is disabled
+ */
 #define        PTP_TCR_SNAPTYPSEL_1    BIT(16)
-#define        PTP_GMAC4_TCR_SNAPTYPSEL_1      GENMASK(17, 16)
 /* Enable MAC address for PTP Frame Filtering */
 #define        PTP_TCR_TSENMACADDR     BIT(18)