diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/resource_tracker.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 63 |
1 files changed, 16 insertions, 47 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index ed20751a057d..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 | ||
@@ -1561,11 +1563,6 @@ static int mr_get_mtt_size(struct mlx4_mpt_entry *mpt) | |||
1561 | return be32_to_cpu(mpt->mtt_sz); | 1563 | return be32_to_cpu(mpt->mtt_sz); |
1562 | } | 1564 | } |
1563 | 1565 | ||
1564 | static int mr_get_pdn(struct mlx4_mpt_entry *mpt) | ||
1565 | { | ||
1566 | return be32_to_cpu(mpt->pd_flags) & 0xffffff; | ||
1567 | } | ||
1568 | |||
1569 | static int qp_get_mtt_addr(struct mlx4_qp_context *qpc) | 1566 | static int qp_get_mtt_addr(struct mlx4_qp_context *qpc) |
1570 | { | 1567 | { |
1571 | return be32_to_cpu(qpc->mtt_base_addr_l) & 0xfffffff8; | 1568 | return be32_to_cpu(qpc->mtt_base_addr_l) & 0xfffffff8; |
@@ -1602,16 +1599,6 @@ static int qp_get_mtt_size(struct mlx4_qp_context *qpc) | |||
1602 | return total_pages; | 1599 | return total_pages; |
1603 | } | 1600 | } |
1604 | 1601 | ||
1605 | static int qp_get_pdn(struct mlx4_qp_context *qpc) | ||
1606 | { | ||
1607 | return be32_to_cpu(qpc->pd) & 0xffffff; | ||
1608 | } | ||
1609 | |||
1610 | static int pdn2slave(int pdn) | ||
1611 | { | ||
1612 | return (pdn >> NOT_MASKED_PD_BITS) - 1; | ||
1613 | } | ||
1614 | |||
1615 | static int check_mtt_range(struct mlx4_dev *dev, int slave, int start, | 1602 | static int check_mtt_range(struct mlx4_dev *dev, int slave, int start, |
1616 | int size, struct res_mtt *mtt) | 1603 | int size, struct res_mtt *mtt) |
1617 | { | 1604 | { |
@@ -1656,11 +1643,6 @@ int mlx4_SW2HW_MPT_wrapper(struct mlx4_dev *dev, int slave, | |||
1656 | mpt->mtt = mtt; | 1643 | mpt->mtt = mtt; |
1657 | } | 1644 | } |
1658 | 1645 | ||
1659 | if (pdn2slave(mr_get_pdn(inbox->buf)) != slave) { | ||
1660 | err = -EPERM; | ||
1661 | goto ex_put; | ||
1662 | } | ||
1663 | |||
1664 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 1646 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
1665 | if (err) | 1647 | if (err) |
1666 | goto ex_put; | 1648 | goto ex_put; |
@@ -1792,11 +1774,6 @@ int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, | |||
1792 | if (err) | 1774 | if (err) |
1793 | goto ex_put_mtt; | 1775 | goto ex_put_mtt; |
1794 | 1776 | ||
1795 | if (pdn2slave(qp_get_pdn(qpc)) != slave) { | ||
1796 | err = -EPERM; | ||
1797 | goto ex_put_mtt; | ||
1798 | } | ||
1799 | |||
1800 | err = get_res(dev, slave, rcqn, RES_CQ, &rcq); | 1777 | err = get_res(dev, slave, rcqn, RES_CQ, &rcq); |
1801 | if (err) | 1778 | if (err) |
1802 | goto ex_put_mtt; | 1779 | goto ex_put_mtt; |
@@ -2048,10 +2025,10 @@ int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe) | |||
2048 | if (!priv->mfunc.master.slave_state) | 2025 | if (!priv->mfunc.master.slave_state) |
2049 | return -EINVAL; | 2026 | return -EINVAL; |
2050 | 2027 | ||
2051 | event_eq = &priv->mfunc.master.slave_state[slave].event_eq; | 2028 | event_eq = &priv->mfunc.master.slave_state[slave].event_eq[eqe->type]; |
2052 | 2029 | ||
2053 | /* Create the event only if the slave is registered */ | 2030 | /* Create the event only if the slave is registered */ |
2054 | if ((event_eq->event_type & (1 << eqe->type)) == 0) | 2031 | if (event_eq->eqn < 0) |
2055 | return 0; | 2032 | return 0; |
2056 | 2033 | ||
2057 | mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]); | 2034 | mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]); |
@@ -2278,8 +2255,7 @@ int mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave, | |||
2278 | 2255 | ||
2279 | if (vhcr->op_modifier == 0) { | 2256 | if (vhcr->op_modifier == 0) { |
2280 | err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq); | 2257 | err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq); |
2281 | if (err) | 2258 | goto ex_put; |
2282 | goto ex_put; | ||
2283 | } | 2259 | } |
2284 | 2260 | ||
2285 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 2261 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
@@ -2289,11 +2265,6 @@ ex_put: | |||
2289 | return err; | 2265 | return err; |
2290 | } | 2266 | } |
2291 | 2267 | ||
2292 | static int srq_get_pdn(struct mlx4_srq_context *srqc) | ||
2293 | { | ||
2294 | return be32_to_cpu(srqc->pd) & 0xffffff; | ||
2295 | } | ||
2296 | |||
2297 | static int srq_get_mtt_size(struct mlx4_srq_context *srqc) | 2268 | static int srq_get_mtt_size(struct mlx4_srq_context *srqc) |
2298 | { | 2269 | { |
2299 | int log_srq_size = (be32_to_cpu(srqc->state_logsize_srqn) >> 24) & 0xf; | 2270 | int log_srq_size = (be32_to_cpu(srqc->state_logsize_srqn) >> 24) & 0xf; |
@@ -2333,11 +2304,6 @@ int mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave, | |||
2333 | if (err) | 2304 | if (err) |
2334 | goto ex_put_mtt; | 2305 | goto ex_put_mtt; |
2335 | 2306 | ||
2336 | if (pdn2slave(srq_get_pdn(srqc)) != slave) { | ||
2337 | err = -EPERM; | ||
2338 | goto ex_put_mtt; | ||
2339 | } | ||
2340 | |||
2341 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 2307 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
2342 | if (err) | 2308 | if (err) |
2343 | goto ex_put_mtt; | 2309 | goto ex_put_mtt; |
@@ -2514,7 +2480,8 @@ static struct res_gid *find_gid(struct mlx4_dev *dev, int slave, | |||
2514 | } | 2480 | } |
2515 | 2481 | ||
2516 | 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, |
2517 | u8 *gid, enum mlx4_protocol prot) | 2483 | u8 *gid, enum mlx4_protocol prot, |
2484 | enum mlx4_steer_type steer) | ||
2518 | { | 2485 | { |
2519 | struct res_gid *res; | 2486 | struct res_gid *res; |
2520 | int err; | 2487 | int err; |
@@ -2530,6 +2497,7 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
2530 | } else { | 2497 | } else { |
2531 | memcpy(res->gid, gid, 16); | 2498 | memcpy(res->gid, gid, 16); |
2532 | res->prot = prot; | 2499 | res->prot = prot; |
2500 | res->steer = steer; | ||
2533 | list_add_tail(&res->list, &rqp->mcg_list); | 2501 | list_add_tail(&res->list, &rqp->mcg_list); |
2534 | err = 0; | 2502 | err = 0; |
2535 | } | 2503 | } |
@@ -2539,14 +2507,15 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
2539 | } | 2507 | } |
2540 | 2508 | ||
2541 | 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, |
2542 | u8 *gid, enum mlx4_protocol prot) | 2510 | u8 *gid, enum mlx4_protocol prot, |
2511 | enum mlx4_steer_type steer) | ||
2543 | { | 2512 | { |
2544 | struct res_gid *res; | 2513 | struct res_gid *res; |
2545 | int err; | 2514 | int err; |
2546 | 2515 | ||
2547 | spin_lock_irq(&rqp->mcg_spl); | 2516 | spin_lock_irq(&rqp->mcg_spl); |
2548 | res = find_gid(dev, slave, rqp, gid); | 2517 | res = find_gid(dev, slave, rqp, gid); |
2549 | if (!res || res->prot != prot) | 2518 | if (!res || res->prot != prot || res->steer != steer) |
2550 | err = -EINVAL; | 2519 | err = -EINVAL; |
2551 | else { | 2520 | else { |
2552 | list_del(&res->list); | 2521 | list_del(&res->list); |
@@ -2573,7 +2542,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2573 | int attach = vhcr->op_modifier; | 2542 | int attach = vhcr->op_modifier; |
2574 | int block_loopback = vhcr->in_modifier >> 31; | 2543 | int block_loopback = vhcr->in_modifier >> 31; |
2575 | u8 steer_type_mask = 2; | 2544 | u8 steer_type_mask = 2; |
2576 | enum mlx4_steer_type type = gid[7] & steer_type_mask; | 2545 | enum mlx4_steer_type type = (gid[7] & steer_type_mask) >> 1; |
2577 | 2546 | ||
2578 | qpn = vhcr->in_modifier & 0xffffff; | 2547 | qpn = vhcr->in_modifier & 0xffffff; |
2579 | err = get_res(dev, slave, qpn, RES_QP, &rqp); | 2548 | err = get_res(dev, slave, qpn, RES_QP, &rqp); |
@@ -2582,7 +2551,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2582 | 2551 | ||
2583 | qp.qpn = qpn; | 2552 | qp.qpn = qpn; |
2584 | if (attach) { | 2553 | if (attach) { |
2585 | err = add_mcg_res(dev, slave, rqp, gid, prot); | 2554 | err = add_mcg_res(dev, slave, rqp, gid, prot, type); |
2586 | if (err) | 2555 | if (err) |
2587 | goto ex_put; | 2556 | goto ex_put; |
2588 | 2557 | ||
@@ -2591,7 +2560,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2591 | if (err) | 2560 | if (err) |
2592 | goto ex_rem; | 2561 | goto ex_rem; |
2593 | } else { | 2562 | } else { |
2594 | err = rem_mcg_res(dev, slave, rqp, gid, prot); | 2563 | err = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
2595 | if (err) | 2564 | if (err) |
2596 | goto ex_put; | 2565 | goto ex_put; |
2597 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); | 2566 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); |
@@ -2602,7 +2571,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
2602 | 2571 | ||
2603 | ex_rem: | 2572 | ex_rem: |
2604 | /* ignore error return below, already in error */ | 2573 | /* ignore error return below, already in error */ |
2605 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot); | 2574 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
2606 | ex_put: | 2575 | ex_put: |
2607 | put_res(dev, slave, qpn, RES_QP); | 2576 | put_res(dev, slave, qpn, RES_QP); |
2608 | 2577 | ||
@@ -2641,7 +2610,7 @@ static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp) | |||
2641 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { | 2610 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { |
2642 | qp.qpn = rqp->local_qpn; | 2611 | qp.qpn = rqp->local_qpn; |
2643 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, | 2612 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, |
2644 | MLX4_MC_STEER); | 2613 | rgid->steer); |
2645 | list_del(&rgid->list); | 2614 | list_del(&rgid->list); |
2646 | kfree(rgid); | 2615 | kfree(rgid); |
2647 | } | 2616 | } |