linux/drivers/net/ethernet/qlogic/qed/qed_ooo.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_OOO_H
   8#define _QED_OOO_H
   9#include <linux/types.h>
  10#include <linux/list.h>
  11#include <linux/slab.h>
  12#include "qed.h"
  13
  14#define QED_MAX_NUM_ISLES       256
  15#define QED_MAX_NUM_OOO_HISTORY_ENTRIES 512
  16
  17#define QED_OOO_LEFT_BUF        0
  18#define QED_OOO_RIGHT_BUF       1
  19
  20struct qed_ooo_buffer {
  21        struct list_head list_entry;
  22        void *rx_buffer_virt_addr;
  23        dma_addr_t rx_buffer_phys_addr;
  24        u32 rx_buffer_size;
  25        u16 packet_length;
  26        u16 parse_flags;
  27        u16 vlan;
  28        u8 placement_offset;
  29};
  30
  31struct qed_ooo_isle {
  32        struct list_head list_entry;
  33        struct list_head buffers_list;
  34};
  35
  36struct qed_ooo_archipelago {
  37        struct list_head isles_list;
  38};
  39
  40struct qed_ooo_history {
  41        struct ooo_opaque *p_cqes;
  42        u32 head_idx;
  43        u32 num_of_cqes;
  44};
  45
  46struct qed_ooo_info {
  47        struct list_head free_buffers_list;
  48        struct list_head ready_buffers_list;
  49        struct list_head free_isles_list;
  50        struct qed_ooo_archipelago *p_archipelagos_mem;
  51        struct qed_ooo_isle *p_isles_mem;
  52        struct qed_ooo_history ooo_history;
  53        u32 cur_isles_number;
  54        u32 max_isles_number;
  55        u32 gen_isles_number;
  56        u16 max_num_archipelagos;
  57        u16 cid_base;
  58};
  59
  60#if IS_ENABLED(CONFIG_QED_OOO)
  61void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
  62                                struct qed_ooo_info *p_ooo_info,
  63                                struct ooo_opaque *p_cqe);
  64
  65int qed_ooo_alloc(struct qed_hwfn *p_hwfn);
  66
  67void qed_ooo_setup(struct qed_hwfn *p_hwfn);
  68
  69void qed_ooo_free(struct qed_hwfn *p_hwfn);
  70
  71void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
  72                                      struct qed_ooo_info *p_ooo_info,
  73                                      u32 cid);
  74
  75void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
  76                               struct qed_ooo_info *p_ooo_info);
  77
  78void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
  79                             struct qed_ooo_info *p_ooo_info,
  80                             struct qed_ooo_buffer *p_buffer);
  81
  82struct qed_ooo_buffer *
  83qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
  84                        struct qed_ooo_info *p_ooo_info);
  85
  86void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
  87                              struct qed_ooo_info *p_ooo_info,
  88                              struct qed_ooo_buffer *p_buffer, u8 on_tail);
  89
  90struct qed_ooo_buffer *
  91qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
  92                         struct qed_ooo_info *p_ooo_info);
  93
  94void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
  95                          struct qed_ooo_info *p_ooo_info,
  96                          u32 cid, u8 drop_isle, u8 drop_size);
  97
  98void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
  99                          struct qed_ooo_info *p_ooo_info,
 100                          u32 cid,
 101                          u8 ooo_isle, struct qed_ooo_buffer *p_buffer);
 102
 103void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
 104                            struct qed_ooo_info *p_ooo_info,
 105                            u32 cid,
 106                            u8 ooo_isle,
 107                            struct qed_ooo_buffer *p_buffer, u8 buffer_side);
 108
 109void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
 110                        struct qed_ooo_info *p_ooo_info, u32 cid,
 111                        u8 left_isle);
 112#else /* IS_ENABLED(CONFIG_QED_ISCSI) */
 113static inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
 114                                              struct qed_ooo_info *p_ooo_info,
 115                                              struct ooo_opaque *p_cqe) {}
 116
 117static inline int qed_ooo_alloc(struct qed_hwfn *p_hwfn)
 118{
 119        return -EINVAL;
 120}
 121
 122static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn) {}
 123
 124static inline void qed_ooo_free(struct qed_hwfn *p_hwfn) {}
 125
 126static inline void
 127qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
 128                                 struct qed_ooo_info *p_ooo_info,
 129                                 u32 cid) {}
 130
 131static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
 132                                             struct qed_ooo_info *p_ooo_info)
 133                                             {}
 134
 135static inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
 136                                           struct qed_ooo_info *p_ooo_info,
 137                                           struct qed_ooo_buffer *p_buffer) {}
 138
 139static inline struct qed_ooo_buffer *
 140qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
 141                        struct qed_ooo_info *p_ooo_info) { return NULL; }
 142
 143static inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
 144                                            struct qed_ooo_info *p_ooo_info,
 145                                            struct qed_ooo_buffer *p_buffer,
 146                                            u8 on_tail) {}
 147
 148static inline struct qed_ooo_buffer *
 149qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
 150                         struct qed_ooo_info *p_ooo_info) { return NULL; }
 151
 152static inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
 153                                        struct qed_ooo_info *p_ooo_info,
 154                                        u32 cid, u8 drop_isle, u8 drop_size) {}
 155
 156static inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
 157                                        struct qed_ooo_info *p_ooo_info,
 158                                        u32 cid, u8 ooo_isle,
 159                                        struct qed_ooo_buffer *p_buffer) {}
 160
 161static inline void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
 162                                          struct qed_ooo_info *p_ooo_info,
 163                                          u32 cid, u8 ooo_isle,
 164                                          struct qed_ooo_buffer *p_buffer,
 165                                          u8 buffer_side) {}
 166
 167static inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
 168                                      struct qed_ooo_info *p_ooo_info, u32 cid,
 169                                      u8 left_isle) {}
 170#endif /* IS_ENABLED(CONFIG_QED_ISCSI) */
 171
 172#endif
 173