Lines Matching refs:slave

304 static void rem_slave_vlans(struct mlx4_dev *dev, int slave);
305 static inline int mlx4_grant_resource(struct mlx4_dev *dev, int slave,
316 if (slave > dev->persist->num_vfs)
322 (dev->persist->num_vfs + 1) + slave] :
323 res_alloc->allocated[slave];
328 guaranteed = res_alloc->guaranteed[slave];
330 if (allocated + count > res_alloc->quota[slave]) {
332 slave, port, resource_str(res_type), count,
333 allocated, res_alloc->quota[slave]);
353 slave, port, resource_str(res_type), free,
361 (dev->persist->num_vfs + 1) + slave] += count;
365 res_alloc->allocated[slave] += count;
376 static inline void mlx4_release_resource(struct mlx4_dev *dev, int slave,
385 if (slave > dev->persist->num_vfs)
392 (dev->persist->num_vfs + 1) + slave] :
393 res_alloc->allocated[slave];
394 guaranteed = res_alloc->guaranteed[slave];
408 (dev->persist->num_vfs + 1) + slave] -= count;
412 res_alloc->allocated[slave] -= count;
678 static void update_pkey_index(struct mlx4_dev *dev, int slave,
689 new_index = priv->virt2phys_pkey[slave][port - 1][orig_index];
694 u8 slave)
705 mlx4_get_base_gid_ix(dev, slave, port) | 0x80;
707 qp_ctx->pri_path.mgid_index = slave | 0x80;
714 mlx4_get_base_gid_ix(dev, slave, port);
717 qp_ctx->pri_path.mgid_index = slave & 0x7F;
724 mlx4_get_base_gid_ix(dev, slave, port);
727 qp_ctx->alt_path.mgid_index = slave & 0x7F;
734 u8 slave, int port);
738 u8 slave, u32 qpn)
748 vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port];
751 err = handle_counter(dev, qpc, slave, port);
848 static int get_res(struct mlx4_dev *dev, int slave, u64 res_id,
867 if (r->owner != slave) {
885 u64 res_id, int *slave)
898 *slave = r->owner;
906 static void put_res(struct mlx4_dev *dev, int slave, u64 res_id,
918 static int counter_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
921 static int handle_existing_counter(struct mlx4_dev *dev, u8 slave, int port,
933 if (!r || r->owner != slave) {
946 struct mlx4_qp_context *qpc, u8 slave,
958 &tracker->slave_list[slave].res_list[RES_COUNTER],
970 err = counter_alloc_res(dev, slave, RES_OP_RESERVE, 0, 0, &counter_idx,
975 mlx4_err(dev, "%s: failed to create new counter for slave %d err %d\n",
976 __func__, slave, err);
979 mlx4_dbg(dev, "%s: alloc new counter for slave %d index %d\n",
980 __func__, slave, qpc->pri_path.counter_index);
988 u8 slave, int port)
991 return handle_existing_counter(dev, slave, port,
994 return handle_unexisting_counter(dev, qpc, slave, port);
1133 static struct res_common *alloc_tr(u64 id, enum mlx4_resource type, int slave,
1173 ret->owner = slave;
1178 int mlx4_calc_vf_counters(struct mlx4_dev *dev, int slave, int port,
1197 &tracker->slave_list[slave].res_list[RES_COUNTER],
1225 static int add_res_range(struct mlx4_dev *dev, int slave, u64 base, int count,
1240 res_arr[i] = alloc_tr(base + i, type, slave, extra);
1260 &tracker->slave_list[slave].res_list[type]);
1412 static int rem_res_range(struct mlx4_dev *dev, int slave, u64 base, int count,
1428 if (r->owner != slave) {
1451 static int qp_res_start_move_to(struct mlx4_dev *dev, int slave, int qpn,
1464 else if (r->com.owner != slave)
1516 static int mr_res_start_move_to(struct mlx4_dev *dev, int slave, int index,
1528 else if (r->com.owner != slave)
1569 static int eq_res_start_move_to(struct mlx4_dev *dev, int slave, int index,
1581 else if (r->com.owner != slave)
1618 static int cq_res_start_move_to(struct mlx4_dev *dev, int slave, int cqn,
1630 } else if (r->com.owner != slave) {
1658 static int srq_res_start_move_to(struct mlx4_dev *dev, int slave, int index,
1670 } else if (r->com.owner != slave) {
1694 static void res_abort_move(struct mlx4_dev *dev, int slave,
1703 if (r && (r->owner == slave))
1708 static void res_end_move(struct mlx4_dev *dev, int slave,
1717 if (r && (r->owner == slave))
1722 static int valid_reserved(struct mlx4_dev *dev, int slave, int qpn)
1725 (mlx4_is_master(dev) || mlx4_is_guest_proxy(dev, slave, qpn));
1733 static int qp_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1747 * slave tries to set.
1751 err = mlx4_grant_resource(dev, slave, RES_QP, count, 0);
1757 mlx4_release_resource(dev, slave, RES_QP, count, 0);
1761 err = add_res_range(dev, slave, base, count, RES_QP, 0);
1763 mlx4_release_resource(dev, slave, RES_QP, count, 0);
1771 if (valid_reserved(dev, slave, qpn)) {
1772 err = add_res_range(dev, slave, qpn, 1, RES_QP, 0);
1777 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_MAPPED,
1785 res_abort_move(dev, slave, RES_QP, qpn);
1790 res_end_move(dev, slave, RES_QP, qpn);
1800 static int mtt_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1812 err = mlx4_grant_resource(dev, slave, RES_MTT, 1 << order, 0);
1818 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0);
1822 err = add_res_range(dev, slave, base, 1, RES_MTT, order);
1824 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0);
1833 static int mpt_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1843 err = mlx4_grant_resource(dev, slave, RES_MPT, 1, 0);
1849 mlx4_release_resource(dev, slave, RES_MPT, 1, 0);
1854 err = add_res_range(dev, slave, id, 1, RES_MPT, index);
1856 mlx4_release_resource(dev, slave, RES_MPT, 1, 0);
1865 err = mr_res_start_move_to(dev, slave, id,
1872 res_abort_move(dev, slave, RES_MPT, id);
1876 res_end_move(dev, slave, RES_MPT, id);
1882 static int cq_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1890 err = mlx4_grant_resource(dev, slave, RES_CQ, 1, 0);
1896 mlx4_release_resource(dev, slave, RES_CQ, 1, 0);
1900 err = add_res_range(dev, slave, cqn, 1, RES_CQ, 0);
1902 mlx4_release_resource(dev, slave, RES_CQ, 1, 0);
1917 static int srq_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
1925 err = mlx4_grant_resource(dev, slave, RES_SRQ, 1, 0);
1931 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0);
1935 err = add_res_range(dev, slave, srqn, 1, RES_SRQ, 0);
1937 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0);
1952 static int mac_find_smac_ix_in_slave(struct mlx4_dev *dev, int slave, int port,
1958 &tracker->slave_list[slave].res_list[RES_MAC];
1970 static int mac_add_to_slave(struct mlx4_dev *dev, int slave, u64 mac, int port, u8 smac_index)
1975 &tracker->slave_list[slave].res_list[RES_MAC];
1986 if (mlx4_grant_resource(dev, slave, RES_MAC, 1, port))
1990 mlx4_release_resource(dev, slave, RES_MAC, 1, port);
1998 &tracker->slave_list[slave].res_list[RES_MAC]);
2002 static void mac_del_from_slave(struct mlx4_dev *dev, int slave, u64 mac,
2008 &tracker->slave_list[slave].res_list[RES_MAC];
2015 mlx4_release_resource(dev, slave, RES_MAC, 1, port);
2023 static void rem_slave_macs(struct mlx4_dev *dev, int slave)
2028 &tracker->slave_list[slave].res_list[RES_MAC];
2034 /* dereference the mac the num times the slave referenced it */
2037 mlx4_release_resource(dev, slave, RES_MAC, 1, res->port);
2042 static int mac_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2055 dev, slave, port);
2069 err = mac_add_to_slave(dev, slave, mac, port, smac_index);
2076 static int vlan_add_to_slave(struct mlx4_dev *dev, int slave, u16 vlan,
2082 &tracker->slave_list[slave].res_list[RES_VLAN];
2093 if (mlx4_grant_resource(dev, slave, RES_VLAN, 1, port))
2097 mlx4_release_resource(dev, slave, RES_VLAN, 1, port);
2105 &tracker->slave_list[slave].res_list[RES_VLAN]);
2110 static void vlan_del_from_slave(struct mlx4_dev *dev, int slave, u16 vlan,
2116 &tracker->slave_list[slave].res_list[RES_VLAN];
2123 mlx4_release_resource(dev, slave, RES_VLAN,
2132 static void rem_slave_vlans(struct mlx4_dev *dev, int slave)
2137 &tracker->slave_list[slave].res_list[RES_VLAN];
2143 /* dereference the vlan the num times the slave referenced it */
2146 mlx4_release_resource(dev, slave, RES_VLAN, 1, res->port);
2151 static int vlan_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2167 dev, slave, port);
2173 slave_state[slave].old_vlan_api = true;
2182 err = vlan_add_to_slave(dev, slave, vlan, port, vlan_index);
2189 static int counter_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2198 err = mlx4_grant_resource(dev, slave, RES_COUNTER, 1, 0);
2204 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0);
2208 err = add_res_range(dev, slave, index, 1, RES_COUNTER, port);
2211 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0);
2219 static int xrcdn_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2232 err = add_res_range(dev, slave, xrcdn, 1, RES_XRCD, 0);
2241 int mlx4_ALLOC_RES_wrapper(struct mlx4_dev *dev, int slave,
2252 err = qp_alloc_res(dev, slave, vhcr->op_modifier, alop,
2257 err = mtt_alloc_res(dev, slave, vhcr->op_modifier, alop,
2262 err = mpt_alloc_res(dev, slave, vhcr->op_modifier, alop,
2267 err = cq_alloc_res(dev, slave, vhcr->op_modifier, alop,
2272 err = srq_alloc_res(dev, slave, vhcr->op_modifier, alop,
2277 err = mac_alloc_res(dev, slave, vhcr->op_modifier, alop,
2283 err = vlan_alloc_res(dev, slave, vhcr->op_modifier, alop,
2289 err = counter_alloc_res(dev, slave, vhcr->op_modifier, alop,
2294 err = xrcdn_alloc_res(dev, slave, vhcr->op_modifier, alop,
2306 static int qp_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2318 err = rem_res_range(dev, slave, base, count, RES_QP, 0);
2321 mlx4_release_resource(dev, slave, RES_QP, count, 0);
2326 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_RESERVED,
2334 res_end_move(dev, slave, RES_QP, qpn);
2336 if (valid_reserved(dev, slave, qpn))
2337 err = rem_res_range(dev, slave, qpn, 1, RES_QP, 0);
2346 static int mtt_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2358 err = rem_res_range(dev, slave, base, 1, RES_MTT, order);
2360 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0);
2366 static int mpt_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2378 err = get_res(dev, slave, id, RES_MPT, &mpt);
2382 put_res(dev, slave, id, RES_MPT);
2384 err = rem_res_range(dev, slave, id, 1, RES_MPT, 0);
2387 mlx4_release_resource(dev, slave, RES_MPT, 1, 0);
2393 err = mr_res_start_move_to(dev, slave, id,
2399 res_end_move(dev, slave, RES_MPT, id);
2408 static int cq_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2417 err = rem_res_range(dev, slave, cqn, 1, RES_CQ, 0);
2421 mlx4_release_resource(dev, slave, RES_CQ, 1, 0);
2433 static int srq_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2442 err = rem_res_range(dev, slave, srqn, 1, RES_SRQ, 0);
2446 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0);
2458 static int mac_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2468 dev, slave, port);
2472 mac_del_from_slave(dev, slave, in_param, port);
2484 static int vlan_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2492 dev, slave, port);
2498 if (slave_state[slave].old_vlan_api)
2502 vlan_del_from_slave(dev, slave, in_param, port);
2513 static int counter_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2526 err = rem_res_range(dev, slave, index, 1, RES_COUNTER, 0);
2531 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0);
2536 static int xrcdn_free_res(struct mlx4_dev *dev, int slave, int op, int cmd,
2546 err = rem_res_range(dev, slave, xrcdn, 1, RES_XRCD, 0);
2555 int mlx4_FREE_RES_wrapper(struct mlx4_dev *dev, int slave,
2566 err = qp_free_res(dev, slave, vhcr->op_modifier, alop,
2571 err = mtt_free_res(dev, slave, vhcr->op_modifier, alop,
2576 err = mpt_free_res(dev, slave, vhcr->op_modifier, alop,
2581 err = cq_free_res(dev, slave, vhcr->op_modifier, alop,
2586 err = srq_free_res(dev, slave, vhcr->op_modifier, alop,
2591 err = mac_free_res(dev, slave, vhcr->op_modifier, alop,
2597 err = vlan_free_res(dev, slave, vhcr->op_modifier, alop,
2603 err = counter_free_res(dev, slave, vhcr->op_modifier, alop,
2608 err = xrcdn_free_res(dev, slave, vhcr->op_modifier, alop,
2690 static int check_mtt_range(struct mlx4_dev *dev, int slave, int start,
2701 int mlx4_SW2HW_MPT_wrapper(struct mlx4_dev *dev, int slave,
2718 err = mr_res_start_move_to(dev, slave, id, RES_MPT_HW, &mpt);
2728 /* Make sure that the PD bits related to the slave id are zeros. */
2731 if (pd_slave != 0 && --pd_slave != slave) {
2737 /* FMR and Bind Enable are forbidden in slave devices. */
2751 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
2755 err = check_mtt_range(dev, slave, mtt_base,
2763 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2769 put_res(dev, slave, mtt->com.res_id, RES_MTT);
2772 res_end_move(dev, slave, RES_MPT, id);
2777 put_res(dev, slave, mtt->com.res_id, RES_MTT);
2779 res_abort_move(dev, slave, RES_MPT, id);
2784 int mlx4_HW2SW_MPT_wrapper(struct mlx4_dev *dev, int slave,
2796 err = mr_res_start_move_to(dev, slave, id, RES_MPT_MAPPED, &mpt);
2800 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2807 res_end_move(dev, slave, RES_MPT, id);
2811 res_abort_move(dev, slave, RES_MPT, id);
2816 int mlx4_QUERY_MPT_wrapper(struct mlx4_dev *dev, int slave,
2828 err = get_res(dev, slave, id, RES_MPT, &mpt);
2854 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2862 put_res(dev, slave, id, RES_MPT);
2894 static int adjust_qp_sched_queue(struct mlx4_dev *dev, int slave,
2898 int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave,
2920 err = adjust_qp_sched_queue(dev, slave, qpc, inbox);
2924 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_HW, &qp, 0);
2937 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
2941 err = check_mtt_range(dev, slave, mtt_base, mtt_size, mtt);
2945 err = get_res(dev, slave, rcqn, RES_CQ, &rcq);
2950 err = get_res(dev, slave, scqn, RES_CQ, &scq);
2957 err = get_res(dev, slave, srqn, RES_SRQ, &srq);
2963 update_pkey_index(dev, slave, inbox);
2964 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
2975 put_res(dev, slave, scqn, RES_CQ);
2979 put_res(dev, slave, srqn, RES_SRQ);
2982 put_res(dev, slave, rcqn, RES_CQ);
2983 put_res(dev, slave, mtt_base, RES_MTT);
2984 res_end_move(dev, slave, RES_QP, qpn);
2990 put_res(dev, slave, srqn, RES_SRQ);
2993 put_res(dev, slave, scqn, RES_CQ);
2995 put_res(dev, slave, rcqn, RES_CQ);
2997 put_res(dev, slave, mtt_base, RES_MTT);
2999 res_abort_move(dev, slave, RES_QP, qpn);
3036 int mlx4_SW2HW_EQ_wrapper(struct mlx4_dev *dev, int slave,
3044 int res_id = (slave << 10) | eqn;
3051 err = add_res_range(dev, slave, res_id, 1, RES_EQ, 0);
3054 err = eq_res_start_move_to(dev, slave, res_id, RES_EQ_HW, &eq);
3058 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3062 err = check_mtt_range(dev, slave, mtt_base, mtt_size, mtt);
3066 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3072 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3073 res_end_move(dev, slave, RES_EQ, res_id);
3077 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3079 res_abort_move(dev, slave, RES_EQ, res_id);
3081 rem_res_range(dev, slave, res_id, 1, RES_EQ, 0);
3085 int mlx4_CONFIG_DEV_wrapper(struct mlx4_dev *dev, int slave,
3097 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3102 static int get_containing_mtt(struct mlx4_dev *dev, int slave, int start,
3111 list_for_each_entry(mtt, &tracker->slave_list[slave].res_list[RES_MTT],
3113 if (!check_mtt_range(dev, slave, start, len, mtt)) {
3129 enum qp_transition transition, u8 slave)
3142 if (slave != mlx4_master_func_num(dev)) {
3159 if (slave != mlx4_master_func_num(dev)) {
3163 num_gids = mlx4_get_slave_num_gids(dev, slave, port);
3172 num_gids = mlx4_get_slave_num_gids(dev, slave, port);
3189 slave != mlx4_master_func_num(dev) &&
3191 !mlx4_vf_smi_enabled(dev, slave, port)) {
3193 mlx4_err(dev, "%s: unprivileged slave %d attempting to create an MLX proxy special QP on port %d\n",
3194 __func__, slave, port);
3206 int mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave,
3221 err = get_containing_mtt(dev, slave, start, npages, &rmtt);
3239 put_res(dev, slave, rmtt->com.res_id, RES_MTT);
3244 int mlx4_HW2SW_EQ_wrapper(struct mlx4_dev *dev, int slave,
3251 int res_id = eqn | (slave << 10);
3255 err = eq_res_start_move_to(dev, slave, res_id, RES_EQ_RESERVED, &eq);
3259 err = get_res(dev, slave, eq->mtt->com.res_id, RES_MTT, NULL);
3263 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3268 put_res(dev, slave, eq->mtt->com.res_id, RES_MTT);
3269 res_end_move(dev, slave, RES_EQ, res_id);
3270 rem_res_range(dev, slave, res_id, 1, RES_EQ, 0);
3275 put_res(dev, slave, eq->mtt->com.res_id, RES_MTT);
3277 res_abort_move(dev, slave, RES_EQ, res_id);
3282 int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe)
3295 /* check for slave valid, slave not PF, and slave active */
3296 if (slave < 0 || slave > dev->persist->num_vfs ||
3297 slave == dev->caps.function ||
3298 !priv->mfunc.master.slave_state[slave].active)
3301 event_eq = &priv->mfunc.master.slave_state[slave].event_eq[eqe->type];
3303 /* Create the event only if the slave is registered */
3307 mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]);
3308 res_id = (slave << 10) | event_eq->eqn;
3309 err = get_res(dev, slave, res_id, RES_EQ, &req);
3331 in_modifier = (slave & 0xff) | ((event_eq->eqn & 0x3ff) << 16);
3337 put_res(dev, slave, res_id, RES_EQ);
3338 mutex_unlock(&priv->mfunc.master.gen_eqe_mutex[slave]);
3343 put_res(dev, slave, res_id, RES_EQ);
3346 mutex_unlock(&priv->mfunc.master.gen_eqe_mutex[slave]);
3350 int mlx4_QUERY_EQ_wrapper(struct mlx4_dev *dev, int slave,
3357 int res_id = eqn | (slave << 10);
3361 err = get_res(dev, slave, res_id, RES_EQ, &eq);
3370 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3373 put_res(dev, slave, res_id, RES_EQ);
3377 int mlx4_SW2HW_CQ_wrapper(struct mlx4_dev *dev, int slave,
3390 err = cq_res_start_move_to(dev, slave, cqn, RES_CQ_HW, &cq);
3393 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3396 err = check_mtt_range(dev, slave, mtt_base, cq_get_mtt_size(cqc), mtt);
3399 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3404 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3405 res_end_move(dev, slave, RES_CQ, cqn);
3409 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3411 res_abort_move(dev, slave, RES_CQ, cqn);
3415 int mlx4_HW2SW_CQ_wrapper(struct mlx4_dev *dev, int slave,
3425 err = cq_res_start_move_to(dev, slave, cqn, RES_CQ_ALLOCATED, &cq);
3428 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3432 res_end_move(dev, slave, RES_CQ, cqn);
3436 res_abort_move(dev, slave, RES_CQ, cqn);
3440 int mlx4_QUERY_CQ_wrapper(struct mlx4_dev *dev, int slave,
3450 err = get_res(dev, slave, cqn, RES_CQ, &cq);
3457 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3459 put_res(dev, slave, cqn, RES_CQ);
3464 static int handle_resize(struct mlx4_dev *dev, int slave,
3477 err = get_res(dev, slave, cq->mtt->com.res_id, RES_MTT, &orig_mtt);
3486 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3490 err = check_mtt_range(dev, slave, mtt_base, cq_get_mtt_size(cqc), mtt);
3493 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3497 put_res(dev, slave, orig_mtt->com.res_id, RES_MTT);
3500 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3504 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3506 put_res(dev, slave, orig_mtt->com.res_id, RES_MTT);
3512 int mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave,
3522 err = get_res(dev, slave, cqn, RES_CQ, &cq);
3530 err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq);
3534 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3536 put_res(dev, slave, cqn, RES_CQ);
3553 int mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3569 err = srq_res_start_move_to(dev, slave, srqn, RES_SRQ_HW, &srq);
3572 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt);
3575 err = check_mtt_range(dev, slave, mtt_base, srq_get_mtt_size(srqc),
3580 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3586 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3587 res_end_move(dev, slave, RES_SRQ, srqn);
3591 put_res(dev, slave, mtt->com.res_id, RES_MTT);
3593 res_abort_move(dev, slave, RES_SRQ, srqn);
3598 int mlx4_HW2SW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3608 err = srq_res_start_move_to(dev, slave, srqn, RES_SRQ_ALLOCATED, &srq);
3611 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3617 res_end_move(dev, slave, RES_SRQ, srqn);
3622 res_abort_move(dev, slave, RES_SRQ, srqn);
3627 int mlx4_QUERY_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3637 err = get_res(dev, slave, srqn, RES_SRQ, &srq);
3644 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3646 put_res(dev, slave, srqn, RES_SRQ);
3650 int mlx4_ARM_SRQ_wrapper(struct mlx4_dev *dev, int slave,
3660 err = get_res(dev, slave, srqn, RES_SRQ, &srq);
3669 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3671 put_res(dev, slave, srqn, RES_SRQ);
3675 int mlx4_GEN_QP_wrapper(struct mlx4_dev *dev, int slave,
3685 err = get_res(dev, slave, qpn, RES_QP, &qp);
3693 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3695 put_res(dev, slave, qpn, RES_QP);
3699 int mlx4_INIT2INIT_QP_wrapper(struct mlx4_dev *dev, int slave,
3707 update_pkey_index(dev, slave, inbox);
3708 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3711 static int adjust_qp_sched_queue(struct mlx4_dev *dev, int slave,
3718 dev, slave, (qpc->pri_path.sched_queue >> 6 & 1) + 1) - 1;
3733 dev, slave, (qpc->alt_path.sched_queue >> 6 & 1)
3744 static int roce_verify_mac(struct mlx4_dev *dev, int slave,
3757 if (mac_find_smac_ix_in_slave(dev, slave, port, smac_ix, &mac))
3763 int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave,
3781 err = adjust_qp_sched_queue(dev, slave, qpc, inbox);
3784 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_INIT2RTR, slave);
3788 if (roce_verify_mac(dev, slave, qpc, inbox))
3791 update_pkey_index(dev, slave, inbox);
3792 update_gid(dev, inbox, (u8)slave);
3796 err = get_res(dev, slave, qpn, RES_QP, &qp);
3804 err = update_vport_qp_param(dev, inbox, slave, qpn);
3808 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3823 put_res(dev, slave, qpn, RES_QP);
3827 int mlx4_RTR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3836 err = adjust_qp_sched_queue(dev, slave, context, inbox);
3839 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTR2RTS, slave);
3843 update_pkey_index(dev, slave, inbox);
3844 update_gid(dev, inbox, (u8)slave);
3846 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3849 int mlx4_RTS2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3858 err = adjust_qp_sched_queue(dev, slave, context, inbox);
3861 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTS2RTS, slave);
3865 update_pkey_index(dev, slave, inbox);
3866 update_gid(dev, inbox, (u8)slave);
3868 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3872 int mlx4_SQERR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3879 int err = adjust_qp_sched_queue(dev, slave, context, inbox);
3883 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3886 int mlx4_SQD2SQD_QP_wrapper(struct mlx4_dev *dev, int slave,
3895 err = adjust_qp_sched_queue(dev, slave, context, inbox);
3898 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2SQD, slave);
3903 update_gid(dev, inbox, (u8)slave);
3904 update_pkey_index(dev, slave, inbox);
3905 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3908 int mlx4_SQD2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
3917 err = adjust_qp_sched_queue(dev, slave, context, inbox);
3920 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2RTS, slave);
3925 update_gid(dev, inbox, (u8)slave);
3926 update_pkey_index(dev, slave, inbox);
3927 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3930 int mlx4_2RST_QP_wrapper(struct mlx4_dev *dev, int slave,
3940 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_MAPPED, &qp, 0);
3943 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
3952 res_end_move(dev, slave, RES_QP, qpn);
3956 res_abort_move(dev, slave, RES_QP, qpn);
3961 static struct res_gid *find_gid(struct mlx4_dev *dev, int slave,
3973 static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
3985 if (find_gid(dev, slave, rqp, gid)) {
4001 static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp,
4009 res = find_gid(dev, slave, rqp, gid);
4023 static int qp_attach(struct mlx4_dev *dev, int slave, struct mlx4_qp *qp,
4029 int port = mlx4_slave_convert_port(dev, slave, gid[5]);
4038 int port = mlx4_slave_convert_port(dev, slave, gid[5]);
4064 static int mlx4_adjust_port(struct mlx4_dev *dev, int slave,
4074 real_port = mlx4_slave_convert_port(dev, slave, gid[5]);
4083 int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
4102 err = get_res(dev, slave, qpn, RES_QP, &rqp);
4108 err = qp_attach(dev, slave, &qp, gid, block_loopback, prot,
4114 err = add_mcg_res(dev, slave, rqp, gid, prot, type, reg_id);
4118 err = mlx4_adjust_port(dev, slave, gid, prot);
4122 err = rem_mcg_res(dev, slave, rqp, gid, prot, type, &reg_id);
4131 put_res(dev, slave, qpn, RES_QP);
4137 put_res(dev, slave, qpn, RES_QP);
4145 static int validate_eth_header_mac(int slave, struct _rule_hw *eth_header,
4160 eth_header->eth.dst_mac, slave);
4186 static int add_eth_header(struct mlx4_dev *dev, int slave,
4244 int mlx4_UPDATE_QP_wrapper(struct mlx4_dev *dev, int slave,
4270 mlx4_warn(dev, "Src check LB for slave %d isn't supported\n",
4271 slave);
4276 err = get_res(dev, slave, qpn, RES_QP, &rqp);
4278 mlx4_err(dev, "Updating qpn 0x%x for slave %d rejected\n", qpn, slave);
4286 err = mac_find_smac_ix_in_slave(dev, slave, port,
4306 put_res(dev, slave, qpn, RES_QP);
4326 int mlx4_QP_FLOW_STEERING_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
4335 struct list_head *rlist = &tracker->slave_list[slave].res_list[RES_MAC];
4350 err = mlx4_slave_convert_port(dev, slave, ctrl->port);
4355 err = get_res(dev, slave, qpn, RES_QP, &rqp);
4366 if (slave == dev->caps.function)
4371 if (validate_eth_header_mac(slave, rule_header, rlist)) {
4382 if (add_eth_header(dev, slave, inbox, rlist, header_id)) {
4404 err = add_res_range(dev, slave, vhcr->out_param, 1, RES_FS_RULE, qpn);
4410 err = get_res(dev, slave, vhcr->out_param, RES_FS_RULE, &rrule);
4437 put_res(dev, slave, vhcr->out_param, RES_FS_RULE);
4445 put_res(dev, slave, qpn, RES_QP);
4464 int mlx4_QP_FLOW_STEERING_DETACH_wrapper(struct mlx4_dev *dev, int slave,
4479 err = get_res(dev, slave, vhcr->in_param, RES_FS_RULE, &rrule);
4485 put_res(dev, slave, vhcr->in_param, RES_FS_RULE);
4492 put_res(dev, slave, vhcr->in_param, RES_FS_RULE);
4493 err = get_res(dev, slave, rrule->qpn, RES_QP, &rqp);
4498 err = get_res(dev, slave, mirr_reg_id, RES_FS_RULE, &rrule);
4502 put_res(dev, slave, mirr_reg_id, RES_FS_RULE);
4506 err = rem_res_range(dev, slave, vhcr->in_param, 1, RES_FS_RULE, 0);
4518 put_res(dev, slave, rrule->qpn, RES_QP);
4526 int mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave,
4535 err = get_res(dev, slave, index, RES_COUNTER, NULL);
4539 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
4540 put_res(dev, slave, index, RES_COUNTER);
4544 static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp)
4566 static int _move_all_busy(struct mlx4_dev *dev, int slave,
4572 struct list_head *rlist = &tracker->slave_list[slave].res_list[type];
4580 if (r->owner == slave) {
4602 static int move_all_busy(struct mlx4_dev *dev, int slave,
4610 busy = _move_all_busy(dev, slave, type, 0);
4618 busy = _move_all_busy(dev, slave, type, 1);
4622 static void rem_slave_qps(struct mlx4_dev *dev, int slave)
4627 &tracker->slave_list[slave].res_list[RES_QP];
4635 err = move_all_busy(dev, slave, RES_QP);
4637 mlx4_warn(dev, "rem_slave_qps: Could not move all qps to busy for slave %d\n",
4638 slave);
4643 if (qp->com.owner == slave) {
4645 detach_qp(dev, slave, qp);
4655 if (!valid_reserved(dev, slave, qpn)) {
4657 mlx4_release_resource(dev, slave,
4664 if (!valid_reserved(dev, slave, qpn))
4669 in_param = slave;
4676 mlx4_dbg(dev, "rem_slave_qps: failed to move slave %d qpn %d to reset\n",
4677 slave, qp->local_qpn);
4695 static void rem_slave_srqs(struct mlx4_dev *dev, int slave)
4700 &tracker->slave_list[slave].res_list[RES_SRQ];
4709 err = move_all_busy(dev, slave, RES_SRQ);
4711 mlx4_warn(dev, "rem_slave_srqs: Could not move all srqs - too busy for slave %d\n",
4712 slave);
4717 if (srq->com.owner == slave) {
4729 mlx4_release_resource(dev, slave,
4736 in_param = slave;
4742 mlx4_dbg(dev, "rem_slave_srqs: failed to move slave %d srq %d to SW ownership\n",
4743 slave, srqn);
4761 static void rem_slave_cqs(struct mlx4_dev *dev, int slave)
4766 &tracker->slave_list[slave].res_list[RES_CQ];
4775 err = move_all_busy(dev, slave, RES_CQ);
4777 mlx4_warn(dev, "rem_slave_cqs: Could not move all cqs - too busy for slave %d\n",
4778 slave);
4783 if (cq->com.owner == slave && !atomic_read(&cq->ref_count)) {
4795 mlx4_release_resource(dev, slave,
4802 in_param = slave;
4808 mlx4_dbg(dev, "rem_slave_cqs: failed to move slave %d cq %d to SW ownership\n",
4809 slave, cqn);
4824 static void rem_slave_mrs(struct mlx4_dev *dev, int slave)
4829 &tracker->slave_list[slave].res_list[RES_MPT];
4838 err = move_all_busy(dev, slave, RES_MPT);
4840 mlx4_warn(dev, "rem_slave_mrs: Could not move all mpts - too busy for slave %d\n",
4841 slave);
4846 if (mpt->com.owner == slave) {
4858 mlx4_release_resource(dev, slave,
4870 in_param = slave;
4876 mlx4_dbg(dev, "rem_slave_mrs: failed to move slave %d mpt %d to SW ownership\n",
4877 slave, mptn);
4892 static void rem_slave_mtts(struct mlx4_dev *dev, int slave)
4898 &tracker->slave_list[slave].res_list[RES_MTT];
4906 err = move_all_busy(dev, slave, RES_MTT);
4908 mlx4_warn(dev, "rem_slave_mtts: Could not move all mtts - too busy for slave %d\n",
4909 slave);
4914 if (mtt->com.owner == slave) {
4927 mlx4_release_resource(dev, slave, RES_MTT,
5028 static void rem_slave_fs_rule(struct mlx4_dev *dev, int slave)
5034 &tracker->slave_list[slave].res_list[RES_FS_RULE];
5041 err = move_all_busy(dev, slave, RES_FS_RULE);
5043 mlx4_warn(dev, "rem_slave_fs_rule: Could not move all mtts to busy for slave %d\n",
5044 slave);
5049 if (fs_rule->com.owner == slave) {
5080 static void rem_slave_eqs(struct mlx4_dev *dev, int slave)
5085 &tracker->slave_list[slave].res_list[RES_EQ];
5093 err = move_all_busy(dev, slave, RES_EQ);
5095 mlx4_warn(dev, "rem_slave_eqs: Could not move all eqs - too busy for slave %d\n",
5096 slave);
5101 if (eq->com.owner == slave) {
5117 err = mlx4_cmd(dev, slave, eqn & 0x3ff,
5122 mlx4_dbg(dev, "rem_slave_eqs: failed to move slave %d eqs %d to SW ownership\n",
5123 slave, eqn & 0x3ff);
5138 static void rem_slave_counters(struct mlx4_dev *dev, int slave)
5143 &tracker->slave_list[slave].res_list[RES_COUNTER];
5150 err = move_all_busy(dev, slave, RES_COUNTER);
5152 mlx4_warn(dev, "rem_slave_counters: Could not move all counters - too busy for slave %d\n",
5153 slave);
5165 if (counter->com.owner == slave) {
5177 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0);
5184 static void rem_slave_xrcdns(struct mlx4_dev *dev, int slave)
5189 &tracker->slave_list[slave].res_list[RES_XRCD];
5195 err = move_all_busy(dev, slave, RES_XRCD);
5197 mlx4_warn(dev, "rem_slave_xrcdns: Could not move all xrcdns - too busy for slave %d\n",
5198 slave);
5202 if (xrcd->com.owner == slave) {
5213 void mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave)
5216 mlx4_reset_roce_gids(dev, slave);
5217 mutex_lock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex);
5218 rem_slave_vlans(dev, slave);
5219 rem_slave_macs(dev, slave);
5220 rem_slave_fs_rule(dev, slave);
5221 rem_slave_qps(dev, slave);
5222 rem_slave_srqs(dev, slave);
5223 rem_slave_cqs(dev, slave);
5224 rem_slave_mrs(dev, slave);
5225 rem_slave_eqs(dev, slave);
5226 rem_slave_mtts(dev, slave);
5227 rem_slave_counters(dev, slave);
5228 rem_slave_xrcdns(dev, slave);
5229 mutex_unlock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex);
5242 &tracker->slave_list[work->slave].res_list[RES_QP];
5267 mlx4_warn(dev, "Trying to update-qp in slave %d\n",
5268 work->slave);
5301 if (qp->com.owner == work->slave) {
5358 mlx4_info(dev, "UPDATE_QP failed for slave %d, port %d, qpn %d (%d)\n",
5359 work->slave, port, qp->local_qpn, err);
5369 mlx4_err(dev, "%d UPDATE_QP failures for slave %d, port %d\n",
5370 errors, work->slave, work->port);