207 lines · c
1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */2/* QLogic qed NIC Driver3 * Copyright (c) 2015-2017 QLogic Corporation4 * Copyright (c) 2019-2020 Marvell International Ltd.5 */6 7#ifndef _QED_IWARP_H8#define _QED_IWARP_H9 10enum qed_iwarp_qp_state {11 QED_IWARP_QP_STATE_IDLE,12 QED_IWARP_QP_STATE_RTS,13 QED_IWARP_QP_STATE_TERMINATE,14 QED_IWARP_QP_STATE_CLOSING,15 QED_IWARP_QP_STATE_ERROR,16};17 18enum qed_iwarp_qp_state qed_roce2iwarp_state(enum qed_roce_qp_state state);19 20#define QED_IWARP_PREALLOC_CNT (256)21 22#define QED_IWARP_LL2_SYN_TX_SIZE (128)23#define QED_IWARP_LL2_SYN_RX_SIZE (256)24 25#define QED_IWARP_LL2_OOO_DEF_TX_SIZE (256)26#define QED_IWARP_MAX_OOO (16)27#define QED_IWARP_LL2_OOO_MAX_RX_SIZE (16384)28 29#define QED_IWARP_HANDLE_INVAL (0xff)30 31struct qed_iwarp_ll2_buff {32 struct qed_iwarp_ll2_buff *piggy_buf;33 void *data;34 dma_addr_t data_phys_addr;35 u32 buff_size;36};37 38struct qed_iwarp_ll2_mpa_buf {39 struct list_head list_entry;40 struct qed_iwarp_ll2_buff *ll2_buf;41 struct unaligned_opaque_data data;42 u16 tcp_payload_len;43 u8 placement_offset;44};45 46/* In some cases a fpdu will arrive with only one byte of the header, in this47 * case the fpdu_length will be partial (contain only higher byte and48 * incomplete bytes will contain the invalid value49 */50#define QED_IWARP_INVALID_INCOMPLETE_BYTES 0xffff51 52struct qed_iwarp_fpdu {53 struct qed_iwarp_ll2_buff *mpa_buf;54 void *mpa_frag_virt;55 dma_addr_t mpa_frag;56 dma_addr_t pkt_hdr;57 u16 mpa_frag_len;58 u16 fpdu_length;59 u16 incomplete_bytes;60 u8 pkt_hdr_size;61};62 63struct qed_iwarp_info {64 struct list_head listen_list; /* qed_iwarp_listener */65 struct list_head ep_list; /* qed_iwarp_ep */66 struct list_head ep_free_list; /* pre-allocated ep's */67 struct list_head mpa_buf_list; /* list of mpa_bufs */68 struct list_head mpa_buf_pending_list;69 spinlock_t iw_lock; /* for iwarp resources */70 spinlock_t qp_lock; /* for teardown races */71 u32 rcv_wnd_scale;72 u16 rcv_wnd_size;73 u16 max_mtu;74 u8 mac_addr[ETH_ALEN];75 u8 crc_needed;76 u8 tcp_flags;77 u8 ll2_syn_handle;78 u8 ll2_ooo_handle;79 u8 ll2_mpa_handle;80 u8 peer2peer;81 enum mpa_negotiation_mode mpa_rev;82 enum mpa_rtr_type rtr_type;83 struct qed_iwarp_fpdu *partial_fpdus;84 struct qed_iwarp_ll2_mpa_buf *mpa_bufs;85 u8 *mpa_intermediate_buf;86 u16 max_num_partial_fpdus;87};88 89enum qed_iwarp_ep_state {90 QED_IWARP_EP_INIT,91 QED_IWARP_EP_MPA_REQ_RCVD,92 QED_IWARP_EP_MPA_OFFLOADED,93 QED_IWARP_EP_ESTABLISHED,94 QED_IWARP_EP_CLOSED95};96 97union async_output {98 struct iwarp_eqe_data_mpa_async_completion mpa_response;99 struct iwarp_eqe_data_tcp_async_completion mpa_request;100};101 102#define QED_MAX_PRIV_DATA_LEN (512)103struct qed_iwarp_ep_memory {104 u8 in_pdata[QED_MAX_PRIV_DATA_LEN];105 u8 out_pdata[QED_MAX_PRIV_DATA_LEN];106 union async_output async_output;107};108 109/* Endpoint structure represents a TCP connection. This connection can be110 * associated with a QP or not (in which case QP==NULL)111 */112struct qed_iwarp_ep {113 struct list_head list_entry;114 struct qed_rdma_qp *qp;115 struct qed_iwarp_ep_memory *ep_buffer_virt;116 dma_addr_t ep_buffer_phys;117 enum qed_iwarp_ep_state state;118 int sig;119 struct qed_iwarp_cm_info cm_info;120 enum tcp_connect_mode connect_mode;121 enum mpa_rtr_type rtr_type;122 enum mpa_negotiation_mode mpa_rev;123 u32 tcp_cid;124 u32 cid;125 u16 mss;126 u8 remote_mac_addr[6];127 u8 local_mac_addr[6];128 bool mpa_reply_processed;129 130 /* For Passive side - syn packet related data */131 u16 syn_ip_payload_length;132 struct qed_iwarp_ll2_buff *syn;133 dma_addr_t syn_phy_addr;134 135 /* The event_cb function is called for asynchrounous events associated136 * with the ep. It is initialized at different entry points depending137 * on whether the ep is the tcp connection active side or passive side138 * The cb_context is passed to the event_cb function.139 */140 iwarp_event_handler event_cb;141 void *cb_context;142};143 144struct qed_iwarp_listener {145 struct list_head list_entry;146 147 /* The event_cb function is called for connection requests.148 * The cb_context is passed to the event_cb function.149 */150 iwarp_event_handler event_cb;151 void *cb_context;152 u32 max_backlog;153 u32 ip_addr[4];154 u16 port;155 u16 vlan;156 u8 ip_version;157};158 159int qed_iwarp_alloc(struct qed_hwfn *p_hwfn);160 161int qed_iwarp_setup(struct qed_hwfn *p_hwfn,162 struct qed_rdma_start_in_params *params);163 164void qed_iwarp_init_fw_ramrod(struct qed_hwfn *p_hwfn,165 struct iwarp_init_func_ramrod_data *p_ramrod);166 167int qed_iwarp_stop(struct qed_hwfn *p_hwfn);168 169void qed_iwarp_resc_free(struct qed_hwfn *p_hwfn);170 171void qed_iwarp_init_devinfo(struct qed_hwfn *p_hwfn);172 173void qed_iwarp_init_hw(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt);174 175int qed_iwarp_create_qp(struct qed_hwfn *p_hwfn,176 struct qed_rdma_qp *qp,177 struct qed_rdma_create_qp_out_params *out_params);178 179int qed_iwarp_modify_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp,180 enum qed_iwarp_qp_state new_state, bool internal);181 182int qed_iwarp_destroy_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp);183 184int qed_iwarp_fw_destroy(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp);185 186void qed_iwarp_query_qp(struct qed_rdma_qp *qp,187 struct qed_rdma_query_qp_out_params *out_params);188 189int190qed_iwarp_connect(void *rdma_cxt,191 struct qed_iwarp_connect_in *iparams,192 struct qed_iwarp_connect_out *oparams);193 194int195qed_iwarp_create_listen(void *rdma_cxt,196 struct qed_iwarp_listen_in *iparams,197 struct qed_iwarp_listen_out *oparams);198 199int qed_iwarp_accept(void *rdma_cxt, struct qed_iwarp_accept_in *iparams);200 201int qed_iwarp_reject(void *rdma_cxt, struct qed_iwarp_reject_in *iparams);202int qed_iwarp_destroy_listen(void *rdma_cxt, void *handle);203 204int qed_iwarp_send_rtr(void *rdma_cxt, struct qed_iwarp_send_rtr_in *iparams);205 206#endif207