1336695Sdavidcs/* 2336695Sdavidcs * Copyright (c) 2018-2019 Cavium, Inc. 3336695Sdavidcs * All rights reserved. 4336695Sdavidcs * 5336695Sdavidcs * Redistribution and use in source and binary forms, with or without 6336695Sdavidcs * modification, are permitted provided that the following conditions 7336695Sdavidcs * are met: 8336695Sdavidcs * 9336695Sdavidcs * 1. Redistributions of source code must retain the above copyright 10336695Sdavidcs * notice, this list of conditions and the following disclaimer. 11336695Sdavidcs * 2. Redistributions in binary form must reproduce the above copyright 12336695Sdavidcs * notice, this list of conditions and the following disclaimer in the 13336695Sdavidcs * documentation and/or other materials provided with the distribution. 14336695Sdavidcs * 15336695Sdavidcs * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16336695Sdavidcs * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17336695Sdavidcs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18336695Sdavidcs * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19336695Sdavidcs * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20336695Sdavidcs * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21336695Sdavidcs * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22336695Sdavidcs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23336695Sdavidcs * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24336695Sdavidcs * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25336695Sdavidcs * POSSIBILITY OF SUCH DAMAGE. 26336695Sdavidcs * 27336695Sdavidcs * $FreeBSD: stable/11/sys/dev/qlnx/qlnxe/ecore_iwarp.h 337517 2018-08-09 01:17:35Z davidcs $ 28336695Sdavidcs */ 29336695Sdavidcs 30336695Sdavidcs#ifndef __ECORE_IWARP_H__ 31336695Sdavidcs#define __ECORE_IWARP_H__ 32336695Sdavidcs 33336695Sdavidcsenum ecore_iwarp_qp_state { 34336695Sdavidcs ECORE_IWARP_QP_STATE_IDLE, 35336695Sdavidcs ECORE_IWARP_QP_STATE_RTS, 36336695Sdavidcs ECORE_IWARP_QP_STATE_TERMINATE, 37336695Sdavidcs ECORE_IWARP_QP_STATE_CLOSING, 38336695Sdavidcs ECORE_IWARP_QP_STATE_ERROR, 39336695Sdavidcs}; 40336695Sdavidcs 41336695Sdavidcsenum ecore_iwarp_listener_state { 42336695Sdavidcs ECORE_IWARP_LISTENER_STATE_ACTIVE, 43336695Sdavidcs ECORE_IWARP_LISTENER_STATE_UNPAUSE, 44336695Sdavidcs ECORE_IWARP_LISTENER_STATE_PAUSE, 45336695Sdavidcs ECORE_IWARP_LISTENER_STATE_DESTROYING, 46336695Sdavidcs}; 47336695Sdavidcs 48336695Sdavidcsenum ecore_iwarp_qp_state 49336695Sdavidcsecore_roce2iwarp_state(enum ecore_roce_qp_state state); 50336695Sdavidcs 51336695Sdavidcs#ifdef CONFIG_ECORE_IWARP 52336695Sdavidcs 53336695Sdavidcs#define ECORE_IWARP_PREALLOC_CNT ECORE_IWARP_MAX_LIS_BACKLOG 54336695Sdavidcs 55336695Sdavidcs#define ECORE_IWARP_LL2_SYN_TX_SIZE (128) 56336695Sdavidcs#define ECORE_IWARP_LL2_SYN_RX_SIZE (256) 57336695Sdavidcs#define ECORE_IWARP_MAX_SYN_PKT_SIZE (128) 58336695Sdavidcs 59336695Sdavidcs#define ECORE_IWARP_LL2_OOO_DEF_TX_SIZE (256) 60336695Sdavidcs#define ECORE_MAX_OOO (16) 61336695Sdavidcs#define ECORE_IWARP_LL2_OOO_MAX_RX_SIZE (16384) 62336695Sdavidcs 63336695Sdavidcs#define ECORE_IWARP_HANDLE_INVAL (0xff) 64336695Sdavidcs 65336695Sdavidcsstruct ecore_iwarp_ll2_buff { 66336695Sdavidcs struct ecore_iwarp_ll2_buff *piggy_buf; 67336695Sdavidcs void *data; 68336695Sdavidcs dma_addr_t data_phys_addr; 69336695Sdavidcs u32 buff_size; 70336695Sdavidcs}; 71336695Sdavidcs 72336695Sdavidcsstruct ecore_iwarp_ll2_mpa_buf { 73336695Sdavidcs osal_list_entry_t list_entry; 74336695Sdavidcs struct ecore_iwarp_ll2_buff *ll2_buf; 75336695Sdavidcs struct unaligned_opaque_data data; 76336695Sdavidcs u16 tcp_payload_len; 77336695Sdavidcs u8 placement_offset; 78336695Sdavidcs}; 79336695Sdavidcs 80336695Sdavidcs/* In some cases a fpdu will arrive with only one byte of the header, in this 81336695Sdavidcs * case the fpdu_length will be partial ( contain only higher byte and 82336695Sdavidcs * incomplete bytes will contain the invalid value 83336695Sdavidcs */ 84336695Sdavidcs#define ECORE_IWARP_INVALID_INCOMPLETE_BYTES 0xffff 85336695Sdavidcs 86336695Sdavidcsstruct ecore_iwarp_fpdu { 87336695Sdavidcs struct ecore_iwarp_ll2_buff *mpa_buf; 88336695Sdavidcs dma_addr_t pkt_hdr; 89336695Sdavidcs u8 pkt_hdr_size; 90336695Sdavidcs dma_addr_t mpa_frag; 91336695Sdavidcs void *mpa_frag_virt; 92336695Sdavidcs u16 mpa_frag_len; 93336695Sdavidcs u16 fpdu_length; 94336695Sdavidcs u16 incomplete_bytes; 95336695Sdavidcs}; 96336695Sdavidcs 97336695Sdavidcsstruct ecore_iwarp_info { 98336695Sdavidcs osal_list_t listen_list; /* ecore_iwarp_listener */ 99336695Sdavidcs osal_list_t ep_list; /* ecore_iwarp_ep */ 100336695Sdavidcs osal_list_t ep_free_list;/* pre-allocated ep's */ 101336695Sdavidcs osal_list_t mpa_buf_list;/* list of mpa_bufs */ 102336695Sdavidcs osal_list_t mpa_buf_pending_list; 103336695Sdavidcs osal_spinlock_t iw_lock; 104336695Sdavidcs osal_spinlock_t qp_lock; /* for teardown races */ 105336695Sdavidcs struct iwarp_rxmit_stats_drv stats; 106336695Sdavidcs u32 rcv_wnd_scale; 107336695Sdavidcs u16 rcv_wnd_size; 108336695Sdavidcs u16 max_mtu; 109336695Sdavidcs u16 num_ooo_rx_bufs; 110336695Sdavidcs u8 mac_addr[ETH_ALEN]; 111336695Sdavidcs u8 crc_needed; 112336695Sdavidcs u8 tcp_flags; 113336695Sdavidcs u8 ll2_syn_handle; 114336695Sdavidcs u8 ll2_ooo_handle; 115336695Sdavidcs u8 ll2_mpa_handle; 116336695Sdavidcs u8 peer2peer; 117336695Sdavidcs u8 _pad; 118336695Sdavidcs enum mpa_negotiation_mode mpa_rev; 119336695Sdavidcs enum mpa_rtr_type rtr_type; 120336695Sdavidcs struct ecore_iwarp_fpdu *partial_fpdus; 121336695Sdavidcs struct ecore_iwarp_ll2_mpa_buf *mpa_bufs; 122336695Sdavidcs u8 *mpa_intermediate_buf; 123336695Sdavidcs u16 max_num_partial_fpdus; 124336695Sdavidcs 125336695Sdavidcs /* MPA statistics */ 126336695Sdavidcs u64 unalign_rx_comp; 127336695Sdavidcs}; 128336695Sdavidcs 129336695Sdavidcsenum ecore_iwarp_ep_state { 130336695Sdavidcs ECORE_IWARP_EP_INIT, 131336695Sdavidcs ECORE_IWARP_EP_MPA_REQ_RCVD, 132336695Sdavidcs ECORE_IWARP_EP_MPA_OFFLOADED, 133336695Sdavidcs ECORE_IWARP_EP_ESTABLISHED, 134336695Sdavidcs ECORE_IWARP_EP_CLOSED, 135336695Sdavidcs ECORE_IWARP_EP_ABORTING 136336695Sdavidcs}; 137336695Sdavidcs 138336695Sdavidcsunion async_output { 139336695Sdavidcs struct iwarp_eqe_data_mpa_async_completion mpa_response; 140336695Sdavidcs struct iwarp_eqe_data_tcp_async_completion mpa_request; 141336695Sdavidcs}; 142336695Sdavidcs 143336695Sdavidcs#define ECORE_MAX_PRIV_DATA_LEN (512) 144336695Sdavidcsstruct ecore_iwarp_ep_memory { 145336695Sdavidcs u8 in_pdata[ECORE_MAX_PRIV_DATA_LEN]; 146336695Sdavidcs u8 out_pdata[ECORE_MAX_PRIV_DATA_LEN]; 147336695Sdavidcs union async_output async_output; 148336695Sdavidcs}; 149336695Sdavidcs 150336695Sdavidcs/* Endpoint structure represents a TCP connection. This connection can be 151336695Sdavidcs * associated with a QP or not (in which case QP==NULL) 152336695Sdavidcs */ 153336695Sdavidcsstruct ecore_iwarp_ep { 154336695Sdavidcs osal_list_entry_t list_entry; 155336695Sdavidcs int sig; 156336695Sdavidcs struct ecore_rdma_qp *qp; 157336695Sdavidcs enum ecore_iwarp_ep_state state; 158336695Sdavidcs 159336695Sdavidcs /* This contains entire buffer required for ep memories. This is the 160336695Sdavidcs * only one actually allocated and freed. The rest are pointers into 161336695Sdavidcs * this buffer 162336695Sdavidcs */ 163336695Sdavidcs struct ecore_iwarp_ep_memory *ep_buffer_virt; 164336695Sdavidcs dma_addr_t ep_buffer_phys; 165336695Sdavidcs 166336695Sdavidcs struct ecore_iwarp_cm_info cm_info; 167336695Sdavidcs struct ecore_iwarp_listener *listener; 168336695Sdavidcs enum tcp_connect_mode connect_mode; 169336695Sdavidcs enum mpa_rtr_type rtr_type; 170336695Sdavidcs enum mpa_negotiation_mode mpa_rev; 171336695Sdavidcs u32 tcp_cid; 172336695Sdavidcs u32 cid; 173336695Sdavidcs u8 remote_mac_addr[6]; 174336695Sdavidcs u8 local_mac_addr[6]; 175336695Sdavidcs u16 mss; 176336695Sdavidcs bool mpa_reply_processed; 177336695Sdavidcs 178336695Sdavidcs /* The event_cb function is called for asynchrounous events associated 179336695Sdavidcs * with the ep. It is initialized at different entry points depending 180336695Sdavidcs * on whether the ep is the tcp connection active side or passive side 181336695Sdavidcs * The cb_context is passed to the event_cb function. 182336695Sdavidcs */ 183336695Sdavidcs iwarp_event_handler event_cb; 184336695Sdavidcs void *cb_context; 185336695Sdavidcs 186336695Sdavidcs /* For Passive side - syn packet related data */ 187336695Sdavidcs struct ecore_iwarp_ll2_buff *syn; 188336695Sdavidcs u16 syn_ip_payload_length; 189336695Sdavidcs dma_addr_t syn_phy_addr; 190336695Sdavidcs}; 191336695Sdavidcs 192336695Sdavidcsstruct ecore_iwarp_listener { 193336695Sdavidcs osal_list_entry_t list_entry; 194336695Sdavidcs 195336695Sdavidcs /* The event_cb function is called for connection requests. 196336695Sdavidcs * The cb_context is passed to the event_cb function. 197336695Sdavidcs */ 198336695Sdavidcs iwarp_event_handler event_cb; 199336695Sdavidcs void *cb_context; 200336695Sdavidcs osal_list_t ep_list; 201336695Sdavidcs osal_spinlock_t lock; 202336695Sdavidcs u32 max_backlog; 203336695Sdavidcs u8 ip_version; 204336695Sdavidcs u32 ip_addr[4]; 205336695Sdavidcs u16 port; 206336695Sdavidcs u16 vlan; 207336695Sdavidcs bool drop; 208336695Sdavidcs bool done; 209336695Sdavidcs enum ecore_iwarp_listener_state state; 210336695Sdavidcs}; 211336695Sdavidcs 212336695Sdavidcsenum _ecore_status_t 213336695Sdavidcsecore_iwarp_alloc(struct ecore_hwfn *p_hwfn); 214336695Sdavidcs 215336695Sdavidcsenum _ecore_status_t 216336695Sdavidcsecore_iwarp_setup(struct ecore_hwfn *p_hwfn, 217336695Sdavidcs struct ecore_rdma_start_in_params *params); 218336695Sdavidcs 219336695Sdavidcsvoid 220336695Sdavidcsecore_iwarp_init_fw_ramrod(struct ecore_hwfn *p_hwfn, 221336695Sdavidcs struct iwarp_init_func_ramrod_data *p_ramrod); 222336695Sdavidcs 223336695Sdavidcsenum _ecore_status_t 224336695Sdavidcsecore_iwarp_stop(struct ecore_hwfn *p_hwfn); 225336695Sdavidcs 226336695Sdavidcsvoid 227336695Sdavidcsecore_iwarp_resc_free(struct ecore_hwfn *p_hwfn); 228336695Sdavidcs 229336695Sdavidcsvoid 230336695Sdavidcsecore_iwarp_init_devinfo(struct ecore_hwfn *p_hwfn); 231336695Sdavidcs 232336695Sdavidcsenum _ecore_status_t 233336695Sdavidcsecore_iwarp_init_hw(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt); 234336695Sdavidcs 235336695Sdavidcsenum _ecore_status_t 236336695Sdavidcsecore_iwarp_create_qp(struct ecore_hwfn *p_hwfn, 237336695Sdavidcs struct ecore_rdma_qp *qp, 238336695Sdavidcs struct ecore_rdma_create_qp_out_params *out_params); 239336695Sdavidcs 240336695Sdavidcsenum _ecore_status_t 241336695Sdavidcsecore_iwarp_modify_qp(struct ecore_hwfn *p_hwfn, 242336695Sdavidcs struct ecore_rdma_qp *qp, 243336695Sdavidcs enum ecore_iwarp_qp_state new_state, 244336695Sdavidcs bool internal); 245336695Sdavidcs 246336695Sdavidcsenum _ecore_status_t 247336695Sdavidcsecore_iwarp_destroy_qp(struct ecore_hwfn *p_hwfn, 248336695Sdavidcs struct ecore_rdma_qp *qp); 249336695Sdavidcs 250336695Sdavidcsenum _ecore_status_t 251336695Sdavidcsecore_iwarp_fw_destroy(struct ecore_hwfn *p_hwfn, 252336695Sdavidcs struct ecore_rdma_qp *qp); 253336695Sdavidcs 254336695Sdavidcsenum _ecore_status_t 255336695Sdavidcsecore_iwarp_query_qp(struct ecore_rdma_qp *qp, 256336695Sdavidcs struct ecore_rdma_query_qp_out_params *out_params); 257336695Sdavidcs 258336695Sdavidcs#else 259336695Sdavidcs 260336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t 261336695Sdavidcsecore_iwarp_alloc(struct ecore_hwfn OSAL_UNUSED *p_hwfn) 262336695Sdavidcs{ 263336695Sdavidcs return ECORE_SUCCESS; 264336695Sdavidcs} 265336695Sdavidcs 266336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t 267336695Sdavidcsecore_iwarp_setup(struct ecore_hwfn OSAL_UNUSED *p_hwfn, 268336695Sdavidcs struct ecore_rdma_start_in_params OSAL_UNUSED *params) 269336695Sdavidcs{ 270336695Sdavidcs return ECORE_SUCCESS; 271336695Sdavidcs} 272336695Sdavidcs 273336695Sdavidcsstatic OSAL_INLINE void 274336695Sdavidcsecore_iwarp_init_fw_ramrod(struct ecore_hwfn OSAL_UNUSED *p_hwfn, 275336695Sdavidcs struct iwarp_init_func_ramrod_data OSAL_UNUSED *p_ramrod) 276336695Sdavidcs{ 277336695Sdavidcs} 278336695Sdavidcs 279336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t 280336695Sdavidcsecore_iwarp_stop(struct ecore_hwfn OSAL_UNUSED *p_hwfn) 281336695Sdavidcs{ 282336695Sdavidcs return ECORE_SUCCESS; 283336695Sdavidcs} 284336695Sdavidcs 285336695Sdavidcsstatic OSAL_INLINE void 286336695Sdavidcsecore_iwarp_resc_free(struct ecore_hwfn OSAL_UNUSED *p_hwfn) 287336695Sdavidcs{ 288336695Sdavidcs} 289336695Sdavidcs 290336695Sdavidcsstatic OSAL_INLINE void 291336695Sdavidcsecore_iwarp_init_devinfo(struct ecore_hwfn OSAL_UNUSED *p_hwfn) 292336695Sdavidcs{ 293336695Sdavidcs} 294336695Sdavidcs 295336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t 296336695Sdavidcsecore_iwarp_init_hw(struct ecore_hwfn OSAL_UNUSED *p_hwfn, 297336695Sdavidcs struct ecore_ptt OSAL_UNUSED *p_ptt) 298336695Sdavidcs{ 299336695Sdavidcs return ECORE_SUCCESS; 300336695Sdavidcs} 301336695Sdavidcs 302336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t 303336695Sdavidcsecore_iwarp_create_qp(struct ecore_hwfn OSAL_UNUSED *p_hwfn, 304336695Sdavidcs struct ecore_rdma_qp OSAL_UNUSED *qp, 305336695Sdavidcs struct ecore_rdma_create_qp_out_params OSAL_UNUSED *out_params) 306336695Sdavidcs{ 307336695Sdavidcs return ECORE_SUCCESS; 308336695Sdavidcs} 309336695Sdavidcs 310336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t 311336695Sdavidcsecore_iwarp_modify_qp(struct ecore_hwfn OSAL_UNUSED *p_hwfn, 312336695Sdavidcs struct ecore_rdma_qp OSAL_UNUSED *qp, 313336695Sdavidcs enum ecore_iwarp_qp_state OSAL_UNUSED new_state, 314336695Sdavidcs bool OSAL_UNUSED internal) 315336695Sdavidcs{ 316336695Sdavidcs return ECORE_SUCCESS; 317336695Sdavidcs} 318336695Sdavidcs 319336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t 320336695Sdavidcsecore_iwarp_destroy_qp(struct ecore_hwfn OSAL_UNUSED *p_hwfn, 321336695Sdavidcs struct ecore_rdma_qp OSAL_UNUSED *qp) 322336695Sdavidcs{ 323336695Sdavidcs return ECORE_SUCCESS; 324336695Sdavidcs} 325336695Sdavidcs 326336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t 327336695Sdavidcsecore_iwarp_fw_destroy(struct ecore_hwfn OSAL_UNUSED *p_hwfn, 328336695Sdavidcs struct ecore_rdma_qp OSAL_UNUSED *qp) 329336695Sdavidcs{ 330336695Sdavidcs return ECORE_SUCCESS; 331336695Sdavidcs} 332336695Sdavidcs 333336695Sdavidcsstatic OSAL_INLINE enum _ecore_status_t 334336695Sdavidcsecore_iwarp_query_qp(struct ecore_rdma_qp OSAL_UNUSED *qp, 335336695Sdavidcs struct ecore_rdma_query_qp_out_params OSAL_UNUSED *out_params) 336336695Sdavidcs{ 337336695Sdavidcs return ECORE_SUCCESS; 338336695Sdavidcs} 339336695Sdavidcs 340336695Sdavidcs#endif 341336695Sdavidcs#endif 342