aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/resource_tracker.c')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/resource_tracker.c24
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
78enum res_qp_states { 79enum 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
2481static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, 2482static 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
2506static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, 2509static 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
2568ex_rem: 2572ex_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);
2571ex_put: 2575ex_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 }