drivers/net/ethernet/ti/am65-cpsw-nuss.c | 12 +++++++++--- drivers/net/ethernet/ti/am65-cpsw-nuss.h | 1 + 2 files changed, 10 insertions(+), 3 deletions(-)
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>
---
This patch is based on commit "1939d9816dbf" of origin/main branch of
Linux net repo.
drivers/net/ethernet/ti/am65-cpsw-nuss.c | 12 +++++++++---
drivers/net/ethernet/ti/am65-cpsw-nuss.h | 1 +
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
index 967918050433..a10b055b0262 100644
--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
+++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
@@ -1812,10 +1812,15 @@ 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_enabled = true;
+ 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:
@@ -1826,7 +1831,8 @@ static int am65_cpsw_nuss_hwtstamp_set(struct net_device *ndev,
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:
@@ -1888,8 +1894,8 @@ 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_enabled ?
+ port->rx_ts_filter : HWTSTAMP_FILTER_NONE;
return 0;
}
diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.h b/drivers/net/ethernet/ti/am65-cpsw-nuss.h
index 917c37e4e89b..595123c155db 100644
--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.h
+++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.h
@@ -53,6 +53,7 @@ struct am65_cpsw_port {
struct am65_cpsw_slave_data slave;
bool tx_ts_enabled;
bool rx_ts_enabled;
+ int rx_ts_filter;
struct am65_cpsw_qos qos;
struct devlink_port devlink_port;
struct bpf_prog *xdp_prog;
--
2.34.1
On Tue, 3 Mar 2026 13:28:19 +0530 Chintan Vankar wrote:
> @@ -1888,8 +1894,8 @@ 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_enabled ?
> + port->rx_ts_filter : HWTSTAMP_FILTER_NONE;
HWTSTAMP_FILTER_NONE == 0
a lot of code depends on that
so you can just assign port->rx_ts_filter
>
> return 0;
> }
> diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.h b/drivers/net/ethernet/ti/am65-cpsw-nuss.h
> index 917c37e4e89b..595123c155db 100644
> --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.h
> +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.h
> @@ -53,6 +53,7 @@ struct am65_cpsw_port {
> struct am65_cpsw_slave_data slave;
> bool tx_ts_enabled;
> bool rx_ts_enabled;
> + int rx_ts_filter;
given none == 0 you can just turn rx_ts_enabled from a bool into
an enum hwtstamp_rx_filters and maybe rename it?
no need to have two members in the struct for rx
--
pw-bot: cr
Hello Jakub,
On 05/03/26 08:31, Jakub Kicinski wrote:
> On Tue, 3 Mar 2026 13:28:19 +0530 Chintan Vankar wrote:
>> @@ -1888,8 +1894,8 @@ 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_enabled ?
>> + port->rx_ts_filter : HWTSTAMP_FILTER_NONE;
>
> HWTSTAMP_FILTER_NONE == 0
> a lot of code depends on that
> so you can just assign port->rx_ts_filter
>
>>
>> return 0;
>> }
>> diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.h b/drivers/net/ethernet/ti/am65-cpsw-nuss.h
>> index 917c37e4e89b..595123c155db 100644
>> --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.h
>> +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.h
>> @@ -53,6 +53,7 @@ struct am65_cpsw_port {
>> struct am65_cpsw_slave_data slave;
>> bool tx_ts_enabled;
>> bool rx_ts_enabled;
>> + int rx_ts_filter;
>
> given none == 0 you can just turn rx_ts_enabled from a bool into
> an enum hwtstamp_rx_filters and maybe rename it?
> no need to have two members in the struct for rx
Thanks for suggesting this, I have posted a version 2 with updated
changes at:
https://lore.kernel.org/r/20260310160940.109822-1-c-vankar@ti.com/
Regards,
Chintan.
© 2016 - 2026 Red Hat, Inc.