11f4d4ed6SAlexander Lobakin /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 21d6cff4fSYuval Mintz /* QLogic qed NIC Driver 3e8f1cb50SMintz, Yuval * Copyright (c) 2015-2017 QLogic Corporation 41d6cff4fSYuval Mintz */ 51d6cff4fSYuval Mintz 61d6cff4fSYuval Mintz #ifndef _QED_OOO_H 71d6cff4fSYuval Mintz #define _QED_OOO_H 81d6cff4fSYuval Mintz #include <linux/types.h> 91d6cff4fSYuval Mintz #include <linux/list.h> 101d6cff4fSYuval Mintz #include <linux/slab.h> 111d6cff4fSYuval Mintz #include "qed.h" 121d6cff4fSYuval Mintz 131d6cff4fSYuval Mintz #define QED_MAX_NUM_ISLES 256 141d6cff4fSYuval Mintz #define QED_MAX_NUM_OOO_HISTORY_ENTRIES 512 151d6cff4fSYuval Mintz 161d6cff4fSYuval Mintz #define QED_OOO_LEFT_BUF 0 171d6cff4fSYuval Mintz #define QED_OOO_RIGHT_BUF 1 181d6cff4fSYuval Mintz 191d6cff4fSYuval Mintz struct qed_ooo_buffer { 201d6cff4fSYuval Mintz struct list_head list_entry; 211d6cff4fSYuval Mintz void *rx_buffer_virt_addr; 221d6cff4fSYuval Mintz dma_addr_t rx_buffer_phys_addr; 231d6cff4fSYuval Mintz u32 rx_buffer_size; 241d6cff4fSYuval Mintz u16 packet_length; 251d6cff4fSYuval Mintz u16 parse_flags; 261d6cff4fSYuval Mintz u16 vlan; 271d6cff4fSYuval Mintz u8 placement_offset; 281d6cff4fSYuval Mintz }; 291d6cff4fSYuval Mintz 301d6cff4fSYuval Mintz struct qed_ooo_isle { 311d6cff4fSYuval Mintz struct list_head list_entry; 321d6cff4fSYuval Mintz struct list_head buffers_list; 331d6cff4fSYuval Mintz }; 341d6cff4fSYuval Mintz 351d6cff4fSYuval Mintz struct qed_ooo_archipelago { 361d6cff4fSYuval Mintz struct list_head isles_list; 371d6cff4fSYuval Mintz }; 381d6cff4fSYuval Mintz 391d6cff4fSYuval Mintz struct qed_ooo_history { 401d6cff4fSYuval Mintz struct ooo_opaque *p_cqes; 411d6cff4fSYuval Mintz u32 head_idx; 421d6cff4fSYuval Mintz u32 num_of_cqes; 431d6cff4fSYuval Mintz }; 441d6cff4fSYuval Mintz 451d6cff4fSYuval Mintz struct qed_ooo_info { 461d6cff4fSYuval Mintz struct list_head free_buffers_list; 471d6cff4fSYuval Mintz struct list_head ready_buffers_list; 481d6cff4fSYuval Mintz struct list_head free_isles_list; 491d6cff4fSYuval Mintz struct qed_ooo_archipelago *p_archipelagos_mem; 501d6cff4fSYuval Mintz struct qed_ooo_isle *p_isles_mem; 511d6cff4fSYuval Mintz struct qed_ooo_history ooo_history; 521d6cff4fSYuval Mintz u32 cur_isles_number; 531d6cff4fSYuval Mintz u32 max_isles_number; 541d6cff4fSYuval Mintz u32 gen_isles_number; 551eec2437SMichal Kalderon u16 max_num_archipelagos; 561eec2437SMichal Kalderon u16 cid_base; 571d6cff4fSYuval Mintz }; 581d6cff4fSYuval Mintz 59f436baf3SMichal Kalderon #if IS_ENABLED(CONFIG_QED_OOO) 601d6cff4fSYuval Mintz void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn, 611d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 621d6cff4fSYuval Mintz struct ooo_opaque *p_cqe); 631d6cff4fSYuval Mintz 643587cb87STomer Tayar int qed_ooo_alloc(struct qed_hwfn *p_hwfn); 653587cb87STomer Tayar 663587cb87STomer Tayar void qed_ooo_setup(struct qed_hwfn *p_hwfn); 673587cb87STomer Tayar 683587cb87STomer Tayar void qed_ooo_free(struct qed_hwfn *p_hwfn); 691d6cff4fSYuval Mintz 701d6cff4fSYuval Mintz void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, 711d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 721d6cff4fSYuval Mintz u32 cid); 731d6cff4fSYuval Mintz 741d6cff4fSYuval Mintz void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, 751d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info); 761d6cff4fSYuval Mintz 771d6cff4fSYuval Mintz void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn, 781d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 791d6cff4fSYuval Mintz struct qed_ooo_buffer *p_buffer); 801d6cff4fSYuval Mintz 811d6cff4fSYuval Mintz struct qed_ooo_buffer * 821d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn, 831d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info); 841d6cff4fSYuval Mintz 851d6cff4fSYuval Mintz void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn, 861d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 871d6cff4fSYuval Mintz struct qed_ooo_buffer *p_buffer, u8 on_tail); 881d6cff4fSYuval Mintz 891d6cff4fSYuval Mintz struct qed_ooo_buffer * 901d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn, 911d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info); 921d6cff4fSYuval Mintz 931d6cff4fSYuval Mintz void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn, 941d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 951d6cff4fSYuval Mintz u32 cid, u8 drop_isle, u8 drop_size); 961d6cff4fSYuval Mintz 971d6cff4fSYuval Mintz void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn, 981d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 991d6cff4fSYuval Mintz u32 cid, 1001d6cff4fSYuval Mintz u8 ooo_isle, struct qed_ooo_buffer *p_buffer); 1011d6cff4fSYuval Mintz 1021d6cff4fSYuval Mintz void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn, 1031d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 1041d6cff4fSYuval Mintz u32 cid, 1051d6cff4fSYuval Mintz u8 ooo_isle, 1061d6cff4fSYuval Mintz struct qed_ooo_buffer *p_buffer, u8 buffer_side); 1071d6cff4fSYuval Mintz 1081d6cff4fSYuval Mintz void qed_ooo_join_isles(struct qed_hwfn *p_hwfn, 1091d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, u32 cid, 1101d6cff4fSYuval Mintz u8 left_isle); 1111d6cff4fSYuval Mintz #else /* IS_ENABLED(CONFIG_QED_ISCSI) */ 1121d6cff4fSYuval Mintz static inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn, 1131d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 1141d6cff4fSYuval Mintz struct ooo_opaque *p_cqe) {} 1151d6cff4fSYuval Mintz 1163587cb87STomer Tayar static inline int qed_ooo_alloc(struct qed_hwfn *p_hwfn) 1173587cb87STomer Tayar { 1183587cb87STomer Tayar return -EINVAL; 1193587cb87STomer Tayar } 1203587cb87STomer Tayar 1213587cb87STomer Tayar static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn) {} 1223587cb87STomer Tayar 1233587cb87STomer Tayar static inline void qed_ooo_free(struct qed_hwfn *p_hwfn) {} 1241d6cff4fSYuval Mintz 1251d6cff4fSYuval Mintz static inline void 1261d6cff4fSYuval Mintz qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, 1271d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 1281d6cff4fSYuval Mintz u32 cid) {} 1291d6cff4fSYuval Mintz 1301d6cff4fSYuval Mintz static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, 1311d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info) 1321d6cff4fSYuval Mintz {} 1331d6cff4fSYuval Mintz 1341d6cff4fSYuval Mintz static inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn, 1351d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 1361d6cff4fSYuval Mintz struct qed_ooo_buffer *p_buffer) {} 1371d6cff4fSYuval Mintz 1381d6cff4fSYuval Mintz static inline struct qed_ooo_buffer * 1391d6cff4fSYuval Mintz qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn, 1401d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info) { return NULL; } 1411d6cff4fSYuval Mintz 1421d6cff4fSYuval Mintz static inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn, 1431d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 1441d6cff4fSYuval Mintz struct qed_ooo_buffer *p_buffer, 1451d6cff4fSYuval Mintz u8 on_tail) {} 1461d6cff4fSYuval Mintz 1471d6cff4fSYuval Mintz static inline struct qed_ooo_buffer * 1481d6cff4fSYuval Mintz qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn, 1491d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info) { return NULL; } 1501d6cff4fSYuval Mintz 1511d6cff4fSYuval Mintz static inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn, 1521d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 1531d6cff4fSYuval Mintz u32 cid, u8 drop_isle, u8 drop_size) {} 1541d6cff4fSYuval Mintz 1551d6cff4fSYuval Mintz static inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn, 1561d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 1571d6cff4fSYuval Mintz u32 cid, u8 ooo_isle, 1581d6cff4fSYuval Mintz struct qed_ooo_buffer *p_buffer) {} 1591d6cff4fSYuval Mintz 1601d6cff4fSYuval Mintz static inline void qed_ooo_add_new_buffer(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 u8 buffer_side) {} 1651d6cff4fSYuval Mintz 1661d6cff4fSYuval Mintz static inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn, 1671d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, u32 cid, 1681d6cff4fSYuval Mintz u8 left_isle) {} 1691d6cff4fSYuval Mintz #endif /* IS_ENABLED(CONFIG_QED_ISCSI) */ 1701d6cff4fSYuval Mintz 1711d6cff4fSYuval Mintz #endif 172