Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
0002 /* QLogic qed NIC Driver
0003  * Copyright (c) 2015-2017  QLogic Corporation
0004  * Copyright (c) 2019-2020 Marvell International Ltd.
0005  */
0006 
0007 #ifndef _QED_OOO_H
0008 #define _QED_OOO_H
0009 #include <linux/types.h>
0010 #include <linux/list.h>
0011 #include <linux/slab.h>
0012 #include "qed.h"
0013 
0014 #define QED_MAX_NUM_ISLES   256
0015 #define QED_MAX_NUM_OOO_HISTORY_ENTRIES 512
0016 
0017 #define QED_OOO_LEFT_BUF    0
0018 #define QED_OOO_RIGHT_BUF   1
0019 
0020 struct qed_ooo_buffer {
0021     struct list_head list_entry;
0022     void *rx_buffer_virt_addr;
0023     dma_addr_t rx_buffer_phys_addr;
0024     u32 rx_buffer_size;
0025     u16 packet_length;
0026     u16 parse_flags;
0027     u16 vlan;
0028     u8 placement_offset;
0029 };
0030 
0031 struct qed_ooo_isle {
0032     struct list_head list_entry;
0033     struct list_head buffers_list;
0034 };
0035 
0036 struct qed_ooo_archipelago {
0037     struct list_head isles_list;
0038 };
0039 
0040 struct qed_ooo_history {
0041     struct ooo_opaque *p_cqes;
0042     u32 head_idx;
0043     u32 num_of_cqes;
0044 };
0045 
0046 struct qed_ooo_info {
0047     struct list_head free_buffers_list;
0048     struct list_head ready_buffers_list;
0049     struct list_head free_isles_list;
0050     struct qed_ooo_archipelago *p_archipelagos_mem;
0051     struct qed_ooo_isle *p_isles_mem;
0052     struct qed_ooo_history ooo_history;
0053     u32 cur_isles_number;
0054     u32 max_isles_number;
0055     u32 gen_isles_number;
0056     u16 max_num_archipelagos;
0057     u16 cid_base;
0058 };
0059 
0060 #if IS_ENABLED(CONFIG_QED_OOO)
0061 void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
0062                 struct qed_ooo_info *p_ooo_info,
0063                 struct ooo_opaque *p_cqe);
0064 
0065 int qed_ooo_alloc(struct qed_hwfn *p_hwfn);
0066 
0067 void qed_ooo_setup(struct qed_hwfn *p_hwfn);
0068 
0069 void qed_ooo_free(struct qed_hwfn *p_hwfn);
0070 
0071 void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
0072                       struct qed_ooo_info *p_ooo_info,
0073                       u32 cid);
0074 
0075 void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
0076                    struct qed_ooo_info *p_ooo_info);
0077 
0078 void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
0079                  struct qed_ooo_info *p_ooo_info,
0080                  struct qed_ooo_buffer *p_buffer);
0081 
0082 struct qed_ooo_buffer *
0083 qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
0084             struct qed_ooo_info *p_ooo_info);
0085 
0086 void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
0087                   struct qed_ooo_info *p_ooo_info,
0088                   struct qed_ooo_buffer *p_buffer, u8 on_tail);
0089 
0090 struct qed_ooo_buffer *
0091 qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
0092              struct qed_ooo_info *p_ooo_info);
0093 
0094 void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
0095               struct qed_ooo_info *p_ooo_info,
0096               u32 cid, u8 drop_isle, u8 drop_size);
0097 
0098 void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
0099               struct qed_ooo_info *p_ooo_info,
0100               u32 cid,
0101               u8 ooo_isle, struct qed_ooo_buffer *p_buffer);
0102 
0103 void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
0104                 struct qed_ooo_info *p_ooo_info,
0105                 u32 cid,
0106                 u8 ooo_isle,
0107                 struct qed_ooo_buffer *p_buffer, u8 buffer_side);
0108 
0109 void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
0110             struct qed_ooo_info *p_ooo_info, u32 cid,
0111             u8 left_isle);
0112 #else /* IS_ENABLED(CONFIG_QED_ISCSI) */
0113 static inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
0114                           struct qed_ooo_info *p_ooo_info,
0115                           struct ooo_opaque *p_cqe) {}
0116 
0117 static inline int qed_ooo_alloc(struct qed_hwfn *p_hwfn)
0118 {
0119     return -EINVAL;
0120 }
0121 
0122 static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn) {}
0123 
0124 static inline void qed_ooo_free(struct qed_hwfn *p_hwfn) {}
0125 
0126 static inline void
0127 qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
0128                  struct qed_ooo_info *p_ooo_info,
0129                  u32 cid) {}
0130 
0131 static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
0132                          struct qed_ooo_info *p_ooo_info)
0133                          {}
0134 
0135 static inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
0136                        struct qed_ooo_info *p_ooo_info,
0137                        struct qed_ooo_buffer *p_buffer) {}
0138 
0139 static inline struct qed_ooo_buffer *
0140 qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
0141             struct qed_ooo_info *p_ooo_info) { return NULL; }
0142 
0143 static inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
0144                         struct qed_ooo_info *p_ooo_info,
0145                         struct qed_ooo_buffer *p_buffer,
0146                         u8 on_tail) {}
0147 
0148 static inline struct qed_ooo_buffer *
0149 qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
0150              struct qed_ooo_info *p_ooo_info) { return NULL; }
0151 
0152 static inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
0153                     struct qed_ooo_info *p_ooo_info,
0154                     u32 cid, u8 drop_isle, u8 drop_size) {}
0155 
0156 static inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
0157                     struct qed_ooo_info *p_ooo_info,
0158                     u32 cid, u8 ooo_isle,
0159                     struct qed_ooo_buffer *p_buffer) {}
0160 
0161 static inline void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
0162                       struct qed_ooo_info *p_ooo_info,
0163                       u32 cid, u8 ooo_isle,
0164                       struct qed_ooo_buffer *p_buffer,
0165                       u8 buffer_side) {}
0166 
0167 static inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
0168                       struct qed_ooo_info *p_ooo_info, u32 cid,
0169                       u8 left_isle) {}
0170 #endif /* IS_ENABLED(CONFIG_QED_ISCSI) */
0171 
0172 #endif