18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
28c2ecf20Sopenharmony_ci/* QLogic qed NIC Driver
38c2ecf20Sopenharmony_ci * Copyright (c) 2015-2017  QLogic Corporation
48c2ecf20Sopenharmony_ci * Copyright (c) 2019-2020 Marvell International Ltd.
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef _QED_IWARP_H
88c2ecf20Sopenharmony_ci#define _QED_IWARP_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_cienum qed_iwarp_qp_state {
118c2ecf20Sopenharmony_ci	QED_IWARP_QP_STATE_IDLE,
128c2ecf20Sopenharmony_ci	QED_IWARP_QP_STATE_RTS,
138c2ecf20Sopenharmony_ci	QED_IWARP_QP_STATE_TERMINATE,
148c2ecf20Sopenharmony_ci	QED_IWARP_QP_STATE_CLOSING,
158c2ecf20Sopenharmony_ci	QED_IWARP_QP_STATE_ERROR,
168c2ecf20Sopenharmony_ci};
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cienum qed_iwarp_qp_state qed_roce2iwarp_state(enum qed_roce_qp_state state);
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#define QED_IWARP_PREALLOC_CNT  (256)
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#define QED_IWARP_LL2_SYN_TX_SIZE       (128)
238c2ecf20Sopenharmony_ci#define QED_IWARP_LL2_SYN_RX_SIZE       (256)
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci#define QED_IWARP_LL2_OOO_DEF_TX_SIZE   (256)
268c2ecf20Sopenharmony_ci#define QED_IWARP_MAX_OOO		(16)
278c2ecf20Sopenharmony_ci#define QED_IWARP_LL2_OOO_MAX_RX_SIZE   (16384)
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#define QED_IWARP_HANDLE_INVAL		(0xff)
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistruct qed_iwarp_ll2_buff {
328c2ecf20Sopenharmony_ci	struct qed_iwarp_ll2_buff *piggy_buf;
338c2ecf20Sopenharmony_ci	void *data;
348c2ecf20Sopenharmony_ci	dma_addr_t data_phys_addr;
358c2ecf20Sopenharmony_ci	u32 buff_size;
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistruct qed_iwarp_ll2_mpa_buf {
398c2ecf20Sopenharmony_ci	struct list_head list_entry;
408c2ecf20Sopenharmony_ci	struct qed_iwarp_ll2_buff *ll2_buf;
418c2ecf20Sopenharmony_ci	struct unaligned_opaque_data data;
428c2ecf20Sopenharmony_ci	u16 tcp_payload_len;
438c2ecf20Sopenharmony_ci	u8 placement_offset;
448c2ecf20Sopenharmony_ci};
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci/* In some cases a fpdu will arrive with only one byte of the header, in this
478c2ecf20Sopenharmony_ci * case the fpdu_length will be partial (contain only higher byte and
488c2ecf20Sopenharmony_ci * incomplete bytes will contain the invalid value
498c2ecf20Sopenharmony_ci */
508c2ecf20Sopenharmony_ci#define QED_IWARP_INVALID_INCOMPLETE_BYTES 0xffff
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistruct qed_iwarp_fpdu {
538c2ecf20Sopenharmony_ci	struct qed_iwarp_ll2_buff *mpa_buf;
548c2ecf20Sopenharmony_ci	void *mpa_frag_virt;
558c2ecf20Sopenharmony_ci	dma_addr_t mpa_frag;
568c2ecf20Sopenharmony_ci	dma_addr_t pkt_hdr;
578c2ecf20Sopenharmony_ci	u16 mpa_frag_len;
588c2ecf20Sopenharmony_ci	u16 fpdu_length;
598c2ecf20Sopenharmony_ci	u16 incomplete_bytes;
608c2ecf20Sopenharmony_ci	u8 pkt_hdr_size;
618c2ecf20Sopenharmony_ci};
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistruct qed_iwarp_info {
648c2ecf20Sopenharmony_ci	struct list_head listen_list;	/* qed_iwarp_listener */
658c2ecf20Sopenharmony_ci	struct list_head ep_list;	/* qed_iwarp_ep */
668c2ecf20Sopenharmony_ci	struct list_head ep_free_list;	/* pre-allocated ep's */
678c2ecf20Sopenharmony_ci	struct list_head mpa_buf_list;	/* list of mpa_bufs */
688c2ecf20Sopenharmony_ci	struct list_head mpa_buf_pending_list;
698c2ecf20Sopenharmony_ci	spinlock_t iw_lock;	/* for iwarp resources */
708c2ecf20Sopenharmony_ci	spinlock_t qp_lock;	/* for teardown races */
718c2ecf20Sopenharmony_ci	u32 rcv_wnd_scale;
728c2ecf20Sopenharmony_ci	u16 rcv_wnd_size;
738c2ecf20Sopenharmony_ci	u16 max_mtu;
748c2ecf20Sopenharmony_ci	u8 mac_addr[ETH_ALEN];
758c2ecf20Sopenharmony_ci	u8 crc_needed;
768c2ecf20Sopenharmony_ci	u8 tcp_flags;
778c2ecf20Sopenharmony_ci	u8 ll2_syn_handle;
788c2ecf20Sopenharmony_ci	u8 ll2_ooo_handle;
798c2ecf20Sopenharmony_ci	u8 ll2_mpa_handle;
808c2ecf20Sopenharmony_ci	u8 peer2peer;
818c2ecf20Sopenharmony_ci	enum mpa_negotiation_mode mpa_rev;
828c2ecf20Sopenharmony_ci	enum mpa_rtr_type rtr_type;
838c2ecf20Sopenharmony_ci	struct qed_iwarp_fpdu *partial_fpdus;
848c2ecf20Sopenharmony_ci	struct qed_iwarp_ll2_mpa_buf *mpa_bufs;
858c2ecf20Sopenharmony_ci	u8 *mpa_intermediate_buf;
868c2ecf20Sopenharmony_ci	u16 max_num_partial_fpdus;
878c2ecf20Sopenharmony_ci};
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_cienum qed_iwarp_ep_state {
908c2ecf20Sopenharmony_ci	QED_IWARP_EP_INIT,
918c2ecf20Sopenharmony_ci	QED_IWARP_EP_MPA_REQ_RCVD,
928c2ecf20Sopenharmony_ci	QED_IWARP_EP_MPA_OFFLOADED,
938c2ecf20Sopenharmony_ci	QED_IWARP_EP_ESTABLISHED,
948c2ecf20Sopenharmony_ci	QED_IWARP_EP_CLOSED
958c2ecf20Sopenharmony_ci};
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ciunion async_output {
988c2ecf20Sopenharmony_ci	struct iwarp_eqe_data_mpa_async_completion mpa_response;
998c2ecf20Sopenharmony_ci	struct iwarp_eqe_data_tcp_async_completion mpa_request;
1008c2ecf20Sopenharmony_ci};
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci#define QED_MAX_PRIV_DATA_LEN (512)
1038c2ecf20Sopenharmony_cistruct qed_iwarp_ep_memory {
1048c2ecf20Sopenharmony_ci	u8 in_pdata[QED_MAX_PRIV_DATA_LEN];
1058c2ecf20Sopenharmony_ci	u8 out_pdata[QED_MAX_PRIV_DATA_LEN];
1068c2ecf20Sopenharmony_ci	union async_output async_output;
1078c2ecf20Sopenharmony_ci};
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci/* Endpoint structure represents a TCP connection. This connection can be
1108c2ecf20Sopenharmony_ci * associated with a QP or not (in which case QP==NULL)
1118c2ecf20Sopenharmony_ci */
1128c2ecf20Sopenharmony_cistruct qed_iwarp_ep {
1138c2ecf20Sopenharmony_ci	struct list_head list_entry;
1148c2ecf20Sopenharmony_ci	struct qed_rdma_qp *qp;
1158c2ecf20Sopenharmony_ci	struct qed_iwarp_ep_memory *ep_buffer_virt;
1168c2ecf20Sopenharmony_ci	dma_addr_t ep_buffer_phys;
1178c2ecf20Sopenharmony_ci	enum qed_iwarp_ep_state state;
1188c2ecf20Sopenharmony_ci	int sig;
1198c2ecf20Sopenharmony_ci	struct qed_iwarp_cm_info cm_info;
1208c2ecf20Sopenharmony_ci	enum tcp_connect_mode connect_mode;
1218c2ecf20Sopenharmony_ci	enum mpa_rtr_type rtr_type;
1228c2ecf20Sopenharmony_ci	enum mpa_negotiation_mode mpa_rev;
1238c2ecf20Sopenharmony_ci	u32 tcp_cid;
1248c2ecf20Sopenharmony_ci	u32 cid;
1258c2ecf20Sopenharmony_ci	u16 mss;
1268c2ecf20Sopenharmony_ci	u8 remote_mac_addr[6];
1278c2ecf20Sopenharmony_ci	u8 local_mac_addr[6];
1288c2ecf20Sopenharmony_ci	bool mpa_reply_processed;
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci	/* For Passive side - syn packet related data */
1318c2ecf20Sopenharmony_ci	u16 syn_ip_payload_length;
1328c2ecf20Sopenharmony_ci	struct qed_iwarp_ll2_buff *syn;
1338c2ecf20Sopenharmony_ci	dma_addr_t syn_phy_addr;
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci	/* The event_cb function is called for asynchrounous events associated
1368c2ecf20Sopenharmony_ci	 * with the ep. It is initialized at different entry points depending
1378c2ecf20Sopenharmony_ci	 * on whether the ep is the tcp connection active side or passive side
1388c2ecf20Sopenharmony_ci	 * The cb_context is passed to the event_cb function.
1398c2ecf20Sopenharmony_ci	 */
1408c2ecf20Sopenharmony_ci	iwarp_event_handler event_cb;
1418c2ecf20Sopenharmony_ci	void *cb_context;
1428c2ecf20Sopenharmony_ci};
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_cistruct qed_iwarp_listener {
1458c2ecf20Sopenharmony_ci	struct list_head list_entry;
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci	/* The event_cb function is called for connection requests.
1488c2ecf20Sopenharmony_ci	 * The cb_context is passed to the event_cb function.
1498c2ecf20Sopenharmony_ci	 */
1508c2ecf20Sopenharmony_ci	iwarp_event_handler event_cb;
1518c2ecf20Sopenharmony_ci	void *cb_context;
1528c2ecf20Sopenharmony_ci	u32 max_backlog;
1538c2ecf20Sopenharmony_ci	u32 ip_addr[4];
1548c2ecf20Sopenharmony_ci	u16 port;
1558c2ecf20Sopenharmony_ci	u16 vlan;
1568c2ecf20Sopenharmony_ci	u8 ip_version;
1578c2ecf20Sopenharmony_ci};
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ciint qed_iwarp_alloc(struct qed_hwfn *p_hwfn);
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ciint qed_iwarp_setup(struct qed_hwfn *p_hwfn,
1628c2ecf20Sopenharmony_ci		    struct qed_rdma_start_in_params *params);
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_civoid qed_iwarp_init_fw_ramrod(struct qed_hwfn *p_hwfn,
1658c2ecf20Sopenharmony_ci			      struct iwarp_init_func_ramrod_data *p_ramrod);
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ciint qed_iwarp_stop(struct qed_hwfn *p_hwfn);
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_civoid qed_iwarp_resc_free(struct qed_hwfn *p_hwfn);
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_civoid qed_iwarp_init_devinfo(struct qed_hwfn *p_hwfn);
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_civoid qed_iwarp_init_hw(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt);
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ciint qed_iwarp_create_qp(struct qed_hwfn *p_hwfn,
1768c2ecf20Sopenharmony_ci			struct qed_rdma_qp *qp,
1778c2ecf20Sopenharmony_ci			struct qed_rdma_create_qp_out_params *out_params);
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ciint qed_iwarp_modify_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp,
1808c2ecf20Sopenharmony_ci			enum qed_iwarp_qp_state new_state, bool internal);
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ciint qed_iwarp_destroy_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp);
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ciint qed_iwarp_fw_destroy(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp);
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_civoid qed_iwarp_query_qp(struct qed_rdma_qp *qp,
1878c2ecf20Sopenharmony_ci			struct qed_rdma_query_qp_out_params *out_params);
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ciint
1908c2ecf20Sopenharmony_ciqed_iwarp_connect(void *rdma_cxt,
1918c2ecf20Sopenharmony_ci		  struct qed_iwarp_connect_in *iparams,
1928c2ecf20Sopenharmony_ci		  struct qed_iwarp_connect_out *oparams);
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ciint
1958c2ecf20Sopenharmony_ciqed_iwarp_create_listen(void *rdma_cxt,
1968c2ecf20Sopenharmony_ci			struct qed_iwarp_listen_in *iparams,
1978c2ecf20Sopenharmony_ci			struct qed_iwarp_listen_out *oparams);
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ciint qed_iwarp_accept(void *rdma_cxt, struct qed_iwarp_accept_in *iparams);
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ciint qed_iwarp_reject(void *rdma_cxt, struct qed_iwarp_reject_in *iparams);
2028c2ecf20Sopenharmony_ciint qed_iwarp_destroy_listen(void *rdma_cxt, void *handle);
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ciint qed_iwarp_send_rtr(void *rdma_cxt, struct qed_iwarp_send_rtr_in *iparams);
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_ci#endif
207