• Jacob Keller's avatar
    ice: restore timestamp configuration after device reset · 77580179
    Jacob Keller authored
    The driver calls ice_ptp_cfg_timestamp() during ice_ptp_prepare_for_reset()
    to disable timestamping while the device is resetting. This operation
    destroys the user requested configuration. While the driver does call
    ice_ptp_cfg_timestamp in ice_rebuild() to restore some hardware settings
    after a reset, it unconditionally passes true or false, resulting in
    failure to restore previous user space configuration.
    
    This results in a device reset forcibly disabling timestamp configuration
    regardless of current user settings.
    
    This was not detected previously due to a quirk of the LinuxPTP ptp4l
    application. If ptp4l detects a missing timestamp, it enters a fault state
    and performs recovery logic which includes executing SIOCSHWTSTAMP again,
    restoring the now accidentally cleared configuration.
    
    Not every application does this, and for these applications, timestamps
    will mysteriously stop after a PF reset, without being restored until an
    application restart.
    
    Fix this by replacing ice_ptp_cfg_timestamp() with two new functions:
    
    1) ice_ptp_disable_timestamp_mode() which unconditionally disables the
       timestamping logic in ice_ptp_prepare_for_reset() and ice_ptp_release()
    
    2) ice_ptp_restore_timestamp_mode() which calls
       ice_ptp_restore_tx_interrupt() to restore Tx timestamping configuration,
       calls ice_set_rx_tstamp() to restore Rx timestamping configuration, and
       issues an immediate TSYN_TX interrupt to ensure that timestamps which
       may have occurred during the device reset get processed.
    
    Modify the ice_ptp_set_timestamp_mode to directly save the user
    configuration and then call ice_ptp_restore_timestamp_mode. This way, reset
    no longer destroys the saved user configuration.
    
    This obsoletes the ice_set_tx_tstamp() function which can now be safely
    removed.
    
    With this change, all devices should now restore Tx and Rx timestamping
    functionality correctly after a PF reset without application intervention.
    
    Fixes: 77a78115 ("ice: enable receive hardware timestamping")
    Fixes: ea9b847c ("ice: enable transmit timestamps for E810 devices")
    Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Reviewed-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
    Reviewed-by: default avatarSimon Horman <horms@kernel.org>
    Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    77580179
ice_ptp.c 83.7 KB