root/drivers/net/ethernet/qlogic/qed/qed_ll2.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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

/* [<][>][^][v][top][bottom][index][help] */