diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/resource_tracker.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index dcd819bfb2f0..8752e6e08169 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 | ||
@@ -2253,8 +2255,7 @@ int mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave, | |||
2253 | 2255 | ||
2254 | if (vhcr->op_modifier == 0) { | 2256 | if (vhcr->op_modifier == 0) { |
2255 | err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq); | 2257 | err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq); |
2256 | if (err) | 2258 | goto ex_put; |
2257 | goto ex_put; | ||
2258 | } | 2259 | } |
2259 | 2260 | ||
2260 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 2261 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
@@ -2479,7 +2480,8 @@ static struct res_gid *find_gid(struct mlx4_dev *dev, int slave, | |||
2479 | } | 2480 | } |
2480 | 2481 | ||
2481 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2482 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
2482 | u8 *gid, enum mlx4_protocol prot) | 2483 | u8 *gid, enum mlx4_protocol prot, |
2484 | enum mlx4_steer_type steer) | ||
2483 | { | 2485 | { |
2484 | struct res_gid *res; | 2486 | struct res_gid *res; |
2485 | int err; | 2487 | int err; |
@@ -2495,6 +2497,7 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
2495 | } else { | 2497 | } else { |
2496 | memcpy(res->gid, gid, 16); | 2498 | memcpy(res->gid, gid, 16); |
2497 | res->prot = prot; | 2499 | res->prot = prot; |
2500 | res->steer = steer; | ||
2498 | list_add_tail(&res->list, &rqp->mcg_list); | 2501 | list_add_tail(&res->list, &rqp->mcg_list); |
2499 | err = 0; | 2502 | err = 0; |
2500 | } | 2503 | } |
@@ -2504,14 +2507,15 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
2504 | } | 2507 | } |
2505 | 2508 | ||
2506 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2509 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
2507 | u8 *gid, enum mlx4_protocol prot) | 2510 | u8 *gid, enum mlx4_protocol prot, |
2511 | enum mlx4_steer_type steer) | ||
2508 | { | 2512 | { |
2509 | struct res_gid *res; | 2513 | struct res_gid *res; |
2510 | int err; | 2514 | int err; |
2511 | 2515 | ||
2512 | spin_lock_irq(&rqp->mcg_spl); | 2516 | spin_lock_irq(&rqp->mcg_spl); |
2513 | res = find_gid(dev, slave, rqp, gid); | 2517 | res = find_gid(dev, slave, rqp, gid); |
2514 | if (!res || res->prot != prot) | 2518 | if (!res || res->prot != prot || res->steer != steer) |
2515 | err = -EINVAL; | 2519 | err = -EINVAL; |
2516 | else { | 2520 | else { |
2517 | list_del(&res->list); | 2521 | list_del(&res->list); |
@@ -2538,7 +2542,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2538 | int attach = vhcr->op_modifier; | 2542 | int attach = vhcr->op_modifier; |
2539 | int block_loopback = vhcr->in_modifier >> 31; | 2543 | int block_loopback = vhcr->in_modifier >> 31; |
2540 | u8 steer_type_mask = 2; | 2544 | u8 steer_type_mask = 2; |
2541 | enum mlx4_steer_type type = gid[7] & steer_type_mask; | 2545 | enum mlx4_steer_type type = (gid[7] & steer_type_mask) >> 1; |
2542 | 2546 | ||
2543 | qpn = vhcr->in_modifier & 0xffffff; | 2547 | qpn = vhcr->in_modifier & 0xffffff; |
2544 | err = get_res(dev, slave, qpn, RES_QP, &rqp); | 2548 | err = get_res(dev, slave, qpn, RES_QP, &rqp); |
@@ -2547,7 +2551,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2547 | 2551 | ||
2548 | qp.qpn = qpn; | 2552 | qp.qpn = qpn; |
2549 | if (attach) { | 2553 | if (attach) { |
2550 | err = add_mcg_res(dev, slave, rqp, gid, prot); | 2554 | err = add_mcg_res(dev, slave, rqp, gid, prot, type); |
2551 | if (err) | 2555 | if (err) |
2552 | goto ex_put; | 2556 | goto ex_put; |
2553 | 2557 | ||
@@ -2556,7 +2560,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2556 | if (err) | 2560 | if (err) |
2557 | goto ex_rem; | 2561 | goto ex_rem; |
2558 | } else { | 2562 | } else { |
2559 | err = rem_mcg_res(dev, slave, rqp, gid, prot); | 2563 | err = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
2560 | if (err) | 2564 | if (err) |
2561 | goto ex_put; | 2565 | goto ex_put; |
2562 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); | 2566 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); |
@@ -2567,7 +2571,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2567 | 2571 | ||
2568 | ex_rem: | 2572 | ex_rem: |
2569 | /* ignore error return below, already in error */ | 2573 | /* ignore error return below, already in error */ |
2570 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot); | 2574 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
2571 | ex_put: | 2575 | ex_put: |
2572 | put_res(dev, slave, qpn, RES_QP); | 2576 | put_res(dev, slave, qpn, RES_QP); |
2573 | 2577 | ||
@@ -2606,7 +2610,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) { | 2610 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { |
2607 | qp.qpn = rqp->local_qpn; | 2611 | qp.qpn = rqp->local_qpn; |
2608 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, | 2612 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, |
2609 | MLX4_MC_STEER); | 2613 | rgid->steer); |
2610 | list_del(&rgid->list); | 2614 | list_del(&rgid->list); |
2611 | kfree(rgid); | 2615 | kfree(rgid); |
2612 | } | 2616 | } |