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