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