1 /* QLogic qed NIC Driver 2 * Copyright (c) 2015-2017 QLogic Corporation 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions are met: 13 * 14 * - Redistributions of source code must retain the above 15 * copyright notice, this list of conditions and the following 16 * disclaimer. 17 * 18 * - Redistributions in binary form must reproduce the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer in the documentation and /or other materials 21 * provided with the distribution. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 * SOFTWARE. 31 */ 32 33 #ifndef _QED_LL2_H 34 #define _QED_LL2_H 35 36 #include <linux/types.h> 37 #include <linux/kernel.h> 38 #include <linux/list.h> 39 #include <linux/mutex.h> 40 #include <linux/slab.h> 41 #include <linux/spinlock.h> 42 #include <linux/qed/qed_chain.h> 43 #include <linux/qed/qed_ll2_if.h> 44 #include "qed.h" 45 #include "qed_hsi.h" 46 #include "qed_sp.h" 47 48 #define QED_MAX_NUM_OF_LL2_CONNECTIONS (4) 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 bool notify_fw; 67 void *cookie; 68 /* Flexible Array of bds_set determined by max_bds_per_packet */ 69 struct { 70 struct core_tx_bd *txq_bd; 71 dma_addr_t tx_frag; 72 u16 frag_len; 73 } bds_set[1]; 74 }; 75 76 struct qed_ll2_rx_queue { 77 /* Lock protecting the Rx queue manipulation */ 78 spinlock_t lock; 79 struct qed_chain rxq_chain; 80 struct qed_chain rcq_chain; 81 u8 rx_sb_index; 82 bool b_cb_registered; 83 __le16 *p_fw_cons; 84 struct list_head active_descq; 85 struct list_head free_descq; 86 struct list_head posting_descq; 87 struct qed_ll2_rx_packet *descq_array; 88 void __iomem *set_prod_addr; 89 }; 90 91 struct qed_ll2_tx_queue { 92 /* Lock protecting the Tx queue manipulation */ 93 spinlock_t lock; 94 struct qed_chain txq_chain; 95 u8 tx_sb_index; 96 bool b_cb_registered; 97 __le16 *p_fw_cons; 98 struct list_head active_descq; 99 struct list_head free_descq; 100 struct list_head sending_descq; 101 void *descq_mem; /* memory for variable sized qed_ll2_tx_packet*/ 102 struct qed_ll2_tx_packet *cur_send_packet; 103 struct qed_ll2_tx_packet cur_completing_packet; 104 u16 cur_completing_bd_idx; 105 void __iomem *doorbell_addr; 106 struct core_db_data db_msg; 107 u16 bds_idx; 108 u16 cur_send_frag_num; 109 u16 cur_completing_frag_num; 110 bool b_completing_packet; 111 }; 112 113 struct qed_ll2_info { 114 /* Lock protecting the state of LL2 */ 115 struct mutex mutex; 116 117 struct qed_ll2_acquire_data_inputs input; 118 u32 cid; 119 u8 my_id; 120 u8 queue_id; 121 u8 tx_stats_id; 122 bool b_active; 123 enum core_tx_dest tx_dest; 124 u8 tx_stats_en; 125 bool main_func_queue; 126 struct qed_ll2_rx_queue rx_queue; 127 struct qed_ll2_tx_queue tx_queue; 128 struct qed_ll2_cbs cbs; 129 }; 130 131 /** 132 * @brief qed_ll2_acquire_connection - allocate resources, 133 * starts rx & tx (if relevant) queues pair. Provides 134 * connecion handler as output parameter. 135 * 136 * 137 * @param cxt - pointer to the hw-function [opaque to some] 138 * @param data - describes connection parameters 139 * @return int 140 */ 141 int qed_ll2_acquire_connection(void *cxt, struct qed_ll2_acquire_data *data); 142 143 /** 144 * @brief qed_ll2_establish_connection - start previously 145 * allocated LL2 queues pair 146 * 147 * @param cxt - pointer to the hw-function [opaque to some] 148 * @param p_ptt 149 * @param connection_handle LL2 connection's handle obtained from 150 * qed_ll2_require_connection 151 * 152 * @return 0 on success, failure otherwise 153 */ 154 int qed_ll2_establish_connection(void *cxt, u8 connection_handle); 155 156 /** 157 * @brief qed_ll2_post_rx_buffers - submit buffers to LL2 Rx queue. 158 * 159 * @param cxt - pointer to the hw-function [opaque to some] 160 * @param connection_handle LL2 connection's handle obtained from 161 * qed_ll2_require_connection 162 * @param addr rx (physical address) buffers to submit 163 * @param cookie 164 * @param notify_fw produce corresponding Rx BD immediately 165 * 166 * @return 0 on success, failure otherwise 167 */ 168 int qed_ll2_post_rx_buffer(void *cxt, 169 u8 connection_handle, 170 dma_addr_t addr, 171 u16 buf_len, void *cookie, u8 notify_fw); 172 173 /** 174 * @brief qed_ll2_prepare_tx_packet - request for start Tx BD 175 * to prepare Tx packet submission to FW. 176 * 177 * @param cxt - pointer to the hw-function [opaque to some] 178 * @param connection_handle 179 * @param pkt - info regarding the tx packet 180 * @param notify_fw - issue doorbell to fw for this packet 181 * 182 * @return 0 on success, failure otherwise 183 */ 184 int qed_ll2_prepare_tx_packet(void *cxt, 185 u8 connection_handle, 186 struct qed_ll2_tx_pkt_info *pkt, 187 bool notify_fw); 188 189 /** 190 * @brief qed_ll2_release_connection - releases resources 191 * allocated for LL2 connection 192 * 193 * @param cxt - pointer to the hw-function [opaque to some] 194 * @param connection_handle LL2 connection's handle obtained from 195 * qed_ll2_require_connection 196 */ 197 void qed_ll2_release_connection(void *cxt, u8 connection_handle); 198 199 /** 200 * @brief qed_ll2_set_fragment_of_tx_packet - provides fragments to fill 201 * Tx BD of BDs requested by 202 * qed_ll2_prepare_tx_packet 203 * 204 * @param cxt - pointer to the hw-function [opaque to some] 205 * @param connection_handle LL2 connection's handle 206 * obtained from 207 * qed_ll2_require_connection 208 * @param addr 209 * @param nbytes 210 * 211 * @return 0 on success, failure otherwise 212 */ 213 int qed_ll2_set_fragment_of_tx_packet(void *cxt, 214 u8 connection_handle, 215 dma_addr_t addr, u16 nbytes); 216 217 /** 218 * @brief qed_ll2_terminate_connection - stops Tx/Rx queues 219 * 220 * 221 * @param cxt - pointer to the hw-function [opaque to some] 222 * @param connection_handle LL2 connection's handle 223 * obtained from 224 * qed_ll2_require_connection 225 * 226 * @return 0 on success, failure otherwise 227 */ 228 int qed_ll2_terminate_connection(void *cxt, u8 connection_handle); 229 230 /** 231 * @brief qed_ll2_get_stats - get LL2 queue's statistics 232 * 233 * 234 * @param cxt - pointer to the hw-function [opaque to some] 235 * @param connection_handle LL2 connection's handle obtained from 236 * qed_ll2_require_connection 237 * @param p_stats 238 * 239 * @return 0 on success, failure otherwise 240 */ 241 int qed_ll2_get_stats(void *cxt, 242 u8 connection_handle, struct qed_ll2_stats *p_stats); 243 244 /** 245 * @brief qed_ll2_alloc - Allocates LL2 connections set 246 * 247 * @param p_hwfn 248 * 249 * @return int 250 */ 251 int qed_ll2_alloc(struct qed_hwfn *p_hwfn); 252 253 /** 254 * @brief qed_ll2_setup - Inits LL2 connections set 255 * 256 * @param p_hwfn 257 * 258 */ 259 void qed_ll2_setup(struct qed_hwfn *p_hwfn); 260 261 /** 262 * @brief qed_ll2_free - Releases LL2 connections set 263 * 264 * @param p_hwfn 265 * 266 */ 267 void qed_ll2_free(struct qed_hwfn *p_hwfn); 268 269 #endif 270