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.c63
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
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
@@ -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
1564static int mr_get_pdn(struct mlx4_mpt_entry *mpt)
1565{
1566 return be32_to_cpu(mpt->pd_flags) & 0xffffff;
1567}
1568
1569static int qp_get_mtt_addr(struct mlx4_qp_context *qpc) 1566static 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
1605static int qp_get_pdn(struct mlx4_qp_context *qpc)
1606{
1607 return be32_to_cpu(qpc->pd) & 0xffffff;
1608}
1609
1610static int pdn2slave(int pdn)
1611{
1612 return (pdn >> NOT_MASKED_PD_BITS) - 1;
1613}
1614
1615static int check_mtt_range(struct mlx4_dev *dev, int slave, int start, 1602static 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
2292static int srq_get_pdn(struct mlx4_srq_context *srqc)
2293{
2294 return be32_to_cpu(srqc->pd) & 0xffffff;
2295}
2296
2297static int srq_get_mtt_size(struct mlx4_srq_context *srqc) 2268static 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
2516static 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,
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
2541static 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,
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
2603ex_rem: 2572ex_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);
2606ex_put: 2575ex_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 }