brintos

brintos / linux-shallow public Read only

0
0
Text · 5.5 KiB · c3872cd Raw
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