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 | |
20 | struct 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 | |
31 | struct qed_ooo_isle { |
32 | struct list_head list_entry; |
33 | struct list_head buffers_list; |
34 | }; |
35 | |
36 | struct qed_ooo_archipelago { |
37 | struct list_head isles_list; |
38 | }; |
39 | |
40 | struct qed_ooo_history { |
41 | struct ooo_opaque *p_cqes; |
42 | u32 head_idx; |
43 | u32 num_of_cqes; |
44 | }; |
45 | |
46 | struct 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) |
61 | void 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 | |
65 | int qed_ooo_alloc(struct qed_hwfn *p_hwfn); |
66 | |
67 | void qed_ooo_setup(struct qed_hwfn *p_hwfn); |
68 | |
69 | void qed_ooo_free(struct qed_hwfn *p_hwfn); |
70 | |
71 | void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, |
72 | struct qed_ooo_info *p_ooo_info, |
73 | u32 cid); |
74 | |
75 | void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, |
76 | struct qed_ooo_info *p_ooo_info); |
77 | |
78 | void 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 | |
82 | struct qed_ooo_buffer * |
83 | qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn, |
84 | struct qed_ooo_info *p_ooo_info); |
85 | |
86 | void 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 | |
90 | struct qed_ooo_buffer * |
91 | qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn, |
92 | struct qed_ooo_info *p_ooo_info); |
93 | |
94 | void 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 | |
98 | void 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 | |
103 | void 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 | |
109 | void 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) */ |
113 | static 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 | |
117 | static inline int qed_ooo_alloc(struct qed_hwfn *p_hwfn) |
118 | { |
119 | return -EINVAL; |
120 | } |
121 | |
122 | static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn) {} |
123 | |
124 | static inline void qed_ooo_free(struct qed_hwfn *p_hwfn) {} |
125 | |
126 | static inline void |
127 | qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, |
128 | struct qed_ooo_info *p_ooo_info, |
129 | u32 cid) {} |
130 | |
131 | static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, |
132 | struct qed_ooo_info *p_ooo_info) |
133 | {} |
134 | |
135 | static 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 | |
139 | static inline struct qed_ooo_buffer * |
140 | qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn, |
141 | struct qed_ooo_info *p_ooo_info) { return NULL; } |
142 | |
143 | static 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 | |
148 | static inline struct qed_ooo_buffer * |
149 | qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn, |
150 | struct qed_ooo_info *p_ooo_info) { return NULL; } |
151 | |
152 | static 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 | |
156 | static 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 | |
161 | static 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 | |
167 | static 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 | |