|
58 | 58 | #include <linux/mlx5/vport.h>
|
59 | 59 | #include "mlx5_ib.h"
|
60 | 60 | #include "cmd.h"
|
| 61 | +#include <linux/mlx5/vport.h> |
61 | 62 |
|
62 | 63 | #define DRIVER_NAME "mlx5_ib"
|
63 | 64 | #define DRIVER_VERSION "5.0-0"
|
@@ -1187,6 +1188,45 @@ static int deallocate_uars(struct mlx5_ib_dev *dev, struct mlx5_ib_ucontext *con
|
1187 | 1188 | return 0;
|
1188 | 1189 | }
|
1189 | 1190 |
|
| 1191 | +static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn) |
| 1192 | +{ |
| 1193 | + int err; |
| 1194 | + |
| 1195 | + err = mlx5_core_alloc_transport_domain(dev->mdev, tdn); |
| 1196 | + if (err) |
| 1197 | + return err; |
| 1198 | + |
| 1199 | + if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || |
| 1200 | + !MLX5_CAP_GEN(dev->mdev, disable_local_lb)) |
| 1201 | + return err; |
| 1202 | + |
| 1203 | + mutex_lock(&dev->lb_mutex); |
| 1204 | + dev->user_td++; |
| 1205 | + |
| 1206 | + if (dev->user_td == 2) |
| 1207 | + err = mlx5_nic_vport_update_local_lb(dev->mdev, true); |
| 1208 | + |
| 1209 | + mutex_unlock(&dev->lb_mutex); |
| 1210 | + return err; |
| 1211 | +} |
| 1212 | + |
| 1213 | +static void mlx5_ib_dealloc_transport_domain(struct mlx5_ib_dev *dev, u32 tdn) |
| 1214 | +{ |
| 1215 | + mlx5_core_dealloc_transport_domain(dev->mdev, tdn); |
| 1216 | + |
| 1217 | + if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) || |
| 1218 | + !MLX5_CAP_GEN(dev->mdev, disable_local_lb)) |
| 1219 | + return; |
| 1220 | + |
| 1221 | + mutex_lock(&dev->lb_mutex); |
| 1222 | + dev->user_td--; |
| 1223 | + |
| 1224 | + if (dev->user_td < 2) |
| 1225 | + mlx5_nic_vport_update_local_lb(dev->mdev, false); |
| 1226 | + |
| 1227 | + mutex_unlock(&dev->lb_mutex); |
| 1228 | +} |
| 1229 | + |
1190 | 1230 | static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
1191 | 1231 | struct ib_udata *udata)
|
1192 | 1232 | {
|
@@ -1295,8 +1335,7 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
1295 | 1335 | mutex_init(&context->upd_xlt_page_mutex);
|
1296 | 1336 |
|
1297 | 1337 | if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain)) {
|
1298 |
| - err = mlx5_core_alloc_transport_domain(dev->mdev, |
1299 |
| - &context->tdn); |
| 1338 | + err = mlx5_ib_alloc_transport_domain(dev, &context->tdn); |
1300 | 1339 | if (err)
|
1301 | 1340 | goto out_page;
|
1302 | 1341 | }
|
@@ -1362,7 +1401,7 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
1362 | 1401 |
|
1363 | 1402 | out_td:
|
1364 | 1403 | if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
1365 |
| - mlx5_core_dealloc_transport_domain(dev->mdev, context->tdn); |
| 1404 | + mlx5_ib_dealloc_transport_domain(dev, context->tdn); |
1366 | 1405 |
|
1367 | 1406 | out_page:
|
1368 | 1407 | free_page(context->upd_xlt_page);
|
@@ -1390,7 +1429,7 @@ static int mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext)
|
1390 | 1429 |
|
1391 | 1430 | bfregi = &context->bfregi;
|
1392 | 1431 | if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
1393 |
| - mlx5_core_dealloc_transport_domain(dev->mdev, context->tdn); |
| 1432 | + mlx5_ib_dealloc_transport_domain(dev, context->tdn); |
1394 | 1433 |
|
1395 | 1434 | free_page(context->upd_xlt_page);
|
1396 | 1435 | deallocate_uars(dev, context);
|
@@ -3797,6 +3836,10 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
|
3797 | 3836 | goto err_umrc;
|
3798 | 3837 | }
|
3799 | 3838 |
|
| 3839 | + if ((MLX5_CAP_GEN(mdev, port_type) == MLX5_CAP_PORT_TYPE_ETH) && |
| 3840 | + MLX5_CAP_GEN(mdev, disable_local_lb)) |
| 3841 | + mutex_init(&dev->lb_mutex); |
| 3842 | + |
3800 | 3843 | dev->ib_active = true;
|
3801 | 3844 |
|
3802 | 3845 | return dev;
|
|
0 commit comments