11d6cff4fSYuval Mintz /* QLogic qed NIC Driver
2e8f1cb50SMintz, Yuval  * Copyright (c) 2015-2017  QLogic Corporation
31d6cff4fSYuval Mintz  *
4e8f1cb50SMintz, Yuval  * This software is available to you under a choice of one of two
5e8f1cb50SMintz, Yuval  * licenses.  You may choose to be licensed under the terms of the GNU
6e8f1cb50SMintz, Yuval  * General Public License (GPL) Version 2, available from the file
7e8f1cb50SMintz, Yuval  * COPYING in the main directory of this source tree, or the
8e8f1cb50SMintz, Yuval  * OpenIB.org BSD license below:
9e8f1cb50SMintz, Yuval  *
10e8f1cb50SMintz, Yuval  *     Redistribution and use in source and binary forms, with or
11e8f1cb50SMintz, Yuval  *     without modification, are permitted provided that the following
12e8f1cb50SMintz, Yuval  *     conditions are met:
13e8f1cb50SMintz, Yuval  *
14e8f1cb50SMintz, Yuval  *      - Redistributions of source code must retain the above
15e8f1cb50SMintz, Yuval  *        copyright notice, this list of conditions and the following
16e8f1cb50SMintz, Yuval  *        disclaimer.
17e8f1cb50SMintz, Yuval  *
18e8f1cb50SMintz, Yuval  *      - Redistributions in binary form must reproduce the above
19e8f1cb50SMintz, Yuval  *        copyright notice, this list of conditions and the following
20e8f1cb50SMintz, Yuval  *        disclaimer in the documentation and /or other materials
21e8f1cb50SMintz, Yuval  *        provided with the distribution.
22e8f1cb50SMintz, Yuval  *
23e8f1cb50SMintz, Yuval  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24e8f1cb50SMintz, Yuval  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25e8f1cb50SMintz, Yuval  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26e8f1cb50SMintz, Yuval  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27e8f1cb50SMintz, Yuval  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28e8f1cb50SMintz, Yuval  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29e8f1cb50SMintz, Yuval  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30e8f1cb50SMintz, Yuval  * SOFTWARE.
311d6cff4fSYuval Mintz  */
321d6cff4fSYuval Mintz 
331d6cff4fSYuval Mintz #ifndef _QED_OOO_H
341d6cff4fSYuval Mintz #define _QED_OOO_H
351d6cff4fSYuval Mintz #include <linux/types.h>
361d6cff4fSYuval Mintz #include <linux/list.h>
371d6cff4fSYuval Mintz #include <linux/slab.h>
381d6cff4fSYuval Mintz #include "qed.h"
391d6cff4fSYuval Mintz 
401d6cff4fSYuval Mintz #define QED_MAX_NUM_ISLES	256
411d6cff4fSYuval Mintz #define QED_MAX_NUM_OOO_HISTORY_ENTRIES	512
421d6cff4fSYuval Mintz 
431d6cff4fSYuval Mintz #define QED_OOO_LEFT_BUF	0
441d6cff4fSYuval Mintz #define QED_OOO_RIGHT_BUF	1
451d6cff4fSYuval Mintz 
461d6cff4fSYuval Mintz struct qed_ooo_buffer {
471d6cff4fSYuval Mintz 	struct list_head list_entry;
481d6cff4fSYuval Mintz 	void *rx_buffer_virt_addr;
491d6cff4fSYuval Mintz 	dma_addr_t rx_buffer_phys_addr;
501d6cff4fSYuval Mintz 	u32 rx_buffer_size;
511d6cff4fSYuval Mintz 	u16 packet_length;
521d6cff4fSYuval Mintz 	u16 parse_flags;
531d6cff4fSYuval Mintz 	u16 vlan;
541d6cff4fSYuval Mintz 	u8 placement_offset;
551d6cff4fSYuval Mintz };
561d6cff4fSYuval Mintz 
571d6cff4fSYuval Mintz struct qed_ooo_isle {
581d6cff4fSYuval Mintz 	struct list_head list_entry;
591d6cff4fSYuval Mintz 	struct list_head buffers_list;
601d6cff4fSYuval Mintz };
611d6cff4fSYuval Mintz 
621d6cff4fSYuval Mintz struct qed_ooo_archipelago {
631d6cff4fSYuval Mintz 	struct list_head list_entry;
641d6cff4fSYuval Mintz 	struct list_head isles_list;
651d6cff4fSYuval Mintz 	u32 cid;
661d6cff4fSYuval Mintz };
671d6cff4fSYuval Mintz 
681d6cff4fSYuval Mintz struct qed_ooo_history {
691d6cff4fSYuval Mintz 	struct ooo_opaque *p_cqes;
701d6cff4fSYuval Mintz 	u32 head_idx;
711d6cff4fSYuval Mintz 	u32 num_of_cqes;
721d6cff4fSYuval Mintz };
731d6cff4fSYuval Mintz 
741d6cff4fSYuval Mintz struct qed_ooo_info {
751d6cff4fSYuval Mintz 	struct list_head free_buffers_list;
761d6cff4fSYuval Mintz 	struct list_head ready_buffers_list;
771d6cff4fSYuval Mintz 	struct list_head free_isles_list;
781d6cff4fSYuval Mintz 	struct list_head free_archipelagos_list;
791d6cff4fSYuval Mintz 	struct list_head archipelagos_list;
801d6cff4fSYuval Mintz 	struct qed_ooo_archipelago *p_archipelagos_mem;
811d6cff4fSYuval Mintz 	struct qed_ooo_isle *p_isles_mem;
821d6cff4fSYuval Mintz 	struct qed_ooo_history ooo_history;
831d6cff4fSYuval Mintz 	u32 cur_isles_number;
841d6cff4fSYuval Mintz 	u32 max_isles_number;
851d6cff4fSYuval Mintz 	u32 gen_isles_number;
861d6cff4fSYuval Mintz };
871d6cff4fSYuval Mintz 
881d6cff4fSYuval Mintz #if IS_ENABLED(CONFIG_QED_ISCSI)
891d6cff4fSYuval Mintz void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
901d6cff4fSYuval Mintz 				struct qed_ooo_info *p_ooo_info,
911d6cff4fSYuval Mintz 				struct ooo_opaque *p_cqe);
921d6cff4fSYuval Mintz 
931d6cff4fSYuval Mintz struct qed_ooo_info *qed_ooo_alloc(struct qed_hwfn *p_hwfn);
941d6cff4fSYuval Mintz 
951d6cff4fSYuval Mintz void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
961d6cff4fSYuval Mintz 				      struct qed_ooo_info *p_ooo_info,
971d6cff4fSYuval Mintz 				      u32 cid);
981d6cff4fSYuval Mintz 
991d6cff4fSYuval Mintz void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
1001d6cff4fSYuval Mintz 			       struct qed_ooo_info *p_ooo_info);
1011d6cff4fSYuval Mintz 
1021d6cff4fSYuval Mintz void qed_ooo_setup(struct qed_hwfn *p_hwfn, struct qed_ooo_info *p_ooo_info);
1031d6cff4fSYuval Mintz 
1041d6cff4fSYuval Mintz void qed_ooo_free(struct qed_hwfn *p_hwfn, struct qed_ooo_info *p_ooo_info);
1051d6cff4fSYuval Mintz 
1061d6cff4fSYuval Mintz void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
1071d6cff4fSYuval Mintz 			     struct qed_ooo_info *p_ooo_info,
1081d6cff4fSYuval Mintz 			     struct qed_ooo_buffer *p_buffer);
1091d6cff4fSYuval Mintz 
1101d6cff4fSYuval Mintz struct qed_ooo_buffer *
1111d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
1121d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info);
1131d6cff4fSYuval Mintz 
1141d6cff4fSYuval Mintz void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
1151d6cff4fSYuval Mintz 			      struct qed_ooo_info *p_ooo_info,
1161d6cff4fSYuval Mintz 			      struct qed_ooo_buffer *p_buffer, u8 on_tail);
1171d6cff4fSYuval Mintz 
1181d6cff4fSYuval Mintz struct qed_ooo_buffer *
1191d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
1201d6cff4fSYuval Mintz 			 struct qed_ooo_info *p_ooo_info);
1211d6cff4fSYuval Mintz 
1221d6cff4fSYuval Mintz void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
1231d6cff4fSYuval Mintz 			  struct qed_ooo_info *p_ooo_info,
1241d6cff4fSYuval Mintz 			  u32 cid, u8 drop_isle, u8 drop_size);
1251d6cff4fSYuval Mintz 
1261d6cff4fSYuval Mintz void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
1271d6cff4fSYuval Mintz 			  struct qed_ooo_info *p_ooo_info,
1281d6cff4fSYuval Mintz 			  u32 cid,
1291d6cff4fSYuval Mintz 			  u8 ooo_isle, struct qed_ooo_buffer *p_buffer);
1301d6cff4fSYuval Mintz 
1311d6cff4fSYuval Mintz void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
1321d6cff4fSYuval Mintz 			    struct qed_ooo_info *p_ooo_info,
1331d6cff4fSYuval Mintz 			    u32 cid,
1341d6cff4fSYuval Mintz 			    u8 ooo_isle,
1351d6cff4fSYuval Mintz 			    struct qed_ooo_buffer *p_buffer, u8 buffer_side);
1361d6cff4fSYuval Mintz 
1371d6cff4fSYuval Mintz void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
1381d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info, u32 cid,
1391d6cff4fSYuval Mintz 			u8 left_isle);
1401d6cff4fSYuval Mintz #else /* IS_ENABLED(CONFIG_QED_ISCSI) */
1411d6cff4fSYuval Mintz static inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
1421d6cff4fSYuval Mintz 					      struct qed_ooo_info *p_ooo_info,
1431d6cff4fSYuval Mintz 					      struct ooo_opaque *p_cqe) {}
1441d6cff4fSYuval Mintz 
1451d6cff4fSYuval Mintz static inline struct qed_ooo_info *qed_ooo_alloc(
1461d6cff4fSYuval Mintz 				struct qed_hwfn *p_hwfn) { return NULL; }
1471d6cff4fSYuval Mintz 
1481d6cff4fSYuval Mintz static inline void
1491d6cff4fSYuval Mintz qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
1501d6cff4fSYuval Mintz 				 struct qed_ooo_info *p_ooo_info,
1511d6cff4fSYuval Mintz 				 u32 cid) {}
1521d6cff4fSYuval Mintz 
1531d6cff4fSYuval Mintz static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
1541d6cff4fSYuval Mintz 					     struct qed_ooo_info *p_ooo_info)
1551d6cff4fSYuval Mintz 					     {}
1561d6cff4fSYuval Mintz 
1571d6cff4fSYuval Mintz static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn,
1581d6cff4fSYuval Mintz 				 struct qed_ooo_info *p_ooo_info) {}
1591d6cff4fSYuval Mintz 
1601d6cff4fSYuval Mintz static inline void qed_ooo_free(struct qed_hwfn *p_hwfn,
1611d6cff4fSYuval Mintz 				struct qed_ooo_info *p_ooo_info) {}
1621d6cff4fSYuval Mintz 
1631d6cff4fSYuval Mintz static inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
1641d6cff4fSYuval Mintz 					   struct qed_ooo_info *p_ooo_info,
1651d6cff4fSYuval Mintz 					   struct qed_ooo_buffer *p_buffer) {}
1661d6cff4fSYuval Mintz 
1671d6cff4fSYuval Mintz static inline struct qed_ooo_buffer *
1681d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
1691d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info) { return NULL; }
1701d6cff4fSYuval Mintz 
1711d6cff4fSYuval Mintz static inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
1721d6cff4fSYuval Mintz 					    struct qed_ooo_info *p_ooo_info,
1731d6cff4fSYuval Mintz 					    struct qed_ooo_buffer *p_buffer,
1741d6cff4fSYuval Mintz 					    u8 on_tail) {}
1751d6cff4fSYuval Mintz 
1761d6cff4fSYuval Mintz static inline struct qed_ooo_buffer *
1771d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
1781d6cff4fSYuval Mintz 			 struct qed_ooo_info *p_ooo_info) { return NULL; }
1791d6cff4fSYuval Mintz 
1801d6cff4fSYuval Mintz static inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
1811d6cff4fSYuval Mintz 					struct qed_ooo_info *p_ooo_info,
1821d6cff4fSYuval Mintz 					u32 cid, u8 drop_isle, u8 drop_size) {}
1831d6cff4fSYuval Mintz 
1841d6cff4fSYuval Mintz static inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
1851d6cff4fSYuval Mintz 					struct qed_ooo_info *p_ooo_info,
1861d6cff4fSYuval Mintz 					u32 cid, u8 ooo_isle,
1871d6cff4fSYuval Mintz 					struct qed_ooo_buffer *p_buffer) {}
1881d6cff4fSYuval Mintz 
1891d6cff4fSYuval Mintz static inline void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
1901d6cff4fSYuval Mintz 					  struct qed_ooo_info *p_ooo_info,
1911d6cff4fSYuval Mintz 					  u32 cid, u8 ooo_isle,
1921d6cff4fSYuval Mintz 					  struct qed_ooo_buffer *p_buffer,
1931d6cff4fSYuval Mintz 					  u8 buffer_side) {}
1941d6cff4fSYuval Mintz 
1951d6cff4fSYuval Mintz static inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
1961d6cff4fSYuval Mintz 				      struct qed_ooo_info *p_ooo_info, u32 cid,
1971d6cff4fSYuval Mintz 				      u8 left_isle) {}
1981d6cff4fSYuval Mintz #endif /* IS_ENABLED(CONFIG_QED_ISCSI) */
1991d6cff4fSYuval Mintz 
2001d6cff4fSYuval Mintz #endif
201