Lines Matching defs:slave

300 static void rem_slave_vlans(struct mlx4_dev *dev, int slave);
301 static inline int mlx4_grant_resource(struct mlx4_dev *dev, int slave,
313 res_alloc->allocated[(port - 1) * (dev->num_vfs + 1) + slave] :
314 res_alloc->allocated[slave];
319 guaranteed = res_alloc->guaranteed[slave];
321 if (allocated + count > res_alloc->quota[slave])
340 res_alloc->allocated[(port - 1) * (dev->num_vfs + 1) + slave] += count;
343 res_alloc->allocated[slave] += count;
354 static inline void mlx4_release_resource(struct mlx4_dev *dev, int slave,
364 res_alloc->allocated[(port - 1) * (dev->num_vfs + 1) + slave] -= count;
367 res_alloc->allocated[slave] -= count;
585 static void update_pkey_index(struct mlx4_dev *dev, int slave,
596 new_index = priv->virt2phys_pkey[slave][port - 1][orig_index];
601 u8 slave)
611 qp_ctx->pri_path.mgid_index = mlx4_get_base_gid_ix(dev, slave) | 0x80;
613 qp_ctx->pri_path.mgid_index = 0x80 | slave;
619 qp_ctx->pri_path.mgid_index += mlx4_get_base_gid_ix(dev, slave);
622 qp_ctx->pri_path.mgid_index = slave & 0x7F;
628 qp_ctx->alt_path.mgid_index += mlx4_get_base_gid_ix(dev, slave);
631 qp_ctx->alt_path.mgid_index = slave & 0x7F;
637 static int check_counter_index_validity(struct mlx4_dev *dev, int slave, int port, int idx)
642 if (slave == 0) {
652 &priv->counters_table.vf_list[slave - 1][port - 1],
663 u8 slave, u32 qpn)
673 vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port];
678 if (check_counter_index_validity(dev, slave, port,
683 mlx4_dbg(dev, "%s: QP counter_index %d for slave %d port %d\n",
684 __func__, qpc->pri_path.counter_index, slave, port);
749 static int get_res(struct mlx4_dev *dev, int slave, u64 res_id,
768 if (r->owner != slave) {
786 u64 res_id, int *slave)
799 *slave = r->owner;
807 static void put_res(struct mlx4_dev *dev, int slave, u64 res_id,
954 static struct res_common *alloc_tr(u64 id, enum mlx4_resource type, int slave,
994 ret->owner = slave;
999 static int add_res_range(struct mlx4_dev *dev, int slave, u64 base, int count,
1014 res_arr[i] = alloc_tr(base + i, type, slave, extra);
1034 &tracker->slave_list[slave].res_list[type]);
1186 static int rem_res_range(struct mlx4_dev *dev, int slave, u64 base, int count,
1202 if (r->owner != slave) {
1225 static int qp_res_start_move_to(struct mlx4_dev *dev, int slave, int qpn,
1238 else if (r->com.owner != slave)
1290 static int mr_res_start_move_to(struct mlx4_dev *dev, int slave, int index,
1302 else if (r->com.owner != slave)
1343 static int eq_res_start_move_to(struct mlx4_dev *dev, int slave, int index,
1355 else if (r->com.owner != slave)
1391 static int cq_res_start_move_to(struct mlx4_dev *dev, int slave, int cqn,
1403 else if (r->com.owner != slave)
1445 static int srq_res_start_move_to(struct mlx4_dev *dev, int slave, int index,
1457 else if (r->com.owner != slave)
1495 static void res_abort_move(struct mlx4_dev *dev, int slave,
1504 if (r && (r->owner == slave))
1509 static void res_end_move(struct mlx4_dev *dev, int slave,
1518 if (r && (r->owner == slave))
1523 static int valid_reserved(struct mlx4_dev *dev, int slave, int qpn)
1526 (mlx4_is_master(dev) || mlx4_is_guest_proxy(dev, slave, qpn));
1534 static int qp_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1549 err = mlx4_grant_resource(dev, slave, RES_QP, count, 0);
1555 mlx4_release_resource(dev, slave, RES_QP, count, 0);
1559 err = add_res_range(dev, slave, base, count, RES_QP, 0);
1561 mlx4_release_resource(dev, slave, RES_QP, count, 0);
1569 if (valid_reserved(dev, slave, qpn)) {
1570 err = add_res_range(dev, slave, qpn, 1, RES_QP, 0);
1575 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_MAPPED,
1583 res_abort_move(dev, slave, RES_QP, qpn);
1588 res_end_move(dev, slave, RES_QP, qpn);
1598 static int mtt_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1610 err = mlx4_grant_resource(dev, slave, RES_MTT, 1 << order, 0);
1616 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0);
1620 err = add_res_range(dev, slave, base, 1, RES_MTT, order);
1622 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0);
1630 static int mpt_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1640 err = mlx4_grant_resource(dev, slave, RES_MPT, 1, 0);
1646 mlx4_release_resource(dev, slave, RES_MPT, 1, 0);
1651 err = add_res_range(dev, slave, id, 1, RES_MPT, index);
1653 mlx4_release_resource(dev, slave, RES_MPT, 1, 0);
1662 err = mr_res_start_move_to(dev, slave, id,
1669 res_abort_move(dev, slave, RES_MPT, id);
1673 res_end_move(dev, slave, RES_MPT, id);
1679 static int cq_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1687 err = mlx4_grant_resource(dev, slave, RES_CQ, 1, 0);
1693 mlx4_release_resource(dev, slave, RES_CQ, 1, 0);
1697 err = add_res_range(dev, slave, cqn, 1, RES_CQ, 0);
1699 mlx4_release_resource(dev, slave, RES_CQ, 1, 0);
1714 static int srq_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1722 err = mlx4_grant_resource(dev, slave, RES_SRQ, 1, 0);
1728 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0);
1732 err = add_res_range(dev, slave, srqn, 1, RES_SRQ, 0);
1734 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0);
1749 static int mac_find_smac_ix_in_slave(struct mlx4_dev *dev, int slave, int port,
1755 &tracker->slave_list[slave].res_list[RES_MAC];
1767 static int mac_add_to_slave(struct mlx4_dev *dev, int slave, u64 mac, int port, u8 smac_index)
1772 &tracker->slave_list[slave].res_list[RES_MAC];
1783 if (mlx4_grant_resource(dev, slave, RES_MAC, 1, port))
1787 mlx4_release_resource(dev, slave, RES_MAC, 1, port);
1795 &tracker->slave_list[slave].res_list[RES_MAC]);
1800 static void mac_del_from_slave(struct mlx4_dev *dev, int slave, u64 mac,
1806 &tracker->slave_list[slave].res_list[RES_MAC];
1813 mlx4_release_resource(dev, slave, RES_MAC, 1, port);
1821 static void rem_slave_macs(struct mlx4_dev *dev, int slave)
1826 &tracker->slave_list[slave].res_list[RES_MAC];
1832 /* dereference the mac the num times the slave referenced it */
1835 mlx4_release_resource(dev, slave, RES_MAC, 1, res->port);
1840 static int mac_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1862 err = mac_add_to_slave(dev, slave, mac, port, smac_index);
1869 static int vlan_add_to_slave(struct mlx4_dev *dev, int slave, u16 vlan,
1875 &tracker->slave_list[slave].res_list[RES_VLAN];
1886 if (mlx4_grant_resource(dev, slave, RES_VLAN, 1, port))
1890 mlx4_release_resource(dev, slave, RES_VLAN, 1, port);
1898 &tracker->slave_list[slave].res_list[RES_VLAN]);
1903 static void vlan_del_from_slave(struct mlx4_dev *dev, int slave, u16 vlan,
1909 &tracker->slave_list[slave].res_list[RES_VLAN];
1916 mlx4_release_resource(dev, slave, RES_VLAN,
1925 static void rem_slave_vlans(struct mlx4_dev *dev, int slave)
1930 &tracker->slave_list[slave].res_list[RES_VLAN];
1936 /* dereference the vlan the num times the slave referenced it */
1939 mlx4_release_resource(dev, slave, RES_VLAN, 1, res->port);
1944 static int vlan_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1964 slave_state[slave].old_vlan_api = true;
1973 err = vlan_add_to_slave(dev, slave, vlan, port, vlan_index);
1980 static int counter_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1989 err = __mlx4_counter_alloc(dev, slave, port, &index);
1996 static int xrcdn_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2009 err = add_res_range(dev, slave, xrcdn, 1, RES_XRCD, 0);
2018 int mlx4_ALLOC_RES_wrapper(struct mlx4_dev *dev, int slave,
2029 err = qp_alloc_res(dev, slave, vhcr->op_modifier, alop,
2034 err = mtt_alloc_res(dev, slave, vhcr->op_modifier, alop,
2039 err = mpt_alloc_res(dev, slave, vhcr->op_modifier, alop,
2044 err = cq_alloc_res(dev, slave, vhcr->op_modifier, alop,
2049 err = srq_alloc_res(dev, slave, vhcr->op_modifier, alop,
2054 err = mac_alloc_res(dev, slave, vhcr->op_modifier, alop,
2060 err = vlan_alloc_res(dev, slave, vhcr->op_modifier, alop,
2066 err = counter_alloc_res(dev, slave, vhcr->op_modifier, alop,
2072 err = xrcdn_alloc_res(dev, slave, vhcr->op_modifier, alop,
2084 static int qp_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2096 err = rem_res_range(dev, slave, base, count, RES_QP, 0);
2099 mlx4_release_resource(dev, slave, RES_QP, count, 0);
2104 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_RESERVED,
2112 res_end_move(dev, slave, RES_QP, qpn);
2114 if (valid_reserved(dev, slave, qpn))
2115 err = rem_res_range(dev, slave, qpn, 1, RES_QP, 0);
2124 static int mtt_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2136 err = rem_res_range(dev, slave, base, 1, RES_MTT, order);
2138 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0);
2144 static int mpt_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2156 err = get_res(dev, slave, id, RES_MPT, &mpt);
2160 put_res(dev, slave, id, RES_MPT);
2162 err = rem_res_range(dev, slave, id, 1, RES_MPT, 0);
2165 mlx4_release_resource(dev, slave, RES_MPT, 1, 0);
2171 err = mr_res_start_move_to(dev, slave, id,
2177 res_end_move(dev, slave, RES_MPT, id);
2187 static int cq_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2196 err = rem_res_range(dev, slave, cqn, 1, RES_CQ, 0);
2200 mlx4_release_resource(dev, slave, RES_CQ, 1, 0);
2212 static int srq_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2221 err = rem_res_range(dev, slave, srqn, 1, RES_SRQ, 0);
2225 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0);
2237 static int mac_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2246 mac_del_from_slave(dev, slave, in_param, port);
2258 static int vlan_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2267 if (slave_state[slave].old_vlan_api == true)
2271 vlan_del_from_slave(dev, slave, in_param, port);
2282 static int counter_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2292 __mlx4_counter_free(dev, slave, port, index);
2297 static int xrcdn_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2307 err = rem_res_range(dev, slave, xrcdn, 1, RES_XRCD, 0);
2316 int mlx4_FREE_RES_wrapper(struct mlx4_dev *dev, int slave,
2327 err = qp_free_res(dev, slave, vhcr->op_modifier, alop,
2332 err = mtt_free_res(dev, slave, vhcr->op_modifier, alop,
2337 err = mpt_free_res(dev, slave, vhcr->op_modifier, alop,
2342 err = cq_free_res(dev, slave, vhcr->op_modifier, alop,
2347 err = srq_free_res(dev, slave, vhcr->op_modifier, alop,
2352 err = mac_free_res(dev, slave, vhcr->op_modifier, alop,
2358 err = vlan_free_res(dev, slave, vhcr->op_modifier, alop,
2364 err = counter_free_res(dev, slave, vhcr->op_modifier, alop,
2370 err = xrcdn_free_res(dev, slave, vhcr->op_modifier, alop,
2452 static int check_mtt_range(struct mlx4_dev *dev, int slave, int start,
2463 int mlx4_SW2HW_MPT_wrapper(struct mlx4_dev *dev, int slave,
2480 err = mr_res_start_move_to(dev, slave, id, RES_MPT_HW, &mpt);
2492 /* Make sure that the PD bits related to the slave id are zeros. */
2495 if (pd_slave != 0 && pd_slave != slave) {
2501 /* FMR and Bind Enable are forbidden in slave devices. */
2515 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
2519 err = check_mtt_range(dev, slave, mtt_base,
2527 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2533 put_res(dev, slave, mtt->com.res_id, RES_MTT);
2536 res_end_move(dev, slave, RES_MPT, id);
2541 put_res(dev, slave, mtt->com.res_id, RES_MTT);
2543 res_abort_move(dev, slave, RES_MPT, id);
2548 int mlx4_HW2SW_MPT_wrapper(struct mlx4_dev *dev, int slave,
2560 err = mr_res_start_move_to(dev, slave, id, RES_MPT_MAPPED, &mpt);
2564 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2571 res_end_move(dev, slave, RES_MPT, id);
2575 res_abort_move(dev, slave, RES_MPT, id);
2580 int mlx4_QUERY_MPT_wrapper(struct mlx4_dev *dev, int slave,
2592 err = get_res(dev, slave, id, RES_MPT, &mpt);
2601 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2604 put_res(dev, slave, id, RES_MPT);
2636 int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave,
2658 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_HW, &qp, 0);
2671 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
2675 err = check_mtt_range(dev, slave, mtt_base, mtt_size, mtt);
2679 err = get_res(dev, slave, rcqn, RES_CQ, &rcq);
2684 err = get_res(dev, slave, scqn, RES_CQ, &scq);
2691 err = get_res(dev, slave, srqn, RES_SRQ, &srq);
2697 update_pkey_index(dev, slave, inbox);
2698 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2709 put_res(dev, slave, scqn, RES_CQ);
2713 put_res(dev, slave, srqn, RES_SRQ);
2716 put_res(dev, slave, rcqn, RES_CQ);
2717 put_res(dev, slave, mtt_base, RES_MTT);
2718 res_end_move(dev, slave, RES_QP, qpn);
2724 put_res(dev, slave, srqn, RES_SRQ);
2727 put_res(dev, slave, scqn, RES_CQ);
2729 put_res(dev, slave, rcqn, RES_CQ);
2731 put_res(dev, slave, mtt_base, RES_MTT);
2733 res_abort_move(dev, slave, RES_QP, qpn);
2770 int mlx4_SW2HW_EQ_wrapper(struct mlx4_dev *dev, int slave,
2778 int res_id = (slave << 8) | eqn;
2785 err = add_res_range(dev, slave, res_id, 1, RES_EQ, 0);
2788 err = eq_res_start_move_to(dev, slave, res_id, RES_EQ_HW, &eq);
2792 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
2796 err = check_mtt_range(dev, slave, mtt_base, mtt_size, mtt);
2800 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2806 put_res(dev, slave, mtt->com.res_id, RES_MTT);
2807 res_end_move(dev, slave, RES_EQ, res_id);
2811 put_res(dev, slave, mtt->com.res_id, RES_MTT);
2813 res_abort_move(dev, slave, RES_EQ, res_id);
2815 rem_res_range(dev, slave, res_id, 1, RES_EQ, 0);
2819 static int get_containing_mtt(struct mlx4_dev *dev, int slave, int start,
2828 list_for_each_entry(mtt, &tracker->slave_list[slave].res_list[RES_MTT],
2830 if (!check_mtt_range(dev, slave, start, len, mtt)) {
2845 enum qp_transition transition, u8 slave)
2866 if (slave != mlx4_master_func_num(dev))
2870 num_gids = mlx4_get_slave_num_gids(dev, slave);
2879 num_gids = mlx4_get_slave_num_gids(dev, slave);
2898 int mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave,
2913 err = get_containing_mtt(dev, slave, start, npages, &rmtt);
2931 put_res(dev, slave, rmtt->com.res_id, RES_MTT);
2936 int mlx4_HW2SW_EQ_wrapper(struct mlx4_dev *dev, int slave,
2943 int res_id = eqn | (slave << 8);
2947 err = eq_res_start_move_to(dev, slave, res_id, RES_EQ_RESERVED, &eq);
2951 err = get_res(dev, slave, eq->mtt->com.res_id, RES_MTT, NULL);
2955 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2960 put_res(dev, slave, eq->mtt->com.res_id, RES_MTT);
2961 res_end_move(dev, slave, RES_EQ, res_id);
2962 rem_res_range(dev, slave, res_id, 1, RES_EQ, 0);
2967 put_res(dev, slave, eq->mtt->com.res_id, RES_MTT);
2969 res_abort_move(dev, slave, RES_EQ, res_id);
2974 int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe)
2987 /* check for slave valid, slave not PF, and slave active */
2988 if (slave < 0 || slave >= dev->num_slaves ||
2989 slave == dev->caps.function ||
2990 !priv->mfunc.master.slave_state[slave].active)
2993 event_eq = &priv->mfunc.master.slave_state[slave].event_eq[eqe->type];
2995 /* Create the event only if the slave is registered */
2999 mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]);
3000 res_id = (slave << 8) | event_eq->eqn;
3001 err = get_res(dev, slave, res_id, RES_EQ, &req);
3023 in_modifier = (slave & 0xff) | ((event_eq->eqn & 0xff) << 16);
3029 put_res(dev, slave, res_id, RES_EQ);
3030 mutex_unlock(&priv->mfunc.master.gen_eqe_mutex[slave]);
3035 put_res(dev, slave, res_id, RES_EQ);
3038 mutex_unlock(&priv->mfunc.master.gen_eqe_mutex[slave]);
3042 int mlx4_QUERY_EQ_wrapper(struct mlx4_dev *dev, int slave,
3049 int res_id = eqn | (slave << 8);
3053 err = get_res(dev, slave, res_id, RES_EQ, &eq);
3062 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3065 put_res(dev, slave, res_id, RES_EQ);
3069 int mlx4_SW2HW_CQ_wrapper(struct mlx4_dev *dev, int slave,
3082 err = cq_res_start_move_to(dev, slave, cqn, RES_CQ_HW, &cq);
3085 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3088 err = check_mtt_range(dev, slave, mtt_base, cq_get_mtt_size(cqc), mtt);
3091 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3096 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3097 res_end_move(dev, slave, RES_CQ, cqn);
3101 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3103 res_abort_move(dev, slave, RES_CQ, cqn);
3107 int mlx4_HW2SW_CQ_wrapper(struct mlx4_dev *dev, int slave,
3117 err = cq_res_start_move_to(dev, slave, cqn, RES_CQ_ALLOCATED, &cq);
3120 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3124 res_end_move(dev, slave, RES_CQ, cqn);
3128 res_abort_move(dev, slave, RES_CQ, cqn);
3132 int mlx4_QUERY_CQ_wrapper(struct mlx4_dev *dev, int slave,
3142 err = get_res(dev, slave, cqn, RES_CQ, &cq);
3149 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3151 put_res(dev, slave, cqn, RES_CQ);
3156 static int handle_resize(struct mlx4_dev *dev, int slave,
3169 err = get_res(dev, slave, cq->mtt->com.res_id, RES_MTT, &orig_mtt);
3178 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3182 err = check_mtt_range(dev, slave, mtt_base, cq_get_mtt_size(cqc), mtt);
3185 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3189 put_res(dev, slave, orig_mtt->com.res_id, RES_MTT);
3192 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3196 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3198 put_res(dev, slave, orig_mtt->com.res_id, RES_MTT);
3204 int mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave,
3214 err = get_res(dev, slave, cqn, RES_CQ, &cq);
3222 err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq);
3226 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3228 put_res(dev, slave, cqn, RES_CQ);
3245 int mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3261 err = srq_res_start_move_to(dev, slave, srqn, RES_SRQ_HW, &srq);
3264 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3267 err = check_mtt_range(dev, slave, mtt_base, srq_get_mtt_size(srqc),
3272 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3278 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3279 res_end_move(dev, slave, RES_SRQ, srqn);
3283 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3285 res_abort_move(dev, slave, RES_SRQ, srqn);
3290 int mlx4_HW2SW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3300 err = srq_res_start_move_to(dev, slave, srqn, RES_SRQ_ALLOCATED, &srq);
3303 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3309 res_end_move(dev, slave, RES_SRQ, srqn);
3314 res_abort_move(dev, slave, RES_SRQ, srqn);
3319 int mlx4_QUERY_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3329 err = get_res(dev, slave, srqn, RES_SRQ, &srq);
3336 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3338 put_res(dev, slave, srqn, RES_SRQ);
3342 int mlx4_ARM_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3352 err = get_res(dev, slave, srqn, RES_SRQ, &srq);
3361 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3363 put_res(dev, slave, srqn, RES_SRQ);
3367 int mlx4_GEN_QP_wrapper(struct mlx4_dev *dev, int slave,
3377 err = get_res(dev, slave, qpn, RES_QP, &qp);
3385 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3387 put_res(dev, slave, qpn, RES_QP);
3391 int mlx4_INIT2INIT_QP_wrapper(struct mlx4_dev *dev, int slave,
3399 update_pkey_index(dev, slave, inbox);
3400 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3403 static int roce_verify_mac(struct mlx4_dev *dev, int slave,
3416 if (mac_find_smac_ix_in_slave(dev, slave, port, smac_ix, &mac))
3422 int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave,
3440 err = verify_qp_parameters(dev, inbox, QP_TRANS_INIT2RTR, slave);
3444 if (roce_verify_mac(dev, slave, qpc, inbox))
3447 update_pkey_index(dev, slave, inbox);
3448 update_gid(dev, inbox, (u8)slave);
3452 err = get_res(dev, slave, qpn, RES_QP, &qp);
3462 err = update_vport_qp_param(dev, inbox, slave, qpn);
3467 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3482 put_res(dev, slave, qpn, RES_QP);
3486 int mlx4_RTR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3495 err = verify_qp_parameters(dev, inbox, QP_TRANS_RTR2RTS, slave);
3499 update_pkey_index(dev, slave, inbox);
3500 update_gid(dev, inbox, (u8)slave);
3502 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3505 int mlx4_RTS2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3514 err = verify_qp_parameters(dev, inbox, QP_TRANS_RTS2RTS, slave);
3518 update_pkey_index(dev, slave, inbox);
3519 update_gid(dev, inbox, (u8)slave);
3521 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3525 int mlx4_SQERR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3533 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3536 int mlx4_SQD2SQD_QP_wrapper(struct mlx4_dev *dev, int slave,
3545 err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2SQD, slave);
3550 update_gid(dev, inbox, (u8)slave);
3551 update_pkey_index(dev, slave, inbox);
3552 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3555 int mlx4_SQD2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3564 err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2RTS, slave);
3569 update_gid(dev, inbox, (u8)slave);
3570 update_pkey_index(dev, slave, inbox);
3571 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3574 int mlx4_2RST_QP_wrapper(struct mlx4_dev *dev, int slave,
3584 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_MAPPED, &qp, 0);
3587 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3596 res_end_move(dev, slave, RES_QP, qpn);
3600 res_abort_move(dev, slave, RES_QP, qpn);
3605 static struct res_gid *find_gid(struct mlx4_dev *dev, int slave,
3617 static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
3629 if (find_gid(dev, slave, rqp, gid)) {
3645 static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
3653 res = find_gid(dev, slave, rqp, gid);
3698 int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
3717 err = get_res(dev, slave, qpn, RES_QP, &rqp);
3729 err = add_mcg_res(dev, slave, rqp, gid, prot, type, reg_id);
3733 err = rem_mcg_res(dev, slave, rqp, gid, prot, type, &reg_id);
3742 put_res(dev, slave, qpn, RES_QP);
3748 put_res(dev, slave, qpn, RES_QP);
3756 static int validate_eth_header_mac(int slave, struct _rule_hw *eth_header,
3771 eth_header->eth.dst_mac, slave);
3781 static int add_eth_header(struct mlx4_dev *dev, int slave,
3837 int mlx4_QP_FLOW_STEERING_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
3846 struct list_head *rlist = &tracker->slave_list[slave].res_list[RES_MAC];
3860 err = get_res(dev, slave, qpn, RES_QP, &rqp);
3870 if (validate_eth_header_mac(slave, rule_header, rlist)) {
3881 if (add_eth_header(dev, slave, inbox, rlist, header_id)) {
3901 err = add_res_range(dev, slave, vhcr->out_param, 1, RES_FS_RULE, qpn);
3912 put_res(dev, slave, qpn, RES_QP);
3916 int mlx4_QP_FLOW_STEERING_DETACH_wrapper(struct mlx4_dev *dev, int slave,
3930 err = get_res(dev, slave, vhcr->in_param, RES_FS_RULE, &rrule);
3934 put_res(dev, slave, vhcr->in_param, RES_FS_RULE);
3935 err = get_res(dev, slave, rrule->qpn, RES_QP, &rqp);
3943 err = rem_res_range(dev, slave, vhcr->in_param, 1, RES_FS_RULE,
3954 put_res(dev, slave, rrule->qpn, RES_QP);
3962 int mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave,
3970 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3975 static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp)
3997 static int _move_all_busy(struct mlx4_dev *dev, int slave,
4003 struct list_head *rlist = &tracker->slave_list[slave].res_list[type];
4011 if (r->owner == slave) {
4033 static int move_all_busy(struct mlx4_dev *dev, int slave,
4041 busy = _move_all_busy(dev, slave, type, 0);
4049 busy = _move_all_busy(dev, slave, type, 1);
4053 static void rem_slave_qps(struct mlx4_dev *dev, int slave)
4058 &tracker->slave_list[slave].res_list[RES_QP];
4066 err = move_all_busy(dev, slave, RES_QP);
4069 "for slave %d\n", slave);
4074 if (qp->com.owner == slave) {
4076 detach_qp(dev, slave, qp);
4086 if (!valid_reserved(dev, slave, qpn)) {
4088 mlx4_release_resource(dev, slave,
4095 if (!valid_reserved(dev, slave, qpn))
4100 in_param = slave;
4108 " to move slave %d qpn %d to"
4109 " reset\n", slave,
4128 static void rem_slave_srqs(struct mlx4_dev *dev, int slave)
4133 &tracker->slave_list[slave].res_list[RES_SRQ];
4142 err = move_all_busy(dev, slave, RES_SRQ);
4145 "busy for slave %d\n", slave);
4150 if (srq->com.owner == slave) {
4162 mlx4_release_resource(dev, slave,
4169 in_param = slave;
4176 " to move slave %d srq %d to"
4178 slave, srqn);
4196 static void rem_slave_cqs(struct mlx4_dev *dev, int slave)
4201 &tracker->slave_list[slave].res_list[RES_CQ];
4210 err = move_all_busy(dev, slave, RES_CQ);
4213 "busy for slave %d\n", slave);
4218 if (cq->com.owner == slave && !atomic_read(&cq->ref_count)) {
4230 mlx4_release_resource(dev, slave,
4237 in_param = slave;
4244 " to move slave %d cq %d to"
4246 slave, cqn);
4261 static void rem_slave_mrs(struct mlx4_dev *dev, int slave)
4266 &tracker->slave_list[slave].res_list[RES_MPT];
4275 err = move_all_busy(dev, slave, RES_MPT);
4278 "busy for slave %d\n", slave);
4283 if (mpt->com.owner == slave) {
4295 mlx4_release_resource(dev, slave,
4307 in_param = slave;
4314 " to move slave %d mpt %d to"
4316 slave, mptn);
4331 static void rem_slave_mtts(struct mlx4_dev *dev, int slave)
4337 &tracker->slave_list[slave].res_list[RES_MTT];
4345 err = move_all_busy(dev, slave, RES_MTT);
4348 "busy for slave %d\n", slave);
4353 if (mtt->com.owner == slave) {
4366 mlx4_release_resource(dev, slave, RES_MTT,
4382 static void rem_slave_fs_rule(struct mlx4_dev *dev, int slave)
4388 &tracker->slave_list[slave].res_list[RES_FS_RULE];
4395 err = move_all_busy(dev, slave, RES_FS_RULE);
4397 mlx4_warn(dev, "rem_slave_fs_rule: Could not move all mtts to busy for slave %d\n",
4398 slave);
4403 if (fs_rule->com.owner == slave) {
4434 static void rem_slave_eqs(struct mlx4_dev *dev, int slave)
4439 &tracker->slave_list[slave].res_list[RES_EQ];
4448 err = move_all_busy(dev, slave, RES_EQ);
4451 "busy for slave %d\n", slave);
4456 if (eq->com.owner == slave) {
4477 err = mlx4_cmd_box(dev, slave, 0,
4484 " to move slave %d eqs %d to"
4485 " SW ownership\n", slave, eqn);
4501 static void rem_slave_counters(struct mlx4_dev *dev, int slave)
4503 __mlx4_slave_counters_free(dev, slave);
4506 static void rem_slave_xrcdns(struct mlx4_dev *dev, int slave)
4511 &tracker->slave_list[slave].res_list[RES_XRCD];
4517 err = move_all_busy(dev, slave, RES_XRCD);
4520 "busy for slave %d\n", slave);
4524 if (xrcd->com.owner == slave) {
4535 void mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave)
4539 mutex_lock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex);
4540 rem_slave_macs(dev, slave);
4541 rem_slave_vlans(dev, slave);
4542 rem_slave_fs_rule(dev, slave);
4543 rem_slave_qps(dev, slave);
4544 rem_slave_srqs(dev, slave);
4545 rem_slave_cqs(dev, slave);
4546 rem_slave_mrs(dev, slave);
4547 rem_slave_eqs(dev, slave);
4548 rem_slave_mtts(dev, slave);
4549 rem_slave_counters(dev, slave);
4550 rem_slave_xrcdns(dev, slave);
4551 mutex_unlock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex);
4564 &tracker->slave_list[work->slave].res_list[RES_QP];
4588 mlx4_warn(dev, "Trying to update-qp in slave %d\n",
4589 work->slave);
4611 if (qp->com.owner == work->slave) {
4659 mlx4_info(dev, "UPDATE_QP failed for slave %d, "
4661 work->slave, port, qp->local_qpn,
4672 mlx4_err(dev, "%d UPDATE_QP failures for slave %d, port %d\n",
4673 errors, work->slave, work->port);