diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/resource_tracker.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index dcd819bfb2f0..bfdb7af19e49 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
@@ -73,6 +73,7 @@ struct res_gid { | |||
73 | struct list_head list; | 73 | struct list_head list; |
74 | u8 gid[16]; | 74 | u8 gid[16]; |
75 | enum mlx4_protocol prot; | 75 | enum mlx4_protocol prot; |
76 | enum mlx4_steer_type steer; | ||
76 | }; | 77 | }; |
77 | 78 | ||
78 | enum res_qp_states { | 79 | enum res_qp_states { |
@@ -374,6 +375,7 @@ static struct res_common *alloc_qp_tr(int id) | |||
374 | 375 | ||
375 | ret->com.res_id = id; | 376 | ret->com.res_id = id; |
376 | ret->com.state = RES_QP_RESERVED; | 377 | ret->com.state = RES_QP_RESERVED; |
378 | ret->local_qpn = id; | ||
377 | INIT_LIST_HEAD(&ret->mcg_list); | 379 | INIT_LIST_HEAD(&ret->mcg_list); |
378 | spin_lock_init(&ret->mcg_spl); | 380 | spin_lock_init(&ret->mcg_spl); |
379 | 381 | ||
@@ -2479,7 +2481,8 @@ static struct res_gid *find_gid(struct mlx4_dev *dev, int slave, | |||
2479 | } | 2481 | } |
2480 | 2482 | ||
2481 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2483 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
2482 | u8 *gid, enum mlx4_protocol prot) | 2484 | u8 *gid, enum mlx4_protocol prot, |
2485 | enum mlx4_steer_type steer) | ||
2483 | { | 2486 | { |
2484 | struct res_gid *res; | 2487 | struct res_gid *res; |
2485 | int err; | 2488 | int err; |
@@ -2495,6 +2498,7 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
2495 | } else { | 2498 | } else { |
2496 | memcpy(res->gid, gid, 16); | 2499 | memcpy(res->gid, gid, 16); |
2497 | res->prot = prot; | 2500 | res->prot = prot; |
2501 | res->steer = steer; | ||
2498 | list_add_tail(&res->list, &rqp->mcg_list); | 2502 | list_add_tail(&res->list, &rqp->mcg_list); |
2499 | err = 0; | 2503 | err = 0; |
2500 | } | 2504 | } |
@@ -2504,14 +2508,15 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
2504 | } | 2508 | } |
2505 | 2509 | ||
2506 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2510 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
2507 | u8 *gid, enum mlx4_protocol prot) | 2511 | u8 *gid, enum mlx4_protocol prot, |
2512 | enum mlx4_steer_type steer) | ||
2508 | { | 2513 | { |
2509 | struct res_gid *res; | 2514 | struct res_gid *res; |
2510 | int err; | 2515 | int err; |
2511 | 2516 | ||
2512 | spin_lock_irq(&rqp->mcg_spl); | 2517 | spin_lock_irq(&rqp->mcg_spl); |
2513 | res = find_gid(dev, slave, rqp, gid); | 2518 | res = find_gid(dev, slave, rqp, gid); |
2514 | if (!res || res->prot != prot) | 2519 | if (!res || res->prot != prot || res->steer != steer) |
2515 | err = -EINVAL; | 2520 | err = -EINVAL; |
2516 | else { | 2521 | else { |
2517 | list_del(&res->list); | 2522 | list_del(&res->list); |
@@ -2538,7 +2543,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2538 | int attach = vhcr->op_modifier; | 2543 | int attach = vhcr->op_modifier; |
2539 | int block_loopback = vhcr->in_modifier >> 31; | 2544 | int block_loopback = vhcr->in_modifier >> 31; |
2540 | u8 steer_type_mask = 2; | 2545 | u8 steer_type_mask = 2; |
2541 | enum mlx4_steer_type type = gid[7] & steer_type_mask; | 2546 | enum mlx4_steer_type type = (gid[7] & steer_type_mask) >> 1; |
2542 | 2547 | ||
2543 | qpn = vhcr->in_modifier & 0xffffff; | 2548 | qpn = vhcr->in_modifier & 0xffffff; |
2544 | err = get_res(dev, slave, qpn, RES_QP, &rqp); | 2549 | err = get_res(dev, slave, qpn, RES_QP, &rqp); |
@@ -2547,7 +2552,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2547 | 2552 | ||
2548 | qp.qpn = qpn; | 2553 | qp.qpn = qpn; |
2549 | if (attach) { | 2554 | if (attach) { |
2550 | err = add_mcg_res(dev, slave, rqp, gid, prot); | 2555 | err = add_mcg_res(dev, slave, rqp, gid, prot, type); |
2551 | if (err) | 2556 | if (err) |
2552 | goto ex_put; | 2557 | goto ex_put; |
2553 | 2558 | ||
@@ -2556,7 +2561,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2556 | if (err) | 2561 | if (err) |
2557 | goto ex_rem; | 2562 | goto ex_rem; |
2558 | } else { | 2563 | } else { |
2559 | err = rem_mcg_res(dev, slave, rqp, gid, prot); | 2564 | err = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
2560 | if (err) | 2565 | if (err) |
2561 | goto ex_put; | 2566 | goto ex_put; |
2562 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); | 2567 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); |
@@ -2567,7 +2572,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2567 | 2572 | ||
2568 | ex_rem: | 2573 | ex_rem: |
2569 | /* ignore error return below, already in error */ | 2574 | /* ignore error return below, already in error */ |
2570 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot); | 2575 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
2571 | ex_put: | 2576 | ex_put: |
2572 | put_res(dev, slave, qpn, RES_QP); | 2577 | put_res(dev, slave, qpn, RES_QP); |
2573 | 2578 | ||
@@ -2606,7 +2611,7 @@ static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp) | |||
2606 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { | 2611 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { |
2607 | qp.qpn = rqp->local_qpn; | 2612 | qp.qpn = rqp->local_qpn; |
2608 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, | 2613 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, |
2609 | MLX4_MC_STEER); | 2614 | rgid->steer); |
2610 | list_del(&rgid->list); | 2615 | list_del(&rgid->list); |
2611 | kfree(rgid); | 2616 | kfree(rgid); |
2612 | } | 2617 | } |