• Aravindhan Gunasekaran's avatar
    igc: Handle PPS start time programming for past time values · 84a192e4
    Aravindhan Gunasekaran authored
    I225/6 hardware can be programmed to start PPS output once
    the time in Target Time registers is reached. The time
    programmed in these registers should always be into future.
    Only then PPS output is triggered when SYSTIM register
    reaches the programmed value. There are two modes in i225/6
    hardware to program PPS, pulse and clock mode.
    
    There were issues reported where PPS is not generated when
    start time is in past.
    
    Example 1, "echo 0 0 0 2 0 > /sys/class/ptp/ptp0/period"
    
    In the current implementation, a value of '0' is programmed
    into Target time registers and PPS output is in pulse mode.
    Eventually an interrupt which is triggered upon SYSTIM
    register reaching Target time is not fired. Thus no PPS
    output is generated.
    
    Example 2, "echo 0 0 0 1 0 > /sys/class/ptp/ptp0/period"
    
    Above case, a value of '0' is programmed into Target time
    registers and PPS output is in clock mode. Here, HW tries to
    catch-up the current time by incrementing Target Time
    register. This catch-up time seem to vary according to
    programmed PPS period time as per the HW design. In my
    experiments, the delay ranged between few tens of seconds to
    few minutes. The PPS output is only generated after the
    Target time register reaches current time.
    
    In my experiments, I also observed PPS stopped working with
    below test and could not recover until module is removed and
    loaded again.
    
    1) echo 0 <future time> 0 1 0 > /sys/class/ptp/ptp1/period
    2) echo 0 0 0 1 0 > /sys/class/ptp/ptp1/period
    3) echo 0 0 0 1 0 > /sys/class/ptp/ptp1/period
    
    After this PPS did not work even if i re-program with proper
    values. I could only get this back working by reloading the
    driver.
    
    This patch takes care of calculating and programming
    appropriate future time value into Target Time registers.
    
    Fixes: 5e91c72e ("igc: Fix PPS delta between two synchronized end-points")
    Signed-off-by: default avatarAravindhan Gunasekaran <aravindhan.gunasekaran@intel.com>
    Reviewed-by: default avatarMuhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>
    Tested-by: default avatarNaama Meir <naamax.meir@linux.intel.com>
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    84a192e4
igc_ptp.c 31.1 KB