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
  35struct qed_ll2_rx_packet {
  36        struct list_head list_entry;
  37        struct core_rx_bd_with_buff_len *rxq_bd;
  38        dma_addr_t rx_buf_addr;
  39        u16 buf_length;
  40        void *cookie;
  41        u8 placement_offset;
  42        u16 parse_flags;
  43        u16 packet_length;
  44        u16 vlan;
  45        u32 opaque_data[2];
  46};
  47
  48struct qed_ll2_tx_packet {
  49        struct list_head list_entry;
  50        u16 bd_used;
  51        bool notify_fw;
  52        void *cookie;
  53        /* Flexible Array of bds_set determined by max_bds_per_packet */
  54        struct {
  55                struct core_tx_bd *txq_bd;
  56                dma_addr_t tx_frag;
  57                u16 frag_len;
  58        } bds_set[];
  59};
  60
  61struct qed_ll2_rx_queue {
  62        /* Lock protecting the Rx queue manipulation */
  63        spinlock_t lock;
  64        struct qed_chain rxq_chain;
  65        struct qed_chain rcq_chain;
  66        u8 rx_sb_index;
  67        u8 ctx_based;
  68        bool b_cb_registered;
  69        __le16 *p_fw_cons;
  70        struct list_head active_descq;
  71        struct list_head free_descq;
  72        struct list_head posting_descq;
  73        struct qed_ll2_rx_packet *descq_array;
  74        void __iomem *set_prod_addr;
  75        struct core_pwm_prod_update_data db_data;
  76};
  77
  78struct qed_ll2_tx_queue {
  79        /* Lock protecting the Tx queue manipulation */
  80        spinlock_t lock;
  81        struct qed_chain txq_chain;
  82        u8 tx_sb_index;
  83        bool b_cb_registered;
  84        __le16 *p_fw_cons;
  85        struct list_head active_descq;
  86        struct list_head free_descq;
  87        struct list_head sending_descq;
  88        u16 cur_completing_bd_idx;
  89        void __iomem *doorbell_addr;
  90        struct core_db_data db_msg;
  91        u16 bds_idx;
  92        u16 cur_send_frag_num;
  93        u16 cur_completing_frag_num;
  94        bool b_completing_packet;
  95        void *descq_mem; /* memory for variable sized qed_ll2_tx_packet*/
  96        struct qed_ll2_tx_packet *cur_send_packet;
  97        struct qed_ll2_tx_packet cur_completing_packet;
  98};
  99
 100struct qed_ll2_info {
 101        /* Lock protecting the state of LL2 */
 102        struct mutex mutex;
 103
 104        struct qed_ll2_acquire_data_inputs input;
 105        u32 cid;
 106        u8 my_id;
 107        u8 queue_id;
 108        u8 tx_stats_id;
 109        bool b_active;
 110        enum core_tx_dest tx_dest;
 111        u8 tx_stats_en;
 112        bool main_func_queue;
 113        struct qed_ll2_rx_queue rx_queue;
 114        struct qed_ll2_tx_queue tx_queue;
 115        struct qed_ll2_cbs cbs;
 116};
 117
 118extern const struct qed_ll2_ops qed_ll2_ops_pass;
 119
 120/**
 121 * qed_ll2_acquire_connection(): Allocate resources,
 122 *                               starts rx & tx (if relevant) queues pair.
 123 *                               Provides connecion handler as output
 124 *                               parameter.
 125 *
 126 * @cxt: Pointer to the hw-function [opaque to some].
 127 * @data: Describes connection parameters.
 128 *
 129 * Return: Int.
 130 */
 131int qed_ll2_acquire_connection(void *cxt, struct qed_ll2_acquire_data *data);
 132
 133/**
 134 * qed_ll2_establish_connection(): start previously allocated LL2 queues pair
 135 *
 136 * @cxt: Pointer to the hw-function [opaque to some].
 137 * @connection_handle: LL2 connection's handle obtained from
 138 *                     qed_ll2_require_connection.
 139 *
 140 * Return: 0 on success, failure otherwise.
 141 */
 142int qed_ll2_establish_connection(void *cxt, u8 connection_handle);
 143
 144/**
 145 * qed_ll2_post_rx_buffer(): Submit buffers to LL2 Rx queue.
 146 *
 147 * @cxt: Pointer to the hw-function [opaque to some].
 148 * @connection_handle: LL2 connection's handle obtained from
 149 *                     qed_ll2_require_connection.
 150 * @addr: RX (physical address) buffers to submit.
 151 * @buf_len: Buffer Len.
 152 * @cookie: Cookie.
 153 * @notify_fw: Produce corresponding Rx BD immediately.
 154 *
 155 * Return: 0 on success, failure otherwise.
 156 */
 157int qed_ll2_post_rx_buffer(void *cxt,
 158                           u8 connection_handle,
 159                           dma_addr_t addr,
 160                           u16 buf_len, void *cookie, u8 notify_fw);
 161
 162/**
 163 * qed_ll2_prepare_tx_packet(): Request for start Tx BD
 164 *                              to prepare Tx packet submission to FW.
 165 *
 166 * @cxt: Pointer to the hw-function [opaque to some].
 167 * @connection_handle: Connection handle.
 168 * @pkt: Info regarding the tx packet.
 169 * @notify_fw: Issue doorbell to fw for this packet.
 170 *
 171 * Return: 0 on success, failure otherwise.
 172 */
 173int qed_ll2_prepare_tx_packet(void *cxt,
 174                              u8 connection_handle,
 175                              struct qed_ll2_tx_pkt_info *pkt,
 176                              bool notify_fw);
 177
 178/**
 179 * qed_ll2_release_connection(): Releases resources allocated for LL2
 180 *                               connection.
 181 *
 182 * @cxt: Pointer to the hw-function [opaque to some].
 183 * @connection_handle: LL2 connection's handle obtained from
 184 *                     qed_ll2_require_connection.
 185 *
 186 * Return: Void.
 187 */
 188void qed_ll2_release_connection(void *cxt, u8 connection_handle);
 189
 190/**
 191 * qed_ll2_set_fragment_of_tx_packet(): Provides fragments to fill
 192 *                                      Tx BD of BDs requested by
 193 *                                      qed_ll2_prepare_tx_packet
 194 *
 195 * @cxt: Pointer to the hw-function [opaque to some].
 196 * @connection_handle: LL2 connection's handle obtained from
 197 *                     qed_ll2_require_connection.
 198 * @addr: Address.
 199 * @nbytes: Number of bytes.
 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 * qed_ll2_terminate_connection(): Stops Tx/Rx queues
 209 *
 210 * @cxt: Pointer to the hw-function [opaque to some].
 211 * @connection_handle: LL2 connection's handle obtained from
 212 *                    qed_ll2_require_connection.
 213 *
 214 * Return: 0 on success, failure otherwise.
 215 */
 216int qed_ll2_terminate_connection(void *cxt, u8 connection_handle);
 217
 218/**
 219 * qed_ll2_get_stats(): Get LL2 queue's statistics
 220 *
 221 * @cxt: Pointer to the hw-function [opaque to some].
 222 * @connection_handle: LL2 connection's handle obtained from
 223 *                    qed_ll2_require_connection.
 224 * @p_stats: Pointer Status.
 225 *
 226 * Return: 0 on success, failure otherwise.
 227 */
 228int qed_ll2_get_stats(void *cxt,
 229                      u8 connection_handle, struct qed_ll2_stats *p_stats);
 230
 231/**
 232 * qed_ll2_alloc(): Allocates LL2 connections set.
 233 *
 234 * @p_hwfn: HW device data.
 235 *
 236 * Return: Int.
 237 */
 238int qed_ll2_alloc(struct qed_hwfn *p_hwfn);
 239
 240/**
 241 * qed_ll2_setup(): Inits LL2 connections set.
 242 *
 243 * @p_hwfn: HW device data.
 244 *
 245 * Return: Void.
 246 *
 247 */
 248void qed_ll2_setup(struct qed_hwfn *p_hwfn);
 249
 250/**
 251 * qed_ll2_free(): Releases LL2 connections set
 252 *
 253 * @p_hwfn: HW device data.
 254 *
 255 * Return: Void.
 256 *
 257 */
 258void qed_ll2_free(struct qed_hwfn *p_hwfn);
 259
 260#endif
 261