| .. | .. |
|---|
| 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/if_ether.h> |
|---|
| 33 | 8 | #include <linux/if_vlan.h> |
|---|
| 34 | 9 | #include <linux/ip.h> |
|---|
| .. | .. |
|---|
| 63 | 38 | #define MPA_REV2(_mpa_rev) ((_mpa_rev) == MPA_NEGOTIATION_TYPE_ENHANCED) |
|---|
| 64 | 39 | |
|---|
| 65 | 40 | #define QED_IWARP_INVALID_TCP_CID 0xffffffff |
|---|
| 66 | | -#define QED_IWARP_RCV_WND_SIZE_DEF (256 * 1024) |
|---|
| 41 | + |
|---|
| 42 | +#define QED_IWARP_RCV_WND_SIZE_DEF_BB_2P (200 * 1024) |
|---|
| 43 | +#define QED_IWARP_RCV_WND_SIZE_DEF_BB_4P (100 * 1024) |
|---|
| 44 | +#define QED_IWARP_RCV_WND_SIZE_DEF_AH_2P (150 * 1024) |
|---|
| 45 | +#define QED_IWARP_RCV_WND_SIZE_DEF_AH_4P (90 * 1024) |
|---|
| 46 | + |
|---|
| 67 | 47 | #define QED_IWARP_RCV_WND_SIZE_MIN (0xffff) |
|---|
| 68 | 48 | #define TIMESTAMP_HEADER_SIZE (12) |
|---|
| 69 | 49 | #define QED_IWARP_MAX_FIN_RT_DEFAULT (2) |
|---|
| .. | .. |
|---|
| 79 | 59 | #define QED_IWARP_DEF_KA_TIMEOUT (1200000) /* 20 min */ |
|---|
| 80 | 60 | #define QED_IWARP_DEF_KA_INTERVAL (1000) /* 1 sec */ |
|---|
| 81 | 61 | |
|---|
| 82 | | -static int qed_iwarp_async_event(struct qed_hwfn *p_hwfn, |
|---|
| 83 | | - u8 fw_event_code, u16 echo, |
|---|
| 84 | | - union event_ring_data *data, |
|---|
| 62 | +static int qed_iwarp_async_event(struct qed_hwfn *p_hwfn, u8 fw_event_code, |
|---|
| 63 | + __le16 echo, union event_ring_data *data, |
|---|
| 85 | 64 | u8 fw_return_code); |
|---|
| 86 | 65 | |
|---|
| 87 | 66 | /* Override devinfo with iWARP specific values */ |
|---|
| .. | .. |
|---|
| 132 | 111 | struct iwarp_init_func_ramrod_data *p_ramrod) |
|---|
| 133 | 112 | { |
|---|
| 134 | 113 | p_ramrod->iwarp.ll2_ooo_q_index = |
|---|
| 135 | | - RESC_START(p_hwfn, QED_LL2_QUEUE) + |
|---|
| 136 | | - p_hwfn->p_rdma_info->iwarp.ll2_ooo_handle; |
|---|
| 114 | + RESC_START(p_hwfn, QED_LL2_RAM_QUEUE) + |
|---|
| 115 | + p_hwfn->p_rdma_info->iwarp.ll2_ooo_handle; |
|---|
| 137 | 116 | |
|---|
| 138 | 117 | p_ramrod->tcp.max_fin_rt = QED_IWARP_MAX_FIN_RT_DEFAULT; |
|---|
| 139 | 118 | |
|---|
| .. | .. |
|---|
| 267 | 246 | SET_FIELD(p_ramrod->flags, |
|---|
| 268 | 247 | IWARP_CREATE_QP_RAMROD_DATA_SRQ_FLG, qp->use_srq); |
|---|
| 269 | 248 | |
|---|
| 270 | | - p_ramrod->pd = qp->pd; |
|---|
| 271 | | - p_ramrod->sq_num_pages = qp->sq_num_pages; |
|---|
| 272 | | - p_ramrod->rq_num_pages = qp->rq_num_pages; |
|---|
| 249 | + p_ramrod->pd = cpu_to_le16(qp->pd); |
|---|
| 250 | + p_ramrod->sq_num_pages = cpu_to_le16(qp->sq_num_pages); |
|---|
| 251 | + p_ramrod->rq_num_pages = cpu_to_le16(qp->rq_num_pages); |
|---|
| 273 | 252 | |
|---|
| 274 | 253 | p_ramrod->srq_id.srq_idx = cpu_to_le16(qp->srq_id); |
|---|
| 275 | 254 | p_ramrod->srq_id.opaque_fid = cpu_to_le16(p_hwfn->hw_info.opaque_fid); |
|---|
| 276 | | - p_ramrod->qp_handle_for_cqe.hi = cpu_to_le32(qp->qp_handle.hi); |
|---|
| 277 | | - p_ramrod->qp_handle_for_cqe.lo = cpu_to_le32(qp->qp_handle.lo); |
|---|
| 255 | + p_ramrod->qp_handle_for_cqe.hi = qp->qp_handle.hi; |
|---|
| 256 | + p_ramrod->qp_handle_for_cqe.lo = qp->qp_handle.lo; |
|---|
| 278 | 257 | |
|---|
| 279 | 258 | p_ramrod->cq_cid_for_sq = |
|---|
| 280 | 259 | cpu_to_le32((p_hwfn->hw_info.opaque_fid << 16) | qp->sq_cq_id); |
|---|
| .. | .. |
|---|
| 309 | 288 | struct iwarp_modify_qp_ramrod_data *p_ramrod; |
|---|
| 310 | 289 | struct qed_sp_init_data init_data; |
|---|
| 311 | 290 | struct qed_spq_entry *p_ent; |
|---|
| 291 | + u16 flags, trans_to_state; |
|---|
| 312 | 292 | int rc; |
|---|
| 313 | 293 | |
|---|
| 314 | 294 | /* Get SPQ entry */ |
|---|
| .. | .. |
|---|
| 324 | 304 | return rc; |
|---|
| 325 | 305 | |
|---|
| 326 | 306 | p_ramrod = &p_ent->ramrod.iwarp_modify_qp; |
|---|
| 327 | | - SET_FIELD(p_ramrod->flags, IWARP_MODIFY_QP_RAMROD_DATA_STATE_TRANS_EN, |
|---|
| 328 | | - 0x1); |
|---|
| 307 | + |
|---|
| 308 | + flags = le16_to_cpu(p_ramrod->flags); |
|---|
| 309 | + SET_FIELD(flags, IWARP_MODIFY_QP_RAMROD_DATA_STATE_TRANS_EN, 0x1); |
|---|
| 310 | + p_ramrod->flags = cpu_to_le16(flags); |
|---|
| 311 | + |
|---|
| 329 | 312 | if (qp->iwarp_state == QED_IWARP_QP_STATE_CLOSING) |
|---|
| 330 | | - p_ramrod->transition_to_state = IWARP_MODIFY_QP_STATE_CLOSING; |
|---|
| 313 | + trans_to_state = IWARP_MODIFY_QP_STATE_CLOSING; |
|---|
| 331 | 314 | else |
|---|
| 332 | | - p_ramrod->transition_to_state = IWARP_MODIFY_QP_STATE_ERROR; |
|---|
| 315 | + trans_to_state = IWARP_MODIFY_QP_STATE_ERROR; |
|---|
| 316 | + |
|---|
| 317 | + p_ramrod->transition_to_state = cpu_to_le16(trans_to_state); |
|---|
| 333 | 318 | |
|---|
| 334 | 319 | rc = qed_spq_post(p_hwfn, p_ent, NULL); |
|---|
| 335 | 320 | |
|---|
| .. | .. |
|---|
| 377 | 362 | } |
|---|
| 378 | 363 | } |
|---|
| 379 | 364 | |
|---|
| 380 | | -const static char *iwarp_state_names[] = { |
|---|
| 365 | +static const char * const iwarp_state_names[] = { |
|---|
| 381 | 366 | "IDLE", |
|---|
| 382 | 367 | "RTS", |
|---|
| 383 | 368 | "TERMINATE", |
|---|
| .. | .. |
|---|
| 642 | 627 | dma_addr_t async_output_phys; |
|---|
| 643 | 628 | dma_addr_t in_pdata_phys; |
|---|
| 644 | 629 | u16 physical_q; |
|---|
| 630 | + u16 flags = 0; |
|---|
| 645 | 631 | u8 tcp_flags; |
|---|
| 646 | 632 | int rc; |
|---|
| 647 | 633 | int i; |
|---|
| .. | .. |
|---|
| 694 | 680 | tcp->vlan_id = cpu_to_le16(ep->cm_info.vlan); |
|---|
| 695 | 681 | |
|---|
| 696 | 682 | tcp_flags = p_hwfn->p_rdma_info->iwarp.tcp_flags; |
|---|
| 697 | | - tcp->flags = 0; |
|---|
| 698 | | - SET_FIELD(tcp->flags, TCP_OFFLOAD_PARAMS_OPT2_TS_EN, |
|---|
| 683 | + |
|---|
| 684 | + SET_FIELD(flags, TCP_OFFLOAD_PARAMS_OPT2_TS_EN, |
|---|
| 699 | 685 | !!(tcp_flags & QED_IWARP_TS_EN)); |
|---|
| 700 | 686 | |
|---|
| 701 | | - SET_FIELD(tcp->flags, TCP_OFFLOAD_PARAMS_OPT2_DA_EN, |
|---|
| 687 | + SET_FIELD(flags, TCP_OFFLOAD_PARAMS_OPT2_DA_EN, |
|---|
| 702 | 688 | !!(tcp_flags & QED_IWARP_DA_EN)); |
|---|
| 703 | 689 | |
|---|
| 690 | + tcp->flags = cpu_to_le16(flags); |
|---|
| 704 | 691 | tcp->ip_version = ep->cm_info.ip_version; |
|---|
| 705 | 692 | |
|---|
| 706 | 693 | for (i = 0; i < 4; i++) { |
|---|
| .. | .. |
|---|
| 716 | 703 | tcp->tos_or_tc = 0; |
|---|
| 717 | 704 | |
|---|
| 718 | 705 | tcp->max_rt_time = QED_IWARP_DEF_MAX_RT_TIME; |
|---|
| 719 | | - tcp->cwnd = QED_IWARP_DEF_CWND_FACTOR * tcp->mss; |
|---|
| 706 | + tcp->cwnd = cpu_to_le32(QED_IWARP_DEF_CWND_FACTOR * ep->mss); |
|---|
| 720 | 707 | tcp->ka_max_probe_cnt = QED_IWARP_DEF_KA_MAX_PROBE_CNT; |
|---|
| 721 | | - tcp->ka_timeout = QED_IWARP_DEF_KA_TIMEOUT; |
|---|
| 722 | | - tcp->ka_interval = QED_IWARP_DEF_KA_INTERVAL; |
|---|
| 708 | + tcp->ka_timeout = cpu_to_le32(QED_IWARP_DEF_KA_TIMEOUT); |
|---|
| 709 | + tcp->ka_interval = cpu_to_le32(QED_IWARP_DEF_KA_INTERVAL); |
|---|
| 723 | 710 | |
|---|
| 724 | 711 | tcp->rcv_wnd_scale = (u8)p_hwfn->p_rdma_info->iwarp.rcv_wnd_scale; |
|---|
| 725 | 712 | tcp->connect_mode = ep->connect_mode; |
|---|
| .. | .. |
|---|
| 750 | 737 | union async_output *async_data; |
|---|
| 751 | 738 | u16 mpa_ord, mpa_ird; |
|---|
| 752 | 739 | u8 mpa_hdr_size = 0; |
|---|
| 740 | + u16 ulp_data_len; |
|---|
| 753 | 741 | u8 mpa_rev; |
|---|
| 754 | 742 | |
|---|
| 755 | 743 | async_data = &ep->ep_buffer_virt->async_output; |
|---|
| .. | .. |
|---|
| 813 | 801 | /* Strip mpa v2 hdr from private data before sending to upper layer */ |
|---|
| 814 | 802 | ep->cm_info.private_data = ep->ep_buffer_virt->in_pdata + mpa_hdr_size; |
|---|
| 815 | 803 | |
|---|
| 816 | | - ep->cm_info.private_data_len = async_data->mpa_request.ulp_data_len - |
|---|
| 817 | | - mpa_hdr_size; |
|---|
| 804 | + ulp_data_len = le16_to_cpu(async_data->mpa_request.ulp_data_len); |
|---|
| 805 | + ep->cm_info.private_data_len = ulp_data_len - mpa_hdr_size; |
|---|
| 818 | 806 | |
|---|
| 819 | 807 | params.event = QED_IWARP_EVENT_MPA_REQUEST; |
|---|
| 820 | 808 | params.cm_info = &ep->cm_info; |
|---|
| .. | .. |
|---|
| 829 | 817 | qed_iwarp_mpa_offload(struct qed_hwfn *p_hwfn, struct qed_iwarp_ep *ep) |
|---|
| 830 | 818 | { |
|---|
| 831 | 819 | struct iwarp_mpa_offload_ramrod_data *p_mpa_ramrod; |
|---|
| 820 | + struct mpa_outgoing_params *common; |
|---|
| 832 | 821 | struct qed_iwarp_info *iwarp_info; |
|---|
| 833 | 822 | struct qed_sp_init_data init_data; |
|---|
| 834 | 823 | dma_addr_t async_output_phys; |
|---|
| .. | .. |
|---|
| 837 | 826 | dma_addr_t in_pdata_phys; |
|---|
| 838 | 827 | struct qed_rdma_qp *qp; |
|---|
| 839 | 828 | bool reject; |
|---|
| 829 | + u32 val; |
|---|
| 840 | 830 | int rc; |
|---|
| 841 | 831 | |
|---|
| 842 | 832 | if (!ep) |
|---|
| .. | .. |
|---|
| 861 | 851 | return rc; |
|---|
| 862 | 852 | |
|---|
| 863 | 853 | p_mpa_ramrod = &p_ent->ramrod.iwarp_mpa_offload; |
|---|
| 854 | + common = &p_mpa_ramrod->common; |
|---|
| 855 | + |
|---|
| 864 | 856 | out_pdata_phys = ep->ep_buffer_phys + |
|---|
| 865 | 857 | offsetof(struct qed_iwarp_ep_memory, out_pdata); |
|---|
| 866 | | - DMA_REGPAIR_LE(p_mpa_ramrod->common.outgoing_ulp_buffer.addr, |
|---|
| 867 | | - out_pdata_phys); |
|---|
| 868 | | - p_mpa_ramrod->common.outgoing_ulp_buffer.len = |
|---|
| 869 | | - ep->cm_info.private_data_len; |
|---|
| 870 | | - p_mpa_ramrod->common.crc_needed = p_hwfn->p_rdma_info->iwarp.crc_needed; |
|---|
| 858 | + DMA_REGPAIR_LE(common->outgoing_ulp_buffer.addr, out_pdata_phys); |
|---|
| 871 | 859 | |
|---|
| 872 | | - p_mpa_ramrod->common.out_rq.ord = ep->cm_info.ord; |
|---|
| 873 | | - p_mpa_ramrod->common.out_rq.ird = ep->cm_info.ird; |
|---|
| 860 | + val = ep->cm_info.private_data_len; |
|---|
| 861 | + common->outgoing_ulp_buffer.len = cpu_to_le16(val); |
|---|
| 862 | + common->crc_needed = p_hwfn->p_rdma_info->iwarp.crc_needed; |
|---|
| 874 | 863 | |
|---|
| 875 | | - p_mpa_ramrod->tcp_cid = p_hwfn->hw_info.opaque_fid << 16 | ep->tcp_cid; |
|---|
| 864 | + common->out_rq.ord = cpu_to_le32(ep->cm_info.ord); |
|---|
| 865 | + common->out_rq.ird = cpu_to_le32(ep->cm_info.ird); |
|---|
| 866 | + |
|---|
| 867 | + val = p_hwfn->hw_info.opaque_fid << 16 | ep->tcp_cid; |
|---|
| 868 | + p_mpa_ramrod->tcp_cid = cpu_to_le32(val); |
|---|
| 876 | 869 | |
|---|
| 877 | 870 | in_pdata_phys = ep->ep_buffer_phys + |
|---|
| 878 | 871 | offsetof(struct qed_iwarp_ep_memory, in_pdata); |
|---|
| .. | .. |
|---|
| 894 | 887 | p_mpa_ramrod->stats_counter_id = |
|---|
| 895 | 888 | RESC_START(p_hwfn, QED_RDMA_STATS_QUEUE) + qp->stats_queue; |
|---|
| 896 | 889 | } else { |
|---|
| 897 | | - p_mpa_ramrod->common.reject = 1; |
|---|
| 890 | + common->reject = 1; |
|---|
| 898 | 891 | } |
|---|
| 899 | 892 | |
|---|
| 900 | 893 | iwarp_info = &p_hwfn->p_rdma_info->iwarp; |
|---|
| 901 | | - p_mpa_ramrod->rcv_wnd = iwarp_info->rcv_wnd_size; |
|---|
| 894 | + p_mpa_ramrod->rcv_wnd = cpu_to_le16(iwarp_info->rcv_wnd_size); |
|---|
| 902 | 895 | p_mpa_ramrod->mode = ep->mpa_rev; |
|---|
| 903 | 896 | SET_FIELD(p_mpa_ramrod->rtr_pref, |
|---|
| 904 | 897 | IWARP_MPA_OFFLOAD_RAMROD_DATA_RTR_SUPPORTED, ep->rtr_type); |
|---|
| .. | .. |
|---|
| 936 | 929 | } |
|---|
| 937 | 930 | spin_lock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); |
|---|
| 938 | 931 | |
|---|
| 939 | | - list_del(&ep->list_entry); |
|---|
| 940 | | - list_add_tail(&ep->list_entry, |
|---|
| 941 | | - &p_hwfn->p_rdma_info->iwarp.ep_free_list); |
|---|
| 932 | + list_move_tail(&ep->list_entry, |
|---|
| 933 | + &p_hwfn->p_rdma_info->iwarp.ep_free_list); |
|---|
| 942 | 934 | |
|---|
| 943 | 935 | spin_unlock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); |
|---|
| 944 | 936 | } |
|---|
| .. | .. |
|---|
| 950 | 942 | union async_output *async_data; |
|---|
| 951 | 943 | u16 mpa_ird, mpa_ord; |
|---|
| 952 | 944 | u8 mpa_data_size = 0; |
|---|
| 945 | + u16 ulp_data_len; |
|---|
| 953 | 946 | |
|---|
| 954 | 947 | if (MPA_REV2(p_hwfn->p_rdma_info->iwarp.mpa_rev)) { |
|---|
| 955 | 948 | mpa_v2_params = |
|---|
| .. | .. |
|---|
| 961 | 954 | ep->cm_info.ird = (u8)(mpa_ord & MPA_V2_IRD_ORD_MASK); |
|---|
| 962 | 955 | ep->cm_info.ord = (u8)(mpa_ird & MPA_V2_IRD_ORD_MASK); |
|---|
| 963 | 956 | } |
|---|
| 964 | | - async_data = &ep->ep_buffer_virt->async_output; |
|---|
| 965 | 957 | |
|---|
| 958 | + async_data = &ep->ep_buffer_virt->async_output; |
|---|
| 966 | 959 | ep->cm_info.private_data = ep->ep_buffer_virt->in_pdata + mpa_data_size; |
|---|
| 967 | | - ep->cm_info.private_data_len = async_data->mpa_response.ulp_data_len - |
|---|
| 968 | | - mpa_data_size; |
|---|
| 960 | + |
|---|
| 961 | + ulp_data_len = le16_to_cpu(async_data->mpa_response.ulp_data_len); |
|---|
| 962 | + ep->cm_info.private_data_len = ulp_data_len - mpa_data_size; |
|---|
| 969 | 963 | } |
|---|
| 970 | 964 | |
|---|
| 971 | 965 | static void |
|---|
| .. | .. |
|---|
| 1303 | 1297 | prev_weight = weight; |
|---|
| 1304 | 1298 | |
|---|
| 1305 | 1299 | while (weight) { |
|---|
| 1300 | + /* If the HW device is during recovery, all resources are |
|---|
| 1301 | + * immediately reset without receiving a per-cid indication |
|---|
| 1302 | + * from HW. In this case we don't expect the cid_map to be |
|---|
| 1303 | + * cleared. |
|---|
| 1304 | + */ |
|---|
| 1305 | + if (p_hwfn->cdev->recov_in_prog) |
|---|
| 1306 | + return 0; |
|---|
| 1307 | + |
|---|
| 1306 | 1308 | msleep(QED_IWARP_MAX_CID_CLEAN_TIME); |
|---|
| 1307 | 1309 | |
|---|
| 1308 | 1310 | weight = bitmap_weight(bmap->bitmap, bmap->max_count); |
|---|
| .. | .. |
|---|
| 1842 | 1844 | goto out; |
|---|
| 1843 | 1845 | } |
|---|
| 1844 | 1846 | |
|---|
| 1845 | | - mpa_len = ntohs(*((u16 *)(mpa_data))); |
|---|
| 1847 | + mpa_len = ntohs(*(__force __be16 *)mpa_data); |
|---|
| 1846 | 1848 | fpdu->fpdu_length = QED_IWARP_FPDU_LEN_WITH_PAD(mpa_len); |
|---|
| 1847 | 1849 | |
|---|
| 1848 | 1850 | if (fpdu->fpdu_length <= tcp_payload_len) |
|---|
| .. | .. |
|---|
| 1864 | 1866 | struct unaligned_opaque_data *pkt_data, |
|---|
| 1865 | 1867 | u16 tcp_payload_size, u8 placement_offset) |
|---|
| 1866 | 1868 | { |
|---|
| 1869 | + u16 first_mpa_offset = le16_to_cpu(pkt_data->first_mpa_offset); |
|---|
| 1870 | + |
|---|
| 1867 | 1871 | fpdu->mpa_buf = buf; |
|---|
| 1868 | 1872 | fpdu->pkt_hdr = buf->data_phys_addr + placement_offset; |
|---|
| 1869 | 1873 | fpdu->pkt_hdr_size = pkt_data->tcp_payload_offset; |
|---|
| 1870 | | - fpdu->mpa_frag = buf->data_phys_addr + pkt_data->first_mpa_offset; |
|---|
| 1871 | | - fpdu->mpa_frag_virt = (u8 *)(buf->data) + pkt_data->first_mpa_offset; |
|---|
| 1874 | + fpdu->mpa_frag = buf->data_phys_addr + first_mpa_offset; |
|---|
| 1875 | + fpdu->mpa_frag_virt = (u8 *)(buf->data) + first_mpa_offset; |
|---|
| 1872 | 1876 | |
|---|
| 1873 | 1877 | if (tcp_payload_size == 1) |
|---|
| 1874 | 1878 | fpdu->incomplete_bytes = QED_IWARP_INVALID_FPDU_LENGTH; |
|---|
| .. | .. |
|---|
| 1886 | 1890 | struct unaligned_opaque_data *pkt_data, |
|---|
| 1887 | 1891 | struct qed_iwarp_ll2_buff *buf, u16 tcp_payload_size) |
|---|
| 1888 | 1892 | { |
|---|
| 1893 | + u16 first_mpa_offset = le16_to_cpu(pkt_data->first_mpa_offset); |
|---|
| 1889 | 1894 | u8 *tmp_buf = p_hwfn->p_rdma_info->iwarp.mpa_intermediate_buf; |
|---|
| 1890 | 1895 | int rc; |
|---|
| 1891 | 1896 | |
|---|
| .. | .. |
|---|
| 1906 | 1911 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, |
|---|
| 1907 | 1912 | "MPA ALIGN Copying fpdu: [%p, %d] [%p, %d]\n", |
|---|
| 1908 | 1913 | fpdu->mpa_frag_virt, fpdu->mpa_frag_len, |
|---|
| 1909 | | - (u8 *)(buf->data) + pkt_data->first_mpa_offset, |
|---|
| 1910 | | - tcp_payload_size); |
|---|
| 1914 | + (u8 *)(buf->data) + first_mpa_offset, tcp_payload_size); |
|---|
| 1911 | 1915 | |
|---|
| 1912 | 1916 | memcpy(tmp_buf, fpdu->mpa_frag_virt, fpdu->mpa_frag_len); |
|---|
| 1913 | 1917 | memcpy(tmp_buf + fpdu->mpa_frag_len, |
|---|
| 1914 | | - (u8 *)(buf->data) + pkt_data->first_mpa_offset, |
|---|
| 1915 | | - tcp_payload_size); |
|---|
| 1918 | + (u8 *)(buf->data) + first_mpa_offset, tcp_payload_size); |
|---|
| 1916 | 1919 | |
|---|
| 1917 | 1920 | rc = qed_iwarp_recycle_pkt(p_hwfn, fpdu, fpdu->mpa_buf); |
|---|
| 1918 | 1921 | if (rc) |
|---|
| .. | .. |
|---|
| 2055 | 2058 | u16 tcp_payload_size, enum qed_iwarp_mpa_pkt_type pkt_type) |
|---|
| 2056 | 2059 | { |
|---|
| 2057 | 2060 | struct qed_ll2_tx_pkt_info tx_pkt; |
|---|
| 2061 | + u16 first_mpa_offset; |
|---|
| 2058 | 2062 | u8 ll2_handle; |
|---|
| 2059 | 2063 | int rc; |
|---|
| 2060 | 2064 | |
|---|
| .. | .. |
|---|
| 2106 | 2110 | if (!fpdu->incomplete_bytes) |
|---|
| 2107 | 2111 | goto out; |
|---|
| 2108 | 2112 | |
|---|
| 2113 | + first_mpa_offset = le16_to_cpu(curr_pkt->first_mpa_offset); |
|---|
| 2114 | + |
|---|
| 2109 | 2115 | /* Set third fragment to second part of the packet */ |
|---|
| 2110 | 2116 | rc = qed_ll2_set_fragment_of_tx_packet(p_hwfn, |
|---|
| 2111 | 2117 | ll2_handle, |
|---|
| 2112 | 2118 | buf->data_phys_addr + |
|---|
| 2113 | | - curr_pkt->first_mpa_offset, |
|---|
| 2119 | + first_mpa_offset, |
|---|
| 2114 | 2120 | fpdu->incomplete_bytes); |
|---|
| 2115 | 2121 | out: |
|---|
| 2116 | 2122 | DP_VERBOSE(p_hwfn, |
|---|
| .. | .. |
|---|
| 2131 | 2137 | { |
|---|
| 2132 | 2138 | u64 opaque_data; |
|---|
| 2133 | 2139 | |
|---|
| 2134 | | - opaque_data = HILO_64(opaque_data1, opaque_data0); |
|---|
| 2140 | + opaque_data = HILO_64(cpu_to_le32(opaque_data1), |
|---|
| 2141 | + cpu_to_le32(opaque_data0)); |
|---|
| 2135 | 2142 | *curr_pkt = *((struct unaligned_opaque_data *)&opaque_data); |
|---|
| 2136 | 2143 | |
|---|
| 2137 | | - curr_pkt->first_mpa_offset = curr_pkt->tcp_payload_offset + |
|---|
| 2138 | | - le16_to_cpu(curr_pkt->first_mpa_offset); |
|---|
| 2139 | | - curr_pkt->cid = le32_to_cpu(curr_pkt->cid); |
|---|
| 2144 | + le16_add_cpu(&curr_pkt->first_mpa_offset, |
|---|
| 2145 | + curr_pkt->tcp_payload_offset); |
|---|
| 2140 | 2146 | } |
|---|
| 2141 | 2147 | |
|---|
| 2142 | 2148 | /* This function is called when an unaligned or incomplete MPA packet arrives |
|---|
| .. | .. |
|---|
| 2151 | 2157 | struct qed_iwarp_ll2_buff *buf = mpa_buf->ll2_buf; |
|---|
| 2152 | 2158 | enum qed_iwarp_mpa_pkt_type pkt_type; |
|---|
| 2153 | 2159 | struct qed_iwarp_fpdu *fpdu; |
|---|
| 2160 | + u16 cid, first_mpa_offset; |
|---|
| 2154 | 2161 | int rc = -EINVAL; |
|---|
| 2155 | 2162 | u8 *mpa_data; |
|---|
| 2156 | 2163 | |
|---|
| 2157 | | - fpdu = qed_iwarp_get_curr_fpdu(p_hwfn, curr_pkt->cid & 0xffff); |
|---|
| 2164 | + cid = le32_to_cpu(curr_pkt->cid); |
|---|
| 2165 | + |
|---|
| 2166 | + fpdu = qed_iwarp_get_curr_fpdu(p_hwfn, (u16)cid); |
|---|
| 2158 | 2167 | if (!fpdu) { /* something corrupt with cid, post rx back */ |
|---|
| 2159 | 2168 | DP_ERR(p_hwfn, "Invalid cid, drop and post back to rx cid=%x\n", |
|---|
| 2160 | | - curr_pkt->cid); |
|---|
| 2169 | + cid); |
|---|
| 2161 | 2170 | goto err; |
|---|
| 2162 | 2171 | } |
|---|
| 2163 | 2172 | |
|---|
| 2164 | 2173 | do { |
|---|
| 2165 | | - mpa_data = ((u8 *)(buf->data) + curr_pkt->first_mpa_offset); |
|---|
| 2174 | + first_mpa_offset = le16_to_cpu(curr_pkt->first_mpa_offset); |
|---|
| 2175 | + mpa_data = ((u8 *)(buf->data) + first_mpa_offset); |
|---|
| 2166 | 2176 | |
|---|
| 2167 | 2177 | pkt_type = qed_iwarp_mpa_classify(p_hwfn, fpdu, |
|---|
| 2168 | 2178 | mpa_buf->tcp_payload_len, |
|---|
| .. | .. |
|---|
| 2208 | 2218 | } |
|---|
| 2209 | 2219 | |
|---|
| 2210 | 2220 | mpa_buf->tcp_payload_len -= fpdu->fpdu_length; |
|---|
| 2211 | | - curr_pkt->first_mpa_offset += fpdu->fpdu_length; |
|---|
| 2221 | + le16_add_cpu(&curr_pkt->first_mpa_offset, |
|---|
| 2222 | + fpdu->fpdu_length); |
|---|
| 2212 | 2223 | break; |
|---|
| 2213 | 2224 | case QED_IWARP_MPA_PKT_UNALIGNED: |
|---|
| 2214 | 2225 | qed_iwarp_update_fpdu_length(p_hwfn, fpdu, mpa_data); |
|---|
| .. | .. |
|---|
| 2247 | 2258 | } |
|---|
| 2248 | 2259 | |
|---|
| 2249 | 2260 | mpa_buf->tcp_payload_len -= fpdu->incomplete_bytes; |
|---|
| 2250 | | - curr_pkt->first_mpa_offset += fpdu->incomplete_bytes; |
|---|
| 2261 | + le16_add_cpu(&curr_pkt->first_mpa_offset, |
|---|
| 2262 | + fpdu->incomplete_bytes); |
|---|
| 2263 | + |
|---|
| 2251 | 2264 | /* The framed PDU was sent - no more incomplete bytes */ |
|---|
| 2252 | 2265 | fpdu->incomplete_bytes = 0; |
|---|
| 2253 | 2266 | break; |
|---|
| .. | .. |
|---|
| 2282 | 2295 | if (rc == -EBUSY) |
|---|
| 2283 | 2296 | break; |
|---|
| 2284 | 2297 | |
|---|
| 2285 | | - list_del(&mpa_buf->list_entry); |
|---|
| 2286 | | - list_add_tail(&mpa_buf->list_entry, &iwarp_info->mpa_buf_list); |
|---|
| 2298 | + list_move_tail(&mpa_buf->list_entry, |
|---|
| 2299 | + &iwarp_info->mpa_buf_list); |
|---|
| 2287 | 2300 | |
|---|
| 2288 | 2301 | if (rc) { /* different error, don't continue */ |
|---|
| 2289 | 2302 | DP_NOTICE(p_hwfn, "process pkts failed rc=%d\n", rc); |
|---|
| .. | .. |
|---|
| 2298 | 2311 | struct qed_iwarp_ll2_mpa_buf *mpa_buf; |
|---|
| 2299 | 2312 | struct qed_iwarp_info *iwarp_info; |
|---|
| 2300 | 2313 | struct qed_hwfn *p_hwfn = cxt; |
|---|
| 2314 | + u16 first_mpa_offset; |
|---|
| 2301 | 2315 | |
|---|
| 2302 | 2316 | iwarp_info = &p_hwfn->p_rdma_info->iwarp; |
|---|
| 2303 | 2317 | mpa_buf = list_first_entry(&iwarp_info->mpa_buf_list, |
|---|
| .. | .. |
|---|
| 2311 | 2325 | qed_iwarp_mpa_get_data(p_hwfn, &mpa_buf->data, |
|---|
| 2312 | 2326 | data->opaque_data_0, data->opaque_data_1); |
|---|
| 2313 | 2327 | |
|---|
| 2328 | + first_mpa_offset = le16_to_cpu(mpa_buf->data.first_mpa_offset); |
|---|
| 2329 | + |
|---|
| 2314 | 2330 | DP_VERBOSE(p_hwfn, |
|---|
| 2315 | 2331 | QED_MSG_RDMA, |
|---|
| 2316 | 2332 | "LL2 MPA CompRx payload_len:0x%x\tfirst_mpa_offset:0x%x\ttcp_payload_offset:0x%x\tflags:0x%x\tcid:0x%x\n", |
|---|
| 2317 | | - data->length.packet_length, mpa_buf->data.first_mpa_offset, |
|---|
| 2333 | + data->length.packet_length, first_mpa_offset, |
|---|
| 2318 | 2334 | mpa_buf->data.tcp_payload_offset, mpa_buf->data.flags, |
|---|
| 2319 | 2335 | mpa_buf->data.cid); |
|---|
| 2320 | 2336 | |
|---|
| 2321 | 2337 | mpa_buf->ll2_buf = data->cookie; |
|---|
| 2322 | 2338 | mpa_buf->tcp_payload_len = data->length.packet_length - |
|---|
| 2323 | | - mpa_buf->data.first_mpa_offset; |
|---|
| 2324 | | - mpa_buf->data.first_mpa_offset += data->u.placement_offset; |
|---|
| 2339 | + first_mpa_offset; |
|---|
| 2340 | + |
|---|
| 2341 | + first_mpa_offset += data->u.placement_offset; |
|---|
| 2342 | + mpa_buf->data.first_mpa_offset = cpu_to_le16(first_mpa_offset); |
|---|
| 2325 | 2343 | mpa_buf->placement_offset = data->u.placement_offset; |
|---|
| 2326 | 2344 | |
|---|
| 2327 | 2345 | list_add_tail(&mpa_buf->list_entry, &iwarp_info->mpa_buf_pending_list); |
|---|
| .. | .. |
|---|
| 2520 | 2538 | struct unaligned_opaque_data unalign_data; |
|---|
| 2521 | 2539 | struct qed_hwfn *p_hwfn = cxt; |
|---|
| 2522 | 2540 | struct qed_iwarp_fpdu *fpdu; |
|---|
| 2541 | + u32 cid; |
|---|
| 2523 | 2542 | |
|---|
| 2524 | 2543 | qed_iwarp_mpa_get_data(p_hwfn, &unalign_data, |
|---|
| 2525 | 2544 | opaque_data_0, opaque_data_1); |
|---|
| 2526 | 2545 | |
|---|
| 2527 | | - DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "(0x%x) Flush fpdu\n", |
|---|
| 2528 | | - unalign_data.cid); |
|---|
| 2546 | + cid = le32_to_cpu(unalign_data.cid); |
|---|
| 2529 | 2547 | |
|---|
| 2530 | | - fpdu = qed_iwarp_get_curr_fpdu(p_hwfn, (u16)unalign_data.cid); |
|---|
| 2548 | + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "(0x%x) Flush fpdu\n", cid); |
|---|
| 2549 | + |
|---|
| 2550 | + fpdu = qed_iwarp_get_curr_fpdu(p_hwfn, (u16)cid); |
|---|
| 2531 | 2551 | if (fpdu) |
|---|
| 2532 | 2552 | memset(fpdu, 0, sizeof(*fpdu)); |
|---|
| 2533 | 2553 | } |
|---|
| 2534 | 2554 | |
|---|
| 2535 | | -static int qed_iwarp_ll2_stop(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) |
|---|
| 2555 | +static int qed_iwarp_ll2_stop(struct qed_hwfn *p_hwfn) |
|---|
| 2536 | 2556 | { |
|---|
| 2537 | 2557 | struct qed_iwarp_info *iwarp_info = &p_hwfn->p_rdma_info->iwarp; |
|---|
| 2538 | 2558 | int rc = 0; |
|---|
| .. | .. |
|---|
| 2567 | 2587 | iwarp_info->ll2_mpa_handle = QED_IWARP_HANDLE_INVAL; |
|---|
| 2568 | 2588 | } |
|---|
| 2569 | 2589 | |
|---|
| 2570 | | - qed_llh_remove_mac_filter(p_hwfn, |
|---|
| 2571 | | - p_ptt, p_hwfn->p_rdma_info->iwarp.mac_addr); |
|---|
| 2590 | + qed_llh_remove_mac_filter(p_hwfn->cdev, 0, |
|---|
| 2591 | + p_hwfn->p_rdma_info->iwarp.mac_addr); |
|---|
| 2592 | + |
|---|
| 2572 | 2593 | return rc; |
|---|
| 2573 | 2594 | } |
|---|
| 2574 | 2595 | |
|---|
| .. | .. |
|---|
| 2613 | 2634 | static int |
|---|
| 2614 | 2635 | qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn, |
|---|
| 2615 | 2636 | struct qed_rdma_start_in_params *params, |
|---|
| 2616 | | - struct qed_ptt *p_ptt) |
|---|
| 2637 | + u32 rcv_wnd_size) |
|---|
| 2617 | 2638 | { |
|---|
| 2618 | 2639 | struct qed_iwarp_info *iwarp_info; |
|---|
| 2619 | 2640 | struct qed_ll2_acquire_data data; |
|---|
| .. | .. |
|---|
| 2632 | 2653 | |
|---|
| 2633 | 2654 | ether_addr_copy(p_hwfn->p_rdma_info->iwarp.mac_addr, params->mac_addr); |
|---|
| 2634 | 2655 | |
|---|
| 2635 | | - rc = qed_llh_add_mac_filter(p_hwfn, p_ptt, params->mac_addr); |
|---|
| 2656 | + rc = qed_llh_add_mac_filter(p_hwfn->cdev, 0, params->mac_addr); |
|---|
| 2636 | 2657 | if (rc) |
|---|
| 2637 | 2658 | return rc; |
|---|
| 2638 | 2659 | |
|---|
| .. | .. |
|---|
| 2646 | 2667 | |
|---|
| 2647 | 2668 | memset(&data, 0, sizeof(data)); |
|---|
| 2648 | 2669 | data.input.conn_type = QED_LL2_TYPE_IWARP; |
|---|
| 2670 | + /* SYN will use ctx based queues */ |
|---|
| 2671 | + data.input.rx_conn_type = QED_LL2_RX_TYPE_CTX; |
|---|
| 2649 | 2672 | data.input.mtu = params->max_mtu; |
|---|
| 2650 | 2673 | data.input.rx_num_desc = QED_IWARP_LL2_SYN_RX_SIZE; |
|---|
| 2651 | 2674 | data.input.tx_num_desc = QED_IWARP_LL2_SYN_TX_SIZE; |
|---|
| .. | .. |
|---|
| 2658 | 2681 | rc = qed_ll2_acquire_connection(p_hwfn, &data); |
|---|
| 2659 | 2682 | if (rc) { |
|---|
| 2660 | 2683 | DP_NOTICE(p_hwfn, "Failed to acquire LL2 connection\n"); |
|---|
| 2661 | | - qed_llh_remove_mac_filter(p_hwfn, p_ptt, params->mac_addr); |
|---|
| 2684 | + qed_llh_remove_mac_filter(p_hwfn->cdev, 0, params->mac_addr); |
|---|
| 2662 | 2685 | return rc; |
|---|
| 2663 | 2686 | } |
|---|
| 2664 | 2687 | |
|---|
| .. | .. |
|---|
| 2678 | 2701 | |
|---|
| 2679 | 2702 | /* Start OOO connection */ |
|---|
| 2680 | 2703 | data.input.conn_type = QED_LL2_TYPE_OOO; |
|---|
| 2704 | + /* OOO/unaligned will use legacy ll2 queues (ram based) */ |
|---|
| 2705 | + data.input.rx_conn_type = QED_LL2_RX_TYPE_LEGACY; |
|---|
| 2681 | 2706 | data.input.mtu = params->max_mtu; |
|---|
| 2682 | 2707 | |
|---|
| 2683 | | - n_ooo_bufs = (QED_IWARP_MAX_OOO * QED_IWARP_RCV_WND_SIZE_DEF) / |
|---|
| 2708 | + n_ooo_bufs = (QED_IWARP_MAX_OOO * rcv_wnd_size) / |
|---|
| 2684 | 2709 | iwarp_info->max_mtu; |
|---|
| 2685 | 2710 | n_ooo_bufs = min_t(u32, n_ooo_bufs, QED_IWARP_LL2_OOO_MAX_RX_SIZE); |
|---|
| 2686 | 2711 | |
|---|
| .. | .. |
|---|
| 2770 | 2795 | &iwarp_info->mpa_buf_list); |
|---|
| 2771 | 2796 | return rc; |
|---|
| 2772 | 2797 | err: |
|---|
| 2773 | | - qed_iwarp_ll2_stop(p_hwfn, p_ptt); |
|---|
| 2798 | + qed_iwarp_ll2_stop(p_hwfn); |
|---|
| 2774 | 2799 | |
|---|
| 2775 | 2800 | return rc; |
|---|
| 2776 | 2801 | } |
|---|
| 2777 | 2802 | |
|---|
| 2778 | | -int qed_iwarp_setup(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, |
|---|
| 2803 | +static struct { |
|---|
| 2804 | + u32 two_ports; |
|---|
| 2805 | + u32 four_ports; |
|---|
| 2806 | +} qed_iwarp_rcv_wnd_size[MAX_CHIP_IDS] = { |
|---|
| 2807 | + {QED_IWARP_RCV_WND_SIZE_DEF_BB_2P, QED_IWARP_RCV_WND_SIZE_DEF_BB_4P}, |
|---|
| 2808 | + {QED_IWARP_RCV_WND_SIZE_DEF_AH_2P, QED_IWARP_RCV_WND_SIZE_DEF_AH_4P} |
|---|
| 2809 | +}; |
|---|
| 2810 | + |
|---|
| 2811 | +int qed_iwarp_setup(struct qed_hwfn *p_hwfn, |
|---|
| 2779 | 2812 | struct qed_rdma_start_in_params *params) |
|---|
| 2780 | 2813 | { |
|---|
| 2814 | + struct qed_dev *cdev = p_hwfn->cdev; |
|---|
| 2781 | 2815 | struct qed_iwarp_info *iwarp_info; |
|---|
| 2816 | + enum chip_ids chip_id; |
|---|
| 2782 | 2817 | u32 rcv_wnd_size; |
|---|
| 2783 | 2818 | |
|---|
| 2784 | 2819 | iwarp_info = &p_hwfn->p_rdma_info->iwarp; |
|---|
| 2785 | 2820 | |
|---|
| 2786 | 2821 | iwarp_info->tcp_flags = QED_IWARP_TS_EN; |
|---|
| 2787 | | - rcv_wnd_size = QED_IWARP_RCV_WND_SIZE_DEF; |
|---|
| 2822 | + |
|---|
| 2823 | + chip_id = QED_IS_BB(cdev) ? CHIP_BB : CHIP_K2; |
|---|
| 2824 | + rcv_wnd_size = (qed_device_num_ports(cdev) == 4) ? |
|---|
| 2825 | + qed_iwarp_rcv_wnd_size[chip_id].four_ports : |
|---|
| 2826 | + qed_iwarp_rcv_wnd_size[chip_id].two_ports; |
|---|
| 2788 | 2827 | |
|---|
| 2789 | 2828 | /* value 0 is used for ilog2(QED_IWARP_RCV_WND_SIZE_MIN) */ |
|---|
| 2790 | 2829 | iwarp_info->rcv_wnd_scale = ilog2(rcv_wnd_size) - |
|---|
| .. | .. |
|---|
| 2807 | 2846 | qed_iwarp_async_event); |
|---|
| 2808 | 2847 | qed_ooo_setup(p_hwfn); |
|---|
| 2809 | 2848 | |
|---|
| 2810 | | - return qed_iwarp_ll2_start(p_hwfn, params, p_ptt); |
|---|
| 2849 | + return qed_iwarp_ll2_start(p_hwfn, params, rcv_wnd_size); |
|---|
| 2811 | 2850 | } |
|---|
| 2812 | 2851 | |
|---|
| 2813 | | -int qed_iwarp_stop(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) |
|---|
| 2852 | +int qed_iwarp_stop(struct qed_hwfn *p_hwfn) |
|---|
| 2814 | 2853 | { |
|---|
| 2815 | 2854 | int rc; |
|---|
| 2816 | 2855 | |
|---|
| .. | .. |
|---|
| 2819 | 2858 | if (rc) |
|---|
| 2820 | 2859 | return rc; |
|---|
| 2821 | 2860 | |
|---|
| 2822 | | - qed_spq_unregister_async_cb(p_hwfn, PROTOCOLID_IWARP); |
|---|
| 2823 | | - |
|---|
| 2824 | | - return qed_iwarp_ll2_stop(p_hwfn, p_ptt); |
|---|
| 2861 | + return qed_iwarp_ll2_stop(p_hwfn); |
|---|
| 2825 | 2862 | } |
|---|
| 2826 | 2863 | |
|---|
| 2827 | 2864 | static void qed_iwarp_qp_in_error(struct qed_hwfn *p_hwfn, |
|---|
| .. | .. |
|---|
| 3018 | 3055 | return true; |
|---|
| 3019 | 3056 | } |
|---|
| 3020 | 3057 | |
|---|
| 3021 | | -static int qed_iwarp_async_event(struct qed_hwfn *p_hwfn, |
|---|
| 3022 | | - u8 fw_event_code, u16 echo, |
|---|
| 3023 | | - union event_ring_data *data, |
|---|
| 3058 | +static int qed_iwarp_async_event(struct qed_hwfn *p_hwfn, u8 fw_event_code, |
|---|
| 3059 | + __le16 echo, union event_ring_data *data, |
|---|
| 3024 | 3060 | u8 fw_return_code) |
|---|
| 3025 | 3061 | { |
|---|
| 3026 | 3062 | struct qed_rdma_events events = p_hwfn->p_rdma_info->events; |
|---|