1316485Sdavidcs/* 2337517Sdavidcs * Copyright (c) 2017-2018 Cavium, Inc. 3316485Sdavidcs * All rights reserved. 4316485Sdavidcs * 5316485Sdavidcs * Redistribution and use in source and binary forms, with or without 6316485Sdavidcs * modification, are permitted provided that the following conditions 7316485Sdavidcs * are met: 8316485Sdavidcs * 9316485Sdavidcs * 1. Redistributions of source code must retain the above copyright 10316485Sdavidcs * notice, this list of conditions and the following disclaimer. 11316485Sdavidcs * 2. Redistributions in binary form must reproduce the above copyright 12316485Sdavidcs * notice, this list of conditions and the following disclaimer in the 13316485Sdavidcs * documentation and/or other materials provided with the distribution. 14316485Sdavidcs * 15316485Sdavidcs * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16316485Sdavidcs * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17316485Sdavidcs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18316485Sdavidcs * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19316485Sdavidcs * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20316485Sdavidcs * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21316485Sdavidcs * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22316485Sdavidcs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23316485Sdavidcs * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24316485Sdavidcs * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25316485Sdavidcs * POSSIBILITY OF SUCH DAMAGE. 26316485Sdavidcs * 27316485Sdavidcs * $FreeBSD: stable/11/sys/dev/qlnx/qlnxe/ecore_ll2_api.h 337517 2018-08-09 01:17:35Z davidcs $ 28316485Sdavidcs * 29316485Sdavidcs */ 30316485Sdavidcs 31316485Sdavidcs#ifndef __ECORE_LL2_API_H__ 32316485Sdavidcs#define __ECORE_LL2_API_H__ 33316485Sdavidcs 34316485Sdavidcs/* ECORE LL2 API: called by ECORE's upper level client */ 35316485Sdavidcs/* must be the asme as core_rx_conn_type */ 36337517Sdavidcs#ifndef __EXTRACT__LINUX__ 37316485Sdavidcs 38316485Sdavidcsenum ecore_ll2_conn_type { 39316485Sdavidcs ECORE_LL2_TYPE_FCOE /* FCoE L2 connection */, 40316485Sdavidcs ECORE_LL2_TYPE_ISCSI /* Iscsi L2 connection */, 41316485Sdavidcs ECORE_LL2_TYPE_TEST /* Eth TB test connection */, 42316485Sdavidcs ECORE_LL2_TYPE_OOO /* Iscsi OOO L2 connection */, 43316485Sdavidcs ECORE_LL2_TYPE_TOE /* toe L2 connection */, 44316485Sdavidcs ECORE_LL2_TYPE_ROCE /* RoCE L2 connection */, 45316485Sdavidcs ECORE_LL2_TYPE_IWARP, 46316485Sdavidcs MAX_ECORE_LL2_RX_CONN_TYPE 47316485Sdavidcs}; 48316485Sdavidcs 49316485Sdavidcsenum ecore_ll2_roce_flavor_type { 50316485Sdavidcs ECORE_LL2_ROCE, /* use this as default or d/c */ 51316485Sdavidcs ECORE_LL2_RROCE, 52316485Sdavidcs MAX_ECORE_LL2_ROCE_FLAVOR_TYPE 53316485Sdavidcs}; 54316485Sdavidcs 55316485Sdavidcsenum ecore_ll2_tx_dest 56316485Sdavidcs{ 57316485Sdavidcs ECORE_LL2_TX_DEST_NW /* Light L2 TX Destination to the Network */, 58316485Sdavidcs ECORE_LL2_TX_DEST_LB /* Light L2 TX Destination to the Loopback */, 59316485Sdavidcs ECORE_LL2_TX_DEST_DROP /* Light L2 Drop the TX packet */, 60316485Sdavidcs ECORE_LL2_TX_DEST_MAX 61316485Sdavidcs}; 62316485Sdavidcs 63316485Sdavidcsenum ecore_ll2_error_handle 64316485Sdavidcs{ 65316485Sdavidcs ECORE_LL2_DROP_PACKET /* If error occurs drop packet */, 66316485Sdavidcs ECORE_LL2_DO_NOTHING /* If error occurs do nothing */, 67316485Sdavidcs ECORE_LL2_ASSERT /* If error occurs assert */, 68316485Sdavidcs}; 69316485Sdavidcs 70316485Sdavidcsstruct ecore_ll2_stats { 71316485Sdavidcs u64 gsi_invalid_hdr; 72316485Sdavidcs u64 gsi_invalid_pkt_length; 73316485Sdavidcs u64 gsi_unsupported_pkt_typ; 74316485Sdavidcs u64 gsi_crcchksm_error; 75316485Sdavidcs 76316485Sdavidcs u64 packet_too_big_discard; 77316485Sdavidcs u64 no_buff_discard; 78316485Sdavidcs 79316485Sdavidcs u64 rcv_ucast_bytes; 80316485Sdavidcs u64 rcv_mcast_bytes; 81316485Sdavidcs u64 rcv_bcast_bytes; 82316485Sdavidcs u64 rcv_ucast_pkts; 83316485Sdavidcs u64 rcv_mcast_pkts; 84316485Sdavidcs u64 rcv_bcast_pkts; 85316485Sdavidcs 86316485Sdavidcs u64 sent_ucast_bytes; 87316485Sdavidcs u64 sent_mcast_bytes; 88316485Sdavidcs u64 sent_bcast_bytes; 89316485Sdavidcs u64 sent_ucast_pkts; 90316485Sdavidcs u64 sent_mcast_pkts; 91316485Sdavidcs u64 sent_bcast_pkts; 92316485Sdavidcs}; 93316485Sdavidcs 94316485Sdavidcsstruct ecore_ll2_comp_rx_data { 95316485Sdavidcs u8 connection_handle; 96316485Sdavidcs void *cookie; 97316485Sdavidcs dma_addr_t rx_buf_addr; 98316485Sdavidcs u16 parse_flags; 99316485Sdavidcs u16 err_flags; 100316485Sdavidcs u16 vlan; 101316485Sdavidcs bool b_last_packet; 102316485Sdavidcs 103316485Sdavidcs union { 104316485Sdavidcs u8 placement_offset; 105316485Sdavidcs u8 data_length_error; 106316485Sdavidcs } u; 107316485Sdavidcs union { 108316485Sdavidcs u16 packet_length; 109316485Sdavidcs u16 data_length; 110316485Sdavidcs } length; 111316485Sdavidcs 112316485Sdavidcs u32 opaque_data_0; /* src_mac_addr_hi */ 113316485Sdavidcs u32 opaque_data_1; /* src_mac_addr_lo */ 114316485Sdavidcs 115316485Sdavidcs /* GSI only */ 116337517Sdavidcs u32 src_qp; 117316485Sdavidcs u16 qp_id; 118316485Sdavidcs}; 119316485Sdavidcs 120316485Sdavidcstypedef 121316485Sdavidcsvoid (*ecore_ll2_complete_rx_packet_cb)(void *cxt, 122316485Sdavidcs struct ecore_ll2_comp_rx_data *data); 123316485Sdavidcs 124316485Sdavidcstypedef 125316485Sdavidcsvoid (*ecore_ll2_release_rx_packet_cb)(void *cxt, 126316485Sdavidcs u8 connection_handle, 127316485Sdavidcs void *cookie, 128316485Sdavidcs dma_addr_t rx_buf_addr, 129316485Sdavidcs bool b_last_packet); 130316485Sdavidcs 131316485Sdavidcstypedef 132316485Sdavidcsvoid (*ecore_ll2_complete_tx_packet_cb)(void *cxt, 133316485Sdavidcs u8 connection_handle, 134316485Sdavidcs void *cookie, 135316485Sdavidcs dma_addr_t first_frag_addr, 136316485Sdavidcs bool b_last_fragment, 137316485Sdavidcs bool b_last_packet); 138316485Sdavidcs 139316485Sdavidcstypedef 140316485Sdavidcsvoid (*ecore_ll2_release_tx_packet_cb)(void *cxt, 141316485Sdavidcs u8 connection_handle, 142316485Sdavidcs void *cookie, 143316485Sdavidcs dma_addr_t first_frag_addr, 144316485Sdavidcs bool b_last_fragment, 145316485Sdavidcs bool b_last_packet); 146316485Sdavidcs 147320164Sdavidcstypedef 148320164Sdavidcsvoid (*ecore_ll2_slowpath_cb)(void *cxt, 149320164Sdavidcs u8 connection_handle, 150320164Sdavidcs u32 opaque_data_0, 151320164Sdavidcs u32 opaque_data_1); 152320164Sdavidcs 153316485Sdavidcsstruct ecore_ll2_cbs { 154316485Sdavidcs ecore_ll2_complete_rx_packet_cb rx_comp_cb; 155316485Sdavidcs ecore_ll2_release_rx_packet_cb rx_release_cb; 156316485Sdavidcs ecore_ll2_complete_tx_packet_cb tx_comp_cb; 157316485Sdavidcs ecore_ll2_release_tx_packet_cb tx_release_cb; 158320164Sdavidcs ecore_ll2_slowpath_cb slowpath_cb; 159316485Sdavidcs void *cookie; 160316485Sdavidcs}; 161316485Sdavidcs 162320164Sdavidcsstruct ecore_ll2_acquire_data_inputs { 163316485Sdavidcs enum ecore_ll2_conn_type conn_type; 164316485Sdavidcs u16 mtu; /* Maximum bytes that can be placed on a BD*/ 165316485Sdavidcs u16 rx_num_desc; 166316485Sdavidcs 167316485Sdavidcs /* Relevant only for OOO connection if 0 OOO rx buffers=2*rx_num_desc */ 168316485Sdavidcs u16 rx_num_ooo_buffers; 169316485Sdavidcs u8 rx_drop_ttl0_flg; 170316485Sdavidcs 171316485Sdavidcs /* if set, 802.1q tags will be removed and copied to CQE */ 172316485Sdavidcs u8 rx_vlan_removal_en; 173316485Sdavidcs u16 tx_num_desc; 174316485Sdavidcs u8 tx_max_bds_per_packet; 175316485Sdavidcs u8 tx_tc; 176316485Sdavidcs enum ecore_ll2_tx_dest tx_dest; 177316485Sdavidcs enum ecore_ll2_error_handle ai_err_packet_too_big; 178316485Sdavidcs enum ecore_ll2_error_handle ai_err_no_buf; 179316485Sdavidcs u8 secondary_queue; 180316485Sdavidcs u8 gsi_enable; 181320164Sdavidcs}; 182316485Sdavidcs 183320164Sdavidcsstruct ecore_ll2_acquire_data { 184320164Sdavidcs struct ecore_ll2_acquire_data_inputs input; 185320164Sdavidcs const struct ecore_ll2_cbs *cbs; 186320164Sdavidcs 187316485Sdavidcs /* Output container for LL2 connection's handle */ 188316485Sdavidcs u8 *p_connection_handle; 189316485Sdavidcs}; 190337517Sdavidcs#endif 191316485Sdavidcs 192316485Sdavidcs/** 193316485Sdavidcs * @brief ecore_ll2_acquire_connection - allocate resources, 194316485Sdavidcs * starts rx & tx (if relevant) queues pair. Provides 195316485Sdavidcs * connecion handler as output parameter. 196316485Sdavidcs * 197316485Sdavidcs * 198316485Sdavidcs * @param p_hwfn 199316485Sdavidcs * @param data - describes connection parameters 200316485Sdavidcs * @return enum _ecore_status_t 201316485Sdavidcs */ 202316485Sdavidcsenum _ecore_status_t 203316485Sdavidcsecore_ll2_acquire_connection(void *cxt, 204316485Sdavidcs struct ecore_ll2_acquire_data *data); 205316485Sdavidcs 206316485Sdavidcs/** 207316485Sdavidcs * @brief ecore_ll2_establish_connection - start previously 208316485Sdavidcs * allocated LL2 queues pair 209316485Sdavidcs * 210316485Sdavidcs * @param p_hwfn 211316485Sdavidcs * @param p_ptt 212316485Sdavidcs * @param connection_handle LL2 connection's handle 213316485Sdavidcs * obtained from 214316485Sdavidcs * ecore_ll2_require_connection 215316485Sdavidcs * 216316485Sdavidcs * @return enum _ecore_status_t 217316485Sdavidcs */ 218316485Sdavidcsenum _ecore_status_t ecore_ll2_establish_connection(void *cxt, 219316485Sdavidcs u8 connection_handle); 220316485Sdavidcs 221316485Sdavidcs/** 222316485Sdavidcs * @brief ecore_ll2_post_rx_buffers - submit buffers to LL2 RxQ. 223316485Sdavidcs * 224316485Sdavidcs * @param p_hwfn 225316485Sdavidcs * @param connection_handle LL2 connection's handle 226316485Sdavidcs * obtained from 227316485Sdavidcs * ecore_ll2_require_connection 228316485Sdavidcs * @param addr rx (physical address) buffers to 229316485Sdavidcs * submit 230316485Sdavidcs * @param cookie 231316485Sdavidcs * @param notify_fw produce corresponding Rx BD 232316485Sdavidcs * immediately 233316485Sdavidcs * 234316485Sdavidcs * @return enum _ecore_status_t 235316485Sdavidcs */ 236316485Sdavidcsenum _ecore_status_t ecore_ll2_post_rx_buffer(void *cxt, 237316485Sdavidcs u8 connection_handle, 238316485Sdavidcs dma_addr_t addr, 239316485Sdavidcs u16 buf_len, 240316485Sdavidcs void *cookie, 241316485Sdavidcs u8 notify_fw); 242316485Sdavidcs 243337517Sdavidcs#ifndef __EXTRACT__LINUX__ 244316485Sdavidcsstruct ecore_ll2_tx_pkt_info { 245316485Sdavidcs u8 num_of_bds; 246316485Sdavidcs u16 vlan; 247316485Sdavidcs u8 bd_flags; 248316485Sdavidcs u16 l4_hdr_offset_w; /* from start of packet */ 249316485Sdavidcs enum ecore_ll2_tx_dest tx_dest; 250316485Sdavidcs enum ecore_ll2_roce_flavor_type ecore_roce_flavor; 251316485Sdavidcs dma_addr_t first_frag; 252316485Sdavidcs u16 first_frag_len; 253316485Sdavidcs bool enable_ip_cksum; 254316485Sdavidcs bool enable_l4_cksum; 255316485Sdavidcs bool calc_ip_len; 256316485Sdavidcs void *cookie; 257337517Sdavidcs bool remove_stag; 258316485Sdavidcs}; 259337517Sdavidcs#endif 260316485Sdavidcs 261316485Sdavidcs/** 262316485Sdavidcs * @brief ecore_ll2_prepare_tx_packet - request for start Tx BD 263316485Sdavidcs * to prepare Tx packet submission to FW. 264316485Sdavidcs * 265316485Sdavidcs * 266316485Sdavidcs * @param p_hwfn 267316485Sdavidcs * @param pkt - info regarding the tx packet 268316485Sdavidcs * @param notify_fw - issue doorbell to fw for this packet 269316485Sdavidcs * 270316485Sdavidcs * @return enum _ecore_status_t 271316485Sdavidcs */ 272316485Sdavidcsenum _ecore_status_t ecore_ll2_prepare_tx_packet( 273316485Sdavidcs void *cxt, 274316485Sdavidcs u8 connection_handle, 275316485Sdavidcs struct ecore_ll2_tx_pkt_info *pkt, 276316485Sdavidcs bool notify_fw); 277316485Sdavidcs 278316485Sdavidcs/** 279316485Sdavidcs * @brief ecore_ll2_release_connection - releases resources 280316485Sdavidcs * allocated for LL2 connection 281316485Sdavidcs * 282316485Sdavidcs * @param p_hwfn 283316485Sdavidcs * @param connection_handle LL2 connection's handle 284316485Sdavidcs * obtained from 285316485Sdavidcs * ecore_ll2_require_connection 286316485Sdavidcs */ 287316485Sdavidcsvoid ecore_ll2_release_connection(void *cxt, 288316485Sdavidcs u8 connection_handle); 289316485Sdavidcs 290316485Sdavidcs/** 291316485Sdavidcs * @brief ecore_ll2_set_fragment_of_tx_packet - provides 292316485Sdavidcs * fragments to fill Tx BD of BDs requested by 293316485Sdavidcs * ecore_ll2_prepare_tx_packet.. 294316485Sdavidcs * 295316485Sdavidcs * 296316485Sdavidcs * @param p_hwfn 297316485Sdavidcs * @param connection_handle LL2 connection's handle 298316485Sdavidcs * obtained from 299316485Sdavidcs * ecore_ll2_require_connection 300316485Sdavidcs * @param addr 301316485Sdavidcs * @param nbytes 302316485Sdavidcs * 303316485Sdavidcs * @return enum _ecore_status_t 304316485Sdavidcs */ 305316485Sdavidcsenum _ecore_status_t 306316485Sdavidcsecore_ll2_set_fragment_of_tx_packet(void *cxt, 307316485Sdavidcs u8 connection_handle, 308316485Sdavidcs dma_addr_t addr, 309316485Sdavidcs u16 nbytes); 310316485Sdavidcs 311316485Sdavidcs/** 312316485Sdavidcs * @brief ecore_ll2_terminate_connection - stops Tx/Rx queues 313316485Sdavidcs * 314316485Sdavidcs * 315316485Sdavidcs * @param p_hwfn 316316485Sdavidcs * @param connection_handle LL2 connection's handle 317316485Sdavidcs * obtained from 318316485Sdavidcs * ecore_ll2_require_connection 319316485Sdavidcs * 320316485Sdavidcs * @return enum _ecore_status_t 321316485Sdavidcs */ 322316485Sdavidcsenum _ecore_status_t ecore_ll2_terminate_connection(void *cxt, 323316485Sdavidcs u8 connection_handle); 324316485Sdavidcs 325337517Sdavidcsenum _ecore_status_t __ecore_ll2_get_stats(void *cxt, 326337517Sdavidcs u8 connection_handle, 327337517Sdavidcs struct ecore_ll2_stats *p_stats); 328337517Sdavidcs 329316485Sdavidcs/** 330316485Sdavidcs * @brief ecore_ll2_get_stats - get LL2 queue's statistics 331316485Sdavidcs * 332316485Sdavidcs * 333316485Sdavidcs * @param p_hwfn 334316485Sdavidcs * @param connection_handle LL2 connection's handle 335316485Sdavidcs * obtained from 336316485Sdavidcs * ecore_ll2_require_connection 337316485Sdavidcs * @param p_stats 338316485Sdavidcs * 339316485Sdavidcs * @return enum _ecore_status_t 340316485Sdavidcs */ 341316485Sdavidcsenum _ecore_status_t ecore_ll2_get_stats(void *cxt, 342316485Sdavidcs u8 connection_handle, 343337517Sdavidcs struct ecore_ll2_stats *p_stats); 344316485Sdavidcs 345316485Sdavidcs#endif 346