linux/drivers/net/ethernet/qlogic/qed/qed_ll2.h
<<
>>
Prefs
   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/* LL2 queues handles will be split as follows:
  50 * first will be legacy queues, and then the ctx based queues.
  51 */
  52#define QED_MAX_NUM_OF_LL2_CONNS_PF            (4)
  53#define QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF   (3)
  54
  55#define QED_MAX_NUM_OF_CTX_LL2_CONNS_PF \
  56        (QED_MAX_NUM_OF_LL2_CONNS_PF - QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF)
  57
  58#define QED_LL2_LEGACY_CONN_BASE_PF     0
  59#define QED_LL2_CTX_CONN_BASE_PF        QED_MAX_NUM_OF_LEGACY_LL2_CONNS_PF
  60
  61
  62struct qed_ll2_rx_packet {
  63        struct list_head list_entry;
  64        struct core_rx_bd_with_buff_len *rxq_bd;
  65        dma_addr_t rx_buf_addr;
  66        u16 buf_length;
  67        void *cookie;
  68        u8 placement_offset;
  69        u16 parse_flags;
  70        u16 packet_length;
  71        u16 vlan;
  72        u32 opaque_data[2];
  73};
  74
  75struct qed_ll2_tx_packet {
  76        struct list_head list_entry;
  77        u16 bd_used;
  78        bool notify_fw;
  79        void *cookie;
  80        /* Flexible Array of bds_set determined by max_bds_per_packet */
  81        struct {
  82                struct core_tx_bd *txq_bd;
  83                dma_addr_t tx_frag;
  84                u16 frag_len;
  85        } bds_set[1];
  86};
  87
  88struct qed_ll2_rx_queue {
  89        /* Lock protecting the Rx queue manipulation */
  90        spinlock_t lock;
  91        struct qed_chain rxq_chain;
  92        struct qed_chain rcq_chain;
  93        u8 rx_sb_index;
  94        u8 ctx_based;
  95        bool b_cb_registered;
  96        __le16 *p_fw_cons;
  97        struct list_head active_descq;
  98        struct list_head free_descq;
  99        struct list_head posting_descq;
 100        struct qed_ll2_rx_packet *descq_array;
 101        void __iomem *set_prod_addr;
 102        struct core_pwm_prod_update_data db_data;
 103};
 104
 105struct qed_ll2_tx_queue {
 106        /* Lock protecting the Tx queue manipulation */
 107        spinlock_t lock;
 108        struct qed_chain txq_chain;
 109        u8 tx_sb_index;
 110        bool b_cb_registered;
 111        __le16 *p_fw_cons;
 112        struct list_head active_descq;
 113        struct list_head free_descq;
 114        struct list_head sending_descq;
 115        void *descq_mem; /* memory for variable sized qed_ll2_tx_packet*/
 116        struct qed_ll2_tx_packet *cur_send_packet;
 117        struct qed_ll2_tx_packet cur_completing_packet;
 118        u16 cur_completing_bd_idx;
 119        void __iomem *doorbell_addr;
 120        struct core_db_data db_msg;
 121        u16 bds_idx;
 122        u16 cur_send_frag_num;
 123        u16 cur_completing_frag_num;
 124        bool b_completing_packet;
 125};
 126
 127struct qed_ll2_info {
 128        /* Lock protecting the state of LL2 */
 129        struct mutex mutex;
 130
 131        struct qed_ll2_acquire_data_inputs input;
 132        u32 cid;
 133        u8 my_id;
 134        u8 queue_id;
 135        u8 tx_stats_id;
 136        bool b_active;
 137        enum core_tx_dest tx_dest;
 138        u8 tx_stats_en;
 139        bool main_func_queue;
 140        struct qed_ll2_rx_queue rx_queue;
 141        struct qed_ll2_tx_queue tx_queue;
 142        struct qed_ll2_cbs cbs;
 143};
 144
 145/**
 146 * @brief qed_ll2_acquire_connection - allocate resources,
 147 *        starts rx & tx (if relevant) queues pair. Provides
 148 *        connecion handler as output parameter.
 149 *
 150 *
 151 * @param cxt - pointer to the hw-function [opaque to some]
 152 * @param data - describes connection parameters
 153 * @return int
 154 */
 155int qed_ll2_acquire_connection(void *cxt, struct qed_ll2_acquire_data *data);
 156
 157/**
 158 * @brief qed_ll2_establish_connection - start previously
 159 *        allocated LL2 queues pair
 160 *
 161 * @param cxt - pointer to the hw-function [opaque to some]
 162 * @param p_ptt
 163 * @param connection_handle     LL2 connection's handle obtained from
 164 *                              qed_ll2_require_connection
 165 *
 166 * @return 0 on success, failure otherwise
 167 */
 168int qed_ll2_establish_connection(void *cxt, u8 connection_handle);
 169
 170/**
 171 * @brief qed_ll2_post_rx_buffers - submit buffers to LL2 Rx queue.
 172 *
 173 * @param cxt - pointer to the hw-function [opaque to some]
 174 * @param connection_handle     LL2 connection's handle obtained from
 175 *                              qed_ll2_require_connection
 176 * @param addr                  rx (physical address) buffers to submit
 177 * @param cookie
 178 * @param notify_fw             produce corresponding Rx BD immediately
 179 *
 180 * @return 0 on success, failure otherwise
 181 */
 182int qed_ll2_post_rx_buffer(void *cxt,
 183                           u8 connection_handle,
 184                           dma_addr_t addr,
 185                           u16 buf_len, void *cookie, u8 notify_fw);
 186
 187/**
 188 * @brief qed_ll2_prepare_tx_packet - request for start Tx BD
 189 *                                    to prepare Tx packet submission to FW.
 190 *
 191 * @param cxt - pointer to the hw-function [opaque to some]
 192 * @param connection_handle
 193 * @param pkt - info regarding the tx packet
 194 * @param notify_fw - issue doorbell to fw for this packet
 195 *
 196 * @return 0 on success, failure otherwise
 197 */
 198int qed_ll2_prepare_tx_packet(void *cxt,
 199                              u8 connection_handle,
 200                              struct qed_ll2_tx_pkt_info *pkt,
 201                              bool notify_fw);
 202
 203/**
 204 * @brief qed_ll2_release_connection -  releases resources
 205 *                                      allocated for LL2 connection
 206 *
 207 * @param cxt - pointer to the hw-function [opaque to some]
 208 * @param connection_handle             LL2 connection's handle obtained from
 209 *                                      qed_ll2_require_connection
 210 */
 211void qed_ll2_release_connection(void *cxt, u8 connection_handle);
 212
 213/**
 214 * @brief qed_ll2_set_fragment_of_tx_packet -   provides fragments to fill
 215 *                                              Tx BD of BDs requested by
 216 *                                              qed_ll2_prepare_tx_packet
 217 *
 218 * @param cxt - pointer to the hw-function [opaque to some]
 219 * @param connection_handle                     LL2 connection's handle
 220 *                                              obtained from
 221 *                                              qed_ll2_require_connection
 222 * @param addr
 223 * @param nbytes
 224 *
 225 * @return 0 on success, failure otherwise
 226 */
 227int qed_ll2_set_fragment_of_tx_packet(void *cxt,
 228                                      u8 connection_handle,
 229                                      dma_addr_t addr, u16 nbytes);
 230
 231/**
 232 * @brief qed_ll2_terminate_connection -        stops Tx/Rx queues
 233 *
 234 *
 235 * @param cxt - pointer to the hw-function [opaque to some]
 236 * @param connection_handle                     LL2 connection's handle
 237 *                                              obtained from
 238 *                                              qed_ll2_require_connection
 239 *
 240 * @return 0 on success, failure otherwise
 241 */
 242int qed_ll2_terminate_connection(void *cxt, u8 connection_handle);
 243
 244/**
 245 * @brief qed_ll2_get_stats -   get LL2 queue's statistics
 246 *
 247 *
 248 * @param cxt - pointer to the hw-function [opaque to some]
 249 * @param connection_handle     LL2 connection's handle obtained from
 250 *                              qed_ll2_require_connection
 251 * @param p_stats
 252 *
 253 * @return 0 on success, failure otherwise
 254 */
 255int qed_ll2_get_stats(void *cxt,
 256                      u8 connection_handle, struct qed_ll2_stats *p_stats);
 257
 258/**
 259 * @brief qed_ll2_alloc - Allocates LL2 connections set
 260 *
 261 * @param p_hwfn
 262 *
 263 * @return int
 264 */
 265int qed_ll2_alloc(struct qed_hwfn *p_hwfn);
 266
 267/**
 268 * @brief qed_ll2_setup - Inits LL2 connections set
 269 *
 270 * @param p_hwfn
 271 *
 272 */
 273void qed_ll2_setup(struct qed_hwfn *p_hwfn);
 274
 275/**
 276 * @brief qed_ll2_free - Releases LL2 connections set
 277 *
 278 * @param p_hwfn
 279 *
 280 */
 281void qed_ll2_free(struct qed_hwfn *p_hwfn);
 282
 283#endif
 284