lkml.org 
[lkml]   [2016]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16.y-ckt 111/128] net/mlx4_en: Fix HW timestamp init issue upon system startup
    Date
    3.16.7-ckt23 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    From: Eugenia Emantayev <eugenia@mellanox.com>

    commit 90683061dd50b0d70f01466c2d694f4e928a86f3 upstream.

    mlx4_en_init_timestamp was called before creation of netdev and port
    init, thus used uninitialized values. Specifically - NIC frequency was
    incorrect causing wrong calculations and later wrong HW timestamps.

    Fixes: 1ec4864b1017 ('net/mlx4_en: Fixed crash when port type is changed')
    Signed-off-by: Eugenia Emantayev <eugenia@mellanox.com>
    Signed-off-by: Marina Varshaver <marinav@mellanox.com>
    Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com>
    Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    drivers/net/ethernet/mellanox/mlx4/en_clock.c | 7 +++++++
    drivers/net/ethernet/mellanox/mlx4/en_main.c | 7 -------
    drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 7 +++++++
    3 files changed, 14 insertions(+), 7 deletions(-)

    diff --git a/drivers/net/ethernet/mellanox/mlx4/en_clock.c b/drivers/net/ethernet/mellanox/mlx4/en_clock.c
    index 57dda95b67d8..74ed9f8fd267 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/en_clock.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/en_clock.c
    @@ -291,6 +291,13 @@ void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev)
    unsigned long flags;
    u64 ns;

    + /* mlx4_en_init_timestamp is called for each netdev.
    + * mdev->ptp_clock is common for all ports, skip initialization if
    + * was done for other port.
    + */
    + if (mdev->ptp_clock)
    + return;
    +
    rwlock_init(&mdev->clock_lock);

    memset(&mdev->cycles, 0, sizeof(mdev->cycles));
    diff --git a/drivers/net/ethernet/mellanox/mlx4/en_main.c b/drivers/net/ethernet/mellanox/mlx4/en_main.c
    index f953c1d7eae6..80af090463eb 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/en_main.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/en_main.c
    @@ -206,9 +206,6 @@ static void mlx4_en_remove(struct mlx4_dev *dev, void *endev_ptr)
    if (mdev->pndev[i])
    mlx4_en_destroy_netdev(mdev->pndev[i]);

    - if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
    - mlx4_en_remove_timestamp(mdev);
    -
    flush_workqueue(mdev->workqueue);
    destroy_workqueue(mdev->workqueue);
    (void) mlx4_mr_free(dev, &mdev->mr);
    @@ -276,10 +273,6 @@ static void *mlx4_en_add(struct mlx4_dev *dev)
    mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH)
    mdev->port_cnt++;

    - /* Initialize time stamp mechanism */
    - if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
    - mlx4_en_init_timestamp(mdev);
    -
    /* Set default number of RX rings*/
    mlx4_en_set_num_rx_rings(mdev);

    diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
    index 3e663928b51e..bf3878823c96 100644
    --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
    @@ -2091,6 +2091,9 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
    /* flush any pending task for this netdev */
    flush_workqueue(mdev->workqueue);

    + if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
    + mlx4_en_remove_timestamp(mdev);
    +
    /* Detach the netdev so tasks would not attempt to access it */
    mutex_lock(&mdev->state_lock);
    mdev->pndev[priv->port] = NULL;
    @@ -2655,6 +2658,10 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
    }
    queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);

    + /* Initialize time stamp mechanism */
    + if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
    + mlx4_en_init_timestamp(mdev);
    +
    queue_delayed_work(mdev->workqueue, &priv->service_task,
    SERVICE_TASK_DELAY);

    \
     
     \ /
      Last update: 2016-01-25 00:01    [W:4.247 / U:0.212 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site