1 /* QLogic qed NIC Driver 2 * 3 * Copyright (c) 2015 QLogic Corporation 4 * 5 * This software is available under the terms of the GNU General Public License 6 * (GPL) Version 2, available from the file COPYING in the main directory of 7 * this source tree. 8 */ 9 10 #ifndef _QED_LL2_H 11 #define _QED_LL2_H 12 13 #include <linux/types.h> 14 #include <linux/kernel.h> 15 #include <linux/list.h> 16 #include <linux/mutex.h> 17 #include <linux/slab.h> 18 #include <linux/spinlock.h> 19 #include <linux/qed/qed_chain.h> 20 #include <linux/qed/qed_ll2_if.h> 21 #include "qed.h" 22 #include "qed_hsi.h" 23 #include "qed_sp.h" 24 25 #define QED_MAX_NUM_OF_LL2_CONNECTIONS (4) 26 27 enum qed_ll2_roce_flavor_type { 28 QED_LL2_ROCE, 29 QED_LL2_RROCE, 30 MAX_QED_LL2_ROCE_FLAVOR_TYPE 31 }; 32 33 enum qed_ll2_conn_type { 34 QED_LL2_TYPE_RESERVED, 35 QED_LL2_TYPE_ISCSI, 36 QED_LL2_TYPE_TEST, 37 QED_LL2_TYPE_ISCSI_OOO, 38 QED_LL2_TYPE_RESERVED2, 39 QED_LL2_TYPE_ROCE, 40 QED_LL2_TYPE_RESERVED3, 41 MAX_QED_LL2_RX_CONN_TYPE 42 }; 43 44 enum qed_ll2_tx_dest { 45 QED_LL2_TX_DEST_NW, /* Light L2 TX Destination to the Network */ 46 QED_LL2_TX_DEST_LB, /* Light L2 TX Destination to the Loopback */ 47 QED_LL2_TX_DEST_MAX 48 }; 49 50 struct qed_ll2_rx_packet { 51 struct list_head list_entry; 52 struct core_rx_bd_with_buff_len *rxq_bd; 53 dma_addr_t rx_buf_addr; 54 u16 buf_length; 55 void *cookie; 56 u8 placement_offset; 57 u16 parse_flags; 58 u16 packet_length; 59 u16 vlan; 60 u32 opaque_data[2]; 61 }; 62 63 struct qed_ll2_tx_packet { 64 struct list_head list_entry; 65 u16 bd_used; 66 u16 vlan; 67 u16 l4_hdr_offset_w; 68 u8 bd_flags; 69 bool notify_fw; 70 void *cookie; 71 72 struct { 73 struct core_tx_bd *txq_bd; 74 dma_addr_t tx_frag; 75 u16 frag_len; 76 } bds_set[ETH_TX_MAX_BDS_PER_NON_LSO_PACKET]; 77 }; 78 79 struct qed_ll2_rx_queue { 80 /* Lock protecting the Rx queue manipulation */ 81 spinlock_t lock; 82 struct qed_chain rxq_chain; 83 struct qed_chain rcq_chain; 84 u8 rx_sb_index; 85 bool b_cb_registred; 86 __le16 *p_fw_cons; 87 struct list_head active_descq; 88 struct list_head free_descq; 89 struct list_head posting_descq; 90 struct qed_ll2_rx_packet *descq_array; 91 void __iomem *set_prod_addr; 92 }; 93 94 struct qed_ll2_tx_queue { 95 /* Lock protecting the Tx queue manipulation */ 96 spinlock_t lock; 97 struct qed_chain txq_chain; 98 u8 tx_sb_index; 99 bool b_cb_registred; 100 __le16 *p_fw_cons; 101 struct list_head active_descq; 102 struct list_head free_descq; 103 struct list_head sending_descq; 104 struct qed_ll2_tx_packet *descq_array; 105 struct qed_ll2_tx_packet *cur_send_packet; 106 struct qed_ll2_tx_packet cur_completing_packet; 107 u16 cur_completing_bd_idx; 108 void __iomem *doorbell_addr; 109 u16 bds_idx; 110 u16 cur_send_frag_num; 111 u16 cur_completing_frag_num; 112 bool b_completing_packet; 113 }; 114 115 struct qed_ll2_conn { 116 enum qed_ll2_conn_type conn_type; 117 u16 mtu; 118 u8 rx_drop_ttl0_flg; 119 u8 rx_vlan_removal_en; 120 u8 tx_tc; 121 enum core_tx_dest tx_dest; 122 enum core_error_handle ai_err_packet_too_big; 123 enum core_error_handle ai_err_no_buf; 124 u8 gsi_enable; 125 }; 126 127 struct qed_ll2_info { 128 /* Lock protecting the state of LL2 */ 129 struct mutex mutex; 130 struct qed_ll2_conn conn; 131 u32 cid; 132 u8 my_id; 133 u8 queue_id; 134 u8 tx_stats_id; 135 bool b_active; 136 u8 tx_stats_en; 137 struct qed_ll2_rx_queue rx_queue; 138 struct qed_ll2_tx_queue tx_queue; 139 }; 140 141 /** 142 * @brief qed_ll2_acquire_connection - allocate resources, 143 * starts rx & tx (if relevant) queues pair. Provides 144 * connecion handler as output parameter. 145 * 146 * @param p_hwfn 147 * @param p_params Contain various configuration properties 148 * @param rx_num_desc 149 * @param tx_num_desc 150 * 151 * @param p_connection_handle Output container for LL2 connection's handle 152 * 153 * @return 0 on success, failure otherwise 154 */ 155 int qed_ll2_acquire_connection(struct qed_hwfn *p_hwfn, 156 struct qed_ll2_conn *p_params, 157 u16 rx_num_desc, 158 u16 tx_num_desc, 159 u8 *p_connection_handle); 160 161 /** 162 * @brief qed_ll2_establish_connection - start previously 163 * allocated LL2 queues pair 164 * 165 * @param p_hwfn 166 * @param p_ptt 167 * @param connection_handle LL2 connection's handle obtained from 168 * qed_ll2_require_connection 169 * 170 * @return 0 on success, failure otherwise 171 */ 172 int qed_ll2_establish_connection(struct qed_hwfn *p_hwfn, u8 connection_handle); 173 174 /** 175 * @brief qed_ll2_post_rx_buffers - submit buffers to LL2 Rx queue. 176 * 177 * @param p_hwfn 178 * @param connection_handle LL2 connection's handle obtained from 179 * qed_ll2_require_connection 180 * @param addr rx (physical address) buffers to submit 181 * @param cookie 182 * @param notify_fw produce corresponding Rx BD immediately 183 * 184 * @return 0 on success, failure otherwise 185 */ 186 int qed_ll2_post_rx_buffer(struct qed_hwfn *p_hwfn, 187 u8 connection_handle, 188 dma_addr_t addr, 189 u16 buf_len, void *cookie, u8 notify_fw); 190 191 /** 192 * @brief qed_ll2_prepare_tx_packet - request for start Tx BD 193 * to prepare Tx packet submission to FW. 194 * 195 * @param p_hwfn 196 * @param connection_handle LL2 connection's handle obtained from 197 * qed_ll2_require_connection 198 * @param num_of_bds a number of requested BD equals a number of 199 * fragments in Tx packet 200 * @param vlan VLAN to insert to packet (if insertion set) 201 * @param bd_flags 202 * @param l4_hdr_offset_w L4 Header Offset from start of packet 203 * (in words). This is needed if both l4_csum 204 * and ipv6_ext are set 205 * @param e_tx_dest indicates if the packet is to be transmitted via 206 * loopback or to the network 207 * @param first_frag 208 * @param first_frag_len 209 * @param cookie 210 * 211 * @param notify_fw 212 * 213 * @return 0 on success, failure otherwise 214 */ 215 int qed_ll2_prepare_tx_packet(struct qed_hwfn *p_hwfn, 216 u8 connection_handle, 217 u8 num_of_bds, 218 u16 vlan, 219 u8 bd_flags, 220 u16 l4_hdr_offset_w, 221 enum qed_ll2_tx_dest e_tx_dest, 222 enum qed_ll2_roce_flavor_type qed_roce_flavor, 223 dma_addr_t first_frag, 224 u16 first_frag_len, void *cookie, u8 notify_fw); 225 226 /** 227 * @brief qed_ll2_release_connection - releases resources 228 * allocated for LL2 connection 229 * 230 * @param p_hwfn 231 * @param connection_handle LL2 connection's handle obtained from 232 * qed_ll2_require_connection 233 */ 234 void qed_ll2_release_connection(struct qed_hwfn *p_hwfn, u8 connection_handle); 235 236 /** 237 * @brief qed_ll2_set_fragment_of_tx_packet - provides fragments to fill 238 * Tx BD of BDs requested by 239 * qed_ll2_prepare_tx_packet 240 * 241 * @param p_hwfn 242 * @param connection_handle LL2 connection's handle 243 * obtained from 244 * qed_ll2_require_connection 245 * @param addr 246 * @param nbytes 247 * 248 * @return 0 on success, failure otherwise 249 */ 250 int qed_ll2_set_fragment_of_tx_packet(struct qed_hwfn *p_hwfn, 251 u8 connection_handle, 252 dma_addr_t addr, u16 nbytes); 253 254 /** 255 * @brief qed_ll2_terminate_connection - stops Tx/Rx queues 256 * 257 * 258 * @param p_hwfn 259 * @param connection_handle LL2 connection's handle 260 * obtained from 261 * qed_ll2_require_connection 262 * 263 * @return 0 on success, failure otherwise 264 */ 265 int qed_ll2_terminate_connection(struct qed_hwfn *p_hwfn, u8 connection_handle); 266 267 /** 268 * @brief qed_ll2_get_stats - get LL2 queue's statistics 269 * 270 * 271 * @param p_hwfn 272 * @param connection_handle LL2 connection's handle obtained from 273 * qed_ll2_require_connection 274 * @param p_stats 275 * 276 * @return 0 on success, failure otherwise 277 */ 278 int qed_ll2_get_stats(struct qed_hwfn *p_hwfn, 279 u8 connection_handle, struct qed_ll2_stats *p_stats); 280 281 /** 282 * @brief qed_ll2_alloc - Allocates LL2 connections set 283 * 284 * @param p_hwfn 285 * 286 * @return pointer to alocated qed_ll2_info or NULL 287 */ 288 struct qed_ll2_info *qed_ll2_alloc(struct qed_hwfn *p_hwfn); 289 290 /** 291 * @brief qed_ll2_setup - Inits LL2 connections set 292 * 293 * @param p_hwfn 294 * @param p_ll2_connections 295 * 296 */ 297 void qed_ll2_setup(struct qed_hwfn *p_hwfn, 298 struct qed_ll2_info *p_ll2_connections); 299 300 /** 301 * @brief qed_ll2_free - Releases LL2 connections set 302 * 303 * @param p_hwfn 304 * @param p_ll2_connections 305 * 306 */ 307 void qed_ll2_free(struct qed_hwfn *p_hwfn, 308 struct qed_ll2_info *p_ll2_connections); 309 #endif 310