net/mlx5: Get RoCE netdev
authorAviv Heller <avivh@mellanox.com>
Mon, 9 May 2016 11:06:44 +0000 (11:06 +0000)
committerLeon Romanovsky <leon@kernel.org>
Thu, 18 Aug 2016 15:49:54 +0000 (18:49 +0300)
Used by IB driver for determining the IB bond
device's netdev, when LAG is active.

Returns PF0's netdev if mode is not active-backup,
or the PF netdev of the active slave when mode is
active-backup.

Signed-off-by: Aviv Heller <avivh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/lag.c
include/linux/mlx5/driver.h

index 3bf0a7ffe0e0ec9e860a7ea644af3de01d3fb9fc..952305054e16cb001fecd11e3822be81d62315c8 100644 (file)
@@ -528,3 +528,30 @@ bool mlx5_lag_is_active(struct mlx5_core_dev *dev)
 }
 EXPORT_SYMBOL(mlx5_lag_is_active);
 
+struct net_device *mlx5_lag_get_roce_netdev(struct mlx5_core_dev *dev)
+{
+       struct net_device *ndev = NULL;
+       struct mlx5_lag *ldev;
+
+       mutex_lock(&lag_mutex);
+       ldev = mlx5_lag_dev_get(dev);
+
+       if (!(ldev && mlx5_lag_is_bonded(ldev)))
+               goto unlock;
+
+       if (ldev->tracker.tx_type == NETDEV_LAG_TX_TYPE_ACTIVEBACKUP) {
+               ndev = ldev->tracker.netdev_state[0].tx_enabled ?
+                      ldev->pf[0].netdev : ldev->pf[1].netdev;
+       } else {
+               ndev = ldev->pf[0].netdev;
+       }
+       if (ndev)
+               dev_hold(ndev);
+
+unlock:
+       mutex_unlock(&lag_mutex);
+
+       return ndev;
+}
+EXPORT_SYMBOL(mlx5_lag_get_roce_netdev);
+
index ed983b8c3213510ae68468b43c0c832ae72ab920..c568dd927330f7561a05982e625a83a10f0e7b37 100644 (file)
@@ -945,6 +945,7 @@ void mlx5_unregister_interface(struct mlx5_interface *intf);
 int mlx5_core_query_vendor_id(struct mlx5_core_dev *mdev, u32 *vendor_id);
 
 bool mlx5_lag_is_active(struct mlx5_core_dev *dev);
+struct net_device *mlx5_lag_get_roce_netdev(struct mlx5_core_dev *dev);
 
 struct mlx5_profile {
        u64     mask;