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 86f436baf3SMichal Kalderon #if IS_ENABLED(CONFIG_QED_OOO) 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 913587cb87STomer Tayar int qed_ooo_alloc(struct qed_hwfn *p_hwfn); 923587cb87STomer Tayar 933587cb87STomer Tayar void qed_ooo_setup(struct qed_hwfn *p_hwfn); 943587cb87STomer Tayar 953587cb87STomer Tayar void qed_ooo_free(struct qed_hwfn *p_hwfn); 961d6cff4fSYuval Mintz 971d6cff4fSYuval Mintz void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, 981d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 991d6cff4fSYuval Mintz u32 cid); 1001d6cff4fSYuval Mintz 1011d6cff4fSYuval Mintz void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, 1021d6cff4fSYuval Mintz 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 1433587cb87STomer Tayar static inline int qed_ooo_alloc(struct qed_hwfn *p_hwfn) 1443587cb87STomer Tayar { 1453587cb87STomer Tayar return -EINVAL; 1463587cb87STomer Tayar } 1473587cb87STomer Tayar 1483587cb87STomer Tayar static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn) {} 1493587cb87STomer Tayar 1503587cb87STomer Tayar static inline void qed_ooo_free(struct qed_hwfn *p_hwfn) {} 1511d6cff4fSYuval Mintz 1521d6cff4fSYuval Mintz static inline void 1531d6cff4fSYuval Mintz qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, 1541d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info, 1551d6cff4fSYuval Mintz u32 cid) {} 1561d6cff4fSYuval Mintz 1571d6cff4fSYuval Mintz static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, 1581d6cff4fSYuval Mintz struct qed_ooo_info *p_ooo_info) 1591d6cff4fSYuval Mintz {} 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