| From 02896be9b8708e9752ac40aa11ac7549bbc9077b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 11 Sep 2023 13:28:14 -0700 |
| Subject: ixgbe: fix timestamp configuration code |
| |
| From: Vadim Fedorenko <vadim.fedorenko@linux.dev> |
| |
| [ Upstream commit 3c44191dd76cf9c0cc49adaf34384cbd42ef8ad2 ] |
| |
| The commit in fixes introduced flags to control the status of hardware |
| configuration while processing packets. At the same time another structure |
| is used to provide configuration of timestamper to user-space applications. |
| The way it was coded makes this structures go out of sync easily. The |
| repro is easy for 82599 chips: |
| |
| [root@hostname ~]# hwstamp_ctl -i eth0 -r 12 -t 1 |
| current settings: |
| tx_type 0 |
| rx_filter 0 |
| new settings: |
| tx_type 1 |
| rx_filter 12 |
| |
| The eth0 device is properly configured to timestamp any PTPv2 events. |
| |
| [root@hostname ~]# hwstamp_ctl -i eth0 -r 1 -t 1 |
| current settings: |
| tx_type 1 |
| rx_filter 12 |
| SIOCSHWTSTAMP failed: Numerical result out of range |
| The requested time stamping mode is not supported by the hardware. |
| |
| The error is properly returned because HW doesn't support all packets |
| timestamping. But the adapter->flags is cleared of timestamp flags |
| even though no HW configuration was done. From that point no RX timestamps |
| are received by user-space application. But configuration shows good |
| values: |
| |
| [root@hostname ~]# hwstamp_ctl -i eth0 |
| current settings: |
| tx_type 1 |
| rx_filter 12 |
| |
| Fix the issue by applying new flags only when the HW was actually |
| configured. |
| |
| Fixes: a9763f3cb54c ("ixgbe: Update PTP to support X550EM_x devices") |
| Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev> |
| Reviewed-by: Simon Horman <horms@kernel.org> |
| Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel) |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | 28 +++++++++++--------- |
| 1 file changed, 15 insertions(+), 13 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c |
| index 0310af851086b..9339edbd90821 100644 |
| --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c |
| +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c |
| @@ -979,6 +979,7 @@ static int ixgbe_ptp_set_timestamp_mode(struct ixgbe_adapter *adapter, |
| u32 tsync_tx_ctl = IXGBE_TSYNCTXCTL_ENABLED; |
| u32 tsync_rx_ctl = IXGBE_TSYNCRXCTL_ENABLED; |
| u32 tsync_rx_mtrl = PTP_EV_PORT << 16; |
| + u32 aflags = adapter->flags; |
| bool is_l2 = false; |
| u32 regval; |
| |
| @@ -996,20 +997,20 @@ static int ixgbe_ptp_set_timestamp_mode(struct ixgbe_adapter *adapter, |
| case HWTSTAMP_FILTER_NONE: |
| tsync_rx_ctl = 0; |
| tsync_rx_mtrl = 0; |
| - adapter->flags &= ~(IXGBE_FLAG_RX_HWTSTAMP_ENABLED | |
| - IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER); |
| + aflags &= ~(IXGBE_FLAG_RX_HWTSTAMP_ENABLED | |
| + IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER); |
| break; |
| case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: |
| tsync_rx_ctl |= IXGBE_TSYNCRXCTL_TYPE_L4_V1; |
| tsync_rx_mtrl |= IXGBE_RXMTRL_V1_SYNC_MSG; |
| - adapter->flags |= (IXGBE_FLAG_RX_HWTSTAMP_ENABLED | |
| - IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER); |
| + aflags |= (IXGBE_FLAG_RX_HWTSTAMP_ENABLED | |
| + IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER); |
| break; |
| case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: |
| tsync_rx_ctl |= IXGBE_TSYNCRXCTL_TYPE_L4_V1; |
| tsync_rx_mtrl |= IXGBE_RXMTRL_V1_DELAY_REQ_MSG; |
| - adapter->flags |= (IXGBE_FLAG_RX_HWTSTAMP_ENABLED | |
| - IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER); |
| + aflags |= (IXGBE_FLAG_RX_HWTSTAMP_ENABLED | |
| + IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER); |
| break; |
| case HWTSTAMP_FILTER_PTP_V2_EVENT: |
| case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: |
| @@ -1023,8 +1024,8 @@ static int ixgbe_ptp_set_timestamp_mode(struct ixgbe_adapter *adapter, |
| tsync_rx_ctl |= IXGBE_TSYNCRXCTL_TYPE_EVENT_V2; |
| is_l2 = true; |
| config->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; |
| - adapter->flags |= (IXGBE_FLAG_RX_HWTSTAMP_ENABLED | |
| - IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER); |
| + aflags |= (IXGBE_FLAG_RX_HWTSTAMP_ENABLED | |
| + IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER); |
| break; |
| case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: |
| case HWTSTAMP_FILTER_NTP_ALL: |
| @@ -1035,7 +1036,7 @@ static int ixgbe_ptp_set_timestamp_mode(struct ixgbe_adapter *adapter, |
| if (hw->mac.type >= ixgbe_mac_X550) { |
| tsync_rx_ctl |= IXGBE_TSYNCRXCTL_TYPE_ALL; |
| config->rx_filter = HWTSTAMP_FILTER_ALL; |
| - adapter->flags |= IXGBE_FLAG_RX_HWTSTAMP_ENABLED; |
| + aflags |= IXGBE_FLAG_RX_HWTSTAMP_ENABLED; |
| break; |
| } |
| fallthrough; |
| @@ -1046,8 +1047,6 @@ static int ixgbe_ptp_set_timestamp_mode(struct ixgbe_adapter *adapter, |
| * Delay_Req messages and hardware does not support |
| * timestamping all packets => return error |
| */ |
| - adapter->flags &= ~(IXGBE_FLAG_RX_HWTSTAMP_ENABLED | |
| - IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER); |
| config->rx_filter = HWTSTAMP_FILTER_NONE; |
| return -ERANGE; |
| } |
| @@ -1079,8 +1078,8 @@ static int ixgbe_ptp_set_timestamp_mode(struct ixgbe_adapter *adapter, |
| IXGBE_TSYNCRXCTL_TYPE_ALL | |
| IXGBE_TSYNCRXCTL_TSIP_UT_EN; |
| config->rx_filter = HWTSTAMP_FILTER_ALL; |
| - adapter->flags |= IXGBE_FLAG_RX_HWTSTAMP_ENABLED; |
| - adapter->flags &= ~IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER; |
| + aflags |= IXGBE_FLAG_RX_HWTSTAMP_ENABLED; |
| + aflags &= ~IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER; |
| is_l2 = true; |
| break; |
| default: |
| @@ -1113,6 +1112,9 @@ static int ixgbe_ptp_set_timestamp_mode(struct ixgbe_adapter *adapter, |
| |
| IXGBE_WRITE_FLUSH(hw); |
| |
| + /* configure adapter flags only when HW is actually configured */ |
| + adapter->flags = aflags; |
| + |
| /* clear TX/RX time stamp registers, just to be sure */ |
| ixgbe_ptp_clear_tx_timestamp(adapter); |
| IXGBE_READ_REG(hw, IXGBE_RXSTMPH); |
| -- |
| 2.40.1 |
| |