Lines Matching refs:slave

306 static void rem_slave_vlans(struct mlx4_dev *dev, int slave);
307 static inline int mlx4_grant_resource(struct mlx4_dev *dev, int slave,
318 if (slave > dev->persist->num_vfs)
324 (dev->persist->num_vfs + 1) + slave] :
325 res_alloc->allocated[slave];
330 guaranteed = res_alloc->guaranteed[slave];
332 if (allocated + count > res_alloc->quota[slave]) {
334 slave, port, resource_str(res_type), count,
335 allocated, res_alloc->quota[slave]);
355 slave, port, resource_str(res_type), free,
363 (dev->persist->num_vfs + 1) + slave] += count;
367 res_alloc->allocated[slave] += count;
378 static inline void mlx4_release_resource(struct mlx4_dev *dev, int slave,
387 if (slave > dev->persist->num_vfs)
394 (dev->persist->num_vfs + 1) + slave] :
395 res_alloc->allocated[slave];
396 guaranteed = res_alloc->guaranteed[slave];
410 (dev->persist->num_vfs + 1) + slave] -= count;
414 res_alloc->allocated[slave] -= count;
691 static void update_pkey_index(struct mlx4_dev *dev, int slave,
702 new_index = priv->virt2phys_pkey[slave][port - 1][orig_index];
707 u8 slave)
718 mlx4_get_base_gid_ix(dev, slave, port) | 0x80;
720 qp_ctx->pri_path.mgid_index = slave | 0x80;
727 mlx4_get_base_gid_ix(dev, slave, port);
730 qp_ctx->pri_path.mgid_index = slave & 0x7F;
737 mlx4_get_base_gid_ix(dev, slave, port);
740 qp_ctx->alt_path.mgid_index = slave & 0x7F;
747 u8 slave, int port);
751 u8 slave, u32 qpn)
761 vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port];
764 err = handle_counter(dev, qpc, slave, port);
891 static int _get_res(struct mlx4_dev *dev, int slave, u64 res_id,
908 func_name, slave, res_id, mlx4_resource_type_to_str(type),
914 if (r->owner != slave) {
931 #define get_res(dev, slave, res_id, type, res) \
932 _get_res((dev), (slave), (res_id), (type), (res), __func__)
936 u64 res_id, int *slave)
949 *slave = r->owner;
957 static void put_res(struct mlx4_dev *dev, int slave, u64 res_id,
971 static int counter_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
974 static int handle_existing_counter(struct mlx4_dev *dev, u8 slave, int port,
986 if (!r || r->owner != slave) {
999 struct mlx4_qp_context *qpc, u8 slave,
1011 &tracker->slave_list[slave].res_list[RES_COUNTER],
1023 err = counter_alloc_res(dev, slave, RES_OP_RESERVE, 0, 0, &counter_idx,
1028 mlx4_err(dev, "%s: failed to create new counter for slave %d err %d\n",
1029 __func__, slave, err);
1032 mlx4_dbg(dev, "%s: alloc new counter for slave %d index %d\n",
1033 __func__, slave, qpc->pri_path.counter_index);
1041 u8 slave, int port)
1044 return handle_existing_counter(dev, slave, port,
1047 return handle_unexisting_counter(dev, qpc, slave, port);
1186 static struct res_common *alloc_tr(u64 id, enum mlx4_resource type, int slave,
1226 ret->owner = slave;
1231 int mlx4_calc_vf_counters(struct mlx4_dev *dev, int slave, int port,
1250 &tracker->slave_list[slave].res_list[RES_COUNTER],
1278 static int add_res_range(struct mlx4_dev *dev, int slave, u64 base, int count,
1293 res_arr[i] = alloc_tr(base + i, type, slave, extra);
1313 &tracker->slave_list[slave].res_list[type]);
1465 static int rem_res_range(struct mlx4_dev *dev, int slave, u64 base, int count,
1481 if (r->owner != slave) {
1504 static int qp_res_start_move_to(struct mlx4_dev *dev, int slave, int qpn,
1517 else if (r->com.owner != slave)
1569 static int mr_res_start_move_to(struct mlx4_dev *dev, int slave, int index,
1581 else if (r->com.owner != slave)
1622 static int eq_res_start_move_to(struct mlx4_dev *dev, int slave, int index,
1634 else if (r->com.owner != slave)
1671 static int cq_res_start_move_to(struct mlx4_dev *dev, int slave, int cqn,
1683 } else if (r->com.owner != slave) {
1711 static int srq_res_start_move_to(struct mlx4_dev *dev, int slave, int index,
1723 } else if (r->com.owner != slave) {
1747 static void res_abort_move(struct mlx4_dev *dev, int slave,
1756 if (r && (r->owner == slave))
1761 static void res_end_move(struct mlx4_dev *dev, int slave,
1770 if (r && (r->owner == slave))
1775 static int valid_reserved(struct mlx4_dev *dev, int slave, int qpn)
1778 (mlx4_is_master(dev) || mlx4_is_guest_proxy(dev, slave, qpn));
1786 static int qp_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1800 * slave tries to set.
1804 err = mlx4_grant_resource(dev, slave, RES_QP, count, 0);
1810 mlx4_release_resource(dev, slave, RES_QP, count, 0);
1814 err = add_res_range(dev, slave, base, count, RES_QP, 0);
1816 mlx4_release_resource(dev, slave, RES_QP, count, 0);
1824 if (valid_reserved(dev, slave, qpn)) {
1825 err = add_res_range(dev, slave, qpn, 1, RES_QP, 0);
1830 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_MAPPED,
1838 res_abort_move(dev, slave, RES_QP, qpn);
1843 res_end_move(dev, slave, RES_QP, qpn);
1853 static int mtt_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1865 err = mlx4_grant_resource(dev, slave, RES_MTT, 1 << order, 0);
1871 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0);
1875 err = add_res_range(dev, slave, base, 1, RES_MTT, order);
1877 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0);
1886 static int mpt_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1896 err = mlx4_grant_resource(dev, slave, RES_MPT, 1, 0);
1902 mlx4_release_resource(dev, slave, RES_MPT, 1, 0);
1907 err = add_res_range(dev, slave, id, 1, RES_MPT, index);
1909 mlx4_release_resource(dev, slave, RES_MPT, 1, 0);
1918 err = mr_res_start_move_to(dev, slave, id,
1925 res_abort_move(dev, slave, RES_MPT, id);
1929 res_end_move(dev, slave, RES_MPT, id);
1935 static int cq_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1943 err = mlx4_grant_resource(dev, slave, RES_CQ, 1, 0);
1949 mlx4_release_resource(dev, slave, RES_CQ, 1, 0);
1953 err = add_res_range(dev, slave, cqn, 1, RES_CQ, 0);
1955 mlx4_release_resource(dev, slave, RES_CQ, 1, 0);
1970 static int srq_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1978 err = mlx4_grant_resource(dev, slave, RES_SRQ, 1, 0);
1984 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0);
1988 err = add_res_range(dev, slave, srqn, 1, RES_SRQ, 0);
1990 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0);
2005 static int mac_find_smac_ix_in_slave(struct mlx4_dev *dev, int slave, int port,
2011 &tracker->slave_list[slave].res_list[RES_MAC];
2023 static int mac_add_to_slave(struct mlx4_dev *dev, int slave, u64 mac, int port, u8 smac_index)
2028 &tracker->slave_list[slave].res_list[RES_MAC];
2039 if (mlx4_grant_resource(dev, slave, RES_MAC, 1, port))
2043 mlx4_release_resource(dev, slave, RES_MAC, 1, port);
2051 &tracker->slave_list[slave].res_list[RES_MAC]);
2055 static void mac_del_from_slave(struct mlx4_dev *dev, int slave, u64 mac,
2061 &tracker->slave_list[slave].res_list[RES_MAC];
2068 mlx4_release_resource(dev, slave, RES_MAC, 1, port);
2076 static void rem_slave_macs(struct mlx4_dev *dev, int slave)
2081 &tracker->slave_list[slave].res_list[RES_MAC];
2087 /* dereference the mac the num times the slave referenced it */
2090 mlx4_release_resource(dev, slave, RES_MAC, 1, res->port);
2095 static int mac_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2108 dev, slave, port);
2122 err = mac_add_to_slave(dev, slave, mac, port, smac_index);
2129 static int vlan_add_to_slave(struct mlx4_dev *dev, int slave, u16 vlan,
2135 &tracker->slave_list[slave].res_list[RES_VLAN];
2146 if (mlx4_grant_resource(dev, slave, RES_VLAN, 1, port))
2150 mlx4_release_resource(dev, slave, RES_VLAN, 1, port);
2158 &tracker->slave_list[slave].res_list[RES_VLAN]);
2163 static void vlan_del_from_slave(struct mlx4_dev *dev, int slave, u16 vlan,
2169 &tracker->slave_list[slave].res_list[RES_VLAN];
2176 mlx4_release_resource(dev, slave, RES_VLAN,
2185 static void rem_slave_vlans(struct mlx4_dev *dev, int slave)
2190 &tracker->slave_list[slave].res_list[RES_VLAN];
2196 /* dereference the vlan the num times the slave referenced it */
2199 mlx4_release_resource(dev, slave, RES_VLAN, 1, res->port);
2204 static int vlan_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2220 dev, slave, port);
2226 slave_state[slave].old_vlan_api = true;
2235 err = vlan_add_to_slave(dev, slave, vlan, port, vlan_index);
2242 static int counter_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2251 err = mlx4_grant_resource(dev, slave, RES_COUNTER, 1, 0);
2257 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0);
2261 err = add_res_range(dev, slave, index, 1, RES_COUNTER, port);
2264 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0);
2272 static int xrcdn_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2285 err = add_res_range(dev, slave, xrcdn, 1, RES_XRCD, 0);
2294 int mlx4_ALLOC_RES_wrapper(struct mlx4_dev *dev, int slave,
2305 err = qp_alloc_res(dev, slave, vhcr->op_modifier, alop,
2310 err = mtt_alloc_res(dev, slave, vhcr->op_modifier, alop,
2315 err = mpt_alloc_res(dev, slave, vhcr->op_modifier, alop,
2320 err = cq_alloc_res(dev, slave, vhcr->op_modifier, alop,
2325 err = srq_alloc_res(dev, slave, vhcr->op_modifier, alop,
2330 err = mac_alloc_res(dev, slave, vhcr->op_modifier, alop,
2336 err = vlan_alloc_res(dev, slave, vhcr->op_modifier, alop,
2342 err = counter_alloc_res(dev, slave, vhcr->op_modifier, alop,
2347 err = xrcdn_alloc_res(dev, slave, vhcr->op_modifier, alop,
2359 static int qp_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2371 err = rem_res_range(dev, slave, base, count, RES_QP, 0);
2374 mlx4_release_resource(dev, slave, RES_QP, count, 0);
2379 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_RESERVED,
2387 res_end_move(dev, slave, RES_QP, qpn);
2389 if (valid_reserved(dev, slave, qpn))
2390 err = rem_res_range(dev, slave, qpn, 1, RES_QP, 0);
2399 static int mtt_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2411 err = rem_res_range(dev, slave, base, 1, RES_MTT, order);
2413 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0);
2419 static int mpt_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2431 err = get_res(dev, slave, id, RES_MPT, &mpt);
2435 put_res(dev, slave, id, RES_MPT);
2437 err = rem_res_range(dev, slave, id, 1, RES_MPT, 0);
2440 mlx4_release_resource(dev, slave, RES_MPT, 1, 0);
2446 err = mr_res_start_move_to(dev, slave, id,
2452 res_end_move(dev, slave, RES_MPT, id);
2461 static int cq_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2470 err = rem_res_range(dev, slave, cqn, 1, RES_CQ, 0);
2474 mlx4_release_resource(dev, slave, RES_CQ, 1, 0);
2486 static int srq_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2495 err = rem_res_range(dev, slave, srqn, 1, RES_SRQ, 0);
2499 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0);
2511 static int mac_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2521 dev, slave, port);
2525 mac_del_from_slave(dev, slave, in_param, port);
2537 static int vlan_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2545 dev, slave, port);
2551 if (slave_state[slave].old_vlan_api)
2555 vlan_del_from_slave(dev, slave, in_param, port);
2566 static int counter_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2579 err = rem_res_range(dev, slave, index, 1, RES_COUNTER, 0);
2584 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0);
2589 static int xrcdn_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2599 err = rem_res_range(dev, slave, xrcdn, 1, RES_XRCD, 0);
2608 int mlx4_FREE_RES_wrapper(struct mlx4_dev *dev, int slave,
2619 err = qp_free_res(dev, slave, vhcr->op_modifier, alop,
2624 err = mtt_free_res(dev, slave, vhcr->op_modifier, alop,
2629 err = mpt_free_res(dev, slave, vhcr->op_modifier, alop,
2634 err = cq_free_res(dev, slave, vhcr->op_modifier, alop,
2639 err = srq_free_res(dev, slave, vhcr->op_modifier, alop,
2644 err = mac_free_res(dev, slave, vhcr->op_modifier, alop,
2650 err = vlan_free_res(dev, slave, vhcr->op_modifier, alop,
2656 err = counter_free_res(dev, slave, vhcr->op_modifier, alop,
2661 err = xrcdn_free_res(dev, slave, vhcr->op_modifier, alop,
2744 static int check_mtt_range(struct mlx4_dev *dev, int slave, int start,
2755 int mlx4_SW2HW_MPT_wrapper(struct mlx4_dev *dev, int slave,
2772 err = mr_res_start_move_to(dev, slave, id, RES_MPT_HW, &mpt);
2782 /* Make sure that the PD bits related to the slave id are zeros. */
2785 if (pd_slave != 0 && --pd_slave != slave) {
2791 /* FMR and Bind Enable are forbidden in slave devices. */
2805 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
2809 err = check_mtt_range(dev, slave, mtt_base,
2817 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2823 put_res(dev, slave, mtt->com.res_id, RES_MTT);
2826 res_end_move(dev, slave, RES_MPT, id);
2831 put_res(dev, slave, mtt->com.res_id, RES_MTT);
2833 res_abort_move(dev, slave, RES_MPT, id);
2838 int mlx4_HW2SW_MPT_wrapper(struct mlx4_dev *dev, int slave,
2850 err = mr_res_start_move_to(dev, slave, id, RES_MPT_MAPPED, &mpt);
2854 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2861 res_end_move(dev, slave, RES_MPT, id);
2865 res_abort_move(dev, slave, RES_MPT, id);
2870 int mlx4_QUERY_MPT_wrapper(struct mlx4_dev *dev, int slave,
2882 err = get_res(dev, slave, id, RES_MPT, &mpt);
2908 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2916 put_res(dev, slave, id, RES_MPT);
2948 static int adjust_qp_sched_queue(struct mlx4_dev *dev, int slave,
2952 int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave,
2974 err = adjust_qp_sched_queue(dev, slave, qpc, inbox);
2978 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_HW, &qp, 0);
2991 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
2995 err = check_mtt_range(dev, slave, mtt_base, mtt_size, mtt);
2999 err = get_res(dev, slave, rcqn, RES_CQ, &rcq);
3004 err = get_res(dev, slave, scqn, RES_CQ, &scq);
3011 err = get_res(dev, slave, srqn, RES_SRQ, &srq);
3017 update_pkey_index(dev, slave, inbox);
3018 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3029 put_res(dev, slave, scqn, RES_CQ);
3033 put_res(dev, slave, srqn, RES_SRQ);
3039 put_res(dev, slave, rcqn, RES_CQ);
3040 put_res(dev, slave, mtt_base, RES_MTT);
3041 res_end_move(dev, slave, RES_QP, qpn);
3047 put_res(dev, slave, srqn, RES_SRQ);
3050 put_res(dev, slave, scqn, RES_CQ);
3052 put_res(dev, slave, rcqn, RES_CQ);
3054 put_res(dev, slave, mtt_base, RES_MTT);
3056 res_abort_move(dev, slave, RES_QP, qpn);
3093 int mlx4_SW2HW_EQ_wrapper(struct mlx4_dev *dev, int slave,
3101 int res_id = (slave << 10) | eqn;
3108 err = add_res_range(dev, slave, res_id, 1, RES_EQ, 0);
3111 err = eq_res_start_move_to(dev, slave, res_id, RES_EQ_HW, &eq);
3115 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3119 err = check_mtt_range(dev, slave, mtt_base, mtt_size, mtt);
3123 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3129 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3130 res_end_move(dev, slave, RES_EQ, res_id);
3134 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3136 res_abort_move(dev, slave, RES_EQ, res_id);
3138 rem_res_range(dev, slave, res_id, 1, RES_EQ, 0);
3142 int mlx4_CONFIG_DEV_wrapper(struct mlx4_dev *dev, int slave,
3154 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3159 static int get_containing_mtt(struct mlx4_dev *dev, int slave, int start,
3168 list_for_each_entry(mtt, &tracker->slave_list[slave].res_list[RES_MTT],
3170 if (!check_mtt_range(dev, slave, start, len, mtt)) {
3186 enum qp_transition transition, u8 slave)
3199 if (slave != mlx4_master_func_num(dev)) {
3216 if (slave != mlx4_master_func_num(dev)) {
3220 num_gids = mlx4_get_slave_num_gids(dev, slave, port);
3229 num_gids = mlx4_get_slave_num_gids(dev, slave, port);
3246 slave != mlx4_master_func_num(dev) &&
3248 !mlx4_vf_smi_enabled(dev, slave, port)) {
3250 mlx4_err(dev, "%s: unprivileged slave %d attempting to create an MLX proxy special QP on port %d\n",
3251 __func__, slave, port);
3263 int mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave,
3278 err = get_containing_mtt(dev, slave, start, npages, &rmtt);
3296 put_res(dev, slave, rmtt->com.res_id, RES_MTT);
3301 int mlx4_HW2SW_EQ_wrapper(struct mlx4_dev *dev, int slave,
3308 int res_id = eqn | (slave << 10);
3312 err = eq_res_start_move_to(dev, slave, res_id, RES_EQ_RESERVED, &eq);
3316 err = get_res(dev, slave, eq->mtt->com.res_id, RES_MTT, NULL);
3320 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3325 put_res(dev, slave, eq->mtt->com.res_id, RES_MTT);
3326 res_end_move(dev, slave, RES_EQ, res_id);
3327 rem_res_range(dev, slave, res_id, 1, RES_EQ, 0);
3332 put_res(dev, slave, eq->mtt->com.res_id, RES_MTT);
3334 res_abort_move(dev, slave, RES_EQ, res_id);
3339 int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe)
3352 /* check for slave valid, slave not PF, and slave active */
3353 if (slave < 0 || slave > dev->persist->num_vfs ||
3354 slave == dev->caps.function ||
3355 !priv->mfunc.master.slave_state[slave].active)
3358 event_eq = &priv->mfunc.master.slave_state[slave].event_eq[eqe->type];
3360 /* Create the event only if the slave is registered */
3364 mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]);
3365 res_id = (slave << 10) | event_eq->eqn;
3366 err = get_res(dev, slave, res_id, RES_EQ, &req);
3388 in_modifier = (slave & 0xff) | ((event_eq->eqn & 0x3ff) << 16);
3394 put_res(dev, slave, res_id, RES_EQ);
3395 mutex_unlock(&priv->mfunc.master.gen_eqe_mutex[slave]);
3400 put_res(dev, slave, res_id, RES_EQ);
3403 mutex_unlock(&priv->mfunc.master.gen_eqe_mutex[slave]);
3407 int mlx4_QUERY_EQ_wrapper(struct mlx4_dev *dev, int slave,
3414 int res_id = eqn | (slave << 10);
3418 err = get_res(dev, slave, res_id, RES_EQ, &eq);
3427 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3430 put_res(dev, slave, res_id, RES_EQ);
3434 int mlx4_SW2HW_CQ_wrapper(struct mlx4_dev *dev, int slave,
3447 err = cq_res_start_move_to(dev, slave, cqn, RES_CQ_HW, &cq);
3450 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3453 err = check_mtt_range(dev, slave, mtt_base, cq_get_mtt_size(cqc), mtt);
3456 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3461 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3462 res_end_move(dev, slave, RES_CQ, cqn);
3466 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3468 res_abort_move(dev, slave, RES_CQ, cqn);
3472 int mlx4_HW2SW_CQ_wrapper(struct mlx4_dev *dev, int slave,
3482 err = cq_res_start_move_to(dev, slave, cqn, RES_CQ_ALLOCATED, &cq);
3485 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3489 res_end_move(dev, slave, RES_CQ, cqn);
3493 res_abort_move(dev, slave, RES_CQ, cqn);
3497 int mlx4_QUERY_CQ_wrapper(struct mlx4_dev *dev, int slave,
3507 err = get_res(dev, slave, cqn, RES_CQ, &cq);
3514 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3516 put_res(dev, slave, cqn, RES_CQ);
3521 static int handle_resize(struct mlx4_dev *dev, int slave,
3534 err = get_res(dev, slave, cq->mtt->com.res_id, RES_MTT, &orig_mtt);
3543 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3547 err = check_mtt_range(dev, slave, mtt_base, cq_get_mtt_size(cqc), mtt);
3550 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3554 put_res(dev, slave, orig_mtt->com.res_id, RES_MTT);
3557 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3561 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3563 put_res(dev, slave, orig_mtt->com.res_id, RES_MTT);
3569 int mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave,
3579 err = get_res(dev, slave, cqn, RES_CQ, &cq);
3587 err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq);
3591 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3593 put_res(dev, slave, cqn, RES_CQ);
3610 int mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3626 err = srq_res_start_move_to(dev, slave, srqn, RES_SRQ_HW, &srq);
3629 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3632 err = check_mtt_range(dev, slave, mtt_base, srq_get_mtt_size(srqc),
3637 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3643 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3644 res_end_move(dev, slave, RES_SRQ, srqn);
3648 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3650 res_abort_move(dev, slave, RES_SRQ, srqn);
3655 int mlx4_HW2SW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3665 err = srq_res_start_move_to(dev, slave, srqn, RES_SRQ_ALLOCATED, &srq);
3668 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3674 res_end_move(dev, slave, RES_SRQ, srqn);
3679 res_abort_move(dev, slave, RES_SRQ, srqn);
3684 int mlx4_QUERY_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3694 err = get_res(dev, slave, srqn, RES_SRQ, &srq);
3701 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3703 put_res(dev, slave, srqn, RES_SRQ);
3707 int mlx4_ARM_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3717 err = get_res(dev, slave, srqn, RES_SRQ, &srq);
3726 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3728 put_res(dev, slave, srqn, RES_SRQ);
3732 int mlx4_GEN_QP_wrapper(struct mlx4_dev *dev, int slave,
3742 err = get_res(dev, slave, qpn, RES_QP, &qp);
3750 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3752 put_res(dev, slave, qpn, RES_QP);
3756 int mlx4_INIT2INIT_QP_wrapper(struct mlx4_dev *dev, int slave,
3764 update_pkey_index(dev, slave, inbox);
3765 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3768 static int adjust_qp_sched_queue(struct mlx4_dev *dev, int slave,
3775 dev, slave, (qpc->pri_path.sched_queue >> 6 & 1) + 1) - 1;
3790 dev, slave, (qpc->alt_path.sched_queue >> 6 & 1)
3801 static int roce_verify_mac(struct mlx4_dev *dev, int slave,
3814 if (mac_find_smac_ix_in_slave(dev, slave, port, smac_ix, &mac))
3820 int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave,
3837 err = adjust_qp_sched_queue(dev, slave, qpc, inbox);
3840 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_INIT2RTR, slave);
3844 if (roce_verify_mac(dev, slave, qpc, inbox))
3847 update_pkey_index(dev, slave, inbox);
3848 update_gid(dev, inbox, (u8)slave);
3852 err = get_res(dev, slave, qpn, RES_QP, &qp);
3860 err = update_vport_qp_param(dev, inbox, slave, qpn);
3864 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3878 put_res(dev, slave, qpn, RES_QP);
3882 int mlx4_RTR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3891 err = adjust_qp_sched_queue(dev, slave, context, inbox);
3894 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTR2RTS, slave);
3898 update_pkey_index(dev, slave, inbox);
3899 update_gid(dev, inbox, (u8)slave);
3901 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3904 int mlx4_RTS2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3913 err = adjust_qp_sched_queue(dev, slave, context, inbox);
3916 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTS2RTS, slave);
3920 update_pkey_index(dev, slave, inbox);
3921 update_gid(dev, inbox, (u8)slave);
3923 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3927 int mlx4_SQERR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3934 int err = adjust_qp_sched_queue(dev, slave, context, inbox);
3938 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3941 int mlx4_SQD2SQD_QP_wrapper(struct mlx4_dev *dev, int slave,
3950 err = adjust_qp_sched_queue(dev, slave, context, inbox);
3953 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2SQD, slave);
3958 update_gid(dev, inbox, (u8)slave);
3959 update_pkey_index(dev, slave, inbox);
3960 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3963 int mlx4_SQD2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3972 err = adjust_qp_sched_queue(dev, slave, context, inbox);
3975 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2RTS, slave);
3980 update_gid(dev, inbox, (u8)slave);
3981 update_pkey_index(dev, slave, inbox);
3982 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3985 int mlx4_2RST_QP_wrapper(struct mlx4_dev *dev, int slave,
3995 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_MAPPED, &qp, 0);
3998 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
4007 res_end_move(dev, slave, RES_QP, qpn);
4011 res_abort_move(dev, slave, RES_QP, qpn);
4016 static struct res_gid *find_gid(struct mlx4_dev *dev, int slave,
4028 static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
4040 if (find_gid(dev, slave, rqp, gid)) {
4056 static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
4064 res = find_gid(dev, slave, rqp, gid);
4078 static int qp_attach(struct mlx4_dev *dev, int slave, struct mlx4_qp *qp,
4084 int port = mlx4_slave_convert_port(dev, slave, gid[5]);
4093 int port = mlx4_slave_convert_port(dev, slave, gid[5]);
4119 static int mlx4_adjust_port(struct mlx4_dev *dev, int slave,
4129 real_port = mlx4_slave_convert_port(dev, slave, gid[5]);
4138 int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
4157 err = get_res(dev, slave, qpn, RES_QP, &rqp);
4163 err = qp_attach(dev, slave, &qp, gid, block_loopback, prot,
4169 err = add_mcg_res(dev, slave, rqp, gid, prot, type, reg_id);
4173 err = mlx4_adjust_port(dev, slave, gid, prot);
4177 err = rem_mcg_res(dev, slave, rqp, gid, prot, type, &reg_id);
4186 put_res(dev, slave, qpn, RES_QP);
4192 put_res(dev, slave, qpn, RES_QP);
4200 static int validate_eth_header_mac(int slave, struct _rule_hw *eth_header,
4215 eth_header->eth.dst_mac, slave);
4225 static int add_eth_header(struct mlx4_dev *dev, int slave,
4284 int mlx4_UPDATE_QP_wrapper(struct mlx4_dev *dev, int slave,
4310 mlx4_warn(dev, "Src check LB for slave %d isn't supported\n",
4311 slave);
4316 err = get_res(dev, slave, qpn, RES_QP, &rqp);
4318 mlx4_err(dev, "Updating qpn 0x%x for slave %d rejected\n", qpn, slave);
4326 err = mac_find_smac_ix_in_slave(dev, slave, port,
4346 put_res(dev, slave, qpn, RES_QP);
4366 int mlx4_QP_FLOW_STEERING_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
4375 struct list_head *rlist = &tracker->slave_list[slave].res_list[RES_MAC];
4390 err = mlx4_slave_convert_port(dev, slave, ctrl->port);
4395 err = get_res(dev, slave, qpn, RES_QP, &rqp);
4408 if (validate_eth_header_mac(slave, rule_header, rlist)) {
4419 if (add_eth_header(dev, slave, inbox, rlist, header_id)) {
4440 err = add_res_range(dev, slave, vhcr->out_param, 1, RES_FS_RULE, qpn);
4446 err = get_res(dev, slave, vhcr->out_param, RES_FS_RULE, &rrule);
4473 put_res(dev, slave, vhcr->out_param, RES_FS_RULE);
4481 put_res(dev, slave, qpn, RES_QP);
4500 int mlx4_QP_FLOW_STEERING_DETACH_wrapper(struct mlx4_dev *dev, int slave,
4516 err = get_res(dev, slave, vhcr->in_param, RES_FS_RULE, &rrule);
4522 put_res(dev, slave, vhcr->in_param, RES_FS_RULE);
4530 put_res(dev, slave, vhcr->in_param, RES_FS_RULE);
4531 err = get_res(dev, slave, qpn, RES_QP, &rqp);
4536 err = get_res(dev, slave, mirr_reg_id, RES_FS_RULE, &rrule);
4540 put_res(dev, slave, mirr_reg_id, RES_FS_RULE);
4544 err = rem_res_range(dev, slave, vhcr->in_param, 1, RES_FS_RULE, 0);
4556 put_res(dev, slave, qpn, RES_QP);
4564 int mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave,
4573 err = get_res(dev, slave, index, RES_COUNTER, NULL);
4577 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
4578 put_res(dev, slave, index, RES_COUNTER);
4582 static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp)
4604 static int _move_all_busy(struct mlx4_dev *dev, int slave,
4610 struct list_head *rlist = &tracker->slave_list[slave].res_list[type];
4618 if (r->owner == slave) {
4640 static int move_all_busy(struct mlx4_dev *dev, int slave,
4648 busy = _move_all_busy(dev, slave, type, 0);
4656 busy = _move_all_busy(dev, slave, type, 1);
4660 static void rem_slave_qps(struct mlx4_dev *dev, int slave)
4665 &tracker->slave_list[slave].res_list[RES_QP];
4673 err = move_all_busy(dev, slave, RES_QP);
4675 mlx4_warn(dev, "rem_slave_qps: Could not move all qps to busy for slave %d\n",
4676 slave);
4681 if (qp->com.owner == slave) {
4683 detach_qp(dev, slave, qp);
4693 if (!valid_reserved(dev, slave, qpn)) {
4695 mlx4_release_resource(dev, slave,
4702 if (!valid_reserved(dev, slave, qpn))
4707 in_param = slave;
4714 mlx4_dbg(dev, "rem_slave_qps: failed to move slave %d qpn %d to reset\n",
4715 slave, qp->local_qpn);
4733 static void rem_slave_srqs(struct mlx4_dev *dev, int slave)
4738 &tracker->slave_list[slave].res_list[RES_SRQ];
4746 err = move_all_busy(dev, slave, RES_SRQ);
4748 mlx4_warn(dev, "rem_slave_srqs: Could not move all srqs - too busy for slave %d\n",
4749 slave);
4754 if (srq->com.owner == slave) {
4766 mlx4_release_resource(dev, slave,
4773 in_param = slave;
4779 mlx4_dbg(dev, "rem_slave_srqs: failed to move slave %d srq %d to SW ownership\n",
4780 slave, srqn);
4798 static void rem_slave_cqs(struct mlx4_dev *dev, int slave)
4803 &tracker->slave_list[slave].res_list[RES_CQ];
4811 err = move_all_busy(dev, slave, RES_CQ);
4813 mlx4_warn(dev, "rem_slave_cqs: Could not move all cqs - too busy for slave %d\n",
4814 slave);
4819 if (cq->com.owner == slave && !atomic_read(&cq->ref_count)) {
4831 mlx4_release_resource(dev, slave,
4838 in_param = slave;
4844 mlx4_dbg(dev, "rem_slave_cqs: failed to move slave %d cq %d to SW ownership\n",
4845 slave, cqn);
4860 static void rem_slave_mrs(struct mlx4_dev *dev, int slave)
4865 &tracker->slave_list[slave].res_list[RES_MPT];
4873 err = move_all_busy(dev, slave, RES_MPT);
4875 mlx4_warn(dev, "rem_slave_mrs: Could not move all mpts - too busy for slave %d\n",
4876 slave);
4881 if (mpt->com.owner == slave) {
4893 mlx4_release_resource(dev, slave,
4905 in_param = slave;
4911 mlx4_dbg(dev, "rem_slave_mrs: failed to move slave %d mpt %d to SW ownership\n",
4912 slave, mptn);
4927 static void rem_slave_mtts(struct mlx4_dev *dev, int slave)
4933 &tracker->slave_list[slave].res_list[RES_MTT];
4940 err = move_all_busy(dev, slave, RES_MTT);
4942 mlx4_warn(dev, "rem_slave_mtts: Could not move all mtts - too busy for slave %d\n",
4943 slave);
4948 if (mtt->com.owner == slave) {
4961 mlx4_release_resource(dev, slave, RES_MTT,
5063 static void rem_slave_fs_rule(struct mlx4_dev *dev, int slave)
5069 &tracker->slave_list[slave].res_list[RES_FS_RULE];
5076 err = move_all_busy(dev, slave, RES_FS_RULE);
5078 mlx4_warn(dev, "rem_slave_fs_rule: Could not move all mtts to busy for slave %d\n",
5079 slave);
5084 if (fs_rule->com.owner == slave) {
5116 static void rem_slave_eqs(struct mlx4_dev *dev, int slave)
5121 &tracker->slave_list[slave].res_list[RES_EQ];
5128 err = move_all_busy(dev, slave, RES_EQ);
5130 mlx4_warn(dev, "rem_slave_eqs: Could not move all eqs - too busy for slave %d\n",
5131 slave);
5136 if (eq->com.owner == slave) {
5152 err = mlx4_cmd(dev, slave, eqn & 0x3ff,
5157 mlx4_dbg(dev, "rem_slave_eqs: failed to move slave %d eqs %d to SW ownership\n",
5158 slave, eqn & 0x3ff);
5173 static void rem_slave_counters(struct mlx4_dev *dev, int slave)
5178 &tracker->slave_list[slave].res_list[RES_COUNTER];
5185 err = move_all_busy(dev, slave, RES_COUNTER);
5187 mlx4_warn(dev, "rem_slave_counters: Could not move all counters - too busy for slave %d\n",
5188 slave);
5200 if (counter->com.owner == slave) {
5212 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0);
5219 static void rem_slave_xrcdns(struct mlx4_dev *dev, int slave)
5224 &tracker->slave_list[slave].res_list[RES_XRCD];
5230 err = move_all_busy(dev, slave, RES_XRCD);
5232 mlx4_warn(dev, "rem_slave_xrcdns: Could not move all xrcdns - too busy for slave %d\n",
5233 slave);
5237 if (xrcd->com.owner == slave) {
5248 void mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave)
5251 mlx4_reset_roce_gids(dev, slave);
5252 mutex_lock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex);
5253 rem_slave_vlans(dev, slave);
5254 rem_slave_macs(dev, slave);
5255 rem_slave_fs_rule(dev, slave);
5256 rem_slave_qps(dev, slave);
5257 rem_slave_srqs(dev, slave);
5258 rem_slave_cqs(dev, slave);
5259 rem_slave_mrs(dev, slave);
5260 rem_slave_eqs(dev, slave);
5261 rem_slave_mtts(dev, slave);
5262 rem_slave_counters(dev, slave);
5263 rem_slave_xrcdns(dev, slave);
5264 mutex_unlock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex);
5284 &tracker->slave_list[work->slave].res_list[RES_QP];
5309 mlx4_warn(dev, "Trying to update-qp in slave %d\n",
5310 work->slave);
5343 if (qp->com.owner == work->slave) {
5399 mlx4_info(dev, "UPDATE_QP failed for slave %d, port %d, qpn %d (%d)\n",
5400 work->slave, port, qp->local_qpn, err);
5410 mlx4_err(dev, "%d UPDATE_QP failures for slave %d, port %d\n",
5411 errors, work->slave, work->port);