From: Grzegorz Nitka <[email protected]>

Change the order of PTP reconfiguration when port goes down or up
(ice_down and ice_up calls) to be more graceful and consistent from
timestamp interrupts processing perspective.

For both calls (ice_up and ice_down), accompanying ice_ptp_link_change
is called which starts/stops PTP timer. This patch changes the order:
- while link goes down: disable net device Tx first (netif_carrier_off,
  netif_tx_disable), then call ice_ptp_link_change
- while link goes up: ice_ptp_link_change called first, then re-enable
  net device Tx (netif_tx_start_all_queues)

Otherwise, there is a narrow window in which PTP timestamp request has
been triggered and timestamp processing occurs when PTP timer is not
enabled yet (up case) or already disabled (down case). This may lead to
undefined behavior and receiving invalid timestamps. This case was
observed on E825C devices only.

Fixes: 6b1ff5d39228 ("ice: always call ice_ptp_link_change and make it void")
Cc: [email protected]
Signed-off-by: Grzegorz Nitka <[email protected]>
Signed-off-by: Aleksandr Loktionov <[email protected]>
---

 drivers/net/ethernet/intel/ice/ice_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/intel/ice/ice_main.c 
b/drivers/net/ethernet/intel/ice/ice_main.c
index e7308e3..8896805 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -6797,10 +6797,10 @@ static int ice_up_complete(struct ice_vsi *vsi)
            (vsi->port_info->phy.link_info.link_info & ICE_AQ_LINK_UP) &&
            ((vsi->netdev && (vsi->type == ICE_VSI_PF ||
                              vsi->type == ICE_VSI_SF)))) {
+               ice_ptp_link_change(pf, true);
                ice_print_link_msg(vsi, true);
                netif_tx_start_all_queues(vsi->netdev);
                netif_carrier_on(vsi->netdev);
-               ice_ptp_link_change(pf, true);
        }
 
        /* Perform an initial read of the statistics registers now to
@@ -7328,9 +7328,9 @@ int ice_down(struct ice_vsi *vsi)
 
        if (vsi->netdev) {
                vlan_err = ice_vsi_del_vlan_zero(vsi);
-               ice_ptp_link_change(vsi->back, false);
                netif_carrier_off(vsi->netdev);
                netif_tx_disable(vsi->netdev);
+               ice_ptp_link_change(vsi->back, false);
        }
 
        ice_vsi_dis_irq(vsi);
-- 
2.52.0

Reply via email to