| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) |
|---|
| 1 | 2 | /* QLogic qed NIC Driver |
|---|
| 2 | 3 | * Copyright (c) 2015-2017 QLogic Corporation |
|---|
| 3 | | - * |
|---|
| 4 | | - * This software is available to you under a choice of one of two |
|---|
| 5 | | - * licenses. You may choose to be licensed under the terms of the GNU |
|---|
| 6 | | - * General Public License (GPL) Version 2, available from the file |
|---|
| 7 | | - * COPYING in the main directory of this source tree, or the |
|---|
| 8 | | - * OpenIB.org BSD license below: |
|---|
| 9 | | - * |
|---|
| 10 | | - * Redistribution and use in source and binary forms, with or |
|---|
| 11 | | - * without modification, are permitted provided that the following |
|---|
| 12 | | - * conditions are met: |
|---|
| 13 | | - * |
|---|
| 14 | | - * - Redistributions of source code must retain the above |
|---|
| 15 | | - * copyright notice, this list of conditions and the following |
|---|
| 16 | | - * disclaimer. |
|---|
| 17 | | - * |
|---|
| 18 | | - * - Redistributions in binary form must reproduce the above |
|---|
| 19 | | - * copyright notice, this list of conditions and the following |
|---|
| 20 | | - * disclaimer in the documentation and /or other materials |
|---|
| 21 | | - * provided with the distribution. |
|---|
| 22 | | - * |
|---|
| 23 | | - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|---|
| 24 | | - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|---|
| 25 | | - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|---|
| 26 | | - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
|---|
| 27 | | - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|---|
| 28 | | - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|---|
| 29 | | - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|---|
| 30 | | - * SOFTWARE. |
|---|
| 4 | + * Copyright (c) 2019-2020 Marvell International Ltd. |
|---|
| 31 | 5 | */ |
|---|
| 6 | + |
|---|
| 32 | 7 | #include <linux/types.h> |
|---|
| 33 | 8 | #include <asm/byteorder.h> |
|---|
| 34 | 9 | #include <linux/bitops.h> |
|---|
| .. | .. |
|---|
| 212 | 187 | goto free_rdma_port; |
|---|
| 213 | 188 | } |
|---|
| 214 | 189 | |
|---|
| 190 | + /* Allocate bit map for XRC Domains */ |
|---|
| 191 | + rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->xrcd_map, |
|---|
| 192 | + QED_RDMA_MAX_XRCDS, "XRCD"); |
|---|
| 193 | + if (rc) { |
|---|
| 194 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
|---|
| 195 | + "Failed to allocate xrcd_map,rc = %d\n", rc); |
|---|
| 196 | + goto free_pd_map; |
|---|
| 197 | + } |
|---|
| 198 | + |
|---|
| 215 | 199 | /* Allocate DPI bitmap */ |
|---|
| 216 | 200 | rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->dpi_map, |
|---|
| 217 | 201 | p_hwfn->dpi_count, "DPI"); |
|---|
| 218 | 202 | if (rc) { |
|---|
| 219 | 203 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
|---|
| 220 | 204 | "Failed to allocate DPI bitmap, rc = %d\n", rc); |
|---|
| 221 | | - goto free_pd_map; |
|---|
| 205 | + goto free_xrcd_map; |
|---|
| 222 | 206 | } |
|---|
| 223 | 207 | |
|---|
| 224 | 208 | /* Allocate bitmap for cq's. The maximum number of CQs is bound to |
|---|
| .. | .. |
|---|
| 271 | 255 | goto free_cid_map; |
|---|
| 272 | 256 | } |
|---|
| 273 | 257 | |
|---|
| 258 | + /* The first SRQ follows the last XRC SRQ. This means that the |
|---|
| 259 | + * SRQ IDs start from an offset equals to max_xrc_srqs. |
|---|
| 260 | + */ |
|---|
| 261 | + p_rdma_info->srq_id_offset = p_hwfn->p_cxt_mngr->xrc_srq_count; |
|---|
| 262 | + rc = qed_rdma_bmap_alloc(p_hwfn, |
|---|
| 263 | + &p_rdma_info->xrc_srq_map, |
|---|
| 264 | + p_hwfn->p_cxt_mngr->xrc_srq_count, "XRC SRQ"); |
|---|
| 265 | + if (rc) { |
|---|
| 266 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
|---|
| 267 | + "Failed to allocate xrc srq bitmap, rc = %d\n", rc); |
|---|
| 268 | + goto free_real_cid_map; |
|---|
| 269 | + } |
|---|
| 270 | + |
|---|
| 274 | 271 | /* Allocate bitmap for srqs */ |
|---|
| 275 | | - p_rdma_info->num_srqs = qed_cxt_get_srq_count(p_hwfn); |
|---|
| 272 | + p_rdma_info->num_srqs = p_hwfn->p_cxt_mngr->srq_count; |
|---|
| 276 | 273 | rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->srq_map, |
|---|
| 277 | 274 | p_rdma_info->num_srqs, "SRQ"); |
|---|
| 278 | 275 | if (rc) { |
|---|
| 279 | 276 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
|---|
| 280 | 277 | "Failed to allocate srq bitmap, rc = %d\n", rc); |
|---|
| 281 | | - goto free_real_cid_map; |
|---|
| 278 | + goto free_xrc_srq_map; |
|---|
| 282 | 279 | } |
|---|
| 283 | 280 | |
|---|
| 284 | 281 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) |
|---|
| .. | .. |
|---|
| 292 | 289 | |
|---|
| 293 | 290 | free_srq_map: |
|---|
| 294 | 291 | kfree(p_rdma_info->srq_map.bitmap); |
|---|
| 292 | +free_xrc_srq_map: |
|---|
| 293 | + kfree(p_rdma_info->xrc_srq_map.bitmap); |
|---|
| 295 | 294 | free_real_cid_map: |
|---|
| 296 | 295 | kfree(p_rdma_info->real_cid_map.bitmap); |
|---|
| 297 | 296 | free_cid_map: |
|---|
| .. | .. |
|---|
| 304 | 303 | kfree(p_rdma_info->cq_map.bitmap); |
|---|
| 305 | 304 | free_dpi_map: |
|---|
| 306 | 305 | kfree(p_rdma_info->dpi_map.bitmap); |
|---|
| 306 | +free_xrcd_map: |
|---|
| 307 | + kfree(p_rdma_info->xrcd_map.bitmap); |
|---|
| 307 | 308 | free_pd_map: |
|---|
| 308 | 309 | kfree(p_rdma_info->pd_map.bitmap); |
|---|
| 309 | 310 | free_rdma_port: |
|---|
| .. | .. |
|---|
| 377 | 378 | qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->tid_map, 1); |
|---|
| 378 | 379 | qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->srq_map, 1); |
|---|
| 379 | 380 | qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->real_cid_map, 1); |
|---|
| 381 | + qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->xrc_srq_map, 1); |
|---|
| 382 | + qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->xrcd_map, 1); |
|---|
| 380 | 383 | |
|---|
| 381 | 384 | kfree(p_rdma_info->port); |
|---|
| 382 | 385 | kfree(p_rdma_info->dev); |
|---|
| .. | .. |
|---|
| 499 | 502 | dev->max_cqe = QED_RDMA_MAX_CQE_16_BIT; |
|---|
| 500 | 503 | |
|---|
| 501 | 504 | dev->max_mw = 0; |
|---|
| 502 | | - dev->max_fmr = QED_RDMA_MAX_FMR; |
|---|
| 503 | 505 | dev->max_mr_mw_fmr_pbl = (PAGE_SIZE / 8) * (PAGE_SIZE / 8); |
|---|
| 504 | 506 | dev->max_mr_mw_fmr_size = dev->max_mr_mw_fmr_pbl * PAGE_SIZE; |
|---|
| 505 | | - dev->max_pkey = QED_RDMA_MAX_P_KEY; |
|---|
| 507 | + if (QED_IS_ROCE_PERSONALITY(p_hwfn)) |
|---|
| 508 | + dev->max_pkey = QED_RDMA_MAX_P_KEY; |
|---|
| 506 | 509 | |
|---|
| 507 | 510 | dev->max_srq = p_hwfn->p_rdma_info->num_srqs; |
|---|
| 508 | 511 | dev->max_srq_wr = QED_RDMA_MAX_SRQ_WQE_ELEM; |
|---|
| .. | .. |
|---|
| 530 | 533 | SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_LOCAL_INV_FENCE, 1); |
|---|
| 531 | 534 | |
|---|
| 532 | 535 | /* Check atomic operations support in PCI configuration space. */ |
|---|
| 533 | | - pci_read_config_dword(cdev->pdev, |
|---|
| 534 | | - cdev->pdev->pcie_cap + PCI_EXP_DEVCTL2, |
|---|
| 535 | | - &pci_status_control); |
|---|
| 536 | + pcie_capability_read_dword(cdev->pdev, PCI_EXP_DEVCTL2, |
|---|
| 537 | + &pci_status_control); |
|---|
| 536 | 538 | |
|---|
| 537 | 539 | if (pci_status_control & PCI_EXP_DEVCTL2_LTR_EN) |
|---|
| 538 | 540 | SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_ATOMIC_OP, 1); |
|---|
| .. | .. |
|---|
| 613 | 615 | p_params_header->cnq_start_offset = (u8)RESC_START(p_hwfn, |
|---|
| 614 | 616 | QED_RDMA_CNQ_RAM); |
|---|
| 615 | 617 | p_params_header->num_cnqs = params->desired_cnq; |
|---|
| 616 | | - |
|---|
| 618 | + p_params_header->first_reg_srq_id = |
|---|
| 619 | + cpu_to_le16(p_hwfn->p_rdma_info->srq_id_offset); |
|---|
| 620 | + p_params_header->reg_srq_base_addr = |
|---|
| 621 | + cpu_to_le32(qed_cxt_get_ilt_page_size(p_hwfn, ILT_CLI_TSDM)); |
|---|
| 617 | 622 | if (params->cq_mode == QED_RDMA_CQ_MODE_16_BITS) |
|---|
| 618 | 623 | p_params_header->cq_ring_mode = 1; |
|---|
| 619 | 624 | else |
|---|
| .. | .. |
|---|
| 700 | 705 | return rc; |
|---|
| 701 | 706 | |
|---|
| 702 | 707 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) { |
|---|
| 703 | | - rc = qed_iwarp_setup(p_hwfn, p_ptt, params); |
|---|
| 708 | + rc = qed_iwarp_setup(p_hwfn, params); |
|---|
| 704 | 709 | if (rc) |
|---|
| 705 | 710 | return rc; |
|---|
| 706 | 711 | } else { |
|---|
| .. | .. |
|---|
| 742 | 747 | (ll2_ethertype_en & 0xFFFE)); |
|---|
| 743 | 748 | |
|---|
| 744 | 749 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) { |
|---|
| 745 | | - rc = qed_iwarp_stop(p_hwfn, p_ptt); |
|---|
| 750 | + rc = qed_iwarp_stop(p_hwfn); |
|---|
| 746 | 751 | if (rc) { |
|---|
| 747 | 752 | qed_ptt_release(p_hwfn, p_ptt); |
|---|
| 748 | 753 | return rc; |
|---|
| .. | .. |
|---|
| 799 | 804 | /* Calculate the corresponding DPI address */ |
|---|
| 800 | 805 | dpi_start_offset = p_hwfn->dpi_start_offset; |
|---|
| 801 | 806 | |
|---|
| 802 | | - out_params->dpi_addr = (u64)((u8 __iomem *)p_hwfn->doorbells + |
|---|
| 803 | | - dpi_start_offset + |
|---|
| 804 | | - ((out_params->dpi) * p_hwfn->dpi_size)); |
|---|
| 807 | + out_params->dpi_addr = p_hwfn->doorbells + dpi_start_offset + |
|---|
| 808 | + out_params->dpi * p_hwfn->dpi_size; |
|---|
| 805 | 809 | |
|---|
| 806 | 810 | out_params->dpi_phys_addr = p_hwfn->db_phys_addr + |
|---|
| 807 | 811 | dpi_start_offset + |
|---|
| .. | .. |
|---|
| 818 | 822 | { |
|---|
| 819 | 823 | struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt; |
|---|
| 820 | 824 | struct qed_rdma_port *p_port = p_hwfn->p_rdma_info->port; |
|---|
| 825 | + struct qed_mcp_link_state *p_link_output; |
|---|
| 821 | 826 | |
|---|
| 822 | 827 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "RDMA Query port\n"); |
|---|
| 823 | 828 | |
|---|
| 824 | | - /* Link may have changed */ |
|---|
| 825 | | - p_port->port_state = p_hwfn->mcp_info->link_output.link_up ? |
|---|
| 826 | | - QED_RDMA_PORT_UP : QED_RDMA_PORT_DOWN; |
|---|
| 829 | + /* The link state is saved only for the leading hwfn */ |
|---|
| 830 | + p_link_output = &QED_LEADING_HWFN(p_hwfn->cdev)->mcp_info->link_output; |
|---|
| 827 | 831 | |
|---|
| 828 | | - p_port->link_speed = p_hwfn->mcp_info->link_output.speed; |
|---|
| 832 | + p_port->port_state = p_link_output->link_up ? QED_RDMA_PORT_UP |
|---|
| 833 | + : QED_RDMA_PORT_DOWN; |
|---|
| 834 | + |
|---|
| 835 | + p_port->link_speed = p_link_output->speed; |
|---|
| 829 | 836 | |
|---|
| 830 | 837 | p_port->max_msg_size = RDMA_MAX_DATA_SIZE_IN_WQE; |
|---|
| 831 | 838 | |
|---|
| .. | .. |
|---|
| 870 | 877 | static int qed_fill_rdma_dev_info(struct qed_dev *cdev, |
|---|
| 871 | 878 | struct qed_dev_rdma_info *info) |
|---|
| 872 | 879 | { |
|---|
| 873 | | - struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(cdev); |
|---|
| 880 | + struct qed_hwfn *p_hwfn = QED_AFFIN_HWFN(cdev); |
|---|
| 874 | 881 | |
|---|
| 875 | 882 | memset(info, 0, sizeof(*info)); |
|---|
| 876 | 883 | |
|---|
| .. | .. |
|---|
| 889 | 896 | int feat_num; |
|---|
| 890 | 897 | |
|---|
| 891 | 898 | if (cdev->num_hwfns > 1) |
|---|
| 892 | | - feat_num = FEAT_NUM(QED_LEADING_HWFN(cdev), QED_PF_L2_QUE); |
|---|
| 899 | + feat_num = FEAT_NUM(QED_AFFIN_HWFN(cdev), QED_PF_L2_QUE); |
|---|
| 893 | 900 | else |
|---|
| 894 | | - feat_num = FEAT_NUM(QED_LEADING_HWFN(cdev), QED_PF_L2_QUE) * |
|---|
| 901 | + feat_num = FEAT_NUM(QED_AFFIN_HWFN(cdev), QED_PF_L2_QUE) * |
|---|
| 895 | 902 | cdev->num_hwfns; |
|---|
| 896 | 903 | |
|---|
| 897 | 904 | return feat_num; |
|---|
| .. | .. |
|---|
| 899 | 906 | |
|---|
| 900 | 907 | static int qed_rdma_get_min_cnq_msix(struct qed_dev *cdev) |
|---|
| 901 | 908 | { |
|---|
| 902 | | - int n_cnq = FEAT_NUM(QED_LEADING_HWFN(cdev), QED_RDMA_CNQ); |
|---|
| 909 | + int n_cnq = FEAT_NUM(QED_AFFIN_HWFN(cdev), QED_RDMA_CNQ); |
|---|
| 903 | 910 | int n_msix = cdev->int_params.rdma_msix_cnt; |
|---|
| 904 | 911 | |
|---|
| 905 | 912 | return min_t(int, n_cnq, n_msix); |
|---|
| .. | .. |
|---|
| 979 | 986 | /* Returns a previously allocated protection domain for reuse */ |
|---|
| 980 | 987 | spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 981 | 988 | qed_bmap_release_id(p_hwfn, &p_hwfn->p_rdma_info->pd_map, pd); |
|---|
| 989 | + spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 990 | +} |
|---|
| 991 | + |
|---|
| 992 | +static int qed_rdma_alloc_xrcd(void *rdma_cxt, u16 *xrcd_id) |
|---|
| 993 | +{ |
|---|
| 994 | + struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt; |
|---|
| 995 | + u32 returned_id; |
|---|
| 996 | + int rc; |
|---|
| 997 | + |
|---|
| 998 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Alloc XRCD\n"); |
|---|
| 999 | + |
|---|
| 1000 | + spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 1001 | + rc = qed_rdma_bmap_alloc_id(p_hwfn, |
|---|
| 1002 | + &p_hwfn->p_rdma_info->xrcd_map, |
|---|
| 1003 | + &returned_id); |
|---|
| 1004 | + spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 1005 | + if (rc) { |
|---|
| 1006 | + DP_NOTICE(p_hwfn, "Failed in allocating xrcd id\n"); |
|---|
| 1007 | + return rc; |
|---|
| 1008 | + } |
|---|
| 1009 | + |
|---|
| 1010 | + *xrcd_id = (u16)returned_id; |
|---|
| 1011 | + |
|---|
| 1012 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Alloc XRCD - done, rc = %d\n", rc); |
|---|
| 1013 | + return rc; |
|---|
| 1014 | +} |
|---|
| 1015 | + |
|---|
| 1016 | +static void qed_rdma_free_xrcd(void *rdma_cxt, u16 xrcd_id) |
|---|
| 1017 | +{ |
|---|
| 1018 | + struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt; |
|---|
| 1019 | + |
|---|
| 1020 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "xrcd_id = %08x\n", xrcd_id); |
|---|
| 1021 | + |
|---|
| 1022 | + spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 1023 | + qed_bmap_release_id(p_hwfn, &p_hwfn->p_rdma_info->xrcd_map, xrcd_id); |
|---|
| 982 | 1024 | spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 983 | 1025 | } |
|---|
| 984 | 1026 | |
|---|
| .. | .. |
|---|
| 1066 | 1108 | p_ramrod->pbl_num_pages = cpu_to_le16(params->pbl_num_pages); |
|---|
| 1067 | 1109 | p_ramrod->cnq_id = (u8)RESC_START(p_hwfn, QED_RDMA_CNQ_RAM) + |
|---|
| 1068 | 1110 | params->cnq_id; |
|---|
| 1069 | | - p_ramrod->int_timeout = params->int_timeout; |
|---|
| 1111 | + p_ramrod->int_timeout = cpu_to_le16(params->int_timeout); |
|---|
| 1070 | 1112 | |
|---|
| 1071 | 1113 | /* toggle the bit for every resize or create cq for a given icid */ |
|---|
| 1072 | 1114 | toggle_bit = qed_rdma_toggle_bit_create_resize_cq(p_hwfn, *icid); |
|---|
| .. | .. |
|---|
| 1110 | 1152 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "icid = %08x\n", in_params->icid); |
|---|
| 1111 | 1153 | |
|---|
| 1112 | 1154 | p_ramrod_res = |
|---|
| 1113 | | - (struct rdma_destroy_cq_output_params *) |
|---|
| 1114 | 1155 | dma_alloc_coherent(&p_hwfn->cdev->pdev->dev, |
|---|
| 1115 | 1156 | sizeof(struct rdma_destroy_cq_output_params), |
|---|
| 1116 | 1157 | &ramrod_res_phys, GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 1166 | 1207 | return rc; |
|---|
| 1167 | 1208 | } |
|---|
| 1168 | 1209 | |
|---|
| 1169 | | -void qed_rdma_set_fw_mac(u16 *p_fw_mac, u8 *p_qed_mac) |
|---|
| 1210 | +void qed_rdma_set_fw_mac(__le16 *p_fw_mac, const u8 *p_qed_mac) |
|---|
| 1170 | 1211 | { |
|---|
| 1171 | 1212 | p_fw_mac[0] = cpu_to_le16((p_qed_mac[0] << 8) + p_qed_mac[1]); |
|---|
| 1172 | 1213 | p_fw_mac[1] = cpu_to_le16((p_qed_mac[2] << 8) + p_qed_mac[3]); |
|---|
| .. | .. |
|---|
| 1304 | 1345 | qp->resp_offloaded = false; |
|---|
| 1305 | 1346 | qp->e2e_flow_control_en = qp->use_srq ? false : true; |
|---|
| 1306 | 1347 | qp->stats_queue = in_params->stats_queue; |
|---|
| 1348 | + qp->qp_type = in_params->qp_type; |
|---|
| 1349 | + qp->xrcd_id = in_params->xrcd_id; |
|---|
| 1307 | 1350 | |
|---|
| 1308 | 1351 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) { |
|---|
| 1309 | 1352 | rc = qed_iwarp_create_qp(p_hwfn, qp, out_params); |
|---|
| 1310 | 1353 | qp->qpid = qp->icid; |
|---|
| 1311 | 1354 | } else { |
|---|
| 1355 | + qp->edpm_mode = GET_FIELD(in_params->flags, QED_ROCE_EDPM_MODE); |
|---|
| 1312 | 1356 | rc = qed_roce_alloc_cid(p_hwfn, &qp->icid); |
|---|
| 1313 | 1357 | qp->qpid = ((0xFF << 16) | qp->icid); |
|---|
| 1314 | 1358 | } |
|---|
| .. | .. |
|---|
| 1416 | 1460 | qp->cur_state); |
|---|
| 1417 | 1461 | } |
|---|
| 1418 | 1462 | |
|---|
| 1463 | + switch (qp->qp_type) { |
|---|
| 1464 | + case QED_RDMA_QP_TYPE_XRC_INI: |
|---|
| 1465 | + qp->has_req = true; |
|---|
| 1466 | + break; |
|---|
| 1467 | + case QED_RDMA_QP_TYPE_XRC_TGT: |
|---|
| 1468 | + qp->has_resp = true; |
|---|
| 1469 | + break; |
|---|
| 1470 | + default: |
|---|
| 1471 | + qp->has_req = true; |
|---|
| 1472 | + qp->has_resp = true; |
|---|
| 1473 | + } |
|---|
| 1474 | + |
|---|
| 1419 | 1475 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) { |
|---|
| 1420 | 1476 | enum qed_iwarp_qp_state new_state = |
|---|
| 1421 | 1477 | qed_roce2iwarp_state(qp->cur_state); |
|---|
| .. | .. |
|---|
| 1439 | 1495 | struct qed_spq_entry *p_ent; |
|---|
| 1440 | 1496 | enum rdma_tid_type tid_type; |
|---|
| 1441 | 1497 | u8 fw_return_code; |
|---|
| 1498 | + u16 flags = 0; |
|---|
| 1442 | 1499 | int rc; |
|---|
| 1443 | 1500 | |
|---|
| 1444 | 1501 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "itid = %08x\n", params->itid); |
|---|
| .. | .. |
|---|
| 1458 | 1515 | if (p_hwfn->p_rdma_info->last_tid < params->itid) |
|---|
| 1459 | 1516 | p_hwfn->p_rdma_info->last_tid = params->itid; |
|---|
| 1460 | 1517 | |
|---|
| 1461 | | - p_ramrod = &p_ent->ramrod.rdma_register_tid; |
|---|
| 1462 | | - |
|---|
| 1463 | | - p_ramrod->flags = 0; |
|---|
| 1464 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1465 | | - RDMA_REGISTER_TID_RAMROD_DATA_TWO_LEVEL_PBL, |
|---|
| 1518 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_TWO_LEVEL_PBL, |
|---|
| 1466 | 1519 | params->pbl_two_level); |
|---|
| 1467 | 1520 | |
|---|
| 1468 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1469 | | - RDMA_REGISTER_TID_RAMROD_DATA_ZERO_BASED, params->zbva); |
|---|
| 1521 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_ZERO_BASED, |
|---|
| 1522 | + false); |
|---|
| 1470 | 1523 | |
|---|
| 1471 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1472 | | - RDMA_REGISTER_TID_RAMROD_DATA_PHY_MR, params->phy_mr); |
|---|
| 1524 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_PHY_MR, params->phy_mr); |
|---|
| 1473 | 1525 | |
|---|
| 1474 | 1526 | /* Don't initialize D/C field, as it may override other bits. */ |
|---|
| 1475 | 1527 | if (!(params->tid_type == QED_RDMA_TID_FMR) && !(params->dma_mr)) |
|---|
| 1476 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1477 | | - RDMA_REGISTER_TID_RAMROD_DATA_PAGE_SIZE_LOG, |
|---|
| 1528 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_PAGE_SIZE_LOG, |
|---|
| 1478 | 1529 | params->page_size_log - 12); |
|---|
| 1479 | 1530 | |
|---|
| 1480 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1481 | | - RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_READ, |
|---|
| 1531 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_READ, |
|---|
| 1482 | 1532 | params->remote_read); |
|---|
| 1483 | 1533 | |
|---|
| 1484 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1485 | | - RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_WRITE, |
|---|
| 1534 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_WRITE, |
|---|
| 1486 | 1535 | params->remote_write); |
|---|
| 1487 | 1536 | |
|---|
| 1488 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1489 | | - RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_ATOMIC, |
|---|
| 1537 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_ATOMIC, |
|---|
| 1490 | 1538 | params->remote_atomic); |
|---|
| 1491 | 1539 | |
|---|
| 1492 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1493 | | - RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_WRITE, |
|---|
| 1540 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_WRITE, |
|---|
| 1494 | 1541 | params->local_write); |
|---|
| 1495 | 1542 | |
|---|
| 1496 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1497 | | - RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_READ, params->local_read); |
|---|
| 1543 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_READ, |
|---|
| 1544 | + params->local_read); |
|---|
| 1498 | 1545 | |
|---|
| 1499 | | - SET_FIELD(p_ramrod->flags, |
|---|
| 1500 | | - RDMA_REGISTER_TID_RAMROD_DATA_ENABLE_MW_BIND, |
|---|
| 1546 | + SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_ENABLE_MW_BIND, |
|---|
| 1501 | 1547 | params->mw_bind); |
|---|
| 1548 | + |
|---|
| 1549 | + p_ramrod = &p_ent->ramrod.rdma_register_tid; |
|---|
| 1550 | + p_ramrod->flags = cpu_to_le16(flags); |
|---|
| 1502 | 1551 | |
|---|
| 1503 | 1552 | SET_FIELD(p_ramrod->flags1, |
|---|
| 1504 | 1553 | RDMA_REGISTER_TID_RAMROD_DATA_PBL_PAGE_SIZE_LOG, |
|---|
| 1505 | 1554 | params->pbl_page_size_log - 12); |
|---|
| 1506 | 1555 | |
|---|
| 1507 | | - SET_FIELD(p_ramrod->flags2, |
|---|
| 1508 | | - RDMA_REGISTER_TID_RAMROD_DATA_DMA_MR, params->dma_mr); |
|---|
| 1556 | + SET_FIELD(p_ramrod->flags2, RDMA_REGISTER_TID_RAMROD_DATA_DMA_MR, |
|---|
| 1557 | + params->dma_mr); |
|---|
| 1509 | 1558 | |
|---|
| 1510 | 1559 | switch (params->tid_type) { |
|---|
| 1511 | 1560 | case QED_RDMA_TID_REGISTERED_MR: |
|---|
| .. | .. |
|---|
| 1523 | 1572 | qed_sp_destroy_request(p_hwfn, p_ent); |
|---|
| 1524 | 1573 | return rc; |
|---|
| 1525 | 1574 | } |
|---|
| 1526 | | - SET_FIELD(p_ramrod->flags1, |
|---|
| 1527 | | - RDMA_REGISTER_TID_RAMROD_DATA_TID_TYPE, tid_type); |
|---|
| 1575 | + |
|---|
| 1576 | + SET_FIELD(p_ramrod->flags1, RDMA_REGISTER_TID_RAMROD_DATA_TID_TYPE, |
|---|
| 1577 | + tid_type); |
|---|
| 1528 | 1578 | |
|---|
| 1529 | 1579 | p_ramrod->itid = cpu_to_le32(params->itid); |
|---|
| 1530 | 1580 | p_ramrod->key = params->key; |
|---|
| 1531 | 1581 | p_ramrod->pd = cpu_to_le16(params->pd); |
|---|
| 1532 | 1582 | p_ramrod->length_hi = (u8)(params->length >> 32); |
|---|
| 1533 | 1583 | p_ramrod->length_lo = DMA_LO_LE(params->length); |
|---|
| 1534 | | - if (params->zbva) { |
|---|
| 1535 | | - /* Lower 32 bits of the registered MR address. |
|---|
| 1536 | | - * In case of zero based MR, will hold FBO |
|---|
| 1537 | | - */ |
|---|
| 1538 | | - p_ramrod->va.hi = 0; |
|---|
| 1539 | | - p_ramrod->va.lo = cpu_to_le32(params->fbo); |
|---|
| 1540 | | - } else { |
|---|
| 1541 | | - DMA_REGPAIR_LE(p_ramrod->va, params->vaddr); |
|---|
| 1542 | | - } |
|---|
| 1584 | + DMA_REGPAIR_LE(p_ramrod->va, params->vaddr); |
|---|
| 1543 | 1585 | DMA_REGPAIR_LE(p_ramrod->pbl_base, params->pbl_ptr); |
|---|
| 1544 | 1586 | |
|---|
| 1545 | 1587 | /* DIF */ |
|---|
| .. | .. |
|---|
| 1652 | 1694 | |
|---|
| 1653 | 1695 | static void *qed_rdma_get_rdma_ctx(struct qed_dev *cdev) |
|---|
| 1654 | 1696 | { |
|---|
| 1655 | | - return QED_LEADING_HWFN(cdev); |
|---|
| 1697 | + return QED_AFFIN_HWFN(cdev); |
|---|
| 1698 | +} |
|---|
| 1699 | + |
|---|
| 1700 | +static struct qed_bmap *qed_rdma_get_srq_bmap(struct qed_hwfn *p_hwfn, |
|---|
| 1701 | + bool is_xrc) |
|---|
| 1702 | +{ |
|---|
| 1703 | + if (is_xrc) |
|---|
| 1704 | + return &p_hwfn->p_rdma_info->xrc_srq_map; |
|---|
| 1705 | + |
|---|
| 1706 | + return &p_hwfn->p_rdma_info->srq_map; |
|---|
| 1656 | 1707 | } |
|---|
| 1657 | 1708 | |
|---|
| 1658 | 1709 | static int qed_rdma_modify_srq(void *rdma_cxt, |
|---|
| .. | .. |
|---|
| 1684 | 1735 | if (rc) |
|---|
| 1685 | 1736 | return rc; |
|---|
| 1686 | 1737 | |
|---|
| 1687 | | - DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "modified SRQ id = %x", |
|---|
| 1688 | | - in_params->srq_id); |
|---|
| 1738 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "modified SRQ id = %x, is_xrc=%u\n", |
|---|
| 1739 | + in_params->srq_id, in_params->is_xrc); |
|---|
| 1689 | 1740 | |
|---|
| 1690 | 1741 | return rc; |
|---|
| 1691 | 1742 | } |
|---|
| .. | .. |
|---|
| 1700 | 1751 | struct qed_spq_entry *p_ent; |
|---|
| 1701 | 1752 | struct qed_bmap *bmap; |
|---|
| 1702 | 1753 | u16 opaque_fid; |
|---|
| 1754 | + u16 offset; |
|---|
| 1703 | 1755 | int rc; |
|---|
| 1704 | 1756 | |
|---|
| 1705 | 1757 | opaque_fid = p_hwfn->hw_info.opaque_fid; |
|---|
| .. | .. |
|---|
| 1721 | 1773 | if (rc) |
|---|
| 1722 | 1774 | return rc; |
|---|
| 1723 | 1775 | |
|---|
| 1724 | | - bmap = &p_hwfn->p_rdma_info->srq_map; |
|---|
| 1776 | + bmap = qed_rdma_get_srq_bmap(p_hwfn, in_params->is_xrc); |
|---|
| 1777 | + offset = (in_params->is_xrc) ? 0 : p_hwfn->p_rdma_info->srq_id_offset; |
|---|
| 1725 | 1778 | |
|---|
| 1726 | 1779 | spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 1727 | | - qed_bmap_release_id(p_hwfn, bmap, in_params->srq_id); |
|---|
| 1780 | + qed_bmap_release_id(p_hwfn, bmap, in_params->srq_id - offset); |
|---|
| 1728 | 1781 | spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 1729 | 1782 | |
|---|
| 1730 | | - DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "SRQ destroyed Id = %x", |
|---|
| 1731 | | - in_params->srq_id); |
|---|
| 1783 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
|---|
| 1784 | + "XRC/SRQ destroyed Id = %x, is_xrc=%u\n", |
|---|
| 1785 | + in_params->srq_id, in_params->is_xrc); |
|---|
| 1732 | 1786 | |
|---|
| 1733 | 1787 | return rc; |
|---|
| 1734 | 1788 | } |
|---|
| .. | .. |
|---|
| 1746 | 1800 | u16 opaque_fid, srq_id; |
|---|
| 1747 | 1801 | struct qed_bmap *bmap; |
|---|
| 1748 | 1802 | u32 returned_id; |
|---|
| 1803 | + u16 offset; |
|---|
| 1749 | 1804 | int rc; |
|---|
| 1750 | 1805 | |
|---|
| 1751 | | - bmap = &p_hwfn->p_rdma_info->srq_map; |
|---|
| 1806 | + bmap = qed_rdma_get_srq_bmap(p_hwfn, in_params->is_xrc); |
|---|
| 1752 | 1807 | spin_lock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 1753 | 1808 | rc = qed_rdma_bmap_alloc_id(p_hwfn, bmap, &returned_id); |
|---|
| 1754 | 1809 | spin_unlock_bh(&p_hwfn->p_rdma_info->lock); |
|---|
| 1755 | 1810 | |
|---|
| 1756 | 1811 | if (rc) { |
|---|
| 1757 | | - DP_NOTICE(p_hwfn, "failed to allocate srq id\n"); |
|---|
| 1812 | + DP_NOTICE(p_hwfn, |
|---|
| 1813 | + "failed to allocate xrc/srq id (is_xrc=%u)\n", |
|---|
| 1814 | + in_params->is_xrc); |
|---|
| 1758 | 1815 | return rc; |
|---|
| 1759 | 1816 | } |
|---|
| 1760 | 1817 | |
|---|
| 1761 | | - elem_type = QED_ELEM_SRQ; |
|---|
| 1818 | + elem_type = (in_params->is_xrc) ? (QED_ELEM_XRC_SRQ) : (QED_ELEM_SRQ); |
|---|
| 1762 | 1819 | rc = qed_cxt_dynamic_ilt_alloc(p_hwfn, elem_type, returned_id); |
|---|
| 1763 | 1820 | if (rc) |
|---|
| 1764 | 1821 | goto err; |
|---|
| 1765 | | - /* returned id is no greater than u16 */ |
|---|
| 1766 | | - srq_id = (u16)returned_id; |
|---|
| 1822 | + |
|---|
| 1767 | 1823 | opaque_fid = p_hwfn->hw_info.opaque_fid; |
|---|
| 1768 | 1824 | |
|---|
| 1769 | 1825 | opaque_fid = p_hwfn->hw_info.opaque_fid; |
|---|
| .. | .. |
|---|
| 1780 | 1836 | DMA_REGPAIR_LE(p_ramrod->pbl_base_addr, in_params->pbl_base_addr); |
|---|
| 1781 | 1837 | p_ramrod->pages_in_srq_pbl = cpu_to_le16(in_params->num_pages); |
|---|
| 1782 | 1838 | p_ramrod->pd_id = cpu_to_le16(in_params->pd_id); |
|---|
| 1783 | | - p_ramrod->srq_id.srq_idx = cpu_to_le16(srq_id); |
|---|
| 1784 | 1839 | p_ramrod->srq_id.opaque_fid = cpu_to_le16(opaque_fid); |
|---|
| 1785 | 1840 | p_ramrod->page_size = cpu_to_le16(in_params->page_size); |
|---|
| 1786 | 1841 | DMA_REGPAIR_LE(p_ramrod->producers_addr, in_params->prod_pair_addr); |
|---|
| 1842 | + offset = (in_params->is_xrc) ? 0 : p_hwfn->p_rdma_info->srq_id_offset; |
|---|
| 1843 | + srq_id = (u16)returned_id + offset; |
|---|
| 1844 | + p_ramrod->srq_id.srq_idx = cpu_to_le16(srq_id); |
|---|
| 1787 | 1845 | |
|---|
| 1846 | + if (in_params->is_xrc) { |
|---|
| 1847 | + SET_FIELD(p_ramrod->flags, |
|---|
| 1848 | + RDMA_SRQ_CREATE_RAMROD_DATA_XRC_FLAG, 1); |
|---|
| 1849 | + SET_FIELD(p_ramrod->flags, |
|---|
| 1850 | + RDMA_SRQ_CREATE_RAMROD_DATA_RESERVED_KEY_EN, |
|---|
| 1851 | + in_params->reserved_key_en); |
|---|
| 1852 | + p_ramrod->xrc_srq_cq_cid = |
|---|
| 1853 | + cpu_to_le32((p_hwfn->hw_info.opaque_fid << 16) | |
|---|
| 1854 | + in_params->cq_cid); |
|---|
| 1855 | + p_ramrod->xrc_domain = cpu_to_le16(in_params->xrcd_id); |
|---|
| 1856 | + } |
|---|
| 1788 | 1857 | rc = qed_spq_post(p_hwfn, p_ent, NULL); |
|---|
| 1789 | 1858 | if (rc) |
|---|
| 1790 | 1859 | goto err; |
|---|
| 1791 | 1860 | |
|---|
| 1792 | 1861 | out_params->srq_id = srq_id; |
|---|
| 1793 | 1862 | |
|---|
| 1794 | | - DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
|---|
| 1795 | | - "SRQ created Id = %x\n", out_params->srq_id); |
|---|
| 1796 | | - |
|---|
| 1863 | + DP_VERBOSE(p_hwfn, |
|---|
| 1864 | + QED_MSG_RDMA, |
|---|
| 1865 | + "XRC/SRQ created Id = %x (is_xrc=%u)\n", |
|---|
| 1866 | + out_params->srq_id, in_params->is_xrc); |
|---|
| 1797 | 1867 | return rc; |
|---|
| 1798 | 1868 | |
|---|
| 1799 | 1869 | err: |
|---|
| .. | .. |
|---|
| 1880 | 1950 | static int qed_rdma_init(struct qed_dev *cdev, |
|---|
| 1881 | 1951 | struct qed_rdma_start_in_params *params) |
|---|
| 1882 | 1952 | { |
|---|
| 1883 | | - return qed_rdma_start(QED_LEADING_HWFN(cdev), params); |
|---|
| 1953 | + return qed_rdma_start(QED_AFFIN_HWFN(cdev), params); |
|---|
| 1884 | 1954 | } |
|---|
| 1885 | 1955 | |
|---|
| 1886 | 1956 | static void qed_rdma_remove_user(void *rdma_cxt, u16 dpi) |
|---|
| .. | .. |
|---|
| 1898 | 1968 | u8 *old_mac_address, |
|---|
| 1899 | 1969 | u8 *new_mac_address) |
|---|
| 1900 | 1970 | { |
|---|
| 1901 | | - struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(cdev); |
|---|
| 1902 | | - struct qed_ptt *p_ptt; |
|---|
| 1903 | 1971 | int rc = 0; |
|---|
| 1904 | 1972 | |
|---|
| 1905 | | - p_ptt = qed_ptt_acquire(p_hwfn); |
|---|
| 1906 | | - if (!p_ptt) { |
|---|
| 1907 | | - DP_ERR(cdev, |
|---|
| 1908 | | - "qed roce ll2 mac filter set: failed to acquire PTT\n"); |
|---|
| 1909 | | - return -EINVAL; |
|---|
| 1910 | | - } |
|---|
| 1911 | | - |
|---|
| 1912 | 1973 | if (old_mac_address) |
|---|
| 1913 | | - qed_llh_remove_mac_filter(p_hwfn, p_ptt, old_mac_address); |
|---|
| 1974 | + qed_llh_remove_mac_filter(cdev, 0, old_mac_address); |
|---|
| 1914 | 1975 | if (new_mac_address) |
|---|
| 1915 | | - rc = qed_llh_add_mac_filter(p_hwfn, p_ptt, new_mac_address); |
|---|
| 1916 | | - |
|---|
| 1917 | | - qed_ptt_release(p_hwfn, p_ptt); |
|---|
| 1976 | + rc = qed_llh_add_mac_filter(cdev, 0, new_mac_address); |
|---|
| 1918 | 1977 | |
|---|
| 1919 | 1978 | if (rc) |
|---|
| 1920 | 1979 | DP_ERR(cdev, |
|---|
| 1921 | 1980 | "qed roce ll2 mac filter set: failed to add MAC filter\n"); |
|---|
| 1922 | 1981 | |
|---|
| 1923 | 1982 | return rc; |
|---|
| 1983 | +} |
|---|
| 1984 | + |
|---|
| 1985 | +static int qed_iwarp_set_engine_affin(struct qed_dev *cdev, bool b_reset) |
|---|
| 1986 | +{ |
|---|
| 1987 | + enum qed_eng eng; |
|---|
| 1988 | + u8 ppfid = 0; |
|---|
| 1989 | + int rc; |
|---|
| 1990 | + |
|---|
| 1991 | + /* Make sure iwarp cmt mode is enabled before setting affinity */ |
|---|
| 1992 | + if (!cdev->iwarp_cmt) |
|---|
| 1993 | + return -EINVAL; |
|---|
| 1994 | + |
|---|
| 1995 | + if (b_reset) |
|---|
| 1996 | + eng = QED_BOTH_ENG; |
|---|
| 1997 | + else |
|---|
| 1998 | + eng = cdev->l2_affin_hint ? QED_ENG1 : QED_ENG0; |
|---|
| 1999 | + |
|---|
| 2000 | + rc = qed_llh_set_ppfid_affinity(cdev, ppfid, eng); |
|---|
| 2001 | + if (rc) { |
|---|
| 2002 | + DP_NOTICE(cdev, |
|---|
| 2003 | + "Failed to set the engine affinity of ppfid %d\n", |
|---|
| 2004 | + ppfid); |
|---|
| 2005 | + return rc; |
|---|
| 2006 | + } |
|---|
| 2007 | + |
|---|
| 2008 | + DP_VERBOSE(cdev, (QED_MSG_RDMA | QED_MSG_SP), |
|---|
| 2009 | + "LLH: Set the engine affinity of non-RoCE packets as %d\n", |
|---|
| 2010 | + eng); |
|---|
| 2011 | + |
|---|
| 2012 | + return 0; |
|---|
| 1924 | 2013 | } |
|---|
| 1925 | 2014 | |
|---|
| 1926 | 2015 | static const struct qed_rdma_ops qed_rdma_ops_pass = { |
|---|
| .. | .. |
|---|
| 1940 | 2029 | .rdma_cnq_prod_update = &qed_rdma_cnq_prod_update, |
|---|
| 1941 | 2030 | .rdma_alloc_pd = &qed_rdma_alloc_pd, |
|---|
| 1942 | 2031 | .rdma_dealloc_pd = &qed_rdma_free_pd, |
|---|
| 2032 | + .rdma_alloc_xrcd = &qed_rdma_alloc_xrcd, |
|---|
| 2033 | + .rdma_dealloc_xrcd = &qed_rdma_free_xrcd, |
|---|
| 1943 | 2034 | .rdma_create_cq = &qed_rdma_create_cq, |
|---|
| 1944 | 2035 | .rdma_destroy_cq = &qed_rdma_destroy_cq, |
|---|
| 1945 | 2036 | .rdma_create_qp = &qed_rdma_create_qp, |
|---|
| .. | .. |
|---|
| 1962 | 2053 | .ll2_set_fragment_of_tx_packet = &qed_ll2_set_fragment_of_tx_packet, |
|---|
| 1963 | 2054 | .ll2_set_mac_filter = &qed_roce_ll2_set_mac_filter, |
|---|
| 1964 | 2055 | .ll2_get_stats = &qed_ll2_get_stats, |
|---|
| 2056 | + .iwarp_set_engine_affin = &qed_iwarp_set_engine_affin, |
|---|
| 1965 | 2057 | .iwarp_connect = &qed_iwarp_connect, |
|---|
| 1966 | 2058 | .iwarp_create_listen = &qed_iwarp_create_listen, |
|---|
| 1967 | 2059 | .iwarp_destroy_listen = &qed_iwarp_destroy_listen, |
|---|