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