lkml.org 
[lkml]   [2020]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 127/152] enetc: Let the hardware auto-advance the taprio base-time of 0
    Date
    From: Vladimir Oltean <vladimir.oltean@nxp.com>

    [ Upstream commit 90cf87d16bd566cff40c2bc8e32e6d4cd3af23f0 ]

    The tc-taprio base time indicates the beginning of the tc-taprio
    schedule, which is cyclic by definition (where the length of the cycle
    in nanoseconds is called the cycle time). The base time is a 64-bit PTP
    time in the TAI domain.

    Logically, the base-time should be a future time. But that imposes some
    restrictions to user space, which has to retrieve the current PTP time
    from the NIC first, then calculate a base time that will still be larger
    than the base time by the time the kernel driver programs this value
    into the hardware. Actually ensuring that the programmed base time is in
    the future is still a problem even if the kernel alone deals with this.

    Luckily, the enetc hardware already advances a base-time that is in the
    past into a congruent time in the immediate future, according to the
    same formula that can be found in the software implementation of taprio
    (in taprio_get_start_time):

    /* Schedule the start time for the beginning of the next
    * cycle.
    */
    n = div64_s64(ktime_sub_ns(now, base), cycle);
    *start = ktime_add_ns(base, (n + 1) * cycle);

    There's only one problem: the driver doesn't let the hardware do that.
    It interferes with the base-time passed from user space, by special-casing
    the situation when the base-time is zero, and replaces that with the
    current PTP time. This changes the intended effective base-time of the
    schedule, which will in the end have a different phase offset than if
    the base-time of 0.000000000 was to be advanced by an integer multiple
    of the cycle-time.

    Fixes: 34c6adf1977b ("enetc: Configure the Time-Aware Scheduler via tc-taprio offload")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Link: https://lore.kernel.org/r/20201124220259.3027991-1-vladimir.oltean@nxp.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/freescale/enetc/enetc_qos.c | 14 ++------------
    1 file changed, 2 insertions(+), 12 deletions(-)

    diff --git a/drivers/net/ethernet/freescale/enetc/enetc_qos.c b/drivers/net/ethernet/freescale/enetc/enetc_qos.c
    index 1c4a535890dac..9a91e3568adbf 100644
    --- a/drivers/net/ethernet/freescale/enetc/enetc_qos.c
    +++ b/drivers/net/ethernet/freescale/enetc/enetc_qos.c
    @@ -95,18 +95,8 @@ static int enetc_setup_taprio(struct net_device *ndev,
    gcl_config->atc = 0xff;
    gcl_config->acl_len = cpu_to_le16(gcl_len);

    - if (!admin_conf->base_time) {
    - gcl_data->btl =
    - cpu_to_le32(enetc_rd(&priv->si->hw, ENETC_SICTR0));
    - gcl_data->bth =
    - cpu_to_le32(enetc_rd(&priv->si->hw, ENETC_SICTR1));
    - } else {
    - gcl_data->btl =
    - cpu_to_le32(lower_32_bits(admin_conf->base_time));
    - gcl_data->bth =
    - cpu_to_le32(upper_32_bits(admin_conf->base_time));
    - }
    -
    + gcl_data->btl = cpu_to_le32(lower_32_bits(admin_conf->base_time));
    + gcl_data->bth = cpu_to_le32(upper_32_bits(admin_conf->base_time));
    gcl_data->ct = cpu_to_le32(admin_conf->cycle_time);
    gcl_data->cte = cpu_to_le32(admin_conf->cycle_time_extension);

    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-01 10:16    [W:4.216 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site