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 isles_list;
641d6cff4fSYuval Mintz };
651d6cff4fSYuval Mintz 
661d6cff4fSYuval Mintz struct qed_ooo_history {
671d6cff4fSYuval Mintz 	struct ooo_opaque *p_cqes;
681d6cff4fSYuval Mintz 	u32 head_idx;
691d6cff4fSYuval Mintz 	u32 num_of_cqes;
701d6cff4fSYuval Mintz };
711d6cff4fSYuval Mintz 
721d6cff4fSYuval Mintz struct qed_ooo_info {
731d6cff4fSYuval Mintz 	struct list_head free_buffers_list;
741d6cff4fSYuval Mintz 	struct list_head ready_buffers_list;
751d6cff4fSYuval Mintz 	struct list_head free_isles_list;
761d6cff4fSYuval Mintz 	struct qed_ooo_archipelago *p_archipelagos_mem;
771d6cff4fSYuval Mintz 	struct qed_ooo_isle *p_isles_mem;
781d6cff4fSYuval Mintz 	struct qed_ooo_history ooo_history;
791d6cff4fSYuval Mintz 	u32 cur_isles_number;
801d6cff4fSYuval Mintz 	u32 max_isles_number;
811d6cff4fSYuval Mintz 	u32 gen_isles_number;
821eec2437SMichal Kalderon 	u16 max_num_archipelagos;
831eec2437SMichal Kalderon 	u16 cid_base;
841d6cff4fSYuval Mintz };
851d6cff4fSYuval Mintz 
861d6cff4fSYuval Mintz #if IS_ENABLED(CONFIG_QED_ISCSI)
871d6cff4fSYuval Mintz void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
881d6cff4fSYuval Mintz 				struct qed_ooo_info *p_ooo_info,
891d6cff4fSYuval Mintz 				struct ooo_opaque *p_cqe);
901d6cff4fSYuval Mintz 
911d6cff4fSYuval Mintz struct qed_ooo_info *qed_ooo_alloc(struct qed_hwfn *p_hwfn);
921d6cff4fSYuval Mintz 
931d6cff4fSYuval Mintz void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
941d6cff4fSYuval Mintz 				      struct qed_ooo_info *p_ooo_info,
951d6cff4fSYuval Mintz 				      u32 cid);
961d6cff4fSYuval Mintz 
971d6cff4fSYuval Mintz void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
981d6cff4fSYuval Mintz 			       struct qed_ooo_info *p_ooo_info);
991d6cff4fSYuval Mintz 
1001d6cff4fSYuval Mintz void qed_ooo_setup(struct qed_hwfn *p_hwfn, struct qed_ooo_info *p_ooo_info);
1011d6cff4fSYuval Mintz 
1021d6cff4fSYuval Mintz void qed_ooo_free(struct qed_hwfn *p_hwfn, struct qed_ooo_info *p_ooo_info);
1031d6cff4fSYuval Mintz 
1041d6cff4fSYuval Mintz void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
1051d6cff4fSYuval Mintz 			     struct qed_ooo_info *p_ooo_info,
1061d6cff4fSYuval Mintz 			     struct qed_ooo_buffer *p_buffer);
1071d6cff4fSYuval Mintz 
1081d6cff4fSYuval Mintz struct qed_ooo_buffer *
1091d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
1101d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info);
1111d6cff4fSYuval Mintz 
1121d6cff4fSYuval Mintz void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
1131d6cff4fSYuval Mintz 			      struct qed_ooo_info *p_ooo_info,
1141d6cff4fSYuval Mintz 			      struct qed_ooo_buffer *p_buffer, u8 on_tail);
1151d6cff4fSYuval Mintz 
1161d6cff4fSYuval Mintz struct qed_ooo_buffer *
1171d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
1181d6cff4fSYuval Mintz 			 struct qed_ooo_info *p_ooo_info);
1191d6cff4fSYuval Mintz 
1201d6cff4fSYuval Mintz void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
1211d6cff4fSYuval Mintz 			  struct qed_ooo_info *p_ooo_info,
1221d6cff4fSYuval Mintz 			  u32 cid, u8 drop_isle, u8 drop_size);
1231d6cff4fSYuval Mintz 
1241d6cff4fSYuval Mintz void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
1251d6cff4fSYuval Mintz 			  struct qed_ooo_info *p_ooo_info,
1261d6cff4fSYuval Mintz 			  u32 cid,
1271d6cff4fSYuval Mintz 			  u8 ooo_isle, struct qed_ooo_buffer *p_buffer);
1281d6cff4fSYuval Mintz 
1291d6cff4fSYuval Mintz void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
1301d6cff4fSYuval Mintz 			    struct qed_ooo_info *p_ooo_info,
1311d6cff4fSYuval Mintz 			    u32 cid,
1321d6cff4fSYuval Mintz 			    u8 ooo_isle,
1331d6cff4fSYuval Mintz 			    struct qed_ooo_buffer *p_buffer, u8 buffer_side);
1341d6cff4fSYuval Mintz 
1351d6cff4fSYuval Mintz void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
1361d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info, u32 cid,
1371d6cff4fSYuval Mintz 			u8 left_isle);
1381d6cff4fSYuval Mintz #else /* IS_ENABLED(CONFIG_QED_ISCSI) */
1391d6cff4fSYuval Mintz static inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
1401d6cff4fSYuval Mintz 					      struct qed_ooo_info *p_ooo_info,
1411d6cff4fSYuval Mintz 					      struct ooo_opaque *p_cqe) {}
1421d6cff4fSYuval Mintz 
1431d6cff4fSYuval Mintz static inline struct qed_ooo_info *qed_ooo_alloc(
1441d6cff4fSYuval Mintz 				struct qed_hwfn *p_hwfn) { return NULL; }
1451d6cff4fSYuval Mintz 
1461d6cff4fSYuval Mintz static inline void
1471d6cff4fSYuval Mintz qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn,
1481d6cff4fSYuval Mintz 				 struct qed_ooo_info *p_ooo_info,
1491d6cff4fSYuval Mintz 				 u32 cid) {}
1501d6cff4fSYuval Mintz 
1511d6cff4fSYuval Mintz static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn,
1521d6cff4fSYuval Mintz 					     struct qed_ooo_info *p_ooo_info)
1531d6cff4fSYuval Mintz 					     {}
1541d6cff4fSYuval Mintz 
1551d6cff4fSYuval Mintz static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn,
1561d6cff4fSYuval Mintz 				 struct qed_ooo_info *p_ooo_info) {}
1571d6cff4fSYuval Mintz 
1581d6cff4fSYuval Mintz static inline void qed_ooo_free(struct qed_hwfn *p_hwfn,
1591d6cff4fSYuval Mintz 				struct qed_ooo_info *p_ooo_info) {}
1601d6cff4fSYuval Mintz 
1611d6cff4fSYuval Mintz static inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn,
1621d6cff4fSYuval Mintz 					   struct qed_ooo_info *p_ooo_info,
1631d6cff4fSYuval Mintz 					   struct qed_ooo_buffer *p_buffer) {}
1641d6cff4fSYuval Mintz 
1651d6cff4fSYuval Mintz static inline struct qed_ooo_buffer *
1661d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn,
1671d6cff4fSYuval Mintz 			struct qed_ooo_info *p_ooo_info) { return NULL; }
1681d6cff4fSYuval Mintz 
1691d6cff4fSYuval Mintz static inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn,
1701d6cff4fSYuval Mintz 					    struct qed_ooo_info *p_ooo_info,
1711d6cff4fSYuval Mintz 					    struct qed_ooo_buffer *p_buffer,
1721d6cff4fSYuval Mintz 					    u8 on_tail) {}
1731d6cff4fSYuval Mintz 
1741d6cff4fSYuval Mintz static inline struct qed_ooo_buffer *
1751d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn,
1761d6cff4fSYuval Mintz 			 struct qed_ooo_info *p_ooo_info) { return NULL; }
1771d6cff4fSYuval Mintz 
1781d6cff4fSYuval Mintz static inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn,
1791d6cff4fSYuval Mintz 					struct qed_ooo_info *p_ooo_info,
1801d6cff4fSYuval Mintz 					u32 cid, u8 drop_isle, u8 drop_size) {}
1811d6cff4fSYuval Mintz 
1821d6cff4fSYuval Mintz static inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn,
1831d6cff4fSYuval Mintz 					struct qed_ooo_info *p_ooo_info,
1841d6cff4fSYuval Mintz 					u32 cid, u8 ooo_isle,
1851d6cff4fSYuval Mintz 					struct qed_ooo_buffer *p_buffer) {}
1861d6cff4fSYuval Mintz 
1871d6cff4fSYuval Mintz static inline void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn,
1881d6cff4fSYuval Mintz 					  struct qed_ooo_info *p_ooo_info,
1891d6cff4fSYuval Mintz 					  u32 cid, u8 ooo_isle,
1901d6cff4fSYuval Mintz 					  struct qed_ooo_buffer *p_buffer,
1911d6cff4fSYuval Mintz 					  u8 buffer_side) {}
1921d6cff4fSYuval Mintz 
1931d6cff4fSYuval Mintz static inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn,
1941d6cff4fSYuval Mintz 				      struct qed_ooo_info *p_ooo_info, u32 cid,
1951d6cff4fSYuval Mintz 				      u8 left_isle) {}
1961d6cff4fSYuval Mintz #endif /* IS_ENABLED(CONFIG_QED_ISCSI) */
1971d6cff4fSYuval Mintz 
1981d6cff4fSYuval Mintz #endif
199