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