11d6cff4fSYuval Mintz /* QLogic qed NIC Driver
21d6cff4fSYuval Mintz  * Copyright (c) 2015 QLogic Corporation
31d6cff4fSYuval Mintz  *
41d6cff4fSYuval Mintz  * This software is available under the terms of the GNU General Public License
51d6cff4fSYuval Mintz  * (GPL) Version 2, available from the file COPYING in the main directory of
61d6cff4fSYuval Mintz  * this source tree.
71d6cff4fSYuval Mintz  */
81d6cff4fSYuval Mintz 
91d6cff4fSYuval Mintz #ifndef _QED_OOO_H
101d6cff4fSYuval Mintz #define _QED_OOO_H
111d6cff4fSYuval Mintz #include <linux/types.h>
121d6cff4fSYuval Mintz #include <linux/list.h>
131d6cff4fSYuval Mintz #include <linux/slab.h>
141d6cff4fSYuval Mintz #include "qed.h"
151d6cff4fSYuval Mintz 
161d6cff4fSYuval Mintz #define QED_MAX_NUM_ISLES	256
171d6cff4fSYuval Mintz #define QED_MAX_NUM_OOO_HISTORY_ENTRIES	512
181d6cff4fSYuval Mintz 
191d6cff4fSYuval Mintz #define QED_OOO_LEFT_BUF	0
201d6cff4fSYuval Mintz #define QED_OOO_RIGHT_BUF	1
211d6cff4fSYuval Mintz 
221d6cff4fSYuval Mintz struct qed_ooo_buffer {
231d6cff4fSYuval Mintz 	struct list_head list_entry;
241d6cff4fSYuval Mintz 	void *rx_buffer_virt_addr;
251d6cff4fSYuval Mintz 	dma_addr_t rx_buffer_phys_addr;
261d6cff4fSYuval Mintz 	u32 rx_buffer_size;
271d6cff4fSYuval Mintz 	u16 packet_length;
281d6cff4fSYuval Mintz 	u16 parse_flags;
291d6cff4fSYuval Mintz 	u16 vlan;
301d6cff4fSYuval Mintz 	u8 placement_offset;
311d6cff4fSYuval Mintz };
321d6cff4fSYuval Mintz 
331d6cff4fSYuval Mintz struct qed_ooo_isle {
341d6cff4fSYuval Mintz 	struct list_head list_entry;
351d6cff4fSYuval Mintz 	struct list_head buffers_list;
361d6cff4fSYuval Mintz };
371d6cff4fSYuval Mintz 
381d6cff4fSYuval Mintz struct qed_ooo_archipelago {
391d6cff4fSYuval Mintz 	struct list_head list_entry;
401d6cff4fSYuval Mintz 	struct list_head isles_list;
411d6cff4fSYuval Mintz 	u32 cid;
421d6cff4fSYuval Mintz };
431d6cff4fSYuval Mintz 
441d6cff4fSYuval Mintz struct qed_ooo_history {
451d6cff4fSYuval Mintz 	struct ooo_opaque *p_cqes;
461d6cff4fSYuval Mintz 	u32 head_idx;
471d6cff4fSYuval Mintz 	u32 num_of_cqes;
481d6cff4fSYuval Mintz };
491d6cff4fSYuval Mintz 
501d6cff4fSYuval Mintz struct qed_ooo_info {
511d6cff4fSYuval Mintz 	struct list_head free_buffers_list;
521d6cff4fSYuval Mintz 	struct list_head ready_buffers_list;
531d6cff4fSYuval Mintz 	struct list_head free_isles_list;
541d6cff4fSYuval Mintz 	struct list_head free_archipelagos_list;
551d6cff4fSYuval Mintz 	struct list_head archipelagos_list;
561d6cff4fSYuval Mintz 	struct qed_ooo_archipelago *p_archipelagos_mem;
571d6cff4fSYuval Mintz 	struct qed_ooo_isle *p_isles_mem;
581d6cff4fSYuval Mintz 	struct qed_ooo_history ooo_history;
591d6cff4fSYuval Mintz 	u32 cur_isles_number;
601d6cff4fSYuval Mintz 	u32 max_isles_number;
611d6cff4fSYuval Mintz 	u32 gen_isles_number;
621d6cff4fSYuval Mintz };
631d6cff4fSYuval Mintz 
641d6cff4fSYuval Mintz #if IS_ENABLED(CONFIG_QED_ISCSI)
651d6cff4fSYuval Mintz void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
661d6cff4fSYuval Mintz 				struct qed_ooo_info *p_ooo_info,
671d6cff4fSYuval Mintz 				struct ooo_opaque *p_cqe);
681d6cff4fSYuval Mintz 
691d6cff4fSYuval Mintz struct qed_ooo_info *qed_ooo_alloc(struct qed_hwfn *p_hwfn);
701d6cff4fSYuval Mintz 
711d6cff4fSYuval Mintz void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
721d6cff4fSYuval Mintz 				      struct qed_ooo_info *p_ooo_info,
731d6cff4fSYuval Mintz 				      u32 cid);
741d6cff4fSYuval Mintz 
751d6cff4fSYuval Mintz void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
761d6cff4fSYuval Mintz 			       struct qed_ooo_info *p_ooo_info);
771d6cff4fSYuval Mintz 
781d6cff4fSYuval Mintz void qed_ooo_setup(struct qed_hwfn *p_hwfn, struct qed_ooo_info *p_ooo_info);
791d6cff4fSYuval Mintz 
801d6cff4fSYuval Mintz void qed_ooo_free(struct qed_hwfn *p_hwfn, struct qed_ooo_info *p_ooo_info);
811d6cff4fSYuval Mintz 
821d6cff4fSYuval Mintz void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
831d6cff4fSYuval Mintz 			     struct qed_ooo_info *p_ooo_info,
841d6cff4fSYuval Mintz 			     struct qed_ooo_buffer *p_buffer);
851d6cff4fSYuval Mintz 
861d6cff4fSYuval Mintz struct qed_ooo_buffer *
871d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
881d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info);
891d6cff4fSYuval Mintz 
901d6cff4fSYuval Mintz void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
911d6cff4fSYuval Mintz 			      struct qed_ooo_info *p_ooo_info,
921d6cff4fSYuval Mintz 			      struct qed_ooo_buffer *p_buffer, u8 on_tail);
931d6cff4fSYuval Mintz 
941d6cff4fSYuval Mintz struct qed_ooo_buffer *
951d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
961d6cff4fSYuval Mintz 			 struct qed_ooo_info *p_ooo_info);
971d6cff4fSYuval Mintz 
981d6cff4fSYuval Mintz void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
991d6cff4fSYuval Mintz 			  struct qed_ooo_info *p_ooo_info,
1001d6cff4fSYuval Mintz 			  u32 cid, u8 drop_isle, u8 drop_size);
1011d6cff4fSYuval Mintz 
1021d6cff4fSYuval Mintz void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
1031d6cff4fSYuval Mintz 			  struct qed_ooo_info *p_ooo_info,
1041d6cff4fSYuval Mintz 			  u32 cid,
1051d6cff4fSYuval Mintz 			  u8 ooo_isle, struct qed_ooo_buffer *p_buffer);
1061d6cff4fSYuval Mintz 
1071d6cff4fSYuval Mintz void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
1081d6cff4fSYuval Mintz 			    struct qed_ooo_info *p_ooo_info,
1091d6cff4fSYuval Mintz 			    u32 cid,
1101d6cff4fSYuval Mintz 			    u8 ooo_isle,
1111d6cff4fSYuval Mintz 			    struct qed_ooo_buffer *p_buffer, u8 buffer_side);
1121d6cff4fSYuval Mintz 
1131d6cff4fSYuval Mintz void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
1141d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info, u32 cid,
1151d6cff4fSYuval Mintz 			u8 left_isle);
1161d6cff4fSYuval Mintz #else /* IS_ENABLED(CONFIG_QED_ISCSI) */
1171d6cff4fSYuval Mintz static inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
1181d6cff4fSYuval Mintz 					      struct qed_ooo_info *p_ooo_info,
1191d6cff4fSYuval Mintz 					      struct ooo_opaque *p_cqe) {}
1201d6cff4fSYuval Mintz 
1211d6cff4fSYuval Mintz static inline struct qed_ooo_info *qed_ooo_alloc(
1221d6cff4fSYuval Mintz 				struct qed_hwfn *p_hwfn) { return NULL; }
1231d6cff4fSYuval Mintz 
1241d6cff4fSYuval Mintz static inline void
1251d6cff4fSYuval Mintz qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
1261d6cff4fSYuval Mintz 				 struct qed_ooo_info *p_ooo_info,
1271d6cff4fSYuval Mintz 				 u32 cid) {}
1281d6cff4fSYuval Mintz 
1291d6cff4fSYuval Mintz static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
1301d6cff4fSYuval Mintz 					     struct qed_ooo_info *p_ooo_info)
1311d6cff4fSYuval Mintz 					     {}
1321d6cff4fSYuval Mintz 
1331d6cff4fSYuval Mintz static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn,
1341d6cff4fSYuval Mintz 				 struct qed_ooo_info *p_ooo_info) {}
1351d6cff4fSYuval Mintz 
1361d6cff4fSYuval Mintz static inline void qed_ooo_free(struct qed_hwfn *p_hwfn,
1371d6cff4fSYuval Mintz 				struct qed_ooo_info *p_ooo_info) {}
1381d6cff4fSYuval Mintz 
1391d6cff4fSYuval Mintz static inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
1401d6cff4fSYuval Mintz 					   struct qed_ooo_info *p_ooo_info,
1411d6cff4fSYuval Mintz 					   struct qed_ooo_buffer *p_buffer) {}
1421d6cff4fSYuval Mintz 
1431d6cff4fSYuval Mintz static inline struct qed_ooo_buffer *
1441d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
1451d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info) { return NULL; }
1461d6cff4fSYuval Mintz 
1471d6cff4fSYuval Mintz static inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
1481d6cff4fSYuval Mintz 					    struct qed_ooo_info *p_ooo_info,
1491d6cff4fSYuval Mintz 					    struct qed_ooo_buffer *p_buffer,
1501d6cff4fSYuval Mintz 					    u8 on_tail) {}
1511d6cff4fSYuval Mintz 
1521d6cff4fSYuval Mintz static inline struct qed_ooo_buffer *
1531d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
1541d6cff4fSYuval Mintz 			 struct qed_ooo_info *p_ooo_info) { return NULL; }
1551d6cff4fSYuval Mintz 
1561d6cff4fSYuval Mintz static inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
1571d6cff4fSYuval Mintz 					struct qed_ooo_info *p_ooo_info,
1581d6cff4fSYuval Mintz 					u32 cid, u8 drop_isle, u8 drop_size) {}
1591d6cff4fSYuval Mintz 
1601d6cff4fSYuval Mintz static inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
1611d6cff4fSYuval Mintz 					struct qed_ooo_info *p_ooo_info,
1621d6cff4fSYuval Mintz 					u32 cid, u8 ooo_isle,
1631d6cff4fSYuval Mintz 					struct qed_ooo_buffer *p_buffer) {}
1641d6cff4fSYuval Mintz 
1651d6cff4fSYuval Mintz static inline void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
1661d6cff4fSYuval Mintz 					  struct qed_ooo_info *p_ooo_info,
1671d6cff4fSYuval Mintz 					  u32 cid, u8 ooo_isle,
1681d6cff4fSYuval Mintz 					  struct qed_ooo_buffer *p_buffer,
1691d6cff4fSYuval Mintz 					  u8 buffer_side) {}
1701d6cff4fSYuval Mintz 
1711d6cff4fSYuval Mintz static inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
1721d6cff4fSYuval Mintz 				      struct qed_ooo_info *p_ooo_info, u32 cid,
1731d6cff4fSYuval Mintz 				      u8 left_isle) {}
1741d6cff4fSYuval Mintz #endif /* IS_ENABLED(CONFIG_QED_ISCSI) */
1751d6cff4fSYuval Mintz 
1761d6cff4fSYuval Mintz #endif
177