]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: ethernet: ti: am65-cpsw-nuss: Fix rx_filter value for PTP support
authorChintan Vankar <c-vankar@ti.com>
Tue, 10 Mar 2026 16:09:40 +0000 (21:39 +0530)
committerJakub Kicinski <kuba@kernel.org>
Thu, 12 Mar 2026 03:28:37 +0000 (20:28 -0700)
The "rx_filter" member of "hwtstamp_config" structure is an enum field and
does not support bitwise OR combination of multiple filter values. It
causes error while linuxptp application tries to match rx filter version.
Fix this by storing the requested filter type in a new port field.

Fixes: 97248adb5a3b ("net: ti: am65-cpsw: Update hw timestamping filter for PTPv1 RX packets")
Signed-off-by: Chintan Vankar <c-vankar@ti.com>
Link: https://patch.msgid.link/20260310160940.109822-1-c-vankar@ti.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ti/am65-cpsw-nuss.c
drivers/net/ethernet/ti/am65-cpsw-nuss.h

index 9679180504330fc59617da84119bed1332c7cb58..265ce5479915f86003963289358eec705fc6dd07 100644 (file)
@@ -1351,7 +1351,7 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
        ndev_priv = netdev_priv(ndev);
        am65_cpsw_nuss_set_offload_fwd_mark(skb, ndev_priv->offload_fwd_mark);
        skb_put(skb, pkt_len);
-       if (port->rx_ts_enabled)
+       if (port->rx_ts_filter)
                am65_cpts_rx_timestamp(common->cpts, skb);
        skb_mark_for_recycle(skb);
        skb->protocol = eth_type_trans(skb, ndev);
@@ -1811,11 +1811,14 @@ static int am65_cpsw_nuss_hwtstamp_set(struct net_device *ndev,
 
        switch (cfg->rx_filter) {
        case HWTSTAMP_FILTER_NONE:
-               port->rx_ts_enabled = false;
+               port->rx_ts_filter = HWTSTAMP_FILTER_NONE;
                break;
        case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
        case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
        case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
+               port->rx_ts_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
+               cfg->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
+               break;
        case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
        case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
        case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
@@ -1825,8 +1828,8 @@ static int am65_cpsw_nuss_hwtstamp_set(struct net_device *ndev,
        case HWTSTAMP_FILTER_PTP_V2_EVENT:
        case HWTSTAMP_FILTER_PTP_V2_SYNC:
        case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
-               port->rx_ts_enabled = true;
-               cfg->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT | HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
+               port->rx_ts_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
+               cfg->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
                break;
        case HWTSTAMP_FILTER_ALL:
        case HWTSTAMP_FILTER_SOME:
@@ -1863,7 +1866,7 @@ static int am65_cpsw_nuss_hwtstamp_set(struct net_device *ndev,
                ts_ctrl |= AM65_CPSW_TS_TX_ANX_ALL_EN |
                           AM65_CPSW_PN_TS_CTL_TX_VLAN_LT1_EN;
 
-       if (port->rx_ts_enabled)
+       if (port->rx_ts_filter)
                ts_ctrl |= AM65_CPSW_TS_RX_ANX_ALL_EN |
                           AM65_CPSW_PN_TS_CTL_RX_VLAN_LT1_EN;
 
@@ -1888,8 +1891,7 @@ static int am65_cpsw_nuss_hwtstamp_get(struct net_device *ndev,
        cfg->flags = 0;
        cfg->tx_type = port->tx_ts_enabled ?
                      HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
-       cfg->rx_filter = port->rx_ts_enabled ? HWTSTAMP_FILTER_PTP_V2_EVENT |
-                       HWTSTAMP_FILTER_PTP_V1_L4_EVENT : HWTSTAMP_FILTER_NONE;
+       cfg->rx_filter = port->rx_ts_filter;
 
        return 0;
 }
index 917c37e4e89bd933d3001f6c35a62db01cd8da4c..7750448e474685a54893f7f3a9a4f8e83b30e718 100644 (file)
@@ -52,7 +52,7 @@ struct am65_cpsw_port {
        bool                            disabled;
        struct am65_cpsw_slave_data     slave;
        bool                            tx_ts_enabled;
-       bool                            rx_ts_enabled;
+       enum hwtstamp_rx_filters        rx_ts_filter;
        struct am65_cpsw_qos            qos;
        struct devlink_port             devlink_port;
        struct bpf_prog                 *xdp_prog;