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.c60
1 files changed, 15 insertions, 45 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
index ed20751a057d..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
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]);
@@ -2289,11 +2266,6 @@ ex_put:
2289 return err; 2266 return err;
2290} 2267}
2291 2268
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) 2269static int srq_get_mtt_size(struct mlx4_srq_context *srqc)
2298{ 2270{
2299 int log_srq_size = (be32_to_cpu(srqc->state_logsize_srqn) >> 24) & 0xf; 2271 int log_srq_size = (be32_to_cpu(srqc->state_logsize_srqn) >> 24) & 0xf;
@@ -2333,11 +2305,6 @@ int mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
2333 if (err) 2305 if (err)
2334 goto ex_put_mtt; 2306 goto ex_put_mtt;
2335 2307
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); 2308 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2342 if (err) 2309 if (err)
2343 goto ex_put_mtt; 2310 goto ex_put_mtt;
@@ -2514,7 +2481,8 @@ static struct res_gid *find_gid(struct mlx4_dev *dev, int slave,
2514} 2481}
2515 2482
2516static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, 2483static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
2517 u8 *gid, enum mlx4_protocol prot) 2484 u8 *gid, enum mlx4_protocol prot,
2485 enum mlx4_steer_type steer)
2518{ 2486{
2519 struct res_gid *res; 2487 struct res_gid *res;
2520 int err; 2488 int err;
@@ -2530,6 +2498,7 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
2530 } else { 2498 } else {
2531 memcpy(res->gid, gid, 16); 2499 memcpy(res->gid, gid, 16);
2532 res->prot = prot; 2500 res->prot = prot;
2501 res->steer = steer;
2533 list_add_tail(&res->list, &rqp->mcg_list); 2502 list_add_tail(&res->list, &rqp->mcg_list);
2534 err = 0; 2503 err = 0;
2535 } 2504 }
@@ -2539,14 +2508,15 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
2539} 2508}
2540 2509
2541static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, 2510static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
2542 u8 *gid, enum mlx4_protocol prot) 2511 u8 *gid, enum mlx4_protocol prot,
2512 enum mlx4_steer_type steer)
2543{ 2513{
2544 struct res_gid *res; 2514 struct res_gid *res;
2545 int err; 2515 int err;
2546 2516
2547 spin_lock_irq(&rqp->mcg_spl); 2517 spin_lock_irq(&rqp->mcg_spl);
2548 res = find_gid(dev, slave, rqp, gid); 2518 res = find_gid(dev, slave, rqp, gid);
2549 if (!res || res->prot != prot) 2519 if (!res || res->prot != prot || res->steer != steer)
2550 err = -EINVAL; 2520 err = -EINVAL;
2551 else { 2521 else {
2552 list_del(&res->list); 2522 list_del(&res->list);
@@ -2573,7 +2543,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
2573 int attach = vhcr->op_modifier; 2543 int attach = vhcr->op_modifier;
2574 int block_loopback = vhcr->in_modifier >> 31; 2544 int block_loopback = vhcr->in_modifier >> 31;
2575 u8 steer_type_mask = 2; 2545 u8 steer_type_mask = 2;
2576 enum mlx4_steer_type type = gid[7] & steer_type_mask; 2546 enum mlx4_steer_type type = (gid[7] & steer_type_mask) >> 1;
2577 2547
2578 qpn = vhcr->in_modifier & 0xffffff; 2548 qpn = vhcr->in_modifier & 0xffffff;
2579 err = get_res(dev, slave, qpn, RES_QP, &rqp); 2549 err = get_res(dev, slave, qpn, RES_QP, &rqp);
@@ -2582,7 +2552,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
2582 2552
2583 qp.qpn = qpn; 2553 qp.qpn = qpn;
2584 if (attach) { 2554 if (attach) {
2585 err = add_mcg_res(dev, slave, rqp, gid, prot); 2555 err = add_mcg_res(dev, slave, rqp, gid, prot, type);
2586 if (err) 2556 if (err)
2587 goto ex_put; 2557 goto ex_put;
2588 2558
@@ -2591,7 +2561,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
2591 if (err) 2561 if (err)
2592 goto ex_rem; 2562 goto ex_rem;
2593 } else { 2563 } else {
2594 err = rem_mcg_res(dev, slave, rqp, gid, prot); 2564 err = rem_mcg_res(dev, slave, rqp, gid, prot, type);
2595 if (err) 2565 if (err)
2596 goto ex_put; 2566 goto ex_put;
2597 err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); 2567 err = mlx4_qp_detach_common(dev, &qp, gid, prot, type);
@@ -2602,7 +2572,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
2602 2572
2603ex_rem: 2573ex_rem:
2604 /* ignore error return below, already in error */ 2574 /* ignore error return below, already in error */
2605 err1 = rem_mcg_res(dev, slave, rqp, gid, prot); 2575 err1 = rem_mcg_res(dev, slave, rqp, gid, prot, type);
2606ex_put: 2576ex_put:
2607 put_res(dev, slave, qpn, RES_QP); 2577 put_res(dev, slave, qpn, RES_QP);
2608 2578
@@ -2641,7 +2611,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) { 2611 list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) {
2642 qp.qpn = rqp->local_qpn; 2612 qp.qpn = rqp->local_qpn;
2643 err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, 2613 err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot,
2644 MLX4_MC_STEER); 2614 rgid->steer);
2645 list_del(&rgid->list); 2615 list_del(&rgid->list);
2646 kfree(rgid); 2616 kfree(rgid);
2647 } 2617 }