Lines Matching full: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, in mlx4_grant_resource() argument
318 if (slave > dev->persist->num_vfs) in mlx4_grant_resource()
324 (dev->persist->num_vfs + 1) + slave] : in mlx4_grant_resource()
325 res_alloc->allocated[slave]; in mlx4_grant_resource()
330 guaranteed = res_alloc->guaranteed[slave]; in mlx4_grant_resource()
332 if (allocated + count > res_alloc->quota[slave]) { in mlx4_grant_resource()
334 slave, port, resource_str(res_type), count, in mlx4_grant_resource()
335 allocated, res_alloc->quota[slave]); in mlx4_grant_resource()
355 slave, port, resource_str(res_type), free, in mlx4_grant_resource()
363 (dev->persist->num_vfs + 1) + slave] += count; in mlx4_grant_resource()
367 res_alloc->allocated[slave] += count; in mlx4_grant_resource()
378 static inline void mlx4_release_resource(struct mlx4_dev *dev, int slave, in mlx4_release_resource() argument
387 if (slave > dev->persist->num_vfs) in mlx4_release_resource()
394 (dev->persist->num_vfs + 1) + slave] : in mlx4_release_resource()
395 res_alloc->allocated[slave]; in mlx4_release_resource()
396 guaranteed = res_alloc->guaranteed[slave]; in mlx4_release_resource()
410 (dev->persist->num_vfs + 1) + slave] -= count; in mlx4_release_resource()
414 res_alloc->allocated[slave] -= count; in mlx4_release_resource()
691 static void update_pkey_index(struct mlx4_dev *dev, int slave, in update_pkey_index() argument
702 new_index = priv->virt2phys_pkey[slave][port - 1][orig_index]; in update_pkey_index()
707 u8 slave) in update_gid() argument
718 mlx4_get_base_gid_ix(dev, slave, port) | 0x80; in update_gid()
720 qp_ctx->pri_path.mgid_index = slave | 0x80; in update_gid()
727 mlx4_get_base_gid_ix(dev, slave, port); in update_gid()
730 qp_ctx->pri_path.mgid_index = slave & 0x7F; in update_gid()
737 mlx4_get_base_gid_ix(dev, slave, port); in update_gid()
740 qp_ctx->alt_path.mgid_index = slave & 0x7F; in update_gid()
747 u8 slave, int port);
751 u8 slave, u32 qpn) in update_vport_qp_param() argument
761 vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port]; in update_vport_qp_param()
764 err = handle_counter(dev, qpc, slave, port); in update_vport_qp_param()
891 static int _get_res(struct mlx4_dev *dev, int slave, u64 res_id, in _get_res() argument
908 func_name, slave, res_id, mlx4_resource_type_to_str(type), in _get_res()
914 if (r->owner != slave) { in _get_res()
931 #define get_res(dev, slave, res_id, type, res) \ argument
932 _get_res((dev), (slave), (res_id), (type), (res), __func__)
936 u64 res_id, int *slave) in mlx4_get_slave_from_resource_id() argument
949 *slave = r->owner; in mlx4_get_slave_from_resource_id()
957 static void put_res(struct mlx4_dev *dev, int slave, u64 res_id, in put_res() argument
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, in handle_existing_counter() argument
986 if (!r || r->owner != slave) { in handle_existing_counter()
999 struct mlx4_qp_context *qpc, u8 slave, in handle_unexisting_counter() argument
1011 &tracker->slave_list[slave].res_list[RES_COUNTER], in handle_unexisting_counter()
1023 err = counter_alloc_res(dev, slave, RES_OP_RESERVE, 0, 0, &counter_idx, in handle_unexisting_counter()
1028 mlx4_err(dev, "%s: failed to create new counter for slave %d err %d\n", in handle_unexisting_counter()
1029 __func__, slave, err); in handle_unexisting_counter()
1032 mlx4_dbg(dev, "%s: alloc new counter for slave %d index %d\n", in handle_unexisting_counter()
1033 __func__, slave, qpc->pri_path.counter_index); in handle_unexisting_counter()
1041 u8 slave, int port) in handle_counter() argument
1044 return handle_existing_counter(dev, slave, port, in handle_counter()
1047 return handle_unexisting_counter(dev, qpc, slave, port); in handle_counter()
1186 static struct res_common *alloc_tr(u64 id, enum mlx4_resource type, int slave, in alloc_tr() argument
1226 ret->owner = slave; in alloc_tr()
1231 int mlx4_calc_vf_counters(struct mlx4_dev *dev, int slave, int port, in mlx4_calc_vf_counters() argument
1250 &tracker->slave_list[slave].res_list[RES_COUNTER], in mlx4_calc_vf_counters()
1278 static int add_res_range(struct mlx4_dev *dev, int slave, u64 base, int count, in add_res_range() argument
1293 res_arr[i] = alloc_tr(base + i, type, slave, extra); in add_res_range()
1313 &tracker->slave_list[slave].res_list[type]); in add_res_range()
1465 static int rem_res_range(struct mlx4_dev *dev, int slave, u64 base, int count, in rem_res_range() argument
1481 if (r->owner != slave) { in rem_res_range()
1504 static int qp_res_start_move_to(struct mlx4_dev *dev, int slave, int qpn, in qp_res_start_move_to() argument
1517 else if (r->com.owner != slave) in qp_res_start_move_to()
1569 static int mr_res_start_move_to(struct mlx4_dev *dev, int slave, int index, in mr_res_start_move_to() argument
1581 else if (r->com.owner != slave) in mr_res_start_move_to()
1622 static int eq_res_start_move_to(struct mlx4_dev *dev, int slave, int index, in eq_res_start_move_to() argument
1634 else if (r->com.owner != slave) in eq_res_start_move_to()
1671 static int cq_res_start_move_to(struct mlx4_dev *dev, int slave, int cqn, in cq_res_start_move_to() argument
1683 } else if (r->com.owner != slave) { in cq_res_start_move_to()
1711 static int srq_res_start_move_to(struct mlx4_dev *dev, int slave, int index, in srq_res_start_move_to() argument
1723 } else if (r->com.owner != slave) { in srq_res_start_move_to()
1747 static void res_abort_move(struct mlx4_dev *dev, int slave, in res_abort_move() argument
1756 if (r && (r->owner == slave)) in res_abort_move()
1761 static void res_end_move(struct mlx4_dev *dev, int slave, in res_end_move() argument
1770 if (r && (r->owner == slave)) in res_end_move()
1775 static int valid_reserved(struct mlx4_dev *dev, int slave, int qpn) in valid_reserved() argument
1778 (mlx4_is_master(dev) || mlx4_is_guest_proxy(dev, slave, qpn)); in valid_reserved()
1786 static int qp_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, in qp_alloc_res() argument
1800 * slave tries to set. in qp_alloc_res()
1804 err = mlx4_grant_resource(dev, slave, RES_QP, count, 0); in qp_alloc_res()
1810 mlx4_release_resource(dev, slave, RES_QP, count, 0); in qp_alloc_res()
1814 err = add_res_range(dev, slave, base, count, RES_QP, 0); in qp_alloc_res()
1816 mlx4_release_resource(dev, slave, RES_QP, count, 0); in qp_alloc_res()
1824 if (valid_reserved(dev, slave, qpn)) { in qp_alloc_res()
1825 err = add_res_range(dev, slave, qpn, 1, RES_QP, 0); in qp_alloc_res()
1830 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_MAPPED, in qp_alloc_res()
1838 res_abort_move(dev, slave, RES_QP, qpn); in qp_alloc_res()
1843 res_end_move(dev, slave, RES_QP, qpn); in qp_alloc_res()
1853 static int mtt_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, in mtt_alloc_res() argument
1865 err = mlx4_grant_resource(dev, slave, RES_MTT, 1 << order, 0); in mtt_alloc_res()
1871 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0); in mtt_alloc_res()
1875 err = add_res_range(dev, slave, base, 1, RES_MTT, order); in mtt_alloc_res()
1877 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0); in mtt_alloc_res()
1886 static int mpt_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, in mpt_alloc_res() argument
1896 err = mlx4_grant_resource(dev, slave, RES_MPT, 1, 0); in mpt_alloc_res()
1902 mlx4_release_resource(dev, slave, RES_MPT, 1, 0); in mpt_alloc_res()
1907 err = add_res_range(dev, slave, id, 1, RES_MPT, index); in mpt_alloc_res()
1909 mlx4_release_resource(dev, slave, RES_MPT, 1, 0); in mpt_alloc_res()
1918 err = mr_res_start_move_to(dev, slave, id, in mpt_alloc_res()
1925 res_abort_move(dev, slave, RES_MPT, id); in mpt_alloc_res()
1929 res_end_move(dev, slave, RES_MPT, id); in mpt_alloc_res()
1935 static int cq_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, in cq_alloc_res() argument
1943 err = mlx4_grant_resource(dev, slave, RES_CQ, 1, 0); in cq_alloc_res()
1949 mlx4_release_resource(dev, slave, RES_CQ, 1, 0); in cq_alloc_res()
1953 err = add_res_range(dev, slave, cqn, 1, RES_CQ, 0); in cq_alloc_res()
1955 mlx4_release_resource(dev, slave, RES_CQ, 1, 0); in cq_alloc_res()
1970 static int srq_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, in srq_alloc_res() argument
1978 err = mlx4_grant_resource(dev, slave, RES_SRQ, 1, 0); in srq_alloc_res()
1984 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0); in srq_alloc_res()
1988 err = add_res_range(dev, slave, srqn, 1, RES_SRQ, 0); in srq_alloc_res()
1990 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0); in srq_alloc_res()
2005 static int mac_find_smac_ix_in_slave(struct mlx4_dev *dev, int slave, int port, in mac_find_smac_ix_in_slave() argument
2011 &tracker->slave_list[slave].res_list[RES_MAC]; in mac_find_smac_ix_in_slave()
2023 static int mac_add_to_slave(struct mlx4_dev *dev, int slave, u64 mac, int port, u8 smac_index) in mac_add_to_slave() argument
2028 &tracker->slave_list[slave].res_list[RES_MAC]; in mac_add_to_slave()
2039 if (mlx4_grant_resource(dev, slave, RES_MAC, 1, port)) in mac_add_to_slave()
2043 mlx4_release_resource(dev, slave, RES_MAC, 1, port); in mac_add_to_slave()
2051 &tracker->slave_list[slave].res_list[RES_MAC]); in mac_add_to_slave()
2055 static void mac_del_from_slave(struct mlx4_dev *dev, int slave, u64 mac, in mac_del_from_slave() argument
2061 &tracker->slave_list[slave].res_list[RES_MAC]; in mac_del_from_slave()
2068 mlx4_release_resource(dev, slave, RES_MAC, 1, port); in mac_del_from_slave()
2076 static void rem_slave_macs(struct mlx4_dev *dev, int slave) in rem_slave_macs() argument
2081 &tracker->slave_list[slave].res_list[RES_MAC]; in rem_slave_macs()
2087 /* dereference the mac the num times the slave referenced it */ in rem_slave_macs()
2090 mlx4_release_resource(dev, slave, RES_MAC, 1, res->port); in rem_slave_macs()
2095 static int mac_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, in mac_alloc_res() argument
2108 dev, slave, port); in mac_alloc_res()
2122 err = mac_add_to_slave(dev, slave, mac, port, smac_index); in mac_alloc_res()
2129 static int vlan_add_to_slave(struct mlx4_dev *dev, int slave, u16 vlan, in vlan_add_to_slave() argument
2135 &tracker->slave_list[slave].res_list[RES_VLAN]; in vlan_add_to_slave()
2146 if (mlx4_grant_resource(dev, slave, RES_VLAN, 1, port)) in vlan_add_to_slave()
2150 mlx4_release_resource(dev, slave, RES_VLAN, 1, port); in vlan_add_to_slave()
2158 &tracker->slave_list[slave].res_list[RES_VLAN]); in vlan_add_to_slave()
2163 static void vlan_del_from_slave(struct mlx4_dev *dev, int slave, u16 vlan, in vlan_del_from_slave() argument
2169 &tracker->slave_list[slave].res_list[RES_VLAN]; in vlan_del_from_slave()
2176 mlx4_release_resource(dev, slave, RES_VLAN, in vlan_del_from_slave()
2185 static void rem_slave_vlans(struct mlx4_dev *dev, int slave) in rem_slave_vlans() argument
2190 &tracker->slave_list[slave].res_list[RES_VLAN]; in rem_slave_vlans()
2196 /* dereference the vlan the num times the slave referenced it */ in rem_slave_vlans()
2199 mlx4_release_resource(dev, slave, RES_VLAN, 1, res->port); in rem_slave_vlans()
2204 static int vlan_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, in vlan_alloc_res() argument
2220 dev, slave, port); in vlan_alloc_res()
2226 slave_state[slave].old_vlan_api = true; in vlan_alloc_res()
2235 err = vlan_add_to_slave(dev, slave, vlan, port, vlan_index); in vlan_alloc_res()
2242 static int counter_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, in counter_alloc_res() argument
2251 err = mlx4_grant_resource(dev, slave, RES_COUNTER, 1, 0); in counter_alloc_res()
2257 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0); in counter_alloc_res()
2261 err = add_res_range(dev, slave, index, 1, RES_COUNTER, port); in counter_alloc_res()
2264 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0); in counter_alloc_res()
2272 static int xrcdn_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, in xrcdn_alloc_res() argument
2285 err = add_res_range(dev, slave, xrcdn, 1, RES_XRCD, 0); in xrcdn_alloc_res()
2294 int mlx4_ALLOC_RES_wrapper(struct mlx4_dev *dev, int slave, in mlx4_ALLOC_RES_wrapper() argument
2305 err = qp_alloc_res(dev, slave, vhcr->op_modifier, alop, in mlx4_ALLOC_RES_wrapper()
2310 err = mtt_alloc_res(dev, slave, vhcr->op_modifier, alop, in mlx4_ALLOC_RES_wrapper()
2315 err = mpt_alloc_res(dev, slave, vhcr->op_modifier, alop, in mlx4_ALLOC_RES_wrapper()
2320 err = cq_alloc_res(dev, slave, vhcr->op_modifier, alop, in mlx4_ALLOC_RES_wrapper()
2325 err = srq_alloc_res(dev, slave, vhcr->op_modifier, alop, in mlx4_ALLOC_RES_wrapper()
2330 err = mac_alloc_res(dev, slave, vhcr->op_modifier, alop, in mlx4_ALLOC_RES_wrapper()
2336 err = vlan_alloc_res(dev, slave, vhcr->op_modifier, alop, in mlx4_ALLOC_RES_wrapper()
2342 err = counter_alloc_res(dev, slave, vhcr->op_modifier, alop, in mlx4_ALLOC_RES_wrapper()
2347 err = xrcdn_alloc_res(dev, slave, vhcr->op_modifier, alop, in mlx4_ALLOC_RES_wrapper()
2359 static int qp_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, in qp_free_res() argument
2371 err = rem_res_range(dev, slave, base, count, RES_QP, 0); in qp_free_res()
2374 mlx4_release_resource(dev, slave, RES_QP, count, 0); in qp_free_res()
2379 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_RESERVED, in qp_free_res()
2387 res_end_move(dev, slave, RES_QP, qpn); in qp_free_res()
2389 if (valid_reserved(dev, slave, qpn)) in qp_free_res()
2390 err = rem_res_range(dev, slave, qpn, 1, RES_QP, 0); in qp_free_res()
2399 static int mtt_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, in mtt_free_res() argument
2411 err = rem_res_range(dev, slave, base, 1, RES_MTT, order); in mtt_free_res()
2413 mlx4_release_resource(dev, slave, RES_MTT, 1 << order, 0); in mtt_free_res()
2419 static int mpt_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, in mpt_free_res() argument
2431 err = get_res(dev, slave, id, RES_MPT, &mpt); in mpt_free_res()
2435 put_res(dev, slave, id, RES_MPT); in mpt_free_res()
2437 err = rem_res_range(dev, slave, id, 1, RES_MPT, 0); in mpt_free_res()
2440 mlx4_release_resource(dev, slave, RES_MPT, 1, 0); in mpt_free_res()
2446 err = mr_res_start_move_to(dev, slave, id, in mpt_free_res()
2452 res_end_move(dev, slave, RES_MPT, id); in mpt_free_res()
2461 static int cq_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, in cq_free_res() argument
2470 err = rem_res_range(dev, slave, cqn, 1, RES_CQ, 0); in cq_free_res()
2474 mlx4_release_resource(dev, slave, RES_CQ, 1, 0); in cq_free_res()
2486 static int srq_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, in srq_free_res() argument
2495 err = rem_res_range(dev, slave, srqn, 1, RES_SRQ, 0); in srq_free_res()
2499 mlx4_release_resource(dev, slave, RES_SRQ, 1, 0); in srq_free_res()
2511 static int mac_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, in mac_free_res() argument
2521 dev, slave, port); in mac_free_res()
2525 mac_del_from_slave(dev, slave, in_param, port); in mac_free_res()
2537 static int vlan_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, in vlan_free_res() argument
2545 dev, slave, port); in vlan_free_res()
2551 if (slave_state[slave].old_vlan_api) in vlan_free_res()
2555 vlan_del_from_slave(dev, slave, in_param, port); in vlan_free_res()
2566 static int counter_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, in counter_free_res() argument
2579 err = rem_res_range(dev, slave, index, 1, RES_COUNTER, 0); in counter_free_res()
2584 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0); in counter_free_res()
2589 static int xrcdn_free_res(struct mlx4_dev *dev, int slave, int op, int cmd, in xrcdn_free_res() argument
2599 err = rem_res_range(dev, slave, xrcdn, 1, RES_XRCD, 0); in xrcdn_free_res()
2608 int mlx4_FREE_RES_wrapper(struct mlx4_dev *dev, int slave, in mlx4_FREE_RES_wrapper() argument
2619 err = qp_free_res(dev, slave, vhcr->op_modifier, alop, in mlx4_FREE_RES_wrapper()
2624 err = mtt_free_res(dev, slave, vhcr->op_modifier, alop, in mlx4_FREE_RES_wrapper()
2629 err = mpt_free_res(dev, slave, vhcr->op_modifier, alop, in mlx4_FREE_RES_wrapper()
2634 err = cq_free_res(dev, slave, vhcr->op_modifier, alop, in mlx4_FREE_RES_wrapper()
2639 err = srq_free_res(dev, slave, vhcr->op_modifier, alop, in mlx4_FREE_RES_wrapper()
2644 err = mac_free_res(dev, slave, vhcr->op_modifier, alop, in mlx4_FREE_RES_wrapper()
2650 err = vlan_free_res(dev, slave, vhcr->op_modifier, alop, in mlx4_FREE_RES_wrapper()
2656 err = counter_free_res(dev, slave, vhcr->op_modifier, alop, in mlx4_FREE_RES_wrapper()
2661 err = xrcdn_free_res(dev, slave, vhcr->op_modifier, alop, in mlx4_FREE_RES_wrapper()
2743 static int check_mtt_range(struct mlx4_dev *dev, int slave, int start, in check_mtt_range() argument
2754 int mlx4_SW2HW_MPT_wrapper(struct mlx4_dev *dev, int slave, in mlx4_SW2HW_MPT_wrapper() argument
2771 err = mr_res_start_move_to(dev, slave, id, RES_MPT_HW, &mpt); in mlx4_SW2HW_MPT_wrapper()
2781 /* Make sure that the PD bits related to the slave id are zeros. */ in mlx4_SW2HW_MPT_wrapper()
2784 if (pd_slave != 0 && --pd_slave != slave) { in mlx4_SW2HW_MPT_wrapper()
2790 /* FMR and Bind Enable are forbidden in slave devices. */ in mlx4_SW2HW_MPT_wrapper()
2804 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt); in mlx4_SW2HW_MPT_wrapper()
2808 err = check_mtt_range(dev, slave, mtt_base, in mlx4_SW2HW_MPT_wrapper()
2816 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_SW2HW_MPT_wrapper()
2822 put_res(dev, slave, mtt->com.res_id, RES_MTT); in mlx4_SW2HW_MPT_wrapper()
2825 res_end_move(dev, slave, RES_MPT, id); in mlx4_SW2HW_MPT_wrapper()
2830 put_res(dev, slave, mtt->com.res_id, RES_MTT); in mlx4_SW2HW_MPT_wrapper()
2832 res_abort_move(dev, slave, RES_MPT, id); in mlx4_SW2HW_MPT_wrapper()
2837 int mlx4_HW2SW_MPT_wrapper(struct mlx4_dev *dev, int slave, in mlx4_HW2SW_MPT_wrapper() argument
2849 err = mr_res_start_move_to(dev, slave, id, RES_MPT_MAPPED, &mpt); in mlx4_HW2SW_MPT_wrapper()
2853 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_HW2SW_MPT_wrapper()
2860 res_end_move(dev, slave, RES_MPT, id); in mlx4_HW2SW_MPT_wrapper()
2864 res_abort_move(dev, slave, RES_MPT, id); in mlx4_HW2SW_MPT_wrapper()
2869 int mlx4_QUERY_MPT_wrapper(struct mlx4_dev *dev, int slave, in mlx4_QUERY_MPT_wrapper() argument
2881 err = get_res(dev, slave, id, RES_MPT, &mpt); in mlx4_QUERY_MPT_wrapper()
2907 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_QUERY_MPT_wrapper()
2915 put_res(dev, slave, id, RES_MPT); in mlx4_QUERY_MPT_wrapper()
2947 static int adjust_qp_sched_queue(struct mlx4_dev *dev, int slave,
2951 int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_RST2INIT_QP_wrapper() argument
2973 err = adjust_qp_sched_queue(dev, slave, qpc, inbox); in mlx4_RST2INIT_QP_wrapper()
2977 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_HW, &qp, 0); in mlx4_RST2INIT_QP_wrapper()
2990 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt); in mlx4_RST2INIT_QP_wrapper()
2994 err = check_mtt_range(dev, slave, mtt_base, mtt_size, mtt); in mlx4_RST2INIT_QP_wrapper()
2998 err = get_res(dev, slave, rcqn, RES_CQ, &rcq); in mlx4_RST2INIT_QP_wrapper()
3003 err = get_res(dev, slave, scqn, RES_CQ, &scq); in mlx4_RST2INIT_QP_wrapper()
3010 err = get_res(dev, slave, srqn, RES_SRQ, &srq); in mlx4_RST2INIT_QP_wrapper()
3016 update_pkey_index(dev, slave, inbox); in mlx4_RST2INIT_QP_wrapper()
3017 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_RST2INIT_QP_wrapper()
3028 put_res(dev, slave, scqn, RES_CQ); in mlx4_RST2INIT_QP_wrapper()
3032 put_res(dev, slave, srqn, RES_SRQ); in mlx4_RST2INIT_QP_wrapper()
3038 put_res(dev, slave, rcqn, RES_CQ); in mlx4_RST2INIT_QP_wrapper()
3039 put_res(dev, slave, mtt_base, RES_MTT); in mlx4_RST2INIT_QP_wrapper()
3040 res_end_move(dev, slave, RES_QP, qpn); in mlx4_RST2INIT_QP_wrapper()
3046 put_res(dev, slave, srqn, RES_SRQ); in mlx4_RST2INIT_QP_wrapper()
3049 put_res(dev, slave, scqn, RES_CQ); in mlx4_RST2INIT_QP_wrapper()
3051 put_res(dev, slave, rcqn, RES_CQ); in mlx4_RST2INIT_QP_wrapper()
3053 put_res(dev, slave, mtt_base, RES_MTT); in mlx4_RST2INIT_QP_wrapper()
3055 res_abort_move(dev, slave, RES_QP, qpn); in mlx4_RST2INIT_QP_wrapper()
3092 int mlx4_SW2HW_EQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_SW2HW_EQ_wrapper() argument
3100 int res_id = (slave << 10) | eqn; in mlx4_SW2HW_EQ_wrapper()
3107 err = add_res_range(dev, slave, res_id, 1, RES_EQ, 0); in mlx4_SW2HW_EQ_wrapper()
3110 err = eq_res_start_move_to(dev, slave, res_id, RES_EQ_HW, &eq); in mlx4_SW2HW_EQ_wrapper()
3114 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt); in mlx4_SW2HW_EQ_wrapper()
3118 err = check_mtt_range(dev, slave, mtt_base, mtt_size, mtt); in mlx4_SW2HW_EQ_wrapper()
3122 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_SW2HW_EQ_wrapper()
3128 put_res(dev, slave, mtt->com.res_id, RES_MTT); in mlx4_SW2HW_EQ_wrapper()
3129 res_end_move(dev, slave, RES_EQ, res_id); in mlx4_SW2HW_EQ_wrapper()
3133 put_res(dev, slave, mtt->com.res_id, RES_MTT); in mlx4_SW2HW_EQ_wrapper()
3135 res_abort_move(dev, slave, RES_EQ, res_id); in mlx4_SW2HW_EQ_wrapper()
3137 rem_res_range(dev, slave, res_id, 1, RES_EQ, 0); in mlx4_SW2HW_EQ_wrapper()
3141 int mlx4_CONFIG_DEV_wrapper(struct mlx4_dev *dev, int slave, in mlx4_CONFIG_DEV_wrapper() argument
3153 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_CONFIG_DEV_wrapper()
3158 static int get_containing_mtt(struct mlx4_dev *dev, int slave, int start, in get_containing_mtt() argument
3167 list_for_each_entry(mtt, &tracker->slave_list[slave].res_list[RES_MTT], in get_containing_mtt()
3169 if (!check_mtt_range(dev, slave, start, len, mtt)) { in get_containing_mtt()
3185 enum qp_transition transition, u8 slave) in verify_qp_parameters() argument
3198 if (slave != mlx4_master_func_num(dev)) { in verify_qp_parameters()
3215 if (slave != mlx4_master_func_num(dev)) { in verify_qp_parameters()
3219 num_gids = mlx4_get_slave_num_gids(dev, slave, port); in verify_qp_parameters()
3228 num_gids = mlx4_get_slave_num_gids(dev, slave, port); in verify_qp_parameters()
3245 slave != mlx4_master_func_num(dev) && in verify_qp_parameters()
3247 !mlx4_vf_smi_enabled(dev, slave, port)) { in verify_qp_parameters()
3249 …mlx4_err(dev, "%s: unprivileged slave %d attempting to create an MLX proxy special QP on port %d\n… in verify_qp_parameters()
3250 __func__, slave, port); in verify_qp_parameters()
3262 int mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave, in mlx4_WRITE_MTT_wrapper() argument
3277 err = get_containing_mtt(dev, slave, start, npages, &rmtt); in mlx4_WRITE_MTT_wrapper()
3295 put_res(dev, slave, rmtt->com.res_id, RES_MTT); in mlx4_WRITE_MTT_wrapper()
3300 int mlx4_HW2SW_EQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_HW2SW_EQ_wrapper() argument
3307 int res_id = eqn | (slave << 10); in mlx4_HW2SW_EQ_wrapper()
3311 err = eq_res_start_move_to(dev, slave, res_id, RES_EQ_RESERVED, &eq); in mlx4_HW2SW_EQ_wrapper()
3315 err = get_res(dev, slave, eq->mtt->com.res_id, RES_MTT, NULL); in mlx4_HW2SW_EQ_wrapper()
3319 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_HW2SW_EQ_wrapper()
3324 put_res(dev, slave, eq->mtt->com.res_id, RES_MTT); in mlx4_HW2SW_EQ_wrapper()
3325 res_end_move(dev, slave, RES_EQ, res_id); in mlx4_HW2SW_EQ_wrapper()
3326 rem_res_range(dev, slave, res_id, 1, RES_EQ, 0); in mlx4_HW2SW_EQ_wrapper()
3331 put_res(dev, slave, eq->mtt->com.res_id, RES_MTT); in mlx4_HW2SW_EQ_wrapper()
3333 res_abort_move(dev, slave, RES_EQ, res_id); in mlx4_HW2SW_EQ_wrapper()
3338 int mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe) in mlx4_GEN_EQE() argument
3351 /* check for slave valid, slave not PF, and slave active */ in mlx4_GEN_EQE()
3352 if (slave < 0 || slave > dev->persist->num_vfs || in mlx4_GEN_EQE()
3353 slave == dev->caps.function || in mlx4_GEN_EQE()
3354 !priv->mfunc.master.slave_state[slave].active) in mlx4_GEN_EQE()
3357 event_eq = &priv->mfunc.master.slave_state[slave].event_eq[eqe->type]; in mlx4_GEN_EQE()
3359 /* Create the event only if the slave is registered */ in mlx4_GEN_EQE()
3363 mutex_lock(&priv->mfunc.master.gen_eqe_mutex[slave]); in mlx4_GEN_EQE()
3364 res_id = (slave << 10) | event_eq->eqn; in mlx4_GEN_EQE()
3365 err = get_res(dev, slave, res_id, RES_EQ, &req); in mlx4_GEN_EQE()
3387 in_modifier = (slave & 0xff) | ((event_eq->eqn & 0x3ff) << 16); in mlx4_GEN_EQE()
3393 put_res(dev, slave, res_id, RES_EQ); in mlx4_GEN_EQE()
3394 mutex_unlock(&priv->mfunc.master.gen_eqe_mutex[slave]); in mlx4_GEN_EQE()
3399 put_res(dev, slave, res_id, RES_EQ); in mlx4_GEN_EQE()
3402 mutex_unlock(&priv->mfunc.master.gen_eqe_mutex[slave]); in mlx4_GEN_EQE()
3406 int mlx4_QUERY_EQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_QUERY_EQ_wrapper() argument
3413 int res_id = eqn | (slave << 10); in mlx4_QUERY_EQ_wrapper()
3417 err = get_res(dev, slave, res_id, RES_EQ, &eq); in mlx4_QUERY_EQ_wrapper()
3426 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_QUERY_EQ_wrapper()
3429 put_res(dev, slave, res_id, RES_EQ); in mlx4_QUERY_EQ_wrapper()
3433 int mlx4_SW2HW_CQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_SW2HW_CQ_wrapper() argument
3446 err = cq_res_start_move_to(dev, slave, cqn, RES_CQ_HW, &cq); in mlx4_SW2HW_CQ_wrapper()
3449 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt); in mlx4_SW2HW_CQ_wrapper()
3452 err = check_mtt_range(dev, slave, mtt_base, cq_get_mtt_size(cqc), mtt); in mlx4_SW2HW_CQ_wrapper()
3455 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_SW2HW_CQ_wrapper()
3460 put_res(dev, slave, mtt->com.res_id, RES_MTT); in mlx4_SW2HW_CQ_wrapper()
3461 res_end_move(dev, slave, RES_CQ, cqn); in mlx4_SW2HW_CQ_wrapper()
3465 put_res(dev, slave, mtt->com.res_id, RES_MTT); in mlx4_SW2HW_CQ_wrapper()
3467 res_abort_move(dev, slave, RES_CQ, cqn); in mlx4_SW2HW_CQ_wrapper()
3471 int mlx4_HW2SW_CQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_HW2SW_CQ_wrapper() argument
3481 err = cq_res_start_move_to(dev, slave, cqn, RES_CQ_ALLOCATED, &cq); in mlx4_HW2SW_CQ_wrapper()
3484 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_HW2SW_CQ_wrapper()
3488 res_end_move(dev, slave, RES_CQ, cqn); in mlx4_HW2SW_CQ_wrapper()
3492 res_abort_move(dev, slave, RES_CQ, cqn); in mlx4_HW2SW_CQ_wrapper()
3496 int mlx4_QUERY_CQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_QUERY_CQ_wrapper() argument
3506 err = get_res(dev, slave, cqn, RES_CQ, &cq); in mlx4_QUERY_CQ_wrapper()
3513 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_QUERY_CQ_wrapper()
3515 put_res(dev, slave, cqn, RES_CQ); in mlx4_QUERY_CQ_wrapper()
3520 static int handle_resize(struct mlx4_dev *dev, int slave, in handle_resize() argument
3533 err = get_res(dev, slave, cq->mtt->com.res_id, RES_MTT, &orig_mtt); in handle_resize()
3542 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt); in handle_resize()
3546 err = check_mtt_range(dev, slave, mtt_base, cq_get_mtt_size(cqc), mtt); in handle_resize()
3549 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in handle_resize()
3553 put_res(dev, slave, orig_mtt->com.res_id, RES_MTT); in handle_resize()
3556 put_res(dev, slave, mtt->com.res_id, RES_MTT); in handle_resize()
3560 put_res(dev, slave, mtt->com.res_id, RES_MTT); in handle_resize()
3562 put_res(dev, slave, orig_mtt->com.res_id, RES_MTT); in handle_resize()
3568 int mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_MODIFY_CQ_wrapper() argument
3578 err = get_res(dev, slave, cqn, RES_CQ, &cq); in mlx4_MODIFY_CQ_wrapper()
3586 err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq); in mlx4_MODIFY_CQ_wrapper()
3590 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_MODIFY_CQ_wrapper()
3592 put_res(dev, slave, cqn, RES_CQ); in mlx4_MODIFY_CQ_wrapper()
3609 int mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_SW2HW_SRQ_wrapper() argument
3625 err = srq_res_start_move_to(dev, slave, srqn, RES_SRQ_HW, &srq); in mlx4_SW2HW_SRQ_wrapper()
3628 err = get_res(dev, slave, mtt_base, RES_MTT, &mtt); in mlx4_SW2HW_SRQ_wrapper()
3631 err = check_mtt_range(dev, slave, mtt_base, srq_get_mtt_size(srqc), in mlx4_SW2HW_SRQ_wrapper()
3636 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_SW2HW_SRQ_wrapper()
3642 put_res(dev, slave, mtt->com.res_id, RES_MTT); in mlx4_SW2HW_SRQ_wrapper()
3643 res_end_move(dev, slave, RES_SRQ, srqn); in mlx4_SW2HW_SRQ_wrapper()
3647 put_res(dev, slave, mtt->com.res_id, RES_MTT); in mlx4_SW2HW_SRQ_wrapper()
3649 res_abort_move(dev, slave, RES_SRQ, srqn); in mlx4_SW2HW_SRQ_wrapper()
3654 int mlx4_HW2SW_SRQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_HW2SW_SRQ_wrapper() argument
3664 err = srq_res_start_move_to(dev, slave, srqn, RES_SRQ_ALLOCATED, &srq); in mlx4_HW2SW_SRQ_wrapper()
3667 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_HW2SW_SRQ_wrapper()
3673 res_end_move(dev, slave, RES_SRQ, srqn); in mlx4_HW2SW_SRQ_wrapper()
3678 res_abort_move(dev, slave, RES_SRQ, srqn); in mlx4_HW2SW_SRQ_wrapper()
3683 int mlx4_QUERY_SRQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_QUERY_SRQ_wrapper() argument
3693 err = get_res(dev, slave, srqn, RES_SRQ, &srq); in mlx4_QUERY_SRQ_wrapper()
3700 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_QUERY_SRQ_wrapper()
3702 put_res(dev, slave, srqn, RES_SRQ); in mlx4_QUERY_SRQ_wrapper()
3706 int mlx4_ARM_SRQ_wrapper(struct mlx4_dev *dev, int slave, in mlx4_ARM_SRQ_wrapper() argument
3716 err = get_res(dev, slave, srqn, RES_SRQ, &srq); in mlx4_ARM_SRQ_wrapper()
3725 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_ARM_SRQ_wrapper()
3727 put_res(dev, slave, srqn, RES_SRQ); in mlx4_ARM_SRQ_wrapper()
3731 int mlx4_GEN_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_GEN_QP_wrapper() argument
3741 err = get_res(dev, slave, qpn, RES_QP, &qp); in mlx4_GEN_QP_wrapper()
3749 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_GEN_QP_wrapper()
3751 put_res(dev, slave, qpn, RES_QP); in mlx4_GEN_QP_wrapper()
3755 int mlx4_INIT2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_INIT2INIT_QP_wrapper() argument
3763 update_pkey_index(dev, slave, inbox); in mlx4_INIT2INIT_QP_wrapper()
3764 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_INIT2INIT_QP_wrapper()
3767 static int adjust_qp_sched_queue(struct mlx4_dev *dev, int slave, in adjust_qp_sched_queue() argument
3774 dev, slave, (qpc->pri_path.sched_queue >> 6 & 1) + 1) - 1; in adjust_qp_sched_queue()
3789 dev, slave, (qpc->alt_path.sched_queue >> 6 & 1) in adjust_qp_sched_queue()
3800 static int roce_verify_mac(struct mlx4_dev *dev, int slave, in roce_verify_mac() argument
3813 if (mac_find_smac_ix_in_slave(dev, slave, port, smac_ix, &mac)) in roce_verify_mac()
3819 int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_INIT2RTR_QP_wrapper() argument
3836 err = adjust_qp_sched_queue(dev, slave, qpc, inbox); in mlx4_INIT2RTR_QP_wrapper()
3839 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_INIT2RTR, slave); in mlx4_INIT2RTR_QP_wrapper()
3843 if (roce_verify_mac(dev, slave, qpc, inbox)) in mlx4_INIT2RTR_QP_wrapper()
3846 update_pkey_index(dev, slave, inbox); in mlx4_INIT2RTR_QP_wrapper()
3847 update_gid(dev, inbox, (u8)slave); in mlx4_INIT2RTR_QP_wrapper()
3851 err = get_res(dev, slave, qpn, RES_QP, &qp); in mlx4_INIT2RTR_QP_wrapper()
3859 err = update_vport_qp_param(dev, inbox, slave, qpn); in mlx4_INIT2RTR_QP_wrapper()
3863 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_INIT2RTR_QP_wrapper()
3877 put_res(dev, slave, qpn, RES_QP); in mlx4_INIT2RTR_QP_wrapper()
3881 int mlx4_RTR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_RTR2RTS_QP_wrapper() argument
3890 err = adjust_qp_sched_queue(dev, slave, context, inbox); in mlx4_RTR2RTS_QP_wrapper()
3893 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTR2RTS, slave); in mlx4_RTR2RTS_QP_wrapper()
3897 update_pkey_index(dev, slave, inbox); in mlx4_RTR2RTS_QP_wrapper()
3898 update_gid(dev, inbox, (u8)slave); in mlx4_RTR2RTS_QP_wrapper()
3900 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_RTR2RTS_QP_wrapper()
3903 int mlx4_RTS2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_RTS2RTS_QP_wrapper() argument
3912 err = adjust_qp_sched_queue(dev, slave, context, inbox); in mlx4_RTS2RTS_QP_wrapper()
3915 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTS2RTS, slave); in mlx4_RTS2RTS_QP_wrapper()
3919 update_pkey_index(dev, slave, inbox); in mlx4_RTS2RTS_QP_wrapper()
3920 update_gid(dev, inbox, (u8)slave); in mlx4_RTS2RTS_QP_wrapper()
3922 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_RTS2RTS_QP_wrapper()
3926 int mlx4_SQERR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_SQERR2RTS_QP_wrapper() argument
3933 int err = adjust_qp_sched_queue(dev, slave, context, inbox); in mlx4_SQERR2RTS_QP_wrapper()
3937 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_SQERR2RTS_QP_wrapper()
3940 int mlx4_SQD2SQD_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_SQD2SQD_QP_wrapper() argument
3949 err = adjust_qp_sched_queue(dev, slave, context, inbox); in mlx4_SQD2SQD_QP_wrapper()
3952 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2SQD, slave); in mlx4_SQD2SQD_QP_wrapper()
3957 update_gid(dev, inbox, (u8)slave); in mlx4_SQD2SQD_QP_wrapper()
3958 update_pkey_index(dev, slave, inbox); in mlx4_SQD2SQD_QP_wrapper()
3959 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_SQD2SQD_QP_wrapper()
3962 int mlx4_SQD2RTS_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_SQD2RTS_QP_wrapper() argument
3971 err = adjust_qp_sched_queue(dev, slave, context, inbox); in mlx4_SQD2RTS_QP_wrapper()
3974 err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2RTS, slave); in mlx4_SQD2RTS_QP_wrapper()
3979 update_gid(dev, inbox, (u8)slave); in mlx4_SQD2RTS_QP_wrapper()
3980 update_pkey_index(dev, slave, inbox); in mlx4_SQD2RTS_QP_wrapper()
3981 return mlx4_GEN_QP_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_SQD2RTS_QP_wrapper()
3984 int mlx4_2RST_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_2RST_QP_wrapper() argument
3994 err = qp_res_start_move_to(dev, slave, qpn, RES_QP_MAPPED, &qp, 0); in mlx4_2RST_QP_wrapper()
3997 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_2RST_QP_wrapper()
4006 res_end_move(dev, slave, RES_QP, qpn); in mlx4_2RST_QP_wrapper()
4010 res_abort_move(dev, slave, RES_QP, qpn); in mlx4_2RST_QP_wrapper()
4015 static struct res_gid *find_gid(struct mlx4_dev *dev, int slave, in find_gid() argument
4027 static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, in add_mcg_res() argument
4039 if (find_gid(dev, slave, rqp, gid)) { in add_mcg_res()
4055 static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, in rem_mcg_res() argument
4063 res = find_gid(dev, slave, rqp, gid); in rem_mcg_res()
4077 static int qp_attach(struct mlx4_dev *dev, int slave, struct mlx4_qp *qp, in qp_attach() argument
4083 int port = mlx4_slave_convert_port(dev, slave, gid[5]); in qp_attach()
4092 int port = mlx4_slave_convert_port(dev, slave, gid[5]); in qp_attach()
4118 static int mlx4_adjust_port(struct mlx4_dev *dev, int slave, in mlx4_adjust_port() argument
4128 real_port = mlx4_slave_convert_port(dev, slave, gid[5]); in mlx4_adjust_port()
4137 int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, in mlx4_QP_ATTACH_wrapper() argument
4156 err = get_res(dev, slave, qpn, RES_QP, &rqp); in mlx4_QP_ATTACH_wrapper()
4162 err = qp_attach(dev, slave, &qp, gid, block_loopback, prot, in mlx4_QP_ATTACH_wrapper()
4168 err = add_mcg_res(dev, slave, rqp, gid, prot, type, reg_id); in mlx4_QP_ATTACH_wrapper()
4172 err = mlx4_adjust_port(dev, slave, gid, prot); in mlx4_QP_ATTACH_wrapper()
4176 err = rem_mcg_res(dev, slave, rqp, gid, prot, type, &reg_id); in mlx4_QP_ATTACH_wrapper()
4185 put_res(dev, slave, qpn, RES_QP); in mlx4_QP_ATTACH_wrapper()
4191 put_res(dev, slave, qpn, RES_QP); in mlx4_QP_ATTACH_wrapper()
4199 static int validate_eth_header_mac(int slave, struct _rule_hw *eth_header, in validate_eth_header_mac() argument
4214 eth_header->eth.dst_mac, slave); in validate_eth_header_mac()
4224 static int add_eth_header(struct mlx4_dev *dev, int slave, in add_eth_header() argument
4283 int mlx4_UPDATE_QP_wrapper(struct mlx4_dev *dev, int slave, in mlx4_UPDATE_QP_wrapper() argument
4309 mlx4_warn(dev, "Src check LB for slave %d isn't supported\n", in mlx4_UPDATE_QP_wrapper()
4310 slave); in mlx4_UPDATE_QP_wrapper()
4315 err = get_res(dev, slave, qpn, RES_QP, &rqp); in mlx4_UPDATE_QP_wrapper()
4317 mlx4_err(dev, "Updating qpn 0x%x for slave %d rejected\n", qpn, slave); in mlx4_UPDATE_QP_wrapper()
4325 err = mac_find_smac_ix_in_slave(dev, slave, port, in mlx4_UPDATE_QP_wrapper()
4345 put_res(dev, slave, qpn, RES_QP); in mlx4_UPDATE_QP_wrapper()
4365 int mlx4_QP_FLOW_STEERING_ATTACH_wrapper(struct mlx4_dev *dev, int slave, in mlx4_QP_FLOW_STEERING_ATTACH_wrapper() argument
4374 struct list_head *rlist = &tracker->slave_list[slave].res_list[RES_MAC]; in mlx4_QP_FLOW_STEERING_ATTACH_wrapper()
4389 err = mlx4_slave_convert_port(dev, slave, ctrl->port); in mlx4_QP_FLOW_STEERING_ATTACH_wrapper()
4394 err = get_res(dev, slave, qpn, RES_QP, &rqp); in mlx4_QP_FLOW_STEERING_ATTACH_wrapper()
4407 if (validate_eth_header_mac(slave, rule_header, rlist)) { in mlx4_QP_FLOW_STEERING_ATTACH_wrapper()
4418 if (add_eth_header(dev, slave, inbox, rlist, header_id)) { in mlx4_QP_FLOW_STEERING_ATTACH_wrapper()
4439 err = add_res_range(dev, slave, vhcr->out_param, 1, RES_FS_RULE, qpn); in mlx4_QP_FLOW_STEERING_ATTACH_wrapper()
4445 err = get_res(dev, slave, vhcr->out_param, RES_FS_RULE, &rrule); in mlx4_QP_FLOW_STEERING_ATTACH_wrapper()
4472 put_res(dev, slave, vhcr->out_param, RES_FS_RULE); in mlx4_QP_FLOW_STEERING_ATTACH_wrapper()
4480 put_res(dev, slave, qpn, RES_QP); in mlx4_QP_FLOW_STEERING_ATTACH_wrapper()
4499 int mlx4_QP_FLOW_STEERING_DETACH_wrapper(struct mlx4_dev *dev, int slave, in mlx4_QP_FLOW_STEERING_DETACH_wrapper() argument
4515 err = get_res(dev, slave, vhcr->in_param, RES_FS_RULE, &rrule); in mlx4_QP_FLOW_STEERING_DETACH_wrapper()
4521 put_res(dev, slave, vhcr->in_param, RES_FS_RULE); in mlx4_QP_FLOW_STEERING_DETACH_wrapper()
4529 put_res(dev, slave, vhcr->in_param, RES_FS_RULE); in mlx4_QP_FLOW_STEERING_DETACH_wrapper()
4530 err = get_res(dev, slave, qpn, RES_QP, &rqp); in mlx4_QP_FLOW_STEERING_DETACH_wrapper()
4535 err = get_res(dev, slave, mirr_reg_id, RES_FS_RULE, &rrule); in mlx4_QP_FLOW_STEERING_DETACH_wrapper()
4539 put_res(dev, slave, mirr_reg_id, RES_FS_RULE); in mlx4_QP_FLOW_STEERING_DETACH_wrapper()
4543 err = rem_res_range(dev, slave, vhcr->in_param, 1, RES_FS_RULE, 0); in mlx4_QP_FLOW_STEERING_DETACH_wrapper()
4555 put_res(dev, slave, qpn, RES_QP); in mlx4_QP_FLOW_STEERING_DETACH_wrapper()
4563 int mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave, in mlx4_QUERY_IF_STAT_wrapper() argument
4572 err = get_res(dev, slave, index, RES_COUNTER, NULL); in mlx4_QUERY_IF_STAT_wrapper()
4576 err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); in mlx4_QUERY_IF_STAT_wrapper()
4577 put_res(dev, slave, index, RES_COUNTER); in mlx4_QUERY_IF_STAT_wrapper()
4581 static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp) in detach_qp() argument
4603 static int _move_all_busy(struct mlx4_dev *dev, int slave, in _move_all_busy() argument
4609 struct list_head *rlist = &tracker->slave_list[slave].res_list[type]; in _move_all_busy()
4617 if (r->owner == slave) { in _move_all_busy()
4639 static int move_all_busy(struct mlx4_dev *dev, int slave, in move_all_busy() argument
4647 busy = _move_all_busy(dev, slave, type, 0); in move_all_busy()
4655 busy = _move_all_busy(dev, slave, type, 1); in move_all_busy()
4659 static void rem_slave_qps(struct mlx4_dev *dev, int slave) in rem_slave_qps() argument
4664 &tracker->slave_list[slave].res_list[RES_QP]; in rem_slave_qps()
4672 err = move_all_busy(dev, slave, RES_QP); in rem_slave_qps()
4674 mlx4_warn(dev, "rem_slave_qps: Could not move all qps to busy for slave %d\n", in rem_slave_qps()
4675 slave); in rem_slave_qps()
4680 if (qp->com.owner == slave) { in rem_slave_qps()
4682 detach_qp(dev, slave, qp); in rem_slave_qps()
4692 if (!valid_reserved(dev, slave, qpn)) { in rem_slave_qps()
4694 mlx4_release_resource(dev, slave, in rem_slave_qps()
4701 if (!valid_reserved(dev, slave, qpn)) in rem_slave_qps()
4706 in_param = slave; in rem_slave_qps()
4713 mlx4_dbg(dev, "rem_slave_qps: failed to move slave %d qpn %d to reset\n", in rem_slave_qps()
4714 slave, qp->local_qpn); in rem_slave_qps()
4732 static void rem_slave_srqs(struct mlx4_dev *dev, int slave) in rem_slave_srqs() argument
4737 &tracker->slave_list[slave].res_list[RES_SRQ]; in rem_slave_srqs()
4745 err = move_all_busy(dev, slave, RES_SRQ); in rem_slave_srqs()
4747 mlx4_warn(dev, "rem_slave_srqs: Could not move all srqs - too busy for slave %d\n", in rem_slave_srqs()
4748 slave); in rem_slave_srqs()
4753 if (srq->com.owner == slave) { in rem_slave_srqs()
4765 mlx4_release_resource(dev, slave, in rem_slave_srqs()
4772 in_param = slave; in rem_slave_srqs()
4778 mlx4_dbg(dev, "rem_slave_srqs: failed to move slave %d srq %d to SW ownership\n", in rem_slave_srqs()
4779 slave, srqn); in rem_slave_srqs()
4797 static void rem_slave_cqs(struct mlx4_dev *dev, int slave) in rem_slave_cqs() argument
4802 &tracker->slave_list[slave].res_list[RES_CQ]; in rem_slave_cqs()
4810 err = move_all_busy(dev, slave, RES_CQ); in rem_slave_cqs()
4812 mlx4_warn(dev, "rem_slave_cqs: Could not move all cqs - too busy for slave %d\n", in rem_slave_cqs()
4813 slave); in rem_slave_cqs()
4818 if (cq->com.owner == slave && !atomic_read(&cq->ref_count)) { in rem_slave_cqs()
4830 mlx4_release_resource(dev, slave, in rem_slave_cqs()
4837 in_param = slave; in rem_slave_cqs()
4843 mlx4_dbg(dev, "rem_slave_cqs: failed to move slave %d cq %d to SW ownership\n", in rem_slave_cqs()
4844 slave, cqn); in rem_slave_cqs()
4859 static void rem_slave_mrs(struct mlx4_dev *dev, int slave) in rem_slave_mrs() argument
4864 &tracker->slave_list[slave].res_list[RES_MPT]; in rem_slave_mrs()
4872 err = move_all_busy(dev, slave, RES_MPT); in rem_slave_mrs()
4874 mlx4_warn(dev, "rem_slave_mrs: Could not move all mpts - too busy for slave %d\n", in rem_slave_mrs()
4875 slave); in rem_slave_mrs()
4880 if (mpt->com.owner == slave) { in rem_slave_mrs()
4892 mlx4_release_resource(dev, slave, in rem_slave_mrs()
4904 in_param = slave; in rem_slave_mrs()
4910 mlx4_dbg(dev, "rem_slave_mrs: failed to move slave %d mpt %d to SW ownership\n", in rem_slave_mrs()
4911 slave, mptn); in rem_slave_mrs()
4926 static void rem_slave_mtts(struct mlx4_dev *dev, int slave) in rem_slave_mtts() argument
4932 &tracker->slave_list[slave].res_list[RES_MTT]; in rem_slave_mtts()
4939 err = move_all_busy(dev, slave, RES_MTT); in rem_slave_mtts()
4941 mlx4_warn(dev, "rem_slave_mtts: Could not move all mtts - too busy for slave %d\n", in rem_slave_mtts()
4942 slave); in rem_slave_mtts()
4947 if (mtt->com.owner == slave) { in rem_slave_mtts()
4960 mlx4_release_resource(dev, slave, RES_MTT, in rem_slave_mtts()
5061 static void rem_slave_fs_rule(struct mlx4_dev *dev, int slave) in rem_slave_fs_rule() argument
5067 &tracker->slave_list[slave].res_list[RES_FS_RULE]; in rem_slave_fs_rule()
5074 err = move_all_busy(dev, slave, RES_FS_RULE); in rem_slave_fs_rule()
5076 mlx4_warn(dev, "rem_slave_fs_rule: Could not move all mtts to busy for slave %d\n", in rem_slave_fs_rule()
5077 slave); in rem_slave_fs_rule()
5082 if (fs_rule->com.owner == slave) { in rem_slave_fs_rule()
5114 static void rem_slave_eqs(struct mlx4_dev *dev, int slave) in rem_slave_eqs() argument
5119 &tracker->slave_list[slave].res_list[RES_EQ]; in rem_slave_eqs()
5126 err = move_all_busy(dev, slave, RES_EQ); in rem_slave_eqs()
5128 mlx4_warn(dev, "rem_slave_eqs: Could not move all eqs - too busy for slave %d\n", in rem_slave_eqs()
5129 slave); in rem_slave_eqs()
5134 if (eq->com.owner == slave) { in rem_slave_eqs()
5150 err = mlx4_cmd(dev, slave, eqn & 0x3ff, in rem_slave_eqs()
5155 mlx4_dbg(dev, "rem_slave_eqs: failed to move slave %d eqs %d to SW ownership\n", in rem_slave_eqs()
5156 slave, eqn & 0x3ff); in rem_slave_eqs()
5171 static void rem_slave_counters(struct mlx4_dev *dev, int slave) in rem_slave_counters() argument
5176 &tracker->slave_list[slave].res_list[RES_COUNTER]; in rem_slave_counters()
5183 err = move_all_busy(dev, slave, RES_COUNTER); in rem_slave_counters()
5185 mlx4_warn(dev, "rem_slave_counters: Could not move all counters - too busy for slave %d\n", in rem_slave_counters()
5186 slave); in rem_slave_counters()
5198 if (counter->com.owner == slave) { in rem_slave_counters()
5210 mlx4_release_resource(dev, slave, RES_COUNTER, 1, 0); in rem_slave_counters()
5217 static void rem_slave_xrcdns(struct mlx4_dev *dev, int slave) in rem_slave_xrcdns() argument
5222 &tracker->slave_list[slave].res_list[RES_XRCD]; in rem_slave_xrcdns()
5228 err = move_all_busy(dev, slave, RES_XRCD); in rem_slave_xrcdns()
5230 mlx4_warn(dev, "rem_slave_xrcdns: Could not move all xrcdns - too busy for slave %d\n", in rem_slave_xrcdns()
5231 slave); in rem_slave_xrcdns()
5235 if (xrcd->com.owner == slave) { in rem_slave_xrcdns()
5246 void mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave) in mlx4_delete_all_resources_for_slave() argument
5249 mlx4_reset_roce_gids(dev, slave); in mlx4_delete_all_resources_for_slave()
5250 mutex_lock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex); in mlx4_delete_all_resources_for_slave()
5251 rem_slave_vlans(dev, slave); in mlx4_delete_all_resources_for_slave()
5252 rem_slave_macs(dev, slave); in mlx4_delete_all_resources_for_slave()
5253 rem_slave_fs_rule(dev, slave); in mlx4_delete_all_resources_for_slave()
5254 rem_slave_qps(dev, slave); in mlx4_delete_all_resources_for_slave()
5255 rem_slave_srqs(dev, slave); in mlx4_delete_all_resources_for_slave()
5256 rem_slave_cqs(dev, slave); in mlx4_delete_all_resources_for_slave()
5257 rem_slave_mrs(dev, slave); in mlx4_delete_all_resources_for_slave()
5258 rem_slave_eqs(dev, slave); in mlx4_delete_all_resources_for_slave()
5259 rem_slave_mtts(dev, slave); in mlx4_delete_all_resources_for_slave()
5260 rem_slave_counters(dev, slave); in mlx4_delete_all_resources_for_slave()
5261 rem_slave_xrcdns(dev, slave); in mlx4_delete_all_resources_for_slave()
5262 mutex_unlock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex); in mlx4_delete_all_resources_for_slave()
5282 &tracker->slave_list[work->slave].res_list[RES_QP]; in mlx4_vf_immed_vlan_work_handler()
5307 mlx4_warn(dev, "Trying to update-qp in slave %d\n", in mlx4_vf_immed_vlan_work_handler()
5308 work->slave); in mlx4_vf_immed_vlan_work_handler()
5341 if (qp->com.owner == work->slave) { in mlx4_vf_immed_vlan_work_handler()
5397 mlx4_info(dev, "UPDATE_QP failed for slave %d, port %d, qpn %d (%d)\n", in mlx4_vf_immed_vlan_work_handler()
5398 work->slave, port, qp->local_qpn, err); in mlx4_vf_immed_vlan_work_handler()
5408 mlx4_err(dev, "%d UPDATE_QP failures for slave %d, port %d\n", in mlx4_vf_immed_vlan_work_handler()
5409 errors, work->slave, work->port); in mlx4_vf_immed_vlan_work_handler()